Start · Sprachen · PHP · Referenz · pg_fetch_object

pg_fetch_object

Funktion

Liest eine Zeile aus einem PostgreSQL-Abfrageergebnis und gibt sie als Objekt zurück, wobei Spaltennamen als Objekteigenschaften verfügbar sind.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_fetch_object(PgSql\Result $result, int|null $row = null, string $class = 'stdClass', array $constructor_args = []): object|false

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

Typ
object|false
Beschreibung
Gibt ein Objekt zurück, dessen Eigenschaften den Spaltennamen des Ergebnissatzes entsprechen. Bei Fehler oder wenn keine weitere Zeile vorhanden ist, wird 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);
ID: 1, Name: Alice, E-Mail: alice@example.com ID: 2, Name: Bob, E-Mail: bob@example.com

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 . ' &lt;' . $this->email . '&gt; [' . $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);
Alice <alice@example.com> [postgresql]

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);
Produkt #3: Musterprodukt C

// 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.