Signatur
Beschreibung
pg_lo_read() liest Daten aus einem zuvor mit pg_lo_open() geöffneten Large Object (LOB) einer PostgreSQL-Datenbank. Large Objects werden in PostgreSQL verwendet, um große Binärdaten (z. B. Bilder, Dokumente oder Videos) zu speichern, die über die normale Spaltengrößenbeschränkung hinausgehen.
Die Funktion liest sequenziell vom aktuellen Lese-/Schreibzeiger des LOB-Handles. Der interne Zeiger wird nach dem Lesen automatisch um die tatsächlich gelesene Byte-Anzahl vorgerückt. Soll der Zeiger manuell repositioniert werden, steht pg_lo_seek() zur Verfügung.
Der Parameter $length gibt die maximale Anzahl an Bytes an, die gelesen werden sollen. Ist der verbleibende Inhalt des LOB kürzer als $length, wird lediglich der verbleibende Rest zurückgegeben. Der Standardwert beträgt 8192 Bytes.
Wichtig: Die Funktion muss innerhalb einer Transaktion aufgerufen werden, da PostgreSQL Large Objects transaktionsgebunden sind. Vor dem Aufruf sollte daher pg_query($conn, 'BEGIN') ausgeführt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $lob Pflicht | PgSql\Lob | Ein Large-Object-Handle, das zuvor mit pg_lo_open() geöffnet wurde. |
|
| $length | int | 8192 | Die maximale Anzahl der zu lesenden Bytes. Muss größer als 0 sein. Standardmäßig werden bis zu 8192 Bytes gelesen. |
Rückgabewert
false zurückgegeben.Beispiele
Large Object vollständig lesen und ausgeben
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Transaktion starten — zwingend erforderlich für LOB-Operationen
pg_query($conn, 'BEGIN');
// OID des Large Objects, z. B. aus einer Tabelle gelesen
$oid = 12345;
// Large Object im Lesemodus öffnen
$lob = pg_lo_open($conn, $oid, 'r');
if (!$lob) {
pg_query($conn, 'ROLLBACK');
die('Large Object konnte nicht geöffnet werden');
}
// Inhalt blockweise lesen
$inhalt = '';
while ($chunk = pg_lo_read($lob, 4096)) {
$inhalt .= $chunk;
}
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
echo 'Gelesene Bytes: ' . strlen($inhalt) . PHP_EOL;
echo $inhalt;
Bild-LOB aus Datenbank lesen und an Browser senden
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// OID aus einer Tabelle holen
$result = pg_query($conn, "SELECT bild_oid FROM dokumente WHERE id = 1");
$row = pg_fetch_assoc($result);
$oid = (int)$row['bild_oid'];
pg_query($conn, 'BEGIN');
$lob = pg_lo_open($conn, $oid, 'r');
if (!$lob) {
pg_query($conn, 'ROLLBACK');
die('Large Object konnte nicht geöffnet werden');
}
header('Content-Type: image/jpeg');
// Bild direkt in Ausgabe-Puffer streamen
while ($chunk = pg_lo_read($lob, 8192)) {
echo $chunk;
}
pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
// Wichtig · Fallstricke
Transaktionspflicht: PostgreSQL-Large-Objects können nur innerhalb einer aktiven Transaktion verwendet werden. Wird keine Transaktion gestartet (z. B. mit pg_query($conn, 'BEGIN')), schlagen LOB-Operationen still oder mit Fehlermeldungen fehl.
Migration ab PHP 8.1: Ab PHP 8.1 ist der Rückgabetyp von pg_lo_open() das Objekt PgSql\Lob anstelle einer Resource. Code, der auf is_resource() prüft, muss entsprechend angepasst werden.
Sicherheit: OIDs sollten niemals direkt aus Benutzereingaben übernommen werden, da sonst beliebige Large Objects der Datenbank zugänglich werden könnten. OIDs immer über parametrisierte Abfragen (z. B. mit pg_query_params()) und strenge Zugriffskontrollen absichern.