W3docs

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(), когда нужны все метаданные сразу.

Практика

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