我不知道为什么,这个准备好的查询不起作用:以下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
答案 0 :(得分:3)
当execute()
返回 true 时,表示该语句“成功”,但并不意味着它改变了任何内容。这只是意味着没有错误。
由于WHERE子句中的条件,它可能匹配零行。这仍然被认为是“成功”。您可以尝试使用相同WHERE子句的SELECT
,并获取结果,以确认它与行匹配。
它可能匹配了一行或多行,但您设置的值已经是这些行的值。您可以在执行后调用$sth->rowCount()
,以查明UPDATE 影响的行数(这可能小于它匹配的行数)。
如果您有多个此表的副本,则应仔细检查您正在阅读的数据库中是否进行了更改。有时我会碰巧 - 我忘记更改应用程序配置文件,但我没有意识到我正在更新错误的数据库。
事实证明这是问题 - 第三点的变化:
答案 1 :(得分:0)
如果没有错误且没有更新数据,则找不到匹配的行。