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().