PDO::pgsqlLOBOpen

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

PDO::pgsqlLOBOpen打开现有的大型对象流

说明

public PDO::pgsqlLOBOpen(string $oid, string $mode = "rb"): resource|false

PDO::pgsqlLOBOpen() 打开一个流来访问 oid 引用的数据。如果 moder,则以只读方式打开流;如果 modew,则以写入方式打开流。您可以使用所有常用的文件系统函数,例如 fread()fwrite()fgets() 来操作流的内容。

注意: 此函数以及对大型对象的所有操作必须在事务内调用和执行。

参数

oid

一个大型对象标识符。

mode

如果 mode 为 r,则以只读方式打开流。如果 mode 为 w,则以写入方式打开流。

返回值

成功时返回一个流资源,失败时返回 false

范例

范例 #1 PDO::pgsqlLOBOpen() 的例子

PDO::pgsqlLOBCreate() 的例子之后,此代码段从数据库中检索大型对象并将其输出到浏览器。

<?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 from BLOBS where ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $oid, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $db->pgsqlLOBOpen($oid, 'r');
header("Content-type: application/octet-stream");
fpassthru($stream);
?>

参见

添加注释

用户贡献的注释 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 对象。然后只需记住根据需要禁用 Layout() 和设置 NoRender()。
knl at bitflop dot com
15 年前
还要记住 fread() 只能解析流中的前 8192 个字节。使用..

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

.. 如果您有更大的输出要解析。
knl at bitflop dot com
15 年前
上面的例子缺少一些数据。Jeff Davis 在 IRC (freenode) 的 PostgreSQL 频道中花费了几个小时尝试徒劳地使其工作,他发现了缺少的部分。

以下示例将起作用,但您必须插入要存储的大型对象的 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