在简单分页基础上进行改良,使得分页条长度限制在一定长度内
上代码:
<?php
// 连接数据库文件
require "db.php";
// 查询数据
$select = "SELECT `id`,`user_name`,`password`,`user_type` FROM `user`";
$data = $pdo->prepare($select);
$data->execute();
$res = $data->fetchAll();
if ($data->rowCount() == 0) {
exit("<script>
alert('查询失败')
</script>");
}
// 分页
// 1.每页显示数量,由前端获取,默认为2
$num = 2;
// 2.当前页码,默认为1
$page = $_GET['p'] ?? 1;
// 3.计算每页第一条记录偏移量
$offset = ($page - 1) * $num;
// 4.获取分页数据
$pagedata = "SELECT * FROM `user` LIMIT {$num} OFFSET {$offset}";
// 语句简写
// $pagedata = "SELECT * FROM `user` LIMIT {$offset}, {$num}";
$users = $pdo->query($pagedata)->fetchAll();
// 5.计算总页数
// 计算表中共计有多少条记录,每页显示几条
// 总页数=ceil(记录总数/每页的记录数):ceil()向上取整函数
$sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `user`";
$pages = $pdo->query($sql)->fetch()['total'];
// 6.取选中页码和前后2页组成中间显示的5页
// 要显示页码的起始页(处理越界问题)
$startpage = ($page - 2) <= 0 ? 1 : ($page - 2);
// 要显示页码的结束页(处理越界问题)
$stoppage = ($page + 2) > $pages ? $pages : ($page + 2);
// 7.翻页
// 上一页
$prev = ($page - 1) == 0 ? 1 : ($page - 1);
// 下一页
$next = ($page + 1) > $pages ? $pages : ($page + 1);
?>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>控制台(复杂分页)</title>
</head>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
min-width: 1000px;
}
.tab {
width: 1100px;
margin: 50px auto 10px;
text-align: center;
border-collapse: collapse;
}
.tab tr:hover {
background-color: rgb(240, 240, 240);
}
.tab th,
.tab td {
border: 1px solid rgb(230, 230, 230);
padding: 5px 0;
}
.btn {
width: 45px;
height: 30px;
border: none;
color: white;
border-radius: 15px;
transition: 300ms;
}
.btn:hover {
border-radius: 0;
}
.btn-success {
background-color: rgb(0, 150, 136);
}
.btn-dangerous {
background-color: rgb(255, 87, 34);
}
.container {
text-align: center;
}
.page {
font-size: 0;
margin: 10px auto;
}
.page>.list {
display: inline-block;
min-width: 30px;
height: 20px;
font-size: 16px;
}
.page>.list>.link {
display: block;
line-height: 20px;
text-align: center;
padding: 5px;
border: 1px solid rgb(230, 230, 230);
text-decoration: none;
}
.page>.list>.link {
border-right: none;
}
.page>.list:last-of-type>.link {
border-right: 1px solid rgb(230, 230, 230);
}
.page>.list>.link:hover {
color: white;
background-color: rgb(75, 178, 255);
}
.active {
color: white;
background-color: rgb(30, 159, 255);
}
.hidden {
display: none;
}
</style>
<body>
<table class="tab">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
<th>用户类型</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 渲染表格数据 -->
<?php foreach ($users as $user) : ?>
<tr>
<td><?php echo $user["id"] ?></td>
<td><?php echo $user["user_name"] ?></td>
<td><?php echo $user["password"] ?></td>
<td><?php echo $user["user_type"] == 1 ? "管理员" : "非管理员" ?></td>
<td>
<button class="btn btn-success" onclick="location.href='handle.php?action=edit&userid=<?= $user['id'] ?>'">编辑</button>
<button class="btn btn-dangerous" onclick="location.href='handle.php?action=del&userid=<?= $user['id'] ?>'">删除</button>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<!-- 复杂分页 -->
<div class="container">
<ul class="page">
<li class="list"><a href="<?= $_SERVER['PHP_SELF'] . '?p=1' ?>" class="link">首页</a></li>
<li class="list"><a href="<?= $_SERVER['PHP_SELF'] . '?p=' . $prev ?>" class="link">上一页</a></li>
<!-- 总页数大于10时进行分割 -->
<?php if ($pages >= 10) : ?>
<li class="<?= $page <= 3 ? 'hidden' : 'list'; ?>"><a href="<?= $_SERVER['PHP_SELF'] . '?p=1' ?>" class="link">1</a></li>
<li class="<?= $page <= 4 ? 'hidden' : 'list'; ?>"><a href="<?= $_SERVER['PHP_SELF'] . '?p=2' ?>" class="link">2</a></li>
<!-- 判断当前页码隐藏... -->
<li class="<?= $page <= 5 ? 'hidden' : 'list'; ?>"><a href="" class="link">...</a></li>
<!-- 从中间页码起始页取遍历开始的值$i -->
<?php for ($i = $startpage; $i <= $stoppage; $i++) : ?>
<?php
// $i是分页条中的页码,$page是url中get获取到的页码
$active = ($i == $page) ? 'active' : null;
// 用sprintf()拼接url字符串
$jump = sprintf("%s?p=%s", $_SERVER['PHP_SELF'], $i);
?>
<li class="list"><a href="<?= $jump ?>" class="link <?= $active ?>"><?= $i ?></a></li>
<?php endfor ?>
<!-- 后面的... -->
<li class="<?= $page >= ($pages - 4) ? 'hidden' : 'list'; ?>"><a href="" class="link">...</a></li>
<li class="<?= $page >= ($pages - 3) ? 'hidden' : 'list'; ?>"><a href="<?= $_SERVER['PHP_SELF'] . '?p=' . ($pages - 1) ?>" class="link"><?= $pages - 1 ?></a></li>
<li class="<?= $page >= ($pages - 2) ? 'hidden' : 'list'; ?>"><a href="<?= $_SERVER['PHP_SELF'] . '?p=' . $pages ?>" class="link"><?= $pages ?></a></li>
<?php else : ?>
<!-- 如果总页码小于10时使用简单分页 -->
<?php for ($i = 1; $i <= $pages; $i++) : ?>
<?php
// $i是分页条中的页码,$page是url中get获取到的页码
$active = ($i == $page) ? 'active' : null;
// 可以用sprintf()拼接url字符串
$jump = sprintf("%s?p=%s", $_SERVER['PHP_SELF'], $i);
?>
<li class="list"><a href="<?= $jump ?>" class="link <?= $active ?>"><?= $i ?></a></li>
<?php endfor ?>
<?php endif; ?>
<li class="list"><a href="<?= $_SERVER['PHP_SELF'] . '?p=' . $next ?>" class="link">下一页</a></li>
<li class="list"><a href="<?= $_SERVER['PHP_SELF'] . '?p=' . $pages ?>" class="link">尾页</a></li>
</ul>
</div>
</body>
</html>
- 运行效果
总结:
1.越界问题使用判断页码长度来解决;
2.前两页和省略号,后两页和省略号的出现时机判定使用中间页面的首页与尾页来做;
3.我将页面部署到linux+php7.3.8时,对于 <?...?>
不加php无法渲染表格数据,写成 <?php...?>
后解决问题;