對(duì)于PHP的分頁(yè),已經(jīng)有很多前輩創(chuàng)造了很好的方法,我就不再多講,我主要講講利用AJAX來(lái)實(shí)現(xiàn)一種簡(jiǎn)單的方便的分頁(yè)方法,希望能起到拋磚引玉的作用~~
這個(gè)實(shí)例的重點(diǎn)需要靈活運(yùn)用AJAX,難點(diǎn)在于中文的編碼,在這些方面我積累了一些小小的經(jīng)驗(yàn),希望能和大家分享;
AJAX+PHP分頁(yè)的基本原理就是在數(shù)據(jù)庫(kù)一定的位置上取一定量的數(shù)據(jù),然后利用AJAX進(jìn)行調(diào)用.先看看PHP分頁(yè)部分:
<?php
header("Content-type: text/html;charset=GBK");//輸出編碼,避免中文亂碼
$conn = mysql_connect('localhost','root','password') or die ('Not connected : ' . mysql_error());
mysql_select_db('web', $conn) or die ('Cannot use foo : ' . mysql_error());
//mysql_query("set character set gbk");//可選,解決Mysql中文亂碼
$p = $_POST["p"];//獲取頁(yè)面編號(hào)
$result_t=mysql_query("select count(*) from `tablename`");
$total=mysql_fetch_array($result_t);
$total=$total[0];
$s = 20;//定義每頁(yè)顯示數(shù)量
$t = floor($total/$s);//總頁(yè)數(shù)
if(!$p||$p<0){$p = 0;}
if($p>$t){$p = $t;}
$pp = $s*$p;
$query="select * from `tablename` order by `id` desc limit $pp,$s";//取出相應(yīng)的數(shù)據(jù)
$result=mysql_query($query);
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
echo "<p>".$row['id']."</p>";
}
echo "共有".$total."條記錄<a href='javascript:dopages(".($p-1).")'>上一頁(yè)</a> | <a href='javascript:dopages(".($p+1).")'>下一頁(yè)</a>跳轉(zhuǎn)至<input type='text' id='pgs' />頁(yè)<input value='跳轉(zhuǎn)' type='button' onClick='dopages(".'document.getElementById("pgs").value-1);>';
?>
這樣就通過(guò)簡(jiǎn)單的方法實(shí)現(xiàn)了分頁(yè)功能,接下來(lái)就需要利用AJAX進(jìn)行調(diào)用了:
function dopages(p){
var posts = "p="+p;
var url = ajaxurl('pages.php');
function func(){
getResult('dopages');
};
sendRequest(url,posts,func);
}
function ajaxurl(adDiv){
var baseurl = "http://9899v.com/" + adDiv;
return baseurl;
}
function getajax(){
var xmlhttp = false;
if(window.ActiveXObject){
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function sendRequest(url,posts,func){
ajax = getajax();
ajax.onreadystatechange = func;
ajax.open('POST', url, true);
ajax.setRequestHeader("Content-Length",posts.length);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send(posts);
}
/*------------Try-------------*/
var Try = {
these: function() {
var returnValue;
for (var i = 0; i < arguments.length; i++) {
var lambda = arguments;
try {
returnValue = lambda();
break;
} catch (e) {}
}
return returnValue;
}
}
function tryCollectGarbage(){
return Try.these(
function() {return CollectGarbage();},
function() {return false;}
);
}
function getResult(adDiv,num){
if (ajax.readyState < 4) {
document.getElementById("loading").style.visibility = "visible";
}
else if (ajax.readyState == 4) {
document.getElementById("loading").style.visibility = "hidden";
if (ajax.status == 200){
var result = ajax.responseText;
if(adDiv=="dopages"){
document.getElementById('xpages').innerHTML = result;
}
}
else {
alert("出錯(cuò)");
delete ajax;
tryCollectGarbage();//垃圾回收
}
}
}
在這個(gè)簡(jiǎn)單的實(shí)例中為什么要用ajaxurl,sendRequest,getResult函數(shù)封裝而不是直接寫(xiě)出代碼呢?呵呵,因?yàn)槲业倪@個(gè)PHP+AJAX的分頁(yè)程序是一個(gè)綜合系統(tǒng)中的一部分,我只是講了其中的這一段,所以原汁原味的保留了,相信大家也可以看懂.其實(shí)另外一個(gè)重要原因是希望可以傳輸一些代碼重用的知識(shí),而且這種方法易于維護(hù),特別是對(duì)于大型系統(tǒng)來(lái)說(shuō),可以節(jié)省很多時(shí)間.
經(jīng)測(cè)試以上代碼均可正常使用!