Start · Sprachen · PHP · Referenz · ibase_blob_get

ibase_blob_get

Funktion

Liest bis zu <code>len</code> Bytes aus einem geöffneten Firebird/InterBase-BLOB-Handle und gibt die gelesenen Daten zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

ibase_blob_get(resource $blob_handle, int $len): string|false

Beschreibung

ibase_blob_get liest einen Datenblock der angegebenen Länge aus einem zuvor mit ibase_blob_open geöffneten BLOB (Binary Large Object). Die Funktion gibt den gelesenen Teilstring zurück oder false bei einem Fehler.

BLOBs in Firebird/InterBase werden segmentweise gelesen. ibase_blob_get wird typischerweise in einer Schleife aufgerufen, bis das gesamte BLOB ausgelesen wurde. Der interne Lesezeiger des BLOB-Handles wird bei jedem Aufruf um die gelesenen Bytes weitergerückt, sodass aufeinanderfolgende Aufrufe sequenziell durch das BLOB navigieren.

Diese Funktion ist sinnvoll, wenn große Binärdaten (Bilder, Dokumente, Audiodateien) aus einer Firebird- oder InterBase-Datenbank segmentiert ausgelesen werden sollen, um den Speicherverbrauch zu begrenzen. Für kleine BLOBs kann alternativ ibase_blob_echo verwendet werden, das den Inhalt direkt auf die Standardausgabe ausgibt.

Hinweis: Die Firebird/InterBase-Extension (ibase_*) wurde in PHP 7.4 aus dem PHP-Core entfernt und steht seitdem als PECL-Paket php-firebird bzw. php-interbase zur Verfügung.

Parameter

Name Typ Default Beschreibung
$blob_handle Pflicht resource Ein BLOB-Handle, das zuvor mit ibase_blob_open geöffnet wurde.
$len Pflicht int Die Anzahl der Bytes, die aus dem BLOB gelesen werden sollen. Der tatsächlich zurückgegebene String kann kürzer sein, wenn das Ende des BLOBs erreicht wurde.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen String mit den gelesenen Bytes zurück, oder false bei einem Fehler. Wenn das Ende des BLOBs erreicht ist, gibt die Funktion einen leeren String oder false zurück.

Beispiele

BLOB segmentweise auslesen und in Datei speichern

<?php
$dbh = ibase_connect('localhost:mydatabase', 'username', 'password');

$result = ibase_query($dbh, 'SELECT BLOB_COLUMN FROM MY_TABLE WHERE ID = 1');
$row    = ibase_fetch_object($result);

// BLOB-Handle öffnen
$blobHandle = ibase_blob_open($dbh, $row->BLOB_COLUMN);

$blobData = '';
$chunkSize = 8192; // 8 KB pro Lesevorgang

while ($chunk = ibase_blob_get($blobHandle, $chunkSize)) {
    $blobData .= $chunk;
}

ibase_blob_close($blobHandle);
ibase_close($dbh);

// Gelesene Daten in eine Datei schreiben
file_put_contents('/tmp/blob_output.bin', $blobData);
echo 'BLOB gespeichert, Größe: ' . strlen($blobData) . ' Bytes';
?>
BLOB gespeichert, Größe: 204800 Bytes

BLOB als HTTP-Response streamen

<?php
$dbh = ibase_connect('localhost:mydatabase', 'username', 'password');

$result = ibase_query($dbh, 'SELECT IMAGE_DATA FROM IMAGES WHERE IMAGE_ID = 42');
$row    = ibase_fetch_object($result);

$blobHandle = ibase_blob_open($dbh, $row->IMAGE_DATA);

header('Content-Type: image/jpeg');

$chunkSize = 4096;
while ($chunk = ibase_blob_get($blobHandle, $chunkSize)) {
    echo $chunk;
}

ibase_blob_close($blobHandle);
ibase_close($dbh);
?>

// Wichtig · Fallstricke

Deprecation / Entfernung: Die ibase_*-Funktionen wurden in PHP 7.4 aus dem PHP-Kern entfernt. Ab PHP 8.0 müssen sie als PECL-Extension (ibase bzw. Firebird) installiert werden. Neue Projekte sollten die fbird_*-Funktionen oder PDO mit dem Firebird-Treiber verwenden.

Schleifenbedingung: Da ibase_blob_get am Ende des BLOBs einen leeren String oder false zurückgeben kann, sollte die Schleifenbedingung sorgfältig formuliert werden (z. B. while ($chunk = ...) bricht bei leerem String oder false ab). Bei sehr kleinen BLOBs könnte die Bedingung vorzeitig abbrechen, wenn ein Segment exakt leer ist — in solchen Fällen empfiehlt sich eine explizite Überprüfung mit !== false.

Ressourcen freigeben: Das BLOB-Handle muss nach Verwendung immer mit ibase_blob_close geschlossen werden, um Ressourcenlecks zu vermeiden.