Start · Sprachen · PHP · Referenz · pg_num_rows

pg_num_rows

Funktion

Gibt die Anzahl der Zeilen (Datensätze) in einem PostgreSQL-Abfrageergebnis zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_num_rows(PgSql\Result $result): int

Beschreibung

pg_num_rows() liefert die Anzahl der Zeilen, die eine PostgreSQL-Abfrage zurückgegeben hat. Die Funktion wird typischerweise nach pg_query() oder pg_query_params() eingesetzt, um zu prüfen, wie viele Datensätze das Ergebnis enthält, bevor man diese einzeln abruft.

Besonders nützlich ist die Funktion, wenn man zunächst feststellen möchte, ob überhaupt Datensätze vorhanden sind, bevor man die Ergebnismenge durchläuft. So lassen sich unnötige Schleifeniterationen und Fehlerbehandlungen vermeiden.

Für INSERT-, UPDATE- oder DELETE-Anweisungen ist pg_num_rows() nicht geeignet — dort liefert die Funktion den Wert 0. In diesen Fällen sollte stattdessen pg_affected_rows() verwendet werden, das die Anzahl der tatsächlich betroffenen Zeilen zurückgibt.

Ab PHP 8.1 erwartet die Funktion ein PgSql\Result-Objekt anstelle einer Ressource. Älterer Code, der noch Ressourcen-Handles verwendet, funktioniert weiterhin, sollte aber modernisiert werden.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein PostgreSQL-Ergebnisobjekt, das von pg_query(), pg_query_params() oder einer vergleichbaren Funktion zurückgegeben wurde.

Rückgabewert

Typ
int
Beschreibung
Gibt die Anzahl der Zeilen im Ergebnis als nicht-negativen Integer zurück. Bei INSERT-, UPDATE- oder DELETE-Abfragen wird 0 zurückgegeben. Im Fehlerfall wird ebenfalls -1 zurückgegeben (z. B. bei ungültigem Ergebnis-Handle — jedoch gibt PHP dann typischerweise bereits einen Fehler aus).

Beispiele

Einfache Abfrage mit Zeilenanzahl prüfen

<?php
$conn = pg_connect('host=localhost dbname=shop user=app password=geheim');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$result = pg_query($conn, 'SELECT id, name FROM produkte WHERE aktiv = true');
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

$anzahl = pg_num_rows($result);
echo "Gefundene Produkte: $anzahl" . PHP_EOL;

if ($anzahl > 0) {
    while ($row = pg_fetch_assoc($result)) {
        echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
    }
} else {
    echo 'Keine aktiven Produkte vorhanden.' . PHP_EOL;
}

pg_free_result($result);
pg_close($conn);
Gefundene Produkte: 3 1: Laptop 2: Maus 3: Tastatur

Paginierung: Gesamtzahl für Seitennavigation ermitteln

<?php
$conn = pg_connect('host=localhost dbname=blog user=app password=geheim');

$seite    = 2;
$pro_seite = 10;
$offset   = ($seite - 1) * $pro_seite;

// Zuerst Gesamtanzahl ermitteln
$count_result = pg_query($conn, 'SELECT id FROM artikel WHERE veroeffentlicht = true');
$gesamt       = pg_num_rows($count_result);
$seiten_anzahl = (int) ceil($gesamt / $pro_seite);

echo "Gesamtartikel: $gesamt, Seiten: $seiten_anzahl" . PHP_EOL;

// Dann paginierte Daten laden
$result = pg_query_params(
    $conn,
    'SELECT id, titel FROM artikel WHERE veroeffentlicht = true ORDER BY erstellt_am DESC LIMIT $1 OFFSET $2',
    [$pro_seite, $offset]
);

$zeilenanzahl = pg_num_rows($result);
echo "Artikel auf Seite $seite: $zeilenanzahl" . PHP_EOL;

while ($row = pg_fetch_assoc($result)) {
    echo $row['id'] . ': ' . $row['titel'] . PHP_EOL;
}

pg_free_result($count_result);
pg_free_result($result);
pg_close($conn);
Gesamtartikel: 47, Seiten: 5 Artikel auf Seite 2: 10 11: PHP 8.3 Neue Features 12: PostgreSQL Performance-Tipps ...

// Wichtig · Fallstricke

Wichtig: pg_num_rows() ist ausschließlich für SELECT-Abfragen und ähnliche datenliefernde Anweisungen gedacht. Bei datenverändernden Abfragen (INSERT, UPDATE, DELETE) liefert sie immer 0 — hier muss pg_affected_rows() verwendet werden.

Für sehr große Ergebnismengen kann es performanter sein, eine separate COUNT(*)-Abfrage zu verwenden, anstatt alle Zeilen zu laden, nur um ihre Anzahl zu ermitteln. pg_num_rows() setzt voraus, dass das Ergebnis vollständig in den Speicher geladen wurde.

Ab PHP 8.1 wurde der Typ des Parameters von resource auf PgSql\Result geändert. Übergabe einer Ressource erzeugt eine Deprecation-Warnung.