php分页实现思路
数据库查询分页
使用SQL的LIMIT和OFFSET子句实现分页查询。计算当前页码对应的偏移量,结合每页显示数量进行数据查询。
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$sql = "SELECT * FROM table_name LIMIT {$offset}, {$perPage}";
$result = $conn->query($sql);
分页导航生成
计算总页数并生成分页链接。获取总记录数后,通过总记录数和每页显示数量计算出总页数。

$totalSql = "SELECT COUNT(*) as total FROM table_name";
$totalResult = $conn->query($totalSql);
$totalRow = $totalResult->fetch_assoc();
$totalPages = ceil($totalRow['total'] / $perPage);
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page={$i}'>{$i}</a> ";
}
使用PDO预处理语句
采用PDO预处理语句防止SQL注入,提高安全性。绑定参数时明确指定参数类型。
$stmt = $conn->prepare("SELECT * FROM table_name LIMIT :offset, :perPage");
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->bindParam(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
分页样式优化
添加Bootstrap分页组件提升用户体验。包含上一页/下一页按钮和当前页高亮显示。

echo '<nav aria-label="Page navigation"><ul class="pagination">';
echo '<li class="page-item' . ($page <= 1 ? ' disabled' : '') . '">';
echo '<a class="page-link" href="?page=' . ($page - 1) . '">Previous</a></li>';
for ($i = 1; $i <= $totalPages; $i++) {
$active = $i == $page ? ' active' : '';
echo '<li class="page-item' . $active . '">';
echo '<a class="page-link" href="?page=' . $i . '">' . $i . '</a></li>';
}
echo '<li class="page-item' . ($page >= $totalPages ? ' disabled' : '') . '">';
echo '<a class="page-link" href="?page=' . ($page + 1) . '">Next</a></li>';
echo '</ul></nav>';
AJAX无刷新分页
通过jQuery实现AJAX分页加载。使用事件委托减少DOM操作,提升性能。
$(document).on('click', '.pagination a', function(e) {
e.preventDefault();
var page = $(this).attr('href').split('page=')[1];
$.ajax({
url: 'pagination_ajax.php',
type: 'GET',
data: {page: page},
success: function(data) {
$('#content').html(data);
}
});
});
缓存分页数据
对静态数据使用缓存减少数据库查询。采用文件缓存或内存缓存存储分页结果。
$cacheKey = 'page_' . $page;
if (!$data = $cache->get($cacheKey)) {
$stmt = $conn->prepare("SELECT * FROM table_name LIMIT ?, ?");
$stmt->bind_param('ii', $offset, $perPage);
$stmt->execute();
$data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
$cache->set($cacheKey, $data, 3600);
}






