W3docs

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

Практика

Практика
Какие из следующих утверждений верны относительно функции PHP mysqli_fetch_row()?
Какие из следующих утверждений верны относительно функции PHP mysqli_fetch_row()?
Was this page helpful?