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;
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
pg_prepare — 將建立帶有指定參數的預備語句的請求提交到伺服器,並等待完成
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"));
?>
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;
我在使用這個函式時遇到了一些問題。當您將 pg_prepare() 與 date_trunc('day', $1) 之類的函式一起使用時,您需要指定資料類型。
解決方案是使用 Pear MDB2,但需要對程式碼進行一些更改。原始程式碼也嘗試使用 pg_prepare(),但出現錯誤。
如果您決定釋放(取消準備)先前準備好的 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());
}
請注意,如果您正在準備一個帶有 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() 列表的查詢。