PDO pgsql:获取 bytea 列

问题描述 投票:0回答:1

在 PostgreSql 中,有一个表,其中有一列类型为 'bytea',带有 jpeg。 在 pgAdmin 中,此列显示为 [二进制数据]。 在 php 脚本中,我需要从该列获取二进制数据并将其转换为 base64 字符串以将其传递给 json 对象。

$pdo = new PDO($dsn);
$query = 'select image from image where bid=' . $id . ';';
$stm = $pdo->query($query);
$ok = $stm->execute();
$ok = $stm->bindColumn('image', $lob, PDO::PARAM_LOB);
$ft = $stm->fetch(PDO::FETCH_BOUND);
if ($ft && is_resource($lob))
  {
     //content of $lob: resource id='10' type='stream'

     $stream = $pdo->pgsqlLOBOpen($lob, 'r');    
  }
/*
  Exception has occurred.
  TypeError: PDO::pgsqlLOBOpen(): Argument #1 ($oid) must be of type string, resource given

  I've tried replacing $lob with strings like this: '10' or 'id=10' but got an error.
*/
php pdo php-pgsql
1个回答
0
投票

据我所知,当您的 LOB 存储在专用 LOB 存储中时,需要 pgsqlLOBOpen() 。在这种情况下,您必须遵循手册页上的代码

但是当它存储在表中时,你只需将其取出即可。只需要从流中读取它即可。

// Note that you should always use placeholders
// instead of stuffing any data right into the query!
$query = 'select image from image where bid=?';
$stmt = $pdo->prepare($query);
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

现在

$row['image']
中有一个资源类型变量。因此,在资源中时,请像资源人那样做:

  • 如果您需要将其作为变量获取(例如对其进行base64编码)

      $image = stream_get_contents($row['image']);
    
  • 如果您需要将其存储为文件

      $fp = fopen('image.png', 'w');
      stream_copy_to_stream($row['image'], $fp);
    
  • 如果您需要将其直接流式传输到输出中

      fpassthru($row['image']);
    
© www.soinside.com 2019 - 2024. All rights reserved.