南方Linux论坛   首页 | 行业 | 下载 | Blog | 桌面应用 | 数据库 | 电子商务 | 文摘 | 网络服务 | 开源 | 系统管理 | 内核代码 | 教程

返回   南方Linux论坛 > Linux 高级应用讨论区 > perl | php | python 脚本程序开发
注册账号 Blog 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记讨论区已读

发表新主题 回复
 
主题工具 显示模式
旧 2007-06-06, 02:52 AM   #1
TOM
级别:10 | 在线时长:143小时 | 升级还需:22小时级别:10 | 在线时长:143小时 | 升级还需:22小时级别:10 | 在线时长:143小时 | 升级还需:22小时级别:10 | 在线时长:143小时 | 升级还需:22小时
论坛义工
 
注册日期: 2006-07-05
帖子: 477
精华: 0
现金: 1632 金币
资产: 1632 金币
声望: 16 TOM 正向着好的方向发展
默认 PHP应用分页显示制作详细讲解

1、前言

  分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。

2、原理

   所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

    每页多少条记录($PageSize)?
    当前是第几页($CurrentPageID)?

   现在只要再给我一个结果集,我就可以显示某段特定的结果出来。

   至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。

   以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

   前10条记录:select * from table limit 0,10
   第11至20条记录:select * from table limit 10,10
   第21至30条记录:select * from table limit 20,10
   ……

   这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

   拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。

3、简单代码

   请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。

<?php
  // 建立数据库连接
  $link = mysql_connect("localhost", "mysql_user", "mysql_password")
    or die("Could not connect: " . mysql_error());
  // 获取当前页数
  if( isset($_GET['page']) ){
   $page = intval( $_GET['page'] );
  }
  else{
   $page = 1;
  }
  // 每页数量
  $PageSize = 10;
  // 获取总数据量
  $sql = "select count(*) as amount from table";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $amount = $row['amount'];
  // 记算总共有多少页
  if( $amount ){
   if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页
   if( $amount % $page_size ){ //取总数据量除以每页数的余数
    $page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
   }else{
    $page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果
   }
  }
  else{
   $page_count = 0;
  }

  // 翻页链接
  $page_string = '';
  if( $page == 1 ){
   $page_string .= '第一页|上一页|';
  }
  else{
   $page_string .= '<a href=?page=1>第一页</a>|<a href=?page='.($page-1).'>上一页</a>|';
  }
  if( ($page == $page_count) || ($page_count == 0) ){
   $page_string .= '下一页|尾页';
  }
  else{
   $page_string .= '<a href=?page='.($page+1).'>下一页</a>|<a href=?page='.$page_count.'>尾页</a>';
  }
  // 获取数据,以二维数组格式返回结果
  if( $amount ){
   $sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
   $result = mysql_query($sql);

   while ( $row = mysql_fetch_row($result) ){
    $rowset[] = $row;
   }
  }else{
   $rowset = array();
  }
  // 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果
?>本新闻共2页,当前在第1页 1 2
TOM 当前离线  
回复时引用此帖
发表新主题 回复


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 
主题工具
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

论坛启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


所有时间均为北京时间。现在的时间是 05:00 AM


vBulletin 3.6.8 Powered by 南方Linux联盟
版权所有 ©2004 - 2009, bbs.linuxunion.net