如果您使用 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
将返回数字和关联索引。
一个按数字(从 0 开始)或关联(按字段名称索引)或两者索引的 array。array 中的每个值都表示为 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";
?>
从 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' 时,要关闭你的表(s),否则你可能会从非 Internet Explorer 用户那里得到一个困惑的表情。