給何版主, 機器民主和lilyxie: 關於分頁機制.

來源:互聯網
上載者:User
分頁 1. 分頁的前提是記錄按id排序, 且不連續, 比如有些記錄被刪除,
   或者要分頁顯示尋找結果, 這樣就有了除分頁外的條件$q
2. 確定分頁的方式:
(1): 用簡單的"頁首, 上一頁, 下一頁".
(2): 用"1,2,3,4,5,6,..........末尾"來指定跳到某頁.
3. 實現分析:
(1) 如果先查詢全部結果, 只顯示其中的部分. 這種方式顯然不好,
    會累壞server.
(2) 對於用limit m,n實現分頁, 有些不負責, 伺服器在實際操作時還是
    按$q條件找出所有結果, 然後只返回m後的n條. server工作仍然很多.
(3) 最佳化的辦法是知道要顯示頁的起始$id, 查詢
   "where $q and id>=$id order by id desc limit 0,$page_length"
   這樣mysql 會先按id的索引找到合格id, 然後再評估$q.
(4) 那$id怎麼來呢?
(5) 對於顯示方式1, 每頁多查詢一條,最後一個記錄的$id就是啦
    "where $q and id>=$id order by id limit 0,$page_length+1"
    if (mysql_num_rows($result) > $page_length) echo "下一頁"
   //(記住最後一條記錄不要顯示!)
   //如果不使用第二種分頁方式, 到此結束.
(5) 對於顯示方式2, 後面$page_offset=6頁的每頁起始id要一次知道.
"select id from xxxx where $q order by id desc limit 0,$page_length*$page_offset"
for($i=0;$i*$page_length<$mysql_num_rows($result);$i++){
    $start=mysql_result($result,$i*$page_length,0);
    echo '<a href="xxxxx?pageno='.($i+1)."&id=$start\">";
    if ($id==$start) echo "<b>$i</b>"; //加重顯示當前頁號
    else echo $i;
    echo "</a>";
}
(6)也許有人要問server不是按$q條件把所有這幾頁都搜一遍了嗎?
和"limit 0,$page_length*$pageno"有什麼區別? 直接用$pageno哪有$id這麼麻煩?
答案是可以利用session功能存起來這個結果, 如果$q沒有變, 就可以直接調用,
省得每次換頁都折騰資料庫.
加上後續頁面判斷, 上面的例子就變成:
//如果$q沒有變化
$page_offset=6;
session_register($ids);
if (!$ids){//後序頁面不會執行
    "select id from xxxx where $q order by id desc limit 0,$page_length*$page_offset+1";//判斷有無後序頁面
    for($i=0;$i*$page_length<$mysql_num_rows($result);$i++){
        $ids[]=mysql_result($result,$i*$page_length,0);
    }
}
//有樂$ids......
for ($i=0;$i<$page_offset;$i++){
    echo '<a href="xxxxx?id="$ids[$i].'">';
    if ($d==$ids[$i]) echo "<b>$i</b>"; //加重顯示當前頁號
    else echo $i;
    echo "</a>";
}
//下面這句自由發揮, 可以切換到分頁模式1
if ($ids[$page_offset])
    echo '<a href="xxxx?pageno='.($pageno+1).'&id='.$ids[$page_offset].">....</a>';
(8) 以上結果稍加改動, 可以session_resiter($pageno), 來記錄當前是第幾
大頁. 類似快進功能.
(7) 不知道php4正式版是否支援session中存放數組, 如果不行建議用
implode/explode來變成字串儲存.
(8) 這種方式的優點應該是速度快, 但缺點是不知道總共符合$q條件的數量.
對於搜尋龐大的資料庫應該有用.
(9) 實現"跳至末尾", 可以在以上sql語句中 order by id, 不要desc. 同理可實現
前面第N頁.
4 以上代碼還都是設想, 希望各位多多指正.
5 本文中心思想是利用id索引和id的位移來快速尋找後序內容, 節省資料庫開銷.



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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