PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 11 章 條件判斷敘述
本章大綱 11-1 IF指令 11-2 SWITCH指令 問題與討論
11-1 IF指令 程式中依據不同需求而執行不同的程式碼. IF指令有三種基本格式 if … if … else … if … elseif …
if … 格式 if (條件判斷式) { 判斷式為真時要執行的指令 ; 也可以是多行指令 ; } 這種判斷式是一種簡單的判斷式, 條件判斷式可由前一章所介紹的運算式與邏輯運算子組合而成 條件判斷式後面以大括弧將判斷式所需的指令敘述括起來。 當判斷式的內容為真則執行大括弧內的指令敘述。括弧內的指令敘述可以是一行或一行以上。如果判斷式的內容為假則忽略大括弧內的指令敘述向下繼續執行
1: <html> 2: <title>條件判斷式</title> 3: <body> 4: <?php 5: $A = 10 ; 6: $B = 5 ; 7: if ($A > $B ) { 8: echo "$A > $B <br>" ; 9: echo "看見上述內容表示條件判斷式為真<p>" ; 10; } 11: echo "程式結束" ; 12: ?> 13: </body> 14: </html> 第 7 行 IF 的判斷式為真 (意即 $A 的值大於 $B 的值是事實), 因此會執行大括弧內的第 8-9 行敘述。在圖中我們可以看到 "10 > 5" 的文字。離開判斷敘述後向下執行第 11 行, echo 會顯示 "程式結束"。
1: <html> 2: <title>判斷敘述</title> 3: <body> 4: <?php 5: $A=90 ; 6: if ($A>0 && $A<=100){ 7: echo "\$A = $A <p>" ; 8: echo "$A 是介於 0 到 100 之間"; 9: } 10: ?> 11: </body> 12: </html> 第 6 行條件判斷式中有二個條件式, 利用邏輯運算子 "&&" 將二個條件式 $A>0 和 $A<=100 結合在一起。因為 "&&" 運算子, 所以只有在二個條件式為真時, IF 判斷式的結果才為真, 如果其中任何一個條件式為假則條件判斷式為假。在這段程式中判斷式是由兩個條件組合而成, 由此可知判斷式中的條件可以利用邏輯運算子加以結合, 當整個判斷式計算完畢之後依真、假值再決定是否執行判斷敘述。在本例中 條件判斷式的結果為真, 程式舊會執行判斷敘述內的第 7-8 行指令。
巢狀IF : IF中還有IF 1: <html> 2: <title>判斷敘述</title> 3: <body> 4: <?php 5: $order = 50000 ; 6: echo "您訂購的金額是 $order <br>"; 7: if ($order >=10000) { 8: $order=$order*0.8 ; 9: echo "您折扣後的金額是 $order <br>"; 10: if ($order >=20000){ 11: echo "本公司免費提供送貨服務" ; 12: } 13: } 14: ?> 15: </body> 16: </html> 巢狀IF : IF中還有IF 第 7 行是 IF 條件判斷指令。 如果訂購的金額超過 10000 元則執行第 7-13 行給予 8 折優待, 以及是否提供送貨服務。 如果沒有超過 10000 元則忽略第 7-13 行不給予折扣等優惠, 直接結束程式。 當金額超過 10000 元第 7 行 IF 的條件式為真, 此時繼續執行 8-13 行。 第 8 行將 $order 乘以 0.8, 計算 8 折的折扣。 第 10 行又是一個 IF 條件判斷式用來判斷折扣後的金額是否大於 20000 元, 如果是則執行第 9-12 行, 。
if … else … 判斷的條件為真時要做某種 處理, 若為假時也要做某些處理 和格式一不同的是多的一個 else 指令, else 表示否則的意思。也就是說, 如果判斷式為真則執行 IF 到 else 之間為真時要執行的指令, 如果為假則執行 else 後的指令。
If … else … 1: <html> 2: <title>判斷敘述</title> 3: <body> 4: <?php 5: $Chinese = 90 ; 6: $English = 80 ; 7: echo "國文成績是 $Chinese 分<br>" ; 8: echo "英文成績是 $English 分<br>" ; 9: $Avg=($Chinese + $English)/2 ; 10: echo "平均 = $Avg 分 "; 11: if ($Avg >=60) { 12: echo " 成績及格" ; 13: } else { 14: echo " 成績不及格" ; 15: } 16: ?> 17: </body> 18: </html> 第 5-6 行分別設定國文成績為 90, 英文成績為 80。 第 7-8 行顯示國文及英文成績於網頁。 第 9 行計算平均成績, 並存於 $Avg 變數中。 第 10 行顯示平均成績於網頁。 第 11 行是 IF 指令, 判斷成績 ($Avg) 是否及格 (大於等於 60), 如果及格執行第 12 行, 如果不及格則執行第 14 行。
表單輸入 回應輸出 1: <html> 2: <title>判斷式</title> 3: <body> 4: <?php 5: if (empty($_GET["sex"])) { 6: ?> 7: <form action=<?php echo $_SERVER["PHP_SELF"] ?> method="get"> 8: 姓名:<input type=text name=n><br> 9: 性別:<br> 10: <input type=radio name=sex value=1>男<br> 11: <input type=radio name=sex value=2>女<br> 12: <input type=submit value="送出"> 13: <input type=reset value="重填"> 14: </form> 15: <?php 16: }else{ 17: echo $_GET["n"]; 18: if ($_GET["sex"]==1){ 19: echo "先生您好"; 20: }else{ 21: echo "小姐您好"; 22: } 23: } 24: ?> 25: </body> 26: </html> 表單輸入 回應輸出
5: if (empty($_GET["sex"])) { 6: ?> 檢查 $_GET["sex"] 變數的內容是否為空的, 如果是空的表示尚未有資料輸入, 此時執行第 7-14 行的表單輸入。 若 變數sex的內容不是空的就表示表單已輸入資料, 此時執行第 17-22 行回應表單輸入的內容。 4: <?php 5: if (empty($_GET["sex"])) { 6: ?> 7: <form action=<?php echo $_SERVER["PHP_SELF"] ?> method="get"> 8: 姓名:<input type=text name=n><br> 9: 性別:<br> 10: <input type=radio name=sex value=1>男<br> 11: <input type=radio name=sex value=2>女<br> 12: <input type=submit value="送出"> 13: <input type=reset value="重填"> 14: </form> 第 7-14 行是一個表單輸入。 第 7 行 action 是送到 $_SERVER[PHP_SELF] 變數, 其實變數內容就是程式本身的檔案名稱, 也就是將表單內容送到自己本身處理。 表單內容則是要求輸入一個姓名, 並且以n為變數名稱傳回程式中。 另以單選選項輸入選擇男性或女性, 以 sex 為變數名稱傳回程式。
第 17 行顯示姓名, 第 18 行依據外部變數 sex 決定顯示第 19 行或第 21 行的稱謂。 15: <?php 16: }else{ 17: echo $_GET["n"]; 18: if ($_GET["sex"]==1){ 19: echo "先生您好"; 20: }else{ 21: echo "小姐您好"; 22: } 23: } 24: ?> 第 17 行顯示姓名, 第 18 行依據外部變數 sex 決定顯示第 19 行或第 21 行的稱謂。 如上圖, 不同性別輸入, 得到不同的輸出畫面.
1: <html> 2: <title>判斷敘述</title> 3: <body> 4: <?php 5: if (preg_match("/MSIE/",$_SERVER["HTTP_USER_AGENT"])){ 6: echo "你的瀏覽器是 IE" ; 7: }else{ 8: echo "你的瀏覽器不是 IE" ; 9: } 10: ?> 11: </body> 12: </html> HTTP_USER_AGENT 會傳回使用者的相關資訊, 包括瀏覽器的類型、作業系統等相關的資訊, 我們可以使用 $_SERVER 陣列將所需要的 PHP 預設變數 HTTP_USER_AGENT 讀入。第5行我們利用 preg_match() 來搜尋 $_SERVER["HTTP_USER_AGENT"] 中是否有 "MSIE" 。的字串出現, 如果有就表示使用的的瀏覽器為 IE, 否則為其他型式的瀏覽器。 判斷使用者的瀏覽器類型
簡單的if … else … 寫法 判斷敘述 ? 為真敘述 : 為假敘述 說明: ? 前為一個條件判斷式, 當條件式為真則執行 : 前敘述, 當條件式為假則執行 : 後敘述。 例: $a>$b ? $c="true" : $d="false" ; 當 $a>$b 為真時執行 $c="true", 反之則執行 $d="false"。
If … elseif … 結合了 else 及 if, 如果 IF 的條件判斷式為假時在 else 的位置可以再做一次條件判斷。
If … elseif … 格式: if (判斷式A) { 處理A ; 判斷式A為真時要執行的指令 ; 可以是多行指令 ; }elseif (判斷式B) { 處理B ; 判斷式B為真時要執行的指令 ; 可以是多行指令 ; } else { 處理C ; 判斷式B為假時要執行的指令 ; 可以是多行指令 ; } 第三種判斷式格式是屬於多重判斷指令。由流程圖中可以看到當條件判斷式A為真時程式會跳到處理A指令區塊執行, 當執行完畢後就會離開多重判斷式繼續執行。 如果條件判斷式A為假則會進入條件判斷式B中進行第二次判斷。由流程圖中可以看到處理A到處理C是由判斷式A和判斷式B的真假值來決定進入那一個處理敘述中。但無論如何只會執行處理A, B, C其中一個處理敘述, 。
1: <html> 2: <title>多重判斷</title> 3: <body> 4: <?php 5: $A = 10 ; 6: $B = 15 ; 7: echo "\$A = $A <p>" ; 8: echo "\$B = $B <p>" ; 9: if ($A > $B) { 10: echo "$A > $B" ; 11: }elseif($A==$B){ 12: echo "$A = $B" ; 13: }else { 14: echo "$A < $B" ; 15: } 16: ?> 17: </body> 18: </html> 第 9 行 IF 判斷式和第 11 行 elseif 的判斷式都不成立, 所以會執行第 13 行 else 的敘述。
另外一種 IF 指令的寫法 一般我們都是利用大括弧將多個指令括起來表示某一個處理敘述。另外一種寫法則是使用 ":" 及 endif 來代替大括弧。例如 IF 的第二種格式可以改寫如下 if (判斷式): 判斷式為真時處理敘述 ; else: 判斷式為假時處理敘述 ; endif
5-9行可改寫成 1: <html> 2: <title>判斷敘述</title> 3: <body> 4: <?php 5: if (preg_match("/MSIE/",$_SERVER["HTTP_USER_AGENT"])){ 6: echo "你的瀏覽器是 IE" ; 7: }else{ 8: echo "你的瀏覽器不是 IE" ; 9: } 10: ?> 11: </body> 12: </html> 5-9行可改寫成 <?php if (preg_match("/MSIE/",$_SERVER["HTTP_USER_AGENT"])): echo "你的瀏覽器是IE" ; else: echo "你的瀏覽器不是IE" ; endif ?>
11-2 SWITCH指令 在程式中如果只是利用一個變數做為多個判斷條件的依據, 例如當變數值為 1、2 或 3 時分別做不同的處理。 Switch 指令可以取代巢狀 IF, 使寫法更加簡捷。Switch 格式如下: switch (判斷變數) { case 條件1 : 敘述 ; break; case 條件2 : 敘述 ; break ; ... case 條件n: 敘述 ; break ; default : 敘述 ; }
SWITCH指令 switch 由判斷變數的值和各 case 的條件來比較, 符合那一個 case 的條件則執行那一段敘述。如果全部的 case 都不符合時就執行 defualt 的敘述。 Break 指令的功能是跳離 switch 指令。當判斷變數符合某一個 case, 進入該 case 敘述執行後就應該要離開 switch 不可以再進入其他 case 區域中, 此時利用 break 指令跳離 switch 指令。
1: <html> 2: <title>SWITCH</title> 3: <body> 4: <?php 5: $A=2; 6: echo "\$A = $A <br>" ; 7: switch ($A) { 8: case 1 : 9: echo "A=1" ; 10: break; 11: case 2 : 12: echo "A=2" ; 13: break ; 14: case 3: 15: echo "A=3" ; 16: break ; 17: default : 18: echo "A不是介於1到3之間" ; 19: } 20: ?> 21: </body> 22: </html> 第 5 行設定 $A=2。 第 6 行將 $A 的內容顯示在網頁上。 第 7-19 行是 SWITCH 指令, 第 7 行依據 $A 的內容決定執行第 11 行 case 2, 因為 $A 的內容為 2 所以選擇 case 2。 第 12 行顯示 A=2。 第 13 行 break 指令使程式跳出 SWITCH 指令繼續執行。
2: <title>SWITCH</title> 3: <body> 4: <?php 1: <html> 2: <title>SWITCH</title> 3: <body> 4: <?php 5: For ($A=1; $A<=5; $A++){ 6: echo "\$A = $A <br>" ; 7: switch ($A) { 8: case 1 : 9: echo "Hello " ; 10: break; 11: case 2 : 12: echo "My friend." ; 13: break ; 14: case 3: 15: echo "PHP is a good solution." ; 16: break ; 17: default : 18: echo "Error! You got a invalid number" ; 19: } 20: echo "<hr width=300 align=left><p>" ; 21: } 22: ?> 23:</body> 24: </html> 第 5 行先設定一個 FOR 迴圈, 讓 $A 從 1 開始每次加 1, 一直到 5 為止。也就是說 SWITCH 指令會被執行 5 次
Break刪除 1: <html> 2: <title>SWITCH</title> 3: <body> 4: <?php 5: For ($A=1; $A<=3; $A++){ 6: echo "\$A = $A <br>" ; 7: switch ($A) { 8: case 1 : 9: echo "Hello " ; 10: case 2 : 11: echo "My friend." ; 12: break ; 13: case 3: 14: echo "PHP is a good solution." ; 15: break ; 16: default : 17: echo "Error! You got a invalid number" ; 18: } 19: echo "<hr width=300 align=left><p>" ; 20: } 21: ?> 22: </body> 23: </html> Break刪除 當 $A=1 進入第 8 行 case 1 的敘述後顯示 "Hello", 原本應離開 SWITCH 指令, 可是沒有 break 指令所以不會跳離開 SWITCH, 而會直接向下執行進入 case 2 的敘述, 接著顯示 "My friend", 最後因 case 2 中的第 12 行 break 而跳離 SWITCH。至於 $A 的值為 2 和 3 時, 輸出和上一個範例相同。
4: <?php 5: if (empty($_GET['score'])): 6: ?> 7: <form action=<?php echo $_SERVER['PHP_SELF'] ?> method=get> 8: 姓名 <input type=text value="請輸入姓名" name=user><p> 9: 請選出你所喜歡的運動 <br> 10: <input type=radio value=1 name=score>慢跑<br> 11: <input type=radio value=2 name=score>游泳<br> 12: <input type=radio value=3 name=score>籃球<br> 13: <input type=submit value="送出"> 14: <input type=reset value="重寫"></form> 15: <?php 16: else : 17: echo "Hi, ".$_GET['user']." <br> 你最喜歡的運動是" ; 18: switch ($_GET['score']){ 19: case 1: 20: echo "慢跑" ; 21: break ; 22: case 2 : 23: echo "游泳" ; 24: break ; 25: case 3 : 26: echo "籃球" ; 27: break ; 28: default: 29: echo "沒有選擇" ; 30: } 31: endif 32: ?>
問題與討論 請撰寫一程式可以判斷目前使用中的瀏覽器種類。 延續第十章第4題, 若平均不及格則顯示“請再努力”, 若及格則顯示“恭喜您及格!”。三科成績必須由使用者自行輸入。(提示:請參考第八章表單輸入) 請撰寫一個程式依顧客購物金額, 顯示給予的優惠折扣為何。 購物總金額 折 扣 總金額大於10000元 九折 總金額大於50000元 八折 總金額大於100000元 六折
問題與討論 請利用SWITCH指令完成確認網頁, 可使確認網頁出現客戶下訂單的產品名稱。訂單網頁片段如下: <form action=“確認網頁檔名” method=“get”> 公司名稱 <input type=text name=company size=20><br> 訂購產品<br> <input type=radio name=p value=1>主機板<br> <input type=radio name=p value=2>螢幕<br> <input type=radio name=p value=3>記憶體<br> <input type=submit value=“確認”> <input type=reset value=“重填”> </form> 請寫程式判斷使用者輸入的密碼是否正確。(帳號: Kelly 密碼:"john")