且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

php中的分页

更新时间:2023-02-25 15:01:00

该解决方案***通过 SQL 的限制/偏移子句实现.对于 MySQL,这是通过将 LIMIT [offset] [count] 附加到您的查询来实现的.PostgreSQL 使用单独的 select ... LIMIT [count] OFFSET [offset] 语法.

The solution is best achieved via SQL's limit/offset clauses. For MySQL, this is achieved via appending LIMIT [offset] [count] to your query. PostgreSQL uses separate select ... LIMIT [count] OFFSET [offset] syntax.

这个想法是您将返回的结果数量限制为您想要显示的实际数量.如果您显示 200 页中的第 1 页,每页有 100 个结果,它可以显着提高性能.

The idea is you limit the number of results returned to the actual number you want to display. It can yield a huge performance increase if you're displaying page 1 of 200, with a hundred results per page.

当然,您需要运行第二个查询 - 一个 select count(*) from ... 以确定结果集中的结果数.将其除以每页的结果数,您就得到了页数.

Of course, you need to run a second query - a select count(*) from ... to determine the number of results in the result set. Divide this by the number of results per page, and you've got the number of pages.

您可能希望在查询字符串中传递一个页面参数,例如

You will likely want to pass a page parameter in the query string, something like

http://mysite.com/index.php?page=7

然后使用类似的方法提取数据(考虑这个伪代码;我知道我实际上没有正确查询)

and then pull the data using a similar method (consider this pseudo code; I know I'm not actually querying properly)

<?php

$num_per_page = 20; // 20 results per page

$page = isset($_GET['page']) ? $_GET['page'] : 0; // start from page 0

// Build our big query minus the SELECT part here
$from_part = 'tbl_results [where ...]"'

$num_results = query("SELECT COUNT(*) FROM $from_part");

// Use ceil to round upwards
$num_pages = ceil($num_results / $num_per_page);

// Cap the page a the last page
if ($page > $num_pages)
  $page = $num_pages;

// Cap the page at the first page
if ($page <= 1)
  $page = 1;

$offset = $page * $num_per_page;

// Build the final query to select the relevant page of data
$results = query("SELECT * FROM $from_part LIMIT $offset, $num_per_page");

?>