Signatur
Beschreibung
pg_lo_seek verschiebt den internen Datei-Zeiger eines geöffneten PostgreSQL-Large-Objects (LOB). Damit lassen sich beliebige Stellen im Large Object gezielt ansteuern, ohne den gesamten Inhalt sequenziell lesen zu müssen – ähnlich wie fseek() bei regulären Dateien.
Der Parameter whence bestimmt, relativ wozu der Offset interpretiert wird: PGSQL_SEEK_SET setzt den Zeiger absolut vom Anfang, PGSQL_SEEK_CUR relativ zur aktuellen Position und PGSQL_SEEK_END relativ zum Ende des Large Objects. Diese Konstanten sind analog zu den Standardwerten von SEEK_SET, SEEK_CUR und SEEK_END bei Datei-Operationen.
Die Funktion ist besonders nützlich, wenn große Binärdaten (z. B. Bilder, Videos oder Dokumente) direkt in PostgreSQL gespeichert werden und nur bestimmte Abschnitte gelesen oder überschrieben werden sollen. Sie muss innerhalb einer aktiven Transaktion und nach einem erfolgreichen pg_lo_open()-Aufruf verwendet werden.
Wichtig: Large Objects in PostgreSQL erfordern stets eine offene Transaktion. Ohne pg_query($conn, 'BEGIN') schlägt der Zugriff fehl.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $large_object Pflicht | PgSql\LargeObject | Ein Large-Object-Handle, das zuvor mit pg_lo_open() geöffnet wurde. |
|
| $offset Pflicht | int | Die Anzahl der Bytes, um die der Zeiger verschoben werden soll. Kann negativ sein, wenn whence dies erlaubt (z. B. PGSQL_SEEK_END oder PGSQL_SEEK_CUR). |
|
| $whence | int | PGSQL_SEEK_CUR | Gibt den Bezugspunkt des Offsets an. Mögliche Werte: PGSQL_SEEK_SET (Anfang), PGSQL_SEEK_CUR (aktuelle Position), PGSQL_SEEK_END (Ende des Large Objects). |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. ungültiger Handle oder fehlende Transaktion).Beispiele
Bestimmten Abschnitt eines Large Objects lesen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
// Transaktion starten (zwingend erforderlich für Large Objects)
pg_query($conn, 'BEGIN');
$oid = 123456; // OID des vorhandenen Large Objects
$lob = pg_lo_open($conn, $oid, 'r');
if ($lob === false) {
die('Large Object konnte nicht geöffnet werden.');
}
// Zeiger auf Byte 100 vom Anfang setzen
if (pg_lo_seek($lob, 100, PGSQL_SEEK_SET)) {
// 50 Bytes ab Position 100 lesen
$data = pg_lo_read($lob, 50);
echo 'Gelesene Daten: ' . bin2hex($data) . PHP_EOL;
} else {
echo 'Fehler beim Setzen des Zeigers.' . PHP_EOL;
}
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
?>
Letzten 20 Bytes eines Large Objects lesen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
pg_query($conn, 'BEGIN');
$oid = 123456;
$lob = pg_lo_open($conn, $oid, 'r');
if ($lob === false) {
die('Large Object konnte nicht geöffnet werden.');
}
// Zeiger 20 Bytes vor das Ende setzen
if (pg_lo_seek($lob, -20, PGSQL_SEEK_END)) {
$data = pg_lo_read($lob, 20);
echo 'Letzte 20 Bytes: ' . bin2hex($data) . PHP_EOL;
// Aktuelle Position ermitteln
$pos = pg_lo_tell($lob);
echo 'Aktueller Zeiger nach dem Lesen: ' . $pos . PHP_EOL;
} else {
echo 'Seek fehlgeschlagen.' . PHP_EOL;
}
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
?>
// Wichtig · Fallstricke
Transaktion erforderlich: PostgreSQL-Large-Object-Operationen müssen innerhalb einer Transaktion stattfinden. Ohne vorheriges pg_query($conn, 'BEGIN') schlägt pg_lo_seek still fehl oder verhält sich undefiniert.
PHP 8.1+: Ab PHP 8.1 liefert pg_lo_open() eine Instanz von PgSql\LargeObject zurück (statt einer Ressource). Der erste Parameter von pg_lo_seek erwartet entsprechend diesen neuen Typ.
Negativer Offset: Ein negativer Offset ist nur in Kombination mit PGSQL_SEEK_END oder PGSQL_SEEK_CUR sinnvoll. Mit PGSQL_SEEK_SET und negativem Offset kann ein Fehler entstehen.