2024 年 PHP Conference Japan

pg_escape_string

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

pg_escape_string 跳脫查詢字串

說明

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

pg_escape_string() 會跳脫用於查詢資料庫的字串。它會以 PostgreSQL 格式返回已跳脫的字串,不含引號。pg_escape_literal() 是更推薦用於跳脫 PostgreSQL SQL 參數的方法。addslashes() 不得與 PostgreSQL 一起使用。如果欄位的類型是 bytea,則必須改用 pg_escape_bytea()pg_escape_identifier() 必須用於跳脫識別符號(例如表格名稱、欄位名稱)。

注意事項:

此函數需要 PostgreSQL 7.2 或更高版本。

參數

connection

一個 PgSql\Connection 實例。當未指定 connection 時,將使用預設連線。預設連線是 pg_connect()pg_pconnect() 建立的最後一個連線。

警告

自 PHP 8.1.0 起,不建議使用預設連線。

data

包含要跳脫之文字的 字串

回傳值

包含已跳脫資料的 字串

更新日誌

版本 說明
8.1.0 connection 參數現在需要一個 PgSql\Connection 實例;先前需要的是 資源

範例

範例 #1 pg_escape_string() 範例

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

// 讀取文字檔(包含單引號和反斜線)
$data = file_get_contents('letter.txt');

// 跳脫文字資料
$escaped = pg_escape_string($data);

// 將其插入資料庫
pg_query("INSERT INTO correspondence (name, data) VALUES ('My letter', '{$escaped}')");
?>

參見

新增註解

使用者貢獻的註解 7 則註解

strata_ranger at hotmail dot com
14 年前
對於好奇的人來說,根據您的資料庫設定,對字串執行的確切跳脫可能會略有不同。

例如,如果您的資料庫的 standard_conforming_strings 變數為 OFF,則反斜線會被視為特殊字元,pg_escape_string() 將確保它們被正確跳脫。如果此變數為 ON,則反斜線將被視為一般字元,pg_escape_string() 將保持原樣。無論哪種情況,其行為都與資料庫連線的設定相符。
ringerc at ringerc dot id dot au
10 年前
您應該優先使用 pg_query_params,也就是使用參數化查詢,而不是使用 pg_escape_string。或者使用較新的 PDO 介面及其參數化查詢支援。

如果您必須直接替換值,例如在不支援以參數化查詢執行的 DDL 命令中,請使用 pg_escape_literal 進行替換。

http://au1.php.net/manual/en/function.pg-escape-literal.php

識別碼不能用作查詢參數。如果它們是動態替換的,請始終使用 pg_escape_identifier。

http://au1.php.net/manual/en/function.pg-escape-identifier.php

使用此函數時,您應該不需要更改文字編碼。請確保您的連線的 client_encoding 設定為 PHP 所使用的文字編碼,PostgreSQL 用戶端驅動程式會為您處理文字編碼。正確設定 client_encoding 後,不需要進行明確的 UTF-8 轉換。
Nathan Bruer
16 年前
如果您的資料庫是 UTF-8 資料庫,則在嘗試將某些資料添加到資料庫時會遇到問題...

基於安全性問題和/或相容性,您可能需要使用 utf_encode() 函數 (https://php.dev.org.tw/utf8-encode)。

例如:
<?php
$my_data
= pg_escape_string(utf8_encode($_POST['my_data']));
?>
ppp
13 年前
pg_escape_string() 不會像 PHP 通常那樣將陣列參數轉換為「Array」字串;它會改為返回 NULL。以下陳述式都評估為 true

<?php
$a
= array('foo', 'bar');

"$a" == 'Array';
(string)
$a == 'Array';
$a . '' == 'Array';

is_null(pg_escape_string($a));
?>
johniskew2 at yahoo dot com
18 年前
對於那些使用反斜線 (例如 \') 而不是連續兩個單引號 (例如 '') 來跳脫單引號的人來說,最近出現了一個嚴重的 SQL 注入漏洞,可以利用您選擇的跳脫方法來加以利用。更多資訊請參考:https://postgresql.dev.org.tw/docs/techdocs.50
即使在 PostgreSQL 更新之後,如果您仍然堅持使用反斜線跳脫,您在查詢方面仍然可能會受到限制。這是一個教訓,要始終使用 PHP 函數來執行正確的跳脫,而不是臨時使用 addslashes 或 magic quotes 跳脫。
meng
18 年前
自 PHP 5.1 起,引入了新的函數 pg_query_params()。使用此函數,您可以使用繫結變數,而不必跳脫字串。如果您可以使用它,請這樣做。如果不確定原因,請查看 Postgres 8.0.8 的更新日誌。
otix
18 年前
建立雙重反引號是沒問題的。它的作用與反斜線加反引號的語法相同。摘自 PostgreSQL 文件

字串常數以單引號括起來,這會產生一個明顯的語義問題,因為如果字串本身包含單引號,常數的字面界限就會變得模稜兩可。要在字串中跳脫(使其成為字面上的)單引號,您可以輸入兩個相鄰的單引號。剖析器會將字串常數中兩個相鄰的單引號解釋為單個、字面上的單引號。PostgreSQL 也允許使用 C 語言風格的反斜線來嵌入單引號。
To Top