PHP Conference Japan 2024

pg_fetch_array

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_array将一行作为数组提取

描述

pg_fetch_array(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false

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_ASSOCPGSQL_NUMPGSQL_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";

?>

参见

添加注释

用户贡献的注释 12 条注释

mkb at ele dot uri dot edu
23 年前
如果您使用 PGSQL_ASSOC 或 PGSQL_BOTH,列名始终为小写,无论数据库或查询中的名称是什么。
jesse at sokieserv dot dhs dot org
22 年前
从 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……
gherson at snet dot net
23 年前
PGSQL_BOTH 是默认值,这意味着您的数组大小将加倍。
如果您指定此字段(结果类型),请不要在其周围加上引号,否则您将得不到任何数据,甚至不会得到错误。
这是我的包装函数
function SQL_fetch_array($result_ndx, $row, $result_type=PGSQL_ASSOC) {
return pg_fetch_array($result_ndx, $row, $result_type);
gherson at snet dot net
23 年前
除了在没有更多行时返回“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;
?>
strata_ranger at hotmail dot com
15年前
请注意,当使用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"
// }

?>
akm at e-nterart dot pl
21年前
(省时技巧) 请注意,该函数返回的数组中的键(至少在4.2.3版本中)与SQL列名的大小写相同(例如,如果您的列名为ID,则键名也是ID,而不是id或Id),并且关联数组中的键区分大小写!!!因此,如果您得到意外的结果,请不要感到惊讶。请仔细检查SQL列名和键名。
devnull
19年前
针对eth0在下面关于从两个表中SELECT,而这两个表具有相同名称的列的评论,您可以像这样解决此问题:

"SELECT table1.foo AS foo1, table2.foo AS foo2 FROM table1, table2"

在返回的关联数组中,键将是“foo1”和“foo2”。
anonymous
19年前
希望大多数人自己就能意识到这一点,但在下面的例子中,人们试图通过在结果中获取数字键或关联键(而不是两者)来发挥创意,这是相当没有意义的。请参阅pg_fetch_assoc()和pg_fetch_row(),这两个内置函数可以自动执行此操作。除非您*需要*同时通过列名和索引访问字段,否则通常最好使用这两个函数之一。
enyo at www.red-link.com
21年前
由于结果类型的指定方式不是很清楚,所以我发布了这条消息。

我编写了一个包装函数,如下所示:

<?php
function db_fetch_array ($result, $row = NULL, $result_type = PGSQL_ASSOC)
{
$return = @pg_fetch_array ($result, $row, $result_type);
return
$return;
}
?>

我认为这样可以很方便地获取所需的数组。
eth0 at fins
23 年前
请记住,如果您例如有一个名为Customers的表,其中包含“cust_ID”、“name”和“address”,还有一个名为Users的表,其中包含“u_ID”、“name”和“other”,然后您使用SELECT WHERE cust_ID=u_ID进行查询,那么您将在结果数组中只得到一个“name”字段,也就是SELECT语句最后返回的那个!!!
elliot at nospam dot rightnowtech dot com
23 年前
请记住,当您使用'or die'时,要关闭您的表,否则非Internet Explorer用户可能会感到困惑。
Dave O
19年前
我通过邮件列表的帮助发现了这一点。如果您需要重置内部计数器,请使用pg_result_seek,类似于:

pg_result_seek($result, 0)

……摘自该函数文档页面上的注释。
To Top