Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : PostgreSQL Functions : pg_query

pg_query

Execute a query (PHP 4 >= 4.2.0, PHP 5)
resource pg_query ( string query )
resource pg_query ( resource connection, string query )

pg_query() executes the query on the specified database connection.

If an error occurs, and FALSE is returned, details of the error can be retrieved using the pg_last_error() function if the connection is valid.

Note:

Although connection can be omitted, it is not recommended, since it can be the cause of hard to find bugs in scripts.

Note:

This function used to be called pg_exec(). pg_exec() is still available for compatibility reasons, but users are encouraged to use the newer name.

Parameters

connection

PostgreSQL database connection resource. When connection is not present, the default connection is used. The default connection is the last connection made by pg_connect() or pg_pconnect().

query

The SQL statement or statements to be executed. When multiple statements are passed to the function, they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands included in the query string. However, using multiple transactions in one function call is not recommended.

Return Values

A query result resource on success, or FALSE on failure.

Examples

Example 1965. pg_query() example

<?php

$conn
= pg_pconnect("dbname=publisher");
if (!
$conn) {
 echo
"An error occured.\n";
 exit;
}

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!
$result) {
 echo
"An error occured.\n";
 exit;
}

while (
$row = pg_fetch_row($result)) {
 echo
"Author: $row[0]  E-mail: $row[1]";
 echo
"<br />\n";
}

?>


Example 1966. Using pg_query() with multiple statements

<?php

$conn
= pg_pconnect("dbname=publisher");

// these statements will be executed as one 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);

?>


Code Examples / Notes » pg_query

akbar

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');
?>


sd

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)


mankyd

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


jvarner

That's why your code should never assume it has the very latest data unless it locks it.

hierophantnospam

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.


cmoore

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.


zoli

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)


jan-willem regeer

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).


mankyd

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.


david dot bouriaud

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


jsuzuki

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


yoshinariatsuo

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;
}


mentat

$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 "&lt/p>";
     }
     close_db ();
     return 0;
  }
  return $result;
}


Change Language


Follow Navioo On Twitter
pg_affected_rows
pg_cancel_query
pg_client_encoding
pg_close
pg_connect
pg_connection_busy
pg_connection_reset
pg_connection_status
pg_convert
pg_copy_from
pg_copy_to
pg_dbname
pg_delete
pg_end_copy
pg_escape_bytea
pg_escape_string
pg_execute
pg_fetch_all_columns
pg_fetch_all
pg_fetch_array
pg_fetch_assoc
pg_fetch_object
pg_fetch_result
pg_fetch_row
pg_field_is_null
pg_field_name
pg_field_num
pg_field_prtlen
pg_field_size
pg_field_table
pg_field_type_oid
pg_field_type
pg_free_result
pg_get_notify
pg_get_pid
pg_get_result
pg_host
pg_insert
pg_last_error
pg_last_notice
pg_last_oid
pg_lo_close
pg_lo_create
pg_lo_export
pg_lo_import
pg_lo_open
pg_lo_read_all
pg_lo_read
pg_lo_seek
pg_lo_tell
pg_lo_unlink
pg_lo_write
pg_meta_data
pg_num_fields
pg_num_rows
pg_options
pg_parameter_status
pg_pconnect
pg_ping
pg_port
pg_prepare
pg_put_line
pg_query_params
pg_query
pg_result_error_field
pg_result_error
pg_result_seek
pg_result_status
pg_select
pg_send_execute
pg_send_prepare
pg_send_query_params
pg_send_query
pg_set_client_encoding
pg_set_error_verbosity
pg_trace
pg_transaction_status
pg_tty
pg_unescape_bytea
pg_untrace
pg_update
pg_version
eXTReMe Tracker