7

我正在使用 PDO 进行更新查询。我想知道我的更新查询是否没有改变数据库中的任何内容,因为:

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

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

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

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

从这个问题的评论中:

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

更新 我发现另一个问题在下面的评论中给出了一个命题的例子: Getting the insert and update ID with PDO

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

4

2 回答 2

1

您可以在 'where' 子句中添加条件,例如 " and ColumnToUpdate <> 'NewValue'"

于 2014-08-09T19:58:55.113 回答
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
        }
    }
}
于 2014-08-15T08:46:31.520 回答