PDO 中的游标是什么?
What is a cursor in PDO?
比如closeCursor()
方法中提到的,是遍历结果集时的实际指针还是存储过程中使用的游标?
在 PDOStatement::execute()
页面上显示:
Some drivers require to close cursor before executing next statement.
你在遍历结果集时说它是一个指针,基本上是对的,但它是MySQL位置,而不是PHP一个。在这种情况下,PDO 告诉 MySQL 重置其位置,因为将丢弃任何进一步未获取的结果。
PHP 本身不跟踪光标。
游标只不过是一个指针。这个词根据上下文有不同的含义,但它或多或少总是意味着指向另一件事。
在数据库的上下文中,存在 database cursors。隐式地每个结果集都有一个游标。您还可以声明特殊游标,例如在存储过程中。通常,游标是只进迭代器,但一些数据库提供更高级的选项。
PDO不是数据库,那么游标在PDO上下文中是什么意思?
根据底层数据库和查询模式,PDO 可能会将所有行预取(缓冲)到 PHP 内存中或从数据库中逐行检索每一行。执行单个查询后也可能有多个结果集。
closeCursor()
如果我们甚至可以说它完全关闭任何东西,则以两种不同的方式“关闭游标”。在无缓冲查询的情况下,关闭意味着从数据库服务器读取所有剩余的行,之后数据库将关闭游标本身。在缓冲查询的情况下,PDO 将释放与结果集关联的内存。它还确保读取和遍历来自服务器的所有未决结果集。
在内部,PDO 的驱动程序将为缓冲的结果保留一个游标。它只是一个指向结果集中当前索引的 int 字段。
如果您正在使用缓冲查询(这是默认设置),那么调用 closeCursor()
似乎毫无用处。如果您使用的是无缓冲查询,那么调用 closeCursor()
似乎也没什么用……除非您想要手动释放数据库连接。这些将是极其罕见的,因为大多数时候你一次处理一个语句并且缓冲查询是常态。
什么是 PDO::ATTR_CURSOR
?
来自php.net:
Selects the cursor type. PDO currently supports either PDO::CURSOR_FWDONLY and PDO::CURSOR_SCROLL. Stick with PDO::CURSOR_FWDONLY unless you know that you need a scrollable cursor.
如上所述,一些数据库支持可滚动游标。不支持结果集的数据库可能仍支持简单的只进游标。
虽然 PDO_MySQL 实际上不支持游标,但 mysqli 支持。让我解释一下他们如何在 MySQL 示例中工作。它不提供可滚动游标,但您可以要求 MySQL 打开一个 单个 不可滚动只读游标。它的工作方式就像 PHP 端的缓冲模式,只是结果不是从服务器获取的。它们在服务器上“缓冲”,并附有一个显式游标。这意味着您仍然可以在连接 link 上执行其他查询,而结果在服务器端挂起。一次只能打开一个游标,这意味着无论如何不能同时 SELECT 两个结果集。此类游标也可以由存储过程打开,但此功能有点损坏...
当然以上都是超高级的PDO用法。大多数用户会对 PHP 中的缓冲结果集感到满意。不要担心游标,它们通常比它们的价值更麻烦。
比如closeCursor()
方法中提到的,是遍历结果集时的实际指针还是存储过程中使用的游标?
在 PDOStatement::execute()
页面上显示:
Some drivers require to close cursor before executing next statement.
你在遍历结果集时说它是一个指针,基本上是对的,但它是MySQL位置,而不是PHP一个。在这种情况下,PDO 告诉 MySQL 重置其位置,因为将丢弃任何进一步未获取的结果。
PHP 本身不跟踪光标。
游标只不过是一个指针。这个词根据上下文有不同的含义,但它或多或少总是意味着指向另一件事。
在数据库的上下文中,存在 database cursors。隐式地每个结果集都有一个游标。您还可以声明特殊游标,例如在存储过程中。通常,游标是只进迭代器,但一些数据库提供更高级的选项。
PDO不是数据库,那么游标在PDO上下文中是什么意思?
根据底层数据库和查询模式,PDO 可能会将所有行预取(缓冲)到 PHP 内存中或从数据库中逐行检索每一行。执行单个查询后也可能有多个结果集。
closeCursor()
如果我们甚至可以说它完全关闭任何东西,则以两种不同的方式“关闭游标”。在无缓冲查询的情况下,关闭意味着从数据库服务器读取所有剩余的行,之后数据库将关闭游标本身。在缓冲查询的情况下,PDO 将释放与结果集关联的内存。它还确保读取和遍历来自服务器的所有未决结果集。
在内部,PDO 的驱动程序将为缓冲的结果保留一个游标。它只是一个指向结果集中当前索引的 int 字段。
如果您正在使用缓冲查询(这是默认设置),那么调用 closeCursor()
似乎毫无用处。如果您使用的是无缓冲查询,那么调用 closeCursor()
似乎也没什么用……除非您想要手动释放数据库连接。这些将是极其罕见的,因为大多数时候你一次处理一个语句并且缓冲查询是常态。
什么是 PDO::ATTR_CURSOR
?
来自php.net:
Selects the cursor type. PDO currently supports either PDO::CURSOR_FWDONLY and PDO::CURSOR_SCROLL. Stick with PDO::CURSOR_FWDONLY unless you know that you need a scrollable cursor.
如上所述,一些数据库支持可滚动游标。不支持结果集的数据库可能仍支持简单的只进游标。
虽然 PDO_MySQL 实际上不支持游标,但 mysqli 支持。让我解释一下他们如何在 MySQL 示例中工作。它不提供可滚动游标,但您可以要求 MySQL 打开一个 单个 不可滚动只读游标。它的工作方式就像 PHP 端的缓冲模式,只是结果不是从服务器获取的。它们在服务器上“缓冲”,并附有一个显式游标。这意味着您仍然可以在连接 link 上执行其他查询,而结果在服务器端挂起。一次只能打开一个游标,这意味着无论如何不能同时 SELECT 两个结果集。此类游标也可以由存储过程打开,但此功能有点损坏...
当然以上都是超高级的PDO用法。大多数用户会对 PHP 中的缓冲结果集感到满意。不要担心游标,它们通常比它们的价值更麻烦。