分页,即将较大的数据集合分为若干个页面显示,一般常见于数据量较大的网站,如新闻网站、电商网站等。
PHP分页效率终结版(推荐)攻略
什么是分页?
分页,即将较大的数据集合分为若干个页面显示,一般常见于数据量较大的网站,如新闻网站、电商网站等。
PHP分页的基本原理
在PHP中,分页的基本原理就是根据传入的当前页数和每页显示的数据数量进行计算,从数据库中查询相应数量的数据,最后在前端渲染出分页导航条和当前页的数据。
在计算分页的过程中,一般会用到以下几个关键变量:
- 当前页数
- 每页显示的数据数量
- 数据总条数
- 总页数
常用的分页方法和问题
常见的分页方法有两种:基于LIMIT语句的分页和基于游标的分页。
基于LIMIT语句的分页简单易用,但当数据量比较大时,会出现效率问题,因为每次查询数据时都需要计算OFFSET,只要总条数非常大,此时分页的效果将非常拖沓。
基于游标的分页,利用数据库自身的机制进行分页,速度更快,并且可以轻松进行查询优化,但是实现起来较为复杂。
此外,分页还有一些常见的问题,例如数据总条数变化、页面重复等问题,需要在编写分页代码时予以解决。
效率终结版分页实现方法
这个效率终结版的分页实现方法是基于游标的分页,具体步骤如下:
-
获取排序字段及排序方式,获取当前页数和每页显示的数据数量。
-
执行一条SQL语句获取第一页的数据(假设共有N条数据),查询语句中必须包含排序字段和排序方式。
SELECT * FROM table ORDER BY field ASC/DESC LIMIT 0, perpage;
-
从第一页的数据中获取排序字段最后一项的值,假设这个值为lastVal。
-
执行一条SQL语句获取大于lastVal的perpage条数据。
SELECT * FROM table WHERE field > lastVal ORDER BY field ASC/DESC LIMIT 0, perpage;
-
如果查询到数据,将这些数据进行渲染展示,同时更新lastVal的值。
-
重复执行第4步和第5步,直到查询到的数据为空或者达到了要展示的数量。
-
根据总条数和每页显示的数量计算出总页数。
-
根据当前页码和总页数渲染分页导航条。
这种分页方法相比基于LIMIT语句的分页速度更快,效率更高,而且不会出现数据重复的问题。
示例1:基本用法
以下是一个简单的示例代码:
// 获取当前页数和每页显示的数据数量
$pageNum = isset($_GET['pageNum']) ? $_GET['pageNum'] : 1;
$pageSize = 10;
// 获取排序字段及排序方式
$sortField = 'id';
$sortOrder = 'ASC';
// 计算limit偏移量
$offset = ($pageNum - 1) * $pageSize;
// 查询数据总条数
$sql1 = "SELECT COUNT(*) as count FROM table";
$result1 = $conn->query($sql1);
$row = $result1->fetch_assoc();
$total = $row['count'];
// 计算总页数
$totalPage = ceil($total / $pageSize);
// 查询数据
$sql2 = "SELECT * FROM table ORDER BY $sortField $sortOrder LIMIT $offset, $pageSize";
$result2 = $conn->query($sql2);
// 渲染数据
while ($row = $result2->fetch_assoc()) {
// 渲染数据行
}
// 渲染分页导航条
for ($i = 1; $i <= $totalPage; $i++) {
// 渲染页码链接
}
示例2:分页导航条带省略和数字链接
以下是一个带有省略和数字链接样式的分页导航条示例代码:
// 获取当前页数和每页显示的数据数量
$pageNum = isset($_GET['pageNum']) ? $_GET['pageNum'] : 1;
$pageSize = 10;
// 获取排序字段及排序方式
$sortField = 'id';
$sortOrder = 'ASC';
// 计算limit偏移量
$offset = ($pageNum - 1) * $pageSize;
// 查询数据总条数
$sql1 = "SELECT COUNT(*) as count FROM table";
$result1 = $conn->query($sql1);
$row = $result1->fetch_assoc();
$total = $row['count'];
// 计算总页数
$totalPage = ceil($total / $pageSize);
// 渲染分页导航条
echo '<ul class="pagination">';
// 第一页
if ($pageNum == 1) {
echo '<li class="disabled"><a href="#">«</a></li>';
} else {
echo '<li><a href="?pageNum=1">«</a></li>';
}
// 省略号
if ($pageNum > 4) {
echo '<li><a href="?pageNum='.($pageNum - 3).'">'.($pageNum - 3).'</a></li>';
echo '<li><a href="?pageNum='.($pageNum - 2).'">'.($pageNum - 2).'</a></li>';
echo '<li><a href="?pageNum='.($pageNum - 1).'">'.($pageNum - 1).'</a></li>';
}
// 当前页数左侧的四个链接
if ($pageNum > 1) {
echo '<li><a href="?pageNum='.($pageNum - 1).'">'.($pageNum - 1).'</a></li>';
}
if ($pageNum > 2) {
echo '<li><a href="?pageNum='.($pageNum - 2).'">'.($pageNum - 2).'</a></li>';
}
if ($pageNum > 3) {
echo '<li><a href="?pageNum='.($pageNum - 3).'">'.($pageNum - 3).'</a></li>';
}
if ($pageNum > 4) {
echo '<li class="disabled"><a href="#">...</a></li>';
}
// 当前页
echo '<li class="active"><a href="#">'.$pageNum.'</a></li>';
// 当前页右侧的四个链接
if ($pageNum < $totalPage) {
echo '<li><a href="?pageNum='.($pageNum + 1).'">'.($pageNum + 1).'</a></li>';
}
if ($pageNum < ($totalPage - 1)) {
echo '<li><a href="?pageNum='.($pageNum + 2).'">'.($pageNum + 2).'</a></li>';
}
if ($pageNum < ($totalPage - 2)) {
echo '<li><a href="?pageNum='.($pageNum + 3).'">'.($pageNum + 3).'</a></li>';
}
if ($pageNum < ($totalPage - 3)) {
echo '<li class="disabled"><a href="#">...</a></li>';
}
// 最后一页
if ($pageNum == $totalPage) {
echo '<li class="disabled"><a href="#">»</a></li>';
} else {
echo '<li><a href="?pageNum='.$totalPage.'">»</a></li>';
}
echo '</ul>';
以上就是PHP分页效率终结版(推荐)的完整攻略,希望能对大家有所帮助。
本文标题为:PHP分页效率终结版(推荐)
基础教程推荐
- MariaDB表表达式之公用表表达式(CTE) 2023-07-24
- 浅谈一下关于Python对XML的解析 2023-07-28
- MYSQL Binlog恢复误删数据库详解 2023-12-07
- ORACLE 超长字符串问题的解决办法 2023-12-07
- Java SSH 秘钥连接mysql数据库的方法 2023-12-07
- MySql中删除数据表的方法详解 2022-08-31
- MySQL校对规则(COLLATION)的具体使用 2022-08-31
- MySQL插入不了中文数据问题的原因及解决 2023-08-12
- Mysql表连接的执行流程详解 2022-10-22
- 具有负载均衡功能的MySQL服务器集群部署及实现 2023-12-29