下面是关于“php显示页码分页类的封装”的详细攻略,大致包含以下几个步骤:
一、准备工作
在开始封装分页类之前,我们需要准备好以下工作:
- 确定要进行分页的数据总数
$total
; - 每一页要显示的记录数
$per_page
; - 确定当前页码数
$current_page
; - 计算总页数
$total_pages
。
二、分页类的设计和封装
在分页类的设计过程中,我们需要考虑以下几个方面:
- 构造函数:需要传入
$total
、$per_page
和$current_page
三个参数,并计算出$total_pages
总页数; - 显示页码:根据参数
$range
确定显示多少个页码,需要考虑当前页的位置; - 构造 SQL 语句:需要传入
$offset
和$per_page
两个参数,构造 SQL 语句; - 返回数据:返回当前页的所有数据;
- 封装到工具类:将分页类封装到工具类中,方便使用。
以下是一个简单的示例:
class Pagination {
protected $total;
protected $per_page;
protected $current_page;
protected $total_pages;
public function __construct($total, $per_page, $current_page) {
$this->total = $total;
$this->per_page = $per_page;
$this->current_page = $current_page;
$this->total_pages = ceil($total / $per_page);
}
public function getPaginationLinks($range = 5) {
$links = '';
$half_range = floor($range / 2);
$start = max(1, $this->current_page - $half_range);
$end = min($this->total_pages, $this->current_page + $half_range);
if ($this->current_page > 1) {
$links .= sprintf('<a href="?page=%s">%s</a>', $this->current_page - 1, '<');
}
for ($i = $start; $i <= $end; $i++) {
if ($i == $this->current_page) {
$links .= sprintf('<span class="current">%s</span>', $i);
} else {
$links .= sprintf('<a href="?page=%s">%s</a>', $i, $i);
}
}
if ($this->current_page < $this->total_pages) {
$links .= sprintf('<a href="?page=%s">%s</a>', $this->current_page + 1, '>');
}
return $links;
}
public function getPaginationData($offset = 0) {
$sql = sprintf('SELECT * FROM my_table LIMIT %d,%d', $offset, $this->per_page);
// execute SQL and return result
}
}
class Paginator {
public static function paginate($total, $per_page, $current_page) {
$pagination = new Pagination($total, $per_page, $current_page);
return [
'links' => $pagination->getPaginationLinks(),
'data' => $pagination->getPaginationData(($current_page - 1) * $per_page)
];
}
}
以上代码中,我们分别封装了 Pagination
类和 Paginator
工具类。Pagination
类用于处理分页相关的逻辑,Paginator
工具类则将 Pagination
类封装一层,方便使用。
三、使用示例
通过 Paginator
工具类调用 paginate
方法,即可获取到包含分页链接和数据的数组。以下是一个简单的使用示例:
// 获取 GET 参数中的页码
$current_page = isset($_GET['page']) ? intval($_GET['page']) : 1;
// 数据总数
$total = 100;
// 每页数据数量
$per_page = 10;
// 获取分页链接和数据
$data = Paginator::paginate($total, $per_page, $current_page);
// 将分页链接插入 HTML 中
echo '<div class="pagination-links">' . $data['links'] . '</div>';
// 显示数据
foreach ($data['data'] as $row) {
// 输出 HTML 数据
}
以上示例中,我们首先获取传入的页码数,并设置数据总数和每页数据数量。然后使用 Paginator::paginate
方法获取到包含分页链接和数据的数组,最后将分页链接插入 HTML 中,以及输出数据。
另外一个使用示例,请参考下面的查询用户列表代码:
$conn = new mysqli('localhost', 'root', '', 'test');
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
$conn->set_charset('utf8mb4');
$sql = 'SELECT COUNT(*) AS count FROM users';
$result = $conn->query($sql);
$count = $result->fetch_assoc()['count'];
$current_page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$per_page = 10;
$pager = Paginator::paginate($count, $per_page, $current_page);
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<?php foreach ($pager['data'] as $user): ?>
<tr>
<td><?php echo $user['id']; ?></td>
<td><?php echo $user['name']; ?></td>
<td><?php echo $user['email']; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div class="pagination-links"><?php echo $pager['links']; ?></div>
以上代码使用了 mysqli 扩展库获取到用户数量,然后使用 Paginator::paginate
方法获取到包含分页链接和数据的数组,最后输出用户列表和分页链接。
希望以上攻略对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php显示页码分页类的封装 - Python技术站