一、 while迴圈
在這一課裡,我們將會繼續深入下去,使用PHP和MySQL來寫出一些簡單而有用的頁面。我們從昨天建立的資料庫開始,顯示庫中的資料,但是會再稍微加以潤色。
首先,我們用下面的代碼來查詢資料庫內容。
| |
$#@60;html$#@62;
$#@60;body$#@62;
$#@60;?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
echo "$#@60;table border=1$#@62;\n";
echo "$#@60;tr$#@62;$#@60;td$#@62;姓名$#@60;/td$#@62;$#@60;td$#@62;職位$#@60;/td$#@62;$#@60;/tr$#@62;\n";
while ($myrow = mysql_fetch_row($result)) {
printf("$#@60;tr$#@62;$#@60;td$#@62;%s %s$#@60;/td$#@62;$#@60;td$#@62;%s$#@60;/td$#@62;$#@60;/tr$#@62;\n", $myro w[1], $myrow[2], $myrow[3]);
}
echo "$#@60;/table$#@62;\n";
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62; |
您可能已經注意到,我們在這個程式裡加進了一些新東西。最明顯的是while()迴圈。該迴圈是說,只要資料庫裡還有記錄可讀(使用mysql_fetch_row()函數),那就把該記錄賦給變數$myrow,然後執行大括弧({})內的指令。仔細看一下這裡,這部分是比較重要的。
我們應該注意一下mysql_fetch_row()函數。這裡有一點小問題,它返回的是一個數組,必須以數組下標來訪問其中的某個欄位。第一個欄位下標為0,第二個是1,依此類推。在執行某些複雜查詢時,這麼做簡直實在是太煩瑣了。
現在我們更仔細地研究一下迴圈過程。程式前幾行我們在第一課的例子中已經看到過了。然後,在while()迴圈中,我們從查詢結果中讀取一條記錄並把該記錄賦給數組$myrow。接著,我們用printf函數把資料中的內容顯示在螢幕上。隨後,迴圈反覆執行,讀取下一條記錄賦給$myrow。這樣繼續下去,直到所有記錄都已被讀取完為止。
使用while()迴圈? 個好處是,如果資料庫查詢沒有返回任何記錄,那您也不會收到錯誤資訊。在剛執行迴圈語句時,迴圈條件就不滿足,不會有任何資料賦給$myrow,程式就直接往下運行了。
但是如果查詢未返回任何資料,我們怎麼讓使用者知道這一點呢?我們也許該提供點兒相關的訊息給使用者吧。這是可以做到的,下面我們就看看怎麼做。
二、 if-else
請看下面的程式。
| |
$#@60;html$#@62;
$#@60;body$#@62;
$#@60;?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($myrow = mysql_fetch_array($result)) {
echo "$#@60;table border=1$#@62;\n";
echo "$#@60;tr$#@62;$#@60;td$#@62;姓名$#@60;/td$#@62;$#@60;td$#@62;住址$#@60;/td$#@62;$#@60;/tr$#@62;\n";
do {
printf("$#@60;tr$#@62;$#@60;td$#@62;%s %s$#@60;/td$#@62;$#@60;td$#@62;%s$#@60;/tr$#@62;\n", $myrow["first"], $myrow["last"], $myrow["address"]);
} while ($myrow = mysql_fetch_array($result));
echo "$#@60;/table$#@62;\n";
} else {
echo "對不起,沒有找到記錄!";
}
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
|
這段程式中包含有不少新內容,不過這些內容都相當簡單。首先是mysql_fetch_array()函數。該函數與mysql_fetch_row()十分相近,只有一點不同:使用這個函數時,我們可以通過欄位名而不是數組下標來訪問它返回的欄位,比如$myrow["first"]。這樣我們就可以省不少力氣了。另外,程式中還加進了do/while迴圈和if-else條件判定語句。
if-else條件判定語句的含意是,如果我們成功地把一條記錄賦給了$myrow變數,那就繼續;否則,就跳到else部分,執行那裡的指令。
do/while迴圈是我們在上頁中使用者的while()迴圈的一個變體。我們要用到do/while的原因是:在最初的if語句中,我們已經把查詢返回的第一條記錄賦給變數$myrow了。如果這時我們執行一般的while迴圈(比如,while ($myrow = mysql_fetch_row($result)),那我們就會把第二條記錄賦給$myrow,而第一條記錄就被衝掉了。但是do/while迴圈可以讓我們執行一次迴圈體內容之後再來判定迴圈條件。因此,我們就不會不小心漏掉第一條記錄了。
最後,如果查詢結果沒有任何記錄的話,程式就會執行包含在else{}部分的那些語句。如果您想看到這部分程式的執行情況,可以把SQL語句改為SELECT * FROM employees WHERE id=6,或改成其他形式,使得查詢結果中沒有任何記錄。
下面我們來擴充一下迴圈if-else 代碼,使得頁面內容更加豐富。相信您會喜歡的。
三、 第一個程式指令碼
我們剛剛學到了迴圈語句,下面我們將在一個更加實際一點的例子中看看如何運用它。但是在這之前,您應該知道如何處理Web表格、查詢參數串,以及表單的GET方法和POST方法。
現在,我們要處理查詢參數串,正如您所知道的,有三種方法可以把參數內容寫入到查詢參數串中。第一種是在表格中使用GET方法;第二種是在瀏覽器的地址欄中輸入網址時直接加上查詢參數;第三種是把查詢參數串嵌入到網頁的超連結中,使得超連結的內容象下面這樣:$#@60;a href="http://my_machine/mypage.php3?id=1"$#@62;。我們現在要用到最後這一種方法。
一開始,我們再來查詢我們的資料庫,列出員工姓名。看看下面的程式,其中大部分內容我們都已經很熟悉了。
| |
$#@60;html$#@62;
$#@60;body$#@62;
$#@60;?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($myrow = mysql_fetch_array($result)) {
do {
printf("$#@60;a href=\"%s?id=%s\"$#@62;%s %s$#@60;/a$#@62;$#@60;br$#@62;\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
} else {
echo "對不起,沒有找到記錄!";
}
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
|
這裡沒什麼特別的,只是printf函數有些不同。那我們就來仔細研究一下。
首先要注意的是,所有的引號前面都有一個反斜線。這個反斜線告訴PHP直接顯示後面的字元,而不能把後面的字元當作程式碼來處理。另外要注意變數$PATH_INFO的用法。該變數在所用程式中都可以訪問,是用來儲存程式自身的名稱與目錄位置的。我們之所以用到它是因為要在頁面中再調用這個程式本身。使用$PATH_INFO,我們可以做到,即使程式被挪到其他目錄,甚至是其他機器上時,我們也能保證正確地調用到這個程式。
正如我剛才提到的,程式所產生的網頁,其中包含的超連結會再次調用程式本身。不過,再次調用時,會加入一些查詢參數。
PHP見到查詢參數串中包含有“名字=值”這樣的成對格式時,會作一些特別的處理。它會自動產生一個變數,變數名稱與取值都與查詢參數串中所給定的名稱和取值相同。這一功能使得我們可以在程式中判斷出是第一次執行本程式還是第二次。我們所要做的只是問問PHP$id這個變數是否存在。
當我知道這個問題的答案後,我可以在第二次調用程式時顯示一些不同的結果出來。請看:
| |
$#@60;html$#@62;
$#@60;body$#@62;
$#@60;?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
// display individual record // 顯示單條記錄內容
if ($id) {
$result = mysql_query("SELECT * FROM employees WHERE id=$id",$db);
$myrow = mysql_fetch_array($result);
printf("名: %s\n$#@60;br$#@62;", $myrow["first"]);
printf("姓: %s\n$#@60;br$#@62;", $myrow["last"]);
printf("住址: %s\n$#@60;br$#@62;", $myrow["address"]);
printf("職位: %s\n$#@60;br$#@62;", $myrow["position"]);
} else {
// show employee list // 顯示員工列表
$result = mysql_query("SELECT * FROM employees",$db);
if ($myrow = mysql_fetch_array($result)) {
// display list if there are records to display // 如果有記錄,則顯示列表
do {
printf("$#@60;a href=\"%s?id=%s\"$#@62;%s %s$#@60;/a$#@62;$#@60;br$#@62;\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
} else {
// no records to display // 沒有記錄可顯示
echo "對不起,沒有找到記錄!";
}
}
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
|
程式開始變得複雜了,所以我在這裡面加了注釋,來解釋一下到底發生了什麼。您可以用//加入單行注釋,或者用/*和*/來括住大段的注釋。
到這裡,我們已經學會了第一個真正有用的PHP/MySQL指令碼程式!現在,我們要看看怎樣把Web表格加進來,並且向資料庫發送資料。