php 实现分页查询
PHP 实现分页查询的方法
获取当前页码和每页显示数量
通过 $_GET 获取当前页码参数,默认设置为第一页。每页显示数量可以根据需求设定固定值或动态获取。
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$items_per_page = 10; // 每页显示10条数据
计算总记录数和总页数
查询数据库获取总记录数,并计算总页数。确保当前页码不超过总页数范围。
$total_items = $db->query("SELECT COUNT(*) FROM table_name")->fetchColumn();
$total_pages = ceil($total_items / $items_per_page);
// 确保当前页码在有效范围内
if ($current_page < 1) {
$current_page = 1;
} elseif ($current_page > $total_pages) {
$current_page = $total_pages;
}
计算数据查询的偏移量
根据当前页码和每页显示数量,计算 SQL 查询的偏移量。
$offset = ($current_page - 1) * $items_per_page;
执行分页查询
使用 LIMIT 和 OFFSET 进行分页查询,获取当前页的数据。

$stmt = $db->prepare("SELECT * FROM table_name LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $items_per_page, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
生成分页导航链接
根据总页数和当前页码,生成分页导航链接,方便用户跳转到不同页码。
$pagination = '';
if ($total_pages > 1) {
$pagination .= '<div class="pagination">';
// 上一页链接
if ($current_page > 1) {
$pagination .= '<a href="?page=' . ($current_page - 1) . '">上一页</a>';
}
// 页码链接
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == $current_page) {
$pagination .= '<span class="current">' . $i . '</span>';
} else {
$pagination .= '<a href="?page=' . $i . '">' . $i . '</a>';
}
}
// 下一页链接
if ($current_page < $total_pages) {
$pagination .= '<a href="?page=' . ($current_page + 1) . '">下一页</a>';
}
$pagination .= '</div>';
}
显示分页数据和导航
将查询到的数据和分页导航链接显示在页面上。

foreach ($results as $row) {
echo '<div>' . htmlspecialchars($row['column_name']) . '</div>';
}
echo $pagination;
使用预处理语句防止 SQL 注入
在分页查询中使用预处理语句和参数绑定,确保安全性。
$stmt = $db->prepare("SELECT * FROM table_name LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $items_per_page, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
使用 Bootstrap 分页样式
如果需要更美观的分页样式,可以结合 Bootstrap 的分页组件。
$pagination = '';
if ($total_pages > 1) {
$pagination .= '<nav aria-label="Page navigation"><ul class="pagination">';
// 上一页
if ($current_page > 1) {
$pagination .= '<li class="page-item"><a class="page-link" href="?page=' . ($current_page - 1) . '">Previous</a></li>';
}
// 页码
for ($i = 1; $i <= $total_pages; $i++) {
$active = ($i == $current_page) ? ' active' : '';
$pagination .= '<li class="page-item' . $active . '"><a class="page-link" href="?page=' . $i . '">' . $i . '</a></li>';
}
// 下一页
if ($current_page < $total_pages) {
$pagination .= '<li class="page-item"><a class="page-link" href="?page=' . ($current_page + 1) . '">Next</a></li>';
}
$pagination .= '</ul></nav>';
}
优化查询性能
对于大数据表,使用索引优化分页查询性能,避免使用 OFFSET 导致性能问题。
// 使用 WHERE 子句替代 OFFSET(适用于有序数据)
$stmt = $db->prepare("SELECT * FROM table_name WHERE id > :last_id ORDER BY id LIMIT :limit");
$stmt->bindValue(':last_id', $last_id, PDO::PARAM_INT);
$stmt->bindValue(':limit', $items_per_page, PDO::PARAM_INT);
$stmt->execute();






