php分页实例教程代码详解.docx
- 文档编号:7161434
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:8
- 大小:17.93KB
php分页实例教程代码详解.docx
《php分页实例教程代码详解.docx》由会员分享,可在线阅读,更多相关《php分页实例教程代码详解.docx(8页珍藏版)》请在冰豆网上搜索。
php分页实例教程代码详解
1、前言
分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。
对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。
本文适合初学者阅读,所有示例代码均使用php编写。
2、原理
所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:
每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?
现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:
上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:
select*fromtablelimitoffset,rows。
看看下面一组sql语句,尝试一下发现其中的规率。
前10条记录:
select*fromtablelimit0,10
第11至20条记录:
select*fromtablelimit10,10
第21至30条记录:
select*fromtablelimit20,10
……
这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:
select*fromtablelimit($CurrentPageID-1)*$PageSize,$PageSize
拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。
搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。
以下我将用具体代码加以说明。
3、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。
php
//建立数据库连接
$link=mysql_connect("localhost","mysql_user","mysql_password")
ordie("Couldnotconnect:
".mysql_error());
//获取当前页数
if(isset($_GET)){
$page=intval($_GET);
}
else{
$page=1;
}
//每页数量
$PageSize=10;
//获取总数据量
$sql="selectcount(*)asamountfromtable";
$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.= page=1>第一页| page=.($page-1).>上一页|; } if(($page==$page_count)||($page_count==0)){ $page_string.=下一页|尾页; } else{ $page_string.= page=.($page+1).>下一页| page=.$page_count.>尾页; } //获取数据,以二维数组格式返回结果 if($amount){ $sql="select*fromtableorderbyiddesclimit".($page-1)*$page_size.",$page_size"; $result=mysql_query($sql); while($row=mysql_fetch_row($result)){ $rowset[]=$row; } }else{ $rowset=array(); } //没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果 ? > 4、OO风格代码 以下代码中的数据库连接是使用的peardb类进行处理 php //FileName: Pager.class.php //分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作 ClassPager { var$PageSize; //每页的数量 var$CurrentPageID; //当前的页数 var$NextPageID; //下一页 var$PreviousPageID; //上一页 var$numPages; //总页数 var$numItems; //总记录数 var$isFirstPage; //是否第一页 var$isLastPage; //是否最后一页 var$sql; //sql查询语句 functionPager($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; case1: $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;} } returntrue; } /*** * *返回结果集的数据库连接 *在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小 *如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果 *getPageData方法也是调用本方法来获取结果的 * ***/ functiongetDataLink() { if($this->numItems) { global$db; $PageID=$this->CurrentPageID; $from=($PageID-1)*$this->PageSize; $count=$this->PageSize; $link=$db->limitQuery($this->sql,$from,$count); //使用PearDB: : limitQuery方法保证数据库兼容性 return$link; } else { returnfalse; } } /*** * *以二维数组的格式返回结果集 * ***/ functiongetPageData() { if($this->numItems) { if($res=$this->getDataLink()) { if($res->numRows()) { while($row=$res->fetchRow()) { $result[]=$row; } } else { $result=array(); } return$result; } else { returnfalse; } } else { returnfalse; } } function_setOptions($option) { $allow_options=array( PageSize, CurrentPageID, sql, numItems ); foreach($optionas$key=>$value) { if(in_array($key,$allow_options)&&($value! =null)) { $this->$key=$value; } } returntrue; } } ? > php //FileName: test_pager.php //这是一段简单的示例代码,前边省略了使用peardb类建立数据库连接的代码 require"Pager.class.php"; if(isset($_GET)) { $page=(int)$_GET; } else { $page=1; } $sql="select*fromtableorderbyid"; $pager_option=array( "sql"=>$sql, "PageSize"=>10, "CurrentPageID"=>$page ); if(isset($_GET[numItems])) { $pager_option[numItems]=(int)$_GET[numItems]; } $pager=@newPager($pager_option); $data=$pager->getPageData(); if($pager->isFirstPage) { $turnover="首页|上一页|"; } else { $turnover=" page=1&numItems=".$pager->numItems.">首页| page=".$pager->PreviousPageID."&numItems=".$pager->numItems.">上一页|"; } if($pager->isLastPage) { $turnover.="下一页|尾页"; } else { $turnover.=" page=".$pager->NextPageID."&numItems=".$pager->numItems.">下一页| page=".$pager->numPages."&numItems=".$pager->numItems.">尾页"; } ? > 需要说明的地方有两个: 这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。 显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以: php ClassMemberPagerextendsPager { functionshowMemberList() { global$db; $data=$this->getPageData(); //显示结果的代码 //...... } } ///调用 if(isset($_GET)) { $page=(int)$_GET; } else { $page=1; } $sql="select*frommembersorderbyid"; $pager_option=array( "sql"=>$sql, "PageSize"=>10, "CurrentPageID"=>$page ); if(isset($_GET[numItems])) { $pager_option[numItems]=(int)$_GET[numItems]; } $pager=@newMemberPager($pager_option); $pager->showMemberList(); ? > 第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。 mysql: select*fromtablelimitoffset,rows pgsql: select*fromtablelimitmoffsetn ...... 所以要在类里边获取结果的时候需要使用peardb类的limitQuery方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- php 分页 实例教程 代码 详解