首页 > 解决方案 > 用于 UPDATE 的 mysqli_affected_rows 有时在全行匹配时返回 0

问题描述

说,如果我有 MySQL 查询来更新一行:

$res = mysqli_query($link, 
    "UPDATE table SET val=1 WHERE id=5");

if($res)
{
    if(mysqli_affected_rows($link) > 0)
    {
        echo("Updated something!");
    }
    else
        echo("Didn't update");
}
else
    echo("Error");

如何更改它以区分这三个条件:

  1. 找到项目id=5并设置它。
  2. 没有找到带有 的项目id=5
  3. 错误

按照现在的编写方式,如果我的数据库列val已经1在该行中,mysqli_affected_rows将返回 0。

标签: phpmysql

解决方案


您可以使用mysqli_info来获取区分这两种情况所需的信息。mysqli_info($link)查询后将UPDATE返回一个类似的字符串

Rows matched: 1 Changed: 1 Warnings: 0

然后您可以解析它,例如使用preg_match

// $info = mysqli_info($link);
$info = 'Rows matched: 12 Changed: 8 Warnings: 0';
preg_match('/Rows matched: (\d+) Changed: (\d+)/', $info, $matches);
list(, $matched, $changed) = $matches;
echo "$matched rows matched, $changed rows changed\n";

输出:

12 rows matched, 8 rows changed

然后,您可以使用$matched和中的值$changed来区分您的两种情况。


推荐阅读