php+oracle 分页类   
whxbb 于 10/12/2001 3:17:21 PM 加贴在 PHP编程 
下面是分页示例程序,看起来可能比较繁琐,但其实你只要用一下就会发现,"一切原来如此简单" :) 
example.php 
<?php 
$conn = ociplogon("test","123456","test123"); 
include_once "pager.inc.php"; 
?> <?php 
/** 分页测试开始 */ // {{{ 初始分页对象 
$pager = new pager(); 
/** 将 select id,name,age from test where age>20 order by id desc 拆分 */ 
$sqlArr = array('conn' => $conn,       // 数据库连结 
        'fields' => " id,name,age ", // 查询主语句 
        'table' => "test",      // 表名 
        'condition' => " age>20 ",  // 查询条件 
        'order'   => " order by id desc " // 排序方式 
        ); 
if (!$pager->listn($sqlArr,10,$page)) // 每页显示10条 

  $pager->errno = 10; 
  die($pager->errmsg()); 

  //}}} // {{{ 数据显示 
for( $i = 0; $i < count($pager->result); $i++) 

  $tmp = $pager->result[$i]; 
  echo " id:".$tmp['ID']."<br>"; 
  echo " name:".$tmp['NAME']."<br>"; 
  echo " age:".$tmp['AGE']."<hr>" 

  // }}} // {{{ 显示翻页链结 
echo $pager->page. " / ".$pager->totalpage." 共 ".$pager->total. "条记录 "; 
if ($pager->prev != 0) 
  echo " <a href=$PHP_SELF?page=".$pager->prev.">上一页</a> "; 
else 
  echo " 上一页 "; if ($pager->next != 0) 
  echo " <a href=$PHP_SELF?page=".$pager->next.">下一页</a> "; 
else 
  echo " 下一页 "; 
// }}} 
?> 

