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的偏移來快速查找后序內容, 節省數據庫開銷.
|