Signatur
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
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);
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);
// 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.