数据处理
<?php
// 连接数据库
try {
$pdo = new PDO('mysql:host=php.cn;dbname=php','root','root');
// 结果集获取方式: 关联
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
die($e->getMessage());
}
// 当前页码
$page = $_GET['p'];
// 每页显示的数据量
$num = '5';
// 总页码
$pages = $pdo->query("SELECT CEIL(COUNT(`id`)/{$num}) AS total FROM `staff` ")->fetch()['total'];
// echo $pages;
// 偏移量
$offset = $num * ($page - 1);
// echo $offset;
// 分页数据
$staffs = $pdo->query("SELECT * FROM `staff` LIMIT {$num} OFFSET {$offset}")->fetchAll();
// print_r($staffs);
前端页面
<?php require '003.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>
<td>工号</td>
<td>状态</td>
<td>部门</td>
<td>职务</td>
<td>性别</td>
</tr>
</thead>
<tbody>
<?php foreach($staffs as $staff): ?>
<tr>
<td><?php echo $staff['id'] ?></td>
<td><?php echo $staff['state'] ?></td>
<td><?php echo $staff['section'] ?></td>
<td><?php echo $staff['duty'] ?></td>
<td><?php echo $staff['gender'] ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>
<?php
// 1. 分页条显示5个页码
$showPages = 5;
// 2. 分页条的起始页码
$startPage = 1;
// 3. 分页条的终止页码
$endPage = $pages; // 当前总页数: 14
// 4. 分页条的偏移量: (当前分页条显示的页码数 - 1) / 2
$offsetPage = ($showPages -1) / 2; // 2
if($showPages < $pages){
if($page > $offsetPage + 1){
$startOmit = '...';
}
}
// 将当前分页条页码重置
if ($page > $offsetPage) {
$startPage = $page - $offsetPage;
$endPage = $page + $offsetPage;
if ($endPage > $pages) {$endPage = $pages;}
} else {
$startPage = 1;
$endPage = $showPages;
}
// 如果当前页 + 偏移量 > 总页数
if ($page + $offsetPage > $pages) {
// 原理, 就是向当前页前面进行借位
// 此时, 新的起点 = 当前位置 - (当前页 + 偏移量 - 原始位置)
$startPage = $startPage - ($page + $offsetPage - $endPage);
}
if ($showPages < $pages && $page + $offsetPage < $pages) $endOmit = '...';
?>
<!-- 首页 -->
<a href="<?php echo $_SERVER['PHP_SELF'] . "?p=1"?>">首页</a>
<!-- 上一页 -->
<?php $pre = $page - 1;
if($page == 1) $pre = 1 ?>
<a href="<?php echo $_SERVER['PHP_SELF'] . "?p=" . $pre ?>">上一页 </a>
<!-- 省略号 -->
<?php if(isset($startOmit)): ?><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' :null;
?>
<a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
<?php endfor ?>
<?php if (isset($endOmit)) : ?> <a href="#"><?php echo $endOmit ?></a> <?php endif ?>
<!-- 下一页 -->
<?php $pre = $page + 1;
if($page == $pages) $pre = $pages ?>
<a href="<?php echo $_SERVER['PHP_SELF'] . "?p=" . $pre ?>">下一页 </a>
<!-- 尾页 -->
<a href="<?php echo $_SERVER['PHP_SELF'] . '?p='. $pages ?>">尾页</a>
</p>
</body>
</html>
总结
- 输入页码跳转的时候,form的method设置为get
- 关键数据:页码,偏移量
- 页面数据偏移量公式:每页显示的数据 * (当前页码 - 1)
- 分页条偏移量公式:(当前分页条显示的页码数 - 1)/2