fetch_fields
Функция mysqli_fetch_fields() в PHP возвращает массив объектов с описанием столбцов результата MySQLi: имена, типы, длины и флаги.
Функция mysqli_fetch_fields() возвращает массив объектов, описывающих столбцы (поля) результирующего набора MySQLi — их имена, типы, длины, исходные таблицы и флаги. Она читает метаданные о столбцах, а не сами данные строк. На этой странице объясняется синтаксис, содержимое каждого объекта поля, когда стоит её использовать и типичные ловушки.
Синтаксис
mysqli_fetch_fields(mysqli_result $result): arrayВ объектно-ориентированном стиле тот же вызов выглядит как $result->fetch_fields().
$result— результирующий набор, возвращённый функциейmysqli_query(),mysqli_store_result()илиmysqli_use_result().- Возвращаемое значение — массив объектов
stdClass, по одному на каждый столбец, в порядке их следования в результате. Каждый объект содержит такие свойства, какname,orgname,table,orgtable,type,length,max_length,decimalsиflags.
Что содержит каждый объект поля
| Свойство | Описание |
|---|---|
name | Имя столбца (или его псевдоним, если использовался AS). |
orgname | Исходное имя столбца без учёта псевдонима. |
table | Имя таблицы (или её псевдоним). |
orgtable | Исходное имя таблицы. |
max_length | Ширина наибольшего значения в результате (заполняется только после mysqli_store_result()). |
length | Объявленная ширина столбца согласно схеме. |
type | Целочисленный код типа (см. константы MYSQLI_TYPE_*). |
decimals | Количество знаков после запятой для числовых полей. |
flags | Битовая маска флагов MYSQLI_*_FLAG, таких как NOT_NULL, PRI_KEY, AUTO_INCREMENT. |
Когда это использовать?
Обращайтесь к mysqli_fetch_fields(), когда нужно работать с результатом запроса обобщённо — не зная столбцов заранее. Типичные случаи:
- Построение административной таблицы данных, отображающей любой
SELECT *, с использованием имён столбцов в качестве заголовков. - Экспорт результатов в CSV со строкой заголовка.
- Проверка, является ли столбец первичным ключом или auto-increment, перед генерацией формы редактирования.
Если нужны только имена столбцов — это наиболее прямой способ их получить. Чтобы получать описание одного поля за раз, используйте mysqli_fetch_field(), а для подсчёта столбцов — mysqli_field_count().
Пример: вывод всех столбцов результирующего набора
<?php
$mysqli = mysqli_connect("localhost", "user", "password", "shop");
$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");
$fields = mysqli_fetch_fields($result);
foreach ($fields as $field) {
printf("Name: %s, Type: %d, Length: %d\n",
$field->name, $field->type, $field->length);
}
mysqli_free_result($result);
mysqli_close($mysqli);
?>Цикл foreach обходит массив объектов полей и выводит имя, код типа и объявленную длину каждого столбца. Для трёх выбранных столбцов вывод будет выглядеть так:
Name: id, Type: 3, Length: 11
Name: name, Type: 253, Length: 255
Name: price, Type: 246, Length: 10Числовые значения type берутся из констант MYSQLI_TYPE_* — например, 3 соответствует MYSQLI_TYPE_LONG (INT), а 253 — MYSQLI_TYPE_VAR_STRING (VARCHAR).
Формирование заголовка CSV из имён полей
Поскольку массив полей является обобщённым, можно сформировать строку заголовка для любого запроса без жёсткой фиксации имён столбцов:
<?php
$result = mysqli_query($mysqli, "SELECT * FROM products");
$header = array_map(
fn($field) => $field->name,
mysqli_fetch_fields($result)
);
echo implode(",", $header), "\n"; // id,name,pricearray_map() преобразует массив объектов полей в простой массив имён, а implode() соединяет их запятыми.
Типичные ловушки
mysqli_fetch_fields()работает только с метаданными. Она не перемещает курсор строк и не возвращает данные строк — сочетайте её сmysqli_fetch_assoc()илиmysqli_fetch_array()для чтения реальных строк.max_lengthравен0при небуферизованных результатах. Это свойство заполняется, только если весь результирующий набор буферизован на клиенте черезmysqli_store_result()(чтоmysqli_query()делает по умолчанию). При использованииmysqli_use_result()значение остаётся0.typeиflags— целые числа, а не строки. Сравнивайте их с константамиMYSQLI_TYPE_*иMYSQLI_*_FLAG, а не с магическими числами, чтобы код был понятен.- Всегда проверяйте, что
$resultявляется истинным значением перед вызовом функции — неудачный запрос возвращаетfalse, а передачаfalseвызывает ошибку.
Связанные функции
mysqli_fetch_field()— получить метаданные одного столбца за раз.mysqli_field_count()— подсчитать столбцы в результате.mysqli_field_seek()— переместить курсор поля на конкретный столбец.mysqli_fetch_assoc()— читать строки результата как ассоциативные массивы.