pg_prepare

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

pg_prepare提交创建带有给定参数的预备语句的请求,并等待完成

描述

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

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"));

?>

参见

  • pg_execute() - 发送执行带有给定参数的预备语句的请求,并等待结果
  • pg_send_execute() - 发送执行带有给定参数的预备语句的请求,而不等待结果

添加说明

用户贡献说明 6 个说明

david at fetter dot org
19 年前
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;
mike at musskopf dot com
16 年前
我使用此函数遇到了一些问题。当您将 pg_prepare() 与 date_trunc('day', $1) 之类的函数一起使用时,需要指定数据类型。

解决方案是使用 Pear MDB2,但在代码中进行了一些更改。原始代码也尝试使用 pg_prepare(),但出现了错误。
rodrigo at fabricadeideias dot com
17 年前
如果您决定取消分配(取消准备)先前准备好的 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());
}
geompse at gmail dot com
12 年前
给定的名称不能是语句本身。
它有最大长度,并且会被截断。

如果两个查询以相同的方式开始,则只使用第一个查询。
scott dot marlowe at gmail dot com
18 年前
请注意,如果您正在准备一个带有包含有项目列表的子句的查询,则需要分别准备每个项目。

$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