The reason pg_unescape_bytea() do not exactly reproduce the binary data created by pg_escape_bytea() is because the backslash \ and single quote ' are double escaped by the pg_escape_bytea() function. This will lead to image seems corrupted when retrieve from the bytea field. The proper way to escape&unescape a binary string into a PG bytea field as follow:
<?php
$escaped_data = str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* and later unescape the escaped data from the bytea field with following to get the original binary data */
$original_data = pg_unescape_bytea($escaped_data));
?>
more details at: http://archives.postgresql.org/pgsql-php/2007-02/msg00014.phppg_escape_bytea
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
pg_escape_bytea
Референца за `function.pg-escape-bytea.php` со подобрена типографија и навигација.
pg_escape_bytea
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_escape_bytea — Escape a string for insertion into a bytea field
= NULL
pg_escape_bytea() Избегај низа за вметнување во bytea поле
Забелешка:
избегнува низа за bytea тип. Враќа избегната низа.
SELECTКога виеbytea тип, PostgreSQL враќа октални бајт вредности претходени со '\' (на пр. \032). Корисниците треба рачно да ги претворат назад во бинарен формат.
INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea);Оваа функција бара PostgreSQL 7.2 или понова верзија. Со PostgreSQL 7.2.0 и 7.2.1, bytea вредностите мора да се претворат кога ќе овозможите поддршка за повеќе бајти. т.е.
Параметри
connection-
Еден PgSql\Connection инстанца. Кога
connectionне е наведено, се користи стандардната врска. Стандардната врска е последната врска направена од pg_connect() or pg_pconnect().Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваОд PHP 8.1.0, користењето на стандардната врска е застарено.
data-
А string PostgreSQL 7.2.2 или понова верзија не бара претворање. Исклучок е кога кодирањето на клиентот и бекендот не се совпаѓаат, и може да има грешка во протокот со повеќе бајти. Корисникот тогаш мора да претвори во bytea за да ја избегне оваа грешка.
Вратени вредности
А string што ја содржи избегнатата податок.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На connection параметарот очекува PgSql\Connection
инстанца сега; претходно, а resource се очекуваше.
|
Примери
Пример #1 pg_escape_bytea() example
<?php
// Connect to the database
$dbconn = pg_connect('dbname=foo');
// Read in a binary file
$data = file_get_contents('image1.jpg');
// Escape the binary data
$escaped = pg_escape_bytea($data);
// Insert it into the database
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>Види Исто така
- pg_unescape_bytea() содржи текст или бинарни податоци што треба да се вметнат во bytea колона.
- pg_escape_string() - Избегнувај идентификатор за вметнување во текстуално поле
Белешки од корисници 8 белешки
PostgreSQL 9.0 introduced a new hexadecimal-based representation for bytea data that is preferred over the escaping mechanism implemented by this function.
<?php
function pg_escape_byteahex($binary)
{
return "E'\\\\x".bin2hex($binary)."'";
}
?>To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database:
<?php
// Connect to the database
$dbconn = pg_connect( 'dbname=foo' );
// Read in a binary file
$data = file_get_contents( 'image1.jpg' );
// Escape the binary data
$escaped = bin2hex( $data );
// Insert it into the database
pg_query( "INSERT INTO gallery (name, data) VALUES ('Pine trees', decode('{$escaped}' , 'hex'))" );
// Get the bytea data
$res = pg_query("SELECT encode(data, 'base64') AS data FROM gallery WHERE name='Pine trees'");
$raw = pg_fetch_result($res, 'data');
// Convert to binary and send to the browser
header('Content-type: image/jpeg');
echo base64_decode($raw);
?>this method des the same as pg_escape_bytea have fun with it:
public function escape_bytea($data) {
$escaped = '';
for ($i = 0; $i < strlen($data); $i++) {
$char = $data[$i];
$ascii = ord($char);
$escaped.= ($ascii < 32 || $ascii > 126 ? sprintf('\\%03o', $ascii) : ($char == '\\' ? '\\\\' : $char) );
}
return $escaped;
}to unescape_bytea use stripcslashes(). If you need to escape bytea and don't have pg_escape_bytea() function then use:
<?php
function escByteA($binData) {
/**
* \134 = 92 = backslash, \000 = 00 = NULL, \047 = 39 = Single Quote
*
* str_replace() replaces the searches array in order. Therefore, we must
* process the 'backslash' character first. If we process it last, it'll
* replace all the escaped backslashes from the other searches that came
* before.
*/
$search = array(chr(92), chr(0), chr(39));
$replace = array('\\\134', '\\\000', '\\\047');
$binData = str_replace($search, $replace, $binData);
return $binData;
//echo "<pre>$binData</pre>";
//exit;
}
?>using pg_escape_bytea without 'E' escape tag
<?php
// Die Binärdaten maskieren
$escaped = pg_escape_bytea($data);
// und in die Datenbank einfügen (falsch/wrong)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");
// und in die Datenbank einfügen (richtig/right)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
?>If you're getting errors about nonstandard use of \\ in a string literal, then you need to escape the encoded bytea as follows:
<?php
$escaped = pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
?>if you need to change back bytea from the db to normal data, this will do that:
<?php
function pg_unescape_bytea($bytea) {
return eval("return \"".str_replace('$', '\\$', str_replace('"', '\\"', $bytea))."\";");
}
// use like this
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));
?>
/Tobias