Signatur
Beschreibung
mysqli_stmt_result_metadata() gibt ein mysqli_result-Objekt zurück, das ausschließlich strukturelle Informationen über die Spalten der Ergebnismenge enthält – also Spaltennamen, Typen, Flags usw. –, aber keine Datensätze. Dies ist nützlich, wenn man vor dem eigentlichen Datenabruf wissen möchte, welche Spalten ein vorbereitetes SELECT-Statement zurückliefert.
Typische Anwendungsfälle sind das dynamische Binden von Ergebnisvariablen über mysqli_stmt_bind_result() oder das Aufbauen generischer Datenbankschichten, die Spaltennamen und -typen zur Laufzeit ermitteln müssen.
Das zurückgegebene mysqli_result-Objekt enthält keine Zeilen; ein Aufruf von mysqli_fetch_row() o. Ä. darauf liefert keine Nutzdaten. Die Metadaten können jedoch über Funktionen wie mysqli_fetch_field(), mysqli_fetch_fields() oder mysqli_num_fields() ausgelesen werden. Nach Verwendung sollte das Objekt mit mysqli_free_result() freigegeben werden.
Die Funktion gibt false zurück, wenn die vorbereitete Anweisung kein Ergebnisset produziert (z. B. bei INSERT, UPDATE oder DELETE).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein gültiges, bereits vorbereitetes mysqli_stmt-Objekt, das aus einem SELECT-Statement entstanden ist. |
Rückgabewert
mysqli_result-Objekt mit den Spalten-Metadaten zurück oder false, wenn die vorbereitete Anweisung kein Ergebnisset liefert (z. B. bei DML-Anweisungen) oder ein Fehler aufgetreten ist.Beispiele
Spaltennamen eines vorbereiteten SELECT-Statements auslesen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE active = ?');
$active = 1;
$stmt->bind_param('i', $active);
$stmt->execute();
// Metadaten abrufen, OHNE Datensätze zu holen
$meta = mysqli_stmt_result_metadata($stmt);
if ($meta === false) {
die('Keine Metadaten verfügbar.');
}
// Alle Felder (Spalten) auslesen
while ($field = $meta->fetch_field()) {
echo 'Spalte: ' . $field->name . ' (Typ: ' . $field->type . ')' . PHP_EOL;
}
$meta->free();
$stmt->close();
$mysqli->close();
?>
Dynamisches Binden von Ergebnisvariablen anhand der Metadaten
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('SELECT id, name, email FROM users LIMIT 5');
$stmt->execute();
$meta = mysqli_stmt_result_metadata($stmt);
$fields = $meta->fetch_fields();
$meta->free();
// Variablen dynamisch erzeugen und binden
$row = [];
$bindArgs = [$stmt];
foreach ($fields as $field) {
$row[$field->name] = null;
$bindArgs[] = &$row[$field->name];
}
call_user_func_array('mysqli_stmt_bind_result', $bindArgs);
// Ergebnisse holen und ausgeben
while ($stmt->fetch()) {
foreach ($row as $colName => $value) {
echo $colName . ': ' . $value . ' ';
}
echo PHP_EOL;
}
$stmt->close();
$mysqli->close();
?>
// Wichtig · Fallstricke
Nur für SELECT-Statements: Bei Anweisungen ohne Ergebnismenge (INSERT, UPDATE, DELETE, CALL ohne Resultset) gibt die Funktion false zurück. Prüfe daher immer den Rückgabewert.
Speicherverwaltung: Das zurückgegebene mysqli_result-Objekt belegt Ressourcen. Rufe nach Verwendung unbedingt mysqli_free_result() bzw. $meta->free() auf, um Speicher freizugeben.
Zeitpunkt des Aufrufs: Die Metadaten sind erst nach dem Aufruf von mysqli_stmt_execute() vollständig verfügbar. Ein Aufruf vor execute() kann unvollständige oder falsche Informationen liefern.
Bei Verwendung der objektorientierten Schnittstelle steht die äquivalente Eigenschaft $stmt->result_metadata() zur Verfügung.