明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

用PHP與MySQL構(gòu)建一個(gè)數(shù)據(jù)庫驅(qū)動的網(wǎng)站(5)

[摘要]雖然看上去一切都好了,但是我們?nèi)詻]有達(dá)到我們真正地與用戶交互的目的,我們的用戶應(yīng)該能夠輸入任意的信息,并將它交給PHP來處理。接著我們的個(gè)性化歡迎頁面的例子,我們想要讓我們的用戶任意地輸入他(或她)的名字并將其顯示到信息中,要讓用戶輸入數(shù)據(jù),我們需要用到HTML的表單。這兒是表單的代碼:<F...
雖然看上去一切都好了,但是我們?nèi)詻]有達(dá)到我們真正地與用戶交互的目的,我們的用戶應(yīng)該能夠輸入任意的信息,并將它交給PHP來處理。接著我們的個(gè)性化歡迎頁面的例子,我們想要讓我們的用戶任意地輸入他(或她)的名字并將其顯示到信息中,要讓用戶輸入數(shù)據(jù),我們需要用到HTML的表單。

這兒是表單的代碼:


<FORM ACTION="welcome.php" METHOD=GET>
First Name: <INPUT TYPE=TEXT NAME="firstname"><BR>
Last Name: <INPUT TYPE=TEXT NAME="lastname">
<INPUT TYPE=SUBMIT VALUE="GO">
</FORM>



  除了在這里你可以任意輸入你的名字以外,這個(gè)表單所起的效果和我們上面的第二個(gè)連接(在查詢字符串中使用firstname=Kevin&lastname=Yank)完全一樣。當(dāng)你按提交按鈕(標(biāo)志為“GO”)時(shí),瀏覽器會裝載welcome.php并自動為你在查詢字符串中添加變量和它們的值。變量名就是在INPUT TYPE=TEXT標(biāo)識中的NAME屬性,變量值就是用戶輸入的相應(yīng)的內(nèi)容。

  INPUT TYPE=TEXT標(biāo)識中的METHOD屬性是用來告訴瀏覽器如何在請求中發(fā)送變量名及變量值的。GET(就是我們在上面使用的)表示在查詢字符串中傳遞變量,但是還有另外一種選擇。將變量顯示在查詢字符串中并不總是令我們滿意的--甚至有的時(shí)候在技術(shù)上就是不可行的。如果在你的表單中包含了一個(gè)TEXTAREA標(biāo)識用來讓用戶輸入大量的文本,這部分文本也顯示在查詢字符串中實(shí)在是太長了,而且會超過瀏覽器所能支持的URL的最大長度。另外一種方法可以允許瀏覽器隱藏地傳遞信息。這種方法的代碼和我們上面看到的表單的代碼幾乎一樣,只是我們將表單的方法從GET變成了POST:


<FORM ACTION="welcome.php" METHOD=POST>
First Name: <INPUT TYPE=TEXT NAME="firstname"><BR>
Last Name: <INPUT TYPE=TEXT NAME="lastname">
<INPUT TYPE=SUBMIT VALUE="GO">
</FORM>



  這個(gè)表單和我們之前的那個(gè)在功能上完全一樣。唯一的不同是當(dāng)用戶在按“GO”按鈕時(shí)所裝載頁面的URL將沒有一個(gè)查詢字符串。一方面,這可以讓你通過表單提交大量的數(shù)據(jù)或者是敏感的數(shù)據(jù)(例如密碼),而不在一個(gè)查詢字符串中顯示出來。另一方面,如果用戶將提交表單生成的結(jié)果頁添加到收藏夾,這個(gè)收藏夾是沒有用的,因?yàn)樗话峤坏臄?shù)據(jù)。另外,附帶說一下,象AltaVista這樣的搜索引擎總是利用查詢字符串來提交查詢條件,其主要原因就是為了便于用戶將查詢結(jié)果頁添加到收藏夾中,以便在將來進(jìn)行同樣的搜索,因?yàn)樗阉鳁l件是包含在URL之中的。

  這兒講了利用表單來實(shí)現(xiàn)用戶與PHP的交互的基本的原理。在以后的例子中,我們將討論一些更高級的問題和技術(shù)。

控制語句

  在我們之前看到的PHP的代碼的例子中,要么是只有一個(gè)單獨(dú)的向Web頁面輸出文本語句;要么是一系列的依次執(zhí)行的語句。如果你用其他語言編寫過程序,你應(yīng)該知道,實(shí)際上很少有這么簡單的程序。

  和任何其他的編程語言一樣,PHP也提供了很方便地處理腳本中的“控制流”的方法。就是說,PHP中包含了一些特殊的語句,通過這些語句你可是不受依次執(zhí)行的順序的束縛。這種語句被稱之為“控制語句”。不理解?不要擔(dān)心!有一些例子會很好地幫助你。

   最基本最常用到的控制語句是if-else語句。它的結(jié)構(gòu)是這樣的:


