在 PHP 中实现分页功能通常涉及两个主要部分:
- 后端逻辑:计算总页数、当前页、每页条数,并从数据库中获取对应页的数据。
- 前端展示:生成分页导航链接(如“上一页”、“1”、“2”、“3”、“下一页”)。
下面是一个完整、简洁、可复用的 PHP 分页类示例,适用于 MySQL 数据库(使用 PDO 或 mysqli 均可,这里以 PDO 为例)。
✅ 分页类:Paginator.php
<?php
class Paginator {
private $totalItems; // 总记录数
private $itemsPerPage; // 每页显示条数
private $currentPage; // 当前页码
private $totalPages; // 总页数
public function __construct($totalItems, $itemsPerPage = 10, $currentPage = 1) {
$this->totalItems = (int)$totalItems;
$this->itemsPerPage = (int)$itemsPerPage;
$this->currentPage = max(1, (int)$currentPage); // 防止小于1
$this->totalPages = ceil($this->totalItems / $this->itemsPerPage);
// 防止页码超出范围
if ($this->currentPage > $this->totalPages) {
$this->currentPage = $this->totalPages;
}
}
// 获取偏移量,用于 SQL LIMIT
public function getOffset() {
return ($this->currentPage - 1) $this->itemsPerPage;
}
// 获取当前页
public function getCurrentPage() 
{
return $this->currentPage;
}
// 获取总页数
public function getTotalPages() {
return $this->totalPages;
}
// 是否有上一页
public function hasPrevPage() {
return $this->currentPage > 1;
}
// 是否有下一页
public function hasNextPage() {
return $this->currentPage < $this->totalPages;
}
// 生成分页 HTML
public function render($baseUrl = '?page=') {
if ($this->totalPages <= 1) {
return '';
}
$html = '<div class="pagination">';
// 上一页
if ($this->hasPrevPage()) {
$html .= "<a href='{$baseUrl}{$this->currentPage - 1}' class='page-link'>« 上一页</a> ";
} else {
$html .= '<span class="page-link disabled">« 上一页</span> ';
}
// 页码按钮(简化版:只显示当前页前后2页)
$start = max(1, $this->currentPage - 2);
$end = min($this->totalPages, $this->currentPage + 2);
for ($i = $start; $i <= $end; $i++) {
if ($i == $this->currentPage) {
$html .= "<span class='page-link active'>{$i}</span> ";
} else {
$html .= "<a href='{$baseUrl}{$i}' class='page-link'>{$i}</a> ";
}
}
// 下一页

if ($this->hasNextPage()) {
$html .= "<a href='{$baseUrl}{$this->currentPage + 1}' class='page-link'>下一页 »</a>";
} else {
$html .= '<span class="page-link disabled">下一页 »</span>';
}
$html .= '</div>';
return $html;
}
}
✅ 使用示例
假设你有一个 users 表,每页显示 10 条数据:
<?php
require_once 'Paginator.php';
// 1. 获取当前页码(默认第1页)
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// 2. 每页显示条数
$itemsPerPage = 10;
// 3. 连接数据库(PDO 示例)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 4. 获取总记录数
$stmt = $pdo->query("SELECT COUNT() FROM users");
$totalItems = (int)$stmt->fetchColumn();
// 5. 创建分页器实例
$paginator = new Paginator($totalItems, $itemsPerPage, $page);
// 6. 获取当前页数据
$offset = $paginator->getOffset();
$stmt = $pdo->prepare("SELECT FROM users LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $itemsPerPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 7. 显示数据
echo "<ul>";
foreach ($users as $user) {
echo "<li>{$user['name']}</li>";
}
echo "</ul>";
// 8. 显示分页导航
echo $paginator->render('?page=');
?>
✅ 可选:添加 CSS 样式(美化分页)
.pagination {
margin: 20px 0;
}
.page-link {
padding: 8px 12px;
margin: 0 2px;
text-decoration: none;
color: #007bff;
border: 1px solid #dee2e6;
border-radius: 4px;
}
.page-link:hover {
background-color: #e9ecef;
}
.page-link.active {
background-color: #007bff;
color: white;
border-color: #007bff;
}
.page-link.disabled {
color: #6c757d;
pointer-events: none;
}
✅ 优点
- 面向对象,易于复用
- 自动处理边界情况(如页码超出、无数据等)
- 支持自定义每页条数
- 生成语义化 HTML,便于样式定制
✅ 注意事项
- 确保
$totalItems和$itemsPerPage是整数,避免 SQL 注入或逻辑错误。 - 如果数据量极大(如百万级),建议考虑使用游标分页(Cursor-based Pagination)而非传统偏移分页。
- 可根据需求扩展:如显示“共 X 页”、“跳转到第 Y 页”等功能。
如需支持 MySQLi 或 ThinkPHP/Laravel 等框架的分页,也可以告诉我,我可以提供对应版本的实现。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/480635.html



