UPDATE查询后PDO rowCount()可以显示"没有更改"和"不存在的行"之间的区别吗?

cho*_*ata 6 mysql pdo

我正在使用PDO进行更新查询.我想弄清楚我的更新查询是否没有更改数据库中的任何内容,因为:

  1. 传递的值与数据库中已存在的值相同.我知道rowCount()在这种情况下返回0.
  2. 我正在尝试更新的行在数据库中不存在.据我所见,rowCount()在这种情况下也会回归0.

我是否被强制在SELECT语句的UPDATE之前,以确定我正在尝试更新的记录是否确实存在?或者是否有这种事情的另一种常见做法.

我一直在阅读文档,但无法找到确凿的答案:http: //php.net/manual/en/pdostatement.rowcount.php

我遇到过这个StackOverflow的答案,这表明rowCount()在某些情况下可能会返回NULL,但我不认为它适用于我的场景:请参阅为什么PDO rowCount()在UPDATE表之后返回0而不修改现有数据?

从这个问题的评论:

如果数据尚未修改,则rowCount将为零.如果数据已修改,则rowCount将为1或更高.如果出现错误,则rowCount将为null或false或非零值.

更新 我发现了另一个问题,在下面的评论中给出了一个命题的例子: 用PDO获取插入和更新ID

UPDATE2 另一个问题提出另一个解决方案,通过PDO::MYSQL_ATTR_FOUND_ROWS PDO - 检查行是否更新?

cho*_*ata 0

我已经使用@hjpotter92 的建议解决了这个问题。

// UID is the unique ID of my table, autoincremented etc...
// Firstly, let's try to update my row
$query = 'UPDATE my_table SET x=0, y=1, uid=LAST_INSERT_ID(uid) WHERE z=2';
$sth = $dbh->prepare($query);
if($sth->execute()) {
    if($dbh->lastInsertId() == 0) { // Record was not found, so insert it.
        $query = 'INSERT INTO my_table (x,y) VALUES (0,1)';
        $sth = $dbh->prepare($query);
        $sth->execute();
        if($sth->rowCount() > 0) {
            echo $dbh->lastInsertId(); // Return the UID of the inserted row
        }
    }
}
Run Code Online (Sandbox Code Playgroud)