對於好奇的人來說,根據您的資料庫設定,對字串執行的確切跳脫可能會略有不同。
例如,如果您的資料庫的 standard_conforming_strings 變數為 OFF,則反斜線會被視為特殊字元,pg_escape_string() 將確保它們被正確跳脫。如果此變數為 ON,則反斜線將被視為一般字元,pg_escape_string() 將保持原樣。無論哪種情況,其行為都與資料庫連線的設定相符。
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_escape_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}')");
?>
對於好奇的人來說,根據您的資料庫設定,對字串執行的確切跳脫可能會略有不同。
例如,如果您的資料庫的 standard_conforming_strings 變數為 OFF,則反斜線會被視為特殊字元,pg_escape_string() 將確保它們被正確跳脫。如果此變數為 ON,則反斜線將被視為一般字元,pg_escape_string() 將保持原樣。無論哪種情況,其行為都與資料庫連線的設定相符。
您應該優先使用 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 轉換。
如果您的資料庫是 UTF-8 資料庫,則在嘗試將某些資料添加到資料庫時會遇到問題...
基於安全性問題和/或相容性,您可能需要使用 utf_encode() 函數 (https://php.dev.org.tw/utf8-encode)。
例如:
<?php
$my_data = pg_escape_string(utf8_encode($_POST['my_data']));
?>
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));
?>
對於那些使用反斜線 (例如 \') 而不是連續兩個單引號 (例如 '') 來跳脫單引號的人來說,最近出現了一個嚴重的 SQL 注入漏洞,可以利用您選擇的跳脫方法來加以利用。更多資訊請參考:https://postgresql.dev.org.tw/docs/techdocs.50
即使在 PostgreSQL 更新之後,如果您仍然堅持使用反斜線跳脫,您在查詢方面仍然可能會受到限制。這是一個教訓,要始終使用 PHP 函數來執行正確的跳脫,而不是臨時使用 addslashes 或 magic quotes 跳脫。