主要内容:
基于7月31日的数据库连接、基本界面展示、分页计算等继续展开的
- 分页展示中的基本功能
a. 分页条的动态生成
b. 跳转地址的动态生成
c. 当前页码的高亮显示 - 分页展示中的首尾页、上下页处理
- 展示列表中的删除与编辑
- 分页展示中缩写及居中等(参考php.cn的样式) - 这部分最后的逻辑要求还是挺高的,参考实战作业吧
1. 分页展示中的基本功能
a. 分页条的动态生成
b. 跳转地址的动态生成
c. 当前页码的高亮显示
正式内容前需要先计算下总“页”数,也就是说一共需要展示多少“页” - pages。计算方法如下:
计算表中共计有多少条记录?
每一页显示几条? 5
总页数 = ceil(记录总数 / 每页的记录数)
$sql = “SELECT CEIL(COUNT(id
)/{$num}) AStotal
FROMusers
“;
计算总页数
$pages = $pdo->query($sql)->fetch()[‘total’];这些内容是放在跟连接数据有关的一个php中,page-data.php,也就是7月31日的demo4
<?php
// 连接数据库
require 'connect.php';
// 获取分页数据, 一定要知道的二个数据
// 1. 每页显示的数量
$num = 5;
// 2. 当前页码,默认为1
$page = $_GET['p'] ?? 1;
// 3. 计算每一页的第一条记录的显示偏移量
$offset = ($page - 1) * $num;
// 4. 获取分页数据
// SElECT * FROM `table_name `LIMIT n OFFSET m;
$sql = "SELECT * FROM `users` LIMIT {$num} OFFSET {$offset}";
// 简写
// $sql = "SELECT * FROM `users` LIMIT {$offset}, {$num}";
$users = $pdo->query($sql)->fetchAll();
// print_r($users);
// 计算总页数
//----------------上面的为7月31日的内容,下面为今天的内容。
// 计算表中共计有多少条记录?
// 每一页显示几条? 5
// 总页数 = ceil(记录总数 / 每页的记录数)
$sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `users`";
// 计算总页数
$pages = $pdo->query($sql)->fetch()['total'];
- 下面则是数据展示的页面,demo1.php
<?php require 'page-data.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>id</td>
<td>name</td>
<td>email</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user):?>
<tr>
<!-- 短标签来简化变量的显示 -->
<td><?=$user['id']?></td>
<td><?php echo $user['name'] ?></td>
<td><?=$user['email']?></td>
<td><button>编辑</button><button>删除</button></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>
<!-- 1. 分页条的动态生成
2. 跳转地址的动态生成
3. 当前页码的高亮显示 -->
<!-- 分页条中的页码应该动态生成 -->
<?php for ($i = 1; $i <= $pages; $i++): ?>
<?php
$jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'], $i);
/* $_SERVER['PHP_SELF']-也就是展示当前页面
* ?p= 在网页中加入了动态的页面数字
* $i: 分页中的页码
* $page: 在URL中通过GET获取的页码?p=X
*/
$active = ($i == $page) ? 'active' : null;
/* $active是css文件中修饰高亮页面数字的类的选项
* 选项变量化,这个地方根据是否为当前页面决定是否将active赋给对应的* 类名。一旦类名等于active了,css文件中.active的style就发挥作用了
*/
?>
<a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
<?php endfor ?>
</p>
</body>
</html>
2. 分页展示中的首尾页、上下页处理
<?php require 'page-data.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>id</td>
<td>name</td>
<td>email</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user):?>
<tr>
<!-- 短标签来简化变量的显示 -->
<td><?=$user['id']?></td>
<td><?php echo $user['name'] ?></td>
<td><?=$user['email']?></td>
<td>
<button onclick="location.href='handle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
<!--这个地方给编辑及删除两个button增加了操作动作,具体是在
handle.php中实现-->
<button onclick="del(<?=$user['id']?>)">删除</button></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>
<!-- 继续完善分页功能
1. 首页
2. 尾页
3. 上一页
4. 下一页 -->
<!-- 上一页: 解决页码的越界 -->
<?php
// 获取前一页的页码
$prev = $page -1;
if ($page == 1) $prev =1;
?>
<?php if ($page != 1): ?>
<!-- 首页 -->
<a href="<?=$_SERVER['PHP_SELF'].'?p=1'?>">首页</a>
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$prev?>">上一页</a>
<?php endif ?>
/* 不等于1的情况显示“首页”和“上一页”。
<?php for ($i = 1; $i <= $pages; $i++): ?>
<?php
$jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'], $i);
$active = ($i == $page) ? 'active' : null;
?>
<a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
<?php endfor ?>
<!-- 下一页: 解决页码的越界 -->
<?php
// 获取下一页的页码,超过最后一页后一直保持在最后一页。
$next = $page + 1;
if ($next >= $pages) $next = $pages;
?>
<?php if ($page != $pages) :?>
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$next ?>">下一页</a>
<!-- 尾页 -->
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$pages?>">尾页</a>
<?php endif ?>
</p>
<script>
// 删除
function del(id) {
return confirm('是否删除?') ? alert('删除成功') :false;
}
</script>
</body>
</html>
3. 展示列表中的删除与编辑
- 首先是在前端也就是第二部分,加上对应的action。
<button onclick="location.href='handle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
<!--这个地方给编辑及删除两个button增加了操作动作,具体是在handle.php中实现-->
<button onclick="del(<?=$user['id']?>)">删除</button></td>
- 然后制作对应的handle.php文件。
<?php
require 'connect.php';
// 获取操作
$action = $_GET['action'];
$id = $_GET['id'];
switch ($action) {
// 编辑操作: 1: 渲染编辑表单; 2. 执行编辑操作
// 1: 渲染编辑表单
case 'edit':
// 加载,渲染数据编辑表单
include 'edit.php';
break;
// 2. 执行编辑操作
case 'doedit':
// 更新
$sql = 'UPDATE `users` SET `name`=?, `email`=? WHERE `id`=?';
$stmt = $pdo->prepare($sql);
// 新的数据在$_POST
if (!empty($_POST)) {
$stmt->execute([$_POST['name'], $_POST['email'], $id]);
if ($stmt->rowCount() == 1) echo '<script>alert("更新成功");location.href="demo2.php"</script>';
}
break;
// 删除。这个地方老师仅仅是提示了下,具体整体的实现还需要再去完善。
case 'delete':
$sql = 'DELETE FROM `users` WHERE `id`=?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
if ($stmt->rowCount() == 1) echo '<script>alert("删除成功");location.href="demo2.php"</script>';
}
- 对应的增加了一个edit.php文件
<?php
// 获取要被编辑的数据
$user = $pdo->query("SELECT * FROM `users` WHERE `id`={$id}")->fetch();
// print_r($user);
?>
<!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>
<h3>用户编辑</h3>
<form action="<? echo $_SERVER['PHP_SELF']. '?action=doedit&id='.$id?>" method="POST">
<!--id还有一种方法是通过隐藏的id来进行传递,不过这次是通过action直接带入的方式实现了-->
<p>
<label for="name">用户名:</label>
<input type="text" name="name" id="name" value="<?=$user['name']?>">
</p>
<p>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" value="<?=$user['email']?>">
</p>
<p>
<button>保存</button>
</p>
</form>
</body>
</html>
4. 作业与实战
- 完成用户信息表中的删除功能
仿php.cn分页,完善你的分页功能[选做]
删除部分自己的实现,首先在前端onclick部分加上action,然后在handle中加入对应code:
<button onclick="location.href='my4handle.php?action=delete&id=<?=$item['id']?>'">delete</button>
case 'delete':
$sql = "DELETE FROM `shao` WHERE `id`=?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
if ($stmt->rowCount()==1)
echo '<script>alert("Delete sucessfully!"); location.href="my3.php"</script>';
break;
- php.cn分页有两个特点,当时1-6的时候,完全显示1-8,然后加上…,再加上最后的两页。
- 同样倒过来也是这样,最后6个数字的时候,会显示最后的8个,然后前面加上…,再前面是1,2。
自己努力实现了下见下面图:
- 代码如下:
<?php require 'my1.php' ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SHAO's Items</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<table>
<caption>邵恒头条</caption>
<thead>
<tr>
<td>id</td>
<td>date</td>
<td>title</td>
<td>tags</td>
<td>action</td>
</tr>
</thead>
<tbody>
<?php foreach ($items as $item):?>
<tr>
<td><?=$item['id']?></td>
<td><?=$item['date']?></td>
<td><?=$item['title']?></td>
<td><?=$item['label']?></td>
<td>
<button onclick="location.href='my4handle.php?action=edit&id=<?=$item['id']?>'">edit</button>
<button onclick="location.href='my4handle.php?action=delete&id=<?=$item['id']?>'">delete</button>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p> <!--这个地方p标签之所以这么靠前,是为了好显示-->
<!--② `首页`、`上一页`的展示和限制-->
<?php
$prevNum = $pageNum - 1;
if ($pageNum == 1) $prevNum=1;
?>
<a href="<?=$SERVER['PHP_SELF'].'?p='.$prevNum?>">上一页</a>
<?php $active1 = ($pageNum==1)? 'active': null?>
<?php $active2 = ($pageNum==2)? 'active': null?>
<a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],1)?>" class = "<?=$active1?>">1</a>
<a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],2)?>" class = "<?=$active2?>">2</a>
<!--下面这块是模仿php中文网实现了底部分页导航部分的显示-->
<?php
switch($pageNum){
/*前面几页的展示*/
case $pageNum<7:
for($i=3; $i<10; $i++):
$jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
$active = ($i==$pageNum) ? 'active' : null;
?>
<a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
<?php endfor ?>
<a>...</a>
<?php break; ?>
<!--中间部分页码的展示-->
<?php
case $pageNum>=7 and $pageNum < $pages -7: ?>
<a>...</a>
<?php for($i=$pageNum-3; $i <= $pageNum+3; $i++):
$jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
$active = ($i==$pageNum) ? 'active' : null;
?>
<a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
<?php endfor ?>
<a>...</a>
<?php break; ?>
<!--最后部分页码的展示-->
<?php
case $pageNum >= $pages-7: ?>
<a>...</a>
<?php for($i = $pages-7; $i <= $pages-2; $i++):
$jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
$active = ($i==$pageNum) ? 'active' : null;
?>
<a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
<?php endfor ?>
<?php break;
}
?>
<!--③ `下一页`、`尾页`的展示和限制-->
<?php
$nextNum = $pageNum + 1;
if ($nextNum >= $pages) $nextNum = $pages;
?>
<?php $activel2 = ($pageNum == $pages-1)? 'active': null?>
<?php $activel = ($pageNum == $pages)? 'active': null?>
<a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$pages-1)?>" class = "<?=$activel2?>"><?=$pages-1?></a>
<a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$pages)?>" class = "<?=$activel?>"><?=$pages?></a>
<a href="<?=$SERVER['PHP_SELF'].'?p='.$nextNum?>">下一页</a>
</!->
</body>
</html>