2024 年日本 PHP 研討會

pg_prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_prepare 將建立帶有指定參數的預備語句的請求提交到伺服器,並等待完成

說明

pg_prepare(PgSql\Connection $connection = ?, 字串 $stmtname, 字串 $query): PgSql\Result|false

pg_prepare() 會建立一個預備語句,供稍後使用 pg_execute()pg_send_execute() 執行。這個功能允許將會重複使用的指令只解析和規劃一次,而不是每次執行時都進行。 pg_prepare() 僅支援 PostgreSQL 7.4 或更高版本的連線;使用較早版本時將會失敗。

此函式會從 query 字串建立一個名為 stmtname 的預備語句,該字串必須包含單個 SQL 指令。 stmtname 可以是 "" 來建立未命名的語句,在這種情況下,任何先前存在的未命名語句都會被自動取代;否則,如果語句名稱在目前的階段作業中已經定義,則會發生錯誤。如果有使用任何參數,則在 query 中會以 $1$2 等方式引用它們。

也可以透過執行 SQL PREPARE 語句來建立供 pg_prepare() 使用的預備語句。(但 pg_prepare() 更具彈性,因為它不需要預先指定參數類型。) 此外,雖然沒有用於刪除預備語句的 PHP 函式,但可以使用 SQL DEALLOCATE 語句來達到此目的。

參數

connection

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

警告

從 PHP 8.1.0 開始,不建議使用預設連線。

stmtname

要賦予預備語句的名稱。每個連線必須是唯一的。如果指定 "",則會建立未命名的語句,覆蓋任何先前定義的未命名語句。

query

參數化的 SQL 語句。必須只包含單個語句(不允許多個以分號分隔的語句)。如果有使用任何參數,則會以 $1$2 等方式引用它們。

返回值

成功時返回 PgSql\Result 實例,失敗時返回 false

更新日誌

版本 說明
8.1.0 現在返回 PgSql\Result 實例;以前返回的是資源
8.1.0 connection 參數現在需要 PgSql\Connection 實例;以前需要的是資源

範例

範例 #1 使用 pg_prepare()

<?php

// 連線到名為 "mary" 的資料庫
$dbconn = pg_connect("dbname=mary");

// 準備要執行的查詢
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// 執行準備好的查詢。請注意,不需要以任何方式跳脫
// 字串 "Joe's Widgets"
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// 再次執行相同的準備好的查詢,這次使用不同的參數
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));

?>

另請參閱

  • pg_execute() - 使用給定的參數發送執行準備好的語句的請求,並等待結果
  • pg_send_execute() - 使用給定的參數發送執行準備好的語句的請求,而不等待結果

新增註解

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

david at fetter dot org
19 年前
SQL 本身通常是一段複雜的程式碼,因此您可能希望將其放在「here doc」中。這將有助於您在任何地方閱讀它,並透過命令列或圖形介面用戶端自行測試它。

$sql = <<<SQL
SELECT a.foo, b.bar, c.baz
FROM
table_a a
LEFT JOIN
table_b b
ON (
a.a_id = b.a_id
)
JOIN
table_c c
ON (
b.c_id = c.c_id
)
WHERE c.name = $1
SQL;
mike at musskopf dot com
17 年前
我在使用這個函式時遇到了一些問題。當您將 pg_prepare() 與 date_trunc('day', $1) 之類的函式一起使用時,您需要指定資料類型。

解決方案是使用 Pear MDB2,但需要對程式碼進行一些更改。原始程式碼也嘗試使用 pg_prepare(),但出現錯誤。
rodrigo at fabricadeideias dot com
18 年前
如果您決定釋放(取消準備)先前準備好的 SQL 命令,最好將 SQL 名稱用引號括起來,如下所示

DEALLOCATE "theNameOfMySQL"

而不是(更自然的)

DEALLOCATE theNameOfMySQL

PostgreSQL 會保留您的識別碼的大小寫,前提是您將它們用引號括起來。 pg_prepare 函式會保留您使用的 SQL 名稱的大小寫。

一個完整的例子如下

$sql = 'SELECT * FROM user WHERE cod_user = $1';
$sqlName = 'selectUserByCode';
if (!pg_prepare ($sqlName, $sql)) {
die("無法準備 '$sql': " . pg_last_error());
}
$rs = pg_execute($sqlName, array(1));
使用 $rs 進行任何您想做的操作,最後
$sql = sprintf(
'DEALLOCATE "%s"',
pg_escape_string($sqlName)
);
if(!pg_query($sql)) {
die("無法查詢 '$sql': " . pg_last_error());
}
geompse at gmail dot com
12 年前
給定的名稱不能是敘述本身。
它有最大長度限制,會被截斷。

如果兩個查詢的開頭相同,則只會使用第一個。
scott dot marlowe at gmail dot com
18 年前
請注意,如果您正在準備一個帶有 in 子句且包含項目列表的查詢,則需要分別準備每個項目。

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name IN($1,$2,$3)');

$result = pg_execute($dbconn, "my_query", array("coffee", "beer", "hard"));

這表示您不能只準備一個帶有任意 in() 列表的查詢。
andy at petdance dot com
16 年前
任何準備階段的錯誤都可以從 pg_last_error() 獲得。
To Top