if ( <condition> ) {
//如果<condition>是真,將執(zhí)行的語句。
} else {
//(可選)如果<condition>是假,將執(zhí)行的語句。
}
這個(gè)控制語可以讓我們告訴PHP根據(jù)一些條件的真假來決定相應(yīng)地執(zhí)行哪一組語句。如果你不覺得我這么做有點(diǎn)空虛,我們可以將我們剛才建立的welcome.php文件修改為:
if ( $name == "Kevin" ) {
echo( "Welcome, oh glorious leader!" );
} else {
echo( "Welcome, $name!" );
}



  現(xiàn)在,如果傳遞給這個(gè)頁面的name變量的值是Kevin,將顯示一個(gè)特殊的信息。否則,將顯示一個(gè)包含輸入的name的普通的信息。

  需要指出的是,在這個(gè)結(jié)構(gòu)中,“else子句”(它指出了if-else結(jié)構(gòu)中條件為假時(shí)執(zhí)行的內(nèi)容)是可選的。對于上面的例子,如果我們的目的是當(dāng)適當(dāng)?shù)拿直惠斎霑r(shí),顯示特殊的信息,否則就什么也不顯示。這段代碼應(yīng)該是這樣的:


if ( $name == "Kevin" ) {
echo( "Welcome, oh glorious leader!" );
}



  在上面條件中所使用的==是用比較兩個(gè)值是否相等的運(yùn)算符。要特別記住的是在這兒你需要輸入兩個(gè)等號。如果你輸入的是一個(gè)等號,你實(shí)際上使用的是前面我們討論過的賦值運(yùn)算符,你將不再是對兩個(gè)變量的值進(jìn)行比較,而是給變量賦了一個(gè)新值(這個(gè)操作會附帶地返回一個(gè)true)。這樣做的結(jié)果不僅僅是導(dǎo)致這個(gè)條件永遠(yuǎn)是true,它還可能改變我們所要檢查的變量的值,這可能會導(dǎo)致很多問題。

  防止發(fā)生這種錯(cuò)誤有一種安全的做法,那就是象下面這樣顛倒用來比較的變量和常量的位置:

if ( "Kevin" == $name ) {


  這樣做的效果是完全相同的,但是當(dāng)你忘了第二個(gè)等號時(shí),我們來看看會發(fā)生什么情況。PHP會試圖將變量($name)的值插入常量("Kevin")中。因?yàn)槟悴荒芨淖兂A康闹,PHP會中斷并提示一個(gè)錯(cuò)誤信息,這將立即提示你忘了第二個(gè)等于號!

  條件可以比單個(gè)的比較是否相等來得更復(fù)雜;貞浳覀冃薷牡膚elcome.php3,它是可以同時(shí)獲取firstname和lastname的。如果我們想要為某個(gè)特定的人顯示一個(gè)特殊的信息,我們可以同時(shí)比較這兩個(gè)變量:


if ( "Kevin" == $firstname and "Yank" == $lastname ) {
echo( "Welcome, oh glorious leader!" );
}



  只有$firstname的值是Kevin,而且$lastname的值是Yank時(shí)這個(gè)條件才會返回真。and的意義就是只有兩個(gè)比較都為真時(shí),整個(gè)條件才會返回真。還有一個(gè)符號是or,這使得兩個(gè)比較中至少有一個(gè)為真時(shí),整個(gè)條件就返回真。如果你對JavaScript和C中的運(yùn)算符(&&(and)和 (or))熟悉的話,你也可以在PHP中同樣地使用它們。

  在下面我們將看到一些更復(fù)雜的比較,F(xiàn)在,我們只需要對if-else語句有個(gè)基本的理解就可以了。

  另一個(gè)常用的PHP控制語句是while循環(huán)。if-else語句使我們可以根據(jù)條件選擇是否執(zhí)行一組語句,while循環(huán)使我們可以根據(jù)條件來決定重復(fù)執(zhí)行一組語句多少次。while循環(huán)的基本格式應(yīng)該是這樣的:


while ( <condition> ) {
//只要<condition>是真時(shí)反復(fù)執(zhí)行的語句
}



  這和一個(gè)沒有else子句的if-else 語句非常相象。不同點(diǎn)在于當(dāng)條件為真時(shí)語句執(zhí)行完后,將不再是接著執(zhí)行結(jié)束符(})后面的語句,而是再次檢查條件。如果這個(gè)條件仍為真。將會重復(fù)執(zhí)行語句,直到條件不再為真時(shí)為止。當(dāng)這個(gè)條件首次返回假時(shí)(不管是第幾次檢查它),將會跳轉(zhuǎn)執(zhí)行循環(huán)后面的語句(在結(jié)束符后面)。

  這樣的循環(huán)可以用來處理一個(gè)事物的較長的列表(例如存儲在數(shù)據(jù)庫中的笑話),下面我們舉了一個(gè)簡單的例子:計(jì)數(shù)到10。


