扩展 "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
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_query — 执行查询
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);
?>
扩展 "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
为新手用户提供一个快速说明:从维护数据库连接的网页表单上的字段收集输入时,*永远不要* 使用 pg_query 从字段执行查询。始终使用 pg_prepare 和 pg_execute 对输入进行清理。
最好是这样
<?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 行等)的移动而增加系统负载。
$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 "</p>";
}
close_db ();
return 0;
}
return $result;
}
需要注意的一点是,一开始我并不清楚,如果您的查询返回零行,那并不算“失败”的查询。因此,以下代码是错误的
$result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
if (!$result) {
echo "x 中没有 a=b\n";
}
如果查询由于某种原因无法执行,pg_query 会返回 FALSE。如果查询已执行,但返回零行,则您将获得一个没有行的结果。
我发布的代码中有一个拼写错误。
<?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 做一些操作
}
}
?>
使用 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');
?>
改进 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 做一些操作
}
}
?>
我个人也觉得它更易读。
这是我编写的用于简化 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);
我花了很长时间才追踪到这个问题,所以我认为它可能对其他人有用。
如果您使用存储过程,并且需要从存储过程中获取结果集
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;
}
(为了清晰起见,已删除错误检查)