PHP Conference Japan 2024

pg_update

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

pg_update 更新表格

說明

pg_update(
    PgSql\Connection $connection,
    string $table_name,
    array $values,
    array $conditions,
    int $flags = PGSQL_DML_EXEC
):string|bool

pg_update() 使用 values 更新符合 conditions 的記錄。

如果指定了 flags,則會使用指定的旗標將 pg_convert() 應用於 values

預設情況下,pg_update() 傳遞原始值。值必須被逸出,或必須在 flags 中指定 PGSQL_DML_ESCAPE 旗標。PGSQL_DML_ESCAPE 會引用並逸出參數/識別符號。因此,表格/欄位名稱會變成區分大小寫。

請注意,無論是逸出還是準備好的查詢都無法保護 LIKE 查詢、JSON、陣列、Regex 等。這些參數應根據其上下文處理。也就是說,逸出/驗證值。

參數

connection

一個 PgSql\Connection 實例。

table_name

要更新列的表格名稱。

values

一個 array,其鍵是 table_name 表格中的欄位名稱,而其值是要將符合的列更新成的內容。

conditions

一個 array,其鍵是 table_name 表格中的欄位名稱,而其值是列必須符合才能被更新的條件。

flags

任意數量的 PGSQL_CONV_FORCE_NULLPGSQL_DML_NO_CONVPGSQL_DML_ESCAPEPGSQL_DML_EXECPGSQL_DML_ASYNCPGSQL_DML_STRING 的組合。如果 PGSQL_DML_STRINGflags 的一部分,則會傳回查詢字串。當設定 PGSQL_DML_NO_CONVPGSQL_DML_ESCAPE 時,它不會在內部呼叫 pg_convert()

傳回值

成功時傳回 true,失敗時傳回 false。如果透過 flags 傳遞 PGSQL_DML_STRING,則傳回 string

變更日誌

版本 說明
8.1.0 connection 參數現在需要 PgSql\Connection 實例;之前需要 resource

範例

範例 1 pg_update() 範例

<?php
$db
= pg_connect('dbname=foo');
$data = array('field1'=>'AA', 'field2'=>'BB');
// 這在某種程度上是安全的,因為所有值都被逸出了。
// 然而,PostgreSQL 支援 JSON/陣列。這些通過逸出或準備好的查詢都是不安全的。
$res = pg_update($db, 'post_log', $_POST, $data);
if (
$res) {
echo
"資料已更新:$res\n";
} else {
echo
"使用者可能發送了錯誤的輸入\n";
}
?>

另請參閱

  • pg_convert() - 將關聯陣列值轉換為適合 SQL 陳述式的形式

新增註解

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

dominik dot bonsch at homesono dot de
16 年前
使用 pg_update() 和 pg_insert() 而不進行金鑰驗證是不安全的!

您需要檢查您獲得的資料對,以及您是否要允許更新此欄位。

範例

您有一個包含三個欄位的表格:username、password、userlevel。

您的使用者只能變更他們的 username 和 password,但不能變更他們的 userlevel。

如果您不篩選請求陣列中的金鑰,那麼每個使用者現在都可以透過發送 "userlevel=>100" 的 POST 請求來變更其 userlevel。

因此,如果您不檢查您的請求陣列中是否允許該金鑰,那麼您的程式碼中就會出現嚴重的 SQL 注入漏洞。
jhooks
18 年前
> 傳回值
>
> 成功時傳回 TRUE,失敗時傳回 FALSE。如果
> 透過選項傳遞 PGSQL_DML_STRING,則傳回字串。

我發現在我的 PHP 副本(版本 4.4.0)中,如果您使用 'PGSQL_DML_STRING' 選項,該函式不會執行任何查詢。它只會傳回本應執行的查詢。

我注意到的另一件事是,pg_update 似乎沒有使用 pg_trace(至少在 4.4.0 中)。

附註:這不是錯誤報告,只是對我注意到的一些未記載的功能的解釋。正如手冊所說,該函式仍在開發中,因此此行為可能會因版本而異。
sdibb at myway dot com
19 年前
此函式與 PEAR::DB 的 autoExecute() 函式相似,唯一的區別在於 where 子句是一個陣列而不是字串。

此外,如果您想將 DB 類別的實例與此函式一起使用,可以使用 $db->connection 參照現有的資源連線。

一個範例是
<?
pg_update($db->connection, $arr_update, $arr_where);
?>
To Top