$count = 1;
while ($count <= 10) {
echo( "$count " );
$count++;
}



  我知道這段語句可能看上去挺恐怖,但是我們可以一行行地來看它。第一行定義了一個(gè)叫$count的變量并將其賦值為1。第二行是while循環(huán)的開始,條件是$count小于或等于(<=)10。第三行和第四行是while循環(huán)的循環(huán)體,當(dāng)條件為真時(shí),我們將重復(fù)執(zhí)行它。第三行簡單地輸出了一$count的值,并在其后加了一個(gè)空格。第四行將$count的值加一($count++是$count = $count + 1的縮寫--兩者的意義是完全一樣的)。

  現(xiàn)在我們可以看看這段程序是如何執(zhí)行的了。當(dāng)?shù)谝淮螜z查條件時(shí),$count的值是1,所以條件為真。$count的值(1)被輸出,接著$count被賦予了一個(gè)新值2。當(dāng)?shù)诙螜z查條件時(shí)條件仍為真,所以2 被輸出,并賦了一個(gè)新值3 。這個(gè)過程被繼續(xù)下去,輸出了3 ,4 ,5 ,6 ,7 ,8 ,9 直到10 。最后,$count被賦予值11,條件為假,循環(huán)結(jié)束。最終的結(jié)果是輸出了這樣一個(gè)字符串“1 2 3 4 5 6 7 8 9 10”。

  在這個(gè)例子的條件中我們使用了一個(gè)新的運(yùn)算符:<= (小于或等于)。其他用于數(shù)值比較的運(yùn)算符還有>=(大于或等于),<(小于),>(大于)和!=(不等于)。最后一個(gè)也可以使用于字符串比較中。

多用途的頁面

  如果你想在你建立的網(wǎng)站的每一個(gè)網(wǎng)頁的頂端都顯示訪問者的姓名。使用我們前面的自動顯示歡迎信息的例子,我們已經(jīng)基本上成功了一半,F(xiàn)在我們只要對我們示例解決這幾個(gè)問題就行了:

  我們需要在站點(diǎn)的每一個(gè)頁面都顯示,而不是僅僅在一個(gè)頁面上。

  我們無法控制在我們的站點(diǎn)上那一個(gè)頁面會首先顯示。

  第一個(gè)問題的解決不是太困難的。當(dāng)我們在一個(gè)頁面上獲得了用戶名這個(gè)變量后,我們可以在任何請求中通過將其添加到一個(gè)查詢字符串來傳遞這個(gè)變量:

<A HREF="newpage.php?name=<?php echo(urlencode($name)); ?>"> A link </A>


  請注意我們在HTML標(biāo)識符的中間嵌入了PHP的代碼。實(shí)際上這是非常常用的。我們已經(jīng)對echo這個(gè)函數(shù)很熟悉,但是我們還不熟悉urlencode函數(shù)。這個(gè)函數(shù)的功能是將字符串中一些特殊的字符(例如空格)轉(zhuǎn)換成特定的編碼,以使它們能夠在查詢字符串中顯示。例如,如果$name變量的值是"Kevin Yank",其中的空格在查詢字符串中不允許存在,urlencode的輸出將是Kevin+Yank,在newpage.php中建立$name時(shí),值將會被自動轉(zhuǎn)換回來。

  Ok,現(xiàn)在已經(jīng)可以將用戶名傳遞給我們站點(diǎn)的第一個(gè)連接了,F(xiàn)在我們所需要的就是在其第一次出現(xiàn)時(shí),要能獲得它的值。在我們上面的例子中,我們已經(jīng)做了一個(gè)HTML頁面用來處理獲得用戶名的表單。而問題是我們不能強(qiáng)迫用戶在每一次訪問我們的站點(diǎn)時(shí)都從這個(gè)頁面開始。

  解決方案是在我們站點(diǎn)的每一個(gè)頁面都檢查是否指定了一個(gè)用戶名,如果需要,應(yīng)該提求用戶輸入用戶名。這意味著我們站點(diǎn)上的每一個(gè)頁面都必須能顯示用戶名,在未指定用戶名時(shí),應(yīng)提示用戶輸入。如果你現(xiàn)在就想到了使用if-else語句,那證明你的學(xué)習(xí)能力真的不錯(cuò)!

  我們的“多功能頁面”應(yīng)該根據(jù)不同的條件顯示完全不同的內(nèi)容,這個(gè)頁面的源程序?qū)沁@樣的:


