Signatur
Beschreibung
ociwritelobtofile() ist ein veralteter Alias für die Methode OCILob::export(). Die Funktion liest den Inhalt eines Oracle Large Object (LOB) — also eines CLOB, NCLOB oder BLOB — und schreibt ihn in eine lokale Datei auf dem Server-Dateisystem.
Der optionale Parameter start ermöglicht es, ab einem bestimmten Byte-Offset im LOB zu beginnen, während length die maximale Anzahl zu lesender Bytes begrenzt. Werden diese Parameter weggelassen oder auf -1 gesetzt, wird der gesamte LOB-Inhalt exportiert.
Diese Funktion ist nützlich, wenn große binäre oder textuelle Daten aus einer Oracle-Datenbank direkt in eine Datei gespeichert werden sollen, ohne sie vollständig in den PHP-Arbeitsspeicher laden zu müssen — was bei sehr großen LOBs effizienter ist.
Achtung: Diese Funktion ist seit PHP 8.0 als veraltet (deprecated) markiert. Neuer Code sollte stattdessen die objektorientierte Methode OCILob::export() verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $lob Pflicht | OCILob | Ein gültiges LOB-Deskriptor-Objekt, das z. B. durch oci_new_descriptor() oder aus einer OCI-Abfrage zurückgegeben wurde. |
|
| $filename Pflicht | string | Pfad zur Zieldatei auf dem Server-Dateisystem, in die der LOB-Inhalt geschrieben wird. Die Datei wird erstellt oder überschrieben. | |
| $start | int | -1 | Byte-Offset im LOB, ab dem gelesen werden soll. -1 bedeutet: vom Anfang des LOB starten. |
| $length | int | -1 | Maximale Anzahl Bytes, die aus dem LOB gelesen werden. -1 bedeutet: bis zum Ende des LOB lesen. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Datei nicht geschrieben werden konnte oder der LOB-Deskriptor ungültig ist).Beispiele
BLOB aus Oracle-Datenbank in Datei exportieren
<?php
$conn = oci_connect('user', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error($e['message'], E_USER_ERROR);
}
$sql = 'SELECT bild FROM produkte WHERE id = :id';
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':id', $produktId);
$produktId = 42;
oci_execute($stmt);
$row = oci_fetch_assoc($stmt);
if ($row && $row['BILD'] instanceof OCILob) {
$lob = $row['BILD'];
$zieldatei = '/tmp/produkt_42.jpg';
// Veralteter Alias — besser: $lob->export($zieldatei)
if (ociwritelobtofile($lob, $zieldatei)) {
echo "Bild erfolgreich gespeichert: $zieldatei";
} else {
echo "Fehler beim Speichern des LOB.";
}
$lob->free();
}
oci_free_statement($stmt);
oci_close($conn);
?>
Moderner Ersatz mit OCILob::export()
<?php
// Empfohlener, moderner Ansatz statt ociwritelobtofile()
$conn = oci_connect('user', 'password', 'localhost/XE');
$sql = 'SELECT dokument FROM dateien WHERE id = :id';
$stmt = oci_parse($conn, $sql);
$id = 7;
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
$row = oci_fetch_assoc($stmt);
if ($row && $row['DOKUMENT'] instanceof OCILob) {
$lob = $row['DOKUMENT'];
// OOP-Methode: OCILob::export()
if ($lob->export('/var/export/dokument_7.pdf')) {
echo "Export erfolgreich.";
} else {
echo "Export fehlgeschlagen.";
}
$lob->free();
}
oci_free_statement($stmt);
oci_close($conn);
?>
// Wichtig · Fallstricke
Deprecated: ociwritelobtofile() ist ein veralteter Alias und sollte in neuem Code nicht mehr verwendet werden. Verwende stattdessen die Methode OCILob::export() direkt auf dem LOB-Objekt.
Sicherheit: Der Zieldatei-Pfad (filename) sollte niemals direkt aus Benutzereingaben übernommen werden, um Path-Traversal-Angriffe zu verhindern. Validiere und bereinige den Pfad stets serverseitig.
Dateiberechtigungen: Der PHP-Prozess benötigt Schreibrechte auf das Zielverzeichnis. Andernfalls schlägt die Funktion stillschweigend fehl und gibt false zurück.