У меня возникла проблема в понимании того, как PHP обрабатывает ByteA с привязкой postgreSQL.Как восстановить gz сжатую строку, хранящуюся в PostgreSQL ByteA, используя PHP PDO Object?
Для ведения журнала и архивирования я храню в файлах столбцов ByteA
, которые я обслуживаю с помощью моего PHP/Apache Server. Для хранения, сжать данные, используя 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) основаны на выделенном СУБД API. Во-вторых, столбец ByteA
возвращаются как ресурсы, тогда мне нужно было использовать stream_getcontents()
, чтобы получить строку. Когда я храню несжатые файлы, я могу легко избавиться от него, что когда-либо использовал или нет. SET bytea_output = 'escape';
запрос и/или pg_unescape_bytea()
функция. Все комбинации позволяют мне получить файл.
Когда я использую сжатые данные, pg_unescape_bytea()
резко поглощает почти все мои байты. Во всяком случае, во всех комбинациях gzdecode()
не работает. Кажется, у меня есть недостающие или неправильные символы в моей двоичной строке, которая не блокируется в режиме обычного текста. Во всяком случае, дело не хорошо документировано в Интернете, и я застрял без всякой подсказки.
Как восстановить gz сжатую строку, хранящуюся в PostgreSQL ByteA, используя PHP PDO Object?
Я действительно смущен об этом. Я вижу, что он связан с кодировкой. Но я не могу заставить его работать. Я не могу хранить gz сжатые данные в ByteA, не используя pg_escpae_bytea, и это может быть проблемой. Что мне не хватает? – jlandercy
Вставка gzcompressed без pg_escape_bytea дает мне ERROR: неверная последовательность байтов для кодирования «UTF8»: 0x8b. Когда я использую fucntion, возвращаемые данные возвращают что-то другое, что я вставил. – jlandercy
Эта страница http://sickel.net/blogg/?p=1365 предоставляет решение, но она работает контрпродуктивно и точно соответствует тому, как я хочу работать. Я хочу хранить двоичные данные (и я не могу это сделать без изменения формата gzip) вместо шестнадцатеричного строкового представления двоичных данных. – jlandercy