php实现分页功能的3种方法第1/3页
直接上代码,希望大家仔细阅读。
方法一:讲sql查询进行分页进行,需要调用几个函数,具体见脚本:
1.pager.class.php
<?php classpager{ public$sql;//SQL查询语句 public$datanum;//查询所有的数据总记录数 public$page_size;//每页显示记录的条数 protected$_errstr; protected$_conn; protected$_query_id; publicfunctionquery($query)///这个函数有问题,暂时可以不用 { $ret=false; if(!empty($query)){ if($this->_conn===false||!is_resource($this->_conn)){ warningLog(__METHOD__.':querysqlwithnoconnection',true); returnfalse; } $this->_query_id=@mysql_query($query,$this->_conn); if($this->_query_id===false){ $this->_errstr=@mysql_error(); $ret=false; }else{ $this->_errstr='SUCCESS'; $ret=$this->_query_id; } } $msg=($ret===false)?'false':strval($ret); debugLog(__METHOD__.":[$msg]returnedforsqlquery[$query]"); return$ret; } function__construct($sql,$page_size){ $result=mysql_query($sql); $datanum=mysql_num_rows($result); $this->sql=$sql; $this->datanum=$datanum; $this->page_size=$page_size; } //当前页数 publicfunctionpage_id(){ if($_SERVER['QUERY_STRING']==""){ return1; }elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=")==0){ return1; }else{ returnintval(substr($_SERVER['QUERY_STRING'],8)); } } //剩余url值 publicfunctionurl(){ if($_SERVER['QUERY_STRING']==""){ return""; }elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=")==0){ return"&".$_SERVER['QUERY_STRING']; }else{ returnstr_replace("page_id=".$this->page_id(),"",$_SERVER['QUERY_STRING']); } } //总页数 publicfunctionpage_num(){ if($this->datanum==0){ return1; }else{ returnceil($this->datanum/$this->page_size); } } //数据库查询的偏移量 publicfunctionstart(){ return($this->page_id()-1)*$this->page_size; } //数据输出 publicfunctionsqlquery(){ return$this->sql."limit".$this->start().",".$this->page_size; } //获取当前文件名 privatefunctionphp_self(){ return$_SERVER['PHP_SELF']; } //上一页 privatefunctionpre_page(){ if($this->page_id()==1){//页数等于1 return"<ahref=".$this->php_self()."?page_id=1".$this->url().">上一页</a>"; }elseif($this->page_id()!=1){//页数不等于1 return"<ahref=".$this->php_self()."?page_id=".($this->page_id()-1).$this->url().">上一页</a>"; } } //显示分页 privatefunctiondisplay_page(){ $display_page=""; if($this->page_num()<=10){//小于10页 for($i=1;$i<=$this->page_num();$i++)//循环显示出页面 $display_page.="<ahref=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a>"; return$display_page; }elseif($this->page_num()>10){//大于10页 if($this->page_id()<=6){ for($i=1;$i<=10;$i++)//循环显示出页面 $display_page.="<ahref=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a>"; return$display_page; }elseif(($this->page_id()>6)&&($this->page_num()-$this->page_id()>=4)){ for($i=$this->page_id()-5;$i<=$this->page_id()+4;$i++)//循环显示出页面 $display_page.="<ahref=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a>"; return$display_page; }elseif(($this->page_id()>6)&&($this->page_num()-$this->page_id()<4)){ for($i=$this->page_num()-9;$i<=$this->page_num();$i++)//循环显示出页面 $display_page.="<ahref=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a>"; return$display_page; } } } //下一页 privatefunctionnext_page(){ if($this->page_id()<$this->page_num()){//页数小于总页数 return"<ahref=".$this->php_self()."?page_id=".($this->page_id()+1).$this->url().">下一页</a>"; }elseif($this->page_id()==$this->page_num()){//页数等于总页数 return"<ahref=".$this->php_self()."?page_id=".$this->page_num().$this->url().">下一页</a>"; } } //设置分页信息 publicfunctionset_page_info(){ $page_info="共".$this->datanum."条"; $page_info.="<ahref=".$this->php_self()."?page_id=1".$this->url().">首页</a>"; $page_info.=$this->pre_page(); $page_info.=$this->display_page(); $page_info.=$this->next_page(); $page_info.="<ahref=".$this->php_self()."?page_id=".$this->page_num().$this->url().">尾页</a>"; $page_info.="第".$this->page_id()."/".$this->page_num()."页"; return$page_info; } } ?>
2.脚本2:
<?php //类的用法 //读取分页类 include("pager.class.php"); //数据库连接初始化 //$db=newmysql(); $impeach_host='10.81.43.139'; $impeach_usr='vmtest15'; $impeach_passwd='vmtest15'; $impeach_name='ufeature'; $impeach_con=mysql_connect($impeach_host,$impeach_usr,$impeach_passwd)or die("Can'tconnect".mysql_error()); mysql_select_db($impeach_name,$impeach_con); //这是一个sql查询语句,并得到查询结果 $sql="selectwordfromufeature.spam_accuse_word_listwhereflag='0'"; //分页初始化 $page=newpager($sql,20); //20是每页显示的数量 //$res_1=mysql_query($sql)or //die("Can'tgetresult".mysql_error()); $result=mysql_query($page->sqlquery()); while($info=mysql_fetch_array($result,MYSQL_ASSOC)){ //while($info=mysql_fetch_array($res_1,MYSQL_ASSOC)){ echo$info["word"]."<br/>"; } //页码索引条 echo$page->set_page_info(); ?>
方法二:使用ajax的方法
1、首先了解SQL语句中的limit用法
SELECT*FROMtable……limit开始位置,操作条数(其中开始位置是从0开始的)
例子
取前20条记录:SELECT*FROMtable……limit 0,20
从第11条开始取20条记录:SELECT*FROMtable……limit 10,20
LIMITn等价于LIMIT0,n。
如select*fromtableLIMIT5;//返回前5行,和select*fromtableLIMIT0,5一样
2、分页原理
所谓分页显示,也就是讲数据库中的结果集,一段一段显示出来
怎么分段,当前在第几段(每页有几条,当前再第几页)
前10条记录:select*fromtablelimit0,10
第11至20条记录:select*fromtablelimit10,10
第21至30条记录:select*fromtablelimit20,10
分页公式:
(当前页数-1)X每页条数,每页条数
Select*fromtablelimit($Page-1)*$PageSize,$PageSize
3、$_SERVER["REQUEST_URI"]函数
预定义服务器变量的一种,所有$_SERVER开头的都叫做预定于服务器变量。
REQUEST_URI的作用是取得当前URI,也就除域名外后面的完整的地址路径。
例子:
当前页为:http://www.test.com/home.php?id=23&cid=22
echo$_SERVER["REQUEST_URI"]
结果为:/home.php?id=23&cid=22
4、parse_url()解析URL函数
parse_url()是讲URL解析成有固定键值的数组的函数
例子
$ua=parse_url("http://username:password@hostname/path?arg=value#anchor"); print_r($ua);
结果:
Array ( [scheme]=>http;协议 [host]=>hostname;主机域名 [user]=>username;用户 [pass]=>password;密码 [path]=>/path;路径 [query]=>arg=value;取参数 [fragment]=>anchor; )
5、代码实例
这个一个留言的分页,分为3个部分,一个是数据库设计,一个是连接页面,一个是显示页面。
(1)设计数据库
设计数据库名为bbs,有一个数据表为message,里面包含title,lastdate,user,content等字段,分别表示留言标题,留言日前,留言人,留言的内容
(2)连接页面
<?php $conn=@mysql_connect("localhost","root","123456")ordie("数据库链接错误"); mysql_select_db("bbs",$conn); mysql_query("setnames'GBK'");//使用GBK中文编码; //将空格,换行转换为HTML可解析 functionhtmtocode($content){ $content=str_replace("\n","<br>",str_replace(""," ",$content));//两个str_replace嵌套 return$content; } //$content=str_replace("'","‘",$content); //htmlspecialchars(); ?>
(3)显示页面