Signatur
Beschreibung
fbird_blob_open() öffnet ein bereits in der Datenbank gespeichertes BLOB-Objekt (Binary Large Object) anhand seiner BLOB-ID zum Lesen. Die Funktion gibt ein BLOB-Handle zurück, über das der Inhalt anschließend mit fbird_blob_get() stückweise ausgelesen werden kann.
BLOBs werden in Firebird/InterBase nicht direkt als Feldwert übergeben, sondern über spezielle BLOB-IDs referenziert. Der typische Leseworkflow ist: BLOB-ID aus einem Datensatz lesen → fbird_blob_open() aufrufen → mit fbird_blob_get() Daten abrufen → mit fbird_blob_close() schließen.
Die Funktion ist besonders nützlich, wenn große binäre oder textuelle Daten (z. B. Bilder, PDF-Dateien oder umfangreiche Texte) in Firebird-Datenbanken gespeichert sind und ohne vollständiges Laden in den Arbeitsspeicher verarbeitet werden sollen.
Hinweis: fbird_blob_open() ist ein Alias für ibase_blob_open(). Die fbird_*-Funktionen wurden eingeführt, um die ibase_*-Funktionen schrittweise abzulösen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $link_identifier Pflicht | resource | Eine aktive Firebird/InterBase-Datenbankverbindung, die zuvor mit fbird_connect() oder fbird_pconnect() geöffnet wurde. |
|
| $blob_id Pflicht | string | Die BLOB-ID des zu öffnenden BLOB-Objekts. Diese ID wird üblicherweise aus einem abgefragten Datensatz einer Firebird-Tabelle ausgelesen. |
Rückgabewert
fbird_blob_get() und fbird_blob_close() verwendet werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
BLOB-Inhalt aus einer Firebird-Tabelle lesen
<?php
// Verbindung zur Firebird-Datenbank herstellen
$dbh = fbird_connect('localhost:/var/lib/firebird/mydb.fdb', 'sysdba', 'masterkey')
or die('Verbindung fehlgeschlagen: ' . fbird_errmsg());
// Datensatz mit BLOB-Feld abrufen
$result = fbird_query($dbh, 'SELECT ID, DOKUMENT FROM DOKUMENTE WHERE ID = 1');
$row = fbird_fetch_object($result);
if ($row) {
// BLOB öffnen
$blob_handle = fbird_blob_open($dbh, $row->DOKUMENT);
if ($blob_handle !== false) {
$content = '';
// Daten stückweise lesen (je 8192 Bytes)
while ($chunk = fbird_blob_get($blob_handle, 8192)) {
$content .= $chunk;
}
// BLOB schließen
fbird_blob_close($blob_handle);
echo 'Dokumentgröße: ' . strlen($content) . ' Bytes';
} else {
echo 'BLOB konnte nicht geöffnet werden: ' . fbird_errmsg();
}
}
fbird_close($dbh);
?>
BLOB-Inhalt als Datei-Download ausgeben
<?php
$dbh = fbird_connect('localhost:/var/lib/firebird/mydb.fdb', 'sysdba', 'masterkey')
or die('Verbindung fehlgeschlagen');
$id = (int) ($_GET['id'] ?? 0);
$result = fbird_query($dbh, "SELECT DATEINAME, INHALT FROM DATEIEN WHERE ID = $id");
$row = fbird_fetch_assoc($result);
if ($row) {
$blob_handle = fbird_blob_open($dbh, $row['INHALT']);
if ($blob_handle !== false) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($row['DATEINAME']) . '"');
while ($chunk = fbird_blob_get($blob_handle, 65536)) {
echo $chunk;
}
fbird_blob_close($blob_handle);
}
}
fbird_close($dbh);
?>
// Wichtig · Fallstricke
Deprecation: Die fbird_*-Funktionen (sowie ihr Äquivalent ibase_*) sind ab PHP 8.4 ausgelagert und werden nicht mehr mit dem PHP-Kern ausgeliefert. Sie sind nur noch über die PECL-Erweiterung ibase verfügbar. Für neue Projekte sollte eine alternative Datenbankbibliothek für Firebird geprüft werden.
Sicherheit: Beim Einsatz von Benutzereingaben zur Auswahl eines BLOB-Datensatzes (z. B. über eine ID) immer parametrisierte Abfragen oder zumindest eine explizite Typumwandlung (z. B. (int)) verwenden, um SQL-Injection zu verhindern.
Ressourcen: Nicht geschlossene BLOB-Handles führen zu Ressourcenlecks. fbird_blob_close() sollte immer aufgerufen werden, auch im Fehlerfall (ggf. mit try/finally).