尤記得,十年前剛畢業第一份工作,為了寫分頁寫不出來,晚上睡覺都會被分頁嚇醒的青春肉體時代(不要懷疑,我也有過青春阿) 
恨透了分頁 (其實現在想想,好像是很簡單的一段程式。卻讓潔西卡睡不著~我真是清純丫) 

於是,有空時會到網路上去找好用的分頁物件,但是發現,都不好用丫。
有的寫的太覆雜,會讓程式長太胖的感覺,有的會對資料庫做多次查詢造成系統的負荷~
於是終於受不鳥啦~ 我在8年前寫了一個超級好用的分頁函數 , 不是程式寫的好,而是超輕量,不會對資料庫造成負荷,程式碼也是短短的~~~
這一用就用了8年丫~ 今天會想到他,是因為有人要求我改成十頁十頁SHOW~ 然後,接手別人的程式,看到他也為分頁深深困擾,居然在每一支查詢的程式內都放有分頁的程式碼。

所以我改了我的函數,另外在這裡分享一下,順便妶耀一下,老娘8年前寫的好物~。看不懂的。就略過吧




Call sample:
#計算筆數先
$offset = $_REQUEST["offset"] == "" ? 0 ; $_REQUEST["offset"];
$mrows = $conn->Execute("select count(a_account) as T from $TABLE_NAME $WHERE_STR ");
$mrow = $mrows->FetchObject();
$numrows = $mrow->T;
$pagestr = pages($numrows, $offset, $num_of_rows_per_page,"type=$type","no9", 2);
print $pagestr; // 印出分頁
$rows = $conn->SelectLimit($sql,$num_of_rows_per_page,$offset);
while ($row = $rows->fetchRow()) {
// 略 這裡是SHOW 資料
}
print $pagestr; // 印出分頁

 

結束
############# 下面是函數 弄成一個INCLUDE FILE 吧 ############
function pages($total_rows, $offset, $limit_row,$url_str='', $class="page", $mod="2") {
$current_page = ($offset/$limit_row) + 1;
$total_pages = ceil($total_rows/$limit_row);
if ($mod == "1") {
$current_page = ($offset/$limit_row) + 1;
$total_pages = ceil($total_rows/$limit_row);
$str2 = "";
if ($offset != 0) $str2 .="| <a href=\"$PHP_SELF?offset=0&$url_str\" class=\"$class\">FirstPage</a> | ";
if (($offset - $limit_row) >= 0) {
$prev_offset = $offset - $limit_row;
$str2 .= " <a href=\"$PHP_SELF?offset=$prev_offset&$url_str\" class=\"$class\">Previous</a> | ";
}
$str2 .= " [ $current_page / $total_pages ] ";
$last_row = (($total_pages-1) * $limit_row);
if (($offset + $limit_row) < $total_rows) {
$next_offset = $offset + $limit_row;
$str2 .= "<a href=\"$PHP_SELF?offset=$next_offset&$url_str\" class=\"$class\">NEXT</a> | ";
$str2 .= "<a href=\"$PHP_SELF?offset=$last_row&$url_str\" class=\"$class\">LastPage</a> | ";
}
}
elseif ($mod == "2") {

$str2 = "";
$i = ceil($current_page / 10 ) - 1 ;

if ($i >= 1 ) {
$of = max(0, $offset - ( $limit_row * 10)) ;
$str2.= "<a href=\"$PHP_SELF?offset=$of&$url_str\" class=\"$class\">上10頁</a> ";
}
$a=min($total_pages, ($i*10)+10);
for ($i = 1+($i*10); $i <= $a; $i++) {
$of = $i * $limit_row - $limit_row;
if ($i == $current_page)
$str2.= "[ $i ] ";
else
$str2.= "<a href=\"$PHP_SELF?offset=$of&$url_str\" class=\"$class\">$i</a> ";
}
if ($i < $total_pages ) {

$of = min($total_rows, $offset + ( $limit_row * 10));
$str2.= "<a href=\"$PHP_SELF?offset=$of&$url_str\" class=\"$class\">下10頁</a>";
}
}
else {
$str2 = "Page:";
for ($i =1; $i <= $total_pages; $i++) {
$of = $i * $limit_row - $limit_row;
if ($i == $current_page)
$str2.= "[ $i ] ";
else
$str2.= "<a href=\"$PHP_SELF?offset=$of&$url_str\" class=\"$class\">$i</a> ";
}

}
return "<span class=$class>$str2</span>";
}





=====================
2015/07/02 update 搭配bootstrap 的CSS . 超好用

