<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    @OverWrite BlogJava

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 29 評論 :: 0 Trackbacks
    今天看到一篇php分頁的文章,雖然簡單但非常實用,稍作編輯貼出來(原文地址http://www.chinaunix.net/jh/27/181584.html)

    所謂分頁顯示,也就是將數據庫中的結果集人為的分成一段一段的來顯示,這里需要兩個初始的參數:

    每頁多少條記錄($PageSize)?
    當前是第幾頁($CurrentPageID)?
    至于其他的參數,比如:上一頁($PreviousPageID)、下一頁($NextPageID)、總頁數($numPages)等等,都可以根據前邊這幾個東西得到。
    現在只要再給我一個結果集,我就可以顯示某段特定的結果出來。
    以mysql數據庫為例,如果要從表內截取某段內容,sql語句可以用:select * from table limit offset, rows??纯聪旅嬉唤Msql語句,嘗試一下發現其中的規率。

    前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從數據庫內獲取數據并顯示了。以下我將用具體代碼加以說明。

    以下是個簡單的實現:
    <?php
    // 建立數據庫連接
    $link = mysql_connect("localhost", "mysql_user", "mysql_password"
           or 
    die("Could not connect: " . mysql_error());

    // 獲取當前頁數
    ifisset($_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 )
            {
                
    $this->;numPages = ceil($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,寫完收功。
    posted on 2008-01-31 15:59 vesung 閱讀(823) 評論(0)  編輯  收藏 所屬分類: Php

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 无码日韩人妻AV一区免费l| eeuss免费影院| 亚洲成?Ⅴ人在线观看无码| 精品国产麻豆免费人成网站| 亚洲成av人片不卡无码| 免费一级做a爰片久久毛片潮喷| 97国免费在线视频| 学生妹亚洲一区二区| 国产精品亚洲视频| 国产va免费精品观看精品| caoporn国产精品免费| 亚洲人色大成年网站在线观看| www.亚洲精品| ww在线观视频免费观看| a级毛片免费观看网站| 亚洲偷自精品三十六区| 亚洲乳大丰满中文字幕| 日韩电影免费在线| 色欲色香天天天综合网站免费| 立即播放免费毛片一级| 亚洲国产成人精品电影| 亚洲午夜无码久久久久| 国产真实伦在线视频免费观看| 99蜜桃在线观看免费视频网站| 免费一级毛suv好看的国产网站 | 中文字幕精品亚洲无线码一区应用| 91精品免费在线观看| 国产一级一毛免费黄片| 国产精品亚洲色婷婷99久久精品| 久久亚洲国产视频| 亚洲国产精品专区在线观看| 成年美女黄网站18禁免费| 免费A级毛片在线播放| 一区二区三区在线免费| 亚洲.国产.欧美一区二区三区| 亚洲资源在线观看| 亚洲日韩中文字幕在线播放| 亚洲精品国产自在久久| 国产人成免费视频| 黄页免费的网站勿入免费直接进入| 免费A级毛片av无码|