PHP 日本研討會 2024

pg_select

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

pg_select 選擇記錄

說明

pg_select(
    PgSql\Connection $connection,
    string $table_name,
    array $conditions = [],
    int $flags = PGSQL_DML_EXEC,
    int $mode = PGSQL_ASSOC
):array|string|false

pg_select() 根據 conditions 指定的條件來選擇記錄,該條件的形式為 欄位=>值。若查詢成功,則會傳回一個包含所有符合 conditions 指定條件的記錄和欄位的陣列。

若設定了 flags,則會將 pg_convert() 套用至 conditions,並使用指定的旗標。

若設定了 mode,則傳回值會以帶有 PGSQL_NUM 的陣列、帶有 PGSQL_ASSOC (預設值) 的關聯陣列,或兩者皆有的 PGSQL_BOTH 的形式傳回。

預設情況下,pg_select() 會傳遞原始值。這些值必須經過逸脫或指定 PGSQL_DML_ESCAPE 選項。PGSQL_DML_ESCAPE 會將參數/識別符號加上引號並逸脫。因此,表格/欄位名稱會區分大小寫。

請注意,逸脫或預備查詢都無法保護 LIKE 查詢、JSON、陣列、正規表達式等。這些參數應根據其上下文進行處理。例如:逸脫/驗證值。

參數

connection

一個 PgSql\Connection 的實例。

table_name

要從中選擇列的表格名稱。

conditions

一個 array,其鍵是表格 table_name 中的欄位名稱,其值是列必須滿足才能檢索的條件。自 PHP 8.4.0 起,當提供空陣列時,不會套用任何條件。先前,若 conditions 參數為空,函式會失敗。

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()

mode

可以組合任何數量的 PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。如果設定了 PGSQL_ASSOC,則傳回值將是關聯 array;如果設定了 PGSQL_NUM,則傳回值將是 array;如果設定了 PGSQL_BOTH,則傳回值將是同時具有關聯索引和數值索引的 array

傳回值

如果透過 flags 傳遞了 PGSQL_DML_STRING,則傳回 string,否則成功時會傳回 array,失敗時則傳回 false

更新紀錄

版本 說明
8.4.0 conditions 現在為可選參數。
8.1.0 connection 參數現在預期為 PgSql\Connection 的實例;先前,預期為 resource
7.1.0 新增了 mode 參數。

範例

範例 1 pg_select() 範例

<?php
$db
= pg_connect('dbname=foo');
// 這樣做在某種程度上是安全的,因為所有值都被逸脫了。
// 然而,PostgreSQL 支援 JSON/陣列。這些使用逸脫或預備查詢都不是安全的。
$rec = pg_select($db, 'post_log', $_POST, PG_DML_ESCAPE);
if (
$rec) {
echo
"已選擇記錄\n";
var_dump($rec);
} else {
echo
"使用者一定是傳送了錯誤的輸入\n";
}
?>

參見

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

新增註解

使用者貢獻註解 2 個註解

david dot tulloh at infaze dot com dot au
19 年前
有效的選項為 PGSQL_DML_NO_CONV、PGSQL_DML_EXEC、PGSQL_DMP_ASYNC、PGSQL_DML_STRING(從原始碼中取出)。

此函式不支援從多個表格中選擇。您可以透過設定 PGSQL_DML_NO_CONV 選項來解決這個問題。這樣可以防止函式嘗試轉換條件陣列時發生的錯誤。

我認為也應該指出,table_name 欄位是不安全的,特別是使用 PGSQL_DML_NO_CONV 選項時。

如文件所述,arguements 陣列欄位是強制性的。但不那麼清楚的是,該陣列實際上必須有一些值,您不能進行 select all。

總之,此函式適用於非常小部分的基礎查詢。如果您需要更複雜的功能,最好使用 pg_query。
wietse at cj2 dot nl
18 年前
David 提到您無法執行 Select all。
但是,當執行此腳本時
<?php
$conn_string
= "dbname=mydb";
$db = pg_connect($conn_string);
$selectfields = array("imgid" => "");
$records = pg_select($db,"mmsfiles",$selectfields);
print_r($records);
?>
...我得到這個結果
陣列
(
[0] => 陣列
(
[imgid] => 1
[file] => /home/wietse/public_html/mms/images/1.gif
[thumb] =>
)
[1] => 陣列
(
[imgid] => 2
[file] => /home/wietse/public_html/mms/images/2.gif
[thumb] =>
)
[2] => 陣列
(
[imgid] => 3
[file] => /home/wietse/public_html/mms/images/3.gif
[thumb] =>
)
[3] => 陣列
(
[imgid] => 4
[file] => /home/wietse/public_html/mms/images/4.gif
[thumb] =>
)
)
To Top