PHP Conference Japan 2024

pg_fetch_all

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_fetch_all将结果集中的所有行作为数组提取

描述

pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): array

pg_fetch_all() 返回一个数组,其中包含 PgSql\Result 实例中的所有行(记录)。

注意: 此函数将 NULL 字段设置为 PHP 的 null 值。

参数

result

一个 PgSql\Result 实例,由 pg_query()pg_query_params()pg_execute()(以及其他函数)返回。

mode

一个可选参数,用于控制返回的 array 如何索引。mode 是一个常量,可以取以下值:PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。使用 PGSQL_NUM,函数将返回一个具有数字索引的数组;使用 PGSQL_ASSOC,它将只返回关联索引;而 PGSQL_BOTH 将返回数字和关联索引。

返回值

一个 array,包含结果中的所有行。每一行都是一个字段值数组,按字段名称索引。

变更日志

版本 描述
8.1.0 result 参数现在需要一个 PgSql\Result 实例;以前需要一个 resource
8.0.0 pg_fetch_all() 现在将返回一个空 array,而不是对于零行结果集返回 false
7.1.0 添加了 mode 参数。

示例

示例 #1 PostgreSQL 获取所有数据

<?php
$conn
= pg_pconnect("dbname=publisher");
if (!
$conn) {
echo
"发生错误。\n";
exit;
}

$result = pg_query($conn, "SELECT * FROM authors");
if (!
$result) {
echo
"发生错误。\n";
exit;
}

$arr = pg_fetch_all($result);

print_r($arr);

?>

以上示例将输出类似于以下内容

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Fred
        )

    [1] => Array
        (
            [id] => 2
            [name] => Bob
        )

)

参见

添加注释

用户贡献的注释 9 条注释

匿名
21 年前
对于那些试图从 Oracle 迁移的人来说,pg_fetch_all 返回的数组的行和列与 ocifetchall 的意义相反。在代码将第一个索引作为列名,第二个索引作为行索引之前,需要转置此结果数组。
ilhan at ilhan dot name
8 年前
PG 函数将数据检索为字符串。如果需要自动转换,则需要使用 PDO。
jcomeau at whatisthewww dot com
21 年前
尽管应用说明中有所提及,但 pg_fetch_all 只接受一个参数,即结果集。它完全按照预期工作,返回结果集的二维数组。我怀疑给出的应用说明只是从 pg_fetch_array 复制的,而 pg_fetch_array 正是您想要用于单行的函数。
tasmanian at devil dot com
21 年前
pg_fetch_all() 似乎只在 4.3.x 版本中有效。我在 4.2.2 版本中尝试过,它不识别此函数,因此我认为它在 4 => 4.2.x 版本中无效。
prefer_not_to at say dot com
15 年前
对于那些想知道的人来说,此函数返回一个二维数组,第一维是一个基于 0 的索引数组,第二维是一个关联数组。因此,您可以使用 $authors[0]["surname"] 来访问第一个作者的姓氏。

当然,在 PHP 5.2.9 中就是这样,但我无法保证其他版本也是如此。
strata_ranger at hotmail dot com
15 年前
请注意,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 值,它们也将是返回的列。

这不是一个错误,只是关联数组的一般限制,可以通过仔细构造查询和使用列别名来避免混淆。
viniciusweb at gmail dot com
19 年前
如果参数为 false,则此函数返回 NULL。
humbertoibanez at gmail dot com
9 年前
如果您在 pg_hba.conf 文件中配置了使用 md5 方法的连接,并且没有为该用户设置密码,则必须使用 PostgreSQL 的“alter role”命令定义一个密码。

alter role 用户名 encrypted password '用户密码';

此外,如果您通过 TCP/IP (host) 类型连接,并且您的 IP 地址与 (localhost) 不同,例如 (127.0.1.1),则必须取消 postgresql.conf 文件中以下行的注释,并添加您的 IP 地址。

listen_addresses = 'localhost,127.0.1.1'

保存新的配置后,必须重新启动 PostgreSQL 服务。
php dot net at mechintosh dot com
21 年前
对于尚不支持新名称或较新函数的 PHP 版本,我编写了几个这样的函数

if (! function_exists("pg_fetch_all")) {
function pg_fetch_all($res, $kind="assoc") {
$i = 0; // 这在循环 pg_fetch_array 中的 row 整数需要
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;
}
}
To Top