Должны ли запросы на обновление mysqli возвращать результат?


Я обновляю свой PHP-код с mysql на mysqli, но, похоже, не могу найти ответ на этот вопрос: Возвращают ли запросы на обновление mysqli результат?

С mysql я мог бы сделать

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey');

И $результат будет истинным, даже если запрос не возвращает никаких строк.

Теперь, однако, в коде mysqli у меня есть что-то вроде этого (обработка ошибок удалена для ясности):

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)")
$stmt->bind_param("s", $mykey);
$stmt->execute();
$result = $stmt->get_result();

И $результат является ложным.

Для записи запрос действителен (игнорируйте любые опечатки, которые я возможно, он переписал его в stackoverflow), и поле 1 правильно обновлено в базе данных, как и ожидалось. Кроме того, get_result() отлично работает для запросов select, поэтому дело не в том, что get_result() недоступен.

В принципе, я просто хочу знать, ожидается ли это изменение поведения или мне следует продолжать пытаться найти где-нибудь какую-нибудь ошибку.

Author: Swiftheart, 2013-02-16

2 answers

Подготовленный оператор выполняется с помощью

 $stmt->execute();

И execute() возвращает значение TRUE в случае успеха или FALSE в случае неудачи.

Потому что UPDATE, DELETE, INSERT не приводите ни к какому результату, нет необходимости использовать get_result(). Если вам нужно знать общее количество затронутых строк, вы можете сделать это с помощью функции mysqli_stmt_affected_rows().

Поэтому ваш код может выглядеть следующим образом

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)")
$stmt->bind_param("s", $mykey);
$stmt->execute();
//You can get the number of rows affected by your query
$nrows = $stmt->affected_rows;
if (!$nrows) {
    //Nothing has been updated
}
 13
Author: peterm, 2013-02-16 07:55:02

Запросы без ВЫБОРА не имеют "набора результатов", поэтому get_result для них бессмысленно. Если вы хотите знать, был ли запрос на изменение (UPDATE, INSERT, или DELETE), используйте $stmt->affected_rows. Это будет 0 или ненулевое значение в зависимости от того, сделал ли запрос что-либо.

 4
Author: Barmar, 2013-02-16 07:46:49