假设您有一个返回大量行的查询:
$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 库。