Start · Sprachen · PHP · Referenz · pg_fetch_assoc

pg_fetch_assoc

Funktion

Liest eine Zeile aus einem PostgreSQL-Abfrageergebnis und gibt sie als assoziatives Array zurück, wobei die Spaltenbezeichnungen als Schlüssel dienen.

seit PHP 4.3.0 Kategorie: db

Signatur

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

Beschreibung

pg_fetch_assoc() liest eine Ergebniszeile aus einer PostgreSQL-Abfrage und liefert sie als assoziatives Array zurück. Die Schlüssel des Arrays entsprechen den Spaltennamen der Abfrage (in Kleinbuchstaben), die Werte enthalten die Daten der jeweiligen Zeile als Strings oder null bei SQL-NULL-Werten.

Wird der optionale Parameter row weggelassen oder auf null gesetzt, wird die nächste Zeile gelesen und der interne Zähler automatisch weitergesetzt. Dies eignet sich besonders für Schleifen über alle Ergebniszeilen. Gibt man explizit eine Zeilennummer an, wird genau diese Zeile abgerufen, ohne den internen Zähler zu beeinflussen.

Die Funktion ist äquivalent zu pg_fetch_array($result, null, PGSQL_ASSOC) und bietet gegenüber pg_fetch_array() den Vorteil, dass keine numerisch indizierten Duplikate der Werte angelegt werden, was Speicher spart und den Code lesbarer macht.

Wird das Ende des Ergebnisses erreicht oder tritt ein Fehler auf, gibt die Funktion false zurück. Daher ist eine Prüfung des Rückgabewerts in Schleifen essenziell.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein gültiges PgSql\Result-Objekt, das von Funktionen wie pg_query() oder pg_execute() zurückgegeben wurde.
$row ?int null Die Zeilennummer (0-basiert), die abgerufen werden soll. Wird null übergeben oder der Parameter weggelassen, wird die nächste Zeile gemäß internem Zähler gelesen.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, dessen Schlüssel die Spaltennamen (kleingeschrieben) und dessen Werte die Zellinhalte als Strings sind. SQL-NULL-Werte werden als PHP-null geliefert. Gibt false zurück, wenn keine weitere Zeile vorhanden ist oder ein Fehler aufgetreten ist.

Beispiele

Alle Zeilen einer Tabelle mit einer while-Schleife ausgeben

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

$ergebnis = pg_query($verbindung, 'SELECT id, name, preis FROM produkte ORDER BY id');
if (!$ergebnis) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($verbindung));
}

while ($zeile = pg_fetch_assoc($ergebnis)) {
    echo 'ID: ' . $zeile['id']
       . ' | Name: ' . $zeile['name']
       . ' | Preis: ' . $zeile['preis'] . ' EUR' . PHP_EOL;
}

pg_free_result($ergebnis);
pg_close($verbindung);
ID: 1 | Name: Apfel | Preis: 0.99 EUR ID: 2 | Name: Banane | Preis: 0.49 EUR ID: 3 | Name: Kirsche | Preis: 2.50 EUR

Bestimmte Zeile per Zeilennummer abrufen

<?php
$verbindung = pg_connect('host=localhost dbname=shop user=postgres password=geheim');
$ergebnis = pg_query($verbindung, 'SELECT id, name FROM produkte ORDER BY id');

// Direkt die zweite Zeile (Index 1) lesen, ohne vorherige Zeilen zu durchlaufen
$zweiteZeile = pg_fetch_assoc($ergebnis, 1);
if ($zweiteZeile !== false) {
    echo 'Zweites Produkt: ' . $zweiteZeile['name'] . PHP_EOL;
} else {
    echo 'Keine zweite Zeile vorhanden.' . PHP_EOL;
}

pg_free_result($ergebnis);
pg_close($verbindung);
Zweites Produkt: Banane

Verwendung mit pg_execute und vorbereiteten Anweisungen

<?php
$verbindung = pg_connect('host=localhost dbname=shop user=postgres password=geheim');

// Vorbereitete Anweisung gegen SQL-Injection
pg_prepare($verbindung, 'suche_produkt', 'SELECT id, name, preis FROM produkte WHERE id = $1');
$ergebnis = pg_execute($verbindung, 'suche_produkt', [3]);

$zeile = pg_fetch_assoc($ergebnis);
if ($zeile !== false) {
    echo 'Gefunden: ' . $zeile['name'] . ' für ' . $zeile['preis'] . ' EUR' . PHP_EOL;
} else {
    echo 'Produkt nicht gefunden.' . PHP_EOL;
}

pg_free_result($ergebnis);
pg_close($verbindung);
Gefunden: Kirsche für 2.50 EUR

// Wichtig · Fallstricke

Sicherheitshinweis: Benutzereingaben niemals direkt in SQL-Abfragen einbetten. Stattdessen stets pg_prepare() und pg_execute() oder zumindest pg_escape_string() verwenden, um SQL-Injection zu verhindern.

Speicherfreigabe: Nach der Verarbeitung des Ergebnisses sollte pg_free_result() aufgerufen werden, um den belegten Speicher freizugeben — besonders bei großen Ergebnismengen relevant.

Spaltennamen: PostgreSQL gibt Spaltennamen standardmäßig in Kleinbuchstaben zurück. Bei Aliasen mit Großbuchstaben (z. B. SELECT name AS "ProduktName") wird die Groß-/Kleinschreibung beibehalten.

PHP 8.1: Ab PHP 8.1.0 ist der Rückgabetyp des Ergebnisses einer Verbindungs- und Abfragefunktion eine PgSql\Result-Instanz statt einer Ressource.