mysqli_result::fetch_field
mysqli_fetch_field
(PHP 5)
mysqli_result::fetch_field -- mysqli_fetch_field — Возвращает следующее поле результирующего набора
Описание
Объектно-ориентированный стиль
Процедурный стиль
Возвращает информацию об одном столбце результирующего набора в виде объекта. Чтобы получить определения всех столбцов, просто запустите эту функцию многократно.
Список параметров
-
result
-
Только для процедурного стиля: Идентификатор результата запроса, полученный с помощью mysqli_query(), mysqli_store_result() или mysqli_use_result().
Возвращаемые значения
Возвращает объект содержащий определение поля или FALSE
, если столбцы
в результирующей таблице закончились.
Свойство | Описание |
---|---|
name | Имя столбца |
orgname | Исходное имя столбца, если у него есть псевдоним |
table | Имя таблицы, которой принадлежит столбец (если не вычислено) |
orgtable | Исходное имя таблицы, если есть псевдоним |
def | Зарезервировано для значения по умолчанию, на данный момент всегда "" |
db | База данных (с PHP 5.3.6) |
catalog | Имя каталога, всегда "def" (с PHP 5.3.6) |
max_length | Максимальная ширина поля результирующего набора. |
length | Ширина поля, как она задана при определении таблицы. |
charsetnr | Количество наборов символов для поля. |
flags | Целое число, представляющее битовые флаги для поля. |
type | Тип данных поля |
decimals | Число знаков после запятой (для целочисленных полей) |
Примеры
Пример #1 Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = $mysqli->query($query)) {
/* Получим информацию обо всех столбцах */
while ($finfo = $result->fetch_field()) {
printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);
}
$result->close();
}
/* закрываем подключение */
$mysqli->close();
?>
Пример #2 Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query)) {
/* Получим информацию обо всех столбцах */
while ($finfo = mysqli_fetch_field($result)) {
printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type); }
mysqli_free_result($result);
}
/* закрываем подключение */
mysqli_close($link);
?>
Результат выполнения данных примеров:
Имя: Name Таблица: Country макс. длина: 11 Флаги: 1 Тип: 254 Имя: SurfaceArea Таблица: Country макс. длина: 10 Флаги: 32769 Тип: 4
Смотрите также
- mysqli_num_fields() - Получение количества полей в результирующем наборе
- mysqli_fetch_field_direct() - Получение метаданных конкретного поля
- mysqli_fetch_fields() - Возвращает массив объектов, представляющих поля результирующего набора
- mysqli_field_seek() - Установить указатель поля на определенное смещение
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- MySQL Drivers and Plugins
- Улучшенный модуль MySQL
- Функция mysqli_result::$current_field() - Получает смещение указателя по отношению к текущему полю
- Функция mysqli_result::data_seek() - Перемещает указатель результата на выбранную строку
- mysqli_result::fetch_all
- mysqli_result::fetch_array
- Функция mysqli_result::fetch_assoc() - Извлекает результирующий ряд в виде ассоциативного массива
- Функция mysqli_result::fetch_field_direct() - Получение метаданных конкретного поля
- Функция mysqli_result::fetch_field() - Возвращает следующее поле результирующего набора
- Функция mysqli_result::fetch_fields() - Возвращает массив объектов, представляющих поля результирующего набора
- Функция mysqli_result::fetch_object() - Возвращает текущую строку результирующего набора в виде объекта
- Функция mysqli_result::fetch_row() - Получение строки результирующей таблицы в виде массива
- Функция mysqli_result::$field_count() - Получение количества полей в результирующем наборе
- Функция mysqli_result::field_seek() - Установить указатель поля на определенное смещение
- Функция mysqli_result::free() - Освобождает память занятую результатами запроса
- Функция mysqli_result::$lengths() - Возвращает длины полей текущей строки результирующего набора
- Функция mysqli_result::$num_rows() - Получает число рядов в результирующей выборке
Коментарии
The flags used by MySql are:
NOT_NULL_FLAG = 1
PRI_KEY_FLAG = 2
UNIQUE_KEY_FLAG = 4
BLOB_FLAG = 16
UNSIGNED_FLAG = 32
ZEROFILL_FLAG = 64
BINARY_FLAG = 128
ENUM_FLAG = 256
AUTO_INCREMENT_FLAG = 512
TIMESTAMP_FLAG = 1024
SET_FLAG = 2048
NUM_FLAG = 32768
PART_KEY_FLAG = 16384
GROUP_FLAG = 32768
UNIQUE_FLAG = 65536
To test if a flag is set you can use & like so:
<?php
$meta = $mysqli_result_object->fetch_field();
if ($meta->flags & 4) {
echo 'Unique key flag is set';
}
?>
here are the data types that correspond to the TYPE number returned by fetch_field.
thought i would post this here since i couldn't find the info elsewhere.
numerics
-------------
BIT: 16
TINYINT: 1
BOOL: 1
SMALLINT: 2
MEDIUMINT: 9
INTEGER: 3
BIGINT: 8
SERIAL: 8
FLOAT: 4
DOUBLE: 5
DECIMAL: 246
NUMERIC: 246
FIXED: 246
dates
------------
DATE: 10
DATETIME: 12
TIMESTAMP: 7
TIME: 11
YEAR: 13
strings & binary
------------
CHAR: 254
VARCHAR: 253
ENUM: 254
SET: 254
BINARY: 254
VARBINARY: 253
TINYBLOB: 252
BLOB: 252
MEDIUMBLOB: 252
TINYTEXT: 252
TEXT: 252
MEDIUMTEXT: 252
LONGTEXT: 252
The constants for the TYPE number returned by fetch_field are enumerated here (MYSQLI_TYPE_*):
mysqli.constants
Beware the values of the predefined constants. They do not always correlate with the actual field types. For example:
MYSQLI_TYPE_BLOB: 252
MYSQLI_TYPE_TINY_BLOB: 249
MYSQLI_TYPE_MEDIUM_BLOB: 250
MYSQLI_TYPE_LONG_BLOB: 251
MySQLi will indeed return a value of 252 for a tinytext field, but as you can see, this does not correspond to the value of MYSQLI_TYPE_TINY_BLOB.
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.
<?php
public static function h_type2txt($type_id)
{
static $types;
if (!isset($types))
{
$types = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
}
return array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}
public static function h_flags2txt($flags_num)
{
static $flags;
if (!isset($flags))
{
$flags = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
}
$result = array();
foreach ($flags as $n => $t) if ($flags_num & $n) $result[] = $t;
return implode(' ', $result);
}
?>
The predefined constant values returned by the function get_predefined_constants() for:
MYSQLI_TYPE_CHAR = 1
MYSQLI _TYPE_TINYINT = 1
If the code is used to categorized the type of field use this values will of course create confusion. For example:
if($fieldtype === "CHAR"){
$field_html_attribute = "text";
$field_html_length = 1;
} elseif($fieldtype === "TINYINT") {
$field_html_attribute = "number";
$field_html_length = 1;
}
If an array is created to set the key as the numeric value and the value of that key as the the text title, TINYINT will be replaced by CHAR value. But is this process is reversed, then the code will select TINYINT if the foreach statement set to break when the numeric value of the flag equals the value of the current key as the first intance.
Base in the note added by Johnathan at mysqli.field-count the values should be:
CHAR = 254
TINYINT = 1
But predefined function attributes the value 254 to MYSQLI_TYPE_STRING.
Just for FYI
It is not possible to get the values for an enum or set field through fetch_fields(). As far as I can tell this is because it hasn't been implemented in the mysqlnd api but whatever the reason it is not possible and you must issue a query like SHOW COLUMNS directly and interrogate the result to determine them.
Incidentally you need to check the enum_flag rather than look for the enum_type to determine whether a field is enum or not. The type returned is usually some kind of string.
The constants in a few other comments above appear to be inaccurate. Here are some more official references that seem quite hard to search.
The "type" attribute: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-type
The "flags" attribute: https://github.com/google/mysql/blob/master/include/mysql_com.h#L133
In addition, all attributes are explained on the COM_QUERY_RESPONSE page too: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition