Signatur
Beschreibung
mysqli_num_rows() ermittelt die Anzahl der Datensätze, die eine SQL-SELECT-Abfrage zurückgeliefert hat. Die Funktion kann sowohl prozedural (mysqli_num_rows($result)) als auch objektorientiert ($result->num_rows) verwendet werden.
Bei gepufferten Ergebnismengen (Standard-Modus, wenn das Ergebnis vollständig in den Arbeitsspeicher geladen wurde) steht die Zeilenanzahl sofort nach dem Aufruf von mysqli_query() zur Verfügung. Bei ungepufferten Ergebnismengen (erzeugt mit MYSQLI_USE_RESULT) gibt die Funktion erst dann den korrekten Wert zurück, wenn alle Zeilen abgerufen wurden.
Ab PHP 8.1 ist der Rückgabetyp für Ergebnismengen mit mehr als PHP_INT_MAX Zeilen ein string, ansonsten immer ein int. In der Praxis ist der Rückgabewert fast immer ein int.
mysqli_num_rows() funktioniert ausschließlich mit SELECT-Abfragen. Für die Anzahl betroffener Zeilen bei INSERT, UPDATE oder DELETE muss stattdessen mysqli_affected_rows() verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | mysqli_result | Das mysqli_result-Objekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde. |
Rückgabewert
int zurück. Falls die Anzahl größer als PHP_INT_MAX ist, wird sie als string zurückgegeben. Bei ungepufferten Ergebnismengen, die noch nicht vollständig abgerufen wurden, kann der Wert 0 sein.Beispiele
Anzahl der Zeilen einer SELECT-Abfrage ermitteln
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$result = $mysqli->query('SELECT id, name FROM users WHERE active = 1');
if ($result) {
$anzahl = mysqli_num_rows($result);
echo 'Anzahl aktiver Benutzer: ' . $anzahl . PHP_EOL;
$result->free();
} else {
echo 'Abfragefehler: ' . $mysqli->error;
}
$mysqli->close();
Objektorientierte Verwendung mit Existenzprüfung
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$result = $mysqli->query('SELECT * FROM produkte WHERE kategorie = "elektronik"');
if ($result && $result->num_rows > 0) {
echo $result->num_rows . ' Produkte gefunden:' . PHP_EOL;
while ($zeile = $result->fetch_assoc()) {
echo ' - ' . htmlspecialchars($zeile['name']) . PHP_EOL;
}
$result->free();
} else {
echo 'Keine Produkte in dieser Kategorie gefunden.';
}
$mysqli->close();
Verwendung mit ungepufferter Ergebnismenge
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
// Ungepufferte Abfrage: Ergebnis wird Zeile für Zeile vom Server gelesen
$result = $mysqli->query('SELECT id FROM grosse_tabelle', MYSQLI_USE_RESULT);
// num_rows ist 0, solange nicht alle Zeilen abgerufen wurden
echo 'Vor dem Abrufen: ' . $result->num_rows . PHP_EOL;
$alle = $result->fetch_all(MYSQLI_ASSOC);
// Jetzt erst ist der Wert korrekt
echo 'Nach dem Abrufen: ' . $result->num_rows . PHP_EOL;
$result->free();
$mysqli->close();
// Wichtig · Fallstricke
Nur für SELECT geeignet: mysqli_num_rows() gibt bei DML-Anweisungen (INSERT, UPDATE, DELETE) keine sinnvollen Werte zurück. Für diese Fälle ist mysqli_affected_rows() zu verwenden.
Ungepufferte Ergebnismengen: Bei der Verwendung von MYSQLI_USE_RESULT steht die korrekte Zeilenanzahl erst zur Verfügung, nachdem alle Zeilen mit fetch_row(), fetch_all() o.Ä. abgerufen wurden. Vorher wird 0 zurückgegeben.
Performance: Wird nur die Zeilenanzahl benötigt (ohne die eigentlichen Daten), ist eine SELECT COUNT(*) ...-Abfrage auf dem Datenbankserver effizienter, da nicht alle Daten übertragen werden müssen.