PDOStatement :: execute()返回true但数据未更新

时间:2013-10-28 22:34:09

标签: php mysql pdo

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

<?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

2 个答案:

答案 0 :(得分:3)

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

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

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

  • 如果您有多个此表的副本,则应仔细检查您正在阅读的数据库中是否进行了更改。有时我会碰巧 - 我忘记更改应用程序配置文件,但我没有意识到我正在更新错误的数据库。


事实证明这是问题 - 第三点的变化:

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

答案 1 :(得分:0)

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