給何版主, 機(jī)器民主與lilyxie: 對(duì)于分頁(yè)機(jī)制.
發(fā)表時(shí)間:2024-06-16 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1. 分頁(yè)的前提是記錄按id排序, 且不連續(xù), 比如有些記錄被刪除, 或者要分頁(yè)顯示查找結(jié)果, 這樣就有了除分頁(yè)外的條件q2. 確定分頁(yè)的方式: (1): 用簡(jiǎn)單的"頁(yè)首, 上一頁(yè), 下一頁(yè)". (2): 用"1,2,3,4,5,6,..........末尾&qu...
1. 分頁(yè)的前提是記錄按id排序, 且不連續(xù), 比如有些記錄被刪除,
或者要分頁(yè)顯示查找結(jié)果, 這樣就有了除分頁(yè)外的條件$q
2. 確定分頁(yè)的方式:
(1): 用簡(jiǎn)單的"頁(yè)首, 上一頁(yè), 下一頁(yè)".
(2): 用"1,2,3,4,5,6,..........末尾"來(lái)指定跳到某頁(yè).
3. 實(shí)現(xiàn)分析:
(1) 如果先查詢?nèi)拷Y(jié)果, 只顯示其中的部分. 這種方式顯然不好,
會(huì)累壞server.
(2) 對(duì)于用limit m,n實(shí)現(xiàn)分頁(yè), 有些不負(fù)責(zé), 服務(wù)器在實(shí)際操作時(shí)還是
按$q條件找出所有結(jié)果, 然后只返回m后的n條. server工作仍然很多.
(3) 優(yōu)化的辦法是知道要顯示頁(yè)的起始$id, 查詢
"where $q and id>=$id order by id desc limit 0,$page_length"
這樣mysql 會(huì)先按id的索引找到符合條件的id, 然后再評(píng)估$q.
(4) 那$id怎么來(lái)呢?
(5) 對(duì)于顯示方式1, 每頁(yè)多查詢一條,最后一個(gè)記錄的$id就是啦
"where $q and id>=$id order by id limit 0,$page_length+1"
if (mysql_num_rows($result) > $page_length) echo "下一頁(yè)"
//(記住最后一條記錄不要顯示!)
//如果不使用第二種分頁(yè)方式, 到此結(jié)束.
(5) 對(duì)于顯示方式2, 后面$page_offset=6頁(yè)的每頁(yè)起始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>"; //加重顯示當(dāng)前頁(yè)號(hào)
else echo $i;
echo "</a>";
}
(6)也許有人要問(wèn)server不是按$q條件把所有這幾頁(yè)都搜一遍了嗎?
和"limit 0,$page_length*$pageno"有什么區(qū)別? 直接用$pageno哪有$id這么麻煩?
答案是可以利用session功能存起來(lái)這個(gè)結(jié)果, 如果$q沒(méi)有變, 就可以直接調(diào)用,
省得每次換頁(yè)都折騰數(shù)據(jù)庫(kù).
加上后續(xù)頁(yè)面判斷, 上面的例子就變成:
//如果$q沒(méi)有變化
$page_offset=6;
session_register($ids);
if (!$ids){//后序頁(yè)面不會(huì)執(zhí)行
"select id from xxxx where $q order by id desc limit 0,$page_length*$page_offset+1";//判斷有無(wú)后序頁(yè)面
for($i=0;$i*$page_length<$mysql_num_rows($result);$i++){
$ids[]=mysql_result($result,$i*$page_length,0);
}
}
//有樂(lè)$ids......
for ($i=0;$i<$page_offset;$i++){
echo '<a href="xxxxx?id="$ids[$i].'">';
if ($d==$ids[$i]) echo "<b>$i</b>"; //加重顯示當(dāng)前頁(yè)號(hào)
else echo $i;
echo "</a>";
}
//下面這句自由發(fā)揮, 可以切換到分頁(yè)模式1
if ($ids[$page_offset])
echo '<a href="xxxx?pageno='.($pageno+1).'&id='.$ids[$page_offset].">....</a>';
(8) 以上結(jié)果稍加改動(dòng), 可以session_resiter($pageno), 來(lái)記錄當(dāng)前是第幾
大頁(yè). 類(lèi)似快進(jìn)功能.
(7) 不知道php4正式版是否支持session中存放數(shù)組, 如果不行建議用
implode/explode來(lái)變成字串保存.
(8) 這種方式的優(yōu)點(diǎn)應(yīng)該是速度快, 但缺點(diǎn)是不知道總共符合$q條件的數(shù)量.
對(duì)于搜索龐大的數(shù)據(jù)庫(kù)應(yīng)該有用.
(9) 實(shí)現(xiàn)"跳至末尾", 可以在以上sql語(yǔ)句中 order by id, 不要desc. 同理可實(shí)現(xiàn)
前面第N頁(yè).
4 以上代碼還都是設(shè)想, 希望各位多多指正.
5 本文中心思想是利用id索引和id的偏移來(lái)快速查找后序內(nèi)容, 節(jié)省數(shù)據(jù)庫(kù)開(kāi)銷(xiāo).