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

时间:2011-09-21 18:01:00

标签: php postgresql pdo

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

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

$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的值)。总是

可能我做错了什么,但是使用游标进行分页的艺术似乎有点晦涩难懂......

1 个答案:

答案 0 :(得分:0)

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

  

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

我花了很多时间才意识到这一点,因为我认为使用游标是一个问题。

这是我采用的方法:使用以下内容替换PDOStatement :: rowCount()的使用:

<?php
$row_count = count($stmt->fetchAll());
?>

内存效率不高,但这是许多数据库无论如何都要计算总行数。