php 分页类 扩展代码

  原来发表过一个脱离数据库的分页类,最近使用的时候发现有些时候搜索的东西过于大的时候,采用url传递参数的方式,可能会有一定的影响或者叫已知的bug,这次做了一些扩展,同时兼容了以前的模式,使用上面很简单的,只需要多设置一个参数就可以了代码如下:

  

复制代码 代码如下:

  <?php

  /**

  * 功能: 分页类,根据提供的数据总量和页面大小

  * 创建日期:Fri Apr 20 16:45:21 CST 2007

  * 最后更新:

  * 作者: sanshi <[email protected]>

  */

  class pagination

  {

  var $result = array();

  var $pVar = "myp";//page参数分页记数

  var $urlParamStr = ""; //页面的所有参数

  var $sqlMoveNumber = 0; //数据的偏移量

  var $is_post = false;

  public function pagination()

  {

  }

  public function set($sum,$pageSize,$page="",$is_post = false)

  {

  $this->is_post = $is_post;

  $this->pVar = defined('PAGE_BAR') ? PAGE_BAR : 'myp' ;

  $url = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];

  //计算出总页数

  $curPage = $this->getCurPage();

  $temp['sumPage'] = ceil($sum/$pageSize);

  //修改了,页码超出的bug

  if($curPage>$temp['sumPage']) $curPage=$temp['sumPage'];

  $temp['curPage'] = $curPage;

  $temp['nextPage'] = $temp['sumPage'] > $curPage ? ($curPage+1) : $temp['sumPage'];

  $temp['upPage'] = $curPage >1 ? $curPage-1 :1;

  $temp['endPage'] = $temp['sumPage'];

  $this->urlParamStr = $this->_makeUrl($url);

  $temp['urlPageStr'] = ($page=="") ? $this->_makeUrl($url) : $page.$this->urlParamStr;

  $this->sqlMoveNumber = $curPage <2 ? 0 : ($curPage-1)*$pageSize;

  $temp['sqlMoveNumber'] = $this->sqlMoveNumber;

  $temp['rowNo'] = $sum;

  $this->result = $temp;

  return $this->result;

  //print_r($temp);exit();

  }

  public function getSqlMove()

  {

  return $this->sqlMoveNumber;

  }

  public function getFooter()

  {

  $str= "共有 <FONT COLOR=#FF0033>{$this->result['rowNo']}</FONT> 条 <a href='{$this->result['urlPageStr']}{$this->result['upPage']}'";

  if($this->is_post) $str .=" onclick='return sanshi_page_post(this.href,{$this->result['upPage']});' ";

  $str .=" >上一页</a> ";

  $str .=" 当前 {$this->result['curPage']} 页";

  $str .=" 共有 {$this->result['sumPage']} 页";

  $str .=" <a href='{$this->result['urlPageStr']}{$this->result['nextPage']}'";

  if($this->is_post) $str .=" onclick='return sanshi_page_post(this.href,{$this->result['nextPage']});' ";

  $str .=" >下一页</a>";

  return $str;

  }

  public function getJumpPage()

  {

  if($this->is_post)

  {

  $str = " 跳到第 <select name='topage' size='1' onchange='sanshi_page_post(\"{$this->result['urlPageStr']}\"+this.value,this.value)'>\n";

  }else{

  $str = " 跳到第 <select name='topage' size='1' onchange='window.location=\"{$this->result['urlPageStr']}\"+this.value'>\n";

  }

  for($i=1;$i<=$this->result['sumPage'];$i++)

  {

  $str .= ($i==$this->result['curPage']) ? "<option value='$i' selected>$i</option>\n" : "<option value='$i'>$i</option>\n";

  }

  $str.="</select> 页";

  //输出form表单

  if($this->is_post)

  {

  $str .="<script type="text/javascript"><!--

  function sanshi_page_post(jump_link,page_no)

  {

  document.getElementById('sanshi_goPage').action = jump_link; document.getElementById('{$this->pVar}').value = page_no;

  document.getElementById('sanshi_goPage').submit();

  return false;

  }

  // --></script>";

  $str .="<form name='sanshi_goPage' id='sanshi_goPage' method=post>";

  $str .="<input type=\"hidden\" name='{$this->pVar}' id='{$this->pVar}' value=0>";

  $_POST = isset($_POST) ? $_POST : array();

  foreach($_POST AS $k=>$v)

  {

  $str .="<input type=\"hidden\" name=\"{$k}\" id=\"{$k}\" value=\"{$v}\">";

  }

  $str .="</form>";

  }

  return $str;

  }

  public function getCurPage()

  {

  return isset($_GET[$this->pVar]) ? intval($_GET[$this->pVar]) : 1 ;

  }

  //分析出url的参数返回?后的参数,页码为空 包括问号

  private function _makeUrl($url)

  {

  $arrayUrl=parse_url($url);

  if(isset($arrayUrl['query']))

  {

  $q=$arrayUrl['query'];

  parse_str($q,$qParam);

  //print_r($qParam);

  if(array_key_exists($this->pVar,$qParam))

  {

  foreach ($qParam AS $k=>$v)

  {

  if($k !=$this->pVar) $temp[$k] = $v;

  }

  $temp[$this->pVar] = "";

  if(function_exists("http_build_query"))

  return '?'.http_build_query($temp);

  else

  return '?'.sanshi_http_build_query($temp);

  }else {

  return "?{$q}&{$this->pVar}=";

  }

  }else{

  return "?{$this->pVar}=";

  }

  }

  }

  function sanshi_http_build_query($a,$b='',$c=0)

  {

  if (!is_array($a)) return false;

  foreach ((array)$a as $k=>$v)

  {

  if ($c)

  $k=$b."[".$k."]";

  elseif (is_int($k))

  $k=$b.$k;

  if (is_array($v)||is_object($v))

  {

  $r[]=http_build_query($v,$k,1);

  continue;

  }

  $r[]=$k."=".urlencode($v);

  }

  return implode("&",$r);

  }

  /*

  //print_r($_SERVER);

  $p = new pagination();

  $p->set(10,2,'thi.php');

  echo $p->getFooter();

  echo $p->getJumpPage();

  */

  ?>