今天对之前的用户管理模块实现了一个简单的分页功能,大致样式如下:
接下来谈谈具体实现的步骤:
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、以上两条是需要知道的基本条件,先从简单的入手,实现首页:
首页
上面的地址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向上取整
这就是末页地址:
末页
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;
对应的链接:
上一页
而上一页就是当前页面数-1:
$prepage = $page-1;
对应的链接:
下一页
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、实现跳转的功能
跳转至 页
用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混编:
用户管理
用户管理
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 "
";
echo "";
echo "用户id ";
echo "用户名";
echo " 邮箱 ";
echo "手机号 ";
echo "操作 ";
echo " ";
foreach($rows as $row){
echo "";
echo "$row[id] ";
echo "$row[user] ";
echo "$row[email] ";
echo "$row[number] ";
echo "修改 删除 ";//href='delete.php?id={$row['id']}'
echo " ";
}
echo "
";
?>
当前第=$lastPage){$_GET['p']=$lastPage;};echo $_GET['p'];?>页