解决方案 »

  1.   

    分页类(pager.class.php) 
    whxbb 发表于 2001-10-12 15:20 PHP编程 ←返回版面   <?php 
    // 
    // +----------------------------------------------------------------------+ 
    // | 分页                                 | 
    // | Authors: whxbb([email protected])                 | 
    // +----------------------------------------------------------------------+ 
    // 
    // $Id: pager.class.php,v 1.0 2001/10/10 13:31:57 whxbb Exp $ 
    // /** 出错信息 */ 
    $PAGE_CLASS_ERROR = array( 1 => '3001:获取总纪录数失败', 
                  2 => '3002:获取总纪录数失败', 
                  5 => '3005:列表失败', 
                  6 => '3006:列表失败', 
                  7 => '3007:记录为空' 
                 ); 
    /** 
    * Purpose 
    * 分页 
    * @author:whxbb([email protected]
    * @version 0.1 
    * @access public 
    */ class pager 

      /** 总纪录数 */ 
      var $total; 
      /** 总页数 */ 
      var $totalpage; 
      /** 当前页 */ 
      var $page ; 
      /** 前页 */ 
      var $prev = 0; 
      /** 后页 */ 
      var $next = 0; 
      /** 每页显示 */ 
      var $items; 
      /** 错误号 */ 
      var $errno = 0; 
      /** 结果集 */ 
      var $result; 
      function page() 
      { 
      }   function nextpage() 
      { 
        $this->next = $this->page + 1; 
        if ($this->next > $this->totalpage) 
          $this->next = 0; 
      }   function prevpage() 
      { 
        $this->prev = $this->page - 1; 
        if ($this->prev <= 0) 
          $this->prev = 0; 
      }   /** 
       * 列出纪录 
       * @param $sqlArr sql语句数组 
       *        conn    数据库连结  
       *        fields 主语句   id, name, age 
       *        table   表名    clients 
       *        condition 查询条件  id >50 and name like '%y%' 
       *         order   排序方式  order by age desc 
       * @param $items 每页显示的条数 
       * @param $page 当前页码 
       * @return 出错或没有纪录 false 
       *     成功      关联数据,存贮纪录结果 
       */ 
      function listn($sqlArr,$items,$page) 
      { 
        $this->items = $items; 
        /** 得到总纪录数 */ 
        $this->getTotal($sqlArr); 
        /** 得到总页数 */ 
        $this->totalpage = ceil($this->total / $this->items);     if ($page == 0 || $page == '') 
          $page = 1; 
        if ($page > $this->totalpage) 
          $page = $this->totalpage; 
        $this->page = $page;     $this->nextpage(); 
        $this->prevpage();     /** 获取分页查询语句 */ 
        $query = $this->gensql($sqlArr);     $stmt = @OCIParse($sqlArr['conn'], $query); 
        if (!$stmt) 
        { 
          $this->errno = 5; 
          return false; 
        } 
        if (!@OCIExecute($stmt)) 
        { 
          $this->errno = 6; 
          return false; 
        } 
        $i = 0; 
        while(@OCIFetchInto($stmt, &$tmpArr[$i], OCI_ASSOC)) 
        { 
          $arr[$i] = $tmpArr[$i]; 
          $i++; 
        }     if ($i == 0) 
        { 
          $this->errno = 7; 
          return false; 
        } 
        $this->result = $arr; 
        @OCIFreeStatement($stmt); 
        return true; 
      }   /** 
       * 得到纪录总数 
       * @param $sqlArr 
       * @see listn() 
       * @access public 
       */ 
      function getTotal($sqlArr) 
      { 
        $condition = $sqlArr['condition'];     if ($condition != ''){ 
          $condition = " where ".$condition.' '; 
        }     $query = "select count(*) from " .$sqlArr['table'].$condition; 
        $stmt = @OCIParse($sqlArr['conn'], $query); 
        if (!$stmt) 
        { 
          $this->errno = 1; 
          return false; 
        } 
        if(!@OCIExecute($stmt)) 
        { 
          $this->errno = 2; 
          return false; 
        } 
        @OCIFetch($stmt); 
        $this->total = @OCIResult($stmt, 1); 
        @OCIFreeStatement($stmt); 
        return true; 
      } 
      /** 
       * 生成分页查询语句 
       * @param $sqlArr  查询语句 
       * @return string $query 
       * @see listn() 
       */ 
      function gensql($sqlArr) { 
        $condition = $sqlArr['condition']; 
        if ($condition != '') { 
          $condition = " where ".$condition.' '; 
        }     $start = ($this->page - 1) * $this->items + 1; 
        $end = $start + $this->items;     $query = " select ".$sqlArr['fields']." from "; 
        $tmpQuery = $query.$sqlArr['table'].$condition.$order; 
        $query = $query." (".$tmpQuery.") where rownum < $end "." minus ".$query." (".$tmpQuery.") where rownum < $start "; 
        return $query; 
      }   /** 
       * 得到错误信息 
       * @access public 
       * @return error msg string or false 
       */ 
      function errmsg() 
      { 
        global $PRIZE_CLASS_ERROR; 
         
        if ($this->errno == 0) 
          return false; 
        else 
          return $PRIZE_CLASS_ERROR[$this->errno]; 
      } 

    ?> 
    php+oracle 分页类 
    whxbb 发表于 2001-10-12 15:17 PHP编程 ←返回版面   
    下面是分页示例程序,看起来可能比较繁琐,但其实你只要用一下就会发现,"一切原来如此简单" :) 
    example.php 
    <?php 
    $conn = ociplogon("test","123456","test123"); 
    include_once "pager.inc.php"; 
    ?> <?php 
    /** 分页测试开始 */ // {{{ 初始分页对象 
    $pager = new pager(); 
    /** 将 select id,name,age from test where age>20 order by id desc 拆分 */ 
    $sqlArr = array('conn' => $conn,       // 数据库连结 
            'fields' => " id,name,age ", // 查询主语句 
            'table' => "test",      // 表名 
            'condition' => " age>20 ",  // 查询条件 
            'order'   => " order by id desc " // 排序方式 
            ); 
    if (!$pager->listn($sqlArr,10,$page)) // 每页显示10条 

      $pager->errno = 10; 
      die($pager->errmsg()); 

      //}}} // {{{ 数据显示 
    for( $i = 0; $i < count($pager->result); $i++) 

      $tmp = $pager->result[$i]; 
      echo " id:".$tmp['ID']."<br>"; 
      echo " name:".$tmp['NAME']."<br>"; 
      echo " age:".$tmp['AGE']."<hr>" 

      // }}} // {{{ 显示翻页链结 
    echo $pager->page. " / ".$pager->totalpage." 共 ".$pager->total. "条记录 "; 
    if ($pager->prev != 0) 
      echo " <a href=$PHP_SELF?page=".$pager->prev.">上一页</a> "; 
    else 
      echo " 上一页 "; if ($pager->next != 0) 
      echo " <a href=$PHP_SELF?page=".$pager->next.">下一页</a> "; 
    else 
      echo " 下一页 "; 
    // }}} 
    ?> <?@OCILogoff($conn)?> 一些问题 
    whxbb 发表于 2001-10-12 15:36 PHP编程 ←返回版面   1 缺少一个sql语法拆析函数 parse() 
     自动将 "select id, name, age from test where age>20 order by id desc" 拆开,这样初始化 pager 时就用不着那么麻烦了 理想情况应该是这样: 
    $query = "select id, name, age from test where age>20 order by id desc"; 
    $pager->listn($query,10,$page); 2 执行效率 
     本分页程序使用的查询方式如下: 
     "select id,name,age from (select id, name, age from test where age>20 order by id desc) where rownu<10 minus select id,name,age from (select id, name, age from test where age>20 order by id desc) where rownu<1)" 
     效率似乎不是很高,谁能提供别的好些的分页方式?