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.