使用PHP PDO rowCount()检测错误与未受影响的行
使用PHP PDO,是否有办法区分更新失败和更新成功运行但将字段设置为其现有值之间的区别使用PHP PDO rowCount()检测错误与未受影响的行,php,pdo,rowcount,Php,Pdo,Rowcount,使用PHP PDO,是否有办法区分更新失败和更新成功运行但将字段设置为其现有值之间的区别 $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_
$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 />';
我尝试将PDO::MYSQL_ATTR_FOUND_ROWS=>添加到我的PDO中,但这导致rowCount()返回1,而不管值是否更改,因此没有任何帮助。您可以执行以下操作之一:
PDO::ATTR_ERRMODE
设置为PDO::ERRMODE_EXCEPTION
,初始化数据库连接(请参阅)。这样,PDO会抛出一个您可以捕获的异常失败的语句将返回布尔值false或引发异常,具体取决于您的pdo设置。不更新(或匹配)任何内容的查询不是失败-它只是一个空的结果集。更新失败可能您必须使用ACID事务-使用try-catch可以在失败时进行检查。我使用的是ERRMODE\u-SILENT,我认为它最适合/最安全于实时环境,但我想这可能抑制了错误(?)虽然我仍然能够通过该设置从SELECT中获取1、0或NULL,但不需要更新。知道故障在哪里会很有用,而不仅仅是捕获PDO中的某个错误。这意味着,通过为更新的行返回1+、0或NULL,可以很好地识别更新前后的错误。您是否喜欢这两种方法中的任何一种?我想,例外可能是最好的办法。如果我只输出自定义消息(而不是PDOException的$e->getMessage()),那么在实时环境中使用是否安全?try/catch似乎会检测到PDO中的任何错误,无论是在初始选择中,还是在后续更新中,因此我认为它会处理到最终“$db=null;”为止的任何错误陈述如果是这种情况,我不需要更新时出现单独的错误,任何失败都只需要一个整体错误,这很好。你能确认一下吗?我更喜欢
ERRMODE\u EXCEPTION
。在每次查询之后使用errorCode()
检查错误很容易忘记(使您忘记检查的错误更令人惊讶)。在我看来,使用异常可以更容易地跟踪错误。在实时环境中使用这种方法通常不是问题,因为您可以捕获异常并自行处理它(例如,在您的开发环境中将其与调用堆栈一起打印,并在实时环境中只打印一般错误消息)。
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!
}