Signatur
Beschreibung
pg_fetch_object() liest den nächsten (oder einen bestimmten) Datensatz aus einem PostgreSQL-Ergebnissatz und gibt ihn als Objekt zurück. Die Spaltennamen der Abfrage werden dabei als Eigenschaften des Objekts abgebildet, sodass auf Feldwerte bequem per $row->spaltenname zugegriffen werden kann.
Standardmäßig wird ein stdClass-Objekt erzeugt. Über den Parameter $class kann eine eigene Klasse angegeben werden, deren Konstruktor mit den Argumenten aus $constructor_args aufgerufen wird. Eigene Klassen erlauben es, Datenbankzeilen direkt in domänenspezifische Modellobjekte zu überführen.
Der interne Zeigerstand des Ergebnissatzes wird nach jedem Aufruf ohne expliziten $row-Parameter automatisch weitergerückt, sodass die Funktion in Schleifen verwendet werden kann. Wird $row angegeben, springt der Zeiger auf die gewünschte Zeile (nullbasiert).
Diese Funktion ist besonders nützlich, wenn mit objektorientierten Strukturen gearbeitet wird und eine semantisch sauberere Syntax als bei pg_fetch_array() bevorzugt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | PgSql\Result | Das PostgreSQL-Ergebnisobjekt, das von pg_query(), pg_query_params() o. Ä. zurückgegeben wurde. |
|
| $row | int|null | null | Nullbasierter Zeilenindex des zu lesenden Datensatzes. Bei null wird die nächste Zeile entsprechend dem internen Zeiger gelesen. |
| $class | string | 'stdClass' | Name der Klasse, die instanziiert werden soll. Standardmäßig wird stdClass verwendet. |
| $constructor_args | array | [] | Array mit Argumenten, die an den Konstruktor der angegebenen Klasse übergeben werden. |
Rückgabewert
false zurückgegeben.Beispiele
Einfaches Auslesen aller Datensätze als stdClass
<?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_object($result)) {
echo 'ID: ' . $row->id . ', Name: ' . $row->name . ', E-Mail: ' . $row->email . PHP_EOL;
}
pg_free_result($result);
pg_close($conn);
Datensatz in eine eigene Modellklasse mappen
<?php
class User
{
public int $id;
public string $name;
public string $email;
private string $source;
public function __construct(string $source = 'db')
{
$this->source = $source;
}
public function getLabel(): string
{
return $this->name . ' <' . $this->email . '> [' . $this->source . ']';
}
}
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, name, email FROM users WHERE id = 1');
/** @var User $user */
$user = pg_fetch_object($result, null, User::class, ['postgresql']);
if ($user !== false) {
echo $user->getLabel() . PHP_EOL;
}
pg_free_result($result);
pg_close($conn);
Gezielter Zugriff auf eine bestimmte Zeile per Index
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, name FROM products ORDER BY id');
// Direkt die dritte Zeile (Index 2) lesen
$row = pg_fetch_object($result, 2);
if ($row !== false) {
echo 'Produkt #3: ' . $row->name . PHP_EOL;
}
pg_free_result($result);
pg_close($conn);
// Wichtig · Fallstricke
Eigenschaftsnamen: Die Eigenschaften des zurückgegebenen Objekts entsprechen exakt den Spaltennamen der SQL-Abfrage (klein-/großgeschrieben, wie PostgreSQL sie liefert). Bei Spalten mit Sonderzeichen oder Leerzeichen im Namen ist der Zugriff per $row->{'spalten name'} notwendig.
NULL-Werte: Datenbankfelder mit dem Wert NULL werden als PHP-null gesetzt.
Eigene Klassen: Beim Einsatz von $class werden die Datenbank-Eigenschaften nach dem Konstruktoraufruf gesetzt und überschreiben dabei gleichnamige Eigenschaften, die der Konstruktor eventuell gesetzt hat. Dies kann unerwartet sein, wenn der Konstruktor bereits Standardwerte für Datenbankfelder setzt.
Alternative: Ab PHP 8.1 mit dem pg_*-API kann pg_fetch_all() mit anschließendem Mapping verwendet werden. Für komplexe Anwendungen empfiehlt sich der Einsatz eines ORM wie Doctrine.