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 将返回数字和关联索引。

返回值

一个按数字(从 0 开始)或关联(按字段名称索引)或两者索引的 arrayarray 中的每个值都表示为 string。数据库 NULL 值将返回为 null

如果 row 超出集合中的行数、没有更多行或发生任何其他错误,则返回 false。从除 SELECT 之外的查询结果中获取数据也会返回 false

变更日志

版本 描述
8.1.0 result 参数现在需要一个 PgSql\Result 实例;之前需要一个 资源

示例

示例 #1 pg_fetch_array() 示例

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

$arr = pg_fetch_array($result, 0, PGSQL_NUM);
echo
$arr[0] . " <- Row 1 Author\n";
echo
$arr[1] . " <- Row 1 E-mail\n";

// The row parameter is optional; NULL can be passed instead,
// to pass a result_type. Successive calls to pg_fetch_array
// will return the next row.
$arr = pg_fetch_array($result, NULL, PGSQL_ASSOC);
echo
$arr["author"] . " <- Row 2 Author\n";
echo
$arr["email"] . " <- Row 2 E-mail\n";

$arr = pg_fetch_array($result);
echo
$arr["author"] . " <- Row 3 Author\n";
echo
$arr[1] . " <- Row 3 E-mail\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
14 年前
请注意,当使用 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
20 年前
只是因为如何指定结果类型并不清楚,所以我发布了这条消息。

我写了一个包装函数,它看起来像这样

<?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
22 年前
请记住,如果你有一个名为 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' 时,要关闭你的表(s),否则你可能会从非 Internet Explorer 用户那里得到一个困惑的表情。
Dave O
19 年前
我从邮件列表的帮助中发现了这一点。如果你需要重置内部计数器,请使用 pg_result_seek,类似于

pg_result_seek($result, 0)

... 从函数文档页面上的评论中剽窃而来。
To Top