+ -
当前位置:首页 → 问答吧 → 整了个mysql和mssql都可以用的分页类

整了个mysql和mssql都可以用的分页类

时间:2008-08-08

来源:互联网

网上找了个分页的轮子,组装了下,希望还可以改进
复制PHP内容到剪贴板
PHP代码:

<?
class Page{
private  $QueryStr;//查询的SQL
private  $page;//传入的页码
private  $pageSize;//每页行数
private  $type; //数据库类型 0:mysql 1:mssql
private  $total; //记录总数
private  $result;

  function __construct($sql,$size,$page=1,$type=0){
$this->QueryStr=$sql;
$this->page=$page;
$this->pageSize=$size;
$this->type=$type;
$this->total=$this->type ? mssql_num_rows($this->result=mssql_query($this->QueryStr)) : mysql_num_rows($this->result=mysql_query($this->QueryStr));
 }

  function query(){
     if($this->type){
     $num_rows_func="mssql_num_rows";
     $data_seek_func="mssql_data_seek";
     $fetch_array_func="mssql_fetch_array";
   }
   if(!$this->type){
     $num_rows_func="mysql_num_rows";
     $data_seek_func="mysql_data_seek";
     $fetch_array_func="mysql_fetch_array";
   }
   
   if($this->result){  
      $totalPage  =  ceil($num_rows_func($this->result)/$this->pageSize);  
      if  (!$this->page  || $this->page<=0)  $this->page=1;  
      if  ($this->page>$totalPage)  $this->page=$totalPage;  
      $begin  =  (  $this->page-1  )  *  $this->pageSize;  
      $ReArr=array();  
      $index=0;  
      if($this->pageSize>0)  $data_seek_func($this->result,$begin);  
      while([email=$ResultArr=@$fetch_array_func($this-]$ResultArr=@$fetch_array_func($this->result[/email])){  
         if($this->pageSize>0)  
            if($index>$this->pageSize-1)  break;  
         $ReArr[$index]=$ResultArr;                                                                          
         $index++;  
      }  
      return  $ReArr;  
           }else  
      return  false;  
 }

  function getPage($url=''){
 //定义几个全局变量:$firstcount、$displaypg、$pagenav。
 //$page:当前页码;
 //$firstcount:(数据库)查询的起始项;
 //$pagenav:页面导航条代码,函数内部并没有将它输出;
 //$_SERVER:读取本页URL“$_SERVER["REQUEST_URI"]”所必须。
 global $page,$firstcount,$pagenav,$_SERVER;
 //为使函数外部可以访问这里的“$displaypg”,将它也设为全局变量。注意一个变量重新定义为全局变量后,原值被覆盖,所以这里给它重新赋值。
 $GLOBALS["displaypg"]=$this->pageSize;
 if(!$this->page) $page=1;
 //如果$url使用默认,即空值,则赋值为本页URL:
 if(!$url){ $url=$_SERVER["REQUEST_URI"];}
 //URL分析:
 $parse_url=parse_url($url);
 $url_query=$parse_url["query"]; //单独取出URL的查询字串
 if($url_query){
 //因为URL中可能包含了页码信息,我们要把它去掉,以便加入新的页码信息。
 //这里用到了正则表达式,请参考“PHP中的正规表达式”([url=http://www.pconline.com.cn/pcedu/empolder/wz/php/10111/15058.html]http://www.pconline.com.cn/pcedu/empolder/wz/php/10111/15058.html[/url])
 $url_query=ereg_replace("(^|&)page=$page","",$url_query);
 //将处理后的URL的查询字串替换原来的URL的查询字串:
 $url=str_replace($parse_url["query"],$url_query,$url);
 //在URL后加page查询信息,但待赋值: 
 if($url_query) $url.="&page"; else $url.="page";
 }else {
 $url.="?page";
 }
 //页码计算:
 $lastpg=ceil($this->total/$this->pageSize); //最后页,也是总页数
 $page=min($lastpg,$this->page);
 $prepg=$page-1; //上一页
 $nextpg=($page==$lastpg ? 0 : $page+1); //下一页
 $firstcount=($page-1)*$this->pageSize;
 //开始分页导航条代码:
 $pagenav="显示第 <B>".($this->total?($firstcount+1):0)."</B>-<B>".min($firstcount+$this->pageSize,$this->total)."</B> 条记录,共 $this->total 条记录<BR>";
 //如果只有一页则跳出函数:
 if($lastpg<=1) return $pagenav;
 $pagenav.=" <a href='$url=1'>首页</a> ";
 if($prepg) $pagenav.=" <a href='$url=$prepg'>前页</a> "; else $pagenav.=" 前页 ";
 if($nextpg) $pagenav.=" <a href='$url=$nextpg'>后页</a> "; else $pagenav.=" 后页 ";
 $pagenav.=" <a href='$url=$lastpg'>尾页</a> ";
 //下拉跳转列表,循环列出所有页码:
 $pagenav.=" 到第 <select name='topage' size='1' onchange='window.location=\"$url=\"+this.value'>\n";
 for($i=1;$i<=$lastpg;$i++){
 if($i==$page) $pagenav.="<option value='$i' selected>$i</option>\n";
 else $pagenav.="<option value='$i'>$i</option>\n";
 }
 $pagenav.="</select> 页,共 $lastpg 页";
 return  $pagenav;
 }
}
?>

调用页
复制PHP内容到剪贴板
PHP代码:

<?
include('page.class.php');
/**
  * mysql分页测试
  */
$host='localhost';
$user='root';
$psw ='';
$db='york';
$page = isset($_GET['page']) ? $_GET['page'] : 1; //当前页码
$size=10;//每页行数
$link=mysql_connect($host,$user,$psw) or die (mysql_error());
mysql_select_db($db,$link);
mysql_query('set names utf8');
$sql='select lei from york_lei';
$p=new page($sql,$size,$page);
$result=$p->query();
header('Content-Type:text/html; charset=utf-8');
foreach($result as $a) echo $a[0].'<br/>' ;//遍历输出数据集
echo '<br/>';
print($p->getPage());//输出分页条
/**
* mssql分页测试
$host='localhost';
$user='sa';
$psw='123456';
$db='test';
$page = isset($_GET['page']) ? $_GET['page'] : 1; //当前页码
$size=20;//每页行数
$link=mssql_connect($host,$user,$psw) or die ('连接数据库服务器失败');
mssql_select_db($db,$link);
$sql='select mobile from sms_send_temp';
$p=new page($sql,$size,$page,1);
$result=$p->query();
header('Content-Type:text/html; charset=utf-8');
foreach($result as $a) echo $a[0].'<br/>';//遍历输出数据集
print($p->getPage());//输出分页条
*/
?>

[ 本帖最后由 netbuddy 于 2008-8-8 15:34 编辑 ]

作者: netbuddy   发布时间: 2008-08-07

不知道用单例模式是否要好些,这样每次切换页面时就不用重新查询一次。
内容太多了回复显示不完成,还是传附件吧

[ 本帖最后由 netbuddy 于 2008-8-8 17:45 编辑 ]

作者: netbuddy   发布时间: 2008-08-08