我正在尝试使用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的值)。总是
可能我做错了什么,但是使用游标进行分页的艺术似乎有点晦涩难懂......
答案 0 :(得分:0)
我今天遇到了这个问题。 PDOStatement :: rowCount()在某些数据库上不适用于SELECT。来自PDOStatement::rowCount:
如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。
我花了很多时间才意识到这一点,因为我认为使用游标是一个问题。
这是我采用的方法:使用以下内容替换PDOStatement :: rowCount()的使用:
<?php
$row_count = count($stmt->fetchAll());
?>
内存效率不高,但这是许多数据库无论如何都要计算总行数。