Acabo de notar que @Berdir fue muy agradable de eliminar db_affected_rows
de Drupal 7 . Ahora me pregunto cuál es la mejor práctica para detectar si la consulta que ejecutó cambió algo en la base de datos.
Un caso de uso típico sería
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
Eché un vistazo al objeto de consulta devuelto por db_query, pero no me pareció de mucha ayuda.
Actualización:
veo que no estaba claro en qué circunstancias necesitaba la información.
Mi caso de uso actual es bastante simple. Tengo una tabla para un tipo de nodo con una columna nid y algunas columnas de datos. Tengo un formulario y al enviar el formulario, quiero insertar o actualizar la fila en la base de datos.
El problema con db_update
/ db_insert
es que, si uso la actualización primero, y la inserto si la actualización devuelve 0, no captaré la condición, donde el formulario se envió con el valor en la base de datos. Si uso db_insert primero, eso generará un error si ya hay una fila en la base de datos.
Supongo que en esta condición específica podría insertar un valor en blanco cuando se crea el nodo y luego solo usar la actualización, pero en algunos casos eso podría no ser posible, si necesito almacenar información que fue ingresada en una base de datos externa. También me gustaría evitar tener que depender de los valores de la base de datos para que mi código funcione.
Mi estrategia habitual para tales casos ha sido hacer un
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Hacer esto es simple y sin errores, sin importar en qué condición se encuentre la base de datos. La mejor opción que puedo ver en este momento sería manejarlo con SQL y hacer esto:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Pero esperaba que la API de db pudiera manejar esto.