同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limit限制,接下来我们就开始准备今天分页类的逻辑
逻辑准备
实现分页,我们需要获取准备以下属性和方法
属性{ 数据总条数 每一页显示的条数 计算出总页数 获取当前是第几页 显示上一页 显示下一页 显示首页 显示尾页 每一页的url 数据限制limit}方法{ 构造函数 计算总页数 获取当前页 获取上一页 获取下一页 获取首页 获取尾页 获取当前页面url 获取上一页url 获取下一页url 获取首页url 获取尾页irl 生成limit记录 重新生成url地址 显示分页链接,显示分页情况}
根据上面的逻辑,下一步将文字转换为代码
首先,我们先声明一个Page类,按照逻辑进行属性声明,并且进行初始化
class Page{ //记录总条数 protected $total; //每页显示几条 protected $nums; //总页数 protected $totalPages; //当前页码 protected $currentPage; //上一页页码 protected $prevPage; //下一页页码 protected $nextPage; //首页页码 protected $firstPage; //尾页页码 protected $endPage; //url protected $url; //limit,传到数据库的limit protected $limit; //构造函数,初始化 public function __construct($total, $nums) { $this->total = $total; $this->nums = $nums; $this->totalPages = $this->getTotalPages(); $this->currentPage = $this->getCurrentPage(); $this->getPrevPage(); $this->getNextPage(); $this->getFirstPage(); $this->getEndPage(); $this->getUrl(); } }
接下来我们开始完善方法
- 计算总页数
protected funciton getTotalPages() { return ceil($this->total / $this->$nums); }
- 获取当前页码
protected function getCurentPage() { //判断如果存在page参数并且page大于0,返回实际值,否则返回1 if(isset($_GET['page']) && intval($_GET['page']) > 0) { $this->currentPage = intval($_GET['page']); } else { $this->currentPage = 1; } return $this->currentPage; }
- 获取上一页
protected function getPrevPage() { $this->prevPage = $this->currentPage - 1; if($this->prevPage < 1) { $this->prevPage = 1; } return $this->prevPage; }
- 获取下一页
protected function getNextPage() { $this->nextPage = $this->currentPage + 1; return $this->nextPage; }
- 获取首页
protected function getFirstPage() { $this->firstPage = 1; return $this->firstPage; }
- 获取尾页
protected function getEndPage() { $this->endPage = $this->totalPages; return $this->endPage; }
接下来开始拼接每个页码的url
- 获取当前页的url
protected function getCurrentUrl() { return $this->url.'$page='.$this->currentPage; }
- 获取前一页的url
protected function getPrevUrl() { return $this->url.'&page='.$this->prevPage; }
- 获取下一页的url
protected function getNextUrl() { return $this->url.'&page='.$this->nextPage; }
- 获取首页的url
protected function getFirstUrl() { return $this->url.'&page='.$this->firstPage; }
- 获取尾页的url
protected function getEndUrl() { return $this->url.'&page='.$this->endPage; }
生成limit记录
public function limit() { return ($this->currentPage - 1) * $this->nums.','.$this->nums; }
生成url地址
public function getUrl() { //获取当前页面的文件位置 $url = $_SERVER['REQUEST_URI']; //将url参数解析成数组 $parse = parse_url($url); //获得域名地址 $path = $parse['path']; //获取参数 $query = isset($parse['query']) ? $parse['query'] : false; //如果有参数,把page这个参数先给干掉,因为我们要重新拼接 if($query) { parse_str($query,$query); //干掉page参数,保留其他参数 unset($query['page']); //http_build_query拼将参数拼接成请求 $uri = $parse['path'].'?'.http_build_query($query); } else { $uri = rtrim($parse['path'],'?').'?'; } //智能识别https和http协议和端口号 $protocal = (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://'; switch ($_SERVER['SERVER_PORT']) { case 80: case 443: $uri = $protocal.$_SERVER['SERVER_NAME'].$uri; break; default: $uri = $protocal.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$uri; break; } $this->url = $uri; }
到此所有的逻辑方面都已经处理完啦,接下来的render()函数用来显示分页的链接
public function render() { return array( ['first' => $this->getFirstUrl()], ['prev' => $this->getPrevUrl()], ['current' => $this->getCurrentUrl()], ['next' => $this->getNextUrl()], ['end' => $this->getEndUrl()] ); }
哦也,就这么愉快的结束啦
使用方法如下
//new一个对象$page = new Page(102,10);//打印出来上页/下页/首页/尾页……的url var_dump($page->render());
后记
$url = http://www.zhyunfe.com/OOP/Page.class.php?page=1parse_url($url):将url的文件路径和参数分开并保存到数组中 .......................................... . array (size=2) . 'path' => string '/OOP/Page.class.php' (length=36) . 'query' => string 'page=1' (length=6) .......................................... ... $query = "page=1&num=2&sex=男" parse_str($query,$query):将带参数的字符串解析成数组 .......................................... . array . 'page' => 1 . 'num' => 2 . 'sex' => '男' .......................................... ... $query = ['num'=>1,'sex'=>'男'] http_build_query($query):使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。 ......................................... . string . "num=1&&sex='男'" ......................................... ... $_SERVER['SERVER_PORT'] 获取端口号 $_SERVER['SERVER_NAME'] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定