本文目录导读:

在PHP项目中实现分页功能通常涉及以下核心步骤,这里给出一个完整且清晰的实现方案:
分页基本原理
分页需要知道3个关键数据:
- 当前页码 ($page)
- 每页显示条数 ($pageSize)
- 数据总条数 ($total)
通过这些可以计算出:
- 总页数:
ceil($total / $pageSize) - 起始偏移量:
($page - 1) * $pageSize
完整代码实现
SQL查询部分
<?php
// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
// 获取当前页码,默认为第1页
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = max(1, $page); // 确保页码不小于1
// 每页显示10条
$pageSize = 10;
// 计算总记录数
$countSql = "SELECT COUNT(*) FROM articles";
$total = $pdo->query($countSql)->fetchColumn();
// 计算总页数
$totalPages = ceil($total / $pageSize);
// 确保当前页不超过总页数
$page = min($page, $totalPages);
// 计算偏移量
$offset = ($page - 1) * $pageSize;
// 查询当前页数据
$sql = "SELECT * FROM articles ORDER BY id DESC LIMIT $offset, $pageSize";
$stmt = $pdo->query($sql);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
显示数据
<table border="1">
<tr>
<th>ID</th>
<th>标题</th>
<th>内容</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article['id'] ?></td>
<td><?= htmlspecialchars($article['title']) ?></td>
<td><?= htmlspecialchars($article['content']) ?></td>
</tr>
<?php endforeach; ?>
</table>
分页导航
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?page=1">首页</a>
<a href="?page=<?= $page - 1 ?>">上一页</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $totalPages; $i++): ?>
<?php if ($i == $page): ?>
<span class="current"><?= $i ?></span>
<?php else: ?>
<a href="?page=<?= $i ?>"><?= $i ?></a>
<?php endif; ?>
<?php endfor; ?>
<?php if ($page < $totalPages): ?>
<a href="?page=<?= $page + 1 ?>">下一页</a>
<a href="?page=<?= $totalPages ?>">末页</a>
<?php endif; ?>
</div>
优化版本:封装为函数
<?php
/**
* 分页函数 (MySQL/PDO 版本)
* @param PDO $pdo 数据库对象
* @param string $table 表名
* @param int $pageSize 每页条数
* @param string $where WHERE条件
* @param string $order 排序
* @return array ['data'=>数据, 'page'=>当前页, 'totalPages'=>总页数, 'total'=>总条数]
*/
function paginate($pdo, $table, $pageSize = 10, $where = '1=1', $order = 'id DESC') {
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = max(1, $page);
// 获取总数
$countSql = "SELECT COUNT(*) FROM $table WHERE $where";
$total = $pdo->query($countSql)->fetchColumn();
$totalPages = ceil($total / $pageSize);
// 限制页码
if ($totalPages == 0) $totalPages = 1;
$page = min($page, $totalPages);
// 查询数据
$offset = ($page - 1) * $pageSize;
$sql = "SELECT * FROM $table WHERE $where ORDER BY $order LIMIT $offset, $pageSize";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
return [
'data' => $data,
'page' => $page,
'totalPages' => $totalPages,
'total' => $total
];
}
// 使用示例
$result = paginate($pdo, 'articles', 10);
$articles = $result['data'];
$page = $result['page'];
$totalPages = $result['totalPages'];
$total = $result['total'];
?>
样式美化 (CSS)
.pagination {
margin: 20px 0;
text-align: center;
}
.pagination a, .pagination span {
display: inline-block;
padding: 6px 12px;
margin: 0 4px;
border: 1px solid #ddd;
color: #337ab7;
text-decoration: none;
border-radius: 3px;
}
.pagination a:hover {
background-color: #eee;
}
.pagination .current {
background-color: #337ab7;
color: white;
border-color: #337ab7;
}
注意事项
- SQL注入防护:LIMIT参数使用
intval()确保是整数 - 大数据量优化:超过百万数据建议使用
SELECT COUNT(*)的缓存或近似算法 - URL参数处理:如果URL有其他参数,需要保留
- SEO友好:可考虑使用URL重写实现
/page/2的形式 - AJAX分页:前端可通过API接口实现异步分页
这样实现的分页功能既简单又完整,可以适应大多数PHP项目的需求。