PHP 开发者大会日本 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(string $oid, string $mode = "rb"): resource|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); 也适用
?>

如果要使用 `$pdo->commit()`(不是必需的),则需要 `beginTransaction()`,然后在 `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