对于那些尝试从 oracle 迁移的人来说,pg_fetch_all 返回一个数组,其中行和列在 ocifetchall 的意义上是颠倒的。在你的代码将第一个索引作为列名,第二个索引作为行索引之前,你需要对这个结果数组进行转置。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_fetch_all — 将结果集中的所有行作为数组获取
result
一个 PgSql\Result 实例,由 pg_query()、pg_query_params() 或 pg_execute()(以及其他)返回。
mode
一个可选参数,控制返回的 array 的索引方式。 mode
是一个常量,可以取以下值:PGSQL_ASSOC
、PGSQL_NUM
和 PGSQL_BOTH
。使用 PGSQL_NUM
,函数将返回一个具有数值索引的数组,使用 PGSQL_ASSOC
,它将只返回关联索引,而 PGSQL_BOTH
将返回数值和关联索引。
一个包含结果集中所有行的 array。每行都是一个字段值的数组,由字段名索引。
版本 | 说明 |
---|---|
8.1.0 | result 参数现在期望一个 PgSql\Result 实例;之前,期望的是一个 资源。 |
8.0.0 |
pg_fetch_all() 现在将返回一个空的 array,而不是对于具有零行的结果集返回 false 。 |
7.1.0 | 添加了 mode 参数。 |
示例 #1 PostgreSQL 获取所有
<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "An error occurred.\n";
exit;
}
$result = pg_query($conn, "SELECT * FROM authors");
if (!$result) {
echo "An error occurred.\n";
exit;
}
$arr = pg_fetch_all($result);
print_r($arr);
?>
上面的例子将输出类似于
Array ( [0] => Array ( [id] => 1 [name] => Fred ) [1] => Array ( [id] => 2 [name] => Bob ) )
对于那些尝试从 oracle 迁移的人来说,pg_fetch_all 返回一个数组,其中行和列在 ocifetchall 的意义上是颠倒的。在你的代码将第一个索引作为列名,第二个索引作为行索引之前,你需要对这个结果数组进行转置。
pg_fetch_all,尽管有应用程序说明,但只接受一个参数,即结果集。它完全按预期执行,返回结果集的二维数组。我怀疑给出的应用程序说明只是从 pg_fetch_array 复制的,而 pg_fetch_array 是你想要用于单行的函数。
看起来 pg_fetch_all() 仅在 4.3.x 版本上有效。我在 4.2.2 版本中尝试过,它不识别该函数,所以我认为它在 4 => 4.2.x 版本上不会生效。
对于那些想知道的人来说,这个函数返回一个二维数组,第一个维度是一个基于 0 的索引数组,第二个维度是一个关联数组。所以你可以使用 $authors[0]["surname"] 访问第一个作者的姓氏。
当然,在 PHP 5.2.9 中就是这样,但我不能保证其他版本也是这样。
请注意,pg_fetch_all() 与 pg_fetch_assoc() 有相同的限制,也就是说,如果你的查询返回了多个具有相同名称(或别名)的列,那么只有最右边的列才会在关联数组中返回,其他的列不会返回。
一个简单的例子
<?php
$res = pg_query(
"SELECT a.*, b.* -- 从两个表中获取所有列
FROM table1 AS a
LEFT OUTER JOIN table2 as b
USING (column)"
);
$rows = pg_fetch_all($res);
?>
在这个例子中,由于我们通过 * 选择列,如果 table2 中的任何列与 table1 中的列具有相同的名称,那么它们将被返回,尽管 table2(作为外连接的可选侧)可能会返回 NULL 值。
这不是一个错误,只是关联数组的一般限制,可以通过仔细构建你的查询和使用列别名来避免混淆,很容易避免。
如果你在 pg_hba.conf 文件中使用 md5 方法配置了一个连接,并且你没有为该用户设置密码,那么你必须通过 "alter role" PostgreSQL 命令来定义一个密码
alter role user_name encrypted password 'user_password';
此外,如果你通过 TCP/IP 类型(主机)进行连接,并且你的 IP 地址与 (localhost) 不同,例如 (127.0.1.1),那么你必须取消 postgresql.conf 文件中以下行的注释,并添加你的 IP 地址
listen_addresses = 'localhost,127.0.1.1'
保存新配置后,你必须重新启动 PostgreSQL 服务。
对于那些尚未支持新名称或较新函数的 PHP 版本,我编写了几个类似于此函数的函数
如果 (! function_exists("pg_fetch_all")) {
function pg_fetch_all($res, $kind="assoc") {
$i = 0; // 循环 pg_fetch_array 中的行整数需要这个
if ($kind == "assoc") {
while ($row = pg_fetch_array($res, $i, PGSQL_ASSOC)) {
$array_out[] = $row;
$i++;
}else{
while ($row = pg_fetch_array($res)) {
$array_out[] = $row;
}
}
return $array_out;
}
}