php+mysql分頁處理的探討
2024-07-24 12:56:32
供稿:網(wǎng)友
php+mysql分頁處理的探討
常見的分頁處理流程為:
1、用select count(*) from tbl_name取得待分頁的總記錄數(shù)
2、根據(jù)每頁的記錄數(shù)計算出總頁數(shù):總頁數(shù) = ceil(總記錄數(shù)/每頁記錄數(shù))
3、根據(jù)當(dāng)前頁號計算出起始位置:起始位置 = (當(dāng)前頁號-1)*每頁記錄數(shù)
4、用select * from tbl_name limit 起始位置,每頁記錄數(shù) 取得待顯示記錄
5、列表輸出相關(guān)信息
在這個流程中,數(shù)據(jù)庫需要兩次遍歷表才能得到所需數(shù)據(jù)。盡管limit會在得到指定記錄數(shù)后會終止遍歷,但前面直到“起始位置”的檢索是浪費掉的。
這里提出一種新算法與大家討論:
1、利用mysql的用戶變量,分割并提取每頁起始的id號。
2、查詢結(jié)果的記錄數(shù)即為總頁數(shù)
3、根據(jù)當(dāng)前頁號取得當(dāng)前頁的起始id
4、用select * from tbl_name where id>=起始id limit 每頁記錄數(shù) 取得待顯示記錄
5、列表輸出相關(guān)信息
可以看到,在后一次查詢中。由于利用了id作為主鍵的特征,數(shù)據(jù)庫可直接定位到所需記錄。從而減少了查詢時間。
這個查詢算法有一個副產(chǎn)品:可以產(chǎn)生一條用于銜接上下頁的重復(fù)記錄,也就是各頁間有一條重疊的記錄。當(dāng)然,去掉他也是很容易的。
以下是測試代碼:
<?php
include "mysql_result_all.inc"; // 用于顯示查詢結(jié)果的工作函數(shù)
$pagesize = 9; // 每頁行數(shù)
$type = 1; // =1降序排列
$mode = 0; // =1不重復(fù)上頁最后一條記錄
$conn = mysql_connect(); // 連接mysql
mysql_select_db("site"); // 選擇數(shù)據(jù)庫
// 準(zhǔn)備動態(tài)修改查詢串
if($type) {
$order = "desc";
$expr = "<=";
}else {
$order = "";
$expr = ">=";
}
if($mode) $pagesize++;
mysql_query("set @v:=-1"); // 定義mysql用戶變量
$rs = mysql_query("select @v:=(@v+1) as xh, id from data having mod(xh,$pagesize)=0 order by id $order");
mysql_result_all($rs); // 檢查各頁分布
echo $pages = mysql_num_rows($rs); // 取得總頁數(shù)
if($mode) $pagesize--;
// 測試分頁結(jié)果,$i表示顯示頁
for($i=0;$i<$pages;$i++) {
mysql_data_seek($rs,$i); // 移動結(jié)果集指針
list($xh,$id) = mysql_fetch_row($rs); // 取得起始id
echo "<br>[$i] $xh -- $id";
$rs1 = mysql_query("select * from data where id$expr$id order by id $order limit $pagesize");
mysql_result_all($rs1); // 顯示相關(guān)結(jié)果
}
?>
mysql_result_all.inc
這個函數(shù)我貼過多次了,對調(diào)試程序非常有用的。
<?
function mysql_result_all($result,$format="") {
echo "<table $format><tr>";
for($i=0;$i<mysql_num_fields($result);$i++) {
echo "<th>".mysql_field_name($result,$i)."</th>";
}
echo "</tr>";
while($row = mysql_fetch_row($result)) {
echo "</tr>";
for($i=0;$i<mysql_num_fields($result);$i++) {
echo "<td>".$row[$i]."</td>";
}
echo "</tr>";
}
echo "</table>";
}
?>