`

PHP程序设计之分页技术

阅读更多

1、PHP分页技术作为PHP开发中的一个重要的部分,一项是一个重点和难点,写这篇文章,希望对刚接触php没多久的朋友有些帮助本文适合初学者阅读,所有示例代码均使用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;
   }
  
   /***
    *
    * 返回结果集的数据库连接
    * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
    * 如果结果集不是很大,可以直接使用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方法。

分享到:
评论

相关推荐

    PHP通用分页程序

    **PHP通用分页程序** 在Web开发中,数据量大的时候,为了提高用户体验,通常会使用分页技术来展示信息。PHP是一种广泛使用的服务器端脚本语言,特别适合于Web开发,因此,PHP通用分页程序是开发人员常用的一种工具...

    php分页程序 小结

    php分页程序 小结

    PHP显示分页程序

    在这个PHP程序中,通过一个自定义函数`page()`实现了这一功能。以下是该程序的主要知识点: 1. **参数解析**: - `$page`:表示当前请求的页码,通常通过`$_GET`全局变量获取。 - `$total`:代表总记录数,即...

    PHP自动适应范围的页码分页程序

    本文将详细解析一个PHP自适应范围页码分页程序的设计思路与实现细节,帮助读者理解并掌握其核心原理。 #### 程序背景与目标 在浏览具有大量数据的网页时(如论坛、博客等),传统的分页显示可能会导致页码过多,...

    php封装的page分页类.zip

    在PHP开发中,分页是常见的功能之一,用于处理大量数据的显示,使得用户能够逐页浏览,提高网站性能和用户体验。"php封装的page分页类" 是一个专门用于处理这种需求的类库,它简化了PHP分页的实现过程,通过封装核心...

    漂亮的PHP分页程序,数据库MSSQL

    本项目涉及的“漂亮的PHP分页程序”是针对数据库管理的一种实用技术,特别是与Microsoft SQL Server(MSSQL)数据库配合使用。下面将详细讨论PHP分页以及其与MSSQL数据库的集成。 **PHP分页** PHP分页是一种优化...

    小贤PHP通用分页程序 v1.0

    程序的优点:可用于伪静态、静态和动态分页用,采用DIV+CSS设计,兼容各常用浏览器; 安装步骤如下: 第一步:解压压缩包后,您会发现一个“news.sql”的SQL数据的文件,先在你的mysql数据中建立一下 “myde520...

    php万能分页源码

    5. **CSS样式调整**:通过`style.php`调整分页样式,使其符合网页的整体设计。 6. **错误处理和优化**:确保在处理分页时考虑了边界情况,如第一页和最后一页的处理,以及无效的页码请求。 总之,“php万能分页...

    PHP分页程序推荐下载

    在PHP编程中,分页是网站开发中必不可少的一项技术,特别是在处理大量数据时,它能够有效地提高用户体验,避免一次性加载过多的数据导致页面响应慢。本篇文章将深入探讨PHP分页程序的相关知识点,以及如何实现一个...

    PHP分页程序,简单的分页函数

    这个“PHP分页程序,简单的分页函数”就是为了解决这个问题而设计的。分页不仅可以提高用户体验,避免一次性加载过多数据导致页面响应慢,还能使用户更方便地浏览和查找信息。 首先,我们需要理解分页的基本原理。...

    php 分页控件

    在Web开发领域,为了处理大量的数据并提高用户体验,分页是一种不可或缺的技术。PHP分页控件就是这样的一个工具,它简化了在PHP项目中实现高效、用户友好的分页过程。本文将深入探讨PHP分页控件的核心概念、工作原理...

    很好用的PHP分页源码

    "程序使用说明书.doc"则是对这些代码和数据的详细解释,指导如何使用这个分页源码,可能包括了安装步骤、配置说明、示例代码和常见问题解答。 四、注意事项 - 安全性:在实际使用中,要确保从GET请求中获取的页码...

    PHP+AJAX分页程序

    总的来说,"PHP+AJAX分页程序"是一个结合了前后端技术的实例,它演示了如何利用PHP处理服务器端逻辑,使用AJAX实现无刷新分页,以及如何与数据库交互以获取分页数据。这种技术组合在现代Web开发中非常常见,对于学习...

    小贤PHP通用分页程序 v1.0.rar

    我在一些PHP论坛上经常看到不少PHP初学者对于PHP分页很头痛,所以我就抽一点时间将我所写的网站中的 分页功能给分离出来给广大...程序的优点:可用于伪静态、静态和动态分页用,采用DIV CSS设计,兼容各常用浏览器;

    小贤PHP通用分页程序

    6. **兼容性**:程序设计时考虑了PHP的版本兼容性,能在多种PHP环境中正常运行。 7. **可扩展性**:代码结构清晰,方便开发者进行二次开发或自定义功能,如添加缓存机制、支持更多数据库等。 8. **错误处理**:...

    基于PHP的小贤 PHP 通用分页程序.zip

    【标题】"基于PHP的小贤 PHP 通用分页程序.zip" 涉及的主要知识点是PHP编程中的分页技术,这是一种常见的网页数据处理方法,用于处理大数据量的展示,提高用户体验,避免一次性加载过多内容导致页面响应变慢。...

    PHP开发实用分页程序

    程序的优点:可用于伪静态、静态和动态分页用,采用DIV+CSS设计,兼容各常用浏览器; 安装步骤如下: 第一步:解压压缩包后,您会发现一个“news.sql”的SQL数据的文件,先在你的mysql数据中建立一下“myde520”...

    PHP程序设计-3期(KC016) 4.3.7分页查询记录拓展知识.doc

    在PHP程序设计中,分页查询是处理大数据量的关键技术,特别是在MySQL数据库中。文档"PHP程序设计-3期(KC016) 4.3.7分页查询记录拓展知识.doc"深入探讨了这一主题,特别是针对性能优化方面。 首先,标准的分页查询...

    php新闻内容分页

    在PHP开发中,新闻内容分页是...总之,PHP新闻内容分页是通过合理设计和实现一个分页类来完成的,涉及数据库查询、URL参数处理和HTML链接生成等技术。理解并掌握这一技术,对于提升PHP Web应用的用户体验具有重要意义。

    168跳转分页插件 for PHP168.rar

    标签“程序插件-php168插件”确认了这是专为PHP168系统设计的插件,对于熟悉PHP168的开发者来说,这将有助于他们识别和理解这个插件的用途。 总结起来,"168跳转分页插件 for PHP168"是一个旨在提高用户导航长篇...

Global site tag (gtag.js) - Google Analytics