php 分页怎么实现
使用 LIMIT 和 OFFSET 实现分页
通过 SQL 的 LIMIT 和 OFFSET 子句实现分页查询。LIMIT 指定每页显示的记录数,OFFSET 指定从哪条记录开始。
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$sql = "SELECT * FROM table_name LIMIT $perPage OFFSET $offset";
$result = $conn->query($sql);
计算总页数
查询总记录数并计算总页数,用于生成分页导航。
$totalSql = "SELECT COUNT(*) as total FROM table_name";
$totalResult = $conn->query($totalSql);
$totalRows = $totalResult->fetch_assoc()['total'];
$totalPages = ceil($totalRows / $perPage);
生成分页链接
创建分页导航链接,允许用户跳转到不同页码。
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
使用预处理语句防止 SQL 注入
为提高安全性,建议使用预处理语句。
$stmt = $conn->prepare("SELECT * FROM table_name LIMIT ? OFFSET ?");
$stmt->bind_param("ii", $perPage, $offset);
$stmt->execute();
$result = $stmt->get_result();
添加样式和功能增强
为分页导航添加样式和功能,如前页、后页、首页、末页等。
echo "<div class='pagination'>";
if ($page > 1) {
echo "<a href='?page=1'>« First</a>";
echo "<a href='?page=".($page - 1)."'>‹ Prev</a>";
}
// 页码链接...
if ($page < $totalPages) {
echo "<a href='?page=".($page + 1)."'>Next ›</a>";
echo "<a href='?page=$totalPages'>Last »</a>";
}
echo "</div>";
使用第三方库简化分页
考虑使用现成的分页库如 Pagerfanta 或 Laravel 的分页器(如果在 Laravel 框架中)。
// 使用 Pagerfanta 示例
$adapter = new Pagerfanta\Adapter\ArrayAdapter($data);
$pagerfanta = new Pagerfanta\Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($perPage);
$pagerfanta->setCurrentPage($page);
前端分页实现
对于数据量不大的情况,可以在前端实现分页,减少服务器负担。
// JavaScript 示例
function paginate(data, page, perPage) {
const start = (page - 1) * perPage;
return data.slice(start, start + perPage);
}
性能优化建议
对于大数据表,避免使用 COUNT(*) 计算总数,考虑缓存总记录数或使用近似值。在 WHERE 子句中使用索引字段提高查询效率。
// 使用缓存
$totalRows = $cache->get('total_rows');
if (!$totalRows) {
$totalResult = $conn->query("SELECT COUNT(*) as total FROM table_name");
$totalRows = $totalResult->fetch_assoc()['total'];
$cache->set('total_rows', $totalRows, 3600);
}






