PDO::pgsqlLOBOpen

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

PDO::pgsqlLOBOpen존재하는 라지 오브젝트 스트림을 엽니다

설명

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

PDO::pgsqlLOBOpen()oid로 참조되는 데이터에 접근하는 스트림을 엽니다. moder이면, 스트림은 읽기로 열리고, modew이면, 스트림은 쓰기로 열립니다. 스트림 내용을 조작하기 위해서 fread(), fwrite(), fgets() 등의 파일시스템 함수를 사용할 수 있습니다.

Note: 이 함수와 라지 오브젝트의 모든 조작은 트랜젝션 안에서 이루어져야 합니다.

인수

oid

라지 오브젝트 식별자.

mode

모드가 r이면, 스트림을 읽기로 엽니다. 모드가 w이면, 스트림을 쓰기로 엽니다.

반환값

성공시엔 스트림 리소스, 실패시엔 FALSE를 반환합니다.

예제

Example #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);
?>

참고

add a note add a note

User Contributed Notes 3 notes

up
1
binaryexp at gmail
15 years ago
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.
up
0
knl at bitflop dot com
15 years ago
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.
up
0
knl at bitflop dot com
15 years ago
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.
To Top