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);
?>
pg_escape_bytea
(PHP 4 >= 4.2.0, PHP 5)
pg_escape_bytea — Escapar un string para insertarlo en un campo bytea
Descripción
$connection
], string $data
)pg_escape_bytea() escapa un string para un tipo de dato bytea. Devuelve un string pasado por un proceso de escape.
Nota:
Cuando haces una consulta SELECT a un tipo bytea, PostgreSQL devuelve valores de byte octal con el prefijo '\' (ej. \032). Los usuarios están supuestos a convertirlo de regreso al formato binario manualmente.
Esta función requiere PostgreSQL versión 7.2 o posterior. Con la versión 7.2.0 y 7.2.1 de PostgreSQL, los valores bytea deben ser pasados por un casteo cuando se habilita soporte multi-byte. Ej. INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea); PostgreSQL 7.2.2 o una versión posterior no necesita un casteo. La excepción es cuando la codificación de caracteres del cliente y del servidor no coinciden, y podría haber un flujo de error multi-byte. Entonces el usuario debe castear a bytea para evitar este error.
Parámetros
-
connection -
Recurso de conexión a la base de datos PostgreSQL. Cuando el parámetro
connectionno está presente, se utiliza la conexión predeterminada. La conexión predeterminada es la última conexión hecha por pg_connect() o pg_pconnect(). -
data -
Un tipo de dato string que contiene datos de texto o binarios para ser insertados dentro de una columna bytea.
Valores devueltos
Un tipo de dato string que contiene los datos que han sido escapados.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.2.0 | Se agregó el parámetro connection |
Ejemplos
Ejemplo #1 Ejemplo de pg_escape_bytea()
<?php
// Connectar a la base de datos
$dbconn = pg_connect('dbname=foo');
// Leer en un fichero binario
$data = file_get_contents('image1.jpg');
// Escapar el dato binario
$escaped = pg_escape_bytea($data);
// Insertarlo en la base de datos
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>
Ver también
- pg_unescape_bytea() - Unescape binary for bytea type
- pg_escape_string() - Escape a string for query
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)");
?>
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
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;
}
?>
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
