显示效果:

fpage.class.php

  1. <?php
  2. /**
  3. file: page.class.php
  4. 完美分页类 Page
  5. */
  6. class Page {
  7. private $total; //数据表中总记录数
  8. private $listRows; //每页显示行数
  9. private $limit; //SQL语句使用limit从句,限制获取记录个数
  10. private $uri; //自动获取url的请求地址
  11. private $pageNum; //总页数
  12. private $page; //当前页
  13. private $config = array(
  14. 'head' => "条记录",
  15. 'prev' => "上一页",
  16. 'next' => "下一页",
  17. 'first'=> "首页",
  18. 'last' => "末页"
  19. );
  20. //在分页信息中显示内容,可以自己通过set()方法设置
  21. private $listNum = 10; //默认分页列表显示的个数
  22.  
  23. /**
  24. 构造方法,可以设置分页类的属性
  25. @param int $total 计算分页的总记录数
  26. @param int $listRows 可选的,设置每页需要显示的记录数,默认为25条
  27. @param mixed $query 可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式
  28. @param bool $ord 可选的,默认值为true, 页面从第一页开始显示,false则为最后一页
  29. */
  30. public function __construct($total, $listRows=25, $query="", $ord=true){
  31. $this->total = $total;
  32. $this->listRows = $listRows;
  33. $this->uri = $this->getUri($query);
  34. $this->pageNum = ceil($this->total / $this->listRows);
  35. /*以下判断用来设置当前面*/
  36. if(!empty($_GET["page"])) {
  37. $page = $_GET["page"];
  38. }else{
  39. if($ord)
  40. $page = 1;
  41. else
  42. $page = $this->pageNum;
  43. }
  44.  
  45. if($total > 0) {
  46. if(preg_match('/\D/', $page) ){
  47. $this->page = 1;
  48. }else{
  49. $this->page = $page;
  50. }
  51. }else{
  52. $this->page = 0;
  53. }
  54.  
  55. $this->limit = "LIMIT ".$this->setLimit();
  56. }
  57.  
  58. /**
  59. 用于设置显示分页的信息,可以进行连贯操作
  60. @param string $param 是成员属性数组config的下标
  61. @param string $value 用于设置config下标对应的元素值
  62. @return object 返回本对象自己$this, 用于连惯操作
  63. */
  64. function set($param, $value){
  65. if(array_key_exists($param, $this->config)){
  66. $this->config[$param] = $value;
  67. }
  68. return $this;
  69. }
  70.  
  71. /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */
  72. function __get($args){
  73. if($args == "limit" || $args == "page")
  74. return $this->$args;
  75. else
  76. return null;
  77. }
  78.  
  79. /**
  80. 按指定的格式输出分页
  81. @param int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构
  82. @return string 分页信息内容
  83. */
  84. function fpage(){
  85. $arr = func_get_args();
  86.  
  87. $html[0] = "<span class='p1'>&nbsp;共<b> {$this->total} </b>{$this->config["head"]}&nbsp;</span>";
  88. $html[1] = "&nbsp;本页 <b>".$this->disnum()."</b> 条&nbsp;";
  89. $html[2] = "&nbsp;本页从 <b>{$this->start()}-{$this->end()}</b> 条&nbsp;";
  90. $html[3] = "&nbsp;<b>{$this->page}/{$this->pageNum}</b>页&nbsp;";
  91. $html[4] = $this->firstprev();
  92. $html[5] = $this->pageList();
  93. $html[6] = $this->nextlast();
  94. $html[7] = $this->goPage();
  95.  
  96. $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">';
  97. if(count($arr) < 1)
  98. $arr = array(0,1,2,3,4,5,6,7);
  99.  
  100. for($i = 0; $i < count($arr); $i++)
  101. $fpage .= $html[$arr[$i]];
  102.  
  103. $fpage .= '</div>';
  104. return $fpage;
  105. }
  106.  
  107. /* 在对象内部使用的私有方法,*/
  108. private function setLimit(){
  109. if($this->page > 0)
  110. return ($this->page-1)*$this->listRows.", {$this->listRows}";
  111. else
  112. return 0;
  113. }
  114.  
  115. /* 在对象内部使用的私有方法,用于自动获取访问的当前URL */
  116. private function getUri($query){
  117. $request_uri = $_SERVER["REQUEST_URI"];
  118. $url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?';
  119.  
  120. if(is_array($query))
  121. $url .= http_build_query($query);
  122. else if($query != "")
  123. $url .= "&".trim($query, "?&");
  124.  
  125. $arr = parse_url($url);
  126.  
  127. if(isset($arr["query"])){
  128. parse_str($arr["query"], $arrs);
  129. unset($arrs["page"]);
  130. $url = $arr["path"].'?'.http_build_query($arrs);
  131. }
  132.  
  133. if(strstr($url, '?')) {
  134. if(substr($url, -1)!='?')
  135. $url = $url.'&';
  136. }else{
  137. $url = $url.'?';
  138. }
  139.  
  140. return $url;
  141. }
  142.  
  143. /* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */
  144. private function start(){
  145. if($this->total == 0)
  146. return 0;
  147. else
  148. return ($this->page-1) * $this->listRows+1;
  149. }
  150.  
  151. /* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */
  152. private function end(){
  153. return min($this->page * $this->listRows, $this->total);
  154. }
  155.  
  156. /* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */
  157. private function firstprev(){
  158. if($this->page > 1) {
  159. $str = "&nbsp;<a href='{$this->uri}page=1'>{$this->config["first"]}</a>&nbsp;";
  160. $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a>&nbsp;";
  161. return $str;
  162. }
  163.  
  164. }
  165.  
  166. /* 在对象内部使用的私有方法,用于获取页数列表信息 */
  167. private function pageList(){
  168. $linkPage = "&nbsp;<b>";
  169.  
  170. $inum = floor($this->listNum/2);
  171. /*当前页前面的列表 */
  172. for($i = $inum; $i >= 1; $i--){
  173. $page = $this->page-$i;
  174.  
  175. if($page >= 1)
  176. $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a>&nbsp;";
  177. }
  178. /*当前页的信息 */
  179. if($this->pageNum > 1)
  180. $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span>&nbsp;";
  181.  
  182. /*当前页后面的列表 */
  183. for($i=1; $i <= $inum; $i++){
  184. $page = $this->page+$i;
  185. if($page <= $this->pageNum)
  186. $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a>&nbsp;";
  187. else
  188. break;
  189. }
  190. $linkPage .= '</b>';
  191. return $linkPage;
  192. }
  193.  
  194. /* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */
  195. private function nextlast(){
  196. if($this->page != $this->pageNum) {
  197. $str = "&nbsp;<a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a>&nbsp;";
  198. $str .= "&nbsp;<a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a>&nbsp;";
  199. return $str;
  200. }
  201. }
  202.  
  203. /* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */
  204. private function goPage(){
  205. if($this->pageNum > 1) {
  206. 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;';
  207. }
  208. }
  209.  
  210. /* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */
  211. private function disnum(){
  212. if($this->total > 0){
  213. return $this->end()-$this->start()+1;
  214. }else{
  215. return 0;
  216. }
  217. }
  218. }

