首頁  >  文章  >  後端開發  >  PHP--PDO大物件(LOBs)

PHP--PDO大物件(LOBs)

伊谢尔伦
伊谢尔伦原創
2016-11-22 09:30:181188瀏覽

應用程式在某個時刻,可能需要在資料庫中儲存「大」資料。 “大”通常意味著“大約 4kb 或以上”,儘管某些資料庫在資料達到“大”之前可以輕鬆處理多達 32kb 的資料。大物件本質上可能是文字或二進位。在PDOStatement::bindParam() 或 PDOStatement::bindColumn()呼叫中使用 PDO::PARAM_LOB 型別碼可以讓 PDO 使用大資料型別。 PDO::PARAM_LOB 告訴 PDO 作為流來映射數據,以便能使用 PHP Streams API 來操作。

Example #1 從資料庫中顯示一張圖片

下面範例綁定一個 LOB 到 $lob 變量,然後用 fpassthru() 將其送到瀏覽器。因為 LOB 代表一個流,所以類似 fgets()、 fread() 以及stream_get_contents() 這樣的函數都可以用在它上面。

<?php
    $db = new PDO(&#39;odbc:SAMPLE&#39;, &#39;db2inst1&#39;, &#39;ibmdb2&#39;);
    $stmt = $db->prepare("select contenttype, imagedata from images where id=?");
    $stmt->execute(array($_GET[&#39;id&#39;]));
    $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);
?>

Example #2 插入一張圖片到資料庫

下面範例開啟一個檔案並將檔案句柄傳給 PDO 來做為一個 LOB 插入。 PDO盡可能地讓資料庫以最有效的方式取得文件內容。

<?php
    $db = new PDO(&#39;odbc:SAMPLE&#39;, &#39;db2inst1&#39;, &#39;ibmdb2&#39;);
    $stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
    $id = get_new_id(); // 调用某个函数来分配一个新 ID
    // 假设处理一个文件上传
    // 可以在 PHP 文档中找到更多的信息
    $fp = fopen($_FILES[&#39;file&#39;][&#39;tmp_name&#39;], &#39;rb&#39;);
    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $_FILES[&#39;file&#39;][&#39;type&#39;]);
    $stmt->bindParam(3, $fp, PDO::PARAM_LOB);
    $db->beginTransaction();
    $stmt->execute();
    $db->commit();
?>

Example #3 插入一張圖片到資料庫:Oracle

對於從檔案插入一個 lob,Oracle略有不同。必須在事務之後進行插入,否則當執行查詢時導致新插入 LOB 將以0長度被隱式提交:

<?php
 $db = new PDO(&#39;oci:&#39;, &#39;scott&#39;, &#39;tiger&#39;);
   $stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
       "VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
   $id = get_new_id(); // 调用某个函数来分配一个新 ID

   // 假设处理一个文件上传
   // 可以在 PHP 文档中找到更多的信息
   $fp = fopen($_FILES[&#39;file&#39;][&#39;tmp_name&#39;], &#39;rb&#39;);

   $stmt->bindParam(1, $id);
   $stmt->bindParam(2, $_FILES[&#39;file&#39;][&#39;type&#39;]);
   $stmt->bindParam(3, $fp, PDO::PARAM_LOB);

   $stmt->beginTransaction();
   $stmt->execute();
   $stmt->commit();
?>


   


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn