上一页下一页实现原理:
获取到当前页码 默认是-1或者+1 但是当达到最小值或者最大值的时候也就是1和最大页数的时候此时应该判断 当当前页码小于1的时候进行处理 不会进行查询 我是用js做了个弹出然后返回上一页就可以了 下一页同理
演示效果
代码部分
<?php
namespace _0819;
use PDO;
// 连接
$db = new PDO('mysql:dbname=user', 'root', 'root');
// 1. 页数
$page = $_GET['p'] ?? 1;
echo '当前页数: p = ' . $page . '<br>';
// 2. 数量
$num = 10;
echo '当前数量: num = ' . $num . '<br>';
// 3. 偏移量 = (页数 - 1) * 数量
$offset = ($page - 1) * $num;
echo '当前偏移量: offset = ' . $offset . '<br>';
// 4. 计算总记录数
// SELECT CEIL(COUNT(*)/5) AS `total` FROM `staff`
// SELECT COUNT(*) AS `total` FROM `staff`
$sql = 'SELECT COUNT(*) AS `total` FROM `user_list`';
$stmt = $db->prepare($sql);
$stmt->execute();
// 将总数量绑定到一个变量上
$stmt->bindColumn('total', $total);
$stmt->fetch();
echo '当前总记录数量: total = ' . $total . '<br>';
// 5. 计算总页数
// 向上取整
$pages = ceil($total / $num);
echo '当前总页数: pages = ' . $pages . '<br>';
$sql = <<< SQL
SELECT *
FROM `user_list`
LIMIT $offset, $num;
SQL;
$stmt = $db->prepare($sql);
$stmt->execute();
$staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($staffs);
echo '<hr>';
if (count($staffs) === 0) {
echo '查询结果为空';
} else {
foreach ($staffs as $staff) {
extract($staff); // $id,$name,$sex,$email
printf('%d-%s-%s-%d<br>', $id, $name, $email, $age);
}
}
echo '<hr>';
// 1. 生成与总页数长度相同的递增的整数数组
// range():创建一个指定范围的数组 这行代码的意思是值从1开始创建范围是截止到当前总页数的数组
// 结果也就是Array ( [0] => 1 [1] => 2 [2] => 3 [3]=>4 ......以此类推)
// 创建这个新数组的目的是将所有页数整合到一个大数组中然后在进行操作
$pageArr = range(1, $pages);
/**
* 2. 只需要当前和前后二页, 其它页码用 false/null 来标记
*
*array_map():返回一个满足条件的新数组
*abs():返回指定参数的绝对值
*返回结果$p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;的意思是
*$p = 循环遍历的$pageArr的每个值
* 条件:当前页数 = 1 和 当前页数等于总页数也就是最后一页 和 当前页数 - $p的绝对值如果小于等于2的时候返回当前页码 否则就为null
*
*/
$paginate = array_map(function ($p) use ($page, $pages) {
return ($p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;
}, $pageArr);
// 去重, 替换
// array_unique:将数组中重复的内容删除只保留一个 array_slice:截取$paginate数组中的数据 从0第一个元素开始往后取 取到当前页码位置
$before = array_unique(array_slice($paginate, 0, $page));
//从当前页码位置往后取全部
$after = array_unique(array_slice($paginate, $page));
// 用解构进行合并
// 将以上两个数组解构之后进行合并成一个数组
$res = [...$before, ...$after];
<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;
}
.active {
background-color: seagreen;
color: white;
border: 1px solid seagreen;
}
</style>
</head>
<body>
<table>
<caption>员工信息表</caption>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<?php foreach ($staffs as $staff) : extract($staff) ?>
<tr>
<td><?= $id ?>
</td>
<td><?= $name ?>
</td>
<td><?= $age ?>
</td>
<td><?= $email ?>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>
<?php
$a = $page - 1;
// echo gettype($a);
// var_dump($a < 0);
if ($page <= 0) {
echo "<script>alert('前面没有了');history.go(-1);</script>";
$a = 1;
// header("Location:?p=1");
}
$dqpage = $_SERVER['PHP_SELF'] . '?p=' . $a;
?>
<a href="<?= $dqpage ?>">上一页</a>
<?php foreach ($res as $k => $v) : ?>
<?php
// 页码跳转的url
if ($v === null) {
$v = '...';
}
if ($v === '...') {
// echo '1';
$url = '#';
} else {
$url = $_SERVER['PHP_SELF'] . '?p=' . $v;
}
// $a = ($v = '...' ? null : $_SERVER['PHP_SELF'] . '?p=' . $v);
// echo $a;
// 实现页码高亮
$page = $_GET['p'] ?? 1;
$active = ($v == $page) ? 'active' : null;
?>
<a href="<?= $url ?>" class="<?= $active ?>"><?= $v ?></a>
<?php endforeach ?>
<?php
$b = $page + 1;
// echo gettype($a);
// var_dump($a < 0);
if ($page > $pages) {
echo "<script>alert('后面没有了');history.go(-1);</script>";
$a = $pages;
// header("Location:?p=1");
}
$dqpage = $_SERVER['PHP_SELF'] . '?p=' . $b;
?>
<a href="<?= $dqpage ?>">下一页</a>
</p>
</body>