php和mysql实现分页
实现分页的基本原理
分页功能的核心是通过SQL的LIMIT子句控制数据查询范围,结合前端传递的页码参数动态计算偏移量。MySQL中分页查询语法为:
SELECT * FROM table LIMIT offset, page_size
计算分页参数
定义每页显示数量$page_size和当前页码$page,计算数据偏移量:

$page_size = 10; // 每页记录数
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // 当前页码
$offset = ($page - 1) * $page_size; // 数据偏移量
获取总记录数
执行SQL查询获取数据总量以计算总页数:
$sql = "SELECT COUNT(*) as total FROM your_table";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$total_records = $row['total'];
$total_pages = ceil($total_records / $page_size);
查询当前页数据
使用计算好的偏移量获取当前页数据:

$sql = "SELECT * FROM your_table LIMIT $offset, $page_size";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
// 处理每行数据
}
生成分页导航
创建分页导航链接时需要处理边界情况(如第一页/最后一页):
echo '<div class="pagination">';
if($page > 1) {
echo '<a href="?page='.($page-1).'">上一页</a>';
}
for($i=1; $i<=$total_pages; $i++) {
echo '<a href="?page='.$i.'"'.($page==$i?' class="active"':'').'>'.$i.'</a>';
}
if($page < $total_pages) {
echo '<a href="?page='.($page+1).'">下一页</a>';
}
echo '</div>';
完整示例代码
<?php
$conn = new mysqli('localhost', 'username', 'password', 'database');
$page_size = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $page_size;
// 获取总记录数
$count_sql = "SELECT COUNT(*) as total FROM products";
$count_result = $conn->query($count_sql);
$total_records = $count_result->fetch_assoc()['total'];
$total_pages = ceil($total_records / $page_size);
// 查询当前页数据
$sql = "SELECT * FROM products LIMIT $offset, $page_size";
$result = $conn->query($sql);
// 显示数据
while($row = $result->fetch_assoc()) {
echo '<div>'.$row['product_name'].'</div>';
}
// 生成分页导航
echo '<div class="pagination">';
if($page > 1) {
echo '<a href="?page='.($page-1).'">上一页</a>';
}
for($i=1; $i<=$total_pages; $i++) {
echo '<a href="?page='.$i.'"'.($page==$i?' class="active"':'').'>'.$i.'</a>';
}
if($page < $total_pages) {
echo '<a href="?page='.($page+1).'">下一页</a>';
}
echo '</div>';
?>
性能优化建议
对于大数据量表,避免使用COUNT(*)计算总数,可考虑缓存总记录数或使用近似值。在分页查询时确保对排序字段建立索引:
SELECT * FROM large_table
WHERE id > last_id_of_prev_page
ORDER BY id LIMIT page_size






