PHP PDO分页foreach

时间:2017-01-22 07:50:37

标签: php mysql pdo pagination

我试图为我的PDO查询创建分页。我弄清楚了。我尝试了很多谷歌搜索,但没有任何对我有用的东西。 [我可能没有足够的搜索。我不确定]

这是我的代码:

$sql2 = "SELECT * FROM comments WHERE shown = '1'ORDER BY ID DESC";
$stm2 = $dbh->prepare($sql2);
$stm2->execute();
$nodes2= $stm2->fetchAll();

foreach ($nodes2 as $n1) {
echo "text";
}

我希望每页限制10条评论,并为页面使用$ _GET [' PAGE']。

我试过的东西

$sql2 = "SELECT * FROM comments WHERE shown = '1'ORDER BY ID DESC";
$stm2 = $dbh->prepare($sql2);  
$stm2->execute();
$nodes2= $stm2->fetchAll();

$page_of_pagination = 1;
$chunked = array_chunk($nodes2->get_items(), 10); 
foreach ($chunked[$page_of_pagination] as $n1) {
 echo "text";
}

如果有人可以提供帮助,我很感激。

1 个答案:

答案 0 :(得分:-1)

您需要限制正在执行的查询,从数据库中获取所有值,然后将结果限制为您想要的设计选择,因为它的效率非常低。

你需要这样做:

$page = (int)$_GET['PAGE']; // to prevent injection attacks or other issues
$rowsPerPage = 10;
$startLimit = ($page - 1) * $rowsPerPage; // -1 because you need to start from 0
$sql2 = "SELECT * FROM comments WHERE shown = '1' ORDER BY ID DESC LIMIT {$startLimit}, {$rowsPerPage}";

LIMIT做了什么:

  

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量

此处提供更多信息:http://dev.mysql.com/doc/refman/5.7/en/select.html

然后你可以继续获得结果并显示它。

评论后修改:

要获取所有要显示的页面,您需要知道有多少页面,因此您需要使用相同的过滤器对SELECT语句进行计数,这意味着:

SELECT COUNT(*) as count FROM comments WHERE shown = '1'

将此计数存储在变量中。要获取页数,请将计数除以要显示和舍入的每页的行数:

$totalNumberOfPages = ceil($count / $rowsPerPage);

并显示它们:

foreach(range(1, $totalNumberOfPages) as $pageNumber) {
    echo '<a href="?page=' . $pageNumber . '">' . $pageNumber . '</a>';
}