PHP Conference Japan 2024

PDO::pgsqlLOBOpen

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)

PDO::pgsqlLOBOpen Pdo\Pgsql::lobOpen() 的別名

說明

public PDO::pgsqlLOBOpen(字串 $oid, 字串 $mode = "rb"): 資源|false

這個方法是以下方法的別名:Pdo\Pgsql::lobOpen()

新增註釋

使用者貢獻的註釋 3 則註釋

binaryexp at gmail
15 年前
這是對我有用的方法。如果您有 oid,那麼您只需要做的是

<?php
$pdo
= new PDO($dsn, $user, $pass);
$pdo->beginTransaction();
$data = $pdo->pgsqlLOBOpen($oid, 'r');

header("Content-Type: $mime");
// 其他任何標頭...

fpassthru($data); // echo stream_get_contents($data); 也可以
?>

需要 beginTransaction(),如果您想要 $pdo->commit()(這不是必需的),請在 fpassthru 之後執行。

順帶一提,使用 Zend Framework 的人可以在標準 PDO 資料庫物件上呼叫 getConnection(),這將獲得如上所示的 $pdo 物件。然後只需記住根據需要 disableLayout() 和 setNoRender()。
knl at bitflop dot com
16 年前
還要記住,fread() 只會解析串流中的前 8192 個位元組。使用..

<?php
$data
= stream_get_contents($stream);
?>

.. 如果您要解析更大的輸出。
knl at bitflop dot com
16 年前
上面的例子缺少一些資料。在花了幾個小時試圖讓它運作卻徒勞無功之後,來自 IRC (freenode) 上 PostgreSQL 頻道的 Jeff Davis 發現了缺少的部分。

以下範例可以運作,但您必須插入您正在儲存的大型物件的 MIME 類型和檔案大小,以便您可以使用該資料進行提取。

<?php
$db
= new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("SELECT oid, blob_type, filesize FROM BLOBS WHERE ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $lob, PDO::PARAM_LOB);
$stmt->bindColumn('blob_type', $blob_type, PDO::PARAM_STR);
$stmt->bindColumn('filesize', $filesize, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $pdo->pgsqlLOBOpen($lob, 'r');
$data = fread($stream, $filesize);
header("Content-type: $blob_type");
echo
$data;
?>

此外,`fpassthru()` 只會產生以下結果:警告:`fpassthru()`:提供的參數不是有效的串流資源,位於...

請使用 `echo` 或 `print` 作為替代。
To Top