php分页功能
1.连接数据库
<?php
$dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
$username = 'root';
$password = 'root';
try {
$pdo = new PDO($dsn, $username, $password);
// 结果集获取方式: 关联
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
die($e->getMessage());
}
2.页面渲染
<?php
require 'createPage.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>分页数据展示</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<table>
<caption>员工管理系统</caption>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>入职时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($staffs as $staff) : ?>
<tr>
<td><?php echo $staff['id'] ?></td>
<td><?php echo $staff['name'] ?></td>
<td><?php echo date('Y-m-d', $staff['hiredate']) ?></td>
<td><button onclick="location.href='handle.php?action=edit&id=<?php echo $staff['id'] ?>'">编辑</button>
<button onclick="del(<?php echo $staff['id'] ?>)">删除</button></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!-- 添加跳转到首页, 前一页, 下一页, 尾页的功能 -->
<p>
<!-- 首页-->
<a href="<?php echo $_SERVER['PHP_SELF'].'?p=1'?>">首页</a>
<!-- 前一页-->
<a href="<?php echo $_SERVER['PHP_SELF'] .'?p='.$prev?>">前一页</a>
<!-- 前面省略 -->
<?php if (isset($startOmit)) : ?> <a href="<?php echo $_SERVER['PHP_SELF'].'?p=1'?>">1</a><a href="#"><?php echo $startOmit ?></a> <?php endif ?>
<!-- 分页条 -->
<?php for ($i = $startPage;$i <= $endPage;$i++): ?>
<?php
$jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
$active = ($i == $page) ? 'active' : '';
?>
<a href="<?= $jump?>" class="<?php echo $active ?>"><?=$i?></a>
<?php endfor ?>
<!-- 后面省略 -->
<?php if (isset($endOmit)) : ?> <a href="#"><?php echo $endOmit ?></a> <a href="<?php echo $_SERVER['PHP_SELF'].'?p='.$total?>"><?=$total?></a><?php endif ?>
<!-- 下一页-->
<a href="<?php echo $_SERVER['PHP_SELF'] .'?p='.$next?>">下一页</a>
<!-- 尾页-->
<a href="<?php echo $_SERVER['PHP_SELF'].'?p=' .$total?>">尾页</a>
<!-- 页面跳转 -->
<form method="get" action="table.php">
<input type="number" value="" name="p">
<button>跳转</button>
</form>
</p>
<script>
function del(id) {
return confirm('是否删除?') ? alert('删除成功') : false;
}
</script>
</body>
</html>
3.数据处理
<?php
//连接数据库
require 'connect.php';
//1.当前的页数/页码
$page = $_GET['p'] ?? 1;
if($_GET['p'] == 0){
$page = 1;
}
//2.每页显示的记录数量
$pageSize = 5;
//3.总页数
$sql = "SELECT CEIL(COUNT(`id`)/$pageSize) AS `total` FROM `user`";
$total = $pdo->query($sql)->fetch()['total'];
//4.偏移量
$offset = $pageSize*($page-1);
//var_dump($pageSize);
//5.分页数据
$sql = "SELECT * FROM `user` LIMIT {$pageSize} OFFSET {$offset}";
$staffs = $pdo->query($sql)->fetchAll();
/**
* 前一页
* 如果当前页码是第一页,页码锁定到第一页
*/
$prev = $page - 1;
if($page == 1){
$prev = 1;
}
/**
* 下一页
* 如果下一页的页码大于总页数,页码锁定到总页数
*/
$next = $page + 1;
//if ($page == $total) $next = $total;
if($next > $total){
$next = $total;
}
/**
* 1.分页条显示5个页码
*/
$showPages = 5;
/**
* 2.分页条起始页码
*/
$startPage = 1;
/**
* 3.分页条结束页码 ,等于总页数
*/
$endPage = $total;
/**
* 4.分页条的偏移量: (当前分页条显示的页码数 - 1) / 2
*/
$offsetPage = ($showPages - 1)/2;
/**
* 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
*/
if($showPages < $total){
// 如果当前页 > 偏移量 + 1 , 应该显示前面...
if($page > $offsetPage + 1){
$startOmit = '...';
}
// 如果当前页 + 偏移量 <总页数 , 应该显示后面...
if($showPages < $total && $page + $offsetPage < $total){
$endOmit = '...';
}
// 将当前分页条页码重置
if($page > $offsetPage){
//如果当前分页大于分页偏移量,开始页等于当前页-分页偏移量,
$startPage = $page - $offsetPage;
//结束页等于当前页+分页偏移量,
$endPage = $page + $offsetPage;
//如果结束页大于总页数,锁定结束页
if($endPage > $total) $endPage=$total;
}else{
$startPage = 1;
$endPage = $showPages;
}
// 如果当前页 + 偏移量 > 总页数
if ($page + $offsetPage > $total) {
// 原理, 就是向当前页前面进行借位
// 此时, 新的起点 = 当前位置 - (当前页 + 偏移量 - 原始位置)
$startPage = $startPage - ($total + $offsetPage - $endPage);
}
}
总结
- 页码偏移量:每页显示的记录数量*(当前页码-1)
- 分页条偏移量:(当前分页条显示的页码数 - 1) / 2