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

时间:2013-07-06 10:25:23

标签: mysql pdo

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

  1. 传递的值与数据库中已存在的值相同。我知道在这种情况下rowCount()会返回0
  2. 我正在尝试更新的行在数据库中不存在。据我所知,rowCount()在这种情况下也会返回0
  3. 我是否被强制在SELECT语句的UPDATE之前,以确定我正在尝试更新的记录是否确实存在?或者是否存在这种事情的另一种常见做法。

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

    我遇到过这个StackOverflow的答案,这表明rowCount()在某些情况下可能会返回NULL,但我不认为它适用于我的场景: 见Why does PDO rowCount() return 0 after UPDATE a table without modifying the existing data?

    来自这个问题的评论:

      

    如果数据尚未修改,则rowCount将为零。如果   数据被修改,rowCount将是一个或更高。如果有的话   错误,rowCount将为null或false或非零值。

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

    UPDATE2 另一个问题提出了另一个解决方案,通过PDO::MYSQL_ATTR_FOUND_ROWS PDO - check if row was updated?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

' ave使用@ 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
        }
    }
}