请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 3064|回复: 5

[php] mysql 数据库 分页类 [复制链接]

yytcpt 楼主

太极无影

荣誉管理 手机认证 

帖子
1310
体力
9061
威望
15
发表于 2008-3-27 17:09:48 |显示全部楼层

 提示:您可以先修改部分代码再运行



如果您加了新功能,或者是有改进,请与大家一起分享。


测试代码如下, db.php 请到这里下载 http://bbs.blueidea.com/thread-2841335-1-1.html
  1. <?php
  2.         $db_config["hostname"]        = "127.0.0.1";        //服务器地址
  3.         $db_config["username"]        = "root";                //数据库用户名
  4.         $db_config["password"]        = "root";                //数据库密码
  5.         $db_config["database"]        = "wap_blueidea_com";                //数据库名称
  6.         $db_config["charset"]        = "utf8";

  7.         $config["charset"]                = "utf-8";                //网站编码

  8.        
  9.         include('db.php');
  10.         include('pagelist.php');
  11.         $db        = new db();
  12.         $db->connect($db_config);
  13.         header("content-type:text/html;charset=".$config["charset"]);//设置页面编码

  14.         $pl = new pagelist();
  15.         $arr = $pl->get_rows('table_name');
  16.         unset($pl);

  17.         echo '<pre style="text-align:left">';
  18.         print_r($arr);
  19.         echo '</pre>';

  20.         //指定特殊 sql 时候
  21.         $pl = new pagelist();
  22.         $sql = 'SELECT * FROM `wap_article` AS a, `wap_article_info` AS b WHERE a.id=b.articleid';
  23.         $arr = $pl->get_rows_sql($sql);
  24.         unset($pl);
  25.         echo '<pre style="text-align:left">';
  26.         print_r($arr);
  27.         echo '</pre>';
  28. ?>
复制代码


当表中的记录总数在 10000条以上时,使用了 子查询分页,这样效率会更高一些,数据量小的时候,直接查询更快。
这个是老王说的,参考这里: http://hi.baidu.com/thinkinginlamp/blog/item/c5dea0ecdfef5e392697910f.html

[ 本帖最后由 yytcpt 于 2008-3-27 17:13 编辑 ]
已有 1 人评分威望 收起 理由
kuhanzhu + 2 原创内容,谢谢分享。

总评分: 威望 + 2   查看全部评分

西部数码顶级域名注册商39元抢注!
帖子
79
体力
178
威望
2
发表于 2008-3-28 10:48:43 |显示全部楼层
我不太喜欢将数据库操作和HTML输出部分封装到分页类型中
这样不好扩展 每次更改输出样式还需要修改类型 即便作为基类扩展使用 也会出现“脆鸡肋”效应

