Signatur
Beschreibung
pg_lo_tell() gibt die aktuelle Position des internen Zeigers eines geöffneten PostgreSQL Large Objects zurück. Die Position entspricht der Anzahl der Bytes, die seit dem Anfang des Large Objects übersprungen wurden – ähnlich wie ftell() für reguläre Dateien.
Large Objects (LO) in PostgreSQL ermöglichen die Speicherung von Binärdaten, die größer als eine normale Tabellenzelle sein können (z. B. Bilder, Videos oder Dokumente). Nachdem ein Large Object mit pg_lo_open() geöffnet wurde, kann mit pg_lo_read(), pg_lo_write() oder pg_lo_seek() gearbeitet werden. Mit pg_lo_tell() lässt sich jederzeit die aktuelle Cursor-Position abfragen.
Diese Funktion ist nützlich, um den Fortschritt beim Lesen oder Schreiben zu überwachen, oder um nach einem pg_lo_seek() zu prüfen, ob sich die Position korrekt verändert hat. Der Aufruf muss innerhalb einer Transaktion erfolgen, da PostgreSQL Large Objects transaktional sind.
Ab PHP 8.1 ist der Parameter vom Typ PgSql\Lob (Objekt) statt einer Resource.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $lob Pflicht | PgSql\Lob | Ein Large-Object-Handle, das zuvor mit pg_lo_open() geöffnet wurde. |
Rückgabewert
-1 zurückgegeben.Beispiele
Aktuelle Position nach dem Lesen ermitteln
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
pg_query($conn, 'BEGIN');
// Large Object öffnen (OID muss bekannt sein)
$oid = 123456;
$lob = pg_lo_open($conn, $oid, 'r');
if ($lob === false) {
die('Large Object konnte nicht geöffnet werden.');
}
// 100 Bytes lesen
$data = pg_lo_read($lob, 100);
// Aktuelle Position abfragen
$pos = pg_lo_tell($lob);
echo "Aktuelle Position: " . $pos . " Bytes\n"; // Ausgabe: 100
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
Position nach pg_lo_seek überprüfen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
pg_query($conn, 'BEGIN');
$oid = 123456;
$lob = pg_lo_open($conn, $oid, 'rw');
if ($lob === false) {
die('Fehler beim Öffnen des Large Objects.');
}
// Cursor auf Position 512 setzen
pg_lo_seek($lob, 512, PGSQL_SEEK_SET);
// Aktuelle Position prüfen
$pos = pg_lo_tell($lob);
echo "Position nach Seek: " . $pos . " Bytes\n"; // Ausgabe: 512
// Weitere 256 Bytes lesen
$chunk = pg_lo_read($lob, 256);
$pos = pg_lo_tell($lob);
echo "Position nach Read: " . $pos . " Bytes\n"; // Ausgabe: 768
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
// Wichtig · Fallstricke
Transaktion erforderlich: Alle Operationen mit PostgreSQL Large Objects müssen innerhalb einer Transaktion stattfinden. Vergisst man BEGIN vor dem Öffnen, schlägt pg_lo_open() fehl oder verhält sich undefiniert.
PHP 8.1+: Ab PHP 8.1 wurde die Resource durch die Klasse PgSql\Lob ersetzt. Code, der auf den alten Resource-Typ prüft, muss angepasst werden.
Rückgabewert -1: Ein Rückgabewert von -1 deutet auf einen Fehler hin – z. B. wenn das Large Object nicht korrekt geöffnet wurde oder bereits geschlossen ist.