php实现的分页
PHP 实现分页的方法
基本分页逻辑
分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据:
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$items_per_page = 10;
$offset = ($current_page - 1) * $items_per_page;
// 查询总记录数
$total_items = $db->query("SELECT COUNT(*) FROM table")->fetchColumn();
$total_pages = ceil($total_items / $items_per_page);
// 查询当前页数据
$stmt = $db->prepare("SELECT * FROM table LIMIT :offset, :limit");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':limit', $items_per_page, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll();
分页链接生成
生成分页导航链接时需要考虑边界情况(如第一页和最后一页):

function generate_pagination_links($current_page, $total_pages) {
$links = [];
$range = 2; // 显示当前页前后各2页
// 上一页链接
if ($current_page > 1) {
$links[] = '<a href="?page='.($current_page - 1).'">上一页</a>';
}
// 页码链接
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == 1 || $i == $total_pages || ($i >= $current_page - $range && $i <= $current_page + $range)) {
$active = $i == $current_page ? ' class="active"' : '';
$links[] = '<a href="?page='.$i.'"'.$active.'>'.$i.'</a>';
} elseif ($i == $current_page - $range - 1 || $i == $current_page + $range + 1) {
$links[] = '<span>...</span>';
}
}
// 下一页链接
if ($current_page < $total_pages) {
$links[] = '<a href="?page='.($current_page + 1).'">下一页</a>';
}
return implode(' ', $links);
}
使用 Bootstrap 样式
如果需要更美观的分页样式,可以结合 Bootstrap:
function bootstrap_pagination($current_page, $total_pages) {
$html = '<nav><ul class="pagination">';
// 上一页
$disabled = $current_page <= 1 ? ' disabled' : '';
$html .= '<li class="page-item'.$disabled.'"><a class="page-link" href="?page='.max(1, $current_page - 1).'">«</a></li>';
// 页码
for ($i = 1; $i <= $total_pages; $i++) {
$active = $i == $current_page ? ' active' : '';
$html .= '<li class="page-item'.$active.'"><a class="page-link" href="?page='.$i.'">'.$i.'</a></li>';
}
// 下一页
$disabled = $current_page >= $total_pages ? ' disabled' : '';
$html .= '<li class="page-item'.$disabled.'"><a class="page-link" href="?page='.min($total_pages, $current_page + 1).'">»</a></li>';
$html .= '</ul></nav>';
return $html;
}
AJAX 分页实现
对于现代 Web 应用,可以使用 AJAX 实现无刷新分页:

// JavaScript 部分
$(document).on('click', '.pagination a', function(e) {
e.preventDefault();
var page = $(this).attr('href').split('page=')[1];
loadPage(page);
});
function loadPage(page) {
$.ajax({
url: 'ajax_pagination.php',
type: 'GET',
data: {page: page},
success: function(data) {
$('#results').html(data.results);
$('#pagination').html(data.pagination);
}
});
}
// ajax_pagination.php
$page = $_GET['page'] ?? 1;
// 处理数据查询逻辑...
header('Content-Type: application/json');
echo json_encode([
'results' => $html_results,
'pagination' => generate_pagination_links($page, $total_pages)
]);
性能优化建议
对于大数据量分页,避免使用 LIMIT offset, count 方式:
// 优化方法:使用 WHERE 条件替代 LIMIT offset
$last_id = $_GET['last_id'] ?? 0;
$stmt = $db->prepare("SELECT * FROM table 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);
安全注意事项
始终验证和过滤分页参数:
$current_page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, [
'options' => [
'default' => 1,
'min_range' => 1
]
]);
这些方法涵盖了从基础到高级的 PHP 分页实现,可以根据具体需求选择适合的方案。





