使用 PHP PDO rowCount() 检测错误与不受影响的行


Detect error vs. unaffected row with PHP PDO rowCount()

使用 PHP PDO,有没有办法区分 UPDATE 失败和 UPDATE 成功运行但将字段设置为其现有值之间的区别?

$sql = 'UPDATE table SET column = :column WHERE id = :id';
$statement = $db->prepare($sql);
$statement->bindParam(':column', $column, PDO::PARAM_STR);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->execute();
$RowsUpdated = $statement->rowCount();
echo '$RowsUpdated = '.$RowsUpdated.'<br />';

如果 $column 的值是新值,则上面的代码将 $RowsUpdated 设置为 1,如果它与现有值相同,则将其设置为 0。我试图通过更改 SQL 语句来强制错误,但它从不返回非数值(例如 NULL 或 False),并且永远不会小于 0。

当使用 COUNT(*) 选择行时,fetchColumn() 返回行数(如果有),如果没有,则返回 0,如果有错误,则返回其他值。所以我能够使用 ($countRowsSelected> 0) 来检测行,($countRowsSelected === "0") 来检测没有行,使用 ELSE 来检测错误。

可以通过更新来做到这一点吗?除了 UPDATE 之外,我还想触发辅助操作,但前提是保存的值已更改,所以我想要这个:

if ($RowsUpdated > 0) {
    // We go a NEW value, let's do a little dance
} else if ($RowsUpdated === "0") {
    // It saved, but the value was unchanged
} else {
    // Error!
}

我尝试将 PDO::MYSQL_ATTR_FOUND_ROWS => true 添加到我的 PDO,但这导致 rowCount() 返回 1,无论值是否更改,所以它没有帮助。

您可以执行以下操作之一:

  1. 分别使用 PDO::errCode() PDOStatement::errorCode() 来检查是否发生了 SQL 错误,或者
  2. 初始化数据库连接,并将PDO::ATTR_ERRMODE设置为 PDO::ERRMODE_EXCEPTION(请参阅手册)。这样,PDO会抛出一个可以捕获的异常。