当值未更改时,MySQL在UPDATE操作中无影响行数

7

使用PHP操作MySQL,尝试更新一行:

$dbQuery = 'UPDATE UserTable SET Age=25 WHERE Id=3';
$result = mysqli_query($dbLink, $dbQuery);
if ($result === FALSE) {
  // Take care of error
}
else {
  $numAffectedRows = mysqli_affected_rows($dbLink);
}

在两种不同的情况下,我得到了零个$numAffectedRows:

  1. 当没有Id为3的用户行时
  2. 当存在Id为3的用户行,但年龄已经是25岁了

除了读取行并手动检查更新之前的值,有没有一种方法可以区分这两种情况?


在任何情况下,您都不会受到行的影响,这似乎是一个奇怪的问题,毫无疑问,您是通过表单进行更新,这意味着用户已经存在并且您知道他们的ID。 - CodeX
如果正确编码,从表单发送的标准更新查询将返回成功消息或错误消息。在成功消息中,您将获得受影响的行数,即1。在错误消息中,您也可以返回受影响的行数,即0。 - CodeX
2个回答

5
根据MySQL文档,使用mysql_real_connect连接时,传递MYSQLI_CLIENT_FOUND_ROWS标志可以改变affected_rows的行为。
在这种情况下,mysql_affected_rows返回与WHERE条件匹配的行数,而不是更新的行数。

0

我认为这不可能只用一个查询实现。 我会选择使用INSERT INTO..ON DUPLICATE方法。

$dbQuery = "INSERT INTO UserTable (Id,Age) VALUES('3','25') ON DUPLICATE KEY 
            UPDATE Id='3',Age='25'";
$result = mysql_query($dbQuery);
if ($result === FALSE) {
   // Take care of error
}
else {
   $numAffectedRows = mysql_affected_rows();
   // $numAffectedRows = 0  => row exist
   // $numAffectedRows = >0 => row added with Id,Age specified
}   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接