Должны ли запросы обновления mysqli возвращать результат?
Я обновляю свой PHP-код от mysql до mysqli, но я не могу найти ответ на этот вопрос: возникают ли запросы обновления mysqli?
С mysql я мог бы сделать
$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey');
и $result будет истинным, даже если запрос не возвращает никаких строк.
Теперь, хотя в коде mysqli у меня есть что-то вроде этого (обработка ошибок устранена для ясности):
$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)")
$stmt->bind_param("s", $mykey);
$stmt->execute();
$result = $stmt->get_result();
и $result - false.
Для записи запрос действителен (игнорируйте любые опечатки, которые я, возможно, переписал в stackoverflow), и поле1 правильно обновлено в базе данных, как и ожидалось. Кроме того, get_result() отлично работает для выбранных запросов, поэтому это не вопрос get_result(), который недоступен.
В принципе, я просто хочу знать, ожидалось ли это измененное поведение или я должен продолжать пытаться найти какую-то ошибку.
Ответы
Ответ 1
Подготовленный оператор выполняется с помощью
$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
}
Ответ 2
Запросы, не относящиеся к SELECT, не имеют "набора результатов", поэтому get_result
для них не имеет смысла. Если вы хотите узнать, есть ли запрос модификации (UPDATE
, INSERT
или DELETE
), используйте $stmt->affected_rows
. Это будет 0 или отличное от нуля в зависимости от того, сделал ли запрос что-либо.