Start · Sprachen · PHP · Referenz · pg_get_result

pg_get_result

Funktion

Liefert das nächste verfügbare Ergebnis einer asynchronen PostgreSQL-Abfrage, die mit <code>pg_send_query()</code> o. ä. gesendet wurde.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_get_result(PgSql\Connection $connection): PgSql\Result|false

Beschreibung

pg_get_result() wird im Zusammenspiel mit den nicht-blockierenden Abfragefunktionen pg_send_query(), pg_send_query_params() oder pg_send_execute() verwendet. Während diese Funktionen eine Abfrage asynchron an den PostgreSQL-Server senden, ohne auf das Ergebnis zu warten, kann man mit pg_get_result() das Ergebnis zu einem späteren Zeitpunkt abrufen.

Wurden mehrere Abfragen auf einmal gesendet (z. B. via pg_send_query('SELECT 1; SELECT 2;')), liefert jeder Aufruf von pg_get_result() das jeweils nächste Einzelergebnis in der Reihenfolge der gesendeten Abfragen. Wenn keine weiteren Ergebnisse vorhanden sind, gibt die Funktion false zurück.

Typischerweise prüft man vorher mit pg_connection_busy(), ob die Verbindung noch beschäftigt ist, und wartet anschließend mit einer Schleife, bis alle Ergebnisse abgerufen wurden. Das zurückgegebene PgSql\Result-Objekt kann dann wie ein synchrones Ergebnis mit pg_fetch_assoc(), pg_num_rows() usw. ausgewertet werden.

Dieses Muster ermöglicht es, mehrere Datenbankoperationen zu parallelisieren oder anderen PHP-Code auszuführen, während der Datenbankserver die Abfragen verarbeitet – besonders nützlich bei langen Abfragen oder bei Verwendung von nicht-blockierenden I/O-Modellen.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Datenbankverbindung, die zuvor mit pg_connect() oder pg_pconnect() geöffnet wurde und über die eine asynchrone Abfrage gesendet wurde.

Rückgabewert

Typ
PgSql\Result|false
Beschreibung
Gibt ein PgSql\Result-Objekt zurück, das das nächste ausstehende Abfrageergebnis enthält. Gibt false zurück, wenn keine weiteren Ergebnisse vorhanden sind oder wenn noch auf Ergebnisse gewartet wird (Verbindung beschäftigt).

Beispiele

Einfaches asynchrones Abfrage-Beispiel

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

// Asynchrone Abfrage senden
if (!pg_send_query($conn, 'SELECT id, name FROM users LIMIT 5')) {
    die('Senden der Abfrage fehlgeschlagen');
}

// Warten, bis die Verbindung nicht mehr beschäftigt ist
while (pg_connection_busy($conn)) {
    // Kurz warten, um CPU-Auslastung zu reduzieren
    usleep(10000);
}

// Ergebnis abrufen
$result = pg_get_result($conn);
if ($result === false) {
    die('Kein Ergebnis verfügbar');
}

// Fehler prüfen
if (pg_result_error($result)) {
    echo 'Fehler: ' . pg_result_error($result);
} else {
    while ($row = pg_fetch_assoc($result)) {
        echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
    }
}

pg_free_result($result);
pg_close($conn);
1: Alice 2: Bob 3: Charlie 4: Dave 5: Eve

Mehrere Abfragen asynchron verarbeiten

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

// Mehrere Abfragen in einem String senden
if (!pg_send_query($conn, 'SELECT COUNT(*) AS user_count FROM users; SELECT COUNT(*) AS order_count FROM orders;')) {
    die('Senden fehlgeschlagen');
}

// Alle Ergebnisse der Reihe nach abrufen
$results = [];
while (true) {
    // Warten bis Verbindung nicht mehr beschäftigt ist
    while (pg_connection_busy($conn)) {
        usleep(5000);
    }

    $result = pg_get_result($conn);
    if ($result === false) {
        break; // Keine weiteren Ergebnisse
    }

    $results[] = pg_fetch_assoc($result);
    pg_free_result($result);
}

echo 'Benutzer: ' . $results[0]['user_count'] . PHP_EOL;
echo 'Bestellungen: ' . $results[1]['order_count'] . PHP_EOL;

pg_close($conn);
Benutzer: 42 Bestellungen: 157

// Wichtig · Fallstricke

Reihenfolge der Ergebnisse: Bei mehreren gesendeten Abfragen liefert pg_get_result() die Ergebnisse genau in der Reihenfolge zurück, in der die Abfragen gesendet wurden. Es ist wichtig, alle Ergebnisse abzurufen (bis false zurückgegeben wird), bevor eine neue asynchrone Abfrage über dieselbe Verbindung gesendet wird.

Blockierendes Verhalten: Wenn die Verbindung noch beschäftigt ist (pg_connection_busy() gibt true zurück), gibt pg_get_result() sofort false zurück, ohne auf das Ergebnis zu warten. Daher muss zuerst mit pg_connection_busy() sichergestellt werden, dass Ergebnisse vorliegen.

Fehlerbehandlung: Ein Rückgabewert ungleich false bedeutet nicht, dass die Abfrage erfolgreich war. Der Fehler-Status des Ergebnisobjekts sollte stets mit pg_result_status() oder pg_result_error() geprüft werden.