分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

PHP分页类及用法

发布时间:2023-09-06 01:42责任编辑:赖小花关键词:PHP

分页类用来对大量的数据进行分页处理,主要应用成员变量 limit 以及成员函数 fpage() 来动态输出分页查询语句的条件以及分页栏

分页类

<?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){ ???//构造函数需要4个参数,一般只填前两个就行 ???????????$this->total = $total; ???????????$this->listRows = $listRows; ???????????$this->uri = $this->getUri($query); ???????????$this->pageNum = ceil($this->total / $this->listRows); ???????????/*以下判断用来设置当前面*/ ???????????if(!empty($_GET["page"])) { ???????//有page值就跳转到对应页,没有就跳转到首页或末页 ???????????????$page = $_GET["page"]; ???????????}else{ ???????????????if($ord) ???????????????????$page = 1; ???????????????else ???????????????????$page = $this->pageNum; ???????????} ???????????if($total > 0) { ???//对总条数进行判断,如果大于0且包含非数字返回第一页,如果大于0且为数字跳转到page值对应的页数,如果小于0则page为0,即没有数据 ???????????????if(preg_match(‘/\D/‘, $page) ){ ???????????????????????????$this->page = 1; ???????????????}else{ ???????????????????$this->page = $page; ???????????????} ???????????}else{ ???????????????$this->page = 0; ???????????} ???????????????????????$this->limit = "LIMIT ".$this->setLimit(); ???//拼接分页查询的sql语句 ???????} ???????/** ???????????用于设置显示分页的信息,可以进行连贯操作 ???????????@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(); ???//获取输入的参数,用哪个模块就传哪个参数,不输入参数则显示所有模块 ???????????????????????//0用来显示数据总数 ???????????$html[0] = "<span class=‘p1‘>&nbsp;共<b> {$this->total} </b>{$this->config["head"]}&nbsp;</span>"; ???????????//1用来显示当前页的数据条数 ???????????$html[1] = "&nbsp;本页 <b>".$this->disnum()."</b> 条&nbsp;"; ???????????//2用来显示当前页数据的序号 ???????????$html[2] = "&nbsp;本页从 <b>{$this->start()}-{$this->end()}</b> 条&nbsp;"; ???????????//3用来显示当前页的序号 ???????????$html[3] = "&nbsp;<b>{$this->page}/{$this->pageNum}</b>页&nbsp;"; ???????????//4用来显示“首页”和“上一页” ???????????$html[4] = $this->firstprev(); ???????????//5用来显示分页的的具体序号,当前页的前后5页 ???????????$html[5] = $this->pageList(); ???????????//6用来显示“下一页”和“末页” ???????????$html[6] = $this->nextlast(); ???????????//7用来显示输入跳转页 ???????????$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 = "&nbsp;<a href=‘{$this->uri}page=1‘>{$this->config["first"]}</a>&nbsp;"; ???????????????$str .= "<a href=‘{$this->uri}page=".($this->page-1)."‘>{$this->config["prev"]}</a>&nbsp;"; ???????????????????????return $str; ???????????} ???????} ???????????/* 在对象内部使用的私有方法,用于获取页数列表信息 */ ???????private function pageList(){ ???????????$linkPage = "&nbsp;<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>&nbsp;"; ???????????} ???????????/*当前页的信息 */ ???????????if($this->pageNum > 1) ???????????????$linkPage .= "<span style=‘padding:1px 2px;background:#BBB;color:white‘>{$this->page}</span>&nbsp;"; ???????????????????????/*当前页后面的列表 */ ???????????for($i=1; $i <= $inum; $i++){ ???????????????$page = $this->page+$i; ???????????????if($page <= $this->pageNum) ???????????????????$linkPage .= "<a href=‘{$this->uri}page={$page}‘>{$page}</a>&nbsp;"; ???????????????else ???????????????????break; ???????????} ???????????$linkPage .= ‘</b>‘; ???????????return $linkPage; ???????} ???????/* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */ ???????private function nextlast(){ ???????????if($this->page != $this->pageNum) { ???????????????$str = "&nbsp;<a href=‘{$this->uri}page=".($this->page+1)."‘>{$this->config["next"]}</a>&nbsp;"; ???????????????$str .= "&nbsp;<a href=‘{$this->uri}page=".($this->pageNum)."‘>{$this->config["last"]}</a>&nbsp;"; ???????????????return $str; ???????????} ???????} ???????/* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */ ???????private function goPage(){ ???????????????if($this->pageNum > 1) { ???????????????return ‘&nbsp;<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+\‘\‘">&nbsp;‘; ???????????} ???????} ???????/* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */ ???????private function disnum(){ ???????????if($this->total > 0){ ???????????????return $this->end()-$this->start()+1; ???????????}else{ ???????????????return 0; ???????????} ???????} ???} ???????????
View Code
以中国区域表为实例演示分页类的使用方法
<!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body> ???<h1>中国区域表</h1> ???<form action="fenye-php.php" method="get"> <!--这里的提交方式要用get方式,配合分页类中get的数据获取方式--> ???????<input type="text" name="tj"> ???????<input type="submit" value="查询" > ???</form> ???<br> ???<table border="1" cellpadding="0" cellspacing="0" width="100%"> ???????<tr> ???????????<td>区域代号</td> ???????????<td>区域名称</td> ???????????<td>区域父级代号</td> ???????</tr> ???????????????<?php ????    
       require_once "./page.class.php"; ???//引用分页类 ???????????require_once "./DBDA.class.php"; ???//引用数据连接类 ???????????$db = new DBDA(); ???????//实例化数据连接对象 ???????????$str = " 1=1 "; ???//设定一个恒成立的条件 ???????????if(!empty($_GET["tj"])){ ???//判断是否有查询条件传入,有则修改恒成立的条件为模糊查询的条件 ???????????????$tj = $_GET["tj"]; ???????????????$str = " areaname like ‘%{$tj}%‘"; ???????????} ???????????$sqlzs = "select count(*) from chinastates where {$str}"; ???//查询数据总数的sql语句 ???????????$zs = intval($db->strquery($sqlzs)); ???//得出数据总数 ???????????$page = new Page($zs,20); ???//实例化分页对象 ???????????$sql = "select * from chinastates where {$str} ".$page->limit; ???//将分页对象类得出的分页sql语句拼接到查询数据的sql语句中 ???????????$arr = $db->query($sql); ???//执行语句得到结果并输出 ???????????foreach($arr as $v){ ???????????????echo "<tr> ???????????????????????<td>{$v[0]}</td> ???????????????????????<td>{$v[1]}</td> ???????????????????????<td>{$v[2]}</td> ???????????????????</tr>"; ???????????}
 ???  ?> ???</table> ???<?php    
    echo $page->fpage(); ???//fpage函数用来输出分页栏,括号内给出想要使用的模块的索引,不给参数则显示所以模块
?></body></html>

PHP分页类及用法

原文地址:https://www.cnblogs.com/zxbs12345/p/8437893.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved