fetch_field
Erfahren Sie, wie mysqli_fetch_field() in PHP Metadaten zu einzelnen Spalten eines Ergebnissatzes liefert und wie Sie es effektiv einsetzen.
Die Funktion mysqli_fetch_field() gibt Metadaten zu einer Spalte zurück — nicht die darin enthaltenen Daten. Bei jedem Aufruf erhalten Sie ein object, das die nächste Spalte im Ergebnissatz beschreibt: ihren Namen, den Datentyp, die Länge, die Tabelle, aus der sie stammt, und verschiedene Flags. Diese Seite erklärt, wann das nützlich ist, wie sich die Funktion verhält, was jede Eigenschaft bedeutet und wie sie sowohl im objektorientierten als auch im prozeduralen Stil gelesen wird.
Was mysqli_fetch_field() tut
mysqli_fetch_field() durchläuft die Spalten eines Ergebnissatzes nacheinander wie ein Cursor. Der Ergebnissatz verwaltet intern einen Feldzeiger; jeder erfolgreiche Aufruf rückt ihn um eins vor. Wenn Sie die letzte Spalte erreicht haben, gibt der nächste Aufruf false zurück, was es praktisch macht, eine while-Schleife damit zu steuern.
Die Funktion liefert Metadaten, sodass Sie keine tatsächlichen Zeilen benötigen — eine Abfrage, die null Zeilen liefert, beschreibt dennoch ihre Spalten. Genau das macht sie nützlich: Sie können die Struktur eines Ergebnisses untersuchen, bevor Sie es verarbeiten.
Syntax (beide Varianten sind gleichwertig):
// Object-oriented style
$fieldInfo = $result->fetch_field();
// Procedural style
$fieldInfo = mysqli_fetch_field($result);Die Funktion nimmt den Ergebnissatz als einzige Eingabe entgegen und gibt bei Erfolg ein object zurück oder false, wenn keine weiteren Felder vorhanden sind.
Spalten-Metadaten auslesen
Das folgende Beispiel stellt eine Verbindung her, führt ein SELECT aus und iteriert über die Spalten des Ergebnisses. Jede Iteration gibt den Namen, den Typcode und die maximale Länge der Spalte aus.
Wie verwendet man die Funktion 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();
?>Die Schleife while ($field = $result->fetch_field()) endet automatisch, wenn fetch_field() nach der letzten Spalte false zurückgibt. Da der Feldzeiger bei jedem Aufruf weiterrückt, beschreibt die erste Iteration die erste Spalte, die zweite Iteration die zweite Spalte und so weiter.
Das Feldobjekt und seine Eigenschaften
Jeder Aufruf gibt ein stdClass-ähnliches object zurück. Die am häufigsten verwendeten Eigenschaften sind:
| Eigenschaft | Bedeutung |
|---|---|
name | Der Spaltenname wie von der Abfrage zurückgegeben (ein Alias, falls verwendet) |
orgname | Der ursprüngliche Spaltenname vor dem Aliasing |
table | Die Tabelle, zu der die Spalte gehört (ein Alias, falls verwendet) |
orgtable | Der ursprüngliche Tabellenname |
type | Der Datentyp als ganzzahlige Konstante (siehe unten) |
length | Die deklarierte Breite der Spalte |
max_length | Die maximale Breite der tatsächlichen Werte (oft 0, sofern nicht gepuffert) |
flags | Eine Bitmaske mit Spalten-Flags (NOT_NULL, PRI_KEY, …) |
decimals | Anzahl der Dezimalstellen bei numerischen Feldern |
Die Eigenschaft type ist eine ganze Zahl, kein lesbarer string. PHP stellt Konstanten wie MYSQLI_TYPE_VARCHAR, MYSQLI_TYPE_LONG (eine Integer-Spalte) und MYSQLI_TYPE_DATETIME bereit, gegen die Sie vergleichen können:
if ($field->type === MYSQLI_TYPE_LONG) {
echo "{$field->name} is an integer column\n";
}Eine bestimmte Spalte gezielt ansprechen
fetch_field() arbeitet sequenziell. Wenn Sie beispielsweise nur die dritte Spalte untersuchen möchten, können Sie entweder so lange schleifen, bis Sie dort ankommen, oder den Zeiger vorab positionieren. Der Feldzeiger lässt sich mit field_seek() neu positionieren, und eine einzelne Spalte kann direkt per Index mit fetch_field_direct() abgerufen werden:
// Jump to column index 2 (the third column), then read it
$result->field_seek(2);
$field = $result->fetch_field();
echo $field->name;Wann es verwenden (und die Alternativen)
Greifen Sie auf fetch_field() zurück, wenn Sie über Spalten iterieren und auf jede einzeln reagieren möchten — zum Beispiel um automatisch einen Tabellenkopf zu erzeugen, ein Formular aufzubauen oder die Formatierung jedes Werts anhand seines Typs festzulegen.
- Wenn Sie die Metadaten aller Spalten auf einmal benötigen, gibt
fetch_fields()sie alle als array in einem einzigen Aufruf zurück, was in der Regel übersichtlicher ist als eine Schleife. - Wenn Sie nur wissen müssen, wie viele Spalten vorhanden sind, verwenden Sie
field_count. - Um die eigentlichen Zeilendaten statt der Spalten-Metadaten zu lesen, verwenden Sie
fetch_assoc()oderfetch_array().
Fazit
mysqli_fetch_field() bietet Ihnen einen spaltenweisen Überblick über die Struktur eines Ergebnissatzes: Namen, Typen, Längen und Flags, wobei die Funktion bei jedem Aufruf eine Spalte weiter vorschreitet. Verwenden Sie sie in einer Schleife, um eine Abfrage zu untersuchen, bevor Sie deren Zeilen verarbeiten, kombinieren Sie sie mit field_seek(), um eine bestimmte Spalte anzusteuern, oder wechseln Sie zu fetch_fields(), wenn Sie alle Metadaten auf einmal benötigen.