用PHP和MySQL構建一個資料庫驅動的網站(五)
最後更新:2017-02-28
來源:互聯網
上載者:User
mysql|資料|資料庫 雖然看上去一切都好了,但是我們仍沒有達到我們真正地與使用者互動的目的,我們的使用者應該能夠輸入任意的資訊,並將它交給PHP來處理。接著我們的個人化歡迎頁面的例子,我們想要讓我們的使用者任意地輸入他(或她)的名字並將其顯示到資訊中,要讓使用者輸入資料,我們需要用到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>
除了在這裡你可以任意輸入你的名字以外,這個表單所起的效果和我們上面的第二個串連(在查詢字串中使用firstname=Kevin&lastname=Yank)完全一樣。當你按提交按鈕(標誌為“GO”)時,瀏覽器會裝載welcome.php並自動為你在查詢字串中添加變數和它們的值。變數名就是在INPUT TYPE=TEXT標識中的NAME屬性,變數值就是使用者輸入的相應的內容。
INPUT TYPE=TEXT標識中的METHOD屬性是用來告訴瀏覽器如何在請求中發送變數名及變數值的。GET(就是我們在上面使用的)表示在查詢字串中傳遞變數,但是還有另外一種選擇。將變數顯示在查詢字串中並不總是令我們滿意的--甚至有的時候在技術上就是不可行的。如果在你的表單中包含了一個TEXTAREA標識用來讓使用者輸入大量的文本,這部分文本也顯示在查詢字串中實在是太長了,而且會超過瀏覽器所能支援的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>
這個表單和我們之前的那個在功能上完全一樣。唯一的不同是當使用者在按“GO”按鈕時所裝載頁面的URL將沒有一個查詢字串。一方面,這可以讓你通過表單提交大量的資料或者是敏感的資料(例如密碼),而不在一個查詢字串中顯示出來。另一方面,如果使用者將提交表單產生的結果頁添加到收藏夾,這個收藏夾是沒有用的,因為它不包含提交的資料。另外,附帶說一下,象AltaVista這樣的搜尋引擎總是利用查詢字串來提交查詢條件,其主要原因就是為了便於使用者將查詢結果頁添加到收藏夾中,以便在將來進行同樣的搜尋,因為搜尋條件是包含在URL之中的。
這兒講了利用表單來實現使用者與PHP的互動的基本的原理。在以後的例子中,我們將討論一些更進階的問題和技術。
控制語句
在我們之前看到的PHP的代碼的例子中,要麼是只有一個單獨的向Web頁面輸出文本語句;要麼是一系列的依次執行的語句。如果你用其他語言編寫過程式,你應該知道,實際上很少有這麼簡單的程式。
和任何其他的程式設計語言一樣,PHP也提供了很方便地處理指令碼中的“控制流程”的方法。就是說,PHP中包含了一些特殊的語句,通過這些語句你可是不受依次執行的順序的束縛。這種語句被稱之為“控制語句”。不理解?不要擔心!有一些例子會很好地協助你。
最基本最常用到的控制語句是if-else語句。它的結構是這樣的:
if ( <condition> ) {
//如果<condition>是真,將執行的語句。
} else {
//(可選)如果<condition>是假,將執行的語句。
}
這個控制語可以讓我們告訴PHP根據一些條件的真假來決定相應地執行哪一組語句。如果你不覺得我這麼做有點空虛,我們可以將我們剛才建立的welcome.php檔案修改為:
if ( $name == "Kevin" ) {
echo( "Welcome, oh glorious leader!" );
} else {
echo( "Welcome, $name!" );
}
現在,如果傳遞給這個頁面的name變數的值是Kevin,將顯示一個特殊的資訊。否則,將顯示一個包含輸入的name的普通的資訊。
需要指出的是,在這個結構中,“else子句”(它指出了if-else結構中條件為假時執行的內容)是可選的。對於上面的例子,如果我們的目的是當適當的名字被輸入時,顯示特殊的資訊,否則就什麼也不顯示。這段代碼應該是這樣的:
if ( $name == "Kevin" ) {
echo( "Welcome, oh glorious leader!" );
}
在上麵條件中所使用的==是用比較兩個值是否相等的運算子。要特別記住的是在這兒你需要輸入兩個等號。如果你輸入的是一個等號,你實際上使用的是前面我們討論過的賦值運算子,你將不再是對兩個變數的值進行比較,而是給變數賦了一個新值(這個操作會附帶地返回一個true)。這樣做的結果不僅僅是導致這個條件永遠是true,它還可能改變我們所要檢查的變數的值,這可能會導致很多問題。
防止發生這種錯誤有一種安全的做法,那就是象下面這樣顛倒用來比較的變數和常量的位置:
if ( "Kevin" == $name ) {
這樣做的效果是完全相同的,但是當你忘了第二個等號時,我們來看看會發生什麼情況。PHP會試圖將變數($name)的值插入常量("Kevin")中。因為你不能改變常量的值,PHP會中斷並提示一個錯誤資訊,這將立即提示你忘了第二個等號!
條件可以比單個的比較是否相等來得更複雜。回憶我們修改的welcome.php3,它是可以同時擷取firstname和lastname的。如果我們想要為某個特定的人顯示一個特殊的資訊,我們可以同時比較這兩個變數:
if ( "Kevin" == $firstname and "Yank" == $lastname ) {
echo( "Welcome, oh glorious leader!" );
}
只有$firstname的值是Kevin,而且$lastname的值是Yank時這個條件才會返回真。and的意義就是只有兩個比較都為真時,整個條件才會返回真。還有一個符號是or,這使得兩個比較中至少有一個為真時,整個條件就返回真。如果你對JavaScript和C中的運算子(&&(and)和||(or))熟悉的話,你也可以在PHP中同樣地使用它們。
在下面我們將看到一些更複雜的比較。現在,我們只需要對if-else語句有個基本的理解就可以了。
另一個常用的PHP控制語句是while迴圈。if-else語句使我們可以根據條件選擇是否執行一組語句,while迴圈使我們可以根據條件來決定重複執行一組語句多少次。while迴圈的基本格式應該是這樣的:
while ( <condition> ) {
//只要<condition>是真時反覆執行的語句
}
這和一個沒有else子句的if-else 語句非常相象。不同點在於當條件為真時語句執行完後,將不再是接著執行結束符(})後面的語句,而是再次檢查條件。如果這個條件仍為真。將會重複執行語句,直到條件不再為真時為止。當這個條件首次返回假時(不管是第幾次檢查它),將會跳轉執行迴圈後面的語句(在結束符後面)。
這樣的迴圈可以用來處理一個事物的較長的列表(例如儲存在資料庫中的笑話),下面我們舉了一個簡單的例子:計數到10。
$count = 1;
while ($count <= 10) {
echo( "$count " );
$count++;
}
我知道這段語句可能看上去挺恐怖,但是我們可以一行行地來看它。第一行定義了一個叫$count的變數並將其賦值為1。第二行是while迴圈的開始,條件是$count小於或等於(<=)10。第三行和第四行是while迴圈的迴圈體,當條件為真時,我們將重複執行它。第三行簡單地輸出了一$count的值,並在其後加了一個空格。第四行將$count的值加一($count++是$count = $count + 1的縮寫--兩者的意義是完全一樣的)。
現在我們可以看看這段程式是如何執行的了。當第一次檢查條件時,$count的值是1,所以條件為真。$count的值(1)被輸出,接著$count被賦予了一個新值2。當第二次檢查條件時條件仍為真,所以2 被輸出,並賦了一個新值3 。這個過程被繼續下去,輸出了3 ,4 ,5 ,6 ,7 ,8 ,9 直到10 。最後,$count被賦予值11,條件為假,迴圈結束。最終的結果是輸出了這樣一個字串“1 2 3 4 5 6 7 8 9 10”。
在這個例子的條件中我們使用了一個新的運算子:<= (小於或等於)。其他用於數值比較的運算子還有>=(大於或等於),<(小於),>(大於)和!=(不等於)。最後一個也可以使用於字串比較中。
多用途的頁面
如果你想在你建立的網站的每一個網頁的頂端都顯示訪問者的姓名。使用我們前面的自動顯示歡迎資訊的例子,我們已經基本上成功了一半。現在我們只要對我們樣本解決這幾個問題就行了:
我們需要在網站的每一個頁面都顯示,而不是僅僅在一個頁面上。
我們無法控制在我們的網站上那一個頁面會首先顯示。
第一個問題的解決不是太困難的。當我們在一個頁面上獲得了使用者名稱這個變數後,我們可以在任何請求中通過將其添加到一個查詢字串來傳遞這個變數:
<A HREF="newpage.php?name=<?php echo(urlencode($name)); ?>"> A link </A>
請注意我們在HTML標識符的中間嵌入了PHP的代碼。實際上這是非常常用的。我們已經對echo這個函數很熟悉,但是我們還不熟悉urlencode函數。這個函數的功能是將字串中一些特殊的字元(例如空格)轉換成特定的編碼,以使它們能夠在查詢字串中顯示。例如,如果$name變數的值是"Kevin Yank",其中的空格在查詢字串中不允許存在,urlencode的輸出將是Kevin+Yank,在newpage.php中建立$name時,值將會被自動轉換回來。
Ok,現在已經可以將使用者名稱傳遞給我們網站的第一個串連了。現在我們所需要的就是在其第一次出現時,要能獲得它的值。在我們上面的例子中,我們已經做了一個HTML頁面用來處理獲得使用者名稱的表單。而問題是我們不能強迫使用者在每一次訪問我們的網站時都從這個頁面開始。
解決方案是在我們網站的每一個頁面都檢查是否指定了一個使用者名稱,如果需要,應該提求使用者輸入使用者名稱。這意味著我們網站上的每一個頁面都必須能顯示使用者名稱,在未指定使用者名稱時,應提示使用者輸入。如果你現在就想到了使用if-else語句,那證明你的學習能力真的不錯!
我們的“多功能頁面”應該根據不同的條件顯示完全不同的內容,這個頁面的來源程式將會是這樣的:
<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>
這段程式初看上去很混亂,但是事實上這仍然是普通的if-else語句,只不過在其中插入了HTML代碼,而不是我們之前使用的PHP語句。這個例子說明了PHP的一個很大的優點:你可以自由地選擇在什麼時候進行或退出“PHP模式”。你可以將<?php看成是進入“PHP模式”的命令,將?>看成是返回到“普通的HTML模式”的命令。這樣上面的例子就變得很容易理解了。
if-else語句還有另外的一種格式,使用這種格式將使你的程式更易讀懂。如果使用這種格式,我們的“多功能頁面”的來源程式將是這樣的:
<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,現在我們已經有了所有我們需要的工具,讓我們看看我們的網站中的一個樣頁:
<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>
在上面的程式中出現了兩個新的東西,但是理解它們應該不是太困難的。首先,我們在條件中使用了一個新的函數:isset。當變數已經被賦值(在我們這裡也就是指提供了使用者名稱),該函數將返回(輸出)一個邏輯真;當變數沒有被賦值(在我們這裡也就是指沒有提供使用者名稱),該函數將返回(輸出)一個邏輯假。第二個新東西是在指定FORM標誌中的ACTION屬性中使用了$PHP_SELF變數。這個變數是自動產生的系統變數之一。具體地說,$PHP_SELF總是被設定成當前頁面的URL。當一個表單在提交時指向同一個頁面時,這給我們提供一個簡單的做法。只不過這時的 $name變數已經被賦值了。
將這一段加到你的網站上的所有網頁上後,不管訪問者第一次訪問的是什麼網頁,都會被提示輸入使用者名稱。只有在輸入了使用者名稱並按了“GO”,才能到達他們真正想要訪問的網頁。輸入的使用者名稱會被通過每個串連中的查詢字串傳遞到之後的各個頁面,這樣就可以確保只要求訪問者輸入一次使用者名稱。
結語
在這一章內,我們介紹了PHP的所有的基本文法:語句、變數、運算子以及控制語句。我們的例子是非常的簡單。但是事實上PHP的強大功能在於它內建的數百個函數,利用這些函數你可以訪問MySQL資料庫中的資料來發送郵件,可以通過動態產生的圖象來建立PDF檔案,你還可以做其他的很多事情。
在第四章,我們將探討如果利用MySQL在Web上發布我們在上一章中建立的笑話資料庫!