Signatur
Beschreibung
mysqli_result ist ein Objekt, das von Methoden wie mysqli::query(), mysqli::store_result() oder mysqli::use_result() zurückgegeben wird, sobald eine SELECT-, SHOW-, DESCRIBE- oder EXPLAIN-Abfrage ausgeführt wird. Es kapselt die zurückgelieferten Zeilen und Metadaten einer MySQL-Abfrage.
Die Klasse bietet verschiedene Methoden zum Abrufen von Datensätzen: fetch_assoc() liefert eine assoziative Array-Zeile, fetch_row() eine numerisch indizierte Zeile und fetch_object() ein Objekt. Zusätzlich können über fetch_all() alle Zeilen auf einmal abgerufen werden. Über die Eigenschaft num_rows lässt sich die Anzahl der Ergebniszeilen ermitteln.
Ab PHP 8.0 implementiert mysqli_result das Interface IteratorAggregate, sodass ein Ergebnis-Objekt direkt in einer foreach-Schleife verwendet werden kann, was den Code deutlich vereinfacht. Nach der Verwendung sollte das Ergebnis-Objekt mit free() bzw. close() freigegeben werden, um Speicher zu sparen.
Je nach verwendetem Modus (buffered via store_result() oder unbuffered via use_result()) werden alle Datensätze sofort vom Server übertragen oder erst bei Abruf gestreamt. Der unbuffered Modus ist bei großen Ergebnismengen speicherschonender, schränkt jedoch die Nutzung weiterer Abfragen ein, bis das Ergebnis vollständig gelesen wurde.
Beispiele
Datensätze mit fetch_assoc() auslesen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$result = $mysqli->query('SELECT id, name, email FROM users LIMIT 5');
if ($result instanceof mysqli_result) {
echo 'Anzahl Zeilen: ' . $result->num_rows . PHP_EOL;
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ' – ' . $row['name'] . ' (' . $row['email'] . ')' . PHP_EOL;
}
$result->free();
}
$mysqli->close();
foreach-Schleife dank IteratorAggregate (PHP 8.0+)
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$result = $mysqli->query('SELECT id, name FROM products WHERE active = 1');
foreach ($result as $row) {
printf("Produkt #%d: %s\n", $row['id'], $row['name']);
}
$result->free();
$mysqli->close();
Spaltenmetadaten über fetch_fields() auslesen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$result = $mysqli->query('SELECT id, name, price FROM products LIMIT 1');
$fields = $result->fetch_fields();
foreach ($fields as $field) {
printf(
"Spalte: %-15s | Typ: %d | Max-Länge: %d\n",
$field->name,
$field->type,
$field->max_length
);
}
$result->free();
$mysqli->close();
// Wichtig · Fallstricke
Speicher freigeben: Nach der Verwendung eines mysqli_result-Objekts sollte immer $result->free() (bzw. alias free_result() oder close()) aufgerufen werden, da sonst der für das Ergebnis reservierte Speicher erst beim Beenden des Skripts freigegeben wird — bei großen Ergebnismengen ein ernstes Problem.
Unbuffered vs. buffered: Bei use_result() (unbuffered) blockiert das Ergebnis-Objekt die Verbindung, bis alle Zeilen abgerufen wurden. Weitere Abfragen auf derselben Verbindung schlagen fehl, solange das Ergebnis nicht vollständig gelesen oder freigegeben wurde.
num_rows bei unbuffered: Die Eigenschaft num_rows ist bei unbuffered Ergebnissen erst korrekt, nachdem alle Zeilen abgerufen wurden.
SQL-Injection: mysqli_result selbst bietet keinen Schutz vor SQL-Injection. Sämtliche Nutzereingaben müssen vor der Abfrage mit Prepared Statements (mysqli::prepare()) oder mindestens mit mysqli::real_escape_string() abgesichert werden.