批改状态:合格
老师批语:学到现在, 不会连php标签还没搞明白吧
<?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...?> 后解决问题;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号