<HTML>
<HEAD>
<TITLE> Multi-Purpose Page Outline </TITLE>
</HEAD>
<BODY>
<?php if (<condition>) { ?>
<!-- HTML content to display if <condition> is true -->
<?php } else { ?>
<!-- HTML content to display if <condition> is false -->
<?php } ?>
</BODY>
</HTML>



  這段程序初看上去很混亂,但是事實(shí)上這仍然是普通的if-else語句,只不過在其中插入了HTML代碼,而不是我們之前使用的PHP語句。這個(gè)例子說明了PHP的一個(gè)很大的優(yōu)點(diǎn):你可以自由地選擇在什么時(shí)候進(jìn)行或退出“PHP模式”。你可以將<?php看成是進(jìn)入“PHP模式”的命令,將?>看成是返回到“普通的HTML模式”的命令。這樣上面的例子就變得很容易理解了。

  if-else語句還有另外的一種格式,使用這種格式將使你的程序更易讀懂。如果使用這種格式,我們的“多功能頁面”的源程序?qū)⑹沁@樣的:


<HTML>
<HEAD>
<TITLE> Multi-Purpose Page Outline </TITLE>
</HEAD>
<BODY>
<?php if (<condition>): ?>
<!-- HTML content to display if <condition> is true -->
<?php else: ?>
<!-- HTML content to display if <condition> is false -->
<?php endif; ?>
</BODY>
</HTML>



  Ok,現(xiàn)在我們已經(jīng)有了所有我們需要的工具,讓我們看看我們的站點(diǎn)中的一個(gè)樣頁:


<HTML>
<HEAD>
<TITLE> Sample Page </TITLE>
</HEAD>
<BODY>
<?php if ( isset($name) ): ?>
<P>Your name: <?php echo($name); ?></P>
<P>This paragraph contains a
<A HREF="newpage.php?name=<?php echo(urlencode
($name)); ?>">link</A> that passes the
name variable on to the next document.</P>
<?php else: ?>
<!-- No name has been provided, so we
 prompt the user for one. -->
<FORM ACTION=<?php echo($PHP_SELF); ?> METHOD=GET>
Please enter your name: <INPUT TYPE=TEXT NAME="name">
<INPUT TYPE=SUBMIT VALUE="GO">
</FORM>
<?php endif; ?>
</BODY>
</HTML>



  在上面的程序中出現(xiàn)了兩個(gè)新的東西,但是理解它們應(yīng)該不是太困難的。首先,我們在條件中使用了一個(gè)新的函數(shù):isset。當(dāng)變量已經(jīng)被賦值(在我們這里也就是指提供了用戶名),該函數(shù)將返回(輸出)一個(gè)邏輯真;當(dāng)變量沒有被賦值(在我們這里也就是指沒有提供用戶名),該函數(shù)將返回(輸出)一個(gè)邏輯假。第二個(gè)新東西是在指定FORM標(biāo)志中的ACTION屬性中使用了$PHP_SELF變量。這個(gè)變量是自動產(chǎn)生的系統(tǒng)變量之一。具體地說,$PHP_SELF總是被設(shè)置成當(dāng)前頁面的URL。當(dāng)一個(gè)表單在提交時(shí)指向同一個(gè)頁面時(shí),這給我們提供一個(gè)簡單的做法。只不過這時(shí)的 $name變量已經(jīng)被賦值了。

  將這一段加到你的網(wǎng)站上的所有網(wǎng)頁上后,不管訪問者第一次訪問的是什么網(wǎng)頁,都會被提示輸入用戶名。只有在輸入了用戶名并按了“GO”,才能到達(dá)他們真正想要訪問的網(wǎng)頁。輸入的用戶名會被通過每個(gè)連接中的查詢字符串傳遞到之后的各個(gè)頁面,這樣就可以確保只要求訪問者輸入一次用戶名。

結(jié)語

  在這一章內(nèi),我們介紹了PHP的所有的基本語法:語句、變量、運(yùn)算符以及控制語句。我們的例子是非常的簡單。但是事實(shí)上PHP的強(qiáng)大功能在于它內(nèi)置的數(shù)百個(gè)函數(shù),利用這些函數(shù)你可以訪問MySQL數(shù)據(jù)庫中的數(shù)據(jù)來發(fā)送郵件,可以通過動態(tài)產(chǎn)生的圖象來建立PDF文件,你還可以做其他的很多事情。

  在第四章,我們將探討如果利用MySQL在Web上發(fā)布我們在上一章中建立的笑話數(shù)據(jù)庫!