downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PDO::pgsqlLOBUnlink> <PDO::pgsqlLOBCreate
Last updated: Fri, 13 Nov 2009

view this page in

PDO::pgsqlLOBOpen

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

PDO::pgsqlLOBOpen既存のラージオブジェクトのストリームをオープンする

説明

resource PDO::pgsqlLOBOpen ( string $oid [, string $mode = "rb" ] )

PDO::pgsqlLOBOpen() は、oid が指すデータにアクセスするためのストリームをオープンします。 moder の場合、 ストリームは読み込み用にオープンされます。 modew の場合、 ストリームは書き込み用にオープンされます。 fread()fwrite() および fgets() のような通常のファイルシステム関数を使用して、 ストリームの内容を操作することができます。

注意: この関数およびラージオブジェクトに対するすべての操作は、 トランザクション内で処理される必要があります。

パラメータ

oid

ラージオブジェクトの ID。

mode

モードが r の場合、読み込み用のストリームをオープンします。 モードが w の場合、書き込み用のストリームをオープンします。

返り値

成功した場合にストリームリソース、失敗した場合に FALSE を返します。

例1 PDO::pgsqlLOBOpen() の例

PDO::pgsqlLOBCreate() の例に引き続き、 このコード片はデータベースからラージオブジェクトを取得して それをブラウザに出力します。

<?php
$db 
= new PDO('pgsql:dbname=test host=localhost'$user$pass);
$db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt $db->prepare("select oid from BLOBS where ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid'$lobPDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
fpassthru($lob);
?>

参考



PDO::pgsqlLOBUnlink> <PDO::pgsqlLOBCreate
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
PDO::pgsqlLOBOpen
binaryexp at gmail
06-Mar-2009 12:54
This is what worked for me. If you have the oid, then all you need to do is:

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

header("Content-Type: $mime");
// any other headers...

fpassthru($data);  // echo stream_get_contents($data); also works
?>

The beginTransaction() is required, if you want to $pdo->commit() (it's not required) then do it after the fpassthru.

On a side note, those using Zend Framework can call getConnection() on the standard PDO database object which will get them the $pdo object as above. Then just remember to disableLayout() and setNoRender() as necessary.
knl at bitflop dot com
26-Sep-2008 12:54
Also remember that fread() will only parse the first 8192 bytes from the stream. Use..

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

.. if you have a larger output to parse.
knl at bitflop dot com
25-Sep-2008 10:20
The above example is missing some data. After spending several hours trying to get it to work in vain, Jeff Davis from the PostgreSQL channel on IRC (freenode) figured out what was missing.

The below example will work, but you have to insert the MIME type and file size of the large object that you are storing, so you can use that data for extraction.

<?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;
?>

Also fpassthru() will just give this result: Warning: fpassthru(): supplied argument is not a valid stream resource in ...

Use echo or print instead.

PDO::pgsqlLOBUnlink> <PDO::pgsqlLOBCreate
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites