版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
網(wǎng)絡(luò)上各種各樣的PHP教程和各種各樣的留言板都是鋪天蓋地的,戰(zhàn)地為什么要自己寫一個這樣的PHP留言板教程呢?問的好啊!鼓掌。首先戰(zhàn)地寫這個PHP教程的目的不是為了做一個留言板,如果你需要一個留言板的話我建議你去Google搜索一下免費(fèi)的、功能強(qiáng)大的、功能齊全的、漂亮的到處都是。目的是:從一個簡單的實(shí)際的案例出發(fā),來讓想學(xué)習(xí)PHP的兄弟姐妹們進(jìn)入PHP的世界。需要說明的是,既然是實(shí)際的案例教程,各種各樣的知識都會涉及到(以保證各位遇到更多的問題),閱讀這個教程的時候你最好了解一點(diǎn)Html和javascript的知識,因?yàn)樵诮坛讨袑⒉蛔鳛橹攸c(diǎn)來說。因?yàn)槲覀兪荘HP教程。好了,現(xiàn)在說說我們將要設(shè)計(jì)的知識和這個留言板將要實(shí)現(xiàn)的功能:功能需求:利用PHP+Mysql數(shù)據(jù)庫制作一個基本的留言板能夠讓客戶進(jìn)行留言,管理員可以對留言進(jìn)行修改、刪除、回復(fù)等操作。涉及到的技術(shù):PHP后臺處理程序、javacript客戶端技術(shù)、Mysql數(shù)據(jù)庫的基本操作,另外戰(zhàn)地假設(shè)你已經(jīng)架設(shè)好了PHP+Mysql的開發(fā)環(huán)境。如果需要配置開發(fā)環(huán)境的幫助,請參考:《Windows平臺下PHP環(huán)境配置之Apahce安裝篇》、《Windows平臺下PHP環(huán)境的配置之Mysql篇》、《Windows平臺下PHP環(huán)境配置之PHP安裝篇》等相關(guān)文章。該案例教程中所涉及的PHP內(nèi)容:
1.PHP程序的基本寫法和注意事項(xiàng);
2.變量的定義和銷毀;
3.PHP數(shù)組的定義和基本使用方法;
4.字符串的處理;
5.客戶輸入信息的驗(yàn)證;
6.PHP編程語言的流程控制;
7.session會話的基本應(yīng)用;
8.PHP鏈接Mysql和對Mysql的增刪改查;
9.PHP+mysql的分頁技術(shù)和原理(重點(diǎn))。
……
大部分在利用PHP+Mysql進(jìn)行Web編程過程中所常用的方法。好了今天我們開始我們PHP入門案例教程,PHP留言板的第一步,為我們的留言板設(shè)計(jì)一個數(shù)據(jù)庫。根據(jù)《PHP入門案例教程【留言板】前言》中的大致需求,我們需要在數(shù)據(jù)庫中建立三個表:一個(post)存儲留言內(nèi)容,一個(guest)存儲留言人的信息,另一個(revert)存儲管理員的回復(fù)信息。
好了現(xiàn)在詳細(xì)說說,首先創(chuàng)建一個數(shù)據(jù)庫GuestBook創(chuàng)建數(shù)據(jù)庫代碼:12
CREATEDATABASE`GuestBook`DEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;存儲留言信息表post創(chuàng)建腳本:1234567CREATETABLE`guestbook`.`post`(`id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'post主鍵自增序列',`guest_id`VARCHAR(11)NOTNULLCOMMENT'發(fā)布人id',`post`TEXTNOTNULLCOMMENT'發(fā)布內(nèi)容',`post_time`VARCHAR(14)NOTNULLCOMMENT'發(fā)布時間',PRIMARYKEY(`id`))ENGINE=MYISAM存儲留言客戶信息表guest創(chuàng)建腳本:1234567CREATETABLE`guestbook`.`guest`(`id`INT(11)NOTNULLCOMMENT'客戶自增id',`name`VARCHAR(16)NOTNULLCOMMENT'客戶名稱',`email`VARCHAR(60)NULLCOMMENT'電子信箱',`qq`VARCHAR(11)NULLCOMMENT'QQ號碼',PRIMARYKEY(`id`))ENGINE=MYISAM存儲回復(fù)信息表:revert創(chuàng)建腳本:1234567CREATETABLE`guestbook`.`revert`(`id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'自增id',`post_id`VARCHAR(11)NOTNULLCOMMENT'留言id',`revert`TEXTNOTNULLCOMMENT'回復(fù)內(nèi)容',`revert_time`VARCHAR(14)NOTNULLCOMMENT'回復(fù)時間',PRIMARYKEY(`id`))ENGINE=MYISAM可以看出在post表中存儲了客戶的Id(其實(shí)這個設(shè)計(jì)本身不適合咱們系統(tǒng),咱們應(yīng)該存儲的是用戶的名稱,但是為了接觸更多的PHP函數(shù)還是這樣設(shè)計(jì)吧),通過這個Id可以和客戶表guest進(jìn)行關(guān)聯(lián),revert表中存儲了post_id顧名思義就是留言表中的主鍵Id,這樣我們也可對這兩表進(jìn)行關(guān)聯(lián)操作。在本章和隨后的第三章我們將會說的知識點(diǎn):
1.
PHP的基本語法——知道怎么寫就行了,不作為重點(diǎn);
2.
PHP處理form表單內(nèi)容,保存到數(shù)據(jù)庫;
3.
數(shù)據(jù)庫的鏈接和插入等操作;
4.
轉(zhuǎn)義函數(shù)的使用。
……
在本章開始之前戰(zhàn)地為此做了很多工作,諸如:
設(shè)計(jì)了一個簡單的留言板的模板,如果你不想自己設(shè)計(jì)的話就點(diǎn)擊,留言板模板下載,直接用我這個就行了。如果想讓用戶留言,那么必須就要給用戶一個留言的入口。我們這里的入口就是模板頁面下邊的表單了—-其它的PHP代碼我們暫且不管??梢钥吹?,表單上有四個表單域:
姓名
<inputtype=”text”id=”name”name=”name”>
<inputtype=”text”id=”email”name=”email”>
<inputtype=”text”id=”qq”name=”qq”>
留言內(nèi)容<textareaid=”post”name=”post”></textarea>關(guān)于這個輸入留言內(nèi)容的框框更多的屬性值可以參考留言板模板文件中的相關(guān)部分。以上這些表單包含在一個屬性為這樣的form中
<formaction=”post.php”name=”form1”method=”post”>其中action一項(xiàng)是指把表單內(nèi)容提交到哪一個處理頁面,method是指用什么方式提交表單內(nèi)容。我們把處理頁面定義為post.php,這個就是我們將來馬上就要編寫的PHP代碼頁面程序;
提交表單內(nèi)容一般用post方法——因?yàn)閜ost的方法能夠提交更大的更多的內(nèi)容,并且相對于get方法似乎更加安全一點(diǎn)。在開始我們的PHP代碼之前,還有一些問題要說就是如何使你的留言板更加安全。在模板里我已經(jīng)實(shí)現(xiàn)了對輸入內(nèi)容的js驗(yàn)證——這道屏障幾乎沒有什么作用,我們也不是講js的所以有興趣的朋友看看就行了。
這個問題你可以點(diǎn)擊這個鏈接《關(guān)于PHP代碼安全性問題的建議》了解更多內(nèi)容。既然已經(jīng)說道安全問題了,那么我們就開始我們的代碼吧。在開始這段之前,我已經(jīng)實(shí)現(xiàn)了這個post.php的程序,大家可以點(diǎn)擊這里
post下載這個頁面。大家可以看到所有的PHP代碼都需要寫在<?php和?>之間,這一對符號就是聲明給PHP解析器看的——意思是從<?php這里開始,到?>這里結(jié)束,是PHP代碼需要PHP解析器進(jìn)行解析。第二個問題是重點(diǎn),我們?nèi)绾卫萌〉胒orm表單提交上來的內(nèi)容。上文已經(jīng)說過我們用post方法提交表單給post.php也就是我們當(dāng)前的頁面,所以我們需要用PHP的$_POST數(shù)組,這個數(shù)組里面保存了從form表單提交上來的所有內(nèi)容,包括我們的兩個按鈕其實(shí)也在里面。如果你對PHP數(shù)組還不了解的話,請參考PHP手冊或者關(guān)注PHPiask隨后推出的PHP數(shù)組函數(shù)詳解。如何得到我們提交上來的值,得到$_POST[‘name’]這個值就是表單提交上來的姓名一個文本域,數(shù)組的name索引是表單的name屬性,如果表單的name=”email”那么$_POST[‘email’]里面就是email的值。其中$這個是PHP變量必須要有的,例如我們可以把$_POST[‘name’]的值賦給$name,可以這樣寫:
$name=$_POST[‘name’];
這里我們就定義了一個變量$name并且賦值$_POST[‘name’]給他?!@就是PHP變量定義和賦值,我們的基礎(chǔ)知識,很簡單是不是,是的很簡單,對于PHP一切事情都很簡單。如何能夠看到POST的所有內(nèi)容呢?其實(shí)很簡單,用var_dump($_POST)格式化輸出一個數(shù)組就行了。知道了如何得到表單提交上來的值,如何訪問這些值。那么我們就開始我們的第一個處理流程,如何驗(yàn)證用戶提交上來的留言信息。首先我們的驗(yàn)證要求是:用戶名:長度不能大于10個字符,不能為空。
Email:符合電子郵箱的格式,長度不能超過60。
QQ:5-11位的數(shù)字
留言內(nèi)容:不能超過400個字符具體的驗(yàn)證過程請參看post.php文件的數(shù)據(jù)庫連接注釋前的處理流程(點(diǎn)擊這里下載post.php文件)。這一章我們重點(diǎn)說一下PHP驗(yàn)證信息數(shù)據(jù)內(nèi)容的時候,用到的函數(shù)。首先在第一行我們發(fā)送了一個網(wǎng)頁頭信息:header(’content-type:text/html;charset=utf-8′);
用來告訴程序我們的腳本將返回什么格式的數(shù)據(jù),和返回數(shù)據(jù)的字符集。這個地方很重要,如果沒有這樣的語句,你將會在IE里面看到返回的亂碼,或者根本就沒有辦法執(zhí)行(收到一個js的錯誤)。第二個值得注意的是:if(!get_magic_quotes_gpc()){
foreach($_POSTas&$items){
$items=addslashes($items);
}}注意這段代碼中的一個!(嘆號)是什么,如果不明白請參看手冊——運(yùn)算符一章。這一段代碼中g(shù)et_magic_quotes_gpc()是一個PHP的內(nèi)置函數(shù),作用是得到PHP.ini配置文件中magic_quotes_gpc的值,如果在配置文件中是On則這個函數(shù)返回1,如果是off則返回0。我們之所以有這么一個判斷就是為了判定PHP解析器是否為數(shù)據(jù)加上了自動轉(zhuǎn)義,如果沒有加上我們就執(zhí)行foreach語句自己添加轉(zhuǎn)義。下邊說說如何利用foreach來巧妙的修改數(shù)組中的值。foreach通常的作用就是用來遍歷數(shù)組的,通常的寫法是:foreach($Arrayas$item){
……}as前的變量必須是一個數(shù)組,as后邊的變量表示這個數(shù)組中當(dāng)前元素的值,這個循環(huán)一直會持續(xù)到數(shù)組的最后一個元素——其實(shí)也可以用for循環(huán)實(shí)現(xiàn),看看大家是否有這個時間了就。相對于這個通常寫法,我們在程序中的寫法似乎有點(diǎn)怪異,在as后邊的變量前加上了一個引用符號&以此表示地址引用,如果這時候如果修改$items的值就相當(dāng)于修改了數(shù)組元素的值。在PHP系統(tǒng)沒有加上自動轉(zhuǎn)義的情況下,我們就是利用這個方法將表單post過來的值一一的加上轉(zhuǎn)義符的。addslashes函數(shù),這個函數(shù)的作用是為了數(shù)據(jù)庫的需要在某些字符前加上反斜線以保證數(shù)據(jù)庫語句或者其他語句不會出錯,這些被加上反斜線的字符是:單引號(’)、雙引號(”)、反斜線(\)與NUL(NULL字符)在magic_quotes_gpc=On的情況下,我們不需要也不要用這個函數(shù),如果使用的話會造成重復(fù)轉(zhuǎn)義——PHP和你自己都做了這件事兒,當(dāng)然重復(fù)了!所以使用這個函數(shù)前一定要加上if(!get_magic_quotes_gpc())的判斷。在這些判斷中還使用到了,strlen函數(shù)——得到字符串長度的,ereg函數(shù)——正則表達(dá)式的,is_numeric判斷一個變量是不是全數(shù)字的函數(shù),這些函數(shù)使用起來都相當(dāng)簡單就不說了,當(dāng)然也有其實(shí)不簡單的ereg這個不是函數(shù)本身不簡單,所謂的不簡單是他的參數(shù)正則表達(dá)式。當(dāng)然也用到了PHP的定界符”<<<”,有興趣的兄弟可以參考PHPiask的《PHP中的定界符》這里詳細(xì)的說明了PHP定界符的使用方法和注意事項(xiàng)。在本章中我們只對數(shù)據(jù)做了應(yīng)該做的處理,下一章將會說到Mysql數(shù)據(jù)庫的鏈接,和如何將留言信息保存到數(shù)據(jù)庫中。在以上的章節(jié)中我們知道了如何將form表單中的數(shù)據(jù)傳遞給PHP處理程序,以及應(yīng)該怎樣對待這些用戶提交上來的數(shù)據(jù),并對數(shù)據(jù)做了相應(yīng)的處理。如果你是偶然的來到這里,那么請回頭閱讀以上章節(jié)。本章將說明如何將這些已經(jīng)處理過的數(shù)據(jù)保存到Mysql數(shù)據(jù)庫中。保存數(shù)據(jù)到數(shù)據(jù)庫中的流程是這樣的(假設(shè)你的數(shù)據(jù)庫和數(shù)據(jù)表已經(jīng)創(chuàng)建):1.創(chuàng)建一個數(shù)據(jù)庫連接
2.發(fā)送一些不是必須的語句
3.選擇一個存儲的數(shù)據(jù)庫
4.編寫數(shù)據(jù)庫插入語句
5.發(fā)送這個語句詳細(xì)的分析也就這么五個步驟了,那么我們開始第一步吧,利用PHP提供的內(nèi)置函數(shù)mysql_connect來創(chuàng)建一個數(shù)據(jù)庫鏈接,這個函數(shù)需要三個參數(shù),格式如下:Mysql_connect(‘?dāng)?shù)據(jù)庫所在的主機(jī)’,’鏈接數(shù)據(jù)庫的用戶名’,’鏈接數(shù)據(jù)庫的密碼’)。這個函數(shù)返回一個數(shù)據(jù)庫連接資源號??次覀冊趐ost.php中的鏈接代碼:123$con=mysql_connect('localhost','root','root')ordie('鏈接數(shù)據(jù)庫失?。?);mysql_query('setnamesutf8');mysql_select_db('GuestBook');第一行創(chuàng)建一個數(shù)據(jù)庫連接,把資源號賦給變量$con,如果連接失敗,結(jié)束程序的執(zhí)行輸出提示信息“鏈接數(shù)據(jù)庫失??!”。第二行發(fā)送一個字符集設(shè)定語句,讓數(shù)據(jù)在數(shù)據(jù)庫中的出入都使用utf8字符集。這個語句是可有可無的,其中的語句可以寫成setnamesgbk或者setnamesgb2312等等我們需要的字符集。第三行利用PHP提供的mysql_select_db函數(shù)來選擇我們要使用的數(shù)據(jù)庫。值得注意的是,mysql_query這個函數(shù)本身有兩個參數(shù):第一個參數(shù)就是我們要發(fā)送的數(shù)據(jù)庫執(zhí)行語句sql,第二個參數(shù)是數(shù)據(jù)庫連接的資源編號,如果第二個參數(shù)沒有指定的話,那么程序就會查找最近一個鏈接資源,也就是說這個參數(shù)不是必須的。我們以上包括將來的寫法都是沒有第二個參數(shù)的,按照程序的上下文我們第二行的語句可以寫作:
mysql_query(“setnamesutf8”,$con)這樣也是正確的。這個函數(shù)的返回值是布爾型的,如果語句成功執(zhí)行就返回true否則返回false——了解這一點(diǎn)很重要。好,到此為止我們的數(shù)據(jù)庫連接已經(jīng)就緒,開始組裝我們的sql插入語句,看一下代碼(post.php第67-76行):12345678910$insertSql="insertintoguest(name,qq,email)values('$name','$qq','$email')";if(mysql_query($insertSql)){ $guestid=mysql_insert_id();}else{ echo$insertSql; echomysql_error(); echo"數(shù)據(jù)插入失敗!"; exit();}在這個片段的第一行中我們組建了一個sql的插入語句,這個看來沒什么可說的,唯一點(diǎn)就是把變量寫進(jìn)這些語句并且用引號包裹起來——對于數(shù)字型的不需要引號。第二句發(fā)送語句,并判斷是否被成功執(zhí)行。
這個地方需要說明:PHP中if判斷中的語句是會被執(zhí)行的,例如if($c=$a+$b)這樣的語句被執(zhí)行的順序是,先計(jì)算里面的語句然后再對結(jié)果作出判斷。所以執(zhí)行之后$c的值是$a,$b之和,判斷的時候是對$c作出的判讀。所以在這個地方if判斷的是mysql_query($insertSql)的返回結(jié)果,語句已經(jīng)發(fā)送到了數(shù)據(jù)庫。第三行出現(xiàn)的函數(shù)mysql_insert_id——獲取最近一次插入數(shù)據(jù)的時候自增序列的值,我們這里獲取的是guest表中的id,因?yàn)橹挥羞@個id才是自增的。以備后用。這個片段的第五行到最后都是進(jìn)行的錯誤處理,如果語句沒有被成功執(zhí)行,那么就執(zhí)行這些程序,倒數(shù)第二行的exit();函數(shù)的意思是終止程序向下執(zhí)行。這時候我們已經(jīng)把guest信息保存到了Mysql的GuestBook的guest表中了。在post.php文件的79行出現(xiàn)的time()函數(shù)我們暫時不說,等到說到顯示留言信息的時候重點(diǎn)表述一下PHP的時間函數(shù)。保存留言信息到post表中的過程類似與此,咱們還是就不要羅嗦了吧。好了這時候我們來填寫留言信息,點(diǎn)擊提交按鈕,就會受到一個“留言成功”的提示,并且我們的留言板的首頁上頁顯示出了這條信息,多么順利啊我們??!既然數(shù)據(jù)都存儲到數(shù)據(jù)庫了,如果讀不出來確實(shí)讓人很難為情——把自己的錢鎖進(jìn)一個打不開的抽屜,確實(shí)很難受!這也不是我們的目的是不是?和插入數(shù)據(jù)的流程一樣:
首先要建立一個數(shù)據(jù)庫鏈接,發(fā)送一個字符集設(shè)置語句,選擇一個數(shù)據(jù)庫,編造一個數(shù)據(jù)庫查詢語句,執(zhí)行這個語句,而后就不一樣了,嘿嘿……還是看Index.php文件的1-21行吧,我們來詳細(xì)解釋一下:第一行:我們暫時先不說,留到以后再說,暫時還用不到;
第二行——第五行:大家一定很眼熟吧,是的這里和post.php插入留言信息的時候的過程是一樣的,也就不多說了。
7、8、9和19行我們暫時不說,這里是涉及到分頁的,我們將會留到下一章詳細(xì)的說明這個問題,因?yàn)榉猪摰倪^程在web編程過程中幾乎是一個必須要使用的功能。在11-15行我們定義了一個數(shù)據(jù)庫查詢語句,在這條語句中我們用了leftjoin…on..語句,關(guān)于這個語句的詳細(xì)用法請參看Mysql手冊聯(lián)合查詢部分。??吹?6行,$numRecord=mysql_num_rows(mysql_query($sql));這個語句中我們用mysql_query($sql)把我們定義的sql語句發(fā)給數(shù)據(jù)庫來執(zhí)行,這個語句執(zhí)行以后會返回一個記錄資源號,我們用外層的mysql_num_rows來取得有多少個匹配的記錄——也就是返回的記錄總數(shù)。第17行我們用到了ceil函數(shù),這個函數(shù)的功能是,進(jìn)一法取整,也就是說兩個數(shù)進(jìn)行除法操作之后只要余數(shù)大于零整數(shù)部分就加一然后舍去小數(shù)部分,所以ceil(1/2)的結(jié)果是1,而不是我們通常所見到的0.5。這個對于我們來說很有用——也留到下一章分頁的時候再說吧。第19行,涉及到分頁部分。但是這一行值得說的是,在PHP中字符串的相加,也就是字符串的連接。兩個字符串相加的操作符是點(diǎn),看例子:$strFirst=”中國”;
$strTwo=”偉大的國度”;$strSum=$strFirst.$strTwo;
echo$strSum;
輸出的結(jié)果正如我們所料到的一樣:中國偉大的國度。第20行:我們發(fā)送一個帶分頁功能的sql語句到數(shù)據(jù)庫執(zhí)行,并把執(zhí)行結(jié)果賦值給$result;
接著我們看,本頁函數(shù)的第:128-154行,這個程序的片段功能是循環(huán)輸出在數(shù)據(jù)庫中查詢到的記錄。這是我們本章的重點(diǎn):看PHP的內(nèi)置函數(shù)mysql_fetch_object()從結(jié)果集中取得一行作為對象,關(guān)于PHP的對象我們在高級編程欄目中將會詳細(xì)的說明,我們這里只需要知道這種循環(huán)查詢記錄的方式,需要用$對象->字段名來訪問就行了,執(zhí)行起來的時候就是每一次指針下移一次,當(dāng)遇到?jīng)]有更多的記錄的時候就返回一個false所以我們可以用while循環(huán)來讀取$result的這個記錄集。最終形成了while($rs=mysql_fetch_object($result))這個語句,循環(huán)調(diào)用mysql_fetch_object函數(shù)并且把每次返回的對象賦值給$rs變量,現(xiàn)在哦我們看這個循環(huán)的內(nèi)部,我們可以用$rs->name來取得留言人姓名,用$rs->post_time來訪問留言時間。在顯示post_time的時候我們做了一些處理,使用到了date()函數(shù),記得我們存儲留言的時候用到了time()函數(shù),這個函數(shù)返回的是一個時間戳,就是從1970年的第一秒起到現(xiàn)在已經(jīng)經(jīng)過的秒數(shù)(格林尼治時間)。而date函數(shù)就是把這個秒數(shù)翻譯為我們所需要的時間格式,返回怎樣的字符串需要們在date()函數(shù)的第一個參數(shù)中制定,該函數(shù)的第二個參數(shù)如果沒有給出,也就是需要翻譯成時間格式的秒數(shù)沒有給出的話,他就會以當(dāng)前時間來翻譯。
Date(“Y年m月d日H:i:s”),輸出結(jié)果就是2009年4月26日11:16:20。我們在index.php的132行有這樣的寫法:
<?phpechodate(”Y-m-dH:i:s”,$rs->post_time+8*3600)?>
我們具體說說這個,我想大家一定會對8*3600這個地方感到奇怪,其實(shí)原因很簡單。咱們用time()函數(shù)存儲時間的時候用的是格林尼治時間,這個時間和我們的時間相差剛好八個小時,每個小時3600秒,我們處在東方比西方的時間快所以要加上的。記住我們用的是北京時間——處在東八時區(qū)哦,這個是常識!關(guān)于這一點(diǎn)還有一個做法,這將會在專門闡述PHP的日期函數(shù)的文章里詳細(xì)說明。144和146行都用了兩個函數(shù)htmlspcialchars和nl2br,其中htmlspcialchars這個函數(shù)是為了避免用戶輸入的腳本代碼(html和javascript)被執(zhí)行而必須的,這個函數(shù)很重要。如果沒有這個函數(shù)用戶輸入的js代碼和html代碼都會被作為頁面程序的一部分被執(zhí)行,這一點(diǎn)我們在《關(guān)于PHP代碼安全性建議》一文中已經(jīng)說過,不在贅述。
nl2br這個函數(shù)的作用是講數(shù)據(jù)中的\n換行轉(zhuǎn)換成html的換行<br/>以便于頁面表現(xiàn)。在我們輸入留言信息的時候,用的<textarea></textarea>這個表單,保存信息的時候,換行使用\n來表示的所以我們這里需要轉(zhuǎn)換,以保留用戶輸入信息在顯示的時候我輸入時段落一致。好了本章的就此打住,下一章說如何利用PHP+Mysql分頁顯示內(nèi)容,以及分頁鏈接的使用。
本章的內(nèi)容邏輯性相對比較強(qiáng)一點(diǎn),加上戰(zhàn)地的表現(xiàn)能力有限,如果兄弟們實(shí)在不明白的話,可以留言給我,戰(zhàn)地定不遺余力盡我所能!關(guān)于我們留言本的分頁過程,如果你看了第五章的話,就知道其實(shí)戰(zhàn)地已經(jīng)實(shí)現(xiàn)了這個功能。只不過限于篇幅的原因,另外戰(zhàn)地也想把他拉出來單獨(dú)的加以說明,所以就有了這篇文章,如何分頁顯示留言本信息內(nèi)容。分頁的關(guān)鍵問題其實(shí)在于Mysql的一個關(guān)鍵字limite這個關(guān)鍵字后邊跟的兩個數(shù)字,第一個是需要記錄的開始行數(shù),第二個數(shù)字是從這個開始行數(shù)后取得幾行記錄——這一點(diǎn)大家不要誤以為是從第幾行開始到第幾行結(jié)束,相差很遠(yuǎn)的??纯次覀僫ndex.php的第19行:$recordSql=$sql.”LIMIT“.$page*$pagesize.”,”.$pagesize;其中變量$page的判斷在程序的第8行和第9行得到的:if(isset($_GET['page'])&&$_GET['page']!=”)$page=$_GET['page'];
else$page=0;當(dāng)然大家也看到了$_GET['page']變量這個下文會說到。變量$pagesize我們在第7行自己定義的,也就是每頁顯示多少條記錄,我們定義的是10條。當(dāng)變量$page=0的時候我們語句最終會是這樣的:$recordSql="SELECTa.*,,b.email,b.qq,c.revert_time,c.revert FROMposta LEFTJOINrevertcON(a.id=c.post_id),guestb WHEREa.guest_id=b.id ORDERBYa.idDESC "LIMIT0,10";就是從0條記錄開始取得10個記錄結(jié)果——這個是包括第0條記錄的;
當(dāng)$page=1的時候呢?可想而知了——這個時候$page*$pagesize=10,當(dāng)然是從……不說了,再說就羅嗦了。還有需要說的是,為什么我們要在取得總行數(shù)之后才加上這個limit呢,很簡單嘛,如果我們在取得結(jié)果記錄數(shù)的時候就加上這個limit,我們總行數(shù)永遠(yuǎn)不會大于10,因?yàn)榧由现笏疃喾祷氐挠涗洈?shù)就是10啊兄弟。——這個顯然不符合實(shí)際情況。所以我們在執(zhí)行了:
mysql_num_rows(mysql_query($sql));
取得總記錄數(shù),之后才加上limit關(guān)鍵字的。好了我們已經(jīng)取得了總記錄數(shù),設(shè)置了每頁顯示的記錄數(shù)10,現(xiàn)在我們需要的就只有總頁數(shù)了,這個小學(xué)的問題我就不說了吧?當(dāng)然是總記錄數(shù)除以每頁顯示的數(shù)就是總頁數(shù)了——當(dāng)然也有除不盡的時候,例如總記錄數(shù)11每頁顯示10個,我們需要分幾頁呢?當(dāng)然是兩頁呢,怎么才能讓11/10=2呢?——顯然是錯誤的,但是實(shí)際生活就這樣并不是完美的數(shù)學(xué)。使用ceil函數(shù)啊,這個上一章也說過了,不說了??纯次覀儸F(xiàn)在有什么了?。?/p>
總記錄數(shù),$numRecord=mysql_num_rows(mysql_query($sql));
總頁數(shù),$totalpage=ceil($numRecord/$pagesize);我們什么都不缺了,就差如何顯示“上一頁下一頁”了,很簡單,兩個判斷就搞定了,看index.php的159-163行:第160行:if($page>0)echo"<ahref=index.php?page=".($1).">上一頁|</a>";如果變量$page>0的話,也就是當(dāng)前的頁碼大于0說明有上一頁,那么就顯示“上一頁”的鏈接,這個鏈接里面的$page需要減一,例如當(dāng)前頁是2,那么上一頁當(dāng)然是1了是不是,當(dāng)我們點(diǎn)擊上一頁的時候,隨著這個鏈接將會把page=1傳遞過去,這種依靠鏈接傳遞變量的方式就是get方法。這就回到了程序8行9行進(jìn)行處理了。在161行,我們做的判斷是,如果當(dāng)前頁數(shù)小于總記錄數(shù)-1——因?yàn)槲覀兊捻摯a是從0開始的,所以總記錄數(shù)要減一進(jìn)行判斷才符合實(shí)際。如果這個判斷成立,說明還有下一頁,下一頁的時候$page當(dāng)然要加一了。好了整個分頁就是這樣了,只要記住,如何取得總記錄數(shù),如何為sql語句加上
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度外貿(mào)代理傭金支付標(biāo)準(zhǔn)合同范本
- 教育地產(chǎn)居間服務(wù)合同
- 煤礦生產(chǎn)承包合同
- 復(fù)印與膠印質(zhì)量檢測標(biāo)準(zhǔn)考核試卷
- 乳品廢棄物處理技術(shù)考核試卷
- 解除法律服務(wù)合同
- 體育訓(xùn)練效果評估考核試卷
- 儀器儀表精度與可靠性考核試卷
- 2024年智能交通系統(tǒng)建設(shè)合同
- 樂器批發(fā)商的全球化品牌推廣考核試卷
- 《聚焦客戶創(chuàng)造價值》課件
- 公安校園安全工作培訓(xùn)課件
- PTW-UNIDOS-E-放射劑量儀中文說明書
- 保險學(xué)(第五版)課件全套 魏華林 第0-18章 緒論、風(fēng)險與保險- 保險市場監(jiān)管、附章:社會保險
- 許小年:淺析日本失去的30年-兼評“資產(chǎn)負(fù)債表衰退”
- 典范英語2b課文電子書
- 17~18世紀(jì)意大利歌劇探析
- β內(nèi)酰胺類抗生素與合理用藥
- 何以中國:公元前2000年的中原圖景
- 第一章:公共政策理論模型
- GB/T 4513.7-2017不定形耐火材料第7部分:預(yù)制件的測定
評論
0/150
提交評論