pg_get_result

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

pg_get_result 获取异步查询结果

描述

pg_get_result(PgSql\Connection $connection): PgSql\Result|false

pg_get_result() 从由 pg_send_query()pg_send_query_params()pg_send_execute() 执行的异步查询中获取一个 PgSql\Result 实例。

pg_send_query() 和其他异步查询函数可以将多个查询发送到 PostgreSQL 服务器,而 pg_get_result() 用于逐个获取每个查询的结果。

参数

connection

一个 PgSql\Connection 实例。

返回值

一个 PgSql\Result 实例,或者如果不再有结果可用则为 false

变更日志

版本 描述
8.1.0 现在返回一个 PgSql\Result 实例;以前,返回的是一个 资源
8.1.0 connection 参数现在期望一个 PgSql\Connection 实例;以前,期望的是一个 资源

范例

示例 #1 pg_get_result() 示例

<?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

参见

添加备注

用户贡献的备注 4 个备注

william at 25thandClement dot com
19 年前
无法轮询/等待通知到来。您要么必须进入繁忙循环,要么睡眠。这两种选择都很糟糕。如果 PHP 能提供对 PQsocket 的访问,这样就可以在套接字连接上 select(),那将很不错。这是从 C 或 Perl 中完成的方式。
Ondej Bouda
8 年前
在发送单个查询后调用 pg_get_result() 之后,连接似乎不再繁忙。但是,正确的方法是在循环中调用额外的 pg_get_result(),直到它返回 false [1]。

<?php
$conn
= pg_connect('...', PGSQL_CONNECT_FORCE_NEW);
for (
$i = 0; $i < 10000; $i++) {
$query = 'erroneous query';
if (
pg_connection_busy($conn)) {
fprintf(STDERR, "Connection is busy\n");
exit(
1);
}
pg_send_query($conn, $query);
$res = pg_get_result($conn);
if (
$res === false) {
fprintf(STDERR, "A result was expected\n");
exit(
1);
}

/* 对于好的查询,以下似乎没有必要,但对于错误的查询至关重要。
有关详细信息,请参阅 https://postgresql.ac.cn/message-id/flat/[email protected]#[email protected]https://bugs.php.net/bug.php?id=52750

[1] 或者,更重要的是,从 PHP 5.6 开始使用异步连接。
gullevek at gullevek dot org
10 年前
要使用异步查询获得简单的等待输出,可以使用 pg_connection_busy 命令

<?php
$dbh
= pg_connect("host=XXX user=XXX password=XXX dbname=XXX");
if (!
$dbh)
{
print
"连接失败";
exit;
}

$query = "SELECT pg_sleep(10)";
if (!
pg_connection_busy($dbh))
{
$sent = pg_send_query($dbh, $query);
print
"已发送查询,等待中: ";
while (
pg_connection_busy($dbh)
{
print
".";
flush();
}
$res = pg_get_result($dbh);
print
"<br>"; // 或者 \n
print "结果是: $res";
}

pg_close($dbh);
?>
Marko Tiikkaja
15 年前
william 在 25thandClement dot com 说: "没有办法轮询/等待通知到来。.."
是的,有办法。如果有一个查询正在进行,pg_get_result() 将阻塞并返回该查询完成后的结果。
To Top