W3docs

fetch_assoc

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

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

Что делает mysqli_fetch_assoc()

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

$row = mysqli_fetch_assoc($result);
echo $row['email']; // access a value by its column name

Каждый вызов перемещает внутренний курсор вперёд, поэтому повторные вызовы функции последовательно перебирают строки по одной. Когда строки заканчиваются, функция возвращает null.

Синтаксис

mysqli_fetch_assoc(mysqli_result $result): array|null|false
ЧастьОписание
$resultОбъект результата, возвращённый функцией mysqli_query() (или mysqli_store_result() / mysqli_use_result()).
ВозвратАссоциативный array для извлечённой строки, null когда строк больше нет, или false при ошибке.

Если два столбца в вашем SELECT имеют одинаковое имя (например, JOIN возвращает два столбца id), в array сохранится только последний — используйте псевдонимы столбцов (SELECT a.id AS user_id), чтобы сохранить оба.

Извлечение строк в цикле

Как правило, mysqli_fetch_assoc() вызывается внутри цикла while. Поскольку после последней строки она возвращает null (ложное значение), цикл завершается сам по себе:

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

if (mysqli_connect_errno()) {
    die("Connection failed: " . mysqli_connect_error());
}

$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");

if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo $row['id'] . ": " . $row['name'] . " ($" . $row['price'] . ")\n";
    }
    mysqli_free_result($result);
} else {
    echo "Query failed: " . mysqli_error($mysqli);
}

mysqli_close($mysqli);
?>

Мы проверяем подключение с помощью mysqli_connect_errno(), выполняем запрос, затем запускаем цикл. На каждой итерации следующая строка присваивается переменной $row; когда набор исчерпан, присвоение даёт null, условие while становится ложным и цикл останавливается. mysqli_free_result() освобождает память, занятую результирующим набором, после того как мы с ним закончили.

Изучение возвращаемого array

Чтобы понять форму строки, база данных не нужна. Следующий фрагмент строит array, идентичный тому, что вернул бы один вызов mysqli_fetch_assoc(), и выводит его на экран — так вы увидите ключи с именами столбцов:

<?php
// This is the structure mysqli_fetch_assoc() hands back for one row.
$row = [
    "id"    => 1,
    "name"  => "Keyboard",
    "price" => 29.99,
];

echo "Product: " . $row["name"] . "\n";
echo "Price:   $" . $row["price"] . "\n";

print_r($row);
?>

При выполнении выводится:

Product: Keyboard
Price:   $29.99
Array
(
    [id] => 1
    [name] => Keyboard
    [price] => 29.99
)

Распространённые ошибки

  • Вызов функции при неудачном запросе. mysqli_query() возвращает false при ошибке, и передача false в mysqli_fetch_assoc() недопустима. Всегда сначала проверяйте $result, как в примере с циклом выше.
  • Забывают, что функция возвращает только одну строку. Один вызов даёт вам следующую строку, а не всю таблицу. Используйте цикл, чтобы прочитать все строки.
  • Использование == вместо присвоения. В цикле используется $row = mysqli_fetch_assoc($result) (присвоение). Написание == никогда не продвинет курсор и может привести к бесконечному циклу.
  • Попытка числового доступа. Используйте $row['name'], а не $row[0]. Для числовых ключей используйте mysqli_fetch_row(); для обоих типов — mysqli_fetch_array().

Сравнение с другими функциями выборки

ФункцияВозвращает каждую строку как
mysqli_fetch_assoc()Ассоциативный array ($row['name'])
mysqli_fetch_row()Числовой array ($row[0])
mysqli_fetch_array()Ассоциативные и числовые ключи одновременно
mysqli_fetch_object()object ($row->name)
mysqli_fetch_all()Array всех строк сразу

Выбирайте mysqli_fetch_assoc(), когда нужен читаемый, самодокументируемый код, обращающийся к столбцам по имени, и вы обрабатываете строки по одной.

Заключение

mysqli_fetch_assoc() — основная функция для чтения результирующего набора MySQLi в виде ассоциативных array с ключами по именам столбцов. Используйте её вместе с циклом while и быстрой проверкой успешности запроса — и вы сможете безопасно перебирать результирующие наборы. Дополнительную информацию см. в разделах PHP MySQLi, ассоциативные массивы и цикл while.

Практика

Практика
Что делает функция fetch_assoc() в PHP?
Что делает функция fetch_assoc() в PHP?
Was this page helpful?