Mir ist gerade aufgefallen, dass es so schön wardb_affected_rows
, @Berdir aus Drupal 7 zu entfernen . Ich frage mich jetzt, wie Sie jetzt am besten feststellen können, ob die von Ihnen ausgeführte Abfrage etwas in der Datenbank geändert hat.
Ein typischer Anwendungsfall wäre zu.
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
Ich habe mir das von db_query zurückgegebene Abfrageobjekt angesehen, aber es schien nicht viel Hilfe zu sein.
Update:
Ich sehe, ich war ein bisschen unklar, unter welchen Umständen ich die Informationen brauchte.
Mein aktueller Anwendungsfall ist recht einfach. Ich habe eine Tabelle für einen Knotentyp mit einer NID-Spalte und einigen Datenspalten. Ich habe ein Formular und möchte nach dem Absenden des Formulars die Zeile in der Datenbank entweder einfügen oder aktualisieren.
Das Problem mit db_update
/ db_insert
ist, dass ich, wenn ich zuerst update verwende und einfüge, wenn update 0 zurückgibt, die Bedingung nicht abfange, bei der das Formular mit dem Wert in der Datenbank gesendet wurde. Wenn ich zuerst db_insert verwende, wird dies einen Fehler auslösen, wenn bereits eine Zeile in der Datenbank vorhanden ist.
Ich nehme an, ich könnte in diesem speziellen Zustand beim Erstellen des Knotens einen leeren Wert einfügen und dann nur update verwenden. In einigen Fällen ist dies jedoch möglicherweise nicht möglich, wenn ich Informationen speichern muss, die für eine externe Datenbank verschlüsselt wurden. Ich möchte auch vermeiden, dass ich mich auf Datenbankwerte verlassen muss, damit mein Code funktioniert.
Meine übliche Strategie für solche Fälle war es, a
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Dies ist sowohl einfach als auch fehlerfrei, egal in welchem Zustand sich die Datenbank befindet. Die beste Option, die ich derzeit sehen kann, wäre, sie mit SQL zu handhaben und dies zu tun:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Ich hatte jedoch gehofft, dass die Datenbank-API damit umgehen kann.