DBDA.php

  1. <?php
  2. class DBDA
  3. {
  4. public $host="localhost";//服务器地址
  5. public $uid="root";//数据库的用户名
  6. public $pwd="123";// 数据库的密码
  7. //public $dbname="test2";
  8. //默认要操作的数据库
  9. //函数 1 代表查询
  10. //执行sql语句,返回相应结果的函数
  11. //$sql是要执行的SQL语句
  12. //$type是SQL语句的类型,0代表增删改,1代表查询
  13. //$db代表要操作的数据库
  14. public function Query($sql,$type=1,$db="test2")
  15. {
  16. //造连接对象
  17. $conn=new mysqli($this->host,$this->uid,$this->pwd,$db);
  18.  
  19. //判断连接是否成功
  20. !mysqli_connect_error()or die("连接失败!");
  21. //执行SQL语句
  22. $result=$conn->query($sql);
  23.  
  24. //判断SQL语句类型
  25. if ($type=1)
  26. { //如果是查询语句返回结果集
  27. return $result->fetch_all();
  28. }
  29. else
  30. { //如果是其他语句,返回true或false
  31. return $result;
  32. }
  33. }
  34.  
  35. }
  36. ?>

test.php

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <table width=80% border="1" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td>地区代号</td>
  11. <td>地区名称</td>
  12. <td>地区父级代号</td>
  13. </tr>
  14. <?php
  15. //加载类
  16. include("DBDA.php");
  17. //造连接对象
  18. $db=new DBDA();
  19. $sqlcount="select count(*)from ChinaStates";
  20. $attrs=$db->query($sqlcount);
  21. $total=$attrs[0][0];
  22.  
  23. //加载类
  24. include("fpage.class.php");
  25. //造分页对象
  26. $page=new Page($total,20,"",true);
  27. //set函数
  28. $page->set('head','条数据');
  29. $page->set("prev","<img src='0063.png' width='15' height='15'>");
  30. $page->set('first','第一页');
  31. //显示
  32. $sql="select * from ChinaStates ".$page->limit;
  33.  
  34. $attr=$db->query($sql);
  35. for ($i=0; $i <count($attr) ; $i++)
  36. {
  37. echo "<tr><td>{$attr[$i][0]}</td><td>{$attr[$i][1]}</td><td>{$attr[$i][2]}</td></tr>";
  38. }
  39. echo "<tr><td>{$page->fpage()}</td></tr>";
  40. ?>
  41. </table>
  42. <?php
  43.  
  44. ?>
  45. </body>
  46. </html>

