Oracle Blob是一種二進制大對象數據類型,它可以存儲任何類型的數據,包括圖像,音頻,視頻等。在PHP中,可以通過OCI8擴展包來實現數據的讀寫。
在下面的例子中,我們將使用OCI8擴展包,將一張圖片存儲到Oracle Blob列中,并從中讀取并顯示出來。
// 連接到Oracle數據庫 $conn = oci_connect("username", "password", "dbhost/dbname"); // 設置Autocommit為false oci_set_client_identifier($conn, "your_client_identifier"); // 準備插入語句,用":"來綁定參數 $stmt = oci_parse($conn, "INSERT INTO my_photos(photo_id, photo) VALUES (:photo_id, empty_blob()) RETURNING photo INTO :photo_content"); // 綁定photo_id的參數 $photo_id = 1; oci_bind_by_name($stmt, ":photo_id", $photo_id); // 綁定photo_content的參數 $photo_content = ""; oci_bind_by_name($stmt, ":photo_content", $photo_content, -1, OCI_B_BLOB); // 執行插入語句 oci_execute($stmt, OCI_NO_AUTO_COMMIT); // 打開圖片文件 $filename = "/path/to/my/photo.jpg"; $fp = fopen($filename, 'rb'); // 將圖片數據寫入到Blob列中 while (!feof($fp)) { $chunk = fread($fp, 4096); $photo_content->save($chunk); } // 提交事務 oci_commit($conn); // 關閉文件句柄 fclose($fp);
在以上示例中,我們創建了一個名為my_photos的表格,并且向其中插入了一行數據,包括一個編號為1的photo_id以及一個Blob類型的photo。同時,我們通過OCI8的empty_blob()函數初始化了這個Blob列。
接下來,我們使用OCI8中的函數oci_bind_by_name()將變量$photo_content與我們上面創建的empty_blob()綁定。然后通過讀取圖片文件,并利用Blob對象的save()方法,逐塊寫入到Blob列中。最后,我們提交事務并關閉文件句柄。
接下來,我們來看一下如何從Oracle Blob列中讀取數據,并在Web頁面上顯示。
// 查詢Blob列的數據 $stmt = oci_parse($conn, "SELECT photo FROM my_photos WHERE photo_id = :photo_id FOR UPDATE"); // 綁定photo_id的參數 $photo_id = 1; oci_bind_by_name($stmt, ":photo_id", $photo_id); // 執行查詢語句 oci_execute($stmt, OCI_NO_AUTO_COMMIT); // 獲取查詢結果 if ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_LOBS)) { $photo = $row["PHOTO"]; header("Content-Type: image/jpeg"); fpassthru($photo); } // 提交事務 oci_commit($conn);
在以上示例中,我們首先查詢了my_photos表格中的Blob數據,并用oci_fetch_array()獲取了結果。然后,我們將得到的Blob對象直接通過header()函數輸出到Web頁面上,通過fpassthru()函數將操作指向讀取的Blob對象。
在完成查詢之后,我們提交事務,結束連接。
總的來說,利用OCI8擴展包讓PHP和Oracle Blob相結合可以實現很多復雜的功能。不管是將圖片存儲到Blob列中,還是從這些列中讀取出來并展示出來,都很容易實現。本文提供了一些簡單的示例,希望能夠為大家提供幫助。
上一篇css3.0撲克翻轉