本文目录导读:

在PHP项目中实现分页功能通常涉及以下核心步骤,这里给出一个完整且清晰的实现方案:
分页基本原理
分页需要知道3个关键数据:
- 当前页码 ($page)
- 每页显示条数 ($pageSize)
- 数据总条数 ($total)
通过这些可以计算出:
- 总页数:
ceil($total / $pageSize) - 起始偏移量:
($page - 1) * $pageSize
完整代码实现
SQL查询部分
<?php
// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
// 获取当前页码,默认为第1页
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = max(1, $page); // 确保页码不小于1
// 每页显示10条
$pageSize = 10;
// 计算总记录数
$countSql = "SELECT COUNT(*) FROM articles";
$total = $pdo->query($countSql)->fetchColumn();
// 计算总页数
$totalPages = ceil($total / $pageSize);
// 确保当前页不超过总页数
$page = min($page, $totalPages);
// 计算偏移量
$offset = ($page - 1) * $pageSize;
// 查询当前页数据
$sql = "SELECT * FROM articles ORDER BY id DESC LIMIT $offset, $pageSize";
$stmt = $pdo->query($sql);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
显示数据
<table border="1">
<tr>
<th>ID</th>
<th>标题</th>
<th>内容</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article['id'] ?></td>
<td><?= htmlspecialchars($article['title']) ?></td>
<td><?= htmlspecialchars($article['content']) ?></td>
</tr>
<?php endforeach; ?>
</table>
分页导航
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?page=1">首页</a>
<a href="?page=<?= $page - 1 ?>">上一页</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $totalPages; $i++): ?>
<?php if ($i == $page): ?>
<span class="current"><?= $i ?></span>
<?php else: ?>
<a href="?page=<?= $i ?>"><?= $i ?></a>
<?php endif; ?>
<?php endfor; ?>
<?php if ($page < $totalPages): ?>
<a href="?page=<?= $page + 1 ?>">下一页</a>
<a href="?page=<?= $totalPages ?>">末页</a>
<?php endif; ?>
</div>
优化版本:封装为函数
<?php
/**
* 分页函数 (MySQL/PDO 版本)
* @param PDO $pdo 数据库对象
* @param string $table 表名
* @param int $pageSize 每页条数
* @param string $where WHERE条件
* @param string $order 排序
* @return array ['data'=>数据, 'page'=>当前页, 'totalPages'=>总页数, 'total'=>总条数]
*/
function paginate($pdo, $table, $pageSize = 10, $where = '1=1', $order = 'id DESC') {
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = max(1, $page);
// 获取总数
$countSql = "SELECT COUNT(*) FROM $table WHERE $where";
$total = $pdo->query($countSql)->fetchColumn();
$totalPages = ceil($total / $pageSize);
// 限制页码
if ($totalPages == 0) $totalPages = 1;
$page = min($page, $totalPages);
// 查询数据
$offset = ($page - 1) * $pageSize;
$sql = "SELECT * FROM $table WHERE $where ORDER BY $order LIMIT $offset, $pageSize";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
return [
'data' => $data,
'page' => $page,
'totalPages' => $totalPages,
'total' => $total
];
}
// 使用示例
$result = paginate($pdo, 'articles', 10);
$articles = $result['data'];
$page = $result['page'];
$totalPages = $result['totalPages'];
$total = $result['total'];
?>
样式美化 (CSS)
.pagination {
margin: 20px 0;
text-align: center;
}
.pagination a, .pagination span {
display: inline-block;
padding: 6px 12px;
margin: 0 4px;
border: 1px solid #ddd;
color: #337ab7;
text-decoration: none;
border-radius: 3px;
}
.pagination a:hover {
background-color: #eee;
}
.pagination .current {
background-color: #337ab7;
color: white;
border-color: #337ab7;
}
注意事项
- SQL注入防护:LIMIT参数使用
intval()确保是整数 - 大数据量优化:超过百万数据建议使用
SELECT COUNT(*)的缓存或近似算法 - URL参数处理:如果URL有其他参数,需要保留
- SEO友好:可考虑使用URL重写实现
/page/2的形式 - AJAX分页:前端可通过API接口实现异步分页
这样实现的分页功能既简单又完整,可以适应大多数PHP项目的需求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播