繁体   English   中英

如何检查pdo更新查询中是否有任何列值已更改

[英]How to check if any column value has changed in pdo update query

我需要检查使用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

您可以使用rowCount() 如果某行受更新影响(即任何列值已更改),则该行将计为1。 从MySQL 手册

如果将列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。
UPDATE返回实际更改的行数。

$stmt->execute()使用之后

if ($stmt->rowCount()) {
    // some rows changed
    // do something
}

如果您只想在发生更新时返回true / false值,则可以

return $stmt->rowCount() > 0;

或者如果您不使用严格的类型匹配(即=== ),则只需

return $stmt->rowCount();

根据rowCount()手册中的注释,

当更新具有相同值的Mysql表时,什么都没有受到真正的影响,因此rowCount将返回0。

这在rowCount()的PHP手册中没有明确记录。 但是,它记录在MySQL UPDATE文档中

如果将列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。

结合

UPDATE返回实际更改的行数。

但是,请注意,如果在定义PDO对象时添加PDO::MYSQL_ATTR_FOUND_ROWS => true选项,则会更改此行为。 使用该选项,它将返回受影响的行数,而不管它们的值实际上是否已更新(因此,即使这些值没有更改,只要找到与您的WHERE条件匹配的记录,它将返回1)。

所以你的代码最终会被

$stmt->execute();
return $stmt->rowCount() ? 1 : 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM