pg_get_result

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

pg_get_result Lee un resultado asíncrono de PostgreSQL

Descripción

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

pg_get_result() recupera la instancia PgSql\Result de una consulta asíncrona ejecutada por pg_send_query(), pg_send_query_params(), o pg_send_execute().

pg_send_query() y otras funciones de consulta asíncrona pueden enviar múltiples consultas a un servidor PostgreSQL y pg_get_result() se utiliza para obtener cada resultado de consulta, uno por uno.

Parámetros

connection

An PgSql\Connection instance.

Valores devueltos

Una instancia de PgSql\Result, o false si no hay más resultados disponibles.

Historial de cambios

Versión Descripción
8.1.0 Returns an PgSql\Result instance now; previously, a recurso was returned.
8.1.0 The connection parameter expects an PgSql\Connection instance now; previously, a recurso was expected.

Ejemplos

Ejemplo #1 Ejemplo con pg_get_result()

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Conexión imposible");

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

$res1 = pg_get_result($dbconn);
echo
"Primera llamada a pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo
"$res1 tiene $rows1 registros\n\n";

$res2 = pg_get_result($dbconn);
echo
"Segunda llamada a pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo
"$res2 tiene $rows2 registros\n";
?>

El resultado del ejemplo sería:

Primera llamada a pg_get_result(): Resource id #3
Resource id #3 tiene 3 registros

Segunda llamada a pg_get_result(): Resource id #4
Resource id #4 tiene 1 registros

Ver también

add a note

User Contributed Notes 4 notes

up
5
william at 25thandClement dot com
20 years ago
There is no way to poll/wait for a notification to come in. You either have to enter a busy loop or sleep. Both options are horrible. It would be nice for PHP to provide access to PQsocket so one could select() on the socket connection. This is how it's done from C or Perl.
up
0
Ondej Bouda
9 years ago
It might seem that after calling pg_get_result() upon sending just a single query, the connection will not be busy. The correct way is, though, to call extra pg_get_result() in a loop until it returns 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);
}

/* The following does not seem necessary for good queries, but is vital for erroneous queries.
Commenting the loop out leads to this script fail with the "Connection is busy" error. */
while (pg_get_result($conn));

// result processing...
}
?>

See http://www.postgresql.org/message-id/flat/gtitqq$26l3$1@news.hub.org#gtitqq$26l3$1@news.hub.org and https://bugs.php.net/bug.php?id=52750 for detailed information.

[1] Or, even better, use an asynchronous connection since PHP 5.6.
up
0
gullevek at gullevek dot org
11 years ago
To have a a simple wait output with async queries you can use the pg_connection_busy command:

<?php
$dbh
= pg_connect("host=XXX user=XXX password=XXX dbname=XXX");
if (!
$dbh)
{
print
"Failed to connect";
exit;
}

$query = "SELECT pg_sleep(10)";
if (!
pg_connection_busy($dbh))
{
$sent = pg_send_query($dbh, $query);
print
"Sent query, waiting: ";
while (
pg_connection_busy($dbh)
{
print
".";
flush();
}
$res = pg_get_result($dbh);
print
"<br>"; // or \n
print "Result is: $res";
}

pg_close($dbh);
?>
up
-5
Marko Tiikkaja
16 years ago
william at 25thandClement dot com said: "There is no way to poll/wait for a notification to come in. .."
Yes, there is. If there is a query in progress, pg_get_result() will block and return the result of that query when it's complete.
To Top