pg_send_query

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

pg_send_query 异步发送查询

说明

pg_send_query(PgSql\Connection $connection, string $query): int|bool

pg_send_query() 异步向 connection 发送查询或多个查询。与 pg_query() 不同,它可以一次向 PostgreSQL 发送多个查询,并使用 pg_get_result() 依次获取结果。

脚本执行不会在查询执行期间被阻塞。使用 pg_connection_busy() 检查连接是否繁忙(即查询是否正在执行)。可以使用 pg_cancel_query() 取消查询。

虽然用户可以一次发送多个查询,但多个查询不能通过繁忙的连接发送。如果在连接繁忙时发送查询,它将等待最后一个查询完成并丢弃所有结果。

参数

connection

一个 PgSql\Connection 实例。

query

要执行的 SQL 语句或语句。

查询中的数据应该 正确转义

返回值

成功时返回 true,失败时返回 false0。使用 pg_get_result() 来确定查询结果。

变更日志

版本 说明
8.1.0 connection 参数现在期望一个 PgSql\Connection 实例;之前,期望的是一个 资源

范例

示例 #1 pg_send_query() 示例

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Could not connect");

if (!
pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from authors; select count(*) from authors;");
}

$res1 = pg_get_result($dbconn);
echo
"First call to pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo
"$res1 has $rows1 records\n\n";

$res2 = pg_get_result($dbconn);
echo
"Second call to pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo
"$res2 has $rows2 records\n";
?>

上面的例子将输出

First call to pg_get_result(): Resource id #3
Resource id #3 has 3 records

Second call to pg_get_result(): Resource id #4
Resource id #4 has 1 records

参见

添加备注

用户贡献的注释 6 条注释

rw burgholzer is name at deq dot virginia dot gov
15 年前
关于现在无法处理所有这些查询,然后稍后检索结果,我发现如果我在“stack_query()”方法中的 while 循环中添加另一个条件,所有查询都会成功返回。

通过添加
&& (pg_transaction_status($conn) === PGSQL_TRANSACTION_IDLE ) )

每个查询都执行成功。

<?php
$conn
= pg_connect("dbname=dbname host=localhost user=psql ");
if (
$conn === FALSE)
exit(
"Can't connect to db");

$q = array();
// send some queries
foreach (range(0, 50) as $i)
stack_query($q, $conn, "SELECT 'query $i' AS str;");
// receive them
while (true)
{
$left = stack_query($q, $conn);
echo
"$left left... ";
$result = pg_get_result($conn);
if (
$left == 0 && $result === FALSE)
break;
$row = pg_fetch_assoc($result);
// depending on race conditions, you wont get all your original queries here.
echo "got $row[str]\n";
}

function
stack_query(&$queries, $conn, $sql = FALSE)
{
if (
$sql !== FALSE)
$queries[] = $sql;
while (
count($queries) && !pg_connection_busy($conn) && (pg_transaction_status($conn) === PGSQL_TRANSACTION_IDLE ) )
pg_send_query($conn, array_shift($queries));
return
count($queries) + (pg_connection_busy($conn) ? 1 : 0);
}
?>
Mikewithme at yahoo dot com
20 年前
由于一个错误,旧的 API 在 PHP 4.2.0 和 4.2.1 中不可用。

PHP 4.2.2 将再次支持旧的 API,并将保留足够长的时间。

新的 API 将在 PHP 4.2.0 到更高版本中可用。
yohgaki at php dot net
2002 年 6 月 19 日 04:00
由于一个错误,PHP 4.2.0 和 4.2.1 不支持 pg_lo_import() 旧 API。它在 PHP 4.2.2 中已修复。

顺便说一句,新的 API 将始终从 PHP 4.2.0 到更高版本可用。旧的 API 也将保留足够长的时间。
ceco at noxis dot net
2002 年 5 月 15 日 09:08
它对我有用(php-4.2.1)

不像这样

int pg_lo_import ( string pathname [, resource connection])

