W3docs

fetch_all

Функция mysqli_fetch_all() в PHP: синтаксис, константы режима, примеры использования и типичные ошибки.

Функция mysqli_fetch_all() извлекает все строки результирующего набора MySQLi за один вызов и возвращает их в виде единого двумерного array. Вместо того чтобы перебирать строки по одной с помощью mysqli_fetch_assoc(), вы получаете весь набор результатов сразу — это удобно, когда нужно передать данные в шаблон, закодировать их как JSON или обработать всё за раз.

В этой статье рассмотрены синтаксис, константы типа результата, возвращаемое значение, рабочие примеры и типичные ошибки.

Синтаксис и параметры

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array
ПараметрОписание
$resultОбъект mysqli_result, возвращаемый функциями mysqli_query(), mysqli_store_result() или mysqli_use_result().
$modeНеобязательный. Определяет способ индексации каждой строки. Одно из значений: MYSQLI_ASSOC, MYSQLI_NUM (по умолчанию) или MYSQLI_BOTH.

Возвращаемое значение: двумерный array всех строк. Если результирующий набор пуст, возвращается пустой array [].

КонстантаИндексация каждой строки
MYSQLI_ASSOCПо именам столбцов ($row['name']).
MYSQLI_NUMПо числовым индексам столбцов ($row[0]). Используется по умолчанию.
MYSQLI_BOTHКак по именам, так и по числовым индексам.

Примечание: mysqli_fetch_all() требует драйвера mysqlnd. Функция доступна начиная с PHP 5.3 и работает как в процедурном стиле, показанном здесь, так и в объектно-ориентированном стиле $result->fetch_all().

Как использовать mysqli_fetch_all()

Вызовите функцию на действительном результирующем наборе после выполнения запроса. Здесь мы получаем все строки в виде ассоциативного array:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");

if (!$mysqli) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);

if ($result) {
    $rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
    foreach ($rows as $row) {
        echo $row['column1'] . " - " . $row['column2'] . "\n";
    }
}

mysqli_close($mysqli);
?>

Шаг за шагом: mysqli_connect() открывает соединение, и мы проверяем его успешность, чтобы избежать последующей фатальной ошибки. mysqli_query() выполняет SELECT и возвращает mysqli_result. Затем мы вызываем mysqli_fetch_all($result, MYSQLI_ASSOC), который возвращает array следующего вида:

[
    ['column1' => 'Anna',  'column2' => 'NYC'],
    ['column1' => 'Bob',   'column2' => 'LA'],
]

Поскольку каждая строка индексирована по имени столбца, цикл foreach обращается к $row['column1'] и $row['column2'] напрямую.

Получение числового или комбинированного array

Аргумент $mode изменяет способ индексации строк. Передайте MYSQLI_NUM, чтобы получить числовые индексы, или MYSQLI_BOTH — чтобы в каждой строке были как имена, так и числовые индексы. Здесь мы получаем числовой array:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");

if (!$mysqli) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);

if ($result) {
    $rows = mysqli_fetch_all($result, MYSQLI_NUM);
    foreach ($rows as $row) {
        echo $row[0] . " - " . $row[1] . "\n";
    }
}

mysqli_close($mysqli);
?>

Здесь строки возвращаются с индексами по позиции, поэтому первые два столбца читаются как $row[0] и $row[1]. При использовании MYSQLI_BOTH оба значения — $row[0] и $row['column1'] — будут указывать на одно и то же — удобно при миграции кода, но удваивает использование памяти для каждой строки.

fetch_all() vs. fetch_assoc() в цикле

mysqli_fetch_all() загружает весь результирующий набор в память PHP за один раз и избавляет от необходимости цикла. В отличие от этого, mysqli_fetch_assoc() извлекает по одной строке за вызов, поэтому цикл while обрабатывает строки по одной:

// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['column1'] . " - " . $row['column2'] . "\n";
}

Используйте mysqli_fetch_all(), когда результирующий набор небольшой или среднего размера и вам нужны все строки сразу (например, для json_encode()). Отдавайте предпочтение циклу while с mysqli_fetch_assoc() для очень больших результирующих наборов, где загрузка всего сразу может исчерпать память.

Типичные ошибки

  • $result должен быть действительным. Если запрос завершился неудачей, mysqli_query() вернёт false, а не object результата — всегда проверяйте это перед извлечением данных, как показано в примерах.
  • Пустой результирующий набор — не ошибка. Если ни одна строка не совпадает, вы получите [], и foreach просто ничего не сделает.
  • Всегда используйте подготовленные выражения при работе с недоверенными входными данными. Буквальный SELECT * FROM my_table в примерах выше не принимает пользовательский ввод; для любых динамических запросов привязывайте параметры, чтобы предотвратить SQL-инъекцию.

Связанные функции

  • mysqli_fetch_assoc() — извлечение одной строки в виде ассоциативного array.
  • mysqli_fetch_array() — извлечение одной строки в виде ассоциативного, числового или комбинированного array.
  • mysqli_fetch_row() — извлечение одной строки в виде числового array.
  • mysqli_fetch_object() — извлечение одной строки в виде object.
  • mysqli_query() — выполнение запроса, создающего результирующий набор.

Заключение

mysqli_fetch_all() — самый быстрый способ поместить весь результирующий набор MySQLi в PHP array. Выбирайте MYSQLI_ASSOC для удобочитаемых ключей по именам столбцов, MYSQLI_NUM для компактных числовых ключей или MYSQLI_BOTH, когда нужны оба варианта. Помните, что функция загружает все строки в память, поэтому для больших наборов данных предпочтительнее построчный цикл с mysqli_fetch_assoc().

Практика

Практика
Что возвращает mysqli_fetch_all() при вызове на результирующем наборе?
Что возвращает mysqli_fetch_all() при вызове на результирующем наборе?
Was this page helpful?