more_results
Функция mysqli_more_results() в PHP проверяет наличие дополнительных результатов после выполнения мульти-запроса. Синтаксис и примеры.
Функция mysqli_more_results() проверяет, есть ли ещё один набор результатов в очереди после выполнения нескольких SQL-операторов за раз с помощью mysqli_multi_query(). Она входит в небольшой набор инструментов для обхода результатов мульти-запроса. В этой статье рассмотрены синтаксис, возвращаемое значение, паттерн цикла и типичные ошибки.
Синтаксис
mysqli_more_results(mysqli $mysql): boolВ объектно-ориентированном стиле тот же метод выглядит как $mysqli->more_results().
Параметр
$mysql— объект соединения MySQLi, возвращённый функциейmysqli_connect()(илиnew mysqli(...)).
Возвращаемое значение
mysqli_more_results() возвращает true, если после последнего вызова mysqli_multi_query() ещё доступны один или несколько наборов результатов, и false, если их больше нет. Функция не переходит к следующему набору — для этого нужно вызвать mysqli_next_result().
Когда это использовать?
Одиночный mysqli_query() возвращает один набор результатов, поэтому mysqli_more_results() там не нужна. Она актуальна только при работе с mysqli_multi_query(), который позволяет отправить несколько операторов, разделённых ;, за один раз — например, вызов хранимой процедуры, возвращающей несколько SELECT, или скрипт пакетного импорта. mysqli_more_results() выступает условием цикла, которое сообщает, когда остановиться.
Стандартный паттерн цикла
Три функции работают совместно:
| Функция | Роль |
|---|---|
mysqli_more_results() | Есть ли ещё один набор результатов? |
mysqli_next_result() | Переход к следующему набору результатов. |
mysqli_store_result() | Получение текущего набора результатов для чтения строк. |
<?php
$mysqli = mysqli_connect("localhost", "user", "pass", "demo");
mysqli_multi_query($mysqli, "SELECT 1 AS n; SELECT 2 AS n; SELECT 3 AS n;");
do {
// Fetch the result set for the current statement.
if ($result = mysqli_store_result($mysqli)) {
$row = mysqli_fetch_assoc($result);
echo "Result: {$row['n']}\n";
mysqli_free_result($result);
}
// Keep going only while another set is queued AND we can advance to it.
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
mysqli_close($mysqli);
?>Для трёх приведённых операторов будет выведено:
Result: 1
Result: 2
Result: 3Использование do...while (а не обычного while) сделано намеренно: первый набор результатов уже текущий сразу после вызова mysqli_multi_query(), поэтому его нужно обработать до проверки наличия следующих.
Типичные ошибки
- Всегда используйте её вместе с
mysqli_next_result().mysqli_more_results()только сообщает состояние; указатель она не перемещает. Вызов в цикле безmysqli_next_result()приведёт к бесконечному циклу на первом наборе. - Освобождайте каждый набор результатов. Вызывайте
mysqli_free_result()перед переходом к следующему, иначе лишние наборы останутся в памяти. - Оператор, не возвращающий строк (
INSERT,UPDATEили пустойSELECT), заставляетmysqli_store_result()вернутьfalse— это нормально, а не ошибка. Используйтеmysqli_errno($mysqli), если нужно различить эти два случая.
Демонстрация возвращаемого значения без базы данных
Чтобы увидеть, что сообщает функция, не нужен живой сервер. Небольшой массив, имитирующий логику, наглядно показывает цикл и boolean-значения:
<?php
$resultSets = ["one", "two", "three"];
$index = 0;
do {
echo "Processing: {$resultSets[$index]}\n";
$index++;
// more_results() is true while another set remains.
$more = $index < count($resultSets);
echo $more ? "more_results -> true\n" : "more_results -> false\n";
} while ($more);
?>Вывод:
Processing: one
more_results -> true
Processing: two
more_results -> true
Processing: three
more_results -> falseСвязанные функции
mysqli_multi_query()— запускает несколько операторов за раз.mysqli_next_result()— переходит к следующему набору результатов.mysqli_use_result()— альтернативаstore_result(), передающая строки потоком.- Обзор расширения MySQLi — как все эти функции связаны между собой.
Заключение
mysqli_more_results() — это проверка «есть ли ещё?» в цикле мульти-запроса. Сама по себе она делает немного; в сочетании с mysqli_next_result() и mysqli_store_result() в цикле do...while она позволяет аккуратно обработать каждый набор результатов, возвращённый одним вызовом mysqli_multi_query().