Start · Sprachen · PHP · Referenz · mysqli_num_rows

mysqli_num_rows

Funktion

Gibt die Anzahl der Zeilen in einer <code>mysqli_result</code>-Ergebnismenge zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_num_rows(mysqli_result $result): int|string

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

Typ
int|string
Beschreibung
Gibt die Anzahl der Zeilen als 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();
Anzahl aktiver Benutzer: 42

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();
3 Produkte gefunden: - Laptop - Smartphone - Tablet

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();
Vor dem Abrufen: 0 Nach dem Abrufen: 1500

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