首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用绝对位置游标的PDO pgsql读取失败

使用绝对位置游标的PDO pgsql读取失败
EN

Stack Overflow用户
提问于 2011-09-22 02:01:00
回答 1查看 610关注 0票数 1

我正在尝试使用PDO创建游标的能力来实现分页功能。

目前,我的代码看起来有点像这样(非常复杂,我知道):

代码语言:javascript
复制
$pdo = new PDO();
$pdo->setAttribute(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL);
// prepared select-query omitted
$pdoStatement = $pdo->execute();

$start_index = MAX_THINGS_PER_PAGE * $current_page - MAX_THINGS_PER_PAGE;
$stop_index = MAX_THINGS_PER_PAGE * $current_page;
$row_count = $this->statement->rowCount(); // works for the PgSQL driver
$index = $start_index;
while (($row_count > 0) && ($index < $stop_index))
{
    // try-catch block omitted
    $values[] = $this->statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $index);

    --$row_count;
    ++$index;
}

但是,似乎无论$start_index是什么,查询都只提取结果集的前10行(即MAX_THINGS_PER_PAGE的值)。一直都是。

也许我做错了什么,但使用游标进行分页的艺术似乎有点晦涩难懂,文档也很少……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-01 13:10:12

我今天才遇到这个问题。PDOStatement::rowCount()在某些数据库上不适用于SELECT。来自PDOStatement::rowCount

如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。然而,并不是所有的数据库都能保证这种行为,因此不应该依赖于可移植的应用程序。

我花了相当长的时间才意识到这一点,因为我认为这是使用游标的问题。

这是我采取的方法:用以下代码替换PDOStatement::rowCount()的用法:

代码语言:javascript
复制
<?php
$row_count = count($stmt->fetchAll());
?>

它在内存方面效率不高,但这是许多数据库用来计算总行数的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7504426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档