Start · Sprachen · PHP · Referenz · pg_fetch_array

pg_fetch_array

Funktion

Liest eine Ergebniszeile aus einem PostgreSQL-Abfrageergebnis und gibt sie als Array zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

pg_fetch_array(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false

Beschreibung

pg_fetch_array() liest die nächste (oder eine bestimmte) Zeile aus einem PostgreSQL-Abfrageergebnis und gibt diese als Array zurück. Abhängig vom Parameter mode kann das Array numerisch indiziert, assoziativ (Spaltennamen als Schlüssel) oder beides sein.

Die Funktion ist das PostgreSQL-Äquivalent zu mysqli_fetch_array() und eignet sich gut für einfache Datenbankabfragen, bei denen die Ergebniszeilen direkt weiterverarbeitet werden sollen. Sie wird typischerweise in einer Schleife aufgerufen, bis sie false zurückgibt – was das Ende des Ergebnisses signalisiert.

Mit dem Parameter mode lässt sich steuern, ob der Zugriff über numerische Indizes (PGSQL_NUM), über Spaltennamen (PGSQL_ASSOC) oder über beide gleichzeitig (PGSQL_BOTH) erfolgen soll. PGSQL_BOTH ist der Standard, verbraucht aber mehr Speicher, da jeder Wert doppelt abgelegt wird.

Für ausschließlich assoziativen Zugriff empfiehlt sich pg_fetch_assoc(), für rein numerischen Zugriff pg_fetch_row() – beide sind spezialisierte Varianten von pg_fetch_array().

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein PostgreSQL-Ergebnisobjekt, das von pg_query(), pg_query_params() oder ähnlichen Funktionen zurückgegeben wurde.
$row ?int null Zeilennummer (0-basiert), die aus dem Ergebnis gelesen werden soll. Wird null übergeben oder der Parameter weggelassen, wird die nächste Zeile in der internen Zeigerposition gelesen.
$mode int PGSQL_BOTH Steuert, wie das zurückgegebene Array indiziert wird. Mögliche Werte: PGSQL_ASSOC (nur Spaltennamen), PGSQL_NUM (nur numerische Indizes), PGSQL_BOTH (beides).

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array zurück, das die Daten der abgerufenen Zeile enthält. Der Typ des Arrays hängt vom mode-Parameter ab. Gibt false zurück, wenn keine weitere Zeile verfügbar ist oder ein Fehler aufgetreten ist.

Beispiele

Alle Zeilen einer Tabelle mit einer Schleife ausgeben

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$result = pg_query($conn, 'SELECT id, name, email FROM users ORDER BY id');
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) {
    echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . ', E-Mail: ' . $row['email'] . PHP_EOL;
}

pg_free_result($result);
pg_close($conn);
ID: 1, Name: Alice, E-Mail: alice@example.com ID: 2, Name: Bob, E-Mail: bob@example.com

Gezielter Zugriff auf eine bestimmte Zeile per Zeilennummer

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, name FROM products');

// Direkt die dritte Zeile (Index 2) abrufen
$row = pg_fetch_array($result, 2, PGSQL_BOTH);
if ($row !== false) {
    // Zugriff sowohl per Name als auch per Index möglich
    echo 'Name (assoziativ): ' . $row['name'] . PHP_EOL;
    echo 'Name (numerisch):  ' . $row[1] . PHP_EOL;
} else {
    echo 'Zeile nicht gefunden.' . PHP_EOL;
}

pg_free_result($result);
pg_close($conn);
Name (assoziativ): Produkt C Name (numerisch): Produkt C

// Wichtig · Fallstricke

Speicherverbrauch: Der Standard-Modus PGSQL_BOTH speichert jeden Spaltenwert zweimal im zurückgegebenen Array (einmal numerisch, einmal assoziativ). Bei großen Ergebnismengen sollte daher PGSQL_ASSOC oder PGSQL_NUM bevorzugt werden.

NULL-Werte: Datenbankfelder mit NULL-Wert werden im PHP-Array als null zurückgegeben.

SQL-Injection: Niemals Benutzereingaben direkt in SQL-Abfragestrings einbauen. Stattdessen pg_query_params() mit Platzhaltern verwenden, um SQL-Injection zuverlässig zu verhindern.

Ressource vs. Objekt: Ab PHP 8.1 ist der Rückgabewert von pg_query() ein PgSql\Result-Objekt; in älteren PHP-Versionen war es eine Ressource vom Typ resource.