PHP/MySQL三日通-第二天(一)

       一、 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;
“;

echo “$#@60;tr$#@62;$#@60;td$#@62;姓名$#@60;/td$#@62;$#@60;td$#@62;職位$#@60;/td$#@62;$#@60;/tr$#@62;
“;

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;
“, $myro
w[1], $myrow[2], $myrow[3]);


}

echo “$#@60;/table$#@62;
“;

?$#@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;
“;

echo “$#@60;tr$#@62;$#@60;td$#@62;姓名$#@60;/td$#@62;$#@60;td$#@62;住址$#@60;/td$#@62;$#@60;/tr$#@62;
“;

do {

printf(“$#@60;tr$#@62;$#@60;td$#@62;%s %s$#@60;/td$#@62;$#@60;td$#@62;%s$#@60;/tr$#@62;
“, $myrow[“first”],
$myrow[“last”], $myrow[“address”]);

} while ($myrow = mysql_fetch_array($result));

echo “$#@60;/table$#@62;
“;

} 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 代碼,使得頁面內容更加豐富。相信您會喜歡的。

本新聞共2頁,當前在第1頁  1  asp”>2  

三、 第一個程序腳本

  我們剛剛學到瞭循環語句,下面我們將在一個更加實際一點的例子中看看如何運用它。但是在這之前,您應該知道如何處理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;
“,
$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 inpidual record
// 顯示單條記錄內容

if ($id) {

$result = mysql_query(“SELECT * FROM employees WHERE id=$id”,$db);

$myrow = mysql_fetch_array($result);

printf(“名: %s
$#@60;br$#@62;”, $myrow[“first”]);

printf(“姓: %s
$#@60;br$#@62;”, $myrow[“last”]);

printf(“住址: %s
$#@60;br$#@62;”, $myrow[“address”]);

p

發佈留言