PHP Conference Nagoya 2025

mysqli_result::fetch_field

mysqli_fetch_field

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_field -- mysqli_fetch_fieldLiefert die Metadaten der nächsten Spalte einer Ergebnismenge

Beschreibung

Objektorientierter Stil

public mysqli_result::fetch_field(): object|false

Prozeduraler Stil

mysqli_fetch_field(mysqli_result $result): object|false

Gibt die Definition einer Spalte aus einer Ergebnismenge als Objekt zurück. Um Informationen über alle Spalten in der Ergebnismenge abzurufen, muss diese Funktion mehrmals aufgerufen werden.

Parameter-Liste

result

Nur bei prozeduralem Aufruf: Ein von mysqli_query(), mysqli_store_result(), mysqli_use_result() oder mysqli_stmt_get_result() zurückgegebenes mysqli_result-Objekt.

Rückgabewerte

Gibt ein Objekt zurück, das die Informationen über die Definition einer Spalte enthält, oder false, wenn keine Spalteninformationen verfügbar sind.

Eigenschaften des Objekts
Eigenschaft Beschreibung
name Der Name der Spalte
orgname Der ursprüngliche Name der Spalte, falls ein Alias angegeben wurde
table Der Name der Tabelle, zu der diese Spalte gehört (falls nicht berechnet)
orgtable Der ursprüngliche Name der Tabelle, falls ein Alias angegeben wurde
def Nicht verwendet; immer eine leere Zeichenkette
db Der Name der Datenbank
catalog Nicht verwendet; immer "def"
max_length Die maximale Breite der Spalte für die Ergebnismenge. Seit PHP 8.1 ist dieser Wert immer 0.
length Die Breite der Spalte in Bytes. Bei Zeichenkettenspalten hängt der Längenwert vom Zeichensatz der Verbindung ab. Ist der Zeichensatz z. B. ein Ein-Byte-Zeichensatz wie latin1, beträgt der Längenwert für eine SELECT 'abc'-Abfrage 3. Ist der Zeichensatz ein Multibyte-Zeichensatz wie utf8mb4, bei dem die Zeichen bis zu 4 Bytes umfassen, beträgt der Längenwert 12.
charsetnr Die Nummer des Zeichensatzes der Spalte
flags Ein Integer, der die Bit-Flags der Spalte darstellt
type Der für diese Spalte verwendete Datentyp
decimals Bei numerischen Spalten die Anzahl der Dezimalstellen, bei Zeitspalten die Genauigkeit der Sekundenbruchteile.

Beispiele

Beispiel #1 Objektorientierter Stil

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* Verbindung überprüfen */
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

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

/* Informationen über alle Spalten abrufen */
while ($finfo = $result->fetch_field()) {

printf("Name: %s\n", $finfo->name);
printf("Tabelle: %s\n", $finfo->table);
printf("max. Länge: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Typ: %d\n\n", $finfo->type);
}
$result->close();
}

/* Verbindung schließen */
$mysqli->close();
?>

Beispiel #2 Prozeduraler Stil

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* Verbindung überprüfen */
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

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

/* Informationen über alle Spalten abrufen */
while ($finfo = mysqli_fetch_field($result)) {

printf("Name: %s\n", $finfo->name);
printf("Tabelle: %s\n", $finfo->table);
printf("max. Länge: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Typ: %d\n\n", $finfo->type);
}
mysqli_free_result($result);
}

/* Verbindung schließen */
mysqli_close($link);
?>

Die obigen Bespiele erzeugen folgende Ausgabe:

Name:       Name
Tabelle:    Country
max. Länge: 11
Flags:      1
Typ:        254

Name:       SurfaceArea
Tabelle:    Country
max. Länge: 10
Flags:      32769
Typ:        4

Siehe auch

add a note

User Contributed Notes 8 notes

up
52
iansoko at hotmail dot com
13 years ago
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
up
15
ragtag at hotmail dot com
16 years ago
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';
}
?>
up
3
andre at koethur dot de
10 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
1
sofe2038 at gmail dot com
6 years ago
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
up
1
rvila at revolutionvisualarts dot com
8 years ago
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 http://php.net/manual/en/mysqli.field-count.php the values should be:

CHAR = 254
TINYINT = 1

But predefined function attributes the value 254 to MYSQLI_TYPE_STRING.

Just for FYI
up
2
miqrogroove at gmail dot com
11 years ago
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.
up
0
nick
7 years ago
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.
up
2
Anonymous
12 years ago
The constants for the TYPE number returned by fetch_field are enumerated here (MYSQLI_TYPE_*):
http://php.net/manual/en/mysqli.constants.php
To Top