在這一課裡,我們會做一些更複雜的工作,來顯示多行記錄的資料,資料庫互相交換資料
一、 while迴圈
在這一課裡,我們將會繼續深入下去,使用PHP和MySQL來寫出一些簡單而有用的頁面。 我們從昨天創建的資料庫開始,顯示庫中的資料,但是會再稍微加以潤色。
首先,我們用下面的代碼來查詢資料庫內容。
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
echo "<table border=1> ";
echo "<tr><td>姓名</td><td>職位</td></tr> ";
while ($myrow = mysql_fetch_row($result)) {
printf("<tr><td>%s %s</td><td>%s</td></tr> ", $myrow[1], $myrow[2], $myrow[3]);
}
echo "</table> ";
?>
</body>
</html>
您可能已經注意到,我們在這個程式里加進了一些新東西。 最明顯的是while()迴圈。 該迴圈是說,只要資料庫裡還有記錄可讀(使用mysql_fetch_row()函數),那就把該記錄賦給變數$myrow,然後執行大括弧({})內的指令。 仔細看一下這裡,這部分是比較重要的。
我們應該注意一下mysql_fetch_row()函數。 這裡有一點小問題,它返回的是一個陣列,必須以陣列下標來訪問其中的某個欄位。 第一個欄位下標為0,第二個是1,依此類推。 在執行某些複雜查詢時,這麼做簡直實在是太煩瑣了。
現在我們更仔細地研究一下迴圈過程。 程式前幾行我們在第一課的例子中已經看到過了。 然後,在while()迴圈中,我們從查詢結果中讀取一條記錄並把該記錄賦給陣列$myrow。 接著,我們用printf函數把資料中的內容顯示在螢幕上。 隨後,迴圈反復執行,讀取下一條記錄賦給$myrow。 這樣繼續下去,直到所有記錄都已被讀取完為止。
使用while()迴圈的一個好處是,如果資料庫查詢沒有返回任何記錄,那您也不會收到錯誤資訊。 在剛執行迴圈語句時,迴圈條件就不滿足,不會有任何資料賦給$myrow,程式就直接往下運行了。
但是如果查詢未返回任何資料,我們怎麼讓使用者知道這一點呢? 我們也許該提供點兒相關的消息給使用者吧。 這是可以做到的,下面我們就看看怎麼做。 >>
二、 if-else
請看下面的程式。
<html>
<body>
<?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 "<table border=1> ";
echo "<tr><td>姓名</td><td>住址</td></tr> ";
do {
printf("<tr><td>%s %s</td><td>%s</tr> ", $myrow["first"], $myrow["last"], $myrow[" address"]);
}
while ($myrow = mysql_fetch_array($result));
echo "</table> ";
} else {
echo "對不起,沒有找到記錄! ";
}
?>
</body>
</html>
這段程式中包含有不少新內容,不過這些內容都相當簡單。 首先是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方法;第二種是在瀏覽器的網址列中輸入網址時直接加上查詢參數;第三種是把查詢參數串嵌入到網頁的超連結中,使得超連結的內容象下面這樣:<a href="HTTP://my_machine/ mypage.php3?id=1">。 我們現在要用到最後這一種方法。
一開始,我們再來查詢我們的資料庫,列出員工姓名。 看看下面的程式,其中大部分內容我們都已經很熟悉了。
<html>
<body>
<?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("<a href="%s?id=%s">%s %s</a><br> ", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last "]);
} while ($myrow = mysql_fetch_array($result));
} else {
echo "對不起,沒有找到記錄! ";
}
?>
</body>
</html>
這裡沒什麼特別的,只是printf函數有些不同。 那我們就來仔細研究一下。
首先要注意的是,所有的引號前面都有一個反斜線。 這個反斜線告訴PHP直接顯示後面的字元,而不能把後面的字元當作程式碼來處理。 另外要注意變數$PATH_INFO的用法。 該變數在所用程式中都可以訪問,是用來保存程式自身的名稱與目錄位置的。 我們之所以用到它是因為要在頁面中再調用這個程式本身。 使用$PATH_INFO,我們可以做到,即使程式被挪到其他目錄,甚至是其他機器上時,我們也能保證正確地調用到這個程式。
正如我剛才提到的,程式所生成的網頁,其中包含的超連結會再次調用程式本身。 不過,再次調用時,會加入一些查詢參數。
PHP見到查詢參數串中包含有「名字=值」這樣的成對格式時,會作一些特別的處理。 它會自動生成一個變數,變數名稱與取值都與查詢參數串中所給定的名稱和取值相同。 這一功能使得我們可以在程式中判斷出是第一次執行本程式還是第二次。 我們所要做的只是問問PHP$id這個變數是否存在。
當我知道這個問題的答案後,我可以在第二次調用程式時顯示一些不同的結果出來。 請看:
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb ",$db);
// display individual record
// 顯示單條記錄內容
if ($id) {
$result = mysql_query("SELECT * FROM employees WHER E id=$id",$db);
$myrow = mysql_fetch_array($result);
printf("名: %s <br>", $myrow["first"]);
printf("姓: %s <br>", $myrow["last"]);
printf("住址: %s <br>", $myrow["address"]);
printf("職位: %s <br>", $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("<a href="%s?id=%s">%s %s</a><br> ", $PATH_INFO,
$myrow["id"], $myrow["first" ], $myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
} else {
// no records to display
沒有記錄可顯示 echo "對不起,沒有找到記錄! ";
}
}
?>
</body>
</html>
程式開始變得複雜了,所以我在這裡面加了注釋,來解釋一下到底發生了什麼。 您可以用//加入單行注釋,或者用/*和*/來括住大段的注釋。
到這裡,我們已經學會了第一個真正有用的PHP/MySQL腳本程式! 現在,我們要看看怎樣把Web表格加進來,並且向資料庫發送資料。
四、 向伺服器發送資料
現在我們從資料庫讀取資料已經沒有太多困難了。 但是怎麼反過來向資料庫發送資料呢? 其實這不是PHP的問題。
首選,我們創建一個帶有簡單表格的網頁。
<html>
<body>
<form method="post" action="<?php echo $PATH_INFO?>">
名:<input type="Text" name="first"><br>
姓:<input type="Text" name="last"><br>
住址:<input type="Text" name="address"><br>
職位:<input type="Text" name="position"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
</body>
</html>
同樣要注意$PATH_INFO的用法。 就象我在第一課裡講到的,您可以在HTML代碼中的任意位置使用PHP。 您也會注意到,表格中的每一個元素都對應著資料庫中的一個欄位。 這種對應關係並不是必須的,這麼做只是更直觀一些,便於您以後理解這些代碼。
還要注意的是,我在Submit按鈕中加入了name屬性。 這樣我在程式中可以試探$submit變數是否存在。 於是,當網頁被再次調用時,我就會知道調用頁面時是否已經填寫了表格。
我應該指出,您不一定要把上面的網頁內容寫到PHP程式中,再返過來調用程式本身。 您完全可以把顯示表格的網頁和處理表格的程式分開放在兩個網頁、三個網頁甚至更多網頁中,悉聽尊便。 放在一個檔中只是可以使內容更加緊湊而已。
那好,我們現在加入一些代碼,來檢查使用者在表格中輸入的內容。 我會把用$HTTP_POST_VARS把所有查詢參數變數都顯示出來,這只不過是為了證明PHP確實把所有變數都傳給了程式。 這種方法是一個很有用的調試手段。 如果您要想看全部的變數,可以用$GLOBALS。
<html>
<body>
<?php
if ($submit) {
處理表格輸入
while (list($name, $value) = each($HTTP_POST_VARS)) {
echo "$name = $value<br> ";
}
} else{
顯示表格
?>
<form method="post" action="<?php echo $PATH_INFO?>">
名:<input type="Text" name="first"><br>
姓:<input type="Text" name="last"><br>
住址:<input type="Text" name="address"><br>
職位:<input type="Text" name="position"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
<?php
} // end if,if結束
?>
</body>
</html>
程式現在運行正常,那我們現在就可以取到表格輸入的內容,並把它們發送給資料庫。
<html>
<body>
<?php
if ($submit) {
處理表格輸入
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$sql = "INSERT INTO employees (first,last,address,position)
VALUES (‘$first‘,‘$last‘,‘$address‘,‘$position‘)";
$result = mysql_query($sql);
echo "Thank you! Information entered. ";
} else{
顯示表格內容
?>
<form method="post" action="<?php echo $PATH_INFO?>">
名:<input type="Text" name="first"><br>
姓:<input type="Text" name="last"><br>
住址:<input type="Text" name="address"><br>
職位:<input type="Text" name="position"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
<?php
} // end if,if結束
?>
</body>
</html>
您現在已經向資料庫中插入資料了。 不過還有很多完善的工作要做。 如果使用者沒有填寫某一欄怎麼辦? 在需要填入數位的地方填了文字怎麼辦? 或者填錯了怎麼辦?
五、修改資料
在個教程中,我都把要執行的SQL語句放到一個變數($sql)中,然後才用mysql_query()來執行資料庫查詢。 在調試時這是很有用的。 如果程式出了什麼問題,您隨時可以把SQL語句的內容顯示出來,檢查其中的語法錯誤。
我們已經學習了如何把資料插入到資料庫中。 現在我們來學習如何修改資料庫中已有的記錄。 資料的編輯包括兩部分:資料顯示和通過表格輸入把資料返回給資料庫,這兩部分我們前面都已經講到了。 然而,資料編輯還是有一點點不同,我們必須先在表格中顯示出相關的資料。
首先,我們回過頭再看看第一課的程式碼,在網頁中顯示員工姓名。 但是這次,我們要把資料顯示在表格中。 程式看起來象下面這樣:
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb ",$db);
if ($id) {
// 查詢資料庫
$sql = "SELECT * FROM employees WHERE id=$id";
$result = mysql_query($sql);
$myro w = mysql_fetch_array($result);
?>
<form method="post" action="<?php echo $PATH_INFO?>">
<input type=hidden name="id" value="<?php echo $myrow["id"] ?>">
名:<input type="Text" name="first" value="<?php echo
$myrow[" first"] ?>"><br>
姓:<input type="Text" name="last" value="<?php echo
$myrow["last"] ?>" ><br>
住址:<input type="Text" name="address" value="<?php echo
$myrow["address"] ?>">< br>
職位:<input type="Text" name="position" value="<?php echo
$myrow["position"] ?>"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
<?php
} else {
// 顯示員工清單
$result = mysql_query("SELECT * FROM employees",$db);
while ($myrow = mysql_fetch_array($result)) {
printf("<a href="%s?id=%s">%s %s</a><br> ", $ PATH_INFO,
$myrow["id"], $myrow["first"], $myrow["last"]);
}
}
?>
</body>
</html>
我們剛才是把欄位內容寫入到相應表格元素中的value屬性裡,這是相應簡單的。 我們再往前進一步,使程式可以把使用者修改過的內容寫回資料庫去。 同樣,我們通過Submit按鈕來判斷是否處理表格輸入內容。 還要注意,我們用的SQL語句稍稍有些不同。
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb ",$db);
if ($id) {
if ($submit) {
$sql = "UPDATE employees SET first=‘$first‘,last=‘$last‘,
address=‘$address‘,po sition=‘$position‘ WHERE id=$id";
$result = mysql_query($sql);
echo "謝謝! 資料更改完成 ";
} else {
// 查詢資料庫
$sql = "SELECT * FROM employees WHERE id=$id";
$result = mysql_query($sql);
$myrow = mysql_fetch_array($result);
?>
<form method="post" action="<?php echo $PATH_INFO?>">
<input type=hidden name="id" value="<?php echo $myrow["id"] ?>">
名:<input type="Text" name="first" value="<?php
echo $myrow[" first"] ?>"><br>
姓:<input type="Text" name="last" value="<?php echo
$myrow["last"] ?>" ><br>
住址:<input type="Text" name="address" value="<?php echo
$myrow["address"] ?>">< br>
職位:<input type="Text" name="position" value="<?php echo
$myrow["position"] ?>"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
<?php
}
} else {
// 顯示員工清單
$result = mysql_query("SELECT * FROM employees",$db);
while ($myrow = mysql_fetch_array($result)) {
printf("<a href="%s?id=%s">%s %s</a><br> ", $ PATH_INFO,
$myrow["id"], $myrow["first"], $myrow["last"]);
}
}
?>
</body>
</html>
就是這樣。 在這個程式中已經包含了我們學過所大多數特性。 您也已經看到,我們在一個if()條件判別語句中又加了一個if()語句,來檢查多重條件。
六、完整的程式
在本課結束前,我們要把所有東西加入到一個程式中,使它具有增加、編輯修改、刪除記錄的功能。 這是前面所有內容的一個延伸,也可以作為極好的複習方法。 看看下面的程式。
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
if ($submit) {
// 如果沒有ID,則我們是在增加記錄,否則我們是在修改記錄
if ($id) {
$sql = "UPDATE employees SET first=‘$first‘,last=‘$last‘,
address=‘$address‘,position=‘$position‘ WHERE id=$id";
} else {
$sql = "INSERT INTO employees (first,last,address,position)
VALUES (‘$first‘,‘$last‘,‘$address‘,‘$position‘)";
}
// 向資料庫發出SQL命令
$result = mysql_query($sql);
echo "記錄修改成功! <p>";
} elseif ($delete) {
// 刪除一條記錄
$sql = "DELETE FROM employees WHERE id=$id";
$result = mysql_query($sql);
echo "記錄刪除成功! <p>";
} else {
// 如果我們還沒有按submit按鈕,那麼執行下面這部分程式
if (!$id) {
// 如果不是修改狀態,則顯示員工清單 $result = mysql_query("SELECT * FROM employees",$db);
while ($myrow = mysql_fetch_array($result)) {
printf("<a href="%s?id=%s">%s %s</a> ",
$PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]);
printf("<a href="%s?id=%s&delete=yes">(DELETE)</a><
br>", $PATH_INFO, $myrow["id"]);
}
}
?>
<P>
<a href="<?php echo $PATH_INFO?>">ADD A RECORD</a>
<P>
<form method="post" action="<?php echo $PATH_INFO?>">
<?php
if ($id) {
// 我們是在編輯修改狀態,因些選擇一條記錄
$sql = "SELECT * FROM employees WHERE id=$id";
$result = mysql_query($sql);
$myrow = mysql_fetch_array($result);
$id = $myrow["id"];
$first = $myrow["first"];
$last = $myrow["last"];
$address = $myrow["address"];
$position = $myrow["position"];
// 顯示id,供使用者編輯修改
?>
<input type=hidden name="id" value="<?php echo $id ?>">
<?php
}
?>
名:<input type="Text" name="first" value="<?php echo $first ?>"><br>
姓:<input type="Text" name="last" value="<?php echo $last ?>"><br>
住址:<input type="Text" name="address" value="<?php echo $address ?>"><br>
職位:<input type="Text" name="position" value="<?php echo $position ?>"><br>
<input type="Submit" name="submit" value="輸入資訊">
</form>
<?php
}
?>
</body>
<`/html>
這段程式看起來很複雜,但實際上並不難。 程式主要有三個部分。 第一個if()語句檢查我們是否已經按下了那個「輸入資訊」的資料提交按鈕。 如果是,程式再檢查$id是否存在。 如果不存在,那我們就是在增加記錄狀態,否則,我們是在修改記錄狀態。
接下來我們檢查變數$delete是否存在。 如果存在,我們是要刪除記錄。 注意,第一個if()語句檢查的是用POST方法發送來的變數,而這一次我們檢查的是GET方法中傳遞過來的變數。
最後,程式預設的動作是顯示員工清單和表格。 同樣,我們要檢查變數$id是否存在。 如果存在,我們就根據它的值檢索出相應的記錄顯示出來。 否則,我們會顯示一個空的表格。
現在,我們已經把所學的東西全部都放在一個程式裡頭了。 我們用到了while()迴圈,用到了if()語句,並且執行了全部的SQL基本操作 - SELECT、INSERT、UPDATE以及DELETE。 另外,我們也知道如何在不同的網頁之間通過URL和表格輸入來互相傳遞資訊。