PHP 8.1.28 Released!

mysqli_result::fetch_fields

mysqli_fetch_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_fields -- mysqli_fetch_fieldsВозвращает массив объектов, представляющих поля результирующего набора

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_fields(): array

Процедурный стиль

mysqli_fetch_fields(mysqli_result $result): array

Эта функция служит для тех же целей, что и mysqli_fetch_field(), с той лишь разницей, что возвращает не один объект для столбца, а массив таких объектов.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает массив объектов, содержащих метаданные полей.

Свойства объекта
Свойство Описание
name Имя столбца
orgname Исходное имя столбца, если у него есть псевдоним
table Имя таблицы, которой принадлежит столбец (если не вычислено)
orgtable Исходное имя таблицы, если есть псевдоним
max_length Максимальная ширина поля результирующего набора. Начиная с PHP 8.1, это значение всегда 0.
length Длина поля в байтах, как она задана при определении таблицы. Обратите внимание, что данная величина (в байтах) может отличаться от величины в символах, указанной в определении поля таблицы, так как в разных кодировках один символ может записываться несколькими байтами. Например, набор символов utf8 имеет 3 байта на символ, таким образом поле VARCHAR(10) в кодировке UTF-8 вернёт длину 30 байтов = 10 символов * 3 байта на символ, а для кодировки LATIN1 - длину 10, так как в этой кодировке один символ занимает один байт.
charsetnr Числовой идентификатор кодировки.
flags Целое число, представляющее битовые флаги для поля.
type Тип данных поля
decimals Число знаков после запятой (для целочисленных полей)

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli
= new mysqli("127.0.0.1", "root", "foofoo", "sakila");

/* Проверяем соединение */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

foreach (array(
'latin1', 'utf8') as $charset) {

// Устанавливаем кодировку для демонстрации её влияния на некоторые
$mysqli->set_charset($charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"======================\n";
echo
"Character Set: $charset\n";
echo
"======================\n";

if (
$result = $mysqli->query($query)) {

/* Читаем информацию по всем столбцам */
$finfo = $result->fetch_fields();

foreach (
$finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link
= mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");

/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

foreach (array(
'latin1', 'utf8') as $charset) {

// Устанавливаем кодировку для демонстрации её влияния на некоторые
mysqli_set_charset($link, $charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"======================\n";
echo
"Character Set: $charset\n";
echo
"======================\n";

if (
$result = mysqli_query($link, $query)) {

/* Читаем информацию по всем столбцам */
$finfo = mysqli_fetch_fields($result);

foreach (
$finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %d\n\n", $val->type);
}
mysqli_free_result($result);
}
}

mysqli_close($link);
?>

Результат выполнения приведённых примеров:

======================
Character Set: latin1
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    45
charsetnr: 8
Flags:     20489
Type:      253

======================
Character Set: utf8
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    135
charsetnr: 33
Flags:     20489

Смотрите также

add a note

User Contributed Notes 6 notes

up
17
AndrewRoz
13 years ago
The field info bit-flags used by MySql are:
(Thanks to ragtag at hotmail dot com)
<?php
/*
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:

$meta = $mysqli_result_object->fetch_field();
if (
$meta->flags & 4) {
echo
'Unique key flag is set';
}
?>
up
5
mccharles dot craven at dot dot gov
7 years ago
Those wanting to map the 'type' field in this function for use in mysqli_stmt_bind_param or to cannibalize it for their own mapping may find this function useful.

function map_field_type_to_bind_type($field_type)
{
switch ($field_type)
{
case MYSQLI_TYPE_DECIMAL:
case MYSQLI_TYPE_NEWDECIMAL:
case MYSQLI_TYPE_FLOAT:
case MYSQLI_TYPE_DOUBLE:
return 'd';

case MYSQLI_TYPE_BIT:
case MYSQLI_TYPE_TINY:
case MYSQLI_TYPE_SHORT:
case MYSQLI_TYPE_LONG:
case MYSQLI_TYPE_LONGLONG:
case MYSQLI_TYPE_INT24:
case MYSQLI_TYPE_YEAR:
case MYSQLI_TYPE_ENUM:
return 'i';

case MYSQLI_TYPE_TIMESTAMP:
case MYSQLI_TYPE_DATE:
case MYSQLI_TYPE_TIME:
case MYSQLI_TYPE_DATETIME:
case MYSQLI_TYPE_NEWDATE:
case MYSQLI_TYPE_INTERVAL:
case MYSQLI_TYPE_SET:
case MYSQLI_TYPE_VAR_STRING:
case MYSQLI_TYPE_STRING:
case MYSQLI_TYPE_CHAR:
case MYSQLI_TYPE_GEOMETRY:
return 's';

case MYSQLI_TYPE_TINY_BLOB:
case MYSQLI_TYPE_MEDIUM_BLOB:
case MYSQLI_TYPE_LONG_BLOB:
case MYSQLI_TYPE_BLOB:
return 'b';

default:
trigger_error("unknown type: $field_type");
return 's';
}
}
up
5
andre at koethur dot de
9 years ago
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);
}

?>
up
4
educarme at adinet dot com dot uy
10 years ago
Codigos de tipos de datos devueltos por fetch_fields()

Nombre Codigo
tinyint_ 1
boolean_ 1
smallint_ 2
int_ 3
float_ 4
double_ 5
real_ 5
timestamp_ 7
bigint_ 8
serial 8
mediumint_ 9
date_ 10
time_ 11
datetime_ 12
year_ 13
bit_ 16
decimal_ 246
text_ 252
tinytext_ 252
mediumtext_ 252
longtext_ 252
tinyblob_ 252
mediumblob_ 252
blob_ 252
longblob_ 252
varchar_ 253
varbinary_ 253
char_ 254
binary_ 254
up
0
cz dot paranoiq at gmail dot com
9 years ago
complete list of flags from MySQL source code:

NOT_NULL_FLAG 1 /* Field can't be NULL */
PRI_KEY_FLAG 2 /* Field is part of a primary key */
UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */
MULTIPLE_KEY_FLAG 8 /* Field is part of a key */
BLOB_FLAG 16 /* Field is a blob */
UNSIGNED_FLAG 32 /* Field is unsigned */
ZEROFILL_FLAG 64 /* Field is zerofill */
BINARY_FLAG 128 /* Field is binary */
ENUM_FLAG 256 /* field is an enum */
AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */
TIMESTAMP_FLAG 1024 /* Field is a timestamp */
SET_FLAG 2048 /* field is a set */
NO_DEFAULT_VALUE_FLAG 4096 /* Field doesn't have default value */
ON_UPDATE_NOW_FLAG 8192 /* Field is set to NOW on UPDATE */
NUM_FLAG 32768 /* Field is num (for clients) */
PART_KEY_FLAG 16384 /* Intern; Part of some key */
GROUP_FLAG 32768 /* Intern: Group field */
UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */
BINCMP_FLAG 131072 /* Intern: Used by sql_yacc */
GET_FIXED_FIELDS_FLAG (1 << 18) /* Used to get fields in item tree */
FIELD_IN_PART_FUNC_FLAG (1 << 19)/* Field part of partition func */
up
-2
attand at gmail dot com
6 years ago
The nax_length gives counts in bytes. So if the text is utf-8, then we get incorrect result.

We have a code snippet where we check if the maximum length of the field and the max length of data stored becomes equal. This way we can check the potential truncation of data inserted
To Top