php 分页怎么实现
基本分页实现
使用 LIMIT 和 OFFSET 实现数据库分页查询。假设每页显示 10 条记录,当前页码为 $page:
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$sql = "SELECT * FROM articles LIMIT $offset, $perPage";
$result = $pdo->query($sql);
计算总页数
需要先查询总记录数以计算总页数:
$totalQuery = "SELECT COUNT(*) as total FROM articles";
$totalResult = $pdo->query($totalQuery)->fetch();
$totalPages = ceil($totalResult['total'] / $perPage);
生成分页链接
创建简单的分页导航链接:
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
使用预编译语句(安全版)
防止 SQL 注入的安全实现方式:

$stmt = $pdo->prepare("SELECT * FROM articles LIMIT :offset, :perPage");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
分页类封装
可以封装一个简单的分页类:
class Paginator {
private $perPage;
private $page;
private $total;
public function __construct($perPage = 10) {
$this->perPage = $perPage;
$this->page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
}
public function getLimit() {
return [($this->page - 1) * $this->perPage, $this->perPage];
}
public function setTotal($total) {
$this->total = $total;
}
public function getLinks() {
$totalPages = ceil($this->total / $this->perPage);
$links = [];
for ($i = 1; $i <= $totalPages; $i++) {
$links[] = [
'page' => $i,
'current' => $i === $this->page
];
}
return $links;
}
}
现代框架的分页实现
Laravel 等框架内置分页功能:

// Laravel 示例
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
// 视图中直接使用
{{ $users->links() }}
前端分页注意事项
对于大量数据考虑实现前端分页或无限滚动,减少服务器压力:
// 前端分页示例
function fetchPage(page) {
fetch(`/api/data?page=${page}`)
.then(response => response.json())
.then(data => renderData(data));
}
性能优化建议
对于大数据表分页,避免使用 OFFSET,改用基于 ID 的分页:
$lastId = isset($_GET['last_id']) ? (int)$_GET['last_id'] : 0;
$sql = "SELECT * FROM articles WHERE id > $lastId ORDER BY id LIMIT $perPage";
分页样式美化
使用 Bootstrap 等 CSS 框架美化分页:
<nav aria-label="Page navigation">
<ul class="pagination">
<?php foreach ($paginator->getLinks() as $link): ?>
<li class="page-item <?= $link['current'] ? 'active' : '' ?>">
<a class="page-link" href="?page=<?= $link['page'] ?>">
<?= $link['page'] ?>
</a>
</li>
<?php endforeach ?>
</ul>
</nav>