显示:

2016/3/27 分页 共X条数据 本页x条 本页从x-y条 x/y页 首页 上一页 123456 下一页 末页 pagego echo $page->fpage(7,6,5,4,3,2,1,0);的更多相关文章

  1. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?如何获取当前数据库版本?

    一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几? 一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysq ...

  2. 动态sql语句,非存储过程,如何判断某条数据是否存在,如果不存在就添加一条

    已知一个表 table 里面有两个字段  A1 和 A2 如何用动态语句 判断 A1 = A , A2=B 的数据是否存在,如果不存在,就添加一条数据, A1 = A , A2 = B INSERT  ...

  3. Mysql分片后分页排序拉取数据的方法

    高并发大流量的互联网架构,一般通过服务层来访问数据库,随着数据量的增大,数据库需要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增加实例数的扩容目的. 一旦涉及 ...

  4. 插入1000万条数据到mysql数据库表

    转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...

  5. 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  6. sql 更新列表中最老的一条数据

    今天组长给个任务说要给摄像头触发一个列表.让缓存5条数据,每次摄像头触发更新一条,丢掉最老的一条数据.原来的update是直接更新掉一条,没带缓存的.然后搞了个sql语句,是这样的: UPDATE C ...

  7. 实现java 中 list集合中有几十万条数据,每100条为一组取出

    解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...

  8. 【sql进阶】查询每天、每个设备的第一条数据

    需求如下 每个设备(不同DeviceID).每天会向数据库插入多条数据,求每天.每个设备插入的第一条数据. 下面SQL中的 ShareRecommendID 类比不同设备的DeviceID. ROW_ ...

  9. mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句

    正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 .如下: 表字段和数据: SQL语句: [sql] view plain cop ...

随机推荐

  1. vue 框架原理

    参考:https://segmentfault.com/a/1190000006599500#articleHeader4 记录自己的理解: 核心的响应原理通过Object.definePropert ...

  2. react深入 - 手写实现react-redux api

    简介:简单实现react-redux基础api react-redux api回顾 <Provider store>把store放在context里,所有子组件可以直接拿到store数据 ...

  3. LoadRunner中的参数与变量-产生20位的随机数

    LoadRunner中的参数与变量-产生20位的随机数 在LoadRunner脚本开发中,经常会遇到参数与变量相互转换的情况,本文对常见的转换情形进行了方法总结. 1.变量的赋值 //将字符串赋值给变 ...

  4. left join 与left outer join的区别

    joinn 语句有三种:inner join, left outer join 和 right outer join都可以简写,分别为join,left join,right join.

  5. [luoguP1027] Car的旅行路线(Floyd)

    传送门 建图麻烦,建完图搞一遍Floyd就好了. ——代码 #include <iostream> #include <cstdio> #include <cmath&g ...

  6. 修改textfield的占位符颜色

    [self.titleField setValue:UIColorFromHEXWithAlpha(0x999999, 1) forKeyPath:@"_placeholderLabel.t ...

  7. oc温习五:字符串

    /** substringFromIndex: --从第from位数 开始截取字符串 */ NSString *str = @"asdfghjkzxcbnm"; NSString ...

  8. POJ 1661 Help Jimmy【DP】

    基础DP,过程想明白了其实也不复杂,从上面的推下面的比倒着推要简单很多.调试了半个多小时..简单dp依然不能快速AC..SAD.. 题目链接: http://poj.org/problem?id=16 ...

  9. POJ 2965 The Pilots Brothers' refrigerator【BFS+状压 Or 脑洞】

    题目链接: http://poj.org/problem?id=1753 题意: 给定冰箱门的开关情况,改变一个门则其所在行列的门都会发生改变,求出改变门的最少操作使得最终所有门都是打开状态. 代码: ...

  10. T1503 愚蠢的宠物 codevs

    http://codevs.cn/problem/1503/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 大家都知道,sh ...