我在理解 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 字符串?