在PHP实现增删改查功能时,当数据量较大,一次性加载所有数据会导致页面加载缓慢、展示混乱,分页显示数据就成了必要的优化手段。分页的核心是通过数据库查询限制返回的数据条数,同时结合页码参数动态切换展示内容。

分页的核心原理
分页显示数据主要依赖两个核心要素:一是数据库的分页查询能力,二是前端页码参数的传递与处理。MySQL中通过limit子句可以实现分页查询,limit后面跟两个参数,第一个是查询的起始偏移量,第二个是每页显示的条数。比如limit 0,10表示查询从第1条开始的10条数据,对应第1页的内容。
PHP分页实现步骤
1. 准备基础配置
首先定义每页显示的条数,同时获取当前请求的页码参数,需要对页码做合法性校验,避免传入负数或非数字参数。
<?php
// 每页显示10条数据
$pageSize = 10;
// 获取当前页码,默认第1页
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
// 页码合法性校验,最小为1
if ($page < 1) {
$page = 1;
}
?>
2. 查询数据总条数
需要先查询符合条件的数据总条数,用来计算总页数,判断当前页码是否超过最大页数。
<?php
// 假设已经建立数据库连接,$conn是连接对象
// 查询数据总条数,这里以查询user表所有数据为例
$countSql = "SELECT COUNT(*) as total FROM user";
$countResult = mysqli_query($conn, $countSql);
$countRow = mysqli_fetch_assoc($countResult);
$totalCount = $countRow['total'];
// 计算总页数,向上取整
$totalPage = ceil($totalCount / $pageSize);
// 如果当前页码超过总页数,重置为总页数
if ($page > $totalPage && $totalPage > 0) {
$page = $totalPage;
}
?>
3. 计算查询偏移量并执行分页查询
根据当前页码和每页条数计算起始偏移量,然后执行带limit的分页查询语句。
<?php
// 计算起始偏移量
$offset = ($page - 1) * $pageSize;
// 执行分页查询
$dataSql = "SELECT id, username, email FROM user LIMIT $offset, $pageSize";
$dataResult = mysqli_query($conn, $dataSql);
// 存储查询结果
$dataList = [];
while ($row = mysqli_fetch_assoc($dataResult)) {
$dataList[] = $row;
}
?>
4. 前端展示数据与分页导航
将查询到的数据渲染到页面,同时生成分页导航链接,方便用户切换页码。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户数据分页展示</title>
</head>
<body>
<h3>用户列表</h3>
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>用户名</th>
<th>邮箱</th>
</tr>
<?php foreach ($dataList as $item): ?>
<tr>
<td><?php echo $item['id']; ?></td>
<td><?php echo $item['username']; ?></td>
<td><?php echo $item['email']; ?></td>
</tr>
<?php endforeach; ?>
</table>
<div class="page-nav">
<?php if ($page > 1): ?>
<a href="?page=<?php echo $page - 1; ?>">上一页</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $totalPage; $i++): ?>
<?php if ($i == $page): ?>
<span class="current"><?php echo $i; ?></span>
<?php else: ?>
<a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a>
<?php endif; ?>
<?php endfor; ?>
<?php if ($page < $totalPage): ?>
<a href="?page=<?php echo $page + 1; ?>">下一页</a>
<?php endif; ?>
</div>
</body>
</html>
注意事项
- 页码参数需要做严格的类型校验,避免SQL注入风险,实际开发中建议使用预处理语句执行查询。
- 如果数据总条数为0,不需要展示分页导航,避免显示无意义的页码。
- 分页链接可以结合当前页面的其他查询参数,比如搜索条件,避免切换页码后丢失筛选条件。