提到分頁(yè),大家都不陌生寒随,在我們?nèi)粘g覽網(wǎng)頁(yè)時(shí)常遇到,尤其新聞文章列表等都有分頁(yè)帮坚,如下圖所示:
下面妻往,通過(guò)一個(gè)實(shí)例為大家剖析一下分頁(yè)原理上技術(shù)細(xì)節(jié)。
一试和、功能開(kāi)發(fā)思路
在分頁(yè)功能的實(shí)現(xiàn)前讯泣,先做了一個(gè)思維導(dǎo)圖理清一下大概的思路,廢話不多說(shuō)阅悍,上圖:
二好渠、功能開(kāi)發(fā)各模塊介紹
用到的工具有,輕量級(jí)編輯器editplus节视,mysql數(shù)據(jù)庫(kù)管理工具phpmyadmin拳锚,環(huán)境為windows 7下Apache+PHP+Mysql。
下面寻行,給大家分享一下霍掺,運(yùn)用php、mysql如何實(shí)現(xiàn)如上分頁(yè)效果拌蜘。
1.mysql數(shù)據(jù)庫(kù)的創(chuàng)建準(zhǔn)備
在設(shè)計(jì)這個(gè)功能時(shí)杆烁,創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)"fenye",表名為"people"简卧,設(shè)定了字段——序號(hào)(id连躏,為主鍵,自增)贞滨,姓名(name)入热,性別(sex)拍棕,如下圖:
2.php功能實(shí)現(xiàn)介紹
php功能頁(yè)面,設(shè)計(jì)了三個(gè)——公共調(diào)用頁(yè)conn.php勺良,添加信息頁(yè)add.php绰播,信息列表頁(yè)list.php。下面來(lái)做各功能頁(yè)面的技術(shù)細(xì)節(jié)分析尚困。
(1).公共調(diào)用頁(yè)conn.php
該功能頁(yè)面主要實(shí)現(xiàn)數(shù)據(jù)庫(kù)及表的連接蠢箩,數(shù)據(jù)庫(kù)編碼的設(shè)定,代碼如下:
<?php
@mysql_connect("localhost:3306","數(shù)據(jù)庫(kù)用戶名","數(shù)據(jù)庫(kù)密碼")or die("mysql連接失敗"); //mysql連接
@mysql_select_db("fenye")or die("db連接失敗"); //數(shù)據(jù)庫(kù)"fenye"連接
mysql_query("set names gbk"); //數(shù)據(jù)庫(kù)編碼設(shè)置為gbk
?>
注解
- @ 符號(hào)用于屏蔽因mysql連接失敗時(shí)報(bào)錯(cuò)顯示的mysql信息事甜,出于用戶體驗(yàn)和安全性考慮谬泌;
- die()函數(shù):用于mysql數(shù)據(jù)庫(kù)連接失敗時(shí)拋出錯(cuò)誤提示信息,其中內(nèi)容自定義逻谦。
(2).添加信息頁(yè)add.php
該功能頁(yè)面主要向數(shù)據(jù)庫(kù)內(nèi)添加信息記錄掌实,核心功能代碼為插入sql語(yǔ)句,完整代碼如下:
<?php
include("conn.php"); //調(diào)用conn.php
if(!empty($_POST["subs"])){ //判斷subs數(shù)據(jù)是否提交
$user=$_POST["user"]; //將表單提交上來(lái)的姓名user賦值給$user
$sex=$_POST["sex"]; //將表單提交上來(lái)的性別sex賦值給$sex
$sql="insert into `people` (`id`,`name`,`sex`) values (null,'$user','$sex')"; //插入sql語(yǔ)句
echo mysql_query($sql) ? "<script language='javascript'>alert('插入成功');</script>" : mysql_error();
//三元判斷語(yǔ)句邦马,執(zhí)行成功返回js腳本提示信息贱鼻,不成功拋出錯(cuò)誤提示mysql_error()
}
?>
<div class="nav">
<a href="add.php">添加信息</a>
</div>
<div class="main">
<form action="add.php" method="post">
姓名:<input type="text" name="user" /><br/><br/>
性別:<input type="text" name="sex" /><br/><br/>
<input type="submit" name="subs" value="保存"/>
</form>
</div>
注解
- 三元判斷語(yǔ)句:條件 ? 結(jié)果1 : 結(jié)果2——成功執(zhí)行結(jié)果1,失敗執(zhí)行結(jié)果2
- mysql_error()函數(shù)用于返回上一個(gè)mysql操作產(chǎn)生的文本錯(cuò)誤信息提示
(3)信息列表頁(yè)list.php
該頁(yè)主要功能用于呈現(xiàn)信息列表滋将,并實(shí)現(xiàn)分頁(yè)功能邻悬,先上完整代碼,如下:
<div class="nav">
<a href="add.php">添加信息</a>
</div>
<div class="main">
<table cellspacing="0" cellpadding="10" border="1" bordercolor="#cccccc" />
<tr><td>序號(hào)</th><th>姓名</th><th>性別</th></tr>
<?php
include("conn.php"); //調(diào)用conn.php頁(yè)面
$pagesize=5; //設(shè)定每頁(yè)記錄顯示5條
$url=$_SERVER["REQUEST_URI"]; //獲取當(dāng)前文件完整url随闽,賦值給$url
$url=parse_url($url); //將當(dāng)前$url按照組成部分轉(zhuǎn)換為數(shù)組父丰,賦值給$url
$url=$url[path]; //獲取當(dāng)前$url的路徑,賦值給$url
$numq=mysql_query("select * from `people`"); //查詢表`people`內(nèi)所有記錄掘宪,賦值給$numq
$num=mysql_num_rows($numq); //獲取$numq的總條數(shù)蛾扇,賦值給$num
if($_GET["page"]){ //判斷當(dāng)前頁(yè)參數(shù)'page'是否存在,存在執(zhí)行以下代碼
$pageval=$_GET["page"]; //將參數(shù)'page'賦值給$pageval
$page=($pageval-1)*$pagesize; //執(zhí)行分頁(yè)公式添诉,將值賦值給起始值$page
$page.=","; //連接字符','
}
if(is_integer($num/$pagesize)){ //判斷總頁(yè)碼是否為整數(shù)屁桑,若為整數(shù)執(zhí)行以下代碼
$sumpage=$num/$pagesize;
}else{
$sumpage=intval($num/$pagesize)+1; //總頁(yè)碼不為整數(shù),取整然后+1
}
for($i=1;$i<=$sumpage;$i++){ //循環(huán)打印頁(yè)碼
if($i==$pageval){ //當(dāng)前頁(yè)碼不加超鏈接
$pagenum.=$i." ";
}else{
$pagenum.="<a href=$url?page=".$i.">".$i."</a> ";
}
}
if($num>$pagesize){ //若總條數(shù)大于每頁(yè)記錄顯示條數(shù)栏赴,執(zhí)行以下分頁(yè)代碼
if($pageval<=1){ //當(dāng)傳遞過(guò)來(lái)的參數(shù)'page'小于等于1時(shí)(即避免頁(yè)碼出現(xiàn)0或負(fù)值)
$pageval=1;
echo "共 $num 條 ".$pagenum."<a href=$url?page=".($pageval+1).">下一頁(yè)</a> <a href=$url?page=".$sumpage.">末頁(yè)</a>";
}else if((($num/$pagesize)-$pageval)<=0){ //總頁(yè)碼(不一定為整數(shù))與當(dāng)前頁(yè)碼的差小于等于0時(shí)蘑斧,即最后一頁(yè),執(zhí)行以下代碼
echo "共 $num 條 <a href=$url?page=1>首頁(yè)</a> <a href=$url?page=".($pageval-1).">上一頁(yè)</a>".$pagenum;
}else{ //其他情況须眷,即頁(yè)碼非第一頁(yè)或最后一頁(yè)竖瘾,執(zhí)行以下代碼
echo "共 $num 條 <a href=$url?page=1>首頁(yè)</a> <a href=$url?page=".($pageval-1).">上一頁(yè)</a>".$pagenum."<a href=$url?page=".($pageval+1).">下一頁(yè)</a> <a href=$url?page=".$sumpage.">末頁(yè)</a>";
}
}
$sql="select * from `people` limit $page $pagesize"; //依照l(shuí)imit條件查詢記錄,賦值$sql為查詢語(yǔ)句
$query=mysql_query($sql); //執(zhí)行代碼
while($rs=mysql_fetch_array($query)){ //循環(huán)將每條記錄以數(shù)組形式存入$rs
?>
<tr>
<td><?php echo $rs["id"] ?></td>
<td><?php echo $rs["name"] ?></td>
<td><?php echo $rs["sex"] ?></td>
</tr>
<?php
}
?>
</table>
</div>
由于代碼篇幅較長(zhǎng)花颗,下面根據(jù)功能實(shí)現(xiàn)的思路進(jìn)行細(xì)節(jié)剖析:
首先铭乾,找到功能實(shí)現(xiàn)的核心基礎(chǔ)几缭,頁(yè)碼分頁(yè)核心代碼:select * from `表名` limit 起始值,讀取條數(shù);
即:
$sql="select * from `people` limit $page $pagesize";
需要設(shè)定兩個(gè)變量,起始值$page钓辆,讀取條數(shù)$pagesize跷究,$pagesize可人為賦值,起始值$page的獲取則要費(fèi)一番周折,需要用到分頁(yè)公式:起始值=(當(dāng)前頁(yè)面-1)* 每頁(yè)顯示條數(shù),因?yàn)槲覀冃枰P(guān)聯(lián)到當(dāng)前的頁(yè)碼$pageval域携,因此得到如下代碼:
if($_GET["page"]){
$pageval=$_GET["page"];
$page=($pageval-1)*$pagesize;
$page.=",";
}
獲取$page后,我們還要實(shí)現(xiàn)首頁(yè)鱼喉、上一頁(yè)秀鞭、下一頁(yè)、末頁(yè)扛禽、頁(yè)碼羅列锋边、記錄總條數(shù)的功能,記錄總條數(shù)相對(duì)簡(jiǎn)單编曼,直接查詢所有記錄條數(shù)$num即可豆巨,即:
$numq=mysql_query("select * from `people`");
$num=mysql_num_rows($numq);
至于首頁(yè)、上一頁(yè)灵巧、下一頁(yè)搀矫、末頁(yè)抹沪、頁(yè)碼羅列這些刻肄,則需要運(yùn)用在超鏈接設(shè)置對(duì)應(yīng)的參數(shù)'?page='來(lái)實(shí)現(xiàn),如:
格式:<a href=$url?page=".對(duì)應(yīng)頁(yè)碼.">目標(biāo)頁(yè)</a>
所以$url和對(duì)應(yīng)頁(yè)碼是需要想辦法獲取的融欧。
首先我們來(lái)看$url的獲取敏弃,要用到兩個(gè)函數(shù):$_SERVER["REQUEST_URI"](用于獲取完整的URL)、parse_url()(將url按照組成部分分類后噪馏,以數(shù)組形式存放)麦到,然后取出路徑path,即:
$url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];
$url獲取后欠肾,我們來(lái)看一下對(duì)應(yīng)頁(yè)碼的獲取瓶颠,首頁(yè)的參數(shù)獲取最簡(jiǎn)單,直接'page=1'即可刺桃,上一頁(yè)粹淋、下一頁(yè)分別為($pageval-1),($pageval+1),末頁(yè)則為'page=總頁(yè)碼'瑟慈,即$sumpage桃移。
此處,首頁(yè)葛碧、末頁(yè)以及中間頁(yè)需要進(jìn)行條件判斷:
- 首頁(yè):當(dāng)前頁(yè)$pageval小于等于1時(shí)借杰;
- 末頁(yè):當(dāng)$num(總條數(shù))與$pagesize(每頁(yè)顯示條數(shù))的商與當(dāng)前頁(yè)面$pageval的差值小于等于0(即兩者之商小于或等于當(dāng)前頁(yè)值)時(shí);
-
中間頁(yè):除以上情況进泼。
即
if($num>$pagesize){
if($pagesize<=1){ //首頁(yè)
$pagesize=1;
echo "共 $num 頁(yè) ".$pagenum."<a href=$url?page=".($pageval+1).">下一頁(yè)</a> <a href=$url?page=".$sumpage.">末頁(yè)</a>";
}else if((($num/$pagesize)-$pageval)<=0){ //末頁(yè)
echo "共 $num 頁(yè) <a href=$url?page=1>首頁(yè)</a> <a href=$url?page=".($pageval-1).">上一頁(yè)</a>".$pagenum;
}else{ //中間頁(yè)
echo "共 $num 頁(yè) <a href=$url?page=1>首頁(yè)</a> <a href=$url?page=".($pageval-1).">上一頁(yè)</a>".$pagenum."<a href=$url?page=".($pageval+1).">下一頁(yè)</a> <a href=$url?page=".$sumpage.">末頁(yè)</a>";
}
}
其中末頁(yè)'page=$sumpage'的取值需兩種情況:當(dāng)$num(總條數(shù))與$pagesize(每頁(yè)顯示條數(shù))的商為整數(shù)時(shí)蔗衡,$sumpage=$sum/$pagesize;當(dāng)兩者之商不為整數(shù)時(shí)纤虽,則$sumpage=intval($sum/$pagesize)+1。
即
if(is_integer($sum/$pagesize)){
$sumpage=$sum/$pagesize;
}else{
$sumpage=($sum/$pagesize)+1;
}
最后绞惦,$pagenum(頁(yè)碼羅列)需要從第一頁(yè)到最后一頁(yè)依次打印廓推,所以,此處運(yùn)用for循環(huán)翩隧,并進(jìn)行條件判斷:當(dāng)處于當(dāng)前頁(yè)碼時(shí)樊展,即$i==$pageval,不加超鏈接堆生;除此之外专缠,加超鏈接,即:
for($i=1;$i<=$sumpage;$++){
if($i==$pageval){
$pagenum.=$i." ";
}else{
$pagenum.="<a href=$url?page=".$i.">".$i."</a>";
}
}
自此淑仆,整個(gè)分頁(yè)功能的各個(gè)功能代碼段一一剖析出來(lái)涝婉,在此代碼基礎(chǔ)上,稍加修改和調(diào)整樣式蔗怠,即可實(shí)現(xiàn)常見(jiàn)實(shí)用的分頁(yè)功能墩弯。
(4)總結(jié)
其實(shí),對(duì)于每一位PHP學(xué)習(xí)者來(lái)說(shuō)寞射,打好基礎(chǔ)都是非常重要的渔工,可以使我們?cè)谝院蟮膶W(xué)習(xí)中避免重復(fù)犯錯(cuò),影響學(xué)習(xí)進(jìn)度和深度桥温,這里推薦大家多通讀幾遍PHP:PHP manual引矩,此外推薦大家一個(gè)PHP的REPL:PsySH,供實(shí)驗(yàn)調(diào)試PHP代碼侵浸,在此祝大家加油旺韭,玩轉(zhuǎn)PHP!