加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP编程中分页显示实例代码推荐

发布时间:2022-07-07 15:06:30 所属栏目:PHP教程 来源:互联网
导读:详细讲解PHP编程中分页显示的制作 1、前言 分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰
  详细讲解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_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就可以很简单的用得到的二维数组来显示结果
 
  ?>
 
  4、OO风格代码
 
  以下代码中的数据库连接是使用的pear db类进行处理
 
  <?php
 
  // FileName: Pager.class.php
 
  // 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作
 
  Class Pager
 
  {
 
  需要说明的地方有两个:
 
  这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:
 
  <?php
 
  Class MemberPager extends Pager
 
  {
 
  function showMemberList()
 
  {
 
  global db;
 
  data = this->getPageData();
 
  // 显示结果的代码
 
  // ......
 
  }
 
  }
 
  /// 调用
 
  if ( isset(_GET['page']) )
 
  {
 
  page = (int)_GET['page'];
 
  }
 
  else
 
  {
 
  page = 1;
 
  }
 
  sql = "select * from members order by id";
 
  pager_option = array(
 
  "sql" => sql,
 
  "PageSize" => 10,
 
  "CurrentPageID" => page
 
  );
 
  if ( isset(_GET['numItems']) )
 
  {
 
  pager_option['numItems'] = (int)_GET['numItems'];
 
  }
 
  pager = @new MemberPager(pager_option);
 
  pager->showMemberList();
 
  ?>
 
  第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
 
  mysql: select * from table limit offset, rows
 
  pgsql: select * from table limit m offset n
  ......
 
  所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。
 
  ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读