pg_escape_bytea

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

pg_escape_bytea bytea フィールドに挿入するために文字列をエスケープする

説明

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

pg_escape_bytea() は、bytea 型のために文字列を エスケープし、エスケープした文字列を返します。

注意:

bytea 型を SELECT した場合、PostgreSQL は '\' で 始まる 8 進数のバイト値(例: \032)を返します。これをユーザーが手動で コンバートすることを期待されています。

この関数は PostgreSQL 7.2 以降のバージョンが必要です。PostgreSQL 7.2.0 および 7.2.1 では、マルチバイトのサポートを有効にした場合は bytea の値をキャストする必要があります。例: INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea); PostgreSQL 7.2.2 以降ではキャストする必要はありません。 クライアントとバックエンドの文字エンコーディングが一致しない場合は 例外で、この場合はマルチバイトストリームエラーが発生します。この エラーを避けるためには bytea 型へのキャストが必要になります。

パラメータ

connection

PgSql\Connection クラスのインスタンス。 connection が指定されない場合は、デフォルトの接続を使います。 デフォルトの接続とは、pg_connect() または pg_pconnect() によって確立された直近の接続です。

警告

PHP 8.1.0 以降では、デフォルトの接続を使うことは推奨されなくなりました。

data

bytea 型のカラムに挿入するテキストまたはバイナリデータを含む 文字列。

戻り値

エスケープされたデータを文字列で返します。

変更履歴

バージョン 説明
8.1.0 connection は、PgSql\Connection クラスのインスタンスを期待するようになりました。 これより前のバージョンでは、リソース を期待していました。

例1 pg_escape_bytea() の例

<?php
// データベースに接続する
$dbconn = pg_connect('dbname=foo');

// バイナリファイルを読み込む
$data = file_get_contents('image1.jpg');

// バイナリデータをエスケープする
$escaped = pg_escape_bytea($data);

// それをデータベースに挿入する
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>

参考

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
8 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.<?phpfunction pg_escape_byteahex($binary){    return "E'\\\\x".bin2hex($binary)."'";}?>
up
4
Mike-RaWare
15 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
tabflo at gmx dot at
1 year 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
1
Mocha
22 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
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
16 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