php分页原理与页面跳转实例

发布时间:2020-01-23编辑:脚本学堂
本文介绍了php分页原理与页面跳转的方法,有关php分页显示的原理和实现方法,需要的朋友参考下。

所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:
每页多少条记录($pagesize)?
当前是第几页($currentpageid)?
现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($previouspageid)、下一页($nextpageid)、总页数($numpages)等等,都可以根据前边这几个东西得到。

专题推荐:php分页代码大全

mysql/ target=_blank class=infotextkey>mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。
 

复制代码 代码示例:
select * from table limit 0,10 // 前10条记录 
select * from table limit 10,10 // 第11至20条记录 
select * from table limit 20,10 // 第21至30条记录 
……   
 

这一组sql语句其实就是当$pagesize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:
select * from table limit ($currentpageid - 1) * $pagesize, $pagesize   
拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。

php分页代码
 

复制代码 代码示例:
<?php 
// 建立数据库连接 
$link = mysql_connect("localhost", "mysql_user", "mysql_password")  
   or die("could not connect: " . mysql_error());  
// 获取当前页数 
if( isset($_get['page']) ){ 
  $page = intval( $_get['page'] ); 

else{ 
  $page = 1; 
}  
// 每页数量 
$pagesize = 10;  
// 获取总数据量 
$sql = "select count(*) as alinuxjishu/9952.html target=_blank class=infotextkey>mount from table"; 
$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 .= '<a href="/?page=1>";第一页</a>|<a href="/?page='."($page-1).'>上一页</a>|'; 
}  
if( ($page == $page_count) || ($page_count == 0) ){ 
  $page_string .= '下一页|尾页'; 

else{ 
  $page_string .= '<a href="/?page='."($page+1).'>下一页</a>|<a href="/?page='."$page_count.'>尾页</a>'; 

// 获取数据,以二维数组格式返回结果 
if( $amount ){ 
  $sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size"; 
  $result = mysql_query($sql); 
   
  while ( $row = mysql_fetch_row($result) ){ 
    $rowset[] = $row; 
  } 
}else{ 
  $rowset = array(); 

// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果 
?>  
 

oo风格代码,以下代码中的数据库连接是使用的pear db类进行处理
 

复制代码 代码示例:
<?php 
// filename: pager.class.php 
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作 
class pager 

  var $pagesize;       //每页的数量 
  var $currentpageid;    //当前的页数 
  var $nextpageid;      //下一页 
  var $previouspageid;    //上一页 
  var $numpages;       //总页数 
  var $numitems;       //总记录数 
  var $isfirstpage;     //是否第一页 
  var $islastpage;      //是否最后一页 
  var $sql;         //sql查询语句 
   
 function pager($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
      case 1: 
        $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; } 
    } 
     
    return true; 
  } 
   
  /***
  *
  * 返回结果集的数据库连接
  * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
  * 如果结果集不是很大,可以直接使用getpagedata的方式获取二维数组格式的结果
  * getpagedata方法也是调用本方法来获取结果的
  *
  ***/ 
   
  function getdatalink() 
  { 
    if ( $this->numitems ) 
    { 
      global $db; 
       
      $pageid = $this->currentpageid; 
       
      $from = ($pageid - 1)*$this->pagesize; 
      $count = $this->pagesize; 
      $link = $db->limitquery($this->sql, $from, $count);  //使用pear db::limitquery方法保证数据库兼容性 
       
      return $link; 
    } 
    else 
    { 
      return false; 
    } 
  } 
   
  /***
  *
  * 以二维数组的格式返回结果集
  *
  ***/ 
   
  function getpagedata() 
  { 
    if ( $this->numitems ) 
    { 
      if ( $res = $this->getdatalink() ) 
      {     
        if ( $res->numrows() ) 
        { 
          while ( $row = $res->fetchrow() ) 
          { 
 $result[] = $row; 
          } 
        } 
        else 
        { 
          $result = array(); 
        } 
         
        return $result; 
      } 
      else 
      { 
        return false; 
      } 
    } 
    else 
    { 
      return false; 
    } 
  } 
   
  function _setoptions($option) 
  { 
    $allow_options = array( 
          'pagesize', 
          'currentpageid', 
          'sql', 
          'numitems' 
    ); 
     
    foreach ( $option as $key => $value ) 
    { 
      if ( in_array($key, $allow_options) && ($value != null) ) 
      { 
        $this->$key = $value; 
      } 
    } 
     
    return true; 
  } 

?> 

分页代码调用: 
 

复制代码 代码示例:
<?php 
// filename: test_pager.php 
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码  
require "pager.class.php";  
if ( isset($_get['page']) ) 

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

else 

  $page = 1; 
}  
$sql = "select * from table order by id";  
$pager_option = array( 
    "sql" => $sql, 
    "pagesize" => 10, 
    "currentpageid" => $page 
);  
if ( isset($_get['numitems']) ) 

  $pager_option['numitems'] = (int)$_get['numitems']; 
}  
$pager = @new pager($pager_option);  
$data = $pager->getpagedata();  
if ( $pager->isfirstpage ) 

  $turnover = "首页|上一页|"; 

else 

  $turnover = "<a href='?page=1&numitems=".$pager->numitems."'>首页</a>|<a href="/?page=".$pager->previouspageid."&numitems=".$pager->numitems."'>上一页</a>|";

if ( $pager->islastpage )
{
  $turnover .= "下一页|尾页";
}
else
{
  $turnover .= "<a href="/?page=".$pager->nextpageid."&numitems=".$pager->numitems."'>下一页</a>|<a href="/?page=".$pager->numpages."&numitems=".$pager->numitems."'>尾页</a>"; 

?>   

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

复制代码 代码示例:
<?php 
class memberpager extends pager 

  function showmemberlist() 
  { 
    global $db; 
     
    $data = $this->getpagedata();  
// 显示结果的代码 
    // ...... 
  } 
}  
/// 调用 
if ( isset($_get['page']) ) 

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

else 

  $page = 1; 
}  
$sql = "select * from members order by id";  
$pager_option = array( 
    "sql" => $sql, 
    "pagesize" => 10, 
    "currentpageid" => $page 
);  
if ( isset($_get['numitems']) ) 

  $pager_option['numitems'] = (int)$_get['numitems']; 
}  
$pager = @new memberpager($pager_option);  
$pager->showmemberlist(); 
?>

第二,不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
 

mysql: select * from table limit offset, rows 
pgsql: select * from table limit m offset n 
......   
 

所以在类里边获取结果时需要使用pear db类的limitquery方法。

3,分页跳转代码:
 

复制代码 代码示例:
<div id="fenye"> 
<?php  
$pagenum=@ceil($num/$pagesize); 
if($num > $pagesize){ 
    if($pageval<=1) $pageval=1; 
    if($pageval==$pagenum){ 
 echo "<a href='$url?page=1'>首页</a> <a href=$url?page=".($pageval-1).">上一页</a> <a href='#' class='pageup'>下一页</a> <a href='$url?page=".$pagenum."'>末页</a>"; 
 //echo "第".$pageval."页/共".$pagenum."页"; 
 echo  " 到第 <select name='topage' size='1' onchange='window.location="$url?page="+this.value'>n"; 
  for ($i = 1; $i <= $pagenum; $i++) { 
   if ($i == $pageval) 
    echo "<option value='$i' selected>$i</option>n"; 
   else 
    echo "<option value='$i'>$i</option>n"; 
  } 
  echo "</select> 页,共 $pagenum 页";  
}
 } 

 ?> 
</div>