上面的例子缺少一些数据。在徒劳地尝试了几个小时后,来自 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`。