Start · Sprachen · PHP · Referenz · pg_fetch_all

pg_fetch_all

Funktion

Liest alle Zeilen eines PostgreSQL-Abfrageergebnisses auf einmal und gibt sie als verschachteltes Array zurück.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): array

Beschreibung

pg_fetch_all() liest sämtliche Datensätze eines PostgreSQL-Ergebnis-Objekts (PgSql\Result) in einem einzigen Aufruf und gibt ein zweidimensionales Array zurück. Jedes Element des äußeren Arrays entspricht einer Zeile, jedes innere Array enthält die Spaltenwerte dieser Zeile.

Der optionale Parameter mode steuert, wie die Spaltenwerte indiziert werden. Mit dem Standard PGSQL_ASSOC werden die Spalten über ihren Namen angesprochen, mit PGSQL_NUM über numerische Indizes und mit PGSQL_BOTH über beides gleichzeitig. Die Modi entsprechen denen von pg_fetch_array().

Die Funktion ist besonders praktisch, wenn alle Zeilen eines Ergebnisses im Speicher gehalten und z. B. an Templates oder JSON-Serialisierer übergeben werden sollen. Bei sehr großen Ergebnismengen sollte stattdessen iterativ mit pg_fetch_assoc() oder pg_fetch_row() gearbeitet werden, um den Speicherbedarf zu begrenzen.

Enthält das Ergebnis keine Zeilen, gibt die Funktion ein leeres Array zurück – nicht false. Das erleichtert die Weiterverarbeitung, da kein separater Null-Check erforderlich ist.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein gültiges PostgreSQL-Ergebnis-Objekt, das von Funktionen wie pg_query() oder pg_execute() zurückgegeben wurde.
$mode int PGSQL_ASSOC Legt die Indizierung der Spaltenwerte fest: PGSQL_ASSOC (Spaltenname), PGSQL_NUM (numerisch) oder PGSQL_BOTH (beides). Standard ist PGSQL_ASSOC.

Rückgabewert

Typ
array
Beschreibung
Ein Array, das alle Datensätze des Ergebnisses enthält. Jedes Element ist ein assoziatives, numerisches oder gemischtes Array je nach mode. Enthält das Ergebnis keine Zeilen, wird ein leeres Array zurückgegeben.

Beispiele

Alle Benutzer aus der Datenbank abrufen

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

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

$rows = pg_fetch_all($result);

if (empty($rows)) {
    echo 'Keine Benutzer vorhanden.';
} else {
    foreach ($rows as $row) {
        printf("ID: %d | Benutzer: %s | E-Mail: %s\n",
            $row['id'],
            $row['username'],
            $row['email']
        );
    }
}

pg_free_result($result);
pg_close($conn);
ID: 1 | Benutzer: alice | E-Mail: alice@example.com ID: 2 | Benutzer: bob | E-Mail: bob@example.com

Ergebnis als JSON-Antwort ausgeben

<?php
$conn = pg_connect('host=localhost dbname=mydb user=postgres password=secret');

// Parametrisierte Abfrage – schützt vor SQL-Injection
$result = pg_query_params(
    $conn,
    'SELECT id, name, price FROM products WHERE category_id = $1',
    [3]
);

$products = pg_fetch_all($result) ?: [];

header('Content-Type: application/json; charset=utf-8');
echo json_encode($products, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

pg_free_result($result);
pg_close($conn);
[ { "id": "10", "name": "Tastatur", "price": "29.99" }, { "id": "11", "name": "Maus", "price": "19.99" } ]

Numerische Indizierung mit PGSQL_NUM

<?php
$conn = pg_connect('host=localhost dbname=mydb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, username FROM users LIMIT 2');

$rows = pg_fetch_all($result, PGSQL_NUM);

foreach ($rows as $row) {
    // Zugriff per numerischem Index
    echo $row[0] . ' => ' . $row[1] . "\n";
}

pg_free_result($result);
pg_close($conn);
1 => alice 2 => bob

// Wichtig · Fallstricke

Speicherverbrauch: Da alle Zeilen gleichzeitig in den PHP-Speicher geladen werden, kann pg_fetch_all() bei sehr großen Ergebnismengen (mehrere zehntausend Zeilen) zu hohem Speicherverbrauch führen. In solchen Fällen empfiehlt sich ein iterativer Ansatz mit pg_fetch_assoc() in einer Schleife.

Rückgabewert bei leerer Menge: Seit PHP 7.0 wird ein leeres Array statt false zurückgegeben, wenn keine Zeilen vorhanden sind. Älterer Code, der auf === false prüft, funktioniert daher möglicherweise nicht mehr korrekt.

SQL-Injection: pg_fetch_all() selbst ist nicht für SQL-Injection anfällig, jedoch muss die vorausgehende Abfrage über pg_query_params() oder vorbereitete Anweisungen parametrisiert werden, um Injection-Angriffe zu verhindern.

Datentypen: PostgreSQL-Werte werden von der pgsql-Extension standardmäßig als PHP-Strings zurückgegeben. Eine explizite Typumwandlung (z. B. (int), (float)) ist erforderlich, wenn typsichere Weiterverarbeitung benötigt wird.