|
pg_query
Execute a query
(PHP 4 >= 4.2.0, PHP 5)
Example 1965. pg_query() example<?php Example 1966. Using pg_query() with multiple statements<?php Code Examples / Notes » pg_queryakbar
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 "</p>"; } close_db (); return 0; } return $result; } |
Change Languagepg_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 |