應用程式在某一時刻,可能需要在資料庫中儲存"大"資料。
"大"通常意味著"大約4kb 或以上",儘管某些資料庫在資料達到"大"之前可以輕鬆處理多達32kb 的資料。大物件本質上可能是文字或二進位。
在PDOStatement::bindParam() 或PDOStatement::bindColumn()) 呼叫中使用PDO::PARAM_LOB 類型碼可以讓PDO 使用大資料類型。
PDO::PARAM_LOB 告訴PDO 作為流來映射數據,以便能使用PHP Streams API 來操作。
下面範例綁定一個LOB 到$lob 變量,然後用fpassthru() 將其傳送到瀏覽器。因為LOB 代表一個流,所以類似fgets()、fread() 以及stream_get_contents() 這樣的函數都可以用在它上面。
<?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);?>
下面範例開啟一個檔案並將檔案句柄傳給PDO 來做一個LOB 插入。 PDO盡可能地讓資料庫以最有效的方式取得文件內容。
<?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();?>
對於從檔案插入一個lob,Oracle略有不同。必須在交易之後進行插入,否則當執行查詢時導致新近插入LOB 將以0長度被隱含提交:
<?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();?>