Heim > Artikel > Backend-Entwicklung > PHP – PDO Large Objects (LOBs)
Irgendwann muss die Anwendung möglicherweise „große“ Daten in der Datenbank speichern. „Groß“ bedeutet normalerweise „etwa 4 KB oder mehr“, obwohl einige Datenbanken problemlos bis zu 32 KB an Daten verarbeiten können, bevor sie „groß“ werden. Große Objekte können Text- oder Binärobjekte sein. Durch die Verwendung des PDO::PARAM_LOB-Typcodes in PDOStatement::bindParam()- oder PDOStatement::bindColumn()-Aufrufen kann PDO große Datentypen verwenden. PDO::PARAM_LOB weist PDO an, die Daten als Stream abzubilden, damit sie mithilfe der PHP-Streams-API manipuliert werden können.
Beispiel #1 Ein Bild aus der Datenbank anzeigen
Das folgende Beispiel bindet ein LOB an die Variable $lob und sendet es dann mit fpassthru() an den Browser. Da LOB einen Stream darstellt, können darauf Funktionen wie fgets(), fread() und stream_get_contents() verwendet 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 die Datenbank einfügen
Das folgende Beispiel öffnet eine Datei und übergibt das Dateihandle an PDO, um es als LOB einzufügen. PDO ermöglicht es der Datenbank, Dateiinhalte auf möglichst effiziente Weise abzurufen.
<?php $db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2'); $stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)"); $id = get_new_id(); // 调用某个函数来分配一个新 ID // 假设处理一个文件上传 // 可以在 PHP 文档中找到更多的信息 $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 die Datenbank einfügen: Oracle
Beim Einfügen eines Lobs aus einer Datei geht Oracle etwas anders vor. Das Einfügen muss nach der Transaktion erfolgen, andernfalls wird das neu eingefügte LOB implizit mit der Länge 0 festgeschrieben, wenn die Abfrage ausgeführt wird:
<?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(); // 调用某个函数来分配一个新 ID // 假设处理一个文件上传 // 可以在 PHP 文档中找到更多的信息 $fp = fopen($_FILES['file']['tmp_name'], 'rb'); $stmt->bindParam(1, $id); $stmt->bindParam(2, $_FILES['file']['type']); $stmt->bindParam(3, $fp, PDO::PARAM_LOB); $stmt->beginTransaction(); $stmt->execute(); $stmt->commit(); ?>