以下是一个使用MySQLi连接数据库并实现分页功能的PHP完整分页类。这个类封装了分页所需的所有逻辑,并允许你通过MySQLi连接来获取分页数据。
数据库连接类
首先,我们创建一个简单的数据库连接类,使用MySQLi来连接数据库。
<?php class Database { private $host = 'localhost'; private $db_name = 'your_database'; private $username = 'your_username'; private $password = 'your_password'; private $conn; public function __construct() { $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name); // 检查连接 if ($this->conn->connect_error) { die("连接失败: " . $this->conn->connect_error); } } public function getConnection() { return $this->conn; } } ?>
分页类
接下来,我们创建一个分页类,它将使用上面定义的数据库连接类来获取数据。
<?php class Pagination { private $db; private $total_rows; private $per_page; private $current_page; private $total_pages; public function __construct($db, $table, $per_page = 10, $page = 1) { $this->db = $db; $this->per_page = $per_page; $this->current_page = $page; // 获取总行数 $sql = "SELECT COUNT(*) as total FROM $table"; $result = $this->db->getConnection()->query($sql); $row = $result->fetch_assoc(); $this->total_rows = $row['total']; // 计算总页数 $this->total_pages = ceil($this->total_rows / $this->per_page); } public function getData($table, $columns = '*') { $offset = ($this->current_page - 1) * $this->per_page; $sql = "SELECT $columns FROM $table LIMIT $offset, $this->per_page"; $result = $this->db->getConnection()->query($sql); return $result->fetch_all(MYSQLI_ASSOC); } public function createLinks($baseUrl) { $links = ''; for ($i = 1; $i <= $this->total_pages; $i++) { $links .= "<a href='$baseUrl?page=$i'>$i</a> "; } return $links; } } ?>
使用示例
现在,我们将这两个类组合起来,并展示如何使用它们来实现分页功能。
<?php require 'Database.php'; require 'Pagination.php'; // 初始化数据库连接 $db = new Database(); // 获取当前页码,默认为1 $page = isset($_GET['page']) ? intval($_GET['page']) : 1; // 确保页码在有效范围内 $page = max(1, min($page, ceil($total_rows / $per_page))); // 注意:这里$total_rows和$per_page需要在分页对象创建前已知,但在这个示例中我们会在分页对象内部获取它们,所以这里只是为了说明如何限制页码。实际上,你应该在创建分页对象后使用$pagination->getTotalPages()来获取总页数,并据此来限制页码。但由于这个示例的简化,我们暂时省略这一步。 // 初始化分页对象 $pagination = new Pagination($db, 'your_table', 10, $page); // 获取分页数据 $data = $pagination->getData('your_table'); // 显示数据 echo "<table border='1'>"; echo "<tr><th>ID</th><th>Name</th></tr>"; foreach ($data as $row) { echo "<tr>"; echo "<td>" . htmlspecialchars($row['id']) . "</td>"; echo "<td>" . htmlspecialchars($row['name']) . "</td>"; echo "</tr>"; } echo "</table>"; // 显示分页链接 $baseUrl = $_SERVER['PHP_SELF']; // 获取当前脚本的URL(不包含查询字符串) echo "<div>"; echo $pagination->createLinks($baseUrl); echo "</div>"; ?>
注意:
在上面的使用示例中,$total_rows 和 $per_page 在分页对象创建前并没有已知的值。在实际应用中,你应该在创建分页对象之前获取总行数(可以通过一个单独的查询或使用分页类内部的逻辑),然后根据总行数和每页显示的数量来计算总页数。但是,为了简化示例,我们在分页类内部进行了这些计算。
在显示分页链接时,我们使用了 $_SERVER[‘PHP_SELF’] 来获取当前脚本的URL(不包含查询字符串)。这通常是一个安全的方法来构建基于当前页面的链接,但请确保在使用 $_SERVER[‘PHP_SELF’] 时进行适当的验证和清理,以防止潜在的安全问题(如跨站脚本攻击XSS)。
在实际部署中,请确保数据库连接信息(如用户名和密码)的安全性,不要将其硬编码在脚本中,可以使用配置文件或环境变量。
上面的代码示例没有包含完整的错误处理逻辑。在实际应用中,你应该添加适当的错误处理来捕获并处理可能发生的异常或错误。