分頁。。。算是心得吧。

來源:互聯網
上載者:User

<?php
         class getPageData {
 var $appConfig ; //應用程式配製資料
 var $db ; //資料庫連接對象
 var $_pageSize = 20 ; //一頁記錄數(大小)
 var $_currentPage = 1 ; //當前頁碼
 var $_rowCount = 0 ; //記錄總數
 var $_pageCount = 0 ; //總頁數
 var $_records ; //當前頁記錄
 var $_row=array() ; //當前的記錄資料
 var $_currentPageSize ; //當前頁記錄總數
 var $_currentPageStartNo ; //當前頁開始記錄號
 var $_linkClass; //css的檔案
 var $_option ; //處理後的導航條用的資料
 var $StrErr = "" ; //存放出錯誤的字串
 var $_beforeGetCurrentData=array('eventName'=>'_beforeGetCurrentData','eventType'=>'eventCode','eventCode'=>'') ;//得到當前資料前的事件,即可對$this->_row進行處理
 var $_afterGetCurrentData=array('eventName'=>'_afterGetCurrentData','eventType'=>'eventCode','eventCode'=>'') ;//得到當前資料後的事件,即可對$this->_records[$this->_currentPageSize]進行處理
 var $_afterGetData=array('eventName'=>'_afterGetData','eventType'=>'eventCode','eventCode'=>'')   ;//得到資料後的事件,即可對$this->_records進行處理
 /**
 * 功能:類的建構函式
 *
 * @param  $pageSize - 每一頁的記錄數,預設為取全部資料
 */
 function getPageData($pageSize = false)
 {
  global $db, $appConfig ,$eventStrCode ;  
  $this->eventStrCode = $eventStrCode ;
  
  $this->appConfig = $appConfig ;
  $this->db = $db ;
  if ($pageSize>0) {
   $this->_pageSize = $pageSize ;
  } else {
   $this->_pageSize = $this->appConfig['pageSize'] ;
  }
 } //end function getPageData
 
 function reset()
 {
     $this->_records =array(); 
  
 }
 
 function set_event_code($event_name, $event_code)
 {
  $event =$this->$event_name ;
  $event['eventCode'] =$event_code ; 
  $this->$event_name =$event ;
 }
 function set_event_function($event_name, $event_function)
 {
  $event =$this->$event_name ;
  $event['eventFunction'] =$event_function ; 
  $event['eventType'] = 'eventFunction';
  $this->$event_name =$event ;
 }
 
 function autoCommit($onoff=false)
 {
  $this->db->autocommit = $onoff ? true : false;
        return DB_OK;
    
 }//end function autoCommit
 
 
 function commit()
 {
  $this->db->commit();
 }//end function commit
 
 function rollback()
 {
  $this->db->rollback(); 
 }
 
 /**
  * 功能:擷取經解析後的SQL語句,能直接被運行
  * 出錯返回假,設定errPage為出錯頁面代碼,否則返回經解析後的sql語句
  *
  * @param  $sql - sql語句模板
  * @param  $data - 要替換的資料
  * @return string
  */
 function getPrepareSQL($sql, $data = false)
 {
  // $db = $this->db ;
  // global $error ;
  $sth = $this->db->prepare($sql) ;
  $realquery = $this->db->executeEmulateQuery($sth, $data);
  if ($this->db->isError($realquery)) {
   $errData = $sql ;
   // $this->errPage = $error->getErrorPage("preparesqlerr", $errData);
   return false ;
  }
  // $this->sql = $realquery ;
  return $realquery;
 } //end function getPrepareSQL
 /**
  * 運行操作查詢
  *
  * @param  $sql - 運行sql動作陳述式
  * @return boolean
  */
 function execute($sql, $pageSize=false)
 {
  // $db = $this->db ;
  // global $error ;
  //echo $this->db->autocommit.'**********' ;
  if (is_array($sql) == true) { // 如果sql是數組語句  
   //$this->autoCommit(false);
   foreach ($sql as $val) {
    $result = $this->db->simpleQuery($val);
    if ($this->db->isError($result)) {
     $this->rollback();
     $errData = $val ;
     //echo $val;
     // 顯示出錯資訊
     // $this->errPage = $error->getErrorPage("runsqlerr", $errData);
     return false ;
    }
   }
   if(true==$this->db->autocommit) $this->commit() ;
   return true ;
  }
  // 如果不是數組,則會執行下面的代碼

  $result = $this->db->simpleQuery($sql); 

  if ($this->db->isError($result)) {
   // $this->db->rollback();
   $errData = $sql ;
   // $this->errPage = $error->getErrorPage("runsqlerr", $errData);
   $this->rollback();
   return false ;
  } else {
   if(true==$this->db->autocommit) $this->commit() ;    
   return true ;
  }
 } //end function execute
 /**
  * 查詢一個記錄是否存在於Table中,StrSQLWhere為查詢的條件
  *  輸出:
  *  傳回值記錄總數,如果不存在,則返回假值(false)
  */
 function isRecordInTable ($table, $field, $val)
 {
  // $db = $this->db ;
  $sql = "select * from $table " ;
  $sql .= " where $field='" . $val . "'" ;

  $res = $this->db->query($sql);
  if ($this->db->isError($res)) {
   return false ;
  }

  $rows = $res->numRows();
  if ($rows <= 0) {
   return false;
  } else {
   return $rows;
  }
 } //End   function RecordIsInTable ($Table, $StrSQLWhere)
 /**
  * 判斷是否有下一頁
  */
 function hasNextPage()
 {
  return $this->_currentPage < $this->_pageCount;
 }
 /**
  * 取得下一頁頁碼
  */
 function getNextPageNo()
 {
  return $this->_currentPage + 1;
 }

 /**
  * 判斷是否有上一頁
  */
 function hasPriorPage()
 {
  if ($this->_pageCount > 0) {
   return $this->_currentPage > 1;
  } else {
   return false;
  }
 }
 /**
  * 取得上一頁頁碼
  */
 function getPriorPageNo()
 {
  return $this->_currentPage - 1;
 }

 /**
  * 判斷是否第一頁
  */
 function isFirstPage()
 {
  return $this->_currentPage == 1 || $this->_pageCount == 0;
 }

 /**
  * 判斷是否最後一頁
  */
 function isLastPage()
 {
  return $this->_currentPage == $this->_pageCount || $this->_pageCount == 0;
 }

 /**
  * 裝載某一頁資料,成功則返回true,失敗則返回false
  *
  *         有一個參數為目前記錄所有欄位的值(一個以欄位名為索引的數組)
  */
 function query($sql, $_pageSize = 0,$ispage=true)
 {   
  $this->reset();
  // global $HTTP_GET_VARS;
  // 頁大小和當前頁碼必須>=1
  $this->_currentPage = max((int)@$_GET['pageID'], 1);
  //如果不需要分頁
  if($ispage=false) $this->_currentPage=1 ;
  
  $this->_perPage = 2;
  if ($_pageSize >0) {
   $this->_pageSize = $_pageSize;
  } else {
   $_pageSize = $this->_pageSize;
  }
  
  // 解析SQL語句
  $res = $this->db->query($sql);
  if ($this->db->isError($res))
  {
   $this->_records = array() ;
    $this->_rowCount = 0;
    $this->_pageCount = 0;
    return false;
  }
  // 計算出記錄總數和頁總數
  $this->_rowCount = $res->numRows() ;
  // print_r($res->numRows()) ;//      ."test<br>" ;
  $this->_itemData = range(1, $this->_rowCount);
/*
echo $this->_rowCount;
echo "===<br>---";
echo $this->_pageSize;
*/
  $this->_pageCount = ceil($this->_rowCount / $this->_pageSize);

  if ($this->_currentPage > $this->_pageCount) {
   $this->_currentPage = $this->_pageCount;
  }

  if ($this->_rowCount == 0) {
   $this->_currentPage = 0;
   return false ;
  }
  $this->_records = array();
  
  // 將游標移動到指定頁的第一條記錄前
  $this->_currentPageStartNo = ($this->_currentPage - 1) * $this->_pageSize + 1;
  $firstRowNo = $this->_currentPageStartNo;
  while (--$firstRowNo > 0 && $res->fetchRow()) // $this->_rowCount++;
  // 取出指定頁的資料
  $read = 0;
  $this->_currentPageSize = 0;
  while ($read < $this->_pageSize && $this->_row = $res->fetchRow()) {

   $this->_currentPageSize++ ;
/*
開始 _beforeGetCurrentData事件
得到當前資料前的事件,即可對$row進行處理
*/   
   extract($this->_beforeGetCurrentData,EXTR_REFS) ;

   switch ($eventType) {
       case 'eventCode':
           if(true==$eventCode)
           {
        @eval($eventCode);        
           }              
           break ;
       case 'eventFunction':
          // print "i equals 1";

          $eventFunction($this);
           break;
       case 'eventMethod ':
           //print "i equals 2";
           break;
   }
//結束 _beforeGetCurrentData事件   
   //runEvent($this->_beforeGetCurrentData,$this);
   
   $this->_records[$this->_currentPageSize] = $this->_row;

/*
開始 _afterGetCurrentData事件
得到當前資料後的事件,即可對$this->_records[$this->_currentPageSize]進行處理
*/   

   extract($this->_afterGetCurrentData,EXTR_REFS) ;
   switch ($eventType) {
       case 'eventCode':
           if(true==$eventCode)
           {
        @eval($eventCode);        
           }              
           break ;
       case 'eventFunction':
          // print "i equals 1";
          
            $eventFunction($this);
           break;
       case 'eventMethod ':
           //print "i equals 2";
           break;
   }
//結束_afterGetCurrentData事件 

   //runEvent($this->_afterGetCurrentData,$this);
     
   //require'event.php' ;
   // $this->_rowCount++;
   $read++;
  }

  
/*
開始 _afterGetData事件
得到資料後的事件,即可對$this->_records進行處理
*/

  //runEvent($this->_afterGetData,$this);
  extract($this->_afterGetData,EXTR_REFS) ;
  switch ($eventType) {
   case 'eventCode':
    if(true==$eventCode)
   {
    @eval($eventCode);        
   }              
   break ;
   case 'eventFunction':
   // print "i equals 1";
   break;
   case 'eventMethod ':
   //print "i equals 2";
   break;
  }
//結束 _afterGetData事件  
  // 釋放資源
  return true;
 }

 /**
  * 得到頁面導航條的HTML代碼
  *
  * @return string
  * @roseuid 3CFA0B7A0151
  */
 function getPageNav()
 {
  $this->getLinks() ;
  extract($this->_option) ;
  //$nav = "共$pageCount*頁 $rowCount*條記錄 *每頁$pageSize*條 當前第$currentPage".$this->_getListLinkUrl() ."*頁   $first $back $next $last" ;  
  $nav = "共$pageCount*頁 $rowCount*條記錄 *每頁$pageSize*條 當前第".$this->_getListLinkUrl() ."*頁   $first $back $next $last" ;  
  $nav = str_replace("*", "", $nav);
  return $nav ;
 } //end function getPageNav

 /**
  * Returns the correct link for the back/pages/next links
  *
  * @return string Url
  */
 function _getLinksUrl()
 {
  // global $HTTP_SERVER_VARS;
  // Sort out query string to prevent messy urls
  $querystring = array();
  $qs = array();
  if (!empty($_SERVER['QUERY_STRING'])) {
   $qs = explode('&', $_SERVER['QUERY_STRING']);
   for ($i = 0, $cnt = count($qs); $i < $cnt; $i++) {
    list($name, $value) = explode('=', $qs[$i]);
    if ($name != 'pageID') {
     $qs[$name] = $value;
    }
    unset($qs[$i]);
   }
  }

  foreach ($qs as $name => $value) {
   $querystring[] = $name . '=' . $value;
  }

  return $_SERVER['SCRIPT_NAME'] . '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . 'pageID=';
 }

 function _getListLinkUrl()
 {
  
  $nav = '
   <select onchange="location.href=/''.$this->_getLinksUrl().'/'+this.value;">
   <script language="JavaScript">
   <!--
    for(i=1; i<='.$this->_pageCount.'; i++) {
     document.write("<option value="+i+(i=='.$this->_currentPage.'? " selected":"")+">"+i+"</option>");
    }
   //-->
   </script>
   </select>'; 
  return $nav;
 }
 
 /**
  * Returns back link
  *
  * @param  $url URL to use in the link
  * @param  $link HTML to use as the link
  * @return string The link
  */
 function _getBackLink($url, $link = '<<')
 {
  // Back link
  if ($this->hasPriorPage()) {
   $back = sprintf('<a href="%s%d" %s>%s</a>',
    $url,
    $this->_currentPage - 1,
    !empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
    $link);
  } else {
//   $back = '&nbsp;';
   $back = '上頁';
  }

  return $back;
 }

 /**
  * Returns first link
  *
  * @param  $url URL to use in the link
  * @param  $link HTML to use as the link
  * @return string The link
  */

 function _getFirtLink($url, $link = '|<<')
 {
  if ($this->isFirstPage()) {
   //$first = "&nbsp;";
   $first = "首頁";
  } else {
   $first = sprintf('<a href="%s%d" %s>%s</a>',
    $url,
    1,
    !empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
    $link);
  }
  return $first;
 }

 /**
  * Returns last link
  *
  * @param  $url URL to use in the link
  * @param  $link HTML to use as the link
  * @return string The link
  */
 function _getLastLink($url, $link = '>>|')
 {
  if ($this->isLastPage()) {
   //$last = "&nbsp;";
   $last = "尾頁";
  } else {
   $last = sprintf('<a href="%s%d" %s>%s</a>',
    $url,
    $this->_pageCount,
    !empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
    $link);
  }
  return $last;
 }

 /**
  * Returns next link
  *
  * @param  $url URL to use in the link
  * @param  $link HTML to use as the link
  * @return string The link
  */
 function _getNextLink($url, $link = '>>')
 {
  if ($this->hasNextPage()) {
   $next = sprintf('<a href="%s%d" %s>%s</a>',
    $url,
    $this->_currentPage + 1,
    !empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
    $link);
  } else {
   //$next = '&nbsp;';
   $next = '下頁';
  }

  return $next;
 }

 /**
  * Returns first/back/next/last and page links
  *
  * @param  $first_html HTML to put inside the first link
  * @param  $back_html HTML to put inside the back link
  * @param  $next_html HTML to put inside the next link
  * @param  $last_html HTML to put inside the last link
  * @return array Back/pages/next links
  */
 function getLinks($first_html = '首頁', $back_html = '上頁', $next_html = '下頁', $last_html = '尾頁')
 {
  $url = $this->_getLinksUrl();
  $first = $this->_getFirtLink($url, $first_html);
  $back = $this->_getBackLink($url, $back_html);
  // $pages = $this->_getPageLinks($url);
  $next = $this->_getNextLink($url, $next_html);
  $last = $this->_getLastLink($url, $last_html);

  $this->_option = array('url' => $url, 'pageCount' => $this->_pageCount, 'pageSize' => $this->_pageSize,
   'currentPage' => $this->_currentPage, 'rowCount' => $this->_rowCount,
   $pages, $next, $last, 'first' => $first, 'back' => $back,
   'pages' => $pages, 'next' => $next, 'last' => $last);
  return $this->_option ;
 }
 
 /**
  *
  * @return array pagerecords
  */
 function getData()
 {
  if(0==count($this->_records)){   
   return false ;
  }else{
   return $this->_records ;
  }
 }
}
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.