PHP Conference Japan 2024

pg_escape_bytea

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

pg_escape_bytea 將字串跳脫以插入 bytea 欄位

說明

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

pg_escape_bytea() 會將 bytea 資料類型的字串進行跳脫。它會返回已跳脫的字串。

注意:

當您 SELECT bytea 類型時,PostgreSQL 會返回以 '\' 為前綴的八進位位元組值(例如 \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}')");
?>

參見

新增筆記

使用者貢獻的筆記 8 則筆記

ynzhang from lakeheadu of ca
15 年前
`pg_unescape_bytea()` 無法精確還原 `pg_escape_bytea()` 建立的二進位資料,是因為反斜線 \ 和單引號 ' 會被 `pg_escape_bytea()` 函式雙重跳脫。這會導致從 bytea 欄位擷取的圖片看起來損毀。將二進位字串跳脫/反跳脫至 PG bytea 欄位的正確方法如下:

<?php
$escaped_data
= str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* 之後使用以下方法將 bytea 欄位中已跳脫的資料反跳脫,以取得原始二進位資料 */

$original_data = pg_unescape_bytea($escaped_data));
?>

更多詳細資訊請參考:http://archives.postgresql.org/pgsql-php/2007-02/msg00014.php
Hayley Watson
7 年前
PostgreSQL 9.0 引進了一種新的基於十六進位的 bytea 資料表示法,它比此函式實作的跳脫機制更佳。

<?php
function pg_escape_byteahex($binary)
{
return
"E'\\\\x".bin2hex($binary)."'";
}
?>
Mike-RaWare
14 年前
為了避免任何編碼問題,您可以使用十六進位或 base64 輸入來儲存和從資料庫擷取資料。

<?php
// 連線到資料庫
$dbconn = pg_connect( 'dbname=foo' );

// 讀取二進位檔案
$data = file_get_contents( 'image1.jpg' );

// 跳脫二進位資料
$escaped = bin2hex( $data );

// 將其插入資料庫
pg_query( "INSERT INTO gallery (name, data) VALUES ('Pine trees', decode('{$escaped}' , 'hex'))" );

// 取得 bytea 資料
$res = pg_query("SELECT encode(data, 'base64') AS data FROM gallery WHERE name='Pine trees'");
$raw = pg_fetch_result($res, 'data');

// 轉換為二進位並傳送到瀏覽器
header('Content-type: image/jpeg');
echo
base64_decode($raw);
?>
Mocha
21 年前
要對 bytea 類型進行反跳脫字元,請使用 stripcslashes()。如果您需要對 bytea 類型進行跳脫字元,但沒有 pg_escape_bytea() 函式,請使用以下程式碼:

<?php
function escByteA($binData) {
/**
* \134 = 92 = 反斜線, \000 = 00 = NULL, \047 = 39 = 單引號
*
* str_replace() 會依序取代搜尋陣列中的項目。因此,我們必須
* 先處理「反斜線」字元。如果我們最後處理它,它會
* 取代之前所有其他搜尋所跳脫的反斜線。
*/
$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;
}
?>
tabflo at gmx dot at
4 個月前
這個方法與 pg_escape_bytea 的作用相同,祝您使用愉快

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;
}
Michael
10 年前
使用 pg_escape_bytea 但不使用 'E' 跳脫字元標記
<?php
// 跳脫二進位資料
$escaped = pg_escape_bytea($data);

// 並插入資料庫 (錯誤/wrong)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");

// 並插入資料庫 (正確/right)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
?>
gglockner AT NOSPAMdwaffler DOT com
15 年前
如果您收到關於在字串字面值中非標準使用 \\ 的錯誤,則需要按如下方式跳脫編碼的 bytea

<?php
$escaped
= pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
?>
php at tobias dot olsson dot be
22 年前
如果您需要將資料庫中的 bytea 類型轉換回一般資料,可以使用以下方法:

<?php
function pg_unescape_bytea($bytea) {
return eval(
"return \"".str_replace('$', '\\$', str_replace('"', '\\"', $bytea))."\";");
}

// 使用範例
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));
?>

/Tobias
To Top