Start · Sprachen · PHP · Referenz · fbird_blob_open

fbird_blob_open

Funktion

Öffnet ein vorhandenes BLOB-Feld in einer Firebird/InterBase-Datenbank zum sequenziellen Lesen (Streaming).

seit PHP 5.0.0 Kategorie: db

Signatur

fbird_blob_open(resource $link_identifier, string $blob_id): resource|false

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg ein BLOB-Handle (Resource) zurück, das für weitere Operationen wie 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);
?>
Dokumentgröße: 20480 Bytes

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).