function pages($total_rows, $offset, $limit_row, $url_str='')
{
    $current_page = ($offset/$limit_row) + 1;
    $total_pages = ceil($total_rows/$limit_row); 

    $str2 .= "<nav>";
    $str2 .= '<ul class="pagination">';

    if (($offset - $limit_row) >= 0) {
        $prev_offset = $offset - $limit_row;
        $str2 .= '<li>';
        $str2 .= "<a href=\"$PHP_SELF?offset=$prev_offset&$url_str\" aria-label=\"Previous\">";
        $str2 .= '<span aria-hidden="true">&laquo;</span>';
        $str2 .= '</a>';
        $str2 .= '</li>';
    } else { 
        $str2 .= '<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>';
    }


    for ($i =1; $i <= $total_pages; $i++) {
        $of = $i * $limit_row - $limit_row;
        if ($i == $current_page)
            $str2.= "<li class=\"active\"><a href=\"#\">$i</li>";
        else
            $str2.= "<li><a href=\"$PHP_SELF?offset=$of&$url_str\">$i</a></li>";
        }
       if (($offset + $limit_row) < $total_rows) {

           $next_offset = $offset + $limit_row;
           $str2 .= "<li>";
           $str2 .= "<a href=\"$PHP_SELF?offset=$next_offset&$url_str\" aria-label=\"Next\">";
           $str2 .= "<span aria-hidden=\"true\">&raquo;</span>";
           $str2 .= "</a>";
           $str2 .= "</li>";
       } else {
           $str2 .= '<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>';
       }
       $str2 .= "</ul>";
       $str2 .= "</nav>";


       return $str2;

}


peeress 發表在 痞客邦 PIXNET 留言(7) 人氣()


留言列表 (7)

發表留言
  • zer931
  • 感謝大大無私分享
    最近剛入門PHP 正為分頁煩惱中
    快來研究大大的寫阿
  • zer931
  • 大大
    你好 我研究了
    卡在$conn 這東西上
    是否可以分享一下這物件 XD
  • $conn 是 adodb 的object
    如果你沒有使用adodb
    你應該是要改成

    $mrows = $conn->Execute("select count(a_account) as T from $TABLE_NAME $WHERE_STR ");
    $mrow = $mrows->FetchObject();
    $numrows = $mrow->T;
    上面這三行程式.

    你要改成下面


    $mrows = mysql_query("select count(a_account) as T from $TABLE_NAME $WHERE_STR);
    $mrow = mysql_fetch_object($mrow);
    $numrows = $mrow->T;

    peeress 於 2013/01/10 17:55 回覆

  • zer931
  • HI 你好 研究出來了 效果好讚阿
    順便修正一下
    $mrow = mysql_fetch_object($mrow); 裡面是放$mrows
    對吧 ^^
    而且托你所福,我還知道有adodb這好東西
    感謝你囉 祝新年快樂
  • ADODB 是好物, 他可以連結很多種不同的db 
    如果你可以養成. 用他的  SELECT LIMIT 的 好習慣的話.
    (還有注意欄位大小寫--最好全部使用大寫)
    將來你的系統 就可以跨DB .
    只要把 最前面資料庫種類換掉, 那就可以輕鬆的換DB 了 .

    peeress 於 2013/01/14 08:43 回覆

  • kai
  • 感謝清純的潔西卡小姐的分享!!~~
    小弟我也研究了好久但是卡在$conn->SelectLimit($sql,$num_of_rows_per_page,$offset);這一段上,
    我知道這段的意思是用來限制筆數的,但是我想嘗試不經過odbc直接連mysql的語法,
    但是我找不到適用的函數只能在SQL語法上加上limit,不知道潔西卡可以解答我的疑惑嗎??
    謝謝。 ^^
  • peeress
  • 若不使用 adodb 當然就是使用sql 語法加上 limit 囉.
    因為 adodb 的 selectlimt 也只是把你的sql 語法.轉換成適當的 limit 語法.
    再去執行查詢
    例如 : mysql 是用 limit / mssql 是用 top

  • phpboy
  • 想請問一下 我也是被分頁困擾很久
    我是SQLSRV PHP 套用許多邏輯想法結果都行不通~
    想請問一下該如何撰寫??!
  • @@? 把上面程式套上去就可以動了...

    peeress 於 2014/08/19 12:20 回覆

  • 訪客
  • 您好:
    我執行後,在include此函數後,出現錯誤訊息:

    Notice: Undefined variable: PHP_SELF in D:\project\lend\Code\system\dividepage.php on line 37

    我查了第 37行,該行是:
    $str2.= "<a href=\"$PHP_SELF?offset=$of&$url_str\" class=\"$class\">$i</a> ";
    不知道錯在哪裡!
    麻煩您了!
  • HIHI,

    這程式是10多年前寫的,
    那時PHP 沒有那嚴謹, XD~~

    你的錯誤訊息是...Notice... 也就是變數沒有定義, 你可以在函數最上方.把變數名稱先做一個定義喔.
    或者不專業點, 把Notice 關掉...XD~

    peeress 於 2015/06/17 02:49 回覆