完美的php分页类


Posted in PHP onOctober 24, 2017

本文实例为大家分享了php分页类的具体代码,供大家参考,具体内容如下

<?php
  /**
    file: page.class.php 
    完美分页类 Page 
  */
  class Page {
    private $total;              //数据表中总记录数
    private $listRows;             //每页显示行数
    private $limit;              //SQL语句使用limit从句,限制获取记录个数
    private $uri;               //自动获取url的请求地址
    private $pageNum;             //总页数
    private $page;              //当前页  
    private $config = array(
        'head' => "条记录", 
        'prev' => "上一页", 
        'next' => "下一页", 
        'first'=> "首页", 
        'last' => "末页"
      );           
    //在分页信息中显示内容,可以自己通过set()方法设置
    private $listNum = 10;           //默认分页列表显示的个数

    /**
      构造方法,可以设置分页类的属性
      @param  int  $total    计算分页的总记录数
      @param  int  $listRows  可选的,设置每页需要显示的记录数,默认为25条
      @param  mixed  $query  可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式
      @param   bool  $ord  可选的,默认值为true, 页面从第一页开始显示,false则为最后一页
     */
    public function __construct($total, $listRows=25, $query="", $ord=true){
      $this->total = $total;
      $this->listRows = $listRows;
      $this->uri = $this->getUri($query);
      $this->pageNum = ceil($this->total / $this->listRows);
      /*以下判断用来设置当前面*/
      if(!empty($_GET["page"])) {
        $page = $_GET["page"];
      }else{
        if($ord)
          $page = 1;
        else
          $page = $this->pageNum;
      }

      if($total > 0) {
        if(preg_match('/\D/', $page) ){
          $this->page = 1;
        }else{
          $this->page = $page;
        }
      }else{
        $this->page = 0;
      }
      
      $this->limit = "LIMIT ".$this->setLimit();
    }

    /**
      用于设置显示分页的信息,可以进行连贯操作
      @param  string  $param  是成员属性数组config的下标
      @param  string  $value  用于设置config下标对应的元素值
      @return  object      返回本对象自己$this, 用于连惯操作
     */
    function set($param, $value){
      if(array_key_exists($param, $this->config)){
        $this->config[$param] = $value;
      }
      return $this;
    }
    
    /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */
    function __get($args){
      if($args == "limit" || $args == "page")
        return $this->$args;
      else
        return null;
    }
    
    /**
      按指定的格式输出分页
      @param  int  0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构
      @return  string  分页信息内容
     */
    function fpage(){
      $arr = func_get_args();

      $html[0] = "<span class='p1'> 共<b> {$this->total} </b>{$this->config["head"]} </span>";
      $html[1] = " 本页 <b>".$this->disnum()."</b> 条 ";
      $html[2] = " 本页从 <b>{$this->start()}-{$this->end()}</b> 条 ";
      $html[3] = " <b>{$this->page}/{$this->pageNum}</b>页 ";
      $html[4] = $this->firstprev();
      $html[5] = $this->pageList();
      $html[6] = $this->nextlast();
      $html[7] = $this->goPage();
      
      $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">';
      if(count($arr) < 1)
        $arr = array(0, 1,2,3,4,5,6,7);
      
      for($i = 0; $i < count($arr); $i++)
        $fpage .= $html[$arr[$i]];
    
      $fpage .= '</div>';
      return $fpage;
    }
    
    /* 在对象内部使用的私有方法,*/
    private function setLimit(){
      if($this->page > 0)
        return ($this->page-1)*$this->listRows.", {$this->listRows}";
      else
        return 0;
    }

    /* 在对象内部使用的私有方法,用于自动获取访问的当前URL */
    private function getUri($query){  
      $request_uri = $_SERVER["REQUEST_URI"];  
      $url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?';
      
      if(is_array($query))
        $url .= http_build_query($query);
      else if($query != "")
        $url .= "&".trim($query, "?&");
    
      $arr = parse_url($url);

      if(isset($arr["query"])){
        parse_str($arr["query"], $arrs);
        unset($arrs["page"]);
        $url = $arr["path"].'?'.http_build_query($arrs);
      }
      
      if(strstr($url, '?')) {
        if(substr($url, -1)!='?')
          $url = $url.'&';
      }else{
        $url = $url.'?';
      }
      
      return $url;
    }

    /* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */
    private function start(){
      if($this->total == 0)
        return 0;
      else
        return ($this->page-1) * $this->listRows+1;
    }

    /* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */
    private function end(){
      return min($this->page * $this->listRows, $this->total);
    }

    /* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */
    private function firstprev(){
      if($this->page > 1) {
        $str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> ";
        $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> ";    
        return $str;
      }

    }
  
    /* 在对象内部使用的私有方法,用于获取页数列表信息 */
    private function pageList(){
      $linkPage = " <b>";
      
      $inum = floor($this->listNum/2);
      /*当前页前面的列表 */
      for($i = $inum; $i >= 1; $i--){
        $page = $this->page-$i;

        if($page >= 1)
          $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
      }
      /*当前页的信息 */
      if($this->pageNum > 1)
        $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> ";
      
      /*当前页后面的列表 */
      for($i=1; $i <= $inum; $i++){
        $page = $this->page+$i;
        if($page <= $this->pageNum)
          $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
        else
          break;
      }
      $linkPage .= '</b>';
      return $linkPage;
    }

    /* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */
    private function nextlast(){
      if($this->page != $this->pageNum) {
        $str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> ";
        $str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> ";
        return $str;
      }
    }

    /* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */
    private function goPage(){
        if($this->pageNum > 1) {
        return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> ';
      }
    }

    /* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */
    private function disnum(){
      if($this->total > 0){
        return $this->end()-$this->start()+1;
      }else{
        return 0;
      }
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
Jul 01 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHPExcel 修改已存在Excel的方法
May 03 PHP
PHP filesize函数用法浅析
Feb 15 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 PHP
PHP设计模式之工厂模式详解
Oct 24 #PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 #PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 #PHP
php实现的后台表格分页功能示例
Oct 23 #PHP
php双层循环(九九乘法表)
Oct 23 #PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 #PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 #PHP
You might like
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
css图片自适应大小
2007/11/28 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
主持人演讲稿范文
2013/12/28 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
争做文明公民倡议书
2019/06/24 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python