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

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 5358|回复: 11

[php] 分享一个自己写的“页码自动适应范围”的分页代码 [复制链接]

fonqing 楼主

一路蹒跚

钻石会员 手机认证 

帖子
3788
体力
8325
威望
7
居住地
山东省 潍坊市
发表于 2008-7-28 17:44:02 |显示全部楼层
效果图:

记得以前看到过一个页码方式的分页效果,页码数多了折行继续显示一直到60多页,呵呵!有点影响美观!

于是写了一个,可以自动适应范围的页码分页程序
也就是说,页码格式如下
<< < 1 2 3 4 5 6 7 > >>
<< < 6 7 8 9 10 11 12 > >>
下划线为当前页,这样就可以固定显示一个相近的页码,避免太长影响美观
代码加了注释,主要是新手看看,呵呵 ,写这个函数,没有考虑表现结构分离问题,高手就不要追究了!
  1. <?php
  2. function page($page,$total,$phpfile,$pagesize=10,$pagelen=7){
  3.         $pagecode = '';//定义变量,存放分页生成的HTML
  4.         $page = intval($page);//避免非数字页码
  5.         $total = intval($total);//保证总记录数值类型正确
  6.         if(!$total) return array();//总记录数为零返回空数组
  7.         $pages = ceil($total/$pagesize);//计算总分页
  8.         //处理页码合法性
  9.         if($page<1) $page = 1;
  10.         if($page>$pages) $page = $pages;
  11.         //计算查询偏移量
  12.         $offset = $pagesize*($page-1);

  13.         //页码范围计算
  14.         $init = 1;//起始页码数
  15.         $max = $pages;//结束页码数
  16.         $pagelen = ($pagelen%2)?$pagelen:$pagelen+1;//页码个数
  17.         $pageoffset = ($pagelen-1)/2;//页码个数左右偏移量
  18.        
  19.         //生成html
  20.         $pagecode='<div class="page">';
  21.         $pagecode.="<span>$page/$pages</span>";//第几页,共几页

  22.         //如果是第一页,则不显示第一页和上一页的连接
  23.         if($page!=1){
  24.                 $pagecode.="<a href=\"{$phpfile}?page=1\">&lt;&lt;</a>";//第一页
  25.                 $pagecode.="<a href=\"{$phpfile}?page=".($page-1)."\">&lt;</a>";//上一页
  26.         }

  27.         //分页数大于页码个数时可以偏移
  28.         if($pages>$pagelen){
  29.                 //如果当前页小于等于左偏移
  30.                 if($page<=$pageoffset){
  31.                         $init=1;
  32.                         $max = $pagelen;
  33.                 }else{//如果当前页大于左偏移

  34.                         //如果当前页码右偏移超出最大分页数
  35.                         if($page+$pageoffset>=$pages+1){
  36.                                 $init = $pages-$pagelen+1;
  37.                         }else{
  38.                                 //左右偏移都存在时的计算
  39.                                 $init = $page-$pageoffset;
  40.                                 $max = $page+$pageoffset;
  41.                         }
  42.                 }
  43.         }
  44.         //生成html
  45.         for($i=$init;$i<=$max;$i++){
  46.                 if($i==$page){
  47.                         $pagecode.='<span>'.$i.'</span>';
  48.                 } else {
  49.                         $pagecode.="<a href=\"{$phpfile}?page={$i}\">$i</a>";
  50.                 }
  51.         }
  52.         if($page!=$pages){
  53.                 $pagecode.="<a href=\"{$phpfile}?page=".($page+1)."\">&gt;</a>";//下一页
  54.                 $pagecode.="<a href=\"{$phpfile}?page={$pages}\">&gt;&gt;</a>";//最后一页
  55.         }
  56.         $pagecode.='</div>';
  57.         return array('pagecode'=>$pagecode,'sqllimit'=>' limit '.$offset.','.$pagesize);
  58. }
  59. ?>
复制代码

函数参数:
$page 当前$_GET获得的页码
$total 总记录数
$phpfile 页码连接文件名
$pagesize 不用解释了吧 呵呵
$pagelen 最多显示几个页码 注意(奇数),对称嘛!
函数返回一个数组:
pagecode 索引对应的内容是 生成的HTML 代码
sqllimit 索引对应的是sql limit 后缀

