SQL 本身通常是一段复杂的代码,因此您可能希望将其放入“here doc”中。这将帮助您在任何地方阅读它,并通过命令行或 GUI 客户端对其进行测试。
$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 等。
用于 pg_prepare() 的预备语句也可以通过执行 SQL 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”中。这将帮助您在任何地方阅读它,并通过命令行或 GUI 客户端对其进行测试。
$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
PostgerSQL 仅当且仅当您引用标识符时才会保留其大小写。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());
}
请注意,如果您正在准备一个带有包含有项目列表的子句的查询,则需要分别准备每个项目。
$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() 列表的查询。