Large Objects (LOBs)
Es könnte an irgendeinem Punkt in Ihrer Anwendung passieren, dass Sie eine
"große" Menge an Daten in Ihrer Datenbank ablegen müssen. Groß bedeutet
typischerweise "etwa 4 kb oder mehr", obwohl manche Datenbanken spielend bis
zu 32 kb bearbeiten können, bevor das als "groß" zählt. Large Objects können
entweder textueller oder binärer Natur sein. PDO erlaubt Ihnen, mit diesem
großen Datentyp zu arbeiten, indem Sie PDO::PARAM_LOB
als Typ in Ihren Methodenaufrufen von
PDOStatement::bindParam() oder
PDOStatement::bindColumn() benutzen.
PDO::PARAM_LOB
veranlasst PDO, die Daten als Stream zu
behandeln, so dass Sie diese mit Hilfe der PHP
Streams-API bearbeiten können.
Beispiel #1 Ein Bild aus einer Datenbank anzeigen
Dieses Beispiel weist das LOB der Variable namens $lob zu und sendet es mittels fpassthru() an den Browser. Weil das LOB als Stream dargestellt wird, können Funktionen wie fgets(), fread() und stream_get_contents() damit benutzt werden.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
fpassthru($lob);
?>
Beispiel #2 Ein Bild in eine Datenbank einfügen
Dieses Beispiel öffnet eine Datei und übergibt das File-Handle an PDO, damit sie als LOB eingefügt wird. PDO wird sein Möglichstes tun, den Inhalt der Datei auf möglichst effiziente Weise in die Datenbank zu bekommen.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // Eine Funktion zum Allokieren der neuen ID
// Wir nehmen an, das Skript läuft als Teil eines Datei-Upload-Formulars
// Sie finden weitere Informationen in der PHP-Dokumentation
$fp = fopen($_FILES['file']['tmp_name'], 'rb');
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);
$db->beginTransaction();
$stmt->execute();
$db->commit();
?>
Beispiel #3 Ein Bild in eine Datenbank einfügen: Oracle
Oracle erfordert eine leicht unterschiedliche Syntax, um ein LOB aus einer Datei einzufügen. Es ist auch unumgänglich, dass Sie diesen Insert innerhalb einer Transaktion durchführen, andernfalls wird Ihr frisch eingefügtes LOB mit einer Länge von 0 als Teil des impliziten Commits, der beim Ausführen der Abfrage passiert, gespeichert.
<?php
$db = new PDO('oci:', 'scott', 'tiger');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
$id = get_new_id(); // Eine Funktion zum Allokieren einer neuen ID
// Wir nehmen an, das Skript läuft als Teil eines Datei-Upload-Formulars
// Sie finden weitere Informationen in der PHP-Dokumentation
$fp = fopen($_FILES['file']['tmp_name'], 'rb');
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);
$db->beginTransaction();
$stmt->execute();
$db->commit();
?>