строки, затронутые бд(), возвращают "1", если запрос неверен


У меня есть запрос типа UPDATE user SET creator = 'creator'". В таблице "пользователь" нет столбца "создатель", поэтому db_affected_rows() следует возвращать -1, а не 1.

Почему?

Обновление: mysql_affected_rows() возвращает -1 для этого запроса. Я создал столбец "создатель" (уникальный); после обновления таблицы пользователей я получаю сообщение об ошибке "Предупреждение пользователя: Повторяющаяся запись", но db_affected_rows() все равно возвращает 1.

 3
Author: kiamlaluno, 2011-04-23

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

 3
Author: Entendu, 2011-04-25 02:52:05

Попробуйте воспроизвести это за пределами Drupal, просто mysql_query(), mysql_affected_rows() и так далее.

Это может быть проблема с вашей версией PHP или что-то в этом роде. Drupal просто передает вызов вперед, он ничего не делает сам по себе.

 1
Author: Berdir, 2011-04-24 00:23:54