PHP+MySQL实现简单的分页功能

 

今天对之前的用户管理模块实现了一个简单的分页功能,大致样式如下:

PHP+MySQL实现简单的分页功能_第1张图片

接下来谈谈具体实现的步骤:

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 ""; echo ""; echo ""; echo ""; echo ""; foreach($rows as $row){ echo ""; echo ""; echo ""; echo ""; echo ""; echo "";//href='delete.php?id={$row['id']}' echo ""; } echo "
用户id用户名"; echo "邮箱手机号操作
$row[id]$row[user]$row[email]$row[number]修改 删除
"; ?>

当前第=$lastPage){$_GET['p']=$lastPage;};echo $_GET['p'];?>页

首页 上一页 下一页 末页 跳转至 

 

你可能感兴趣的:(php)