fetch_row
Функция mysqli_fetch_row() в PHP: синтаксис, возвращаемые значения, перебор строк результата и отличия от аналогов.
Функция mysqli_fetch_row() выбирает одну строку из результирующего набора MySQLi и возвращает её в виде нумерованного array — обычного массива с числовыми индексами, где $row[0] соответствует первому выбранному столбцу, $row[1] — второму и так далее. На этой странице рассматриваются синтаксис и возвращаемые значения функции, перебор результирующего набора в цикле, процедурный и объектно-ориентированный стили, случаи, когда её предпочтительнее использовать вместо альтернатив, а также типичные подводные камни.
Синтаксис
// Procedural style
mysqli_fetch_row(mysqli_result $result): array|null|false
// Object-oriented style
$result->fetch_row(): array|null|falseЕдинственный аргумент — $result, объект результата, возвращённый функциями mysqli_query(), mysqli_store_result() или mysqli_use_result().
Возвращаемое значение
| Ситуация | Возвращаемое значение |
|---|---|
| Строка считана | Нумерованный array ($row[0], $row[1], …) |
| Строк больше нет | null |
| Ошибка | false |
Каждый вызов перемещает внутренний курсор к следующей строке, что обеспечивает корректную работу в цикле while. Значения столбцов возвращаются как string (или null для SQL NULL), независимо от SQL-типа столбца, если только не включено преобразование к нативным типам через mysqlnd.
Базовый пример: перебор строк в цикле
Поскольку mysqli_fetch_row() возвращает null, когда строки заканчиваются, условие цикла прекращает его автоматически:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
die("Connection failed: " . mysqli_connect_error());
}
$result = mysqli_query($mysqli, "SELECT id, name FROM users");
if ($result) {
while ($row = mysqli_fetch_row($result)) {
// $row[0] = id, $row[1] = name (in the order they were SELECTed)
printf("%s: %s\n", $row[0], $row[1]);
}
mysqli_free_result($result);
} else {
echo "Query failed: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Мы устанавливаем соединение, проверяем наличие ошибки, затем выполняем SELECT. Внутри цикла while каждый вызов mysqli_fetch_row() возвращает следующую строку в виде массива с индексами в порядке SELECT — именно поэтому рекомендуется выбирать столбцы явно (id, name), а не через SELECT *: это фиксирует соответствие индекса и столбца.
Совет: Всегда вызывайте
mysqli_free_result()после завершения работы с результирующим набором, чтобы освободить занятую память, — особенно в долго работающих скриптах.
Объектно-ориентированный стиль
Та же логика с использованием OOP API, которое применяется в большинстве современного кода:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("Connection failed: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_row()) {
printf("%s: %s\n", $row[0], $row[1]);
}
$result->free();
$mysqli->close();
?>Когда использовать mysqli_fetch_row()
Используйте mysqli_fetch_row(), когда:
- Вы выбираете небольшой фиксированный набор столбцов и предпочитаете компактный доступ по индексу.
- Вы копируете или передаёте потоком необработанные строки, и имена столбцов не важны.
- Вам нужна минимальная накладная нагрузка при выборке (ассоциативный массив ключей не создаётся).
Отдайте предпочтение одной из альтернатив, когда имена или object удобнее:
mysqli_fetch_assoc()— возвращает ассоциативный array с ключами по именам столбцов ($row['name']). Более читаемо и надёжно при изменении порядка столбцов в SELECT.mysqli_fetch_array()— возвращает как числовые, так и ассоциативные ключи.mysqli_fetch_object()— возвращает каждую строку как object ($row->name).mysqli_fetch_all()— возвращает все строки сразу в одном массиве.
Типичные подводные камни
- Индексы следуют порядку SELECT, а не порядку столбцов в таблице.
SELECT *делает$rowнестабильным, так как добавление столбца в таблицу незаметно смещает индексы. Выбирайте столбцы явно. - Значения являются string. Числовой столбец возвращается как
"42", а не42. Приводите тип явно ((int) $row[0]), если нужно настоящее число. nullиfalse. Циклwhileвоспринимает оба значения как ложные, поэтому корректно завершается в любом случае — но при ручном получении одной строки следует различать «строк больше нет» (null) и «ошибка» (false).- Буферизованный и небуферизованный режимы. При использовании
mysqli_use_result()(небуферизованный режим) необходимо выбрать все строки перед выполнением следующего запроса на том же соединении.
Для общего понимания подключения и выполнения запросов смотрите обзор MySQLi и mysqli_connect().