同验证码类,分页也是在我的博客,论坛等网站中不可缺乏的方式,经过分页能够在一个界面展现固定条数的数据,而不至于将全部数据所有罗列到一块儿,实现分页的原理其实就是对数据库查询输出加了一个limit限制,接下来咱们就开始准备今天分页类的逻辑php
实现分页,咱们须要获取准备如下属性和方法数据库
属性{ 数据总条数 每一页显示的条数 计算出总页数 获取当前是第几页 显示上一页 显示下一页 显示首页 显示尾页 每一页的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; }
protected function getCurrentUrl() { return $this->url.'$page='.$this->currentPage; }
protected function getPrevUrl() { return $this->url.'&page='.$this->prevPage; }
protected function getNextUrl() { return $this->url.'&page='.$this->nextPage; }
protected function getFirstUrl() { return $this->url.'&page='.$this->firstPage; }
protected function getEndUrl() { return $this->url.'&page='.$this->endPage; }
public function limit() { return ($this->currentPage - 1) * $this->nums.','.$this->nums; }
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=1 parse_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'] 当前运行脚本所在的服务器的主机名。若是脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定