我写的分页类型如下 也请高手指教
  1. #        功  能: 页数列表类型
  2. #        创建作者: Sanders Yao
  3. #        修改作者: Sanders Yao
  4. #        创建日期: 2007-12-25
  5. #        修改日期: 2007-12-28

  6. //======================================
  7. // 必要常量:PAGELIST_MODE_ALL:                所有页数模式
  8. // 必要常量:PAGELIST_MODE_FIX:                固定页数模式
  9. // 必要常量:PAGELIST_MODE_MID:                中点页数模式
  10. // 必要常量:PAGELIST_MODE_RANDOM:        随机页数模式
  11. //======================================
  12. define("PAGELIST_MODE_ALL", 0);
  13. define("PAGELIST_MODE_FIX", 1);
  14. define("PAGELIST_MODE_MID", 2);
  15. define("PAGELIST_MODE_RANDOM", 3);

  16. //======================================
  17. // 类型:                        pageList
  18. // 功能:                         获取页数列表
  19. // 属性:
  20. // @itsPage:                当前页数
  21. // @itsLength:                页数列表长度
  22. // @itsList:                页数列表
  23. // @itsTotalPage:        总页数
  24. // @itsOffset:                MySQL的LIMIT偏移量参数
  25. // @itsPageBack:        前一页
  26. // @itsPageNext:        后一页
  27. // @itsListBack:        快退
  28. // @itsListNext:        快进
  29. //======================================
  30. class pageList
  31. {
  32.         var $itsPage;
  33.         var $itsLength;
  34.         var $itsList;
  35.         var $itsTotalPage;
  36.         var $itsOffset;
  37.         var $itsPageBack;
  38.         var $itsPageNext;
  39.         var $itsListBack;
  40.         var $itsListNext;

  41.         //======================================
  42.         // 函数: pageList($num = 0, $perpage = 10, $page = NULL, $length = 10)
  43.         // 功能: 构造函数
  44.         // 参数: $num:                总记录数
  45.         // 参数: $perpage:        每页记录数
  46.         // 参数: $page:                页数
  47.         // 参数: $length:        页数列表长度
  48.         // 返回: 该类型的对象实例
  49.         //======================================
  50.         function pageList($num = 0, $perpage = 10, $page = NULL, $length = 10)
  51.         {
  52.                 if($page)
  53.                 {
  54.                         $this->itsPage                = $page;
  55.                 }
  56.                 else
  57.                 {
  58.                         $this->itsPage                = isset($_GET["page"]) && is_numeric($_GET["page"]) && $_GET["page"] > 0
  59.                                 ? $_GET["page"]
  60.                                 : 1;
  61.                 }
  62.                 $this->itsLength        = $length;
  63.                 $this->itsTotalPage        = ceil($num / $perpage);
  64.                 $this->itsOffset        = ($this->itsPage - 1) * $perpage;
  65.                 $this->itsPageBack        = $this->itsPage > 1
  66.                         ? $this->itsPage - 1
  67.                         : 1;
  68.                 $this->itsPageNext        = $this->itsPage < $this->itsTotalPage
  69.                         ? $this->itsPage + 1
  70.                         : $this->itsTotalPage;
  71.         }

  72.         //======================================
  73.         // 函数: getList($mode)
  74.         // 功能: 构造函数
  75.         // 参数: $mode:                列表模式
  76.         // 参数: $ext:                扩展参数
  77.         // 返回: 页数列表
  78.         //======================================
  79.         function getList($mode = PAGELIST_MODE_MID, $ext = NULL)
  80.         {
  81.                 switch($mode)
  82.                 {
  83.                         case PAGELIST_MODE_ALL:
  84.                                 $this->modeAll();
  85.                                 break;
  86.                         case PAGELIST_MODE_FIX:
  87.                                 $this->modeFix();
  88.                                 break;
  89.                         case PAGELIST_MODE_MID:
  90.                                 $this->modeMid();
  91.                                 break;
  92.                         case PAGELIST_MODE_RANDOM:
  93.                                 $this->modeRandom();
  94.                                 break;
  95.                         default:
  96.                                 $this->modeMid();
  97.                 }
  98.                 return count($this->itsList)
  99.                         ? $this->itsList
  100.                         : array(1);
  101.         }

  102.         //======================================
  103.         // 函数: modeAll()
  104.         // 功能: 获取所有页数
  105.         // 参数: 无
  106.         // 返回: 页数列表
  107.         //======================================
  108.         function modeAll()
  109.         {
  110.                 $this->itsList        = array();
  111.                 for($i = 1;$i <= $this->itsTotalPage;$i ++)
  112.                 {
  113.                         $this->itsList[]        = $i;
  114.                 }
  115.                 return $this->itsList;
  116.         }

  117.         //======================================
  118.         // 函数: modeFix()
  119.         // 功能: 固定页数
  120.         // 参数: 无
  121.         // 返回: 页数列表
  122.         //======================================
  123.         function modeFix()
  124.         {
  125.                 $this->itsList        = array();
  126.                 $start                        = floor(($this->itsPage - 1) / $this->itsLength) * $this->itsLength + 1;
  127.                 $end                        = $start + $this->itsLength - 1;
  128.                 $end                        = $end > $this->itsTotalPage
  129.                         ? $this->itsTotalPage
  130.                         : $end;
  131.                 for($i = $start;$i <= $end;$i ++)
  132.                 {
  133.                         $this->itsList[]        = $i;
  134.                 }
  135.                 $this->itsListBack        = $start > 1
  136.                         ? $start - 1
  137.                         : $this->itsPage;
  138.                 $this->itsListNext        = $end < $this->itsTotalPage
  139.                         ? $end + 1
  140.                         : $this->itsPage;
  141.                 return $this->itsList;
  142.         }

  143.         //======================================
  144.         // 函数: modeMid()
  145.         // 功能: 中点页数
  146.         // 参数: 无
  147.         // 返回: 页数列表
  148.         //======================================
  149.         function modeMid()
  150.         {
  151.                 $this->itsList        = array();
  152.                 if($this->itsLength % 2)
  153.                 {
  154.                         $frontHalf        = $backHalf                = floor($this->itsLength / 2);
  155.                 }
  156.                 else
  157.                 {
  158.                         $frontHalf        = $this->itsLength / 2;
  159.                         $backHalf        = $frontHalf - 1;
  160.                 }
  161.                 if($this->itsPage - $frontHalf < 1)
  162.                 {
  163.                         $start                = 1;
  164.                 }
  165.                 elseif($this->itsPage + $backHalf < $this->itsTotalPage)
  166.                 {
  167.                         $start                = $this->itsPage - $frontHalf;
  168.                 }
  169.                 else
  170.                 {
  171.                         $temp                = $this->itsPage - $frontHalf - $backHalf + $this->itsTotalPage - $this->itsPage;
  172.                         $start                = $temp < 1
  173.                                 ? 1
  174.                                 : $temp;
  175.                 }
  176.                 if($this->itsPage + $backHalf > $this->itsTotalPage)
  177.                 {
  178.                         $end                = $this->itsTotalPage;
  179.                 }
  180.                 elseif($this->itsPage - $frontHalf > 1)
  181.                 {
  182.                         $end                = $this->itsPage + $backHalf;
  183.                 }
  184.                 else
  185.                 {
  186.                         $temp                = $this->itsPage + $backHalf + $frontHalf - $this->itsPage + 1;
  187.                         $end                = $temp > $this->itsTotalPage
  188.                                 ? $this->itsTotalPage
  189.                                 : $temp;
  190.                 }
  191.                 for($i = $start;$i <= $end;$i ++)
  192.                 {
  193.                         $this->itsList[]        = $i;
  194.                 }
  195.                 $this->itsListBack        = $this->itsPage - $this->itsLength > 1
  196.                         ? $this->itsPage - $this->itsLength
  197.                         : 1;
  198.                 $this->itsListNext        = $this->itsPage + $this->itsLength < $this->itsTotalPage
  199.                         ? $this->itsPage + $this->itsLength
  200.                         : $this->itsTotalPage;
  201.                 return $this->itsList;
  202.         }

  203.         //======================================
  204.         // 函数: modeRandom()
  205.         // 功能: 随机页数
  206.         // 参数: 无
  207.         // 返回: 页数列表
  208.         //======================================
  209.         function modeRandom()
  210.         {
  211.                 $all                                = $this->modeAll();
  212.                 $this->itsList                = array();
  213.                 list($sec, $usc)        = explode(" ", microtime());
  214.                 srand($usc);
  215.                 shuffle($all);
  216.                 $end                                = $this->itsTotalPage - 1 > $this->itsLength
  217.                         ? $this->itsLength
  218.                         : $this->itsTotalPage - 1;
  219.                 for($i = 0;$i <= $end;$i ++)
  220.                 {
  221.                         $temp        = array_shift($all);
  222.                         if($this->itsPage != $temp)
  223.                         {
  224.                                 $this->itsList[]        = $temp;
  225.                         }
  226.                         else
  227.                         {
  228.                                 $this->itsList[]        = array_shift($all);
  229.                         }
  230.                 }
  231.                 return $this->itsList;
  232.         }
  233. }
