pg_escape_bytea

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

pg_escape_bytea Dodaje znaki ucieczki do łańcucha dodającego do pola typu bytea

Opis

pg_escape_bytea ([ resource $połączenie ], string $dane ) : string

pg_escape_bytea() dodaje znaki ucieczki do łańcucha dodającego do pola typu bytea. Zwraca zabezpieczony łańcuch.

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ż:

add a note add a note

User Contributed Notes 7 notes

up
3
ynzhang from lakeheadu of ca
11 years ago
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.php
up
4
Mike-RaWare
10 years ago
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);
?>
up
1
Mocha
17 years ago
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;
}
?>
up
0
Hayley Watson
3 years ago
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)."'";
}
?>
up
0
gglockner AT NOSPAMdwaffler DOT com
11 years ago
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)");
?>
up
-1
Michael
6 years ago
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')");
?>
up
-1
php at tobias dot olsson dot be
17 years ago
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
To Top