略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: pg_query

2024-04-28

pg_query

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_query执行查询

说明

pg_query(resource $connection, string $query): resource

pg_query() 在查询可以执行时返回查询结果资源号。如果查询失败或者提供的连接号无效则返回 false。如果连接号有效,则可以用 pg_last_error() 函数来提取详细的错误信息。pg_query() 发送一条 SQL 语句到 connection 资源指定的 PostgreSQL 数据库。connection 必须是由 pg_connect()pg_pconnect() 返回的合法连接号。本函数返回值是一个其它 PostgreSQL 函数例如 pg_fetch_array() 可以用来访问查询结果的查询结果资源号。

注意: connectionpg_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()

add a noteadd a note

User Contributed Notes 10 notes

up
6
jsuzuki at spamcop dot net
16 years ago
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
up
5
a dot mcruer at live dot com
9 years ago
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.
up
2
cmoore
16 years ago
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.
up
2
zoli at makettinfo.hu
16 years ago
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)
up
2
mankyd
16 years ago
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
  
}
  }
?>
up
0
mankyd
16 years ago
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.
up
0
mentat at azsoft dot pl
19 years ago
$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;
}
up
-1
Anonymous
8 years ago
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);
up
-2
Akbar
17 years ago
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');
?>
up
-5
sd at dicksonlife dot com
15 years ago
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)

官方地址:https://www.php.net/manual/en/function.pg-query.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3