【问题标题】:PDOStatement::execute() returns true but the data is not updatedPDOStatement::execute() 返回 true 但数据未更新
【发布时间】:2017-10-06 19:09:29
【问题描述】:

我不知道为什么,这个准备好的查询不起作用:以下 php 代码是正确的(没有任何警告或通知),但相应的数据没有更新。对于类似的更新,数据库已正确更新,但不适用于此表。

<?php

  error_reporting(E_ALL);
  ini_set('display_errors', 'On');
  $pdo = new PDO('mysql:dbname=test;host=localhost', 'root', ''); 
  $sql = 'UPDATE `ml_user` SET `username` = :username, `password` = :password, `email` = :email, `active` = :active, `last_login` = :last_login WHERE `id_user` = :id_user';
  $sth = $pdo->prepare($sql);
  var_dump($sth); // object(PDOStatement)#39 (1) { ["queryString"]=> string(165) "UPDATE `ml_user` SET `username` = :username, `password` = :password, `email` = :email, `active` = :active, `last_login` = :last_login WHERE `id_user` = :id_user" }
  $datas = array(
    ':id_user' => 1, ':username' => 'my username',
    ':password' => 'ae25ff724d069dcb1a7fff05616ad6abc1',
    ':email' => 'username@example.com',
    ':active' => 1, ':last_login' => 1382990654,
  );
  $res = $sth->execute($datas);
  var_dump($res); // bool(true) 

sql表

CREATE TABLE `ml_user` (
 `id_user` int(11) NOT NULL AUTO_INCREMENT,
 `active` tinyint(1) NOT NULL DEFAULT '0',
 `email` varchar(127) NOT NULL,
 `username` varchar(32) NOT NULL DEFAULT '',
 `password` char(50) NOT NULL,
 `logins` int(10) unsigned NOT NULL DEFAULT '0',
 `last_login` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id_user`),
  UNIQUE KEY `uniq_username` (`username`),
  UNIQUE KEY `uniq_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【问题讨论】:

  • 你需要一个 : 在你的“数据”数组中的每个键前面吗?
  • 不,有或没有 : ,相同的结果:没有错误
  • 把它放在一个 try catch 块中
  • 将 'username' => ':my username' 改为 ':username' => 'my username'
  • @Ryan,值得一提的是,在最新版本的 PHP 中,您可以将参数传递给 execute(),而无需在数组键中使用 ':' 前缀。以前需要它,但现在不需要了。

标签: php mysql pdo


【解决方案1】:

execute() 返回true 时,表示该语句“成功”,但这并不意味着它改变了任何东西。这只是意味着没有错误。

  • 由于 WHERE 子句中的条件,它可能匹配了零行。这仍然被认为是“成功”。您可以尝试使用具有相同 WHERE 子句的 SELECT 并获取结果,以确认它与行匹配。

  • 它可能匹配了一行或多行,但您设置的值已经是这些行上的值。您可以在执行后调用$sth-&gt;rowCount(),以了解 UPDATE 影响了多少行(这可能小于它匹配的行数)。

  • 如果您有多个此表的副本,则应仔细检查您正在读取的数据库中是否已进行更改。我有时会遇到这种情况——我忘记更改应用程序配置文件,而且我没有意识到我正在更新错误的数据库。


原来这就是问题所在——第三点的变体:

  • 如果您在多台服务器上工作,还要仔细检查您是否在正确的 mysql 服务器上检查更改。

【讨论】:

  • 感谢这些建议,但仍然坚持。 WHERE 子句返回 1 行。并且 rowCOunt() 返回 (int)0 。也感谢关于错误数据库的建议,但我已经检查过了!
  • 如果语句成功,但 rowCount() 返回 0,那么您必须设置该行已有的值。
  • 也不是这样,用户名和密码在表格和php数组中不同
【解决方案2】:

如果没有错误并且没有更新数据,则找不到匹配的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 2022-01-02
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多