分頁(yè)原理技術(shù)細(xì)節(jié)剖析(php+mysql)實(shí)例

提到分頁(yè),大家都不陌生寒随,在我們?nèi)粘g覽網(wǎng)頁(yè)時(shí)常遇到,尤其新聞文章列表等都有分頁(yè)帮坚,如下圖所示:


分頁(yè)實(shí)例

下面妻往,通過(guò)一個(gè)實(shí)例為大家剖析一下分頁(yè)原理上技術(shù)細(xì)節(jié)。

一试和、功能開(kāi)發(fā)思路

在分頁(yè)功能的實(shí)現(xiàn)前讯泣,先做了一個(gè)思維導(dǎo)圖理清一下大概的思路,廢話不多說(shuō)阅悍,上圖:


分頁(yè)原理思維導(dǎo)圖

二好渠、功能開(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)拍棕,如下圖:


數(shù)據(jù)庫(kù)"fenye"結(jié)構(gòu)圖

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!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏觉,一起剝皮案震驚了整個(gè)濱河市区端,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澳腹,老刑警劉巖织盼,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遵湖,居然都是意外死亡悔政,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門延旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谋国,“玉大人,你說(shuō)我怎么就攤上這事迁沫÷” “怎么了捌蚊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)近弟。 經(jīng)常有香客問(wèn)我缅糟,道長(zhǎng),這世上最難降的妖魔是什么祷愉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任窗宦,我火速辦了婚禮,結(jié)果婚禮上二鳄,老公的妹妹穿的比我還像新娘赴涵。我一直安慰自己,他們只是感情好订讼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布髓窜。 她就那樣靜靜地躺著,像睡著了一般欺殿。 火紅的嫁衣襯著肌膚如雪寄纵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天脖苏,我揣著相機(jī)與錄音程拭,去河邊找鬼。 笑死帆阳,一個(gè)胖子當(dāng)著我的面吹牛哺壶,可吹牛的內(nèi)容都是我干的屋吨。 我是一名探鬼主播蜒谤,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼至扰!你這毒婦竟也來(lái)了鳍徽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敢课,失蹤者是張志新(化名)和其女友劉穎阶祭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體直秆,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡濒募,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圾结。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑰剃。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筝野,靈堂內(nèi)的尸體忽然破棺而出晌姚,到底是詐尸還是另有隱情粤剧,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布挥唠,位于F島的核電站抵恋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宝磨。R本人自食惡果不足惜弧关,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唤锉。 院中可真熱鬧梯醒,春花似錦、人聲如沸腌紧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)壁肋。三九已至号胚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浸遗,已是汗流浹背猫胁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跛锌,地道東北人弃秆。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像髓帽,于是被迫代替她去往敵國(guó)和親菠赚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文包括:1郑藏、分頁(yè)技術(shù)概述2衡查、實(shí)現(xiàn)分頁(yè)3、完善分業(yè)——分頁(yè)工具條4必盖、幾種常見(jiàn)的分頁(yè)工具條 1拌牲、分頁(yè)技術(shù)概述 物理分...
    廖少少閱讀 4,427評(píng)論 0 38
  • Php:腳本語(yǔ)言,網(wǎng)站建設(shè)歌粥,服務(wù)器端運(yùn)行 PHP定義:一種服務(wù)器端的HTML腳本/編程語(yǔ)言,是一種簡(jiǎn)單的塌忽、面向?qū)ο?..
    廖馬兒閱讀 2,116評(píng)論 2 38
  • 回顧 列屬性:主鍵,自增長(zhǎng)失驶,唯一鍵 關(guān)系:一對(duì)一土居,一對(duì)多和多對(duì)多 范式:三層范式 1NF:字段設(shè)計(jì)必須符合原子性 ...
    翊溪閱讀 462評(píng)論 0 1
  • 分頁(yè)技術(shù)隨處可見(jiàn),這可以算得上是最為基礎(chǔ)的網(wǎng)站功能了。于是今天嘗試著用PHP來(lái)實(shí)現(xiàn)一個(gè)分頁(yè)的小例子装盯。 [toc] ...
    盡情的嘲笑我吧閱讀 568評(píng)論 0 2
  • l人家都說(shuō)沂源風(fēng)景好坷虑,我覺(jué)得也是 大沂源風(fēng)景
    凝敏閱讀 272評(píng)論 0 2