Я только что заметил, что @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_insert, это вызовет ошибку en, если в базе данных уже есть строка.
Я полагаю, что в этом конкретном состоянии я мог бы вставить пустое значение при создании узла, а затем использовать только обновление, но в некоторых случаях это было бы невозможно, если бы мне нужно было хранить информацию, которая была привязана к внешней базе данных. Я также хотел бы избежать зависимости от значений базы данных для моего кода для функционирования.
Моя обычная стратегия для таких случаев - сделать
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Это просто и безошибочно, независимо от того, в каком состоянии находится БД. Лучший вариант, который я сейчас вижу, - это обработать его с помощью SQL и сделать это:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Но я надеялся, что db API сможет справиться с этим.