程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> mysql 分頁類三

mysql 分頁類三

編輯:關於MYSQL數據庫

這個類是迫於無奈才寫的 ,有個平朋友才學PHP 不會使用MySQLi 和PDO ,但項目中估計要用到分頁,所以仿照 前面兩個版本才寫了這個類;

說明點,PHP中 mysql_系列方法的效率比較低,就是開發,調試或示例應用中用,正規的產品中不要使用該系列的方法,最好使用pdo,adodb,mysqli和mysqlnd(mysql native driver)這幾個的效率都好於MySQL_系列方法,還有一個 MySQL_pconnect() 方法可以獲取一個持久連接(參看PHP手冊)做為連接句柄傳遞給MySQL_系列方法效率也高於常規連接,這個有人做過測試(性能和Java中的鏈接池相仿)。

其他兩個版本的分頁類可以參考下 MySQLi版的那個 效率還需要優化下(主要在查詢總記錄數那裡),下面就給出該類,用法附於後面:

<?PHP * Description of PageUtil4MySQL
* 用於mysql_系列的分頁類 另外兩個分別用於MySQLi和PDO
* 這個類還可以改用 pconnect 持久連接
* @author yiqing95 class PageUtil4MySQL {

private $pageSize;//每一頁顯示的行數;    * 當前頁碼
   * @var int public $currPageNum;//頁碼,要顯示那一頁的數據    * 當前頁的記錄數
   * @var int public $countOfCurrPage;//當前頁的數據量    * 當前頁的結果集
   * @var int private $resultList;//指定頁的結果集    * 總頁數
   * @var int public $totalPageNum;//總頁數    * 總記錄數
   * @var int public $totalRecordNum;//總共的記錄數    * 當前頁的第一條記錄,是本次查詢的第幾條
   * 比如每頁十條記錄 ,那麼第二頁,開始行號邏輯上就是11
   * @var int public $startRowNum;//從行開始

public $errorMsg;//錯誤消息

/**構造函數*/
public function __construct($pageSize=10) {
    $this->pageSize=$pageSize;//默認每頁顯示10行數據、
}

//設置每頁顯示的數據行數
public function setPageSize($pageSize) {
    $this->pageSize=$pageSize;
    return $this;
}

   *   //要獲取第N頁的數據
   * @param number $pageNum 第幾頁數據
   * @param string $selectStr select查詢語句
   * @param int $fetchStyle 取數據的方式,三種,關聯,數字,都可以, MYSQL_NUM MySQLI_BOTH;默認是關聯方式取
   * @return array 返回指定頁的數據 public function resultListOfPage($pageNum,$selectStr,$fetchStyle=MySQLI_ASSOC) {     if(!empty($this->resultList)) {
        unset ($this->resultList);//如果結果不空清除之,防止影響收集      */
    $this->resultList = null;
    $this->resultList = array();
    $this->currPageNum=$pageNum;//當前頁數是
    //不知 下面的函數是否會修改傳遞進去的select語句
    $totalRowNum = $this->getRowCount($selectStr);//計算出總行數
    $this->totalRecordNum=$totalRowNum;//總行數;
    if($totalRowNum>0) {
      // echo "總行數:$totalRowNum";
      $this->totalPageNum=ceil($totalRowNum/$this->pageSize);//計算總頁數
      //接下來判斷pageNum是否越界,或者傳遞了一個非數字的東東:
      if(!is_numeric($pageNum) or $pageNum<=0 or $pageNum> $this->totalPageNum) {

        $pageNum=1;//越界則讓其默認取第一頁數據
        $this->currPageNum=$pageNum;       //echo "總頁數 $this->totalPageNum";       $this->startRowNum=($pageNum-1)*$this->pageSize;       $selectStr .= " limit $this->startRowNum ,$this->pageSize";

      //echo "最終生成的select語句是:$selectStr";

    try{
      $rs = MySQL_query($selectStr);
      while($row = MySQL_fetch_array($rs, $fetchStyle)){
        $this->resultList[] = $row;       MySQL_free_result($rs);//關閉游標
       $rs = null;
      }catch(Exception $ex){
        throw $ex;       //當前頁的數據量
      $this->countOfCurrPage=count($this->resultList);
    }     return $this->resultList; //計算總記錄數:
//思路 換掉所有位於select 與 from之間的東西,
//移除order by後的東西 ,出現select 嵌套現象未測試!
   private function getRowCount($selectStr) {
      $selectStr = trim($selectStr); //緊身以下
      $selectStr = preg_replace('~^SELECT\s.*\sFROM~s', 'SELECT COUNT(*) FROM',
              $selectStr);
      $selectStr = preg_replace('~ORDER\s+BY.*?$~sD', '', $selectStr);
      $rs = MySQL_query($selectStr);
      $row = mysql_fetch_array($rs,MySQL_NUM);
      MySQL_free_result($rs);//釋放結果集
      return $row[0]; }

?>

用法說明:如果使用smarty模板用這個類效果很好,如果不使用模板感覺代碼較凌亂:
<?PHP

//查詢用的語句可隨意構造 這裡是以id 降序排列的起始 就等價於 時間降序
$selectStr = "SELECT * FROM users ORDER BY id DESC";

//構造分頁類:
$pageUtil = new PageUtil4MySQL($pageSize); $rsltList = $pageUtil->resultListOfPage($page, $selectStr);
$totalPage = $pageUtil->totalPageNum; //總頁數
$currPageNum = $pageUtil->currPageNum;//當前頁號
$totalRecordNum = $pageUtil->totalRecordNum;//總共的記錄數
$currPageNum = $pageUtil->currPageNum;//當前頁數的大小,這個是用在比如最後一頁,記錄數不足分頁時查看
?>

<?PHP include 'public/header.Html'; ?>
    <meta http-equiv="Content-Type" content="text/Html; charset=UTF-8">
    <script type="text/Javascript" charset="UTF-8">
      function turnToPage(page){
               if(page > "<?PHP echo $totalPage;?>"){                  alert("first page");return;
               }

              if(parseInt(page,10) < 1){
                 /// 自己轉碼alert("這個是第一頁了");return;
                 alert("last page");return;
               }

               window.location = "listPage_table.php?pageSize=<?PHP echo $pageSize; ?>&page="+page;
      }

      //沒有相片時會加載這個的 你隨便給一個圖片路徑:比如暫無照片的gif圖片就行了
      function noPicture(img){
        img.src = "public/images/bj.jpg";     </script>

     <?PHP if($totalPage > 1){
        $prePage = $currPageNum-1;
        $nextPage = $currPageNum + 1;
        $pageHeader = "
     <div style=\"width:100%; text-align:center;\">
       總共有 {$totalPage} 頁 &nbsp; 當前是第 {$currPageNum}頁&nbsp;&nbsp;&nbsp;&nbsp;
       共有&nbsp;{$totalRecordNum}&nbsp;幅照片
       <a href=\"Javascript:turnToPage('1')\">首&nbsp;&nbsp;頁</a>&nbsp;&nbsp;&nbsp;
       <a href=\"Javascript:turnToPage('{$prePage}')\">上一頁</a>&nbsp;&nbsp;&nbsp;
       <a href=\"Javascript:turnToPage('{$nextPage}')\">下一頁</a>&nbsp;&nbsp;&nbsp;

       <a href=\"Javascript:turnToPage('{$totalPage}')\">尾&nbsp;&nbsp;頁</a>
      </div>";
       echo iconv("GBK","UTF-8", $pageHeader);
     }?>

<?PHP              foreach($rsltList as $userInfor){                       echo "
                  <tr>
                     <td>
                          {$userInfor['relationship']}
                     </td>
                     <td>
                          {$userInfor['name']}
                     </td>
                     <td>
                          {$userInfor['telephone']}
                     </td>
                     <td>
                          {$userInfor['relationship']}
                     </td>
                     <td>
                         <img src ='{$userInfor['photo']}s' onerror='noPicture(this)'/>
                     </td>

                  </tr>              }
    ?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved