好学IT学院:IT信息技术分享交流平台
标签:PHP  来源:互联网  作者:未知  发布时间:2007-01-29  ★★★加入收藏〗〖手机版
摘要:1、前言分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解……

/***
  *
  * 返回结果集的数据库连接
  * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
  * 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
  * getPageData方法也是调用本方法来获取结果的
  *
  ***/
  
   function getDataLink()
   {
     if ( $this->numItems )
     {
         global $db;
         
         $PageID = $this->CurrentPageID;
         
         $from = ($PageID - 1)*$this->PageSize;
         $count = $this->PageSize;
         $link = $db->limitQuery($this->sql, $from, $count);   //使用Pear DB::limitQuery方法保证数据库兼容性
         
         return $link;
     }
     else
     {
         return false;
     }
   }
  
   /***
  *
  * 以二维数组的格式返回结果集
  *
  ***/
  
   function getPageData()
   {
     if ( $this->numItems )
     {
         if ( $res = $this->getDataLink() )
         {     
             if ( $res->numRows() )
             {
                 while ( $row = $res->fetchRow() )
                 {
                     $result[] = $row;
                 }
             }
             else
             {
                 $result = array();
             }
             
             return $result;
         }
         else
         {
             return false;
         }
     }
     else
     {
         return false;
     }
   }
  
   function _setOptions($option)
   {
     $allow_options = array(
                 'PageSize',
                 'CurrentPageID',
                 'sql',
                 'numItems'
     );
     
     foreach ( $option as $key => $value )
     {
         if ( in_array($key, $allow_options) && ($value != null) )
         {
             $this->$key = $value;
         }
     }
     
     return true;
   }
}
?>
<?php
// FileName: test_pager.php
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require "Pager.class.php";
if ( isset($_GET['page']) )
{
   $page = (int)$_GET['page'];
}
else
{
   $page = 1;
}
$sql = "select * from table order by id";
$pager_option = array(
     "sql" => $sql,
     "PageSize" => 10,
     "CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
   $pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
   $turnover = "首页

上一页

";
}
else
{
   $turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首页</a>

<a href='?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一页</a>

";
}
if ( $pager->isLastPage )
{
   $turnover .= "下一页

尾页";
}
else
{
   $turnover .= "<a href='?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一页</a>

<a href='?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾页</a>";
}
?>

需要说明的地方有两个:

这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个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,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

  • 好学考试H5触屏版开放内测
  • 好学触屏公众号虎力全开、杨帆起航!