使用方法:
  1. <?php
  2. $phpfile = 'index.php';
  3. $page= isset($_GET['page'])?$_GET['page']:1;
  4. $db = new Mysql();
  5. $counts = $db->counts('select `id` from `test`');
  6. $sql='select `id`,`title` from `test`';

  7. $getpageinfo = page($page,$counts,$phpfile);

  8. $sql.=$getpageinfo['sqllimit'];
  9. $data = $db->getRows($sql);
  10. ?>
  11. <?php
  12. echo $getpageinfo['pagecode'];//显示分页的html代码
  13. ?>
复制代码

补贴css
  1. <style type="text/css">
  2. body{font-family:Tahoma;}
  3. .page{padding:2px;font-weight:bolder;font-size:12px;}
  4. .page a{border:1px solid #ccc;padding:0 5px 0 5px;margin:2px;text-decoration:none;color:#333;}
  5. .page span{padding:0 5px 0 5px;margin:2px;background:#09f;color:#fff;border:1px solid #09c;}
  6. </style>
复制代码

==========
谢谢版主鼓励!

[ 本帖最后由 fonqing 于 2008-7-28 17:55 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
已有 1 人评分威望 收起 理由
wuleying + 1 原创内容

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

PHP定制 QQ:31301678
西部数码顶级域名注册商39元抢注!

小秦

版主 手机认证 

帖子
2886
体力
6713
威望
12
居住地
河南省 平顶山市
发表于 2008-7-29 08:39:18 |显示全部楼层
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

夜深了

中级会员

帖子
284
体力
677
威望
0
居住地
福建省 福州市
发表于 2008-8-2 08:57:51 |显示全部楼层
请问这里该怎么理解
$counts = $db->counts('select `id` from `test`');
$data = $db->getRows($sql);
counts,getRows 是个函数吗

函数呢

使用道具 举报

fonqing 楼主

一路蹒跚

钻石会员 手机认证 

帖子
3788
体力
8325
威望
7
居住地
山东省 潍坊市
发表于 2008-8-2 11:02:47 |显示全部楼层
那是数据库操作类的成员方法 或者说成员函数
你可以理解为 counts 函数 用来得到参数sql对应的查询结果数
getRows 函数用来获取 参数sql 所查询到的所有结果!
PHP定制 QQ:31301678

使用道具 举报

aadu 
帖子
12
体力
40
威望
0
发表于 2008-8-3 00:37:51 |显示全部楼层
以前都是看到asp的 ,这个php好~

使用道具 举报

帖子
993
体力
3951
威望
14
居住地
广东省 汕头市
发表于 2008-8-3 01:47:55 |显示全部楼层
嗯,俺用.net也写了一个,和楼主差不多
建议在后面加上一个文本框,看看这里的板块就知道拉

[ 本帖最后由 yangedie 于 2008-8-3 01:56 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

帖子
190
体力
410
威望
0
居住地
广东省 江门市
发表于 2008-8-3 05:42:27 |显示全部楼层
利用前端开发的css可以瞬间达到效果!

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

使用道具 举报

帖子
1441
体力
1629
威望
0
发表于 2008-8-3 07:49:13 |显示全部楼层
效果不错,不过如能结构能够再分享一下就更好了.给新手用时他们就能很方便的处理.

我的分页类效果: http://jorkin.reallydo.com/kin_db_pager/?page=10

使用道具 举报

fonqing 楼主

一路蹒跚

钻石会员 手机认证 

帖子
3788
体力
8325
威望
7
居住地
山东省 潍坊市
发表于 2008-8-3 09:06:07 |显示全部楼层

完善和补贴新手使用代码

  1. <?php
  2. function page($page,$total,$phpfile,$pagesize=10,$pagelen=7){
  3.     $pagecode = '';//定义变量,存放分页生成的HTML
  4.     $page = intval($page);//避免非数字页码
  5.     $total = intval($total);//保证总记录数值类型正确
  6.     if(!$total) return array();//总记录数为零返回空数组
  7.     $pages = ceil($total/$pagesize);//计算总分页
  8.     //处理页码合法性
  9.     if($page<1) $page = 1;
  10.     if($page>$pages) $page = $pages;
  11.     //计算查询偏移量
  12.     $offset = $pagesize*($page-1);
  13.     //页码范围计算
  14.     $init = 1;//起始页码数
  15.     $max = $pages;//结束页码数
  16.     $pagelen = ($pagelen%2)?$pagelen:$pagelen+1;//页码个数
  17.     $pageoffset = ($pagelen-1)/2;//页码个数左右偏移量
  18.    
  19.     //生成html
  20.     $pagecode='<div class="page">';
  21.     $pagecode.="<span>$page/$pages</span>";//第几页,共几页
  22.     //如果是第一页,则不显示第一页和上一页的连接
  23.     if($page!=1){
  24.         $pagecode.="<a href=\"{$phpfile}?page=1\">&lt;&lt;</a>";//第一页
  25.         $pagecode.="<a href=\"{$phpfile}?page=".($page-1)."\">&lt;</a>";//上一页
  26.     }
  27.     //分页数大于页码个数时可以偏移
  28.     if($pages>$pagelen){
  29.         //如果当前页小于等于左偏移
  30.         if($page<=$pageoffset){
  31.             $init=1;
  32.             $max = $pagelen;
  33.         }else{//如果当前页大于左偏移
  34.             //如果当前页码右偏移超出最大分页数
  35.             if($page+$pageoffset>=$pages+1){
  36.                 $init = $pages-$pagelen+1;
  37.             }else{
  38.                 //左右偏移都存在时的计算
  39.                 $init = $page-$pageoffset;
  40.                 $max = $page+$pageoffset;
  41.             }
  42.         }
  43.     }
  44.     //生成html
  45.     for($i=$init;$i<=$max;$i++){
  46.         if($i==$page){
  47.             $pagecode.='<span>'.$i.'</span>';
  48.         } else {
  49.             $pagecode.="<a href=\"{$phpfile}?page={$i}\">$i</a>";
  50.         }
  51.     }
  52.     if($page!=$pages){
  53.         $pagecode.="<a href=\"{$phpfile}?page=".($page+1)."\">&gt;</a>";//下一页
  54.         $pagecode.="<a href=\"{$phpfile}?page={$pages}\">&gt;&gt;</a>";//最后一页
  55.     }
  56.     $pagecode.="<input type=\"text\" size=\"3\" onkeydown=\"if(event.keyCode==13) {window.location.href='{$phpfile}?page='+this.value; return false;}\" /></div>";
  57.     return array('pagecode'=>$pagecode,'sqllimit'=>' limit '.$offset.','.$pagesize);
  58. }
  59. ?>
复制代码

加了页码跳转文本框
以下是新手使用说明
  1. <?php
  2. $phpfile = 'index.php';//页面文件名
  3. $page= isset($_GET['page'])?$_GET['page']:1;//默认页码
  4. $db = mysql_connect('localhost','test','test');//链接数据库
  5. mysql_select_db('test',$db);//选择数据库
  6. $counts = mysql_num_rows(mysql_query('select `id` from `test`',$db));//获取需要的数据总条数
  7. $sql='select `id`,`title` from `test`';//定义查询语句SQL
  8. $getpageinfo = page($page,$counts,$phpfile);//调用函数,生成分页HTML 和 SQL LIMIT 子句
  9. $sql.=$getpageinfo['sqllimit'];//组合完整的SQL语句
  10. $data = $row = array();//初始化数组
  11. $result = mysql_query($sql,$db);//获取结果集
  12. //将数据装入$data数组
  13. while($row = mysql_fetch_array($result)){
  14.      $data[]=$row;
  15. }
  16. ?>
  17. <?php
  18. echo $getpageinfo['pagecode'];//显示分页的html代码
  19. ?>
复制代码

[ 本帖最后由 fonqing 于 2008-8-3 09:10 编辑 ]
PHP定制 QQ:31301678

使用道具 举报

帖子
63
体力
314
威望
0
居住地
美洲 美国
发表于 2008-10-28 06:27:34 |显示全部楼层
总页数如果才能根据数据变化呢?  总不能每更新一次都用手写一共多少也吧?

使用道具 举报

苦寒竹

管理员

帖子
19772
体力
17930
威望
23
居住地
浙江省 金华市
发表于 2008-10-28 08:45:32 |显示全部楼层

回复 10# nixiaogui 的帖子

总数据除以每页显示数不就是总页数?

$pages = ceil($total/$pagesize);//计算总分页
搞IT的穷秀才。

使用道具 举报

帖子
76
体力
245
威望
0
居住地
广东省 珠海市
发表于 2008-10-28 10:03:28 |显示全部楼层
原帖由 playboy2925 于 2008-8-3 07:49 发表
效果不错,不过如能结构能够再分享一下就更好了.给新手用时他们就能很方便的处理.

我的分页类效果: http://jorkin.reallydo.com/kin_db_pager/?page=10

这么多分页类效果,果然强大啊.

使用道具 举报

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

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

GMT+8, 2012-2-13 08:43 , Processed in 0.114862 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部