多数大学生出来选择的工作和专业无关
首页 > 专业知识

php软件中超级分页类的原理代码

时间:2018-12-28 20:16:44 [来源]:郑州PHP培训学校

   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就可以很简单的用得到的二维数组来显示结果?>
  4、OO风格代码
  以下代码中的数据库连接是使用的pear db类进行处理<?php
  // FileName: Pager.class.php
  // 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作Class Pager
  {
  var $PageSize;             //每页的数量
  var $CurrentPageID;        //当前的页数
  var $NextPageID;           //下一页
  var $PreviousPageID;       //上一页
  var $numPages;             //总页数
  var $numItems;             //总记录数
  var $isFirstPage;          //是否第一页
  var $isLastPage;           //是否最后一页var $sql;                  //sql查询语句
  function Pager($option)
  {
  global $db;
  $this->_setOptions($option);
  // 总条数
  if ( !isset($this->numItems) )
  {
  $res = $db->query($this->sql);
  $this->numItems = $res->numRows();
  }
  // 总页数
  if ( $this->numItems > 0 )
  {
  if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
  if ( $this->numItems % $this->PageSize )
  {
  $this->numPages= (int)($this->numItems / $this->PageSize) + 1;}
  else
  {
  $this->numPages = $this->numItems / $this->PageSize;}
  }
  else
  {
  $this->numPages = 0;
  }
  switch ( $this->CurrentPageID )
  {
  case $this->numPages == 1:
  $this->isFirstPage = true;
  $this->isLastPage = true;
  break;
  case 1:
  $this->isFirstPage = true;
  $this->isLastPage = false;
  break;
  case $this->numPages:
  $this->isFirstPage = false;
  $this->isLastPage = true;
  break;
  default:
  $this->isFirstPage = false;
  $this->isLastPage = false;
  }
  if ( $this->numPages > 1 )
  {
  if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
  if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
  }
  return true;
  }
  /***
  *
  PHP软件中的模版技术介绍
  如果你正在设计一个交互式网站,你一定会关注两个主要的问题,就是美工和程序。这也是一个网站在建设中抛开其内容之后最关键的要素。通常有两种方式来协调美工和程序之间的关系:
  1.先做好美工页面,然后由程序员直接在美工页面的HTML文件中嵌入ASP、JSP、PHP等程序代码。
  2.美工和程序同时进行,但这时因为没有页面框架,程序只能做出一些关键代码,双方完成后再进行一次美工页面和程序代码的嵌入合成。 在实际的网站建设过程中,由于人员、进度等环境的限制,大家通常会混合地使用上面两种协调方式。然而这两种方法都有不足之处:
  1. 效率不高。两者协调不好可能产生等待、重复代码调试步骤等现象;
  2. 调试不畅。由于程序代码最终需要嵌入在HTML页面中,代码的嵌入、调试、纠错都比较繁琐;
  3. 维护不便。一旦美工设计需要修改,如网站改版,那么所有程序和HTML代码混合页面都需要重写;
  如果你正在使用PHP程序建设网站,那么恭喜你,PHP的模板技术会比较圆满地解决上述问题。 那么什么是PHP的模板技术?PHP模板即PHPlib的Template技术,是PHPLIB程序库中的一个主要模块之一,发展自Perl的Template。而PHPLIB则是在PHP上的一个扩展,提供了很多类库,能够方便地实现一些基本功能如用户认证,数据库封装等。我们可以在phplib.netuse.de上下载到其最新版本。要使用PHP模板,只需在PHPLIB的程序包中解开template.inc文件,并放到我们的PHP程序能够调用的目录里。 剥开神秘的面纱,模板技术的核心概念简单得令人心跳:要将你的美工页面指定为模板文件,只需将页面中活动的内容如数据库输出,用户交互等部分定义成形式为{variable}的变量放在模板文件中相应的位置,当用户浏览时,由PHP程序文件打开该模板文件,将模板文件中定义的变量进行替换,当然,替换成对应的数据库输出或者用户交互等动态生成内容,举例如下:
  定义模板文件:Mytemplate.html
  Mytemplte.html的内容为:
  Mytemplte.html的内容为:
  .....
  ...
  ...
  我们可以看到,事实上模板文件就是一个普通的HTML文件,它包含了你所想要的版面、美工等要素,而内部的活动内容则以变量的形式存在,并等待被替换。显然,模板文件直接被浏览是毫无意义的,因为它不包含任何PHP程序,所有的内容都是“死”的,现在我们来看看,怎样来调用模板,让它“活动”起来。
  假设我们在test.php文件中使用了上述模板,当用户浏览test.php文件时,test.php文件处理过程如下:
  test.php
  set_file("MyFileHandle","MyTemplate.html");
  //设置MyFileHandle文件句柄指向我们所要调用的模板文件Mytemplate.html
  $mytemp->set_var("today", mydate);
  //调用模板的set_var方法,设置模板中的变量today值为$mydate
  $mytemp->parse("MyOutput","MyFileHandle");
  //调用模板的parse方法,对MyFileHandle文件句柄所指向的模板文件进行分析,替换其中相应变量
  //并把替换结果即完整的HTML文件内容保存在字串变量MyOutput中
  $mytemp->p("MyOutput");
  // 打印输出结果字串变量MyOutput的值
  ?>
  就是这么简单,模板技术很轻松地把网站设计分离成了清晰的美工和程序两个方面,并把他们的成果简单方便地结合了起来。如美工设计需要修改,那么我们只要记住原模板中各个变量名,把他们插入到新模板中对应位置就可以了。真的很轻松!另一方面,在PHP程序中基本没有了PHP脚本和HTML语法混合的现象,很大地提高了PHP系统的执行效率,而且如果是数据库等一些费时的操作,现在可以很及时地关闭数据库,释放资源,这样也在一定程度上提高了PHP和相关系统的资源使用效率。

上一篇:PHP开发工程师就业市场依旧很大

下一篇:yii去掉必填项中星号的方法_PHP