明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

php與mysql3日通-第二天

[摘要]一、 while循環(huán)  在這一課里,我們將會繼續(xù)深入下去,使用PHP和MySQL來寫出一些簡單而有用的頁面。我們從昨天創(chuàng)建的數(shù)據(jù)庫開始,顯示庫中的數(shù)據(jù),但是會再稍微加以潤色。   首先,我們用下面的...
一、 while循環(huán)

  在這一課里,我們將會繼續(xù)深入下去,使用PHP和MySQL來寫出一些簡單而有用的頁面。我們從昨天創(chuàng)建的數(shù)據(jù)庫開始,顯示庫中的數(shù)據(jù),但是會再稍微加以潤色。

  首先,我們用下面的代碼來查詢數(shù)據(jù)庫內(nèi)容。


<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
echo "<table border=1>\n";
echo "<tr><td>姓名</td><td>職位</td></tr>\n";
while ($myrow = mysql_fetch_row($result)) {
printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], $myrow[2], $myrow[3]);
}
echo "\n";
?>
</body>
</html>


  您可能已經(jīng)注意到,我們在這個程序里加進了一些新東西。最明顯的是while()循環(huán)。該循環(huán)是說,只要數(shù)據(jù)庫里還有記錄可讀(使用mysql_fetch_row()函數(shù)),那就把該記錄賦給變量$myrow,然后執(zhí)行大括號({})內(nèi)的指令。仔細看一下這里,這部分是比較重要的。

  我們應(yīng)該注意一下mysql_fetch_row()函數(shù)。這里有一點小問題,它返回的是一個數(shù)組,必須以數(shù)組下標來訪問其中的某個字段。第一個字段下標為0,第二個是1,依此類推。在執(zhí)行某些復(fù)雜查詢時,這么做簡直實在是太煩瑣了。

  現(xiàn)在我們更仔細地研究一下循環(huán)過程。程序前幾行我們在第一課的例子中已經(jīng)看到過了。然后,在while()循環(huán)中,我們從查詢結(jié)果中讀取一條記錄并把該記錄賦給數(shù)組$myrow。接著,我們用printf函數(shù)把數(shù)據(jù)中的內(nèi)容顯示在屏幕上。隨后,循環(huán)反復(fù)執(zhí)行,讀取下一條記錄賦給$myrow。這樣繼續(xù)下去,直到所有記錄都已被讀取完為止。

  使用while()循環(huán)的一個好處是,如果數(shù)據(jù)庫查詢沒有返回任何記錄,那您也不會收到錯誤信息。在剛執(zhí)行循環(huán)語句時,循環(huán)條件就不滿足,不會有任何數(shù)據(jù)賦給$myrow,程序就直接往下運行了。

  但是如果查詢未返回任何數(shù)據(jù),我們怎么讓用戶知道這一點呢?我們也許該提供點兒相關(guān)的消息給用戶吧。這是可以做到的,下面我們就看看怎么做。>>


