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)");
?>
pg_escape_bytea
(PHP 4 >= 4.2.0, PHP 5)
pg_escape_bytea — Konwertuje łańcuch wstawiając sekwencje Escape dla typu bytea
Opis
pg_escape_bytea() konwertuje łańcuch wstawiając sekwencje Escape dla typu bytea. Zwraca łańcuch z sekwencjami Escape.
Informacja: Przy wywołaniu SELECT dla typu bytea, PostgrSQL zwraca łańcuchy zawierające wartości ósemkowe poprzedzone znakiem "\" (np. \032). Użytkownicy muszą samodzielnie odkodować te dane.
Ta funkcja wymaga PostgreSQL 7.2 lub nowszego. Dla PostgreSQL 7.2.0 i 7.2.1, wartości bytea muszą być wskazane jeśli uruchomisz wsparcie dla kodowania wielobajtowego np. INSERT INTO tabela_testowa (obraz) VALUES ('$image_escaped'::bytea); PostgreSQL 7.2.2 i nowszy nie potrzebuje wskazania typu. Wyjątkiem jest przypadek kiedy klient i serwer posługują się różnymi stronami kodowymi. W takim przypadku może wystąpić błąd (ang. multi-byte stream error). Użytkownik musi wtedy wskazać typ bytea, by uniknąć tego błędu.
Parametry
- połączenie
-
Identyfikator połączenia do bazy danych PostgreSQL. Kiedy połączenie nie został podany, domyślne połączenie zostaje użyte. Domyślnym połączeniem jest ostatnie połączenie stworzone przez pg_connect() lub pg_pconnect().
- dane
-
Łańcuch (ang. string) zawierający tekst lub binarne dane wstawiane do kolumny bytea.
Zwracane wartości
Łańcuch (ang. string) zawierający dane z sekwencjami Escape..
Rejestr zmian
| Wersja | Opis |
|---|---|
| 5.2.0 | Parametr połączenie został dodany |
Przykłady
Przykład #1 pg_escape_bytea() - przykład
<?php
// Połącz z bazą
$połączenie = pg_connect('dbname=foo');
// Przeczytaj z binarnego pliku
$dane = file_get_contents('obrazek1.jpg');
// Poprzedź sekwencjami Escape dane binarne
$escaped = pg_escape_bytea($dane);
// Wpisz to do bazy danych
pg_query("INSERT INTO galeria (nazwa, dane) VALUES ('Drzewa sosnowe', '{$escaped}')");
?>
Zobacz też:
- pg_unescape_bytea() - Unescape binary for bytea type
- pg_escape_string() - Konwertuje łańcuch wpisywany do pola tekstowego, wstawiając sekwencje Escape
pg_escape_bytea
17-Jul-2009 09:13
18-Feb-2009 09:44
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:
$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.php
08-Aug-2003 12:20
to unescape_bytea use stripcslashes(). If you need to escape bytea and don't have pg_escape_bytea() function then use:
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;
}
17-Aug-2002 04:56
if you need to change back bytea from the db to normal data, this will do that:
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
