实现页码功能
通过PDO连接,读取数据库中的数据,通过php输出,那其中的分页数据怎么做呢?下面我们通过一个实例来演示
连接数据库代码
- connect.php
// 根据自己数据库的信息,创建dsn连接字符串,由三部分组成,连接信息,账号,密码
$dsn = 'mysql:host=localhost;dbname=message;charset=utf8;port=3306';
$username = 'root';
$password = '123456';
// 创建一个异常,出现异常抛出消息
try{
$pdo = new PDO($dsn,$username,$password);
// 获取结果获取方式:关联
$pdo -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
}catch(Exception $e) {
die($e->getMessage());
}
读取数据库:
- demo1.php
require 'connect.php';
// 1.当前的页数
$page = $_GET['p']??1;
// 2.每页显示的记录数量
$num = 5;
// 3.总页数
$sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `staffs`";
$pages = $pdo -> query($sql) -> fetch()['total'];
// 4.偏移量
$offset = $num * ($page - 1);
// 5.分页数据
$sql = "SELECT * FROM `staffs` LIMIT {$num} OFFSET {$offset}";
$staffs = $pdo->query($sql)->fetchAll();
实现分页
<body>
<table>
<caption>员工管理系统</caption>
<thead>
<tr>
<th>ID</th>
<th>名字</th>
<th>年龄</th>
<th>班级</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 $staff['age'] ?></td>
<td><?php echo $staff['class'] ?></td>
<td><?php echo $staff['phone'] ?></td>
<td><?php echo $staff['address'] ?></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>
<?php
// 1. 分页条显示5个页码
$showPages = 5;
// 2. 分页条的起始页码
$startPage = 1;
// 3. 分页条的终止页码
$endPage = $pages; // 当前总页数: 14
// 4. 分页条的偏移量: (当前分页条显示的页码数 - 1) / 2
$offsetPage = ($showPages - 1) / 2; // 2
// 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
if ($showPages < $pages) {
// 如果当前页 > 偏移量 + 1 , 应该显示...
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 = '...';
}
?>
<?php if (isset($startOmit)) : ?> <a href="#"><?php echo $startOmit ?></a><?php endif ?>
<!-- 前一页 -->
<?php $prev = $page - 1;
if ($page == 1) $prev = 1;
?>
<a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">前一页</a>
<?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
$next = $page + 1;
if ($page == $pages) $next = $pages;
?>
<a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">下一页</a>
<?php if (isset($endOmit)) : ?> <a href="#"><?php echo $endOmit ?></a><?php endif ?>
<!-- 尾页 -->
<a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
<!-- 跳转页 -->
<p>
<input type="summit" name="summit" id="submit">
<button onclick="location.href='handle.php?action=jump ?>'">跳转</button>
</p>
<script>
function del(id) {
return confirm('是否删除?') ? alert('删除成功') : false;
}
</script>
</p>
</body>
处理脚本
- handle.php
require 'demo1.php';
$action = $_GET['action'];
$id = $_GET['id'];
$jump = $_GET['submit'];
switch($action){
// 编辑需要进行两步
// 1.渲染编辑表单
case 'edit':
include 'edit.php';
break;
case 'doedit':
$sql = 'UPDATE `staffs` SET `name`=:name,`age`=:age,`class`=:class,`phone`=:phone,`address`=:address WHERE `id`=:id';
// $sql = 'UPDATE `staffs` SET `name`=:name, `age`=:age,`sex`=:sex,`position`=:position ,`mobile`=:mobile,`hiredate`=:hiredate WHERE `id`=:id';
// print_r($_POST);
// $_POST['id'] = $id;
$stmt = $pdo->prepare($sql);
$stmt -> execute($_POST);
if($stmt->rowCount() == 1 )echo '<script>alert("更新成功");location.href="demo3.php";</script>';
}
编辑页面
- edit.php
// 获取信息
$staff = $pdo->query("SELECT * FROM `staffs` WHERE `id`={$id}")->fetch();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>编辑员工信息</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'].'?action=doedit&id='.$id ?>" method="post">
<p>
<label for="name">名字</label>
<input type="text" id="name" name="name" value="<?php echo $staff['name']?>">
</p>
<p>
<label for="age">年龄</label>
<input type="text" id="age" name="age" value="<?php echo $staff['age']?>">
</p>
<p>
<label for="class">班级</label>
<input type="text" id="class" name="class" value="<?php echo $staff['class']?>">
</p>
<p>
<label for="phone">电话</label>
<input type="text" id="phone" name="phone" value="<?php echo $staff['phone']?>">
</p>
<p>
<label for="address">地址</label>
<input type="text" id="address" name="address" value="<?php echo $staff['address']?>">
</p>
<button>提交</button>
</body>
输出
编辑页面
总结
整个分页项目可以说是理解了,偏移量的设置,省略的处理,修改脚本的处理,但仅仅停留在理解层面,实际敲的代码,大多数跟着老师敲的,这个还需要多敲,才能记住,光理解没有用,学而不思则罔,思而不学则怠,还需要更多更多更多的敲代码,反复的敲,不能一直半吊子模样,今天敲会一点,明天敲会一点。