前言
分页是一个很常见的功能,我这里提供了分类类(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();