如果您使用 PGSQL_ASSOC 或 PGSQL_BOTH,列名始终为小写,无论数据库或查询中的名称是什么。
(PHP 4, PHP 5, PHP 7, PHP 8)
pg_fetch_array — 将一行作为数组提取
pg_fetch_array() 返回一个对应于提取的行(记录)的数组。
pg_fetch_array() 是 pg_fetch_row() 的扩展版本。除了将数据存储在结果数组的数字索引(字段编号)中之外,它还可以使用关联索引(字段名称)存储数据。默认情况下,它同时存储这两种索引。
注意:此函数将 NULL 字段设置为 PHP 的
null
值。
pg_fetch_array() 的速度与使用 pg_fetch_row() 相比并没有显著降低,而且使用起来方便得多。
result
一个 PgSql\Result 实例,由 pg_query()、pg_query_params() 或 pg_execute()(以及其他函数)返回。
row
要提取的结果中的行号。行从 0 开始编号。如果省略或为 null
,则提取下一行。
mode
一个可选参数,用于控制返回的 array 的索引方式。mode
是一个常量,可以取以下值:PGSQL_ASSOC
、PGSQL_NUM
和 PGSQL_BOTH
。使用 PGSQL_NUM
,函数将返回一个具有数字索引的数组;使用 PGSQL_ASSOC
,它将只返回关联索引;而 PGSQL_BOTH
将同时返回数字和关联索引。
一个 array,按数字索引(从 0 开始)或关联索引(按字段名称索引),或两者兼有。数组中的每个值都表示为 string。数据库 NULL
值将返回为 null
。
如果 row
超出集合中的行数,没有更多行,或者出现任何其他错误,则返回 false
。从 SELECT 以外的查询结果中提取数据也会返回 false
。
版本 | 描述 |
---|---|
8.1.0 | result 参数现在期望一个 PgSql\Result 实例;以前,期望的是一个 resource。 |
示例 #1 pg_fetch_array() 示例
<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "发生错误。\n";
exit;
}
$result = pg_query($conn, "SELECT author, email FROM authors");
if (!$result) {
echo "发生错误。\n";
exit;
}
$arr = pg_fetch_array($result, 0, PGSQL_NUM);
echo $arr[0] . " <- 第 1 行 作者\n";
echo $arr[1] . " <- 第 1 行 电子邮件\n";
// row 参数是可选的;可以传递 NULL 代替,
// 以传递 result_type。对 pg_fetch_array 的连续调用
// 将返回下一行。
$arr = pg_fetch_array($result, NULL, PGSQL_ASSOC);
echo $arr["author"] . " <- 第 2 行 作者\n";
echo $arr["email"] . " <- 第 2 行 电子邮件\n";
$arr = pg_fetch_array($result);
echo $arr["author"] . " <- 第 3 行 作者\n";
echo $arr[1] . " <- 第 3 行 电子邮件\n";
?>
从 PHP 4.1.0 开始,您现在可以使用如下代码迭代结果集
$conn = pg_connect("host=localhost dbname=whatever");
$result = pg_exec($conn, "select * from table");
while ($row = pg_fetch_array($result))
{
echo "data: ".$row["data"];
}
这可以节省很多时间,PHP 与 MySQL 一直支持这个功能,我很高兴看到它也扩展到了 PostgreSQL……
PGSQL_BOTH 是默认值,这意味着您的数组大小将加倍。
如果您指定此字段(结果类型),请不要在其周围加上引号,否则您将得不到任何数据,甚至不会得到错误。
这是我的包装函数
function SQL_fetch_array($result_ndx, $row, $result_type=PGSQL_ASSOC) {
return pg_fetch_array($result_ndx, $row, $result_type);
除了在没有更多行时返回“false”外,pg_fetch_array还会触发E_WARNING警告。您可以暂时关闭该错误报告级别,并像这样提取所有数据:
<?php
$errRptLvl = error_reporting();
error_reporting($errRptLvl & ~(E_WARNING));
list($i,$j)=array(0,0);
while ($selection[$i++] = $this->fetchArray($j++)); // (fetchArray 是 pg_fetch_array 的包装函数。)
error_reporting($errRptLvl); // 恢复错误报告级别。
unset($selection[$i-1]); // 删除最后一行空行。
return $selection;
?>
请注意,当使用PGSQL_BOTH时,数字索引字段和关联索引字段是单独的变量,并被分别处理。
<?php
$res = pg_query("Select 'foo' as bar");
$data = pg_fetch_array($res, 0, PGSQL_BOTH);
var_dump($data);
// Array(2)
// {
// [0] => string(3) "foo"
// ["bar"] => string(3) "foo"
// }
// 这不会影响 $data['bar']
$data[0] = 'bar';
var_dump($data);
// Array(2)
// {
// [0] => string(3) "bar"
// ["bar"] => string(3) "foo"
// }
?>
如果您希望数字索引和关联索引之间存在引用绑定,则必须自行建立。
<?php
$result = pg_query("Select 'foo' as bar");
$data = pg_fetch_row($result);
// 建立列名/列号之间的引用
$from = $data;
foreach($from as $cx => $value)
{
$key = pg_field_name($result, $cx);
if (is_string($key)) $data[$key] =& $data[$cx];
}
var_dump($data);
// Array(2)
// {
// [0] => &string(3) "foo"
// ["bar"] => &string(3) "foo"
// }
// 注意 $data[0] 和 $data['bar'] 之间的引用绑定
$data[0] = 'baz';
var_dump($data);
// Array(2)
// {
// [0] => &string(3) "baz"
// ["bar"] => &string(3) "baz"
// }
?>
(省时技巧) 请注意,该函数返回的数组中的键(至少在4.2.3版本中)与SQL列名的大小写相同(例如,如果您的列名为ID,则键名也是ID,而不是id或Id),并且关联数组中的键区分大小写!!!因此,如果您得到意外的结果,请不要感到惊讶。请仔细检查SQL列名和键名。
针对eth0在下面关于从两个表中SELECT,而这两个表具有相同名称的列的评论,您可以像这样解决此问题:
"SELECT table1.foo AS foo1, table2.foo AS foo2 FROM table1, table2"
在返回的关联数组中,键将是“foo1”和“foo2”。
希望大多数人自己就能意识到这一点,但在下面的例子中,人们试图通过在结果中获取数字键或关联键(而不是两者)来发挥创意,这是相当没有意义的。请参阅pg_fetch_assoc()和pg_fetch_row(),这两个内置函数可以自动执行此操作。除非您*需要*同时通过列名和索引访问字段,否则通常最好使用这两个函数之一。
由于结果类型的指定方式不是很清楚,所以我发布了这条消息。
我编写了一个包装函数,如下所示:
<?php
function db_fetch_array ($result, $row = NULL, $result_type = PGSQL_ASSOC)
{
$return = @pg_fetch_array ($result, $row, $result_type);
return $return;
}
?>
我认为这样可以很方便地获取所需的数组。
请记住,如果您例如有一个名为Customers的表,其中包含“cust_ID”、“name”和“address”,还有一个名为Users的表,其中包含“u_ID”、“name”和“other”,然后您使用SELECT WHERE cust_ID=u_ID进行查询,那么您将在结果数组中只得到一个“name”字段,也就是SELECT语句最后返回的那个!!!
请记住,当您使用'or die'时,要关闭您的表,否则非Internet Explorer用户可能会感到困惑。