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

时间:2013-01-28 19:18:44

标签: 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(*)SELECT行时,fetchColumn()返回行数(如果有),如果没有则返回0,如果有错误则返回其他行。所以我可以使用($ countRowsSelected&gt; 0)来检测行,($ countRowsSelected ===“0”)来检测没有行,并且ELSE来检测错误。

是否可以通过UPDATE执行此操作?除了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 =&gt;对我的PDO是真的,但这导致rowCount()返回1,无论值是否改变,所以它没有帮助。

1 个答案:

答案 0 :(得分:0)

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

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