7

PDOで更新クエリを実行しています。次の理由から、更新クエリがデータベース内で何も変更されていないかどうかを確認したいと思います。

  1. 渡された値は、データベースに既に存在するものと同じです。rowCount()そのような場合は が返されることを私は知っています0
  2. 更新しようとしている行がデータベースに存在しません。私が見る限り、rowCount()そのような場合も を返します0

更新しようとしているレコードが実際に存在するかどうかを確認するために、SELECT ステートメントを UPDATE の前に置く必要がありますか? または、この種の別の一般的な慣行があります。

私はドキュメントを熟読してきましたが、決定的な答えを見つけることができません: http://php.net/manual/en/pdostatement.rowcount.php

この StackOverflow の回答に出くわしました。これは、rowCount() が一部のシナリオで NULL を返す可能性があることを示唆していますが、私のシナリオには当てはまらないと思います。既存のデータ?

この質問のコメントから:

データが変更されていない場合、rowCount はゼロになります。データが変更された場合、rowCount は 1 以上になります。エラーが発生した場合、rowCount は null または false またはゼロ以外の値になります。

更新 以下のコメントで命題の例を示す別の質問を見つけました: PDO を使用して挿入および更新 ID を取得する

UPDATE2 別の質問は、PDO::MYSQL_ATTR_FOUND_ROWS PDOを介して別の解決策を提案しています-行が更新されたかどうかを確認しますか?

4

2 に答える 2

1

「and ColumnToUpdate <> 'NewValue'」などの「where」句に条件を追加できます

于 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 に答える