資料庫程式設計 – PHP+MySQL 第 七章 巢狀查詢程式       下一頁

 

第七章 巢狀查詢程式

 

7-1 PHP 選單操作

內容:

  • 7-1 PHP 選單操作

  • 7-2 單一資料表操作

    • 7-2-1 Select 查詢語法

    • 7-2-2 範例研討:查詢學生資料

    • 7-2-3 範例研討:人性化顯示資料

    • 7-2-4 範例研討:選擇性查詢資料

網頁或視窗介面對於輸入/輸出處理大多採用選單操作,不同於交談式操作。『選單操作』需要兩個以上網頁,一則供輸入資料使用,在 HTML 上稱為『表單網頁』(Form Page) ;另一者是輸出網頁,稱為『處理網頁』(Action Page),需要利用 PHP 程式編寫。使用者在 Form Page 上輸入相關訊息後,傳送給 Action Page,經過相關處理,再將結果顯示在網頁上,至於傳遞訊息的方法有:Post Get 兩種方法,如下圖所示。(請參閱第五章說明)

『表單網頁』需要用 HTML <form> ... </form> 建構輸入表單格式,『處理網頁』則須利用 PHP 程式編寫訊息接收。接下來,我們的範例大多採用『表單網頁』與『處理網頁』來運作。另外,為了減少讀者學習困擾,『處理網頁』內查詢結果的輸出請參考第五章『outMySQL.php』程式內容,複製到輸出部分即可 (可由首頁下載程式)

7-2 單一資料表查詢

7-2-1 Select 查詢語法

Select SQL 最基礎的命令,格式看起來非常簡單,但它的變化萬千,是否能在資料庫中萃取資訊,完全要看 select 語句靈活運用的能力,我們需用許多範例來探討。Select 敘述的意思是:依照某些條件底下(Where),要由某資料表 (From),擷取哪些欄位(Select)的資料。另外條件也許由若干個條件的邏輯組合(Andor),查詢結果可將分組設定(Group by),也可依照某條件分組(Having),甚至也可由大到小(AscDesc),或由小到大排列(Order by)。查詢語法如下:

Select 想要擷取的欄位(欄位_1, 欄位_2, ..)

From 想要查詢的資料表

Where 查詢條件 (條件敘述 | And 條件敘述 | or 條件敘述)

Group By 分組設定(Asc Desc)

Having 分組條件

Order By 排序設定

Limit 限制設定

7-2-2 範例研討 查詢學生資料

(A) 程式功能:Ex7_1

學務處需要一個供查詢學生資料的網頁,可以由學號或姓名查詢,期望查詢網頁如下:

查詢結果的網頁如下:

 (B) SQL 製作技巧

題目是希望能由學號或姓名來查詢學生資料。首先我們須知道學生資料儲存哪一個資料表,從系統架構圖中可以看出是儲存於 students 資料表內,用簡單的 select 命令就可以達到目的。

Select  *

From students

Where student = “查詢學號 name = “查詢姓名

(C) 網頁製作技巧

吾人需製作一只『表單網頁』來提供輸入查詢訊息,其中包含選擇學號或姓名 (按鈕 type = radio),與輸入數值 (type = text)。另一只『處理網頁』做查詢與顯示網頁的處理,如下圖:

(C) 查詢網頁的程式:Ex7_1-form.html

系統要求可以用學號或姓名查詢,因此表單 (<form>) 裡我們增加了兩個按鈕選項 (<input type=”radio”>),為學號與姓名的選項,兩則的輸出名稱都相同(name=”method”),由內容(value=”no”value=”name”) 辨識使用者按哪一個鍵(學號或姓名)。程式範例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>查詢學生資料</title>

</head>

<body>

        <p> 查詢學生資料</p>

        <form name="表單" method="post" action="Ex7_1-action.php">

                <input type="radio" name="method"  value="no">學號<BR>

                <input type="radio" name="method"  value="name">姓名<BR><BR>

                請輸入:

                <input type="text" name="value"><BR>

                <input type="submit" value="送出">

        </form>

</body>

</html>

(D) 執行網頁的程式:Ex7_1-action.php

