pg_query
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_query — 执行查询
说明
$connection
, string $query
): resource
pg_query()
在查询可以执行时返回查询结果资源号。如果查询失败或者提供的连接号无效则返回
false
。如果连接号有效,则可以用 pg_last_error()
函数来提取详细的错误信息。pg_query()
发送一条 SQL 语句到 connection
资源指定的 PostgreSQL 数据库。connection
必须是由 pg_connect() 或 pg_pconnect()
返回的合法连接号。本函数返回值是一个其它 PostgreSQL 函数例如
pg_fetch_array() 可以用来访问查询结果的查询结果资源号。
注意:
connection
是 pg_query() 中的可选参数。如果没有指定connection
,则使用默认连接。默认连接是 pg_connect() 或 pg_pconnect() 所打开的最后一个连接。 尽管connection
参数可以省略,但不推荐这样做。因为这样可能会导致很难发现脚本中的错误。
注意:
本函数以前的名字为
pg_exec()
。pg_exec()
函数为了兼容性的原因仍然可以使用,但是鼓励用户使用新的名字。
参见 pg_connect(),pg_pconnect(),pg_fetch_array(),pg_fetch_object(),pg_num_rows() 和 pg_affected_rows()。

User Contributed Notes 10 notes
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
A quick note for novice users: when gathering input from fields on a web form that maintains a database connection, *never* use pg_query to do queries from the field. Always sanitize input using pg_prepare and pg_execute.
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.
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)
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
}
}
?>
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.
$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;
}
Here is my small function to make it easier for me to use data from select queries (attention, it is sensitive to sql injection)
<?php
function requestToDB($connection,$request){
if(!$result=pg_query($connection,$request)){
return False;
}
$combined=array();
while ($row = pg_fetch_assoc($result)) {
$combined[]=$row;
}
return $combined;
}
?>
Example:
<?php
$conn = pg_pconnect("dbname=mydatabase");
$results=requestToDB($connect,"select * from mytable");
//You can now access a "cell" of your table like this:
$rownumber=0;
$columname="mycolumn";
$mycell=$results[$rownumber][$columname];
var_dump($mycell);
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');
?>
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)