前言
分页是一个很常见的功能,我这里提供了分类类(class)
,用于前端页面中的四个按钮:
- 首页
- 下一页
- 上一页
- 尾页
上面的演示非常不直观,但足可以证明这个类可以完成分页功能。
完整的代码
附有非常详细的注释,但需要有一定的 php 基础。
<?php/*
* //TODO 分页类(前端需传递两个参数)
* @请求方式: GET
* @num: 每页要显示多少条数据
* @sum: 一共有多少条数据
*/class separatePage {protected $num;//每页显示多少条数据protected $sum;//总共有多少条数据protected $page;//当前页protected $totalPage;//总页数protected $url;//路径public function __construct($num, $sum){//!构造器$this -> num = $num;//每页显示多少条数据$this -> sum = $sum;//总共有多少条数据$this -> totalPage = $this -> getTotalPage();//得到总页数$this -> page = $this -> getPage();//得到当前页$this -> url = $this -> getUrl();//得到路径}//TODO 主功能核心函数(借助辅助函数返回完整URL)public function allUrl(){//!功能:所有URL(返回给前端用)return ['首页' => $this -> firstUrl(),//首页'下一页' => $this -> nextUrl(),//下一页'上一页' => $this -> prevUrl(),//上一页'尾页' => $this -> endUrl()//尾页];}public function firstUrl(){//!功能:[首页]路径return $this -> setUrl('page=1');}public function nextUrl(){//!功能:[下一页]路径if($this -> page + 1 > $this -> totalPage){//如果当前页+1(下一页)后大于总页数$page = $this -> totalPage;//则直接跳转到尾页}else {//如果没超过总页数$page = $this -> page + 1;//则页码+1即可}return $this -> setUrl('page=' . $page);//返回}public function prevUrl(){//!功能:[上一页]路径if($this -> page - 1 < 1){//如果当前页-1(上一页)后小于1$page = 1;}else {//如果没小于1$page = $this -> page - 1;//则页码-1即可}return $this -> setUrl('page=' . $page);//返回}public function endUrl(){//!功能:[尾页]路径return $this -> setUrl('page=' . $this -> totalPage);}// TODO 辅助性工具函数(帮助主功能函数)protected function getTotalPage(){//!功能:获取总页数return ceil($this -> sum / $this -> num);//公式:总条数/每页显示数(向上取整)}protected function getPage(){//!功能:获取当前页if(empty($_GET['page'])){//判断前端参数有效值(传递参数是否为空)$page = 1;//如果为空则直接默认第一页}else if($_GET['page'] > $this -> totalPage){//判断前端参数有效值(是否大于总页数)$page = $this -> totalPage;//如果大于直接默认总页数}else if($_GET['page'] < 1){//判断前端参数有效值(是否小于1)$page = 1;//如果小于直接默认第一页}else{//前端传递的参数已合法(直接使用)$page = $_GET['page'];}return $page;//返回}protected function getUrl(){//!功能:获取路径(利用$_SERVER)$scheme = $_SERVER['REQUEST_SCHEME'];//协议名(http/https/ftp)$host = $_SERVER['SERVER_NAME'];//主机名(www.baidu.com/www.php.net)$port = $_SERVER['SERVER_PORT'];//端口号$uri = $_SERVER['REQUEST_URI'];//路径及请求参数$uriArray = parse_url($uri);//将路径及请求参数转换为关联数组$path = $uriArray['path'];//获取当前路径(/index.php)if(!empty($uriArray['query'])){//判断路径中是否存在请求参数(?name=a&age=15)parse_str($uriArray['query'], $array);//不为空则转为关联数组unset($array['page']);//清除请求参数中page参数(防止两个page参数出现)$query = http_build_query($array);//再拼接起来}if($query != ''){//为空则无需清除后拼接$path = $path . '?' . $query;//请求参数拼接}return $scheme . '://' . $host . ':' . $port . $path;//拼接完整的路径}protected function setUrl($e){//!功能:返回真实路径(给前端用)if(strstr($this -> url, '?')){//首先判断路径中有没有请求参数$url = $this -> url . '&' . $e;//拼接page参数}else{//没有请求参数$url = $this -> url . '?' . $e;//拼接page参数}return $url;//返回}//TODO 从数据库中取出数据给前端(使用SQL limit)public function limit(){//!功能:算出limit偏移$offset = ($this -> page - 1) * ($this -> num);//算出偏移return $offset . ',' . $this -> num;}public function data(){# 连接数据库...# 执行SQL语句: select * from list limit limit();# 做处理后连页码带数据返回给前端}
}
如何使用
第一步接收前端请求参数,第二步实例化类,第三步返回。
# 接收前端请求参数(2个)# num: 每页要显示多少条数据# sum: 一共有多少条数据# 实例化类(5为num)
$test = new separatePage(5, 100);//这里填前端请求参数# 返回URL与数据库中的记录# $test -> allUrl();# $test -> data();