查詢網頁傳遞過來兩個訊息,其中 $method是使用者選擇學號(no) 或姓名(name),因此$value 有可能是學號或姓名內容。如果是學號,則將查詢敘述設定為 where condition 的條件 $condition = [“ student_ID = $value”],否則設定為 $condition = [“name = $value”]。但牽涉到字串連接的問題,我們需要寫成 $condition “條件式,條件式為:

Student_ID = ”.””.$value.”,意思是 student_ID = 連結(“.”)、再連結 $value(“.$value”)

再將所有語句用雙引號包起來 (“ …”),程式範例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?php

        $method = $_POST["method"];

    $value = $_POST["value"];

    if ($method == "no") {

        $condition = "student_ID = "." ' ".$value." ' ";  //student_ID = '90211304'

    } else{

                $condition = "name = "." ' ".$value." ' ";  // name = '劉雅玲'

    }

        // 以下請複製 outMySQL.php 再修改即可

    $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        $sql_query = "select *

                from students

                where $condition";

        $result = mysqli_query($select_db, $sql_query);

        echo "<p> 查詢學生資料結果 </p>";

        echo "<table border=1> <tr align='center'>";

        while ( $meta = mysqli_fetch_field($result) ) {

                echo "<td> $meta->name </td>";

        }

        echo "</tr>";

        while($row=mysqli_fetch_row($result)) {

                echo "<tr>";

                for($j=0; $j<mysqli_num_fields($result); $j++) {

                        echo "<td>$row[$j]</td>";

                }

                echo "</tr>";

        }

        echo "</table>";

        mysqli_close($db_link);

?>

7-2-3 範例研討:人性化顯示學生資料

(A) 程式功能:Ex7_2

學務處看過 Ex6_1 網頁後,認為顯示資料項目應該可供選擇較理想,且查詢結果就與電腦儲存一樣,也不夠人性化,期望查詢網頁如下:

執行結果的網頁如下:

(B) SQL 製作技巧

Ex6_1 的做法是直接將查詢結果的動態資料表顯示出來。目前系統是要求各項資料分別顯示。首先須知道資料表各欄位的順序(如上圖所示),我們建立一個陣列儲存各欄位的中文名稱,如,$fields = array("學號","姓名","班級代碼","性別", "電話","電子郵件","地址"),當讀出陣列內每一元素內容時,再配對欄位內容即可。

(C) 網頁技巧

吾人需製作一只『表單網頁』來提供輸入查詢訊息,其中包含選擇學號或姓名 (按鈕 type = radio),與輸入數值 (type = text)。另一只『處理網頁』做查詢與顯示網頁的處理,如下圖:

(C) 查詢網頁的程式:Ex7_2-form.html( Ex7_1-form.html 相同)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢學生資料</title>

</head>

<body>

   <form name="表單" method="post" action="Ex6_1-action.php">

      <input type="radio" name="method"  value="no">學號<BR>

      <input type="radio" name="method"  value="name">姓名<BR><BR>

      請輸入:

      <input type="text" name="value"><BR>

      <input type="submit" value="送出">

   </form>

</body>

</html>

(D) 執行網頁的程式:Ex7_2-action.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<?php

        $method = $_POST["method"];

    $value = $_POST["value"];

    if ($method == "no") {

        $condition = "student_ID = "." ' ".$value." ' ";  //student_ID = '90211304'

    } else{

                $condition = "name = "." ' ".$value." ' ";  // name = '劉雅玲'

    }

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        $sql_query = "select *

                from students

                where $condition";

        $result = mysqli_query($select_db, $sql_query);

        echo "<p> 查詢學生資料結果 </p>";

        // 欄位名稱陣列

        $fields = array("學號","姓名","班級代碼","性別", "電話","電子郵件","地址");

        // 取出各欄位內容

        while($row=mysqli_fetch_row($result)) {

                for($j=0; $j<mysqli_num_fields($result); $j++) {

                        echo "$fields[$j] = $row[$j] <BR>";

                }

        }

        mysqli_close($db_link);

?>

(1) 1 ~ 17 行:與 Ex7_1-actiom.php 相同。

(2) 20 行:產生欄位名稱陣列 $field

(3) 23 ~ 24 行:讀取 $fields[$i] $row[$i] 同一位置($i) 的元素。

7-2-4 範例研討:選擇性查詢資料

