fetch_field
Функция mysqli_fetch_field() в PHP: получение метаданных столбца из результирующего набора, свойства объекта поля и примеры использования.
Функция mysqli_fetch_field() возвращает метаданные о столбце — не данные, хранящиеся в нём. При каждом вызове вы получаете object, описывающий следующий столбец в результирующем наборе: его имя, тип данных, длину, таблицу, из которой он получен, и различные флаги. На этой странице объясняется, когда это полезно, как ведёт себя функция, что означает каждое свойство и как использовать её как в объектно-ориентированном, так и в процедурном стиле.
Что делает mysqli_fetch_field()
mysqli_fetch_field() перебирает столбцы результирующего набора по одному, наподобие курсора. Результирующий набор хранит внутренний указатель поля; каждый успешный вызов сдвигает его на одну позицию. Когда последний столбец пройден, следующий вызов возвращает false, что делает функцию удобной для управления циклом while.
Функция возвращает метаданные, поэтому для её работы не нужны реальные строки — запрос, не совпавший ни с одной строкой, всё равно описывает свои столбцы. Именно в этом её ценность: можно изучить структуру результата до его обработки.
Синтаксис (оба варианта эквивалентны):
// Object-oriented style
$fieldInfo = $result->fetch_field();
// Procedural style
$fieldInfo = mysqli_fetch_field($result);Функция принимает результирующий набор в качестве единственного аргумента и возвращает object при успехе или false, когда полей больше нет.
Чтение метаданных столбца
Пример ниже устанавливает соединение, выполняет запрос SELECT и перебирает столбцы результата. На каждой итерации выводятся имя, код типа и максимальная длина столбца.
Как использовать функцию mysqli_fetch_field()?
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$query = "SELECT * FROM my_table";
$result = $mysqli->query($query);
if ($result) {
while ($field = $result->fetch_field()) {
printf("Name: %s\n", $field->name);
printf("Type: %s\n", $field->type);
printf("Length: %d\n", $field->length);
}
} else {
echo "Query failed: " . $mysqli->error;
}
$result->free();
$mysqli->close();
?>Цикл while ($field = $result->fetch_field()) завершается естественным образом, когда fetch_field() возвращает false после последнего столбца. Поскольку указатель поля продвигается при каждом вызове, первая итерация описывает первый столбец, вторая — второй и так далее.
Объект поля и его свойства
Каждый вызов возвращает object, похожий на stdClass. Наиболее часто используемые свойства:
| Свойство | Значение |
|---|---|
name | Имя столбца в том виде, в котором оно возвращается запросом (псевдоним, если задан) |
orgname | Оригинальное имя столбца до применения псевдонима |
table | Таблица, которой принадлежит столбец (псевдоним, если задан) |
orgtable | Оригинальное имя таблицы |
type | Тип данных в виде целочисленной константы (см. ниже) |
length | Объявленная ширина столбца |
max_length | Максимальная ширина реальных значений (обычно 0, если буферизация не применялась) |
flags | Битовая маска флагов столбца (NOT_NULL, PRI_KEY, …) |
decimals | Количество десятичных знаков для числовых полей |
Свойство type является целым числом, а не читаемой строкой. PHP предоставляет константы, такие как MYSQLI_TYPE_VARCHAR, MYSQLI_TYPE_LONG (целочисленный столбец) и MYSQLI_TYPE_DATETIME, с которыми можно сравнивать:
if ($field->type === MYSQLI_TYPE_LONG) {
echo "{$field->name} is an integer column\n";
}Обращение к конкретному столбцу
fetch_field() работает последовательно, поэтому для проверки, например, только третьего столбца придётся либо перебирать столбцы в цикле, пока не достигнете нужного, либо сначала переместить указатель. Указатель поля можно переместить с помощью field_seek(), а один столбец можно получить напрямую по индексу с помощью fetch_field_direct():
// Jump to column index 2 (the third column), then read it
$result->field_seek(2);
$field = $result->fetch_field();
echo $field->name;Когда использовать (и альтернативы)
Используйте fetch_field(), когда нужно перебрать столбцы и реагировать на каждый из них — например, для автоматической генерации заголовка таблицы, построения формы или выбора формата значения в зависимости от типа.
- Если метаданные всех столбцов нужны сразу,
fetch_fields()возвращает их все в виде array за один вызов, что обычно чище, чем цикл. - Если нужно лишь узнать количество столбцов, используйте
field_count. - Для чтения фактических данных строк, а не метаданных столбцов, применяйте
fetch_assoc()илиfetch_array().
Заключение
mysqli_fetch_field() предоставляет пошаговое представление структуры результирующего набора: имена, типы, длины и флаги, продвигаясь по столбцам по одному вызову за раз. Используйте её в цикле для изучения структуры запроса перед обработкой строк, сочетайте с field_seek() для перехода к нужному столбцу или переключайтесь на fetch_fields(), когда нужны все метаданные сразу.