pg_escape_bytea

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

pg_escape_bytea Protege una cadena para insertarla en un campo bytea

Descripción

pg_escape_bytea(PgSql\Connection $connection = ?, string $data): string

pg_escape_bytea() protege los caracteres de la cadena data con el modo bytea. La cadena protegida es devuelta.

Nota:

Cuando se utiliza una orden SELECT con datos de tipo bytea, PostgreSQL devuelve valores octales, prefijados con antislashs '\' (por ejemplo \032). Los usuarios deben realizar la conversión al formato binario manualmente.

pg_escape_bytea() requiere PostgreSQL 7.2 o más reciente. Con PostgreSQL 7.2.0 y 7.2.1, los datos bytea deben ser transtipados cuando se activa el soporte de strings multioctetos. Es decir, INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea);. PostgreSQL 7.2.2 o más reciente no requiere esta manipulación. Sin embargo, si el cliente y el servidor no utilizan el mismo juego de caracteres, pueden ocurrir errores. Entonces, se debe forzar el transtipado manualmente.

Parámetros

connection

An PgSql\Connection instance. When connection is unspecified, the default connection is used. The default connection is the last connection made by pg_connect() or pg_pconnect().

Advertencia

As of PHP 8.1.0, using the default connection is deprecated.

data

Una string que contiene texto o datos binarios que serán insertados en la columna bytea.

Valores devueltos

Una string que contiene los datos escapados.

Historial de cambios

Versión Descripción
8.1.0 The connection parameter expects an PgSql\Connection instance now; previously, a recurso was expected.

Ejemplos

Ejemplo #1 Ejemplo con pg_escape_bytea()

<?php
// Conexión a la base de datos
$dbconn = pg_connect('dbname=foo');

// Lectura de un fichero binario
$data = file_get_contents('image1.jpg');

// Escapado de los datos binarios
$escaped = pg_escape_bytea($data);

// Inserción en la base de datos
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>

Ver también

add a note

User Contributed Notes 8 notes

up
9
ynzhang from lakeheadu of ca
16 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
5
Hayley Watson
7 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
4
Mike-RaWare
14 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
21 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
tabflo at gmx dot at
8 months ago
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;
}
up
0
Michael
11 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
0
gglockner AT NOSPAMdwaffler DOT com
15 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
-3
php at tobias dot olsson dot be
22 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