【问题标题】:Does PHP's pg_fetch_assoc() use an Iterator/Cursor?PHP 的 pg_fetch_assoc() 是否使用迭代器/游标?
【发布时间】:2020-05-07 19:28:47
【问题描述】:

PHP 内部函数pg_fetch_assoc()

使用迭代器/游标,还是一次性获取所有数据?

\PDO 会使用光标吗?

我的上下文正在获取大量数据,我想知道它是作为一个整体提取还是逐行提取(或者当游标包含完整数据集的子集时,是逐行限制)。

【问题讨论】:

  • 我的经验是它会一次全部获取,因为如果我收到太多行,我会收到内存分配错误。但是,MySQL 和 ORA 版本的 fetch_assoc 从来没有给我内存分配错误。免责声明:我从 2009 年开始就没有使用过 PG 函数,所以现在的函数实现可能会有所不同。
  • re:您的编辑 - 在返回或传递时分配内存?
  • @treyBake 是从数据库服务器中提取整个数据集还是仅从光标中提取数据(我没有否决您的答案); (将措辞从“内存分配”更改为“全部或部分提取数据”);
  • @DanielW。我相信光标中的数据,因为我们将 $result 作为参数传递,而不是在函数中创建它:)

标签: php postgresql pdo iterator php-pgsql


【解决方案1】:

pg_fetch_assoc() 两者都没有。它是一个从 PHP 资源中获取关联数组的函数。例如,资源可以是调用PQexecPrepared 的结果。

在 API 级别 PHP-pgsql 没有游标函数。您可以尝试使用 PDO,如果您启用可滚动游标模式,它会模拟 PostgreSQL 的游标。请参阅prepare() for more details. 另一种选择是自己使用 SQL 游标语句。

这个答案解释得更多:php postgres from query to fetching rows in theory

这是PDO source code的链接,它负责用SQL语句模拟游标。

【讨论】:

    【解决方案2】:

    数据通过$result传递:

    (取自打开的pgsql.php 文件(PHPStorm 中函数名上的CTRL + Click):

    /**
     * Fetch a row as an associative array
     * @link https://php.net/manual/en/function.pg-fetch-assoc.php
     * @param resource $result <p>
     * PostgreSQL query result resource, returned by <b>pg_query</b>,
     * <b>pg_query_params</b> or <b>pg_execute</b>
     * (among others).
     * </p>
     * @param int $row [optional] <p>
     * Row number in result to fetch. Rows are numbered from 0 upwards. If
     * omitted or <b>NULL</b>, the next row is fetched.
     * </p>
     * @return array An array indexed associatively (by field name).
     * Each value in the array is represented as a
     * string. Database NULL
     * values are returned as <b>NULL</b>.
     * </p>
     * <p>
     * <b>FALSE</b> is returned if <i>row</i> exceeds the number
     * of rows in the set, there are no more rows, or on any other error.
     * @since 4.3
     * @since 5.0
     */
    function pg_fetch_assoc ($result, $row = null) {}
    

    $result 中的行是一个编号数组/对象,包含它拥有的所有数据。它只是返回该数组/对象中的行,因此它处理传递的游标中的任何数据。我们可以从上面代码中的一行得到这个(格式化以便更好地阅读):

    @param 资源 $result
    PostgreSQL 查询结果资源,由
    返回 pg_query、pg_query_params 或 pg_execute

    【讨论】:

    • 这是一个正确的答案,但我认为你错过了一点。在字里行间阅读我认为 OP 想知道如何将光标模式与 PG api 一起使用。
    • @Dharman 啊,我有时有点过于直白了哈哈 :) 我会等待 OP 发表评论/回复,然后我会相应地修改(如果可以的话):)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2021-11-12
    • 2013-11-23
    相关资源
    最近更新 更多