阿里云服务器怎么做网站,R shinny网站开发,wordpress情侣源码,法人查询企业名称转自http://www.knowsky.com/3187.html 1、前言 分页显示是一种非常常见的浏览和显示大量数据 的方法#xff0c;属于web编程中最常处理的事件之一。对于web编程的老手来说#xff0c;编写这种代码实在是和呼吸一样自然#xff0c;但是对于初学者来说#xff0c;常常对这个…转自http://www.knowsky.com/3187.html 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语句其实就是当$PageSize10的时候取表内每一页数据的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?page1第一页/a|a href?page.($page-1).上一页/a|;} if( ($page $page_count) || ($page_count 0) ){ $page_string . 下一页|尾页;}else{ $page_string . a href?page.($page1).下一页/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?page1numItems.$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类继承一个自己的子类来显示不同的分页比如显示用户分页列表可以 ?phpClass 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, rowspgsql: select * from table limit m offset n......所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。 ok写完收功希望花时间看完这些文字的你不觉得是浪费了时间。 转载于:https://www.cnblogs.com/caroar/archive/2012/12/12/2814649.html