【发布时间】:2016-10-13 11:38:55
【问题描述】:
我在理解 PHP 如何使用 postgreSQL 绑定处理 ByteA 时遇到问题。
出于记录和归档的目的,我将文件存储在ByteA 列文件中,这些文件与我的 PHP/Apache 服务器一起提供。对于存储,我使用gzencode() 压缩数据,然后在使用pg_escape_bytea() 存储之前转义字符串:
// Compress:
if($compress) {
$data = gzencode($data, 9);
}
// PostgreSQL ByteA Escaping:
$data = pg_escape_bytea($data);
我还有一个页面允许用户检索以前提供的文件。但我无法成功压缩一个,我不知道为什么:
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
/*
$dbCur = $webConn->prepare("SET bytea_output = 'escape';");
$dbCur->execute();
//print_r($dbCur->errorinfo());
*/
$dbCur = $webConn->prepare("SELECT * FROM logs.webservice WHERE Id=?;");
$dbCur->bindParam(1, $id);
$dbCur->execute();
//print_r($dbCur->errorinfo());
$row = $dbCur->fetch(PDO::FETCH_ASSOC);
$data = stream_get_contents($row['binarydata']);
$data = pg_unescape_bytea($data);
if($row['gzip']) {
$data = gzdecode($data);
}
header("Content-type: ".$row['mimetype']."; charset=".$row['charset']);
echo $data;
我必须使用 PDO 对象,我发现的所有示例(甚至在 PHP 网站上)都是基于专用 DBMS API。其次,ByteA 列作为资源返回,然后我不得不使用stream_getcontents() 来获取字符串。当我存储未压缩的文件时,我可以轻松地从中恢复,无论我使用或不使用SET bytea_output = 'escape'; 查询和/或pg_unescape_bytea() 函数。所有组合都允许我获取文件。
当我使用压缩数据时,pg_unescape_bytea() 极大地消耗了我几乎所有的字节。无论如何,在所有组合中,gzdecode() 都无法工作。看来,我的二进制字符串中有缺失或错误的字符,在纯文本模式下不会阻塞。无论如何,这件事在互联网上没有很好的记录,我被困在没有任何线索的地方。
我应该如何使用 PHP PDO 对象恢复存储在 PostgreSQL ByteA 中的 gzcompressed 字符串?
【问题讨论】:
标签: php postgresql pdo gzip bytea