所以我要做的就是创建分页,最多显示5页。如果我的MySQL语句只返回了五个页面,则返回五页。否则,每个方向返回2页。理想情况下,如果我目前在第1页,它显示页面1 2 3 4 5.如果我在第5页并且最多有5页,请显示1 2 3 4 5.但是,如果我在第20页,共有100个,我想显示18 19 20 21 22.有什么建议吗?
答案 0 :(得分:1)
假设您有一个返回大量行的查询:
$query_results = array(...);
您对页面上显示的结果数量有最大限制:
$results_per_page = 20;
现在,您需要的总页数是
$total_pages = ceil(count($query_results)/$results_per_page);
但现在是棘手的部分;您需要知道用户所在的页面以及该页面上显示的结果。假设您通过一个简单的GET变量确定页码:
yoursite.com/results.php?page=2
因此,第1页对应于结果0 - 19,第2页至第20 - 29页等。然后,您可以确定在此处显示的结果如下:
$page = min($_GET['page'], $total_pages); //ensures you never have an illegal page
$start_results = ($page - 1) * $results_per_page;
$results_on_page = array_slice($query_results, $start_results, $results_per_page);
现在,您可以根据需要以HTML格式显示这些内容。但是链接怎么样?你说你想要两个方向的两个链接,页面上总共有五个链接。
$total_links = 5;
$pivot = floor($total_links / 2);
$leftmost = max(1, $page - $pivot);
$rightmost = min($total_pages, $page + $pivot);
$links = array();
for ($i = $leftmost; $i <= $rightmost; $i++) {
$links[] = "results.php?page=$i";
}
这将为您提供一系列链接供您在页面上显示。我会把那部分留给你。
现在,这将起作用,但对于大型结果集来说效率极低,因为所有处理和限制都是在从数据库返回之后发生的。因此,您可能希望在查询中执行此操作。我将把它作为练习留给读者,但这里有一个提示让你开始:
SELECT * FROM some_table LIMIT $results_per_page OFFSET ($page - 1) * $results_per_page
话虽如此,滚动自己的代码以获得如此平凡和普通的东西是一种很好的学习体验,但很少能很好地利用你的时间。如果这适用于任何类型的专业工作,请考虑使用预构建的库,如the PEAR pager或Zend Framework的Zend_Paginator库。
答案 1 :(得分:0)
对于较大的页面数量,您所建议的内容使用户很难轻松导航到远程页面。考虑使用此处描述的“对数”技术,而不是:
How to do page navigation for many, many pages? Logarithmic page navigation