第七章
巢狀查詢程式
7-1 PHP
選單操作
內容:
網頁或視窗介面對於輸入/輸出處理大多採用選單操作,不同於交談式操作。『選單操作』需要兩個以上網頁,一則供輸入資料使用,在
HTML
上稱為『表單網頁』(Form Page)
;另一者是輸出網頁,稱為『處理網頁』(Action
Page),需要利用
PHP
程式編寫。使用者在 Form Page
上輸入相關訊息後,傳送給
Action Page,經過相關處理,再將結果顯示在網頁上,至於傳遞訊息的方法有:Post
與
Get
兩種方法,如下圖所示。(請參閱第五章說明)
![](../MySQL_插圖/chap7/圖%207-1.png)
『表單網頁』需要用
HTML <form> ... </form>
建構輸入表單格式,『處理網頁』則須利用 PHP
程式編寫訊息接收。接下來,我們的範例大多採用『表單網頁』與『處理網頁』來運作。另外,為了減少讀者學習困擾,『處理網頁』內查詢結果的輸出請參考第五章『outMySQL.php』程式內容,複製到輸出部分即可
(可由首頁下載程式)。
7-2
單一資料表查詢
7-2-1 Select
查詢語法
Select 是
SQL
最基礎的命令,格式看起來非常簡單,但它的變化萬千,是否能在資料庫中萃取資訊,完全要看 select
語句靈活運用的能力,我們需用許多範例來探討。Select
敘述的意思是:依照某些條件底下(Where),要由某資料表
(From),擷取哪些欄位(Select)的資料。另外條件也許由若干個條件的邏輯組合(And、or),查詢結果可將分組設定(Group
by),也可依照某條件分組(Having),甚至也可由大到小(Asc、Desc),或由小到大排列(Order
by)。查詢語法如下:
Select
想要擷取的欄位(欄位_1,
欄位_2,
..)
From
想要查詢的資料表
Where
查詢條件
(條件敘述
| And 條件敘述
| or 條件敘述)
Group By
分組設定(Asc
或
Desc)
Having
分組條件
Order By
排序設定
Limit
限制設定 |
7-2-2
範例研討
–
查詢學生資料
(A)
程式功能:Ex7_1
學務處需要一個供查詢學生資料的網頁,可以由學號或姓名查詢,期望查詢網頁如下:
![](../MySQL_插圖/chap7/圖%207-2.png)
查詢結果的網頁如下:
![](../MySQL_插圖/chap7/圖%207-3.png)
(B) SQL
製作技巧
題目是希望能由學號或姓名來查詢學生資料。首先我們須知道學生資料儲存哪一個資料表,從系統架構圖中可以看出是儲存於
students 資料表內,用簡單的
select 命令就可以達到目的。
![](../MySQL_插圖/chap7/圖%207-4.png)
Select
*
From
students
Where
student = “查詢學號”
或
name = “查詢姓名” |
(C)
網頁製作技巧
吾人需製作一只『表單網頁』來提供輸入查詢訊息,其中包含選擇學號或姓名
(按鈕
type = radio),與輸入數值
(type = text)。另一只『處理網頁』做查詢與顯示網頁的處理,如下圖:
![](../MySQL_插圖/chap7/圖%207-5.png)
(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
網頁後,認為顯示資料項目應該可供選擇較理想,且查詢結果就與電腦儲存一樣,也不夠人性化,期望查詢網頁如下:
![](../MySQL_插圖/chap7/圖%207-6.png)
執行結果的網頁如下:
![](../MySQL_插圖/chap7/圖%207-7.png)
(B) SQL
製作技巧
![](../MySQL_插圖/chap7/圖%207-8.png)
Ex6_1
的做法是直接將查詢結果的動態資料表顯示出來。目前系統是要求各項資料分別顯示。首先須知道資料表各欄位的順序(如上圖所示),我們建立一個陣列儲存各欄位的中文名稱,如,$fields
= array("學號","姓名","班級代碼","性別",
"電話","電子郵件","地址"),當讀出陣列內每一元素內容時,再配對欄位內容即可。
(C)
網頁技巧
吾人需製作一只『表單網頁』來提供輸入查詢訊息,其中包含選擇學號或姓名
(按鈕
type = radio),與輸入數值
(type = text)。另一只『處理網頁』做查詢與顯示網頁的處理,如下圖:
![](../MySQL_插圖/chap7/圖%207-9.png)
(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
人事處需要製作一套可供查詢老師個資的網頁,期望選擇所欲查詢老師與資料都用選單方式比較人性化,期望查詢網頁如下:(選單網頁)
![](../MySQL_插圖/chap7/圖%207-10.png)
(B)
執行結果網頁如下:(執行網頁)
![](../MySQL_插圖/chap7/圖%207-11.png)
(C) SQL製作技巧
全校教師資料都儲存於
teachers 資料表內,所有操作都由此表取得。首先在『選單網頁』上,需可以下拉式選擇全校中某一位老師,因此需由
teachers 資料表取得所有老師的『Teacher_ID』與『name』,作為下拉式選項,當選定教師後,再傳送
Teacher_ID 給『執行網頁』。『執行網頁』收到
teacher_D後,再依此查詢相關資料。
![](../MySQL_插圖/chap7/圖%207-12.png)
(D)
網頁製作技巧
系統要求在『選單網頁』上,教師名稱必須利用下拉式選單,因此,我們必須由
teachers 資料表內讀取第
1、2
欄位,前者是教師代碼(teacher_ID),後者是姓名
(name),將它做成下拉式選單,另外查詢項目也需做成下拉式選單。『執行網頁』接收到『選單網頁』的
techer_ID 與查詢項目
item,則依此執行
SQL 查詢命令。如下圖:
![](../MySQL_插圖/chap7/圖%207-13.png)
(E)
表單網頁(Ex7_3-form.php)
系統要求教師名稱必須利用下拉式選單,因此,我們必須由
teachers 資料表內讀取第
1、2
欄位,前者是教師代碼(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)
進階顯示結果的網頁:
上述顯示結果好像很奇怪,沒有註明是甚麼資料,您是否可以再將它改成下列結果:
![](../MySQL_插圖/chap7/圖%207-14.png)
提示:
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 = "沒有資料";
}
…… |
|