私は@Berdirがdb_affected_rows
Drupal 7 から削除するのがとても良かったことに気づきました。ここで、実行したクエリがデータベース内の何かを変更したかどうかを検出するためのベストプラクティスは何なのかと思っています。
典型的なユースケースは次のとおりです。
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
db_queryから返されたクエリオブジェクトを確認しましたが、あまり役に立ちませんでした。
更新:
情報が必要な状況については、少し不明確でした。
私の現在の使用例は、非常に単純なものです。nid列といくつかのデータ列を持つノードタイプのテーブルがあります。フォームの送信時にフォームがあり、データベースに行を挿入または更新します。
db_update
/ の問題db_insert
は、最初にupdateを使用し、updateが0を返した場合に挿入すると、フォームがdbの値で送信されたという条件をキャッチできないことです。最初にdb_insertを使用した場合、すでにdbに行があるとエラーが発生します。
この特定の条件では、ノードの作成時に空白値を挿入してから更新のみを使用できると思いますが、外部データベースにキー入力された情報を保存する必要がある場合は、それができない場合があります。また、コードが機能するためにデータベースの値に依存する必要がないようにしたいと思います。
そのような場合の私の通常の戦略は、
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
これを行うことは、データベースがどのような状態であっても、シンプルでエラーのない状態です。現在私が見ることができる最良のオプションは、SQLで処理してこれを行うことです。
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
しかし、私はdb APIがこれを処理できることを望んでいました。