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
获取分页的相关数据
<?php
namespace 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.php
html与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;
//页码跳转的url
if ($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>
效果预览