pg_escape_bytea

(PHP 4 >= 4.2.0, PHP 5)

pg_escape_bytea Maskiert Zeichenketten zum Einfügen in ein Feld vom Typ bytea

Beschreibung

string pg_escape_bytea ([ resource $connection ], string $data )

pg_escape_bytea() maskiert data fr den Datentyp bytea und gibt den maskierten String zurück.

Hinweis:

Wenn Sie mit SELECT Daten vom Typ bytea abfragen, gibt PostgreSQL die Oktalwerte der einzelnen Datenbytes zurück, denen ein Backslash vorangestellt ist (z.B. \032). Diese Werte müssen vom Benutzer in das Binärformat zurückkonvertiert werden.

Diese Funktion setzt PostgreSQL 7.2 oder höher voraus. Mit den PostgreSQL-Versionen 7.2.0 und 7.2.1 muss der Typ bytea konvertiert werden, falls die multi-byte-Unterstützung benutzt wird, z.B. INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea);. Ab der PostgreSQL-Version 7.2.2 und höher, muss keine Typkonvertierung mehr durchgeführt werden. Es sei denn, die Codierungen von Client und Server passen nicht zusammen, was zu einem multi-byte Streamfehler führen kann. Um diesen Fehler zu vermeiden, muss der Stream in den Typ bytea konvertiert werden.

Parameter-Liste

connection

PostgreSQL Verbindungskennung. Wenn der Parameter connection nicht angegeben ist, wird die Standardverbindung benutzt. Das ist die Verbindung, die zuletzt von pg_connect() oder pg_pconnect() geöffnet wurde.

data

Ein string, der Text oder Binärdaten enthält, die in eine Spalte vom Typ bytea eingefügt werden sollen.

Rückgabewerte

Ein string mit den maskierten Daten.

Changelog

Version Beschreibung
5.2.0 Der Parameter connection wurde hinzugefügt.

Beispiele

Beispiel #1 pg_escape_bytea() Beispiel

<?php 
  
// Zur Datenbank verbinden
  
$dbconn pg_connect('dbname=foo');
  
  
// eine Binärdatei auslesen
  
$data file_get_contents('image1.jpg');
  
  
// Die Binärdaten maskieren
  
$escaped pg_escape_bytea($data);
  
  
// und in die Datenbank einfügen
  
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>

Siehe auch

add a note add a note

User Contributed Notes 6 notes

up
0
Michael
1 month 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
0
Mike-RaWare
3 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
0
gglockner AT NOSPAMdwaffler DOT com
4 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
0
ynzhang from lakeheadu of ca
5 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
0
Mocha
10 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
php at tobias dot olsson dot be
11 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