Start · Sprachen · PHP · Referenz · mysqli_stmt_result_metadata

mysqli_stmt_result_metadata

Funktion

Liefert ein <code>mysqli_result</code>-Objekt mit den Metadaten (Spalteninformationen) der Ergebnismenge einer vorbereiteten Anweisung, ohne die eigentlichen Datenzeilen abzurufen.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_result_metadata(mysqli_stmt $statement): mysqli_result|false

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

Typ
mysqli_result|false
Beschreibung
Gibt ein 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();
?>
Spalte: id (Typ: 3) Spalte: name (Typ: 253) Spalte: email (Typ: 253)

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();
?>
id: 1 name: Alice email: alice@example.com id: 2 name: Bob email: bob@example.com

// 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.