二、 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>\n";
echo "<tr><td>姓名</td><td>住址</td></tr>\n";
do {
printf("<tr><td>%s %s</td><td>%s</tr>\n", $myrow["first"], $myrow["last"], $myrow["address"]);
}
while ($myrow = mysql_fetch_array($result));
echo "\n";
} else {
echo "對不起,沒有找到記錄!";
}
?>
</body>
</html>

 
 這段程序中包含有不少新內(nèi)容,不過這些內(nèi)容都相當簡單。首先是mysql_fetch_array()函數(shù)。該函數(shù)與mysql_fetch_row()十分相近,只有一點不同:使用這個函數(shù)時,我們可以通過字段名而不是數(shù)組下標來訪問它返回的字段,比如$myrow["first"]。這樣我們就可以省不少力氣了。另外,程序中還加進了do/while循環(huán)和if-else條件判定語句。

  if-else條件判定語句的含意是,如果我們成功地把一條記錄賦給了$myrow變量,那就繼續(xù);否則,就跳到else部分,執(zhí)行那里的指令。

  do/while循環(huán)是我們在上頁中用戶的while()循環(huán)的一個變體。我們要用到do/while的原因是:在最初的if語句中,我們已經(jīng)把查詢返回的第一條記錄賦給變量$myrow了。如果這時我們執(zhí)行一般的while循環(huán)(比如,while ($myrow = mysql_fetch_row($result)),那我們就會把第二條記錄賦給$myrow,而第一條記錄就被沖掉了。但是do/while循環(huán)可以讓我們執(zhí)行一次循環(huán)體內(nèi)容之后再來判定循環(huán)條件。因此,我們就不會不小心漏掉第一條記錄了。

  最后,如果查詢結(jié)果沒有任何記錄的話,程序就會執(zhí)行包含在else{}部分的那些語句。如果您想看到這部分程序的執(zhí)行情況,可以把SQL語句改為SELECT * FROM employees WHERE id=6,或改成其他形式,使得查詢結(jié)果中沒有任何記錄。

  下面我們來擴充一下循環(huán)if-else 代碼,使得頁面內(nèi)容更加豐富。相信您會喜歡的。>>

三、 第一個程序腳本

  我們剛剛學到了循環(huán)語句,下面我們將在一個更加實際一點的例子中看看如何運用它。但是在這之前,您應(yīng)該知道如何處理Web表格、查詢參數(shù)串,以及表單的GET方法和POST方法。不久之前我們剛剛有文章介紹這部分內(nèi)容,您如果對這一部分還不太熟悉的話可以看看那篇文章。

  現(xiàn)在,我們要處理查詢參數(shù)串,正如您所知道的,有三種方法可以把參數(shù)內(nèi)容寫入到查詢參數(shù)串中。第一種是在表格中使用GET方法;第二種是在瀏覽器的地址欄中輸入網(wǎng)址時直接加上查詢參數(shù);第三種是把查詢參數(shù)串嵌入到網(wǎng)頁的超鏈接中,使得超鏈接的內(nèi)容象下面這樣:<a href="http://my_machine/mypage.php3?id=1">。我們現(xiàn)在要用到最后這一種方法。

  一開始,我們再來查詢我們的數(shù)據(jù)庫,列出員工姓名?纯聪旅娴某绦颍渲写蟛糠謨(nèi)容我們都已經(jīng)很熟悉了。
<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>\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
} else {
echo "對不起,沒有找到記錄!";
}
?>
</body>
</html>


這里沒什么特別的,只是printf函數(shù)有些不同。那我們就來仔細研究一下。

  首先要注意的是,所有的引號前面都有一個反斜杠。這個反斜杠告訴PHP直接顯示后面的字符,而不能把后面的字符當作程序代碼來處理。另外要注意變量$PATH_INFO的用法。該變量在所用程序中都可以訪問,是用來保存程序自身的名稱與目錄位置的。我們之所以用到它是因為要在頁面中再調(diào)用這個程序本身。使用$PATH_INFO,我們可以做到,即使程序被挪到其他目錄,甚至是其他機器上時,我們也能保證正確地調(diào)用到這個程序。

  正如我剛才提到的,程序所生成的網(wǎng)頁,其中包含的超鏈接會再次調(diào)用程序本身。不過,再次調(diào)用時,會加入一些查詢參數(shù)。

  PHP見到查詢參數(shù)串中包含有“名字=值”這樣的成對格式時,會作一些特別的處理。它會自動生成一個變量,變量名稱與取值都與查詢參數(shù)串中所給定的名稱和取值相同。這一功能使得我們可以在程序中判斷出是第一次執(zhí)行本程序還是第二次。我們所要做的只是問問PHP$id這個變量是否存在。

  當我知道這個問題的答案后,我可以在第二次調(diào)用程序時顯示一些不同的結(jié)果出來。請看:
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
// display individual record
// 顯示單條記錄內(nèi)容
if ($id) {
$result = mysql_query("SELECT * FROM employees WHERE id=$id",$db);
$myrow = mysql_fetch_array($result);
printf("名: %s\n<br>", $myrow["first"]);
printf("姓: %s\n<br>", $myrow["last"]);
printf("住址: %s\n<br>", $myrow["address"]);
printf("職位: %s\n<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>\n", $PATH_INFO,
$myrow["id"], $myrow["first"], $myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
} else {
// no records to display
// 沒有記錄可顯示 echo "對不起,沒有找到記錄!";
}
}
?>
</body>
</html>


  程序開始變得復(fù)雜了,所以我在這里面加了注釋,來解釋一下到底發(fā)生了什么。您可以用//加入單行注釋,或者用/*和*/來括住大段的注釋。

  到這里,我們已經(jīng)學會了第一個真正有用的PHP/MySQL腳本程序!現(xiàn)在,我們要看看怎樣把Web表格加進來,并且向數(shù)據(jù)庫發(fā)送數(shù)據(jù)。>>