但是
int pg_lo_import ( resource connection, string pathname )

不知道原因
moodsey211 at gmail dot com
13 年前
pg_send_query 不会阻止你的脚本执行,但它会阻止脚本退出。

示例

<?php
$con
= pg_connect('dbname=payroll');
pg_send_query('SELECT process_payroll()'); // 其中 process_payroll 是一个非常长的进程
?>

你仍然需要等待查询完成,才能将任何显示内容发送到浏览器。令人惊讶的是,与 pg_query 不同,此脚本不会生成最大执行时间错误。
Likeyouover others at hotmail dot com
20 年前
<?php
// --------- 打开连接 ---

$conn = pg_connect("host='127.0.0.1' dbname='test' user='usertest' password='passtest'");

// --------- 打开文件 ---

$fp = fopen('logo.gif', "r");
$buffer = fread($fp, filesize('logo.gif'));
fclose($fp);

// --------- 创建 - 插入 OID ---

pg_exec($conn, "begin");

$oid = pg_locreate($conn);

$rs = pg_exec($conn,"INSERT INTO test(tipo, images) VALUES('A1', $oid);");
$handle = pg_loopen ($conn, $oid, "w");

pg_lowrite ($handle, $buffer);
pg_loclose ($handle);

pg_exec($conn, "commit");

// --------- 打开 - 插入 OID ---

$rs = pg_exec($conn, "SELECT images FROM test WHERE tipo = 'A1';");
$row = pg_fetch_row($rs, 0);

pg_exec($conn, "begin");
$loid = pg_loopen($conn, $row[0], "r");

header("Content-type: image/gif");

pg_loreadall($loid);
pg_loclose($loid);

pg_exec ($conn, "commit");

// --------- 取消链接 OID ---

pg_exec($conn, "begin");

$loid = $row[0];
pg_lounlink($conn, $loid);

pg_exec ($conn, "commit");

// --------- 删除 OID ---

pg_exec($conn, "DELETE FROM test WHERE tipo = 'A1';");

// --------- 关闭连接 ---

pg_close();
?>
Ron Howard
21 年前
如果你的查询中有一个错误,后续的查询将不会执行,并且不会显示错误消息。我想到的唯一确定是否发生 SQL 错误的方法是使用 pg_trace。

示例

pg_send_query($connection,
"SELECT id FROM users;
SELECT * FROM customers;
[无效 SQL 语句];
SELECT name FROM countries;");

while ($result = pg_get_result($connection))
$results[] = $result;

$results 数组中将只有两个项目。
vincentdephily
18 年前
请注意,如果你在没有调用 pg_get_result() 的情况下发送查询(假设上一个查询已完成并且连接未处于繁忙状态),上一个查询将被丢弃。

请自己查看(在 php4.4.0、postgres8.0.4、Linux/FreeBSD 上测试)
<?
$conn = pg_connect("dbname=template1 host=localhost user=pgsql");
if ($conn === FALSE)
exit("无法连接到数据库");

$q = array();
// 发送一些查询
foreach (range(0, 500) as $i)
stack_query($q, $conn, "SELECT 'query $i' AS str;");
// 接收它们
while (true)
{
$left = stack_query($q, $conn);
echo "$left left... ";
$result = pg_get_result($conn);
if ($left == 0 && $result === FALSE)
break;
$row = pg_fetch_assoc($result);
// 由于竞争条件,你可能不会在这里得到所有原始查询。
echo "got $row[str]\n";
}

function stack_query(&$queries, $conn, $sql = FALSE)
{
if ($sql !== FALSE)
$queries[] = $sql;
while (count($queries) && !pg_connection_busy($conn))
pg_send_query($conn, array_shift($queries));
return count($queries) + (pg_connection_busy($conn) ? 1 : 0);
}
?>

如果你想要一个“现在发送所有查询,稍后接收它们”的行为,你将不得不编写更高级别的抽象。
To Top