Regarding the failure to process them all now, then retrieve the results later, I found that all queries would return successfully if I added a further condition to your while loop in the "stack_query()" method.
By adding:
&& (pg_transaction_status($conn) === PGSQL_TRANSACTION_IDLE ) )
Every query executed with no errors.
<?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);
}
?>pg_send_query
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
pg_send_query
Референца за `function.pg-send-query.php` со подобрена типографија и навигација.
pg_send_query
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_send_query — Sends asynchronous query
= NULL
pg_send_query() Испраќа асинхрони барања
connectionи го враќа делот од
pg_query()испраќа барање или барања асинхроно до
pg_get_result().
, може да испрати повеќе барања одеднаш до PostgreSQL и да ги добие резултатите еден по еден користејќи pg_connection_busy() Извршувањето на скриптата не е блокирано додека се извршуваат барањата. Користете pg_cancel_query().
за да проверите дали врската е зафатена (т.е. барањето се извршува). Барањата може да се откажат користејќи
Параметри
connection-
Еден PgSql\Connection instance.
query-
Иако корисникот може да испрати повеќе барања одеднаш, повеќе барања не може да се испратат преку зафатена врска. Ако се испрати барање додека врската е зафатена, таа чека додека не заврши последното барање и ги отфрла сите негови резултати.
SQL изјавата или изјавите што треба да се извршат. Податоците во барањето треба да бидат.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true при успех, false or 0 соодветно избегнати pg_get_result()
на неуспех. Користете
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На connection параметарот очекува PgSql\Connection
инстанца сега; претходно, а resource се очекуваше.
|
Примери
Пример #1 pg_send_query() example
<?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";
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
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
Види Исто така
- pg_query() за да го одредите резултатот од барањето.
- pg_cancel_query() - Изврши барање
- pg_get_result() - Откажи асинхроно барање
- pg_connection_busy() - Земи резултат од асинхроно барање
Белешки од корисници 6 белешки
Due to a bug, OLD API does not available with PHP 4.2.0 and 4.2.1.
PHP 4.2.2 will support OLD API again and will be kept long enough.
New API will be available PHP 4.2.0 to later versions.
yohgaki at php dot net
19-Jun-2002 04:00
Due to a bug, PHP 4.2.0 and 4.2.1 does not support pg_lo_import() old API. It's fixed in PHP 4.2.2.
BTW, new API will be always available from PHP 4.2.0 to later versions. Older API will be kept long enough, also.
ceco at noxis dot net
15-May-2002 09:08
it works for me (php-4.2.1)
not like this
int pg_lo_import ( string pathname [, resource connection])
but
int pg_lo_import ( resource connection, string pathname )
don't know the reasonpg_send_query would not stop your script from executing but it would stop the script from exiting.
Example:
<?php
$con = pg_connect('dbname=payroll');
pg_send_query('SELECT process_payroll()'); // Where process_payroll is a super long process
?>
You would still need to wait for the query to finish before the any display would be sent to the browser. And surprisingly, unlike pg_query this script would not generate the Maximum execution time error.<?php
// --------- OPEN CONN ---
$conn = pg_connect("host='127.0.0.1' dbname='test' user='usertest' password='passtest'");
// --------- OPEN FILE ---
$fp = fopen('logo.gif', "r");
$buffer = fread($fp, filesize('logo.gif'));
fclose($fp);
// --------- CREATE - INSERT 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");
// --------- OPEN - INSERT 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");
// --------- UNLINK OID ---
pg_exec($conn, "begin");
$loid = $row[0];
pg_lounlink($conn, $loid);
pg_exec ($conn, "commit");
// --------- DELETE OID ---
pg_exec($conn, "DELETE FROM test WHERE tipo = 'A1';");
// --------- CLOSE CONN ---
pg_close();
?>If there is an error in one of your queries, the queries following it will not get executed, and there will *not* be an error message displayed. The only way I can think of to determine if an SQL error happened is to use pg_trace.
Example:
pg_send_query($connection,
"SELECT id FROM users;
SELECT * FROM customers;
[INVALID-SQL-STATEMENT];
SELECT name FROM countries;");
while ($result = pg_get_result($connection))
$results[] = $result;
The $results array will only have two items in it.Note that if you send a query without calling pg_get_result() for the previous one (supposing it has finished and the connection is not busy), the previous query will get discarded.
See for yourself (tested on php4.4.0, postgres8.0.4, Linux/FreeBSD) :
<?
$conn = pg_connect("dbname=template1 host=localhost user=pgsql");
if ($conn === FALSE)
exit("Can't connect to db");
$q = array();
// send some queries
foreach (range(0, 500) 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_send_query($conn, array_shift($queries));
return count($queries) + (pg_connection_busy($conn) ? 1 : 0);
}
?>
You will have to write a higher level of abstraction if you want a "send all queries now, receive them later" behaviour.