使用php语言分页显示数据,PHP分页显示制作详细讲解

每页多少条记录($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、简单代码

请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。

//建立数据库连接

$link=mysql_connect("localhost","mysql_user","mysql_password")

ordie("Couldnotconnect:".mysql_error());

//获取当前页数

if(isset($_GET['page'])){

$page=intval($_GET['page']);

}

else{

$page=1;

}

//每页数量

$PageSize=10;

//获取总数据量

$sql="selectcount(*)asamountfromtable";

$result=mysql_query($sql);

$row=mysql_fetch_row($result);

$amount=$row['amount'];

//记算总共有多少页

if($amount){

if($amount

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.='第一页|上一页|';

}

if(($page==$page_count)||($page_count==0)){

$page_string.='下一页|尾页';

}

else{

$page_string.='下一页|尾页';

}

//获取数据,以二维数组格式返回结果

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类进行处理

//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->numItemsPageSize){$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

{

retu

rnfalse;

}

}

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;

}

}

?>

//FileName:test_pager.php

//这是一段简单的示例代码,前边省略了使用peardb类建立数据库连接的代码

require"Pager.class.php";

if(isset($_GET['page']))

{

$page=(int)$_GET['page'];

}

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="numItems."'>首页|PreviousPageID."&numItems=".$pager->numItems."'>上一页|";

}

if($pager->isLastPage)

{

$turnover.="下一页|尾页";

}

else

{

$turnover.="NextPageID."&numItems=".$pager->numItems."'>下一页|numPages."&numItems=".$pager->numItems."'>尾页";

}

?>

需要说明的地方有两个:

这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:

ClassMemberPagerextendsPager

{

functionshowMemberList()

{

global$db;

$data=$this->getPageData();

//显示结果的代码

//......

}

}

///调用

if(isset($_GET['page']))

{

$page=(int)$_GET['page'];

}

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方法。

ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

您可能感兴趣的文章:php分页函数mysql+php分页类(已测)PHP分页函数代码(简单实用型)一个典型的PHP分页实例代码分享精美漂亮的php分页类代码ThinkPHP分页类使用详解高效mongodb的php分页类(不使用skip)分享php分页的功能模块

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值