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 Web サイトでも) は、専用の DBMS API に基づいています。次に、ByteA
列がリソースとして返されるstream_getcontents()
ため、文字列を取得するために使用する必要がありました。SET bytea_output = 'escape';
圧縮されていないファイルを保存すると、クエリや関数を使用するかどうかに関係なく、簡単に復元できpg_unescape_bytea()
ます。すべての組み合わせでファイルを取得できます。
圧縮データを使用すると、pg_unescape_bytea()
ほぼすべてのバイトが劇的に消費されます。とにかく、すべての組み合わせでgzdecode()
機能しません。プレーン テキスト モードでブロックされないバイナリ文字列に文字がないか間違っているようです。とにかく、このことはインターネット上で十分に文書化されておらず、何の手がかりもなく立ち往生しています.
PHP PDO オブジェクトを使用して PostgreSQL ByteA に保存されている gzcompressed 文字列を復元するにはどうすればよいですか?