pg_query

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

pg_query执行查询

描述

pg_query(PgSql\Connection $connection = ?, string $query): PgSql\Result|false

pg_query() 在指定的数据库 connection 上执行 query。在大多数情况下,应优先使用 pg_query_params()

如果发生错误,并且返回 false,则可以使用 pg_last_error() 函数检索错误详细信息(如果连接有效)。

注意: 虽然可以省略 connection,但不建议这样做,因为它会导致脚本中难以发现的错误。

注意:

此函数以前称为 pg_exec()。出于兼容性原因,pg_exec() 仍然可用,但鼓励用户使用更新的名称。

参数

connection

一个 PgSql\Connection 实例。当 connection 未指定时,将使用默认连接。默认连接是 pg_connect()pg_pconnect() 最近建立的连接。

警告

从 PHP 8.1.0 开始,使用默认连接已被弃用。

query

要执行的 SQL 语句或语句。当将多个语句传递给函数时,它们会自动作为单个事务执行,除非查询字符串中包含显式的 BEGIN/COMMIT 命令。但是,不建议在一个函数调用中使用多个事务。

警告

对用户提供的数据进行字符串插值极其危险,很可能导致 SQL 注入 漏洞。在大多数情况下,应优先使用 pg_query_params(),将用户提供的值作为参数传递,而不是将其替换到查询字符串中。

任何直接替换到查询字符串中的用户提供的数据都应 正确转义

返回值

成功时为一个 PgSql\Result 实例,失败时为 false

变更日志

版本 描述
8.1.0 现在返回一个 PgSql\Result 实例;以前返回的是一个 资源
8.1.0 现在 connection 参数需要一个 PgSql\Connection 实例;以前需要一个 资源

示例

示例 #1 pg_query() 示例

<?php

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

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

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

?>

示例 #2 使用 pg_query() 执行多个语句

<?php

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

// 这些语句将作为单个事务执行

$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);

?>

参见

添加注释

用户贡献的注释 10 个注释

5
jsuzuki at spamcop dot net
18 年前
扩展 "cmoore" 留下的注释 -

要检查返回的记录集是否没有记录,

<?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
4
a dot mcruer at live dot com
11 年前
为新手用户提供一个快速说明:从维护数据库连接的网页表单上的字段收集输入时,*永远不要* 使用 pg_query 从字段执行查询。始终使用 pg_prepare 和 pg_execute 对输入进行清理。
3
zoli at makettinfo.hu
18 年前
最好是这样

<?php
$result
=pg_query($conn, "SELECT COUNT(*) AS rows FROM x WHERE a=b;");
if (!
$result) {
echo
"查询未执行";
}
if (
$line = pg_fetch_assoc($result)) {
if (
$line['rows'] == 0) {
echo
"0 条记录"
}
}
else {
while (
$row = pg_fetch_array($result)) {
//使用 $row 做一些操作
}
}
?>

此解决方案不会因匹配行(可能是 0、1 行,也可能是 100、1000 行等)的移动而增加系统负载。
2
mentat at azsoft dot pl
21 年前
$GLOBALS["PG_CONNECT"]=pg_connect(...);
....

function query ($sqlQuery,$var=0) {
if (!$GLOBALS["PG_CONNECT"]) return 0;
$lev=error_reporting (8); //没有警告!
$result=pg_query ($sqlQuery);
error_reporting ($lev); //默认!
if (strlen ($r=pg_last_error ($GLOBALS["PG_CONNECT"]))) {
if ($var) {
echo "<p color=\"red\">错误:<pre>";
echo $sqlQuery;
echo "</pre>";
echo $r;
echo "&lt/p>";
}
close_db ();
return 0;
}
return $result;
}
1
cmoore
18 年前
需要注意的一点是,一开始我并不清楚,如果您的查询返回零行,那并不算“失败”的查询。因此,以下代码是错误的
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "x 中没有 a=b\n";
}

如果查询由于某种原因无法执行,pg_query 会返回 FALSE。如果查询已执行,但返回零行,则您将获得一个没有行的结果。
0
mankyd
18 年前
我发布的代码中有一个拼写错误。

<?php
$result
=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!
$result) {
echo
"查询未执行";
}
if (
pg_num_rows($result) == 0) {
echo
"0 条记录"
}
else {
while (
$row = pg_fetch_array($result)) {
//使用 $row 做一些操作
}
}
?>
-1
Akbar
19 年前
使用 pg_query 调用存储过程,使用 pg_fetch_result 获取存储过程返回的值(如本例中的 smallint)。

<?php
$pgConnection
= pg_connect("dbname=users user=me");

$userNameToCheckFor = "metal";

$result = pg_query($pgConnection, "SELECT howManyUsersHaveThisName('$userNameToCheckFor')");

$count = pg_fetch_result($result, 0, 'howManyUsersHaveThisName');
?>
-2
mankyd
18 年前
改进 jsuzuki 的说法。

最好使用 pg_num_rows() 来查看是否没有返回行,因为这样会使结果集游标指向第一行,以便您可以在循环中使用它。

示例

<?php
$result
=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!
$result) {
echo
"查询未执行";
}
if (
pg_num_rows($result) == 0) {
echo
"0 条记录"
}
else {
while (
$row = pg_fetch_array($result) {
//使用 $row 做一些操作
}
}
?>

我个人也觉得它更易读。
-2
Anonymous
10 年前
这是我编写的用于简化 select 查询数据使用的简单函数(注意,它对 SQL 注入很敏感)
<?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;
}
?>

示例
<?php
$conn
= pg_pconnect("dbname=mydatabase");

$results=requestToDB($connect,"select * from mytable");

//现在可以像这样访问表格中的“单元格”:
$rownumber=0;
$columname="mycolumn";

$mycell=$results[$rownumber][$columname];
var_dump($mycell);
-8
sd at dicksonlife dot com
17 年前
我花了很长时间才追踪到这个问题,所以我认为它可能对其他人有用。

如果您使用存储过程,并且需要从存储过程中获取结果集

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

(为了清晰起见,已删除错误检查)
To Top