复制代码
已有 1 人评分威望 收起 理由
kuhanzhu + 2 原创内容,谢谢分享

总评分: 威望 + 2   查看全部评分

新手
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

laohoo 

老胡

金牌会员

帖子
2993
体力
3172
威望
5
发表于 2008-3-28 13:12:05 |显示全部楼层
没错。子查询是可以提高查询效率,特别是在总计数数很大的时候。。一般超过5000就可以使用子查询了。
Gonna miss freedom

使用道具 举报

yytcpt 楼主

太极无影

荣誉管理 手机认证 

帖子
1310
体力
9061
威望
15
发表于 2008-3-28 18:15:24 |显示全部楼层
1楼类中的 get_rows_by_sql() 函数写错了,请更新为这个。
  1. <?php
  2.                 function get_rows_by_sql($sql=''){
  3.                         if ($sql) {
  4.                                 $this->sql = $sql." LIMIT ".$this->page_size*($this->page-1).", ".$this->page_size;        //指定的SQL;
  5.                         }else{
  6.                                 $this->get_sql();
  7.                         }
  8.                         return $this->db->row_query($this->sql);
  9.                 }
  10. ?>
复制代码


版主看到了,请帮忙更新一下1楼的帖子,谢谢。

使用道具 举报

帖子
2
体力
14
威望
0
居住地
山东省 潍坊市
发表于 2008-5-20 15:07:17 |显示全部楼层
请问楼主,我使用了特定sql语句进行分页的时候,只可以显示第一页,不能向后翻页。