四、 向服務(wù)器發(fā)送數(shù)據(jù)

  現(xiàn)在我們從數(shù)據(jù)庫讀取數(shù)據(jù)已經(jīng)沒有太多困難了。但是怎么反過來向數(shù)據(jù)庫發(fā)送數(shù)據(jù)呢?其實這不是PHP的問題。

  首選,我們創(chuàng)建一個帶有簡單表格的網(wǎng)頁。

  <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。您也會注意到,表格中的每一個元素都對應(yīng)著數(shù)據(jù)庫中的一個字段。這種對應(yīng)關(guān)系并不是必須的,這么做只是更直觀一些,便于您以后理解這些代碼。

  還要注意的是,我在Submit按鈕中加入了name屬性。這樣我在程序中可以試探$submit變量是否存在。于是,當網(wǎng)頁被再次調(diào)用時,我就會知道調(diào)用頁面時是否已經(jīng)填寫了表格。

  我應(yīng)該指出,您不一定要把上面的網(wǎng)頁內(nèi)容寫到PHP程序中,再返過來調(diào)用程序本身。您完全可以把顯示表格的網(wǎng)頁和處理表格的程序分開放在兩個網(wǎng)頁、三個網(wǎng)頁甚至更多網(wǎng)頁中,悉聽尊便。放在一個文件中只是可以使內(nèi)容更加緊湊而已。

  那好,我們現(xiàn)在加入一些代碼,來檢查用戶在表格中輸入的內(nèi)容。我會把用$HTTP_POST_VARS把所有查詢參數(shù)變量都顯示出來,這只不過是為了證明PHP確實把所有變量都傳給了程序。這種方法是一個很有用的調(diào)試手段。如果您要想看全部的變量,可以用$GLOBALS。

<html>

<body>

<?php

if ($submit) {


// 處理表格輸入

while (list($name, $value) = each($HTTP_POST_VARS)) {

echo "$name = $value<br>\n";

}

} 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結(jié)束

?>

</body>

</html>

  程序現(xiàn)在運行正常,那我們現(xiàn)在就可以取到表格輸入的內(nèi)容,并把它們發(fā)送給數(shù)據(jù)庫。

  <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.\n";

} else{

// 顯示表格內(nèi)容

?>

<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結(jié)束

?>

</body>

</html>


  您現(xiàn)在已經(jīng)向數(shù)據(jù)庫中插入數(shù)據(jù)了。不過還有很多完善的工作要做。如果用戶沒有填寫某一欄怎么辦?在需要填入數(shù)字的地方填了文字怎么辦?或者填錯了怎么辦?

別擔心。我們一步一步來。>>

五、修改數(shù)據(jù)

  在個教程中,我都把要執(zhí)行的SQL語句放到一個變量($sql)中,然后才用mysql_query()來執(zhí)行數(shù)據(jù)庫查詢。在調(diào)試時這是很有用的。如果程序出了什么問題,您隨時可以把SQL語句的內(nèi)容顯示出來,檢查其中的語法錯誤。

  我們已經(jīng)學習了如何把數(shù)據(jù)插入到數(shù)據(jù)庫中,F(xiàn)在我們來學習如何修改數(shù)據(jù)庫中已有的記錄。數(shù)據(jù)的編輯包括兩部分:數(shù)據(jù)顯示和通過表格輸入把數(shù)據(jù)返回給數(shù)據(jù)庫,這兩部分我們前面都已經(jīng)講到了。然而,數(shù)據(jù)編輯還是有一點點不同,我們必須先在表格中顯示出相關(guān)的數(shù)據(jù)。

  首先,我們回過頭再看看第一課的程序代碼,在網(wǎng)頁中顯示員工姓名。但是這次,我們要把數(shù)據(jù)顯示在表格中。程序看起來象下面這樣:

  <html>

<body>

<?php

$db = mysql_connect("localhost", "root");

mysql_select_db("mydb",$db);

if ($id) {

// 查詢數(shù)據(jù)庫

$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>\n", $PATH_INFO,
$myrow["id"], $myrow["first"], $myrow["last"]);

}

}

?>

</body>

</html>


  我們剛才是把字段內(nèi)容寫入到相應(yīng)表格元素中的value屬性里,這是相應(yīng)簡單的。我們再往前進一步,使程序可以把用戶修改過的內(nèi)容寫回數(shù)據(jù)庫去。同樣,我們通過Submit按鈕來判斷是否處理表格輸入內(nèi)容。還要注意,我們用的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',position='$position' WHERE id=$id";

