在使用PDO更新记录时,我需要检查是否有任何列值已更改。我在下面解释我的查询。
$qry ="UPDATE cb_driver_info
SET owner_id=:owner_id,
email=:email,
mobile=:mobile,
image=:image
WHERE id=:driver_id";
$stmt = $db->prepare($qry);
$stmt->bindParam(':owner_id', htmlspecialchars(strip_tags($owner_id)));
$stmt->bindParam(':email', htmlspecialchars(strip_tags($email)));
$stmt->bindParam(':mobile', htmlspecialchars(strip_tags($mobile)));
$stmt->bindParam(':image', htmlspecialchars(strip_tags($image)));
$stmt->bindParam(':driver_id', htmlspecialchars(strip_tags($driver_id)));
$stmt->execute();
在这里,我正在更新记录。我需要检查更新时是否有任何列值被破坏,它将return 1
,如果同一记录再次被更新,它将return 0
。
答案 0 :(得分:1)
您可以使用rowCount()
。如果任何行受更新影响(即任何列值已更改),则该行将计为1。从MySQL manual:
如果将一列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。
UPDATE返回实际更改的行数。
$stmt->execute()
使用后
if ($stmt->rowCount()) {
// some rows changed
// do something
}
如果在发生更新时只想返回true / false值,则可以
return $stmt->rowCount() > 0;
,或者如果您不使用严格的类型匹配(即===
),只需
return $stmt->rowCount();
答案 1 :(得分:1)
根据manual of rowCount()
中的评论,
当更新具有相同值的Mysql表时,什么都没有受到真正的影响,因此rowCount将返回0。
rowCount()
的PHP手册中未明确记录。但是,它记录在MySQL UPDATE
documentation
如果将一列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。
与
组合UPDATE返回实际更改的行数。
但是,请注意,如果在定义PDO对象时添加了PDO::MYSQL_ATTR_FOUND_ROWS => true
选项,则会更改此行为。使用该选项,它将返回受影响的行数,无论它们的值实际上是否已更新(因此,即使这些值没有更改,只要找到与您的WHERE
条件匹配的记录,它都将返回1。 )。
所以您的代码最终将是
$stmt->execute();
return $stmt->rowCount() ? 1 : 0;