(A) 系統需求:Ex7_3

人事處需要製作一套可供查詢老師個資的網頁,期望選擇所欲查詢老師與資料都用選單方式比較人性化,期望查詢網頁如下:(選單網頁)

 (B) 執行結果網頁如下:(執行網頁)

 (C) SQL製作技巧

全校教師資料都儲存於 teachers 資料表內,所有操作都由此表取得。首先在『選單網頁』上,需可以下拉式選擇全校中某一位老師,因此需由 teachers 資料表取得所有老師的『Teacher_ID』與『name』,作為下拉式選項,當選定教師後,再傳送 Teacher_ID 給『執行網頁』。『執行網頁』收到 teacher_D後,再依此查詢相關資料。

(D) 網頁製作技巧

系統要求在『選單網頁』上,教師名稱必須利用下拉式選單,因此,我們必須由 teachers 資料表內讀取第 12 欄位,前者是教師代碼(teacher_ID),後者是姓名 (name),將它做成下拉式選單,另外查詢項目也需做成下拉式選單。『執行網頁』接收到『選單網頁』的 techer_ID 與查詢項目 item,則依此執行 SQL 查詢命令。如下圖:

(E) 表單網頁(Ex7_3-form.php)

系統要求教師名稱必須利用下拉式選單,因此,我們必須由 teachers 資料表內讀取第 12 欄位,前者是教師代碼(teacher_ID),後者是教師姓名 (name)。另外,所欲查詢的資料也是要下拉式選單。因此,在查詢網頁上的表單( <form>) 就需要兩個選單(<select>),一個由 PHP 讀取 teachers 資料表,另一個直接編寫個資料項目選項,由變數 $item 記錄查詢哪一項資料。。程式提示如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢教師資料</title>

</head>

<body>

<?php

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        $sql_query = "select teacher_ID, name

                from teachers";

        $result = mysqli_query($select_db, $sql_query);

?>

   <p><font size="3"> 查詢教師資料 </font></p>

   <form name="表單" method="post" action="Ex7_3-action.php">

<?php

    echo "選擇教師:";

    echo "<select name='teacher_ID'>";

                while($row=mysqli_fetch_row($result)) {

                        echo "<option value='$row[0]'> $row[1]($row[0])</option><BR>";

                }

    echo "</select>";

    echo "<BR><BR>";  

    mysqli_close($db_link);

?>

          選擇查詢資料:       

         <select name="item">

               <option value="Dep_ID">系別代碼</option>

               <option value="tel">電話</option>

               <option value="title">職務</option>

               <option value="mailbox">電子郵件</option>

               <option value="address">地址</option>

         </select>

    <BR>

    <input type="submit" value="送出">

    </form>

</body>

</html>

(E) 執行網頁:(Ex7_3-action.php)

查詢網頁傳遞過來 $teacher_ID $item 表示查詢哪位老師,與查詢哪一項目資料。程式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?php

 

        $teacher_ID = $_POST["teacher_ID"];

    $item = $_POST["item"];

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        $sql_query = "select name, $item

                  from teachers

                  where teacher_ID = '$teacher_ID'";

  

        $result = mysqli_query($select_db, $sql_query);

    $row=mysqli_fetch_row($result);

    echo "查詢結果:<BR>";

    echo "$row[0] 老師的資料是: $row[1] <BR>";

        mysql_close($db_link);

?>

 (G) 進階顯示結果的網頁:

上述顯示結果好像很奇怪,沒有註明是甚麼資料,您是否可以再將它改成下列結果:

提示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

….

switch($item) {

            case "Dep_ID":

                    $sql_query_1 = "select dep_name

                                    from department

                                    where dep_ID = '$row[1]'";

                    $result_1 = mysql_query($sql_query_1);

                    $row_1= mysql_fetch_row($result_1);

                    $data = $row_1[0];

                    $message = "系別名稱";

                    break;

            case "title":

                    $message = "職務";

                    $data = $row[1];

                    break;

            case "tel":

 …………………….

            default:

                    $message = "錯誤要求";

                    $data = "沒有資料";

        }

……

翻轉工作室:粘添壽

course_db 關聯圖

 

資料庫程式設計:

 

 

 

翻轉電子書系列: