php mysql 原生分页类与实现案例
2020-07-05 网络
php mysql 原生分页类源码:Page.class.php
<?php /** * 分页类 * 调用方式: * $p=new Page(总页数,每页显示条数,[链接]); * print_r($p->getPages()); //生成一个页码数组(键为页码,值为链接) * echo $p->showPages(1); //生成一个页码样式(可添加自定义样式) */ class Page{ protected $count; //总条数 protected $showPages; //需要显示的页数 protected $countPages; //总页数 public $currPage; //当前页 public $subPages; //每页显示条数 protected $href; //连接 public $offset; //开始读取记录数 protected $page_arr=array(); //保存生成的页码 键页码 值为连接 /** * __construct 构造函数(获取分页所需参数) * @param int $count 总条数 * @param int $subPages 每页显示数量 * @param string $href 连接(不设置则获取当前URL) */ public function __construct($count,$subPages,$href=''){ $this->count=$count; $this->subPages=$subPages; //如果链接没有设置则获取当前连接 if(empty($href)){ $this->href=htmlentities($_SERVER['PHP_SELF']); }else{ $this->href=$href; } //开始设置总分页数,单分页数 $this->showPages= intval($this->count / $this->subPages); if($this->count % $this->subPages >0){ $this->showPages= $this->showPages + 1; } //获取当前分页数,并根据条件设置分页数 $this->currPage=intval(isset($_GET['page']) ? $_GET['page'] : 1); $this->currPage=($this->currPage < 1) ? 1: $this->currPage; if($this->currPage > $this->showPages){ $this->currPage =$this->showPages; } //设置分页时指定开始记录数 $this->offset = $this->subPages * ($this->currPage - 1); $this->construct_Pages(); } /** * getPages 返回页码数组 * @return array 一维数组 键为页码 值为链接 */ public function getPages(){ return $this->page_arr; } /** * showPages 返回生成好的页码 * @param int $style 样式 * @return string 生成好的页码 */ public function showPages($style=1){ $func='pageStyle'.$style; return $this->$func(); } /** * pageStyle1 分页样式(可参照这个添加自定义样式 例如pageStyle2()) * 样式 共45条记录,每页显示10条,当前第1/5页 [1] [2] [3] .. [下页] [尾页] * @return string */ protected function pageStyle1(){ /* 构造普通模式的分页 共108条记录,每页显示10条,当前第2/11页 [首页] [上页] [1] [2] [3] .. [下页] [尾页] */ $pageStr='共'.$this->count.'条,每页'.$this->subPages.'条.'; $pageStr.='当前第'.$this->currPage.'/'.$this->countPages.'页 '; //如果当前页不等于1,则显示首页 $_GET['page'] = 1; $pageStr.=($this->currPage > 1) ? '[<a href="'.$this->href.'?'.http_build_query($_GET).'">首页</a>] ': ''; //如果当前页不是第一页就显示上页 if($this->currPage>1){ $_GET['page'] = $this->currPage-1; $pageStr.='[<a href="'.$this->href.'?'.http_build_query($_GET).'">上页</a>] '; } //中间数字序列页码 foreach ($this->page_arr as $k => $v) { $pageStr.=($k == $this->currPage) ? "[$k] " : "[<a href='$v'>$k</a>] "; } //如果当前页小于总页数就显示下一页 if($this->currPage < $this->countPages){ $_GET['page'] = $this->currPage+1; $pageStr.='[<a href="'.$this->href.'?'.http_build_query($_GET).'">下页</a>] '; } //如果当前页等于尾页,并且总数页不等于1,则显示尾页 $_GET['page'] = $this->countPages; $pageStr.=(( $this->currPage != $this->countPages) && (1 != $this->countPages)) ? '[<a href="'.$this->href.'?'.http_build_query($_GET).'">尾页</a>]':''; return $pageStr; } /** * construct_Pages 生成页码数组 * 键为页码,值为链接 * $this->page_arr=Array( * [1] => index.php?page=1 * [2] => index.php?page=2 * [3] => index.php?page=3 * ......) */ protected function construct_Pages(){ //计算总页数 $this->countPages=ceil($this->count/$this->subPages); //根据当前页计算前后页数 $leftPage_num=floor($this->showPages / 2); $rightPage_num=$this->showPages-$leftPage_num; //左边显示数为当前页减左边该显示的数 例如总显示7页 当前页是5 左边最小为5-3 右边为5+3 $left=$this->currPage-$leftPage_num; $left=max($left,1); //左边最小不能小于1 $right=$left+$this->showPages-1; //左边加显示页数减1就是右边显示数 $right=min($right,$this->countPages); //右边最大不能大于总页数 $left=max($right-$this->showPages+1,1); //确定右边再计算左边,必须二次计算 for ($i=$left; $i <= $right; $i++) { $_GET['page'] = $i; $this->page_arr[$i]=$this->href.'?'.http_build_query($_GET); } } }
分页列表程序页面:index.php
<meta charset="utf-8"> <?php //将连接数据库代码嵌套进来 require_once 'public/conn.php' ; $sql="select count(*) from `student`"; //查询总记录数目 $result=$conn->query($sql); //执行sql查询语句 $pageres=$result->fetch_row(); //查询总记录条数 $counts=$pageres[0]; //将总记录数值赋值给$counts if($counts>0){ //如果结果集中记录数目大于0,表示从数据库中取出有记录,则开始设置分页信息 //引入分页类 require_once 'public/Page.class.php'; //实例化分页类,并传入相应参数,Page(总记录数,每页显示数); $p=new Page($counts,3); //获取分页组字符串 $showpages=$p->showpages(1); $sql="select * from `student` limit $p->offset,$p->subPages"; $rs=$conn->query($sql); $array=$rs->fetch_all(MYSQLI_ASSOC); } else { //如果没有取出记录,则给数组$array赋值一个空值,以防止模板中使用变量$array报错 $array=array(); } //调用模板 require_once 'view/index.html';
模板页中需要用到的部分源码:
<?php if(!empty($array)){ //显示分页码前先判断下当前的数组是否为空 echo $showpages; } ?>