批改状态:合格
老师批语:
page_refer.php 生成分页码API
<?php// ! 仿php.cn分页作用参考代码/*** 生成分页码** @param integer $page 当前页* @param integer $pages 总页数* @return array 如果当前是第8页, 共计20页,返回新数组[1,null,6, 7, 8, 9, 10,null,20]*/function createPages(int $page, int $pages): array{// 1. 生成与总页数长度相同的递增的整数数组$pageArr = range(1, $pages);// 2. 只需要当前和前后二页, 其它页码用 false/null 来标记$paginate = array_map(function ($p) use ($page, $pages) {return ($p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;}, $pageArr);// dump($paginate);// 去重, 替换// array_unique():删除数组中重复的内容,只保留一个// array_slice(): 第一个:在数组$paginate中取出索引从0开始到$page索引的元素;// 第二个:在数组$paginate中取出从$page取出后面的所有元素$before = array_unique(array_slice($paginate, 0, $page));$after = array_unique(array_slice($paginate, $page));// 用解构进行合并return [...$before, ...$after];}
demo.php 获取分页的相关数据
<?phpnamespace Pagination;use PDO;// 1.获取当前页码// $_GET['p'] : 从地址栏获取变量p的值,也就是当前页码// / ??: 两个问号表示当前页码如果为空,则当前页码默认为1$page = $_GET['p'] ?? 1;echo '当前页码: p = ' . $page . '<br>';// 2.获取分页的数量 每页显示数据的条数$num = 5;echo '当前数量: num = ' . $num . '<br>';// 3.偏移量 = (当前页码 - 1) * 数量$offset = ($page - 1) * $num;echo '当前偏移量: offset = ' . $offset . '<br>';// 数据库连接$db = new PDO('mysql:host=localhost;dbname=phpedu;port:3306;charset=utf8', 'root', 'root');// 4.获取总记录数$sql = 'SELECT COUNT(*) AS `total` FROM `user`';// 创建对象$stmt = $db->prepare($sql);// 执行sql$stmt->execute();// 将数据库查询的总数量绑定给变量 total$stmt->bindColumn('total', $total);$stmt->fetch();echo '当前总记录数量: total = ' . $total . '<br>';// 5.获取总页数 ceil向上取整数函数$pages = ceil($total / $num);echo '当前总页数: pages = ' . $pages . '<br>';// 6.按条件获取分页查询的数据$sql = "SELECT * FROM user LIMIT $offset,$num";// 创建对象并执行sql$stmt = $db->prepare($sql);$stmt->execute();// 得到关联数组$staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);// 分页条函数 得到新的总数require 'page_refer.php';$newPages = createPages($page, $pages);print_r($newPages);// 在头部和尾部追加元素array_unshift($newPages, '上一页');array_push($newPages, '下一页');?>
demo.php样式表
<style>table {width: 400px;border-collapse: collapse;text-align: center;}table th,table td {border: 1px solid;padding: 5px;}table thead {background-color: lightcyan;}table caption {font-size: larger;margin-bottom: 8px;}body>p {display: flex;}p>a {text-decoration: none;color: #555;border: 1px solid;padding: 5px 10px;margin: 10px 2px;}.none {text-decoration: none;color: #555;border: none;padding: 5px 10px;margin: 10px 2px;}.active {background-color: seagreen;color: white;border: 1px solid seagreen;}</style>
demo.phphtml与php代码片段渲染
<table><caption>员工信息表</caption><thead><tr><th>ID</th><th>姓名</th><th>性别</th><th>邮箱</th></tr></thead><tbody><!-- extract 直接解构关联数组中的键作为变量名称 --><?php foreach ($staffs as $staff) : extract($staff) ?><tr><td><?= $id ?></td><td><?= $name ?></td><td><?= $sex ? '女' : '男'; ?></td><td><?= $email ?></td></tr><?php endforeach ?></tbody></table><p><?php foreach ($newPages as $key => $value) :// 实现页码高亮$page = $_GET['p'] ?? 1;$active = ($value == $page) ? 'active' : null;$isNnoe = '';$value = ($value == null) ? '...' : $value;$isNnoe = ($value == '...') ? 'none' : null;//页码跳转的urlif ($value === "上一页") {// 越界$url = ($page <= 1) ? ($_SERVER['PHP_SELF'] . '?p=' . $newPages[$key + 1]) : ($_SERVER['PHP_SELF'] . '?p=' . ($page - 1));} else if ($value === "下一页") {$url = ($page >= $pages) ? ($_SERVER['PHP_SELF'] . '?p=' . $newPages[$key - 1]) : ($_SERVER['PHP_SELF'] . '?p=' . ($page + 1));// $url = $_SERVER['PHP_SELF'] . '?p=' . ($page + 1);} else if ($value == '...') {$url = $_SERVER['PHP_SELF'] . '#';} else {$url = $_SERVER['PHP_SELF'] . '?p=' . $value;}?><a href="<?= $url ?>" class="<?= $active . ' ' . $isNnoe ?>"><?= $value ?></a><?php endforeach ?></p>
效果预览

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号