W3docs

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_more_results() — это проверка «есть ли ещё?» в цикле мульти-запроса. Сама по себе она делает немного; в сочетании с mysqli_next_result() и mysqli_store_result() в цикле do...while она позволяет аккуратно обработать каждый набор результатов, возвращённый одним вызовом mysqli_multi_query().

Практика

Практика
Что делает mysqli_more_results() в PHP?
Что делает mysqli_more_results() в PHP?
Was this page helpful?