php如何实现分页功能
PHP 分页功能实现方法
数据库查询与分页逻辑
分页功能的核心是通过 SQL 的 LIMIT 子句实现数据分段查询。假设使用 MySQL 数据库,基本查询语句如下:
SELECT * FROM table_name LIMIT offset, items_per_page
在 PHP 中动态计算偏移量:
$itemsPerPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $itemsPerPage;
完整分页实现示例
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 获取总记录数
$totalItems = $db->query('SELECT COUNT(*) FROM products')->fetchColumn();
// 分页参数
$itemsPerPage = 5;
$totalPages = ceil($totalItems / $itemsPerPage);
$currentPage = isset($_GET['page']) ? min(max(1, (int)$_GET['page']), $totalPages) : 1;
$offset = ($currentPage - 1) * $itemsPerPage;
// 获取当前页数据
$stmt = $db->prepare('SELECT * FROM products LIMIT ?, ?');
$stmt->execute([$offset, $itemsPerPage]);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
分页导航生成
// 生成分页链接
function buildPagination($currentPage, $totalPages) {
$links = [];
$range = 2; // 显示当前页前后各2页
for ($i = max(1, $currentPage - $range); $i <= min($totalPages, $currentPage + $range); $i++) {
$links[] = [
'page' => $i,
'url' => '?page='.$i,
'active' => $i == $currentPage
];
}
return $links;
}
// 在模板中使用
$paginationLinks = buildPagination($currentPage, $totalPages);
Bootstrap 分页样式示例
<nav aria-label="Page navigation">
<ul class="pagination">
<?php if ($currentPage > 1): ?>
<li class="page-item"><a class="page-link" href="?page=<?= $currentPage - 1 ?>">Previous</a></li>
<?php endif; ?>
<?php foreach ($paginationLinks as $link): ?>
<li class="page-item <?= $link['active'] ? 'active' : '' ?>">
<a class="page-link" href="<?= $link['url'] ?>"><?= $link['page'] ?></a>
</li>
<?php endforeach; ?>
<?php if ($currentPage < $totalPages): ?>
<li class="page-item"><a class="page-link" href="?page=<?= $currentPage + 1 ?>">Next</a></li>
<?php endif; ?>
</ul>
</nav>
优化建议
- 对于大型数据集,考虑使用缓存技术存储分页结果
- 实现 URL 友好的分页链接,如
/page/2替代?page=2 - 添加跳转到指定页码的输入框
- 考虑使用 AJAX 实现无刷新分页
- 对分页参数进行严格验证,防止 SQL 注入
以上方法提供了从数据库查询到前端展示的完整分页解决方案,可根据实际项目需求进行调整。