$result = mysql_query($sql);

echo "謝謝!數(shù)據(jù)更改完成\n";

} else {

// 查詢數(shù)據(jù)庫

$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>\n", $PATH_INFO,
$myrow["id"], $myrow["first"], $myrow["last"]);

}

}

?>

</body>

</html>


  就是這樣。在這個程序中已經(jīng)包含了我們學過所大多數(shù)特性。您也已經(jīng)看到,我們在一個if()條件判別語句中又加了一個if()語句,來檢查多重條件。

  下面,我們要把所有東西全都加在一起,寫出一個很好的程序來。>>
六、完整的程序

在本課結(jié)束前,我們要把所有東西加入到一個程序中,使它具有增加、編輯修改、刪除記錄的功能。這是前面所有內(nèi)容的一個延伸,也可以作為極好的復(fù)習方法。看看下面的程序。

  <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')";
}

// 向數(shù)據(jù)庫發(fā)出SQL命令

$result = mysql_query($sql);

echo "記錄修改成功!<p>";

} elseif ($delete) {

// 刪除一條記錄

$sql = "DELETE FROM employees WHERE id=$id";

$result = mysql_query($sql);

echo "記錄刪除成功!<p>";

} else {

// 如果我們還沒有按submit按鈕,那么執(zhí)行下面這部分程序

if (!$id) {

// 如果不是修改狀態(tài),則顯示員工列表 $result = mysql_query("SELECT * FROM employees",$db);

while ($myrow = mysql_fetch_array($result)) {

printf("<a href=\"%s?id=%s\">%s %s</a> \n",
$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) {


// 我們是在編輯修改狀態(tài),因些選擇一條記錄

$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>

 
 這段程序看起來很復(fù)雜,但實際上并不難。程序主要有三個部分。第一個if()語句檢查我們是否已經(jīng)按下了那個“輸入信息”的數(shù)據(jù)提交按鈕。如果是,程序再檢查$id是否存在。如果不存在,那我們就是在增加記錄狀態(tài),否則,我們是在修改記錄狀態(tài)。

  接下來我們檢查變量$delete是否存在。如果存在,我們是要刪除記錄。注意,第一個if()語句檢查的是用POST方法發(fā)送來的變量,而這一次我們檢查的是GET方法中傳遞過來的變量。

  最后,程序默認的動作是顯示員工列表和表格。同樣,我們要檢查變量$id是否存在。如果存在,我們就根據(jù)它的值檢索出相應(yīng)的記錄顯示出來。否則,我們會顯示一個空的表格。

  現(xiàn)在,我們已經(jīng)把所學的東西全部都放在一個程序里頭了。我們用到了while()循環(huán),用到了if()語句,并且執(zhí)行了全部的SQL基本操作 - SELECT、INSERT、UPDATE以及DELETE。另外,我們也知道如何在不同的網(wǎng)頁之間通過URL和表格輸入來互相傳遞信息。

  在第三課里,我們要學習如何為網(wǎng)頁增加智能化處理能力。

(責任編輯:超越PHP)
[推薦給朋友] [顯示打印版本] 更新日期:2003-03-21 瀏覽次數(shù):4419


用戶評論 點擊這里添加新評論
slg<suleigang at hotmail dot com>
25-Jul-2003 01:46

其他都沒有問題,就是現(xiàn)在我的
PATH_INFO 沒有定義,報錯為:
Undefinedvariable: PATH_INFO in C:\apache2\htdocs\test3.php on line 9
BobSmith
那位給點提示,謝謝了!!


yesphp<lovenets at 163 dot com>
02-Aug-2003 12:27

沒使用過這個$path_info,也許它可能要用到APACHE的
支持,因為APACHE的一個函數(shù)中會返回該path_info信息。


Avalong<avalong at ifuyao dot com>
25-Dec-2003 10:24

<html>

<body>

<?php

if ($submit){


// 處理表格輸入

while (list($name, $value) =each($HTTP_POST_VARS)) {

echo "$name =$value
\n";

}

} else{


//顯示表格

?>

<form method="post"action="<?php echo$PATH_INFO?>">

名:<input type="Text"name="first">


姓:<inputtype="Text"name="last">


住址:<inputtype="Text"name="address">


職位:<inputtype="Text"name="position">


<inputtype="Submit" name="submit"value="輸入信息">

</form>

<?php

}// endif,if結(jié)束

?>

</body>

</html>
點“輸入信息”后還是在輸入信息這個頁面呀,這是怎么回事?