Ho appena notato che @Berdir è stato così bello da rimuovere db_affected_rows
da Drupal 7 . Ora mi chiedo quale sia la procedura migliore ora per rilevare se la query eseguita ha cambiato qualcosa nel database.
Un tipico caso d'uso sarebbe.
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
Ho dato un'occhiata all'oggetto query restituito da db_query, ma non mi è sembrato di grande aiuto.
Aggiornamento:
vedo che non ero chiaro su quali circostanze avessi bisogno delle informazioni.
Il mio caso d'uso attuale è piuttosto semplice. Ho una tabella per un tipo di nodo con una colonna nid e alcune colonne di dati. Ho un modulo e dopo aver inviato il modulo, voglio inserire o aggiornare la riga nel db.
Il problema con db_update
/ db_insert
è che, se uso prima l'aggiornamento e inserisco se l'aggiornamento restituisce 0, non rileverò la condizione, in cui il modulo è stato inviato con il valore nel db. Se uso prima db_insert, ciò genererà un errore se esiste già una riga nel db.
Suppongo che in questa specifica condizione potrei inserire un valore vuoto quando il nodo viene creato e quindi utilizzare solo l'aggiornamento, ma per alcuni casi ciò potrebbe non essere possibile, se avessi bisogno di archiviare informazioni che erano state codificate in un database esterno. Vorrei anche evitare di dover dipendere dai valori del database affinché il mio codice funzioni.
La mia solita strategia per questi casi è stata quella di fare un
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Fare questo è sia semplice che privo di errori, indipendentemente dalle condizioni in cui si trova il db. L'opzione migliore che posso vedere in questo momento, sarebbe gestirla con SQL e fare questo:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Ma speravo che l'API db fosse in grado di gestirlo.