我刚接触类,不太懂,不知道是不是是不是我这边写错了。但我用get_rows就可以向后翻页。

  1. <?
  2. //省略了db建立
  3. $pl=new pagelist();
  4. $pl->page_size=$g_out['pagesize'];

  5. $sql='select count(*) from `notes` where `userid`=$userid order by id desc';
  6. echo $pl->get_rows_sql($sql);

  7. ?>
复制代码

使用道具 举报

帖子
2
体力
14
威望
0
居住地
山东省 潍坊市
发表于 2008-5-27 18:22:49 |显示全部楼层
终于找到问题

可能是因为我的MYsql版本原因,所以在
  1. //总记录数
  2.                 function set_total_records(){
  3.                         if ($this->total_records==0 or !isset($this->total_records)){
  4.                                 if (empty($this->count_sql) and !empty($this->table["tablename"])){
  5.                                         $sql = "SELECT count(".$this->table["id"].") as count_id FROM `".$this->table["tablename"]."` ".($this->table["where"]!=""?" WHERE ".$this->table["where"]:"");
  6.                                 }else{
  7.                                         $sql = preg_replace("/SELECT(.*?)FROM(.*?)/i", "SELECT count(a.id) AS count_id FROM\\2", $this->sql);
  8.                                 }
  9.                                 $arr = $this->db->row_query_one($sql);
  10.                                 $this->total_records = $arr["count_id"];               
  11.                                
  12.                         }
  13.                 }
复制代码


翻页后因为sql查询最后的limit 5,5而导致取不出总记录数

但取记录数用不的limit所以,可以把他用preg_replace去掉,得到:

  1. //总记录数
  2.                 function set_total_records(){
  3.                         if ($this->total_records==0 or !isset($this->total_records)){
  4.                                 if (empty($this->count_sql) and !empty($this->table["tablename"])){
  5.                                         $sql = "SELECT count(".$this->table["id"].") as count_id FROM `".$this->table["tablename"]."` ".($this->table["where"]!=""?" WHERE ".$this->table["where"]:"");
  6.                                 }else{
  7.                                         $sql = preg_replace("/SELECT(.*?)FROM(.*?)/i", "SELECT count(a.id) AS count_id FROM\\2", $this->sql);
  8.                                         $sql = preg_replace("/LIMIT(.*)/i","",$sql); //去掉limit
  9.                                 }
  10.                                 $arr = $this->db->row_query_one($sql);
  11.                                 $this->total_records = $arr["count_id"];               
  12.                                
  13.                         }
  14.                 }
复制代码


从而问题解决

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 11:24 , Processed in 0.193510 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部