如何检查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。



catspeake
浏览 183回答 2
2回答

鸿蒙传说

根据的手册中rowCount()的注释,当更新具有相同值的Mysql表时,什么都没有受到真正的影响,因此rowCount将返回0。的PHP手册中未明确记录rowCount()。但是,它记录在MySQLUPDATE文档中,如果将列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。结合UPDATE返回实际更改的行数。但是,请注意,如果PDO::MYSQL_ATTR_FOUND_ROWS => true在定义PDO对象时添加该选项,则会更改此行为。使用该选项,它将返回受影响的行数,而不管它们的值实际上是否已更新(因此,只要发现匹配WHERE条件的记录,即使值没有更改,它也将返回1 )。所以你的代码最终会被$stmt->execute(); return $stmt->rowCount() ? 1 : 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();
打开App,查看更多内容
随时随地看视频慕课网APP