我正在尝试使用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的值)。一直都是。
也许我做错了什么,但使用游标进行分页的艺术似乎有点晦涩难懂,文档也很少……
发布于 2011-11-01 13:10:12
我今天才遇到这个问题。PDOStatement::rowCount()在某些数据库上不适用于SELECT。来自PDOStatement::rowCount:
如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。然而,并不是所有的数据库都能保证这种行为,因此不应该依赖于可移植的应用程序。
我花了相当长的时间才意识到这一点,因为我认为这是使用游标的问题。
这是我采取的方法:用以下代码替换PDOStatement::rowCount()的用法:
<?php
$row_count = count($stmt->fetchAll());
?>它在内存方面效率不高,但这是许多数据库用来计算总行数的方法。
https://stackoverflow.com/questions/7504426
复制相似问题