Signatur
Beschreibung
ibase_blob_echo() liest den Inhalt eines BLOB-Objekts aus einer InterBase- oder Firebird-Datenbank und schreibt ihn unmittelbar in den Ausgabepuffer, ohne den Inhalt als PHP-Variable zu speichern. Dies ist besonders nützlich, wenn große Binärdaten (z. B. Bilder, PDFs oder andere Dateien) direkt an den Client gestreamt werden sollen, ohne den PHP-Speicher zu belasten.
Der Funktion wird ein BLOB-Bezeichner übergeben, der z. B. durch ibase_fetch_row() oder ibase_fetch_object() aus einer Abfrage stammt. Intern öffnet die Funktion den BLOB, liest ihn segmentweise und gibt ihn aus — vergleichbar mit einem kombinierten ibase_blob_open(), ibase_blob_get() und ibase_blob_close().
Typische Einsatzbereiche sind Download-Skripte, bei denen der BLOB-Inhalt zusammen mit passenden HTTP-Headern (z. B. Content-Type, Content-Disposition) direkt ausgeliefert wird. Für kleinere BLOBs, deren Inhalt weiterverarbeitet werden soll, empfiehlt sich stattdessen ibase_blob_get().
Hinweis: Die ibase_*-Funktionen sind seit PHP 7.4 in die PECL-Erweiterung ibase ausgelagert und ab PHP 8.0 nicht mehr im PHP-Kern enthalten. Für moderne Projekte sollte die Firebird/InterBase-PDO-Erweiterung in Betracht gezogen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $blob_id Pflicht | resource | Ein BLOB-Bezeichner (Resource), der z. B. durch ibase_fetch_row() oder ibase_blob_create() aus einer InterBase/Firebird-Verbindung stammt. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. ungültiger BLOB-Bezeichner oder Datenbankfehler).Beispiele
Bild-BLOB direkt an den Browser senden
<?php
// Datenbankverbindung herstellen
$dbh = ibase_connect('localhost:/pfad/zur/datenbank.fdb', 'sysdba', 'masterkey');
// Abfrage: Bild-BLOB für ein bestimmtes Produkt abrufen
$stmt = ibase_query($dbh, 'SELECT BILD FROM PRODUKTE WHERE ID = 42');
$row = ibase_fetch_row($stmt);
if ($row !== false && $row[0] !== null) {
// HTTP-Header für ein JPEG-Bild setzen
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename="produkt_42.jpg"');
// BLOB direkt in die Ausgabe schreiben
if (!ibase_blob_echo($row[0])) {
// Fehlerbehandlung
header('HTTP/1.1 500 Internal Server Error');
echo 'Fehler beim Lesen des BLOBs.';
}
} else {
header('HTTP/1.1 404 Not Found');
echo 'Bild nicht gefunden.';
}
ibase_free_result($stmt);
ibase_close($dbh);
PDF-Datei als Download ausliefern
<?php
$dbh = ibase_connect('localhost:/data/archiv.fdb', 'sysdba', 'masterkey');
$stmt = ibase_query($dbh, "SELECT DOKUMENT FROM ARCHIV WHERE DOCID = 100");
$row = ibase_fetch_row($stmt);
if ($row && $row[0]) {
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="dokument_100.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
ibase_blob_echo($row[0]);
}
ibase_free_result($stmt);
ibase_close($dbh);
// Wichtig · Fallstricke
Deprecation / Verfügbarkeit: Die ibase_*-Erweiterung wurde in PHP 7.4 als veraltet markiert und in PHP 8.0 aus dem PHP-Kern entfernt. Sie steht seitdem nur noch als PECL-Paket (pecl install ibase) zur Verfügung. Neue Projekte sollten PDO mit dem Firebird-Treiber verwenden.
Ausgabe-Buffering: Da ibase_blob_echo() direkt in die Ausgabe schreibt, müssen alle HTTP-Header vor dem Aufruf gesetzt sein. Ist bereits Ausgabe erfolgt (z. B. durch versehentliche Leerzeichen vor <?php), schlägt header() fehl. Der Einsatz von ob_start()/ob_end_clean() vor dem Headerversand kann helfen.
Speicher: Im Gegensatz zu ibase_blob_get() wird der BLOB-Inhalt nicht als PHP-String zwischengespeichert, was bei großen Datenmengen Speicher spart und die Auslieferung beschleunigt.