Start · Sprachen · PHP · Referenz · pg_lo_read

pg_lo_read

Funktion

Liest bis zu <code>$length</code> Bytes aus einem geöffneten PostgreSQL-Large-Object und gibt den gelesenen Inhalt als String zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_lo_read(PgSql\Lob $lob, int $length = 8192): string|false

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

Typ
string|false
Beschreibung
Gibt die gelesenen Daten als String zurück. Sind keine Daten mehr vorhanden oder ist der LOB leer, wird ein leerer String zurückgegeben. Bei einem Fehler wird 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;
Gelesene Bytes: <Anzahl abhängig vom gespeicherten 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.