Signatur
Beschreibung
pg_result_seek() positioniert den internen Zeiger eines PostgreSQL-Ergebnisobjekts auf die gewünschte Zeile. Dies ist nützlich, wenn ein Ergebnis mit pg_fetch_row(), pg_fetch_assoc() oder pg_fetch_object() iteriert wird und man an eine bestimmte Stelle zurück- oder vorspringen möchte, ohne das Ergebnis neu abzufragen.
Die Zeilennummern sind nullbasiert, d. h. die erste Zeile hat den Index 0. Der maximal gültige Index ist die Gesamtzahl der Zeilen minus 1 (ermittelbar mit pg_num_rows()). Wird ein ungültiger Index übergeben, gibt die Funktion false zurück.
Diese Funktion eignet sich besonders dann, wenn eine Ergebnismenge mehrfach durchlaufen oder wahlfreier Zugriff auf Zeilen benötigt wird, ohne eine zweite Datenbankabfrage abzusetzen. In modernem PHP (ab 8.1) wird das Ergebnis als PgSql\Result-Objekt übergeben; in älteren Versionen war es eine Ressource.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | PgSql\Result | Das PostgreSQL-Ergebnisobjekt, das von Funktionen wie pg_query() oder pg_execute() zurückgegeben wurde. |
|
| $row Pflicht | int | Die Zeilennummer (nullbasiert), auf die der interne Zeiger gesetzt werden soll. Muss zwischen 0 und pg_num_rows($result) - 1 liegen. |
Rückgabewert
true zurück, wenn der Zeiger erfolgreich gesetzt wurde, oder false bei einem ungültigen Index oder einem sonstigen Fehler.Beispiele
Ergebnis rückwärts durchlaufen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$result = pg_query($conn, 'SELECT id, name FROM users ORDER BY id ASC');
if (!$result) {
die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}
$numRows = pg_num_rows($result);
echo "Ergebnisse in umgekehrter Reihenfolge:\n";
// Zeiger auf die letzte Zeile setzen und rückwärts iterieren
for ($i = $numRows - 1; $i >= 0; $i--) {
pg_result_seek($result, $i);
$row = pg_fetch_assoc($result);
echo "ID: {$row['id']}, Name: {$row['name']}\n";
}
pg_free_result($result);
pg_close($conn);
?>
Ergebnis mehrfach durchlaufen ohne neue Abfrage
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, name FROM products LIMIT 5');
$numRows = pg_num_rows($result);
// Erster Durchlauf: alle Namen ausgeben
echo "Erster Durchlauf:\n";
for ($i = 0; $i < $numRows; $i++) {
$row = pg_fetch_assoc($result);
echo $row['name'] . "\n";
}
// Zeiger zurück an den Anfang setzen
pg_result_seek($result, 0);
// Zweiter Durchlauf: nur IDs ausgeben
echo "\nZweiter Durchlauf (nur IDs):\n";
for ($i = 0; $i < $numRows; $i++) {
$row = pg_fetch_assoc($result);
echo $row['id'] . "\n";
}
pg_free_result($result);
pg_close($conn);
?>
// Wichtig · Fallstricke
Nullbasierte Indizierung: Achte darauf, dass die Zeilennummern bei 0 beginnen. Ein häufiger Fehler ist die Übergabe der Gesamtzeilenzahl (pg_num_rows()) statt des letzten gültigen Index (pg_num_rows() - 1), was zu false führt.
Ergebnis ohne Zeilen: Enthält das Ergebnis keine Zeilen (leere Menge), schlägt jeder Aufruf von pg_result_seek() – einschließlich pg_result_seek($result, 0) – mit false fehl. Prüfe deshalb pg_num_rows() vorab.
Ressource vs. Objekt: Vor PHP 8.1 wurde ein Ressource-Handle übergeben. Ab PHP 8.1 ist der Typ PgSql\Result. Code, der resource-Typprüfungen verwendet, muss entsprechend angepasst werden.