php分页实现代码
PHP 分页实现代码
分页是Web开发中常见的功能,用于将大量数据分割成多个页面显示。以下是几种常见的PHP分页实现方法。
基础分页实现
使用MySQL的LIMIT子句结合PHP计算分页参数:
<?php
// 数据库连接
$db = new mysqli('localhost', 'username', 'password', 'database');
// 每页显示数量
$perPage = 10;
// 当前页码(从URL获取)
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$start = ($page > 1) ? ($page - 1) * $perPage : 0;
// 查询总记录数
$total = $db->query("SELECT COUNT(*) FROM table")->fetch_row()[0];
// 查询当前页数据
$result = $db->query("SELECT * FROM table LIMIT $start, $perPage");
// 显示数据
while ($row = $result->fetch_assoc()) {
echo $row['column_name'] . "<br>";
}
// 计算总页数
$totalPages = ceil($total / $perPage);
// 生成分页链接
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
// 关闭连接
$db->close();
?>
使用PDO实现分页
PDO提供了更安全的数据库操作方式:
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$start = ($page > 1) ? ($page - 1) * $perPage : 0;
// 查询总记录数
$stmt = $pdo->query("SELECT COUNT(*) FROM table");
$total = $stmt->fetchColumn();
// 查询当前页数据
$stmt = $pdo->prepare("SELECT * FROM table LIMIT :start, :perPage");
$stmt->bindValue(':start', $start, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
// 显示数据
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['column_name'] . "<br>";
}
// 分页导航
$totalPages = ceil($total / $perPage);
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
封装分页类
可以创建一个可重用的分页类:
<?php
class Pagination {
private $db;
private $perPage;
private $page;
public function __construct($db, $perPage = 10) {
$this->db = $db;
$this->perPage = $perPage;
$this->page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
}
public function getData($table) {
$start = ($this->page > 1) ? ($this->page - 1) * $this->perPage : 0;
$query = "SELECT * FROM $table LIMIT $start, $this->perPage";
return $this->db->query($query);
}
public function getLinks($table) {
$total = $this->db->query("SELECT COUNT(*) FROM $table")->fetch_row()[0];
$totalPages = ceil($total / $this->perPage);
$links = '';
for ($i = 1; $i <= $totalPages; $i++) {
$links .= "<a href='?page=$i'>$i</a> ";
}
return $links;
}
}
// 使用示例
$db = new mysqli('localhost', 'username', 'password', 'database');
$pagination = new Pagination($db);
$result = $pagination->getData('table');
while ($row = $result->fetch_assoc()) {
echo $row['column_name'] . "<br>";
}
echo $pagination->getLinks('table');
$db->close();
?>
前端分页样式优化
可以结合Bootstrap等前端框架美化分页导航:
// 在getLinks方法中修改
public function getLinks($table) {
$total = $this->db->query("SELECT COUNT(*) FROM $table")->fetch_row()[0];
$totalPages = ceil($total / $this->perPage);
$links = '<nav><ul class="pagination">';
for ($i = 1; $i <= $totalPages; $i++) {
$active = ($i == $this->page) ? 'active' : '';
$links .= "<li class='page-item $active'><a class='page-link' href='?page=$i'>$i</a></li>";
}
$links .= '</ul></nav>';
return $links;
}
分页性能优化
对于大型数据集,可以考虑以下优化:
// 使用预处理语句防止SQL注入
$stmt = $db->prepare("SELECT * FROM table LIMIT ?, ?");
$stmt->bind_param('ii', $start, $perPage);
$stmt->execute();
$result = $stmt->get_result();
// 添加索引加速COUNT查询
ALTER TABLE table ADD INDEX (id);
// 缓存总记录数
$cache = new Memcached();
$cache->addServer('localhost', 11211);
$total = $cache->get('total_records');
if (!$total) {
$total = $db->query("SELECT COUNT(*) FROM table")->fetch_row()[0];
$cache->set('total_records', $total, 3600);
}
以上代码提供了从基础到进阶的PHP分页实现方案,可以根据项目需求选择合适的实现方式。







