php mysql实现分页
PHP MySQL 分页实现方法
基本分页逻辑
分页的核心是通过 SQL 的 LIMIT 子句控制查询范围。需要计算两个关键参数:当前页码和每页显示的记录数。
// 每页显示的记录数
$perPage = 10;
// 获取当前页码,默认为1
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// 计算偏移量
$offset = ($page - 1) * $perPage;
// 查询数据
$sql = "SELECT * FROM table_name LIMIT $offset, $perPage";
$result = mysqli_query($connection, $sql);
计算总页数
需要查询总记录数才能计算总页数,用于生成分页导航。
// 查询总记录数
$countQuery = "SELECT COUNT(*) as total FROM table_name";
$countResult = mysqli_query($connection, $countQuery);
$totalRows = mysqli_fetch_assoc($countResult)['total'];
// 计算总页数
$totalPages = ceil($totalRows / $perPage);
生成分页导航
在页面底部输出分页链接,允许用户跳转到不同页码。
echo '<div class="pagination">';
for ($i = 1; $i <= $totalPages; $i++) {
$active = ($i == $page) ? 'active' : '';
echo "<a href='?page=$i' class='$active'>$i</a> ";
}
echo '</div>';
完整示例代码
<?php
// 数据库连接
$connection = mysqli_connect("localhost", "username", "password", "database");
// 分页参数
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
// 查询数据
$sql = "SELECT * FROM products LIMIT $offset, $perPage";
$result = mysqli_query($connection, $sql);
// 显示数据
while ($row = mysqli_fetch_assoc($result)) {
echo $row['product_name'] . "<br>";
}
// 计算总页数
$countQuery = "SELECT COUNT(*) as total FROM products";
$countResult = mysqli_query($connection, $countQuery);
$totalRows = mysqli_fetch_assoc($countResult)['total'];
$totalPages = ceil($totalRows / $perPage);
// 分页导航
echo '<div class="pagination">';
for ($i = 1; $i <= $totalPages; $i++) {
$active = ($i == $page) ? 'active' : '';
echo "<a href='?page=$i' class='$active'>$i</a> ";
}
echo '</div>';
// 关闭连接
mysqli_close($connection);
?>
高级分页优化
对于大型数据集,可以考虑以下优化方法:
使用预处理语句防止SQL注入:
$stmt = $connection->prepare("SELECT * FROM products LIMIT ?, ?");
$stmt->bind_param("ii", $offset, $perPage);
$stmt->execute();
$result = $stmt->get_result();
添加上一页/下一页按钮:
if ($page > 1) {
echo "<a href='?page=".($page - 1)."'>上一页</a> ";
}
if ($page < $totalPages) {
echo "<a href='?page=".($page + 1)."'>下一页</a>";
}
实现显示页码范围(如只显示前后5页):
$startPage = max(1, $page - 5);
$endPage = min($totalPages, $page + 5);
for ($i = $startPage; $i <= $endPage; $i++) {
// 页码链接
}






