3

我不知道为什么,这个准备好的查询不起作用:以下 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
4

2 回答 2

3

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

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

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

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


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

  • 如果您在多个服务器上工作,还要仔细检查您是否在正确的 mysql 服务器上检查更改。
于 2013-10-28T23:05:06.040 回答
0

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

于 2013-10-28T22:55:16.153 回答