строки, затронутые бд(), возвращают "1", если запрос неверен
У меня есть запрос типа UPDATE user SET creator = 'creator'"
. В таблице "пользователь" нет столбца "создатель", поэтому db_affected_rows()
следует возвращать -1, а не 1.
Почему?
Обновление: mysql_affected_rows()
возвращает -1 для этого запроса. Я создал столбец "создатель" (уникальный); после обновления таблицы пользователей я получаю сообщение об ошибке "Предупреждение пользователя: Повторяющаяся запись", но db_affected_rows()
все равно возвращает 1.
2 answers
Редактировать: Функция db_affected_rows() возвращает неожиданное значение, так как включен сторожевой таймер. Я посмотрел, был ли еще один запрос после того, который я выполнил, и до моего вызова db_affected_rows(), и, конечно же:
ВСТАВЬТЕ В сторожевой таймер (uid, тип, сообщение, переменные, серьезность, ссылка, местоположение, ссылка, имя хоста, метка времени) ЗНАЧЕНИЯ (1, 'php', '%сообщение в %файле в строке %строка.', 'a:4:{s:6: \"%ошибка"; s:12:\"предупреждение пользователя"; s:8:\"%сообщение"; s:104:\"Неизвестный столбец 'имя 2' в "списке полей"\запрос: ОБНОВИТЬ пользователей, УСТАНОВИТЕ name2 = 'a'\"; [...]
Итак, db_affected_rows() возвращает 1, потому что сторожевой таймер регистрирует ошибку. Таким образом, правильный способ узнать, была ли ошибка в запросе или нет - и подсчитать, какие строки были затронуты, если он был успешным - это:
$result = db_query("UPDATE users SET name2 = 'a'");
if ($result) {
printf("Records affected: %d\n", db_affected_rows());
}
else {
print "Query not successful";
}
Надеюсь, это поможет!
Оригинальный ответ для потомков:
Я должен был бы увидеть код вокруг вашего запроса. Попробуйте запустить это:
<?php
function db_affected_rows() {
global $link;
return mysql_affected_rows($link);
}
$link = mysql_connect('localhost', 'root', 'root');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('d6.devl');
/* this should return the correct numbers of deleted records */
mysql_query("UPDATE user SET creator = 'creator'");
printf("Records affected: %d\n", mysql_affected_rows());
printf("Records affected: %d\n", db_affected_rows());
Я сделал, и это сработало хорошо:
$php-f test.php
Затронутые записи: -1
Затронутые записи: -1
Попробуйте воспроизвести это за пределами Drupal, просто mysql_query()
, mysql_affected_rows()
и так далее.
Это может быть проблема с вашей версией PHP или что-то в этом роде. Drupal просто передает вызов вперед, он ничего не делает сам по себе.