Took me a while to track this down so I thought it might be useful for others:
If you use stored procedures and need to get result sets back from them:
function dbquery($link,$query){
pg_query($link,"BEGIN;");
$tr=pg_query($link,$query);
$r=pg_fetch_row($tr);
$name=$r[0];
$rs=pg_query($link,"FETCH ALL IN \"" . $name . "\";");
pg_query($link,"END;");
return $rs;
}
(Error checking removed for clarity)
pg_query
(PHP 4 >= 4.2.0, PHP 5)
pg_query — Exécute une requête PostgreSQL
Description
pg_query() exécute la requête query sur la base de données spécifiée connection .
Si une erreur se produit et FALSE est retourné, les détails de l'erreur peuvent être récupérés en utilisant la fonction pg_last_error() si la connexion est valide.
Note: Bien que connection puisse être omis, il n'est pas recommandé de le faire, car il peut se révéler difficile de retrouver les bogues dans les scripts.
Note: Auparavant, cette fonction s'appelait pg_exec(). pg_exec() est toujours disponible pour des raisons de compatibilité, mais les utilisateurs sont encouragés à utiliser le nouveau nom.
Liste de paramètres
- connection
-
La ressource de connexion de la base de données PostgreSQL. Lorsque connection n'est pas présent, la connexion par défaut est utilisée. La connexion par défaut est la dernière connexion faite par pg_connect() ou pg_pconnect().
- query
-
La requête ou les requêtes SQL à être exécutées. Lorsque plusieurs requêtes sont passées à la fonction, elles sont automatiquement exécutées comme étant une transaction, à moins qu'il y aille les commandes BEGIN/COMMIT incluses dans la requête. Cependant, l'utilisation de transactions multiples dans un seul appel de fonction n'est pas recommandée.
Valeurs de retour
Une ressource de résultats en cas de succès ou FALSE en cas d'échec.
Exemples
Exemple #1 Exemple avec pg_query()
<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Une erreur s'est produite.\n";
exit;
}
$result = pg_query($conn, "SELECT auteur, email FROM auteurs");
if (!$result) {
echo "Une erreur s'est produite.\n";
exit;
}
while ($row = pg_fetch_row($result)) {
echo "Auteur: $row[0] E-mail: $row[1]";
echo "<br />\n";
}
?>
Exemple #2 Utilisation de pg_query() avec plusieurs requêtes
<?php
$conn = pg_pconnect("dbname=publisher");
// ces requêtes seront exécutées en tant qu'une seule transaction
$query = "UPDATE authors SET author=UPPER(author) WHERE id=1;";
$query .= "UPDATE authors SET author=LOWER(author) WHERE id=2;";
$query .= "UPDATE authors SET author=NULL WHERE id=3;";
pg_query($conn, $query);
?>
Voir aussi
- pg_connect() - Établit une connexion PostgreSQL
- pg_pconnect() - Établit une connexion PostgreSQL persistante
- pg_fetch_array() - Lit une ligne de résultat PostgreSQL dans un tableau
- pg_fetch_object() - Lit une ligne de résultat PostgreSQL dans un objet
- pg_num_rows() - Retourne le nombre de lignes PostgreSQL
- pg_affected_rows() - Retourne le nombre de lignes affectées
pg_query
14-Sep-2006 07:40
21-May-2006 03:07
It would be better this way:
<?php
$result=pg_query($conn, "SELECT COUNT(*) AS rows FROM x WHERE a=b;");
if (!$result) {
echo "query did not execute";
}
if ($line = pg_fetch_assoc($result)) {
if ($line['rows'] == 0) {
echo "0 records"
}
}
else {
while ($row = pg_fetch_array($result)) {
//do stuff with $row
}
}
?>
This solution doesn't raise the load of the system with the move of matching rows (perhaps 0,1, perhaps 100, 1000, ... rows)
13-May-2006 02:21
There was a typo in the code that I posted:
<?php
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "query did not execute";
}
if (pg_num_rows($result) == 0) {
echo "0 records"
}
else {
while ($row = pg_fetch_array($result)) {
//do stuff with $row
}
}
?>
13-May-2006 01:56
Improving upon what jsuzuki said:
It's probably better to use pg_num_rows() to see if no rows were returned, as that leaves the resultset cursor pointed to the first row so you can use it in a loop.
Example:
<?php
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "query did not execute";
}
if (pg_num_rows($result) == 0) {
echo "0 records"
}
else {
while ($row = pg_fetch_array($result) {
//do stuff with $row
}
}
?>
I, personally, also find it more readable.
27-Nov-2005 01:58
expanding on the note left by "cmoore" -
To check to see if the recordset returned no records,
<?php
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "query did not execute";
}
$rs = pg_fetch_assoc($result);
if (!$rs) {
echo "0 records"
}
?>
-jack
27-Sep-2005 11:58
In reply to david dot bouriaud at ac-rouen dot fr:
All it is doing is internal caching. How can that be dangerous. If you are going to be deleting records after you have closed the connection it is your problem to make sure you have the latest and greatest records, and not some cached ones. Considering you are writing the script I don't see why it is a problem, you know what you are doing in the script, so it is quite useless for PHP to invalidate the cache, when that could be done upon exiting the script, which would mean there was less time spent cleaning out the cache when it counts most (when returning data to the user).
05-Sep-2005 06:20
One thing to note that wasn't obvious to me at first. If your query returns zero rows, that is not a "failed" query. So the following is wrong:
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "No a=b in x\n";
}
pg_query returns FALSE if the query can not be executed for some reason. If the query is executed but returns zero rows then you get back a resul with no rows.
01-Dec-2004 04:07
Use pg_query to call your stored procedures, and use pg_fetch_result when getting a value (like a smallint as in this example) returned by your stored procedure.
<?php
$pgConnection = pg_connect("dbname=users user=me");
$userNameToCheckFor = "metal";
$result = pg_query($pgConnection, "SELECT howManyUsersHaveThisName('$userNameToCheckFor')");
$count = pg_fetch_result($result, 0, 'howManyUsersHaveThisName');
?>
23-Apr-2003 06:59
create table from pg_query results.. hope it helps newbies...
function table_create($result)
{
$numrows = pg_num_rows($result);
$fnum = pg_num_fields($result);
echo "<table border width='100%'>";
echo "<tr>";
for ($x = 0; $x < $fnum; $x++) {
echo "<td><b>";
echo strtoupper(pg_field_name($result, $x));
echo "</b></td>";
}
echo "</tr>";
for ($i = 0; $i < $numrows; $i++) {
$row = pg_fetch_object($result, $i);
echo "<tr align='center'>";
for ($x = 0; $x < $fnum; $x++) {
$fieldname = pg_field_name($result, $x);
echo "<td>";
echo $row->$fieldname;
echo "</td>";
}
echo"</tr>";
}
echo "</table>";
return 0;
}
14-Oct-2002 12:16
$GLOBALS["PG_CONNECT"]=pg_connect(...);
....
function query ($sqlQuery,$var=0) {
if (!$GLOBALS["PG_CONNECT"]) return 0;
$lev=error_reporting (8); //NO WARRING!!
$result=pg_query ($sqlQuery);
error_reporting ($lev); //DEFAULT!!
if (strlen ($r=pg_last_error ($GLOBALS["PG_CONNECT"]))) {
if ($var) {
echo "<p color=\"red\">ERROR:<pre>";
echo $sqlQuery;
echo "</pre>";
echo $r;
echo "</p>";
}
close_db ();
return 0;
}
return $result;
}
17-Jun-2002 07:50
Regarding david.bouriaud@ac-rouen.fr:
You misunderstand SQL. When a query is issued, results applicable at the time of the query are returned to the application (i.e. PHP). There is no further reference to the database required. Thus, all of the pg_fetch_* functions are acting on an internal data storage, NOT the database itself. This is because SQL does not have a concept of sets, or of state (except in limited circumstances provided by transactions). However, if you use a cursor instead, fetching only one record at a time, you may get an error if you delete the table. If you don't, it is an issue with Postgres, not PHP.
10-May-2002 10:18
That's why your code should never assume it has the very latest data unless it locks it.
07-May-2002 05:54
Hi to all !
It seems that the old pg_exec function does not do what it is expected to.
In the doc, it is said that it returns a resource identifier on the successful querry that was send to the backend.
It seems to me that it is more than a resource identifier.
Follow the example :
<?php
$ConnId = pg_connect ("blablabla");
$ResId = pg_exec ("select * from table", $ConnId);
pg_close ($ConnId);
$row = pg_fetch_array ($ResId, 4);
?>
I closed the connection voluntarily before the pg_fetch_array. It WORKS !
Now, imagine the following script :
<?php
$ConnId = pg_connect ("blablabla");
$ResId = pg_exec ("select * from table", $ConnId);
pg_close ($ConnId);
system ("psql base -c delete from table");
$row = pg_fetch_array ($ResId, 4);
?>
See how it could be harmful !!!! I think that the coders have done this for performances reasons, but it is not the right way do do so !!!
