mysqli_result::fetch_fields

mysqli_fetch_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_fields -- mysqli_fetch_fieldsLiefert ein Array von Objekten, die die Spalten einer Ergebnismenge darstellen

Beschreibung

Objektorientierter Stil

public mysqli_result::fetch_fields(): array

Prozeduraler Stil

mysqli_fetch_fields(mysqli_result $result): array

Diese Funktion erfüllt den gleichen Zweck wie die Funktion mysqli_fetch_field(), mit dem einzigen Unterschied, dass die Spalten als Array von Objekten zurückgegeben werden, anstatt für jede Spalte ein einzelnes Objekt zurückzugeben.

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 Array von Objekten zurück, die die Informationen über die Definition der Spalten enthalten.

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("127.0.0.1", "root", "foofoo", "sakila");

/* Verbindung überprüfen */
if ($mysqli->connect_errno) {
printf("Verbindung fehlgeschlagen: %s\n", $mysqli->connect_error);
exit();
}

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

// Zeichensatz ändern, um dessen Auswirkung auf einige Werte
// (z. B. die Länge in Bytes) zu zeigen
$mysqli->set_charset($charset);

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

echo
"======================\n";
echo
"Zeichensatz: $charset\n";
echo
"======================\n";

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

/* Informationen über alle Spalten abrufen */
$finfo = $result->fetch_fields();

foreach (
$finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Tabelle: %s\n", $val->table);
printf("max. Länge: %d\n", $val->max_length);
printf("Länge: %d\n", $val->length);
printf("Zeichensatz-Nr.: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Typ: %d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>

Beispiel #2 Prozeduraler Stil

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

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

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

// Zeichensatz ändern, um dessen Auswirkung auf einige Werte
// (z. B. die Länge in Bytes) zu zeigen
mysqli_set_charset($link, $charset);

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

echo
"======================\n";
echo
"Zeichensatz: $charset\n";
echo
"======================\n";

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

/* Informationen über alle Spalten abrufen */
$finfo = mysqli_fetch_fields($result);

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

mysqli_close($link);
?>

Die obigen Bespiele erzeugen folgende Ausgabe:

======================
Zeichensatz: latin1
======================
Name:            actor_id
Tabelle:         actor
max. Länge:      3
Länge:           5
Zeichensatz-Nr.: 63
Flags:           49699
Typ:             2

Name:            last_name
Tabelle:         actor
max. Länge:      12
Länge:           45
Zeichensatz-Nr.: 8
Flags:           20489
Typ:             253

======================
Zeichensatz: utf8
======================
Name:            actor_id
Tabelle:         actor
max. Länge:      3
Länge:           5
Zeichensatz-Nr.: 63
Flags:           49699
Typ:             2

Name:            last_name
Tabelle:         actor
max. Länge:      12
Länge:           135
Zeichensatz-Nr.: 33
Flags:           20489

Siehe auch

add a note

User Contributed Notes 6 notes

up
16
AndrewRoz
14 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
6
andre at koethur dot de
11 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.<?phppublic 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
mccharles dot craven at dot dot gov
8 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
3
educarme at adinet dot com dot uy
11 years ago
Codigos de tipos de datos devueltos por fetch_fields()Nombre        Codigotinyint_    1boolean_    1smallint_    2int_        3float_        4double_        5real_        5timestamp_    7bigint_        8serial        8mediumint_    9date_        10time_        11datetime_    12year_        13bit_        16decimal_    246text_        252tinytext_    252mediumtext_    252longtext_    252tinyblob_    252mediumblob_    252blob_        252longblob_    252varchar_    253varbinary_    253char_        254binary_        254
up
-1
cz dot paranoiq at gmail dot com
10 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
7 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