PHP 8.4.0 RC3 available for testing

PDO::pgsqlLOBOpen

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

PDO::pgsqlLOBOpenAbre um fluxo de objeto grande existente

Descrição

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

PDO::pgsqlLOBOpen() abre um fluxo para acessar os dados referenciados pelo oid. Se mode for igual a r, o fluxo é aberto para leitura, se mode for igual a w, o fluxo será aberto para escrita. Pode-se usar todas as funções de sistema de arquivo usuais, como, por exemplo, fread(), fwrite() e fgets(), para manipular o conteúdo do fluxo.

Nota: Esta função, e todas as manipulações do objeto grande, devem ser chamadas e executadas dentro de uma transação.

Parâmetros

oid

Um identificador de objeto grande.

mode

Se for igual a r, abra o fluxo para leitura. Se for igual a w, abra o fluxo para escrita.

Valor Retornado

Retorna um recurso de fluxo em caso de sucesso ou false em caso de falha.

Exemplos

Exemplo #1 Um exemplo de PDO::pgsqlLOBOpen()

Seguindo o exemplo de PDO::pgsqlLOBCreate(), este trecho de código recupera o objeto grande do banco de dados e o envia para o navegador.

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

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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
16 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
16 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