【问题标题】:MySQL no affected rows upon UPDATE when value not changed当值未更改时,MySQL 在 UPDATE 时没有受影响的行
【发布时间】:2014-08-25 08:48:46
【问题描述】:

MySQL 与 PHP,试图更新一行:

$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的用户行但Age之前已经是25了

有没有办法区分这两种情况? (除了读取之前的行并在更新之前手动检查值)

【问题讨论】:

  • 您在任何一种情况下都不会影响一行,这似乎是一个奇怪的问题,您肯定是通过一个表单进行更新,这意味着用户一开始就存在并且您知道他们的 ID?
  • 如果编码正确,则从表单发送的标准更新查询将返回成功消息或错误消息,在您的成功消息中,您将获得受影响的行,即。 1.在您的错误消息中,您还可以返回受影响的行 ie.0

标签: php mysql sql-update rows-affected


【解决方案1】:

根据mysql documentation,您可以通过在使用mysql_real_connect 进行连接时传递MYSQLI_CLIENT_FOUND_ROWS 标志来更改affected_rows 的行为。

在这种情况下,mysql_affected_rows 返回与 WHERE 条件匹配的行数,而不是更新的行数。

【讨论】:

    【解决方案2】:

    我认为这对于只有一个查询是不可能的。 我会选择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
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多