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

时间:2019-04-24 05:33:19

标签: php mysql pdo

在使用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

2 个答案:

答案 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;