詳解PHP分頁顯示制作_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解讀php框架codeigniter是如何實現mvc模式以及單一入口
      關于mvc 這里不詳細講解何為MVC模式,只是簡單介紹,關于mvc的具體信息可以去網絡上找尋,mvc模式在我理解來它將一個項目分解成三部分,分別是Model(模型),View(視圖),Controller(控制器),這三個單詞的縮寫組合即為MVC.MVC是一種普遍的軟件敏捷開發

      所謂分頁顯示,也就是將數據庫中的結果集人為的分成一段一段的來顯示,這里需要兩個初始的參數每頁多少條記錄($PageSize)?
      當前是第幾頁($CurrentPageID)?
      現在只要再給我一個結果集,我就可以顯示某段特定的結果出來。
      至于其他的參數,比如:上一頁($PreviousPageID)、下一頁($NextPageID)、總頁數($numPages)等等,都可以根據前邊這幾個東西得到。
        以mysql數據庫為例,如果要從表內截取某段內容,sql語句可以用:select * from table limit offset, rows。看看下面一組sql語句,嘗試一下發現其中的規率。
        前10條記錄:select * from table limit 0,10
        第11至20條記錄:select * from table limit 10,10
        第21至30條記錄:select * from table limit 20,10
        ……
        這一組sql語句其實就是當$PageSize=10的時候取表內每一頁數據的sql語句,我們可以總結出這樣一個模板:
      select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
        拿這個模板代入對應的值和上邊那一組sql語句對照一下看看是不是那么回事。搞定了最重要的如何獲取數據的問題以后,剩下的就僅僅是傳遞參數,構造合適的sql語句然后使用php從數據庫內獲取數據并顯示了。以下我將用具體代碼加以說明。
        3、簡單代碼
        請詳細閱讀以下代碼,自己調試運行一次,最好把它修改一次,加上自己的功能,比如搜索等等。
      <?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 amount 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就可以很簡單的用得到的二維數組來顯示結果
      ?>

      4、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方法。
        ok,寫完收功,希望花時間看完這些文字的你不覺得是浪費了時間

      分享:解析PHP實現的Mysql讀寫分離
      PHP實現的Mysql讀寫分離 主要特性: 1 簡單的讀寫分離 2 一個主數據庫,可以添加更多的只讀數據庫 3 讀寫分離但不用擔心某些特性不支持 4 缺點:同時連接兩個數據庫 英文比較爛,也寫幾個字吧 php code for mysql read/write split feature: simply rw split

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-07-07
      相關PHP教程