【问题标题】:PHP Pagination CodePHP分页代码
【发布时间】:2011-03-11 10:49:12
【问题描述】:

所以我要做的是创建分页,最多显示 5 页。如果我的 MySQL 语句只返回五页,则返回这五页。否则,在每个方向返回 2 页。所以理想情况下,如果我目前在第 1 页,它会显示第 1 2 3 4 5 页。如果我在第 5 页并且最多有 5 页,则显示 1 2 3 4 5。但是,如果我在第 20 页,总共有 100 个,我想显示 18 19 20 21 22。有什么建议吗?

【问题讨论】:

  • 这个问题应该被标记为MySQL;它只是与 PHP 间接相关。
  • @Evan - 实际上我会反对。 MySQL 只是一个数据提供者,而 PHP 负责处理页面布局逻辑的繁重工作。
  • @Dolph - 这个问题似乎很笼统。提供的答案更多地作为一个起点。 Brian 正在询问具体的实施细节。

标签: php pagination


【解决方案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 库。

【讨论】:

    【解决方案2】:

    对于较大的页面计数,您的建议会使用户难以轻松导航到较远的页面。考虑使用此处描述的“对数”技术:

    How to do page navigation for many, many pages? Logarithmic page navigation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多