用PHP與MySQL構建一個數據庫驅動的網站(5)
發表時間:2024-02-23 來源:明輝站整理相關軟件相關文章人氣:
[摘要]雖然看上去一切都好了,但是我們仍沒有達到我們真正地與用戶交互的目的,我們的用戶應該能夠輸入任意的信息,并將它交給PHP來處理。接著我們的個性化歡迎頁面的例子,我們想要讓我們的用戶任意地輸入他(或她)的名字并將其顯示到信息中,要讓用戶輸入數據,我們需要用到HTML的表單。這兒是表單的代碼:<F...
雖然看上去一切都好了,但是我們仍沒有達到我們真正地與用戶交互的目的,我們的用戶應該能夠輸入任意的信息,并將它交給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上發布我們在上一章中建立的笑話數據庫!