今天对之前的用户管理模块实现了一个简单的分页功能,大致样式如下:
接下来谈谈具体实现的步骤:
1、既然涉及到分页,首先肯定是从数据库获取的数据就有限制,这个限制就是用limit,比如下面这个sql语句:
$sql="select * from users order by id desc limit 0,3";其意思为:从用户表(users)中按降序排列取出从位置0开始的3条数据,即我按照每页3条数据划分;
2、因为每一页的数据都是不同的,而这个模块始终是用户管理模块,其地址栏不能有大的变化,面对成千上万的页码,也不可能变化这么多地址,比如我的地址栏:http://localhost/project/interview_practice/20181017/2018101701/adminuser.php,这个基本上是固定的,所以就需要在上面加参数,比如加个参数p,后面数字表示第几页:http://localhost/project/interview_practice/20181017/2018101701/adminuser.php?p=3;
3、以上两条是需要知道的基本条件,先从简单的入手,实现首页:
<a href='adminuser.php?p=1' class='btn btn-info'>首页</a>
上面的地址adminuser.php?p=1是从登录界面跳转过来的地址,首页就这样完成了!
4、接下来实现末页,先思考一个问题,末页是多少页,怎么计算出来?这里就需要用到数据总行数了,先获取数据总行数:
//获取总的数量
$sqltot = "select count(*) as columns from users";
$smttot = $pdo->query($sqltot);
$rowstot = $smttot->fetchAll(PDO::FETCH_ASSOC);
$tot = $rowstot[0]['columns'];
$tot就是获取到的总行数,也可以用第二种方法获取到:
$smttot = $pdo->prepare($sqltot);
$smttot->execute();
$tot=$smttot->fetchColumn();
而每页有3条数据,用ceil()函数进行向上取整获取最后一页的页码:
//每页条数
$length = 3;
$lastPage = ceil($tot/$length);//ceil向上取整
这就是末页地址:
<a href='adminuser.php?p=<?php echo $lastPage;?>' class='btn btn-info'>末页</a>
5、接下来实现比较难对付的上一页、下一页,我们的第一想法很可能是用id来实现分页:比如第一页的数据1,2,3;第二页的数据4,5,6;第三页的数据7,8,9……但是当某条数据被删除了之后,该如何找规律呢?因此,用id分页是不可取的,因为id是没有规律的;而之前讲到的limit是又规律可寻的:limit 0,3;limit 3,3;limit 6,3;limit 9,3……因此我们可以这样来设计:
$sql="select * from users order by id desc limit {$offset},{$length}";
$offset表示当前页数和页面条数的关系:
$offset = ($page-1) * $length;
而当前页面$page可以通过$_GET获取:
$page = $_GET['p'];
因此,我们可以开始实现下一页了,它就是当前页面数+1:
$nextpage = $page+1;
对应的链接:
<a href='adminuser.php?p=<?php echo $prepage;?>' class='btn btn-info'>上一页</a>
而上一页就是当前页面数-1:
$prepage = $page-1;
对应的链接:
<a href='adminuser.php?p=<?php echo $nextpage;?>' class='btn btn-info'>下一页</a>
6、至此,基本的分页功能就实现了,不过还会遇到很多问题,比如页面数可以一直增加到无穷大或减少到无穷小,因此需要对当前页、上一页和下一页做限制,当页面数超过末页时,就让它等于末页;页面数小于首页时,就让它等于首页:
//当前页数
$page = $_GET['p'];
if($page>=$lastPage){
$page=$lastPage;
}
//下一页
$nextpage = $page+1;
if($nextpage>=$lastPage){
$nextpage=$lastPage;
}
//上一页
$prepage = $page-1;
if($prepage<=1){
$prepage=1;
}
7、实现跳转的功能
<span>跳转至 <input type='text' id='p' class='p' style='width: 30px;height:25px'>页</span>
<button class='btn btn-success' id='b1'>GO</button>
用jQuery实现:
//页面跳转
$('#b1').click(function(){
val = $('#p').val();
if(!val){
alert('请输入页码!');
}else{
//alert(val.match(/^\d+$/g));
if(val.match(/^\d+$/g)){
location='adminuser.php?p='+val;
}else{
//alert('非法字符!');
}
}
});
这里需要注意两个地方:一是!val的判断,如果输入值为空,为避免后端出现问题,需要加这个判断,关于!val的用法可以参考这篇文章https://www.jb51.net/article/48481.htm;
二是需要对输入的字符串进行判断,输入数字的时候才会跳转!用到了正则匹配。
8、所有功能都实现了,代码如下,都是PHP+HTML混编:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>用户管理</title>
<link href='bs2/css/bootstrap.min.css' rel="stylesheet" >
<script src="jquery3/jquery-3.0.0.min.js"></script>
<script src="bs2/js/bootstrap.min.js"></script>
</head>
<body>
<div class='container'>
<h1 class='page-header'>用户管理</h1>
<p>
<button class='btn btn-success' onclick="location='index.php'">返回首页</button>
<button class='btn btn-default' onclick="location='logout.php'">退出登录</button>
</p>
<p>
<?php
require_once('connectdb.php');
//末页
$sqltot = "select count(*) as columns from users"; //获取总的数量
//方法一
$smttot = $pdo->query($sqltot);
$rowstot = $smttot->fetchAll(PDO::FETCH_ASSOC);
$tot = $rowstot[0]['columns'];
//每页条数
$length = 3;
$lastPage = ceil($tot/$length);//ceil向上取整
//echo $lastPage;
//当前页数
$page = $_GET['p'];
if($page>=$lastPage){
$page=$lastPage;
}
//下一页
$nextpage = $page+1;
if($nextpage>=$lastPage){
$nextpage=$lastPage;
}
//上一页
$prepage = $page-1;
if($prepage<=1){
$prepage=1;
}
$offset = ($page-1) * $length;
//求每页的数据
$sql="select * from users order by id desc limit {$offset},{$length}";
$smt=$pdo->query($sql);
$rows=$smt->fetchAll(PDO::FETCH_ASSOC);
echo "<table class='table table-striped table-hover table-bordered' width='1000px' border='1px' cellspacing='0'>";
echo "<tr>";
echo "<th>用户id</th>";
echo "<th>用户名</td>";
echo "<th>邮箱</th>";
echo "<th>手机号</th>";
echo "<th>操作</th>";
echo "</tr>";
foreach($rows as $row){
echo "<tr id='{$row['id']}'>";
echo "<td >$row[id]</td>";
echo "<td>$row[user]</td>";
echo "<td>$row[email]</td>";
echo "<td>$row[number]</td>";
echo "<td><a href='javascript:' class='btn btn-warning'>修改</a> <a href='javascript:' class='del' num='{$row['id']}'>删除</a></td>";//href='delete.php?id={$row['id']}'
echo "</tr>";
}
echo "</table>";
?>
</p>
<p>当前第<?php if($_GET['p']>=$lastPage){$_GET['p']=$lastPage;};echo $_GET['p'];?>页</p>
<p>
<a href='adminuser.php?p=1' class='btn btn-info'>首页</a>
<a href='adminuser.php?p=<?php echo $prepage;?>' class='btn btn-info'>上一页</a>
<a href='adminuser.php?p=<?php echo $nextpage;?>' class='btn btn-info'>下一页</a>
<a href='adminuser.php?p=<?php echo $lastPage;?>' class='btn btn-info'>末页</a>
<button class='btn btn-default'><?php if($_GET['p']>=$lastPage){$_GET['p']=$lastPage;};echo $_GET['p'].'/'.$lastPage;?></button>
<span>跳转至 <input type='text' id='p' class='p' style='width: 30px;height:25px'>页</span>
<button class='btn btn-success' id='b1'>GO</button>
</p>
</div>
</body>
<script>
//页面跳转
$('#b1').click(function(){
val = $('#p').val();
if(!val){
alert('请输入页码!');
}else{
//alert(val.match(/^\d+$/g));
if(val.match(/^\d+$/g)){
location='adminuser.php?p='+val;
}else{
//alert('非法字符!');
}
}
});
//异步删除用户信息
trobjs=document.getElementsByClassName('del');
for(i=0;i<trobjs.length;i++){
trobjs[i].onclick=function(){
id=this.getAttribute('num');
//alert(id);
xhr=new XMLHttpRequest();
xhr.open('get','delete.php?id='+id,true);
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
r=xhr.responseText;
//alert(r);
if(r==1){
tr=document.getElementById(id);
tr.style.display='none';
}
}
}
}
}
</script>
</html>