資料庫程式設計 – PHP+MySQL :第五章 SQL 語言與 PHP/MySQL 上一頁
翻轉工作室:粘添壽 course_db E-R 關聯圖 <開啟>
5-5 PHP 資料表處理
5-5-1 PHP 資料表操作
選取資料庫之後,即可利用 SQL 操作資料表,其四個基本操作命令包裝如下:
(1) 查詢 – select
$sql_query = “SELECT 欄位名稱 FROM 資料表名稱 WHERE 條件式”; $sql_ID = mysql_query($sql_query); |
(2) 新增 – insert
$sql_query = “INSERT INTO (欄位名, …) VALUE (值, …)”; $sql_ID = mysql_query($sql_query); |
(3) 刪除 – delete
$sql_query = “DELETE FROM資料表名稱 WHERE 條件式”; $sql_ID = mysql_query($sql_query); |
(4) 更新 – update
$sql_query = “UPDATE 資料表名稱 SET 欄位1 = 值1, …, WHERE 條件式 ”; $sql_ID = mysql_query($sql_query); |
5-5-2 PHP 處理資料表函數
值得注意的是,資料表經過 SQL 操作之後,所得到結果的資料型態也是資料表。譬如,我們查詢全校所有女同學的姓名、電話、地址,得到的結果是:
這個暫時性資料表有三個欄位(name、tel、address),與若干筆資料。其實,它也是一個陣列的資料結構。但一般陣列沒有欄位名稱,這種陣列有,又稱這種資料結構為『結合陣列』。如果上述陣列名稱為 girl,則陣列各元素表示如下:
(a) $girl[0][0] = 李蘭馨、$girl[0][1]=077310606
(b) $girl[1][0] = 謝卉祈、$girl[1][1] = 077310609
如果用結合陣列表示則:
(a) $girl[0][“name”] = 李蘭馨、$girl[0][“tel”]=077310606
(b) $girl[1][“name”] = 謝卉祈、$girl[1][“tel”] = 077310609
利用 Select 命令由資料庫取得資料也是資料表型態,傳回結果大多以陣列方式(結合陣列)儲存,如何由此陣列取得資料,有下列函數:
函 數 |
功 能 |
mysql_connect(“….”) |
與 MySQL 伺服器連結。 |
mysql_select_db(‘course_db”) |
開啟 course_db 資料庫。 |
mysql_query($sql_query) |
傳送 SQL 查詢語句。 |
mysql_close($dblink) |
關閉資料庫連線 |
mysql_result($sql_ID, row, field) |
一次只能取得一個欄位的內容 |
mysql_db_name($sql_ID, row, field) |
取得 mysql_list_dbs() 傳回來資料庫名稱 |
mysql_fetch_row($sql_ID) |
一次取得一筆(列)資料,並將游標往下移。 |
mysql_fetch_array() |
一次取得一筆(列)資料,包含欄位索引與資料,並將游標往下移。 |
mysql_fetch_assoc() |
一次取得一筆(列)資料,使用欄位名稱來取得欄位內容,並將游標往下移。 |
mysql_field_name() |
擷取欄位名稱 |
mysql_num_rows() |
適用於 Select 命令執行後傳回資料列的筆數。 |
mysql_num_fields() |
適用於 Select 命令執行後傳回資料的欄位數。 |
mysql_affected_rows() |
適用於 Select、delete、update 命令執行後,受到影響的記錄筆數。 |
5-5-3 範例研討:查詢教師資料網頁
(A)系統需求:Ex5_7.php
學務處希望製作一只可供查詢全校所有老師的姓名、電話與地址的網頁,期望列印出的結果如下:(僅顯示部分)
(B)製作技巧:
如果我們直接在 appServ 的 SQL 介面上查詢(select name, tel, address from teachers;) 得到以下結果:
此暫存資料表還是儲存在資料庫管理系統內,索取順序如圖 5-7 所示,分別利用下列函數去索取它:
圖 5-7 結合陣列存取資料之索引順序
(1) 建立查詢語言:$sql_query = "select name, tel, address from teachers "。
(2) 執行 SQL 命令:$sql_ID = mysql_query($sql_query),利用函數將 SQL 查詢語言送給系統,執行正常則回應一個識別碼並存入 $sql_ID 變數內,否則回應一個空值。
(3) 查詢執行結果的欄位數:$num = mysql_num_fields($sql_ID),執行後回應欄位數並存入 $num,否則回應 0。
(4) 擷取欄位名稱:$field_name = mysql_field_name($sql_ID, $i),回應第 $i 欄位的名稱。
(5) 擷取一筆資料:$row = mysql_fetch_row($sql_ID),擷取一筆資料結果存入 $row 變數內,並將游標往下移。$row 是一維陣列,欄位如同 mysql_num_fields($sql_ID) 的結果。
(6) 擷取一個欄位的內容:$data = $row[$i],$row 是由暫存資料表內擷取一筆資料,$row[$i] 是由row[] 中擷取第 $i 欄位的資料。
除了利用上述函數取得資料外,再加上 PHP 繪製表格的方法,就可以建立所需的網頁要求。
(C)程式範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 14 15 |
<?php $db_link = mysql_connect("localhost", "root", "123456") or die("MySQL 伺服器連結失敗 <br>"); $select_db = mysql_select_db("course_system"); mysql_query("SET NAMES 'utf8'"); $sql_query = "select name, tel, address from teachers"; $result = mysql_query($sql_query); // 開始繪製表格 echo "<table border = '2'><tr align='center'>"; // 繪製欄位名稱 for($i=0; $i<mysql_num_fields($result); $i++) { echo "<td>".mysql_field_name($result, $i)."</td>"; } echo "</tr>"; // 輸出各筆資料 while($row=mysql_fetch_row($result)) { echo "<tr>"; for($j=0; $j<mysql_num_fields($result); $j++) { echo "<td>$row[$j]</td>"; } echo "<tr/>"; } mysql_close($db_link); ?> |
部分程式說明如下:
(1) 第 5 行:設定資料庫存取字型。
(2) 第 6 ~ 9 行:建立 SQL 查詢語句。
(3) 第 11 ~ 15 行:繪出資料表頭的表格,再填入各欄位名稱。
(4) 第 16 ~ 21 行:繪出資料表內容的表格,再填入個欄位的資料。
(D)執行 PHP 程式
由瀏覽器 URL:http://localhost/book/chap5/Ex5_7.php
5-5-4 範例研討:列出住高雄市男同學的資料
(A)系統需求:Ex5_8.php
學務處希望製作一只可供查詢住在高雄市男同學的姓名、電話與地址的網頁,期望列印出的結果如下:(僅顯示部分)
(B)製作技巧:
如要查出男性且住在高雄市的同學,則查詢條件是『Where sex = “男” And address Like “%高雄市%”』。我們直接在 appServ 的 SQL 介面上查詢(select name, tel, address from students where sex = “男” and address Like “%高雄市%”;) 得到以下結果:
此暫存資料表還是儲存在資料庫管理系統內,我們分別利用下列函數索取它:(如圖 5-# 所示)
(C)程式範例:
(由 Ex5_7.php 修改 $sql_query 查詢語言即可)
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 |
<?php $db_link = mysql_connect("localhost", "root", "123456") or die("MySQL 伺服器連結失敗 <br>"); $select_db = mysql_select_db("course_system"); mysql_query("SET NAMES 'utf8'"); $sql_query = "Select name, tel, address From students Where sex = '男' and address Like '%高雄市%'";
$result = mysql_query($sql_query);
echo "<table border = '2'><tr align='center'>"; for($i=0; $i<mysql_num_fields($result); $i++) { echo "<td>".mysql_field_name($result, $i)."</td>"; } echo "</tr>"; while($row=mysql_fetch_row($result)) { echo "<tr>"; for($j=0; $j<mysql_num_fields($result); $j++) { echo "<td>$row[$j]</td>"; } echo "<tr/>"; }
mysql_close($db_link); ?> |
部分程式說明如下:
(1) 第 6~9 行與 Ex5_7.php 不同,其餘完全相同。
5-5-5 自我挑戰:查詢資管系所規畫的課程
(A)系統需求:PM5_3.php
吾人想詢問資管系(系別代碼 dep_ID = 11) 在課程資料裡規畫了哪些課程(不分年級全部),列印時欄位名稱請用中文:開課代碼、課程名稱、必選修與學分數,期望用網頁列印如下:(僅顯示部分)
(B)製作技巧:
首先必須找出全校課程規劃是放在哪一個資料表,由 course_db 系統架構圖可以看出,是儲存於 all_course 資料表內,查詢時只要加入 dep_ID = “11” 資管系(where dep_ID = ‘11’),就可以查到資管系所規劃的課程。但系統要求顯示中文欄位名稱,因此,我們用 as 語句來完成(select course_ID as ‘課程代碼’, …)。
(C)程式提示:
1 2 3 4 5 6 7 8 |
…. $sql_query = "Select course_ID as '課程代碼', course_name as '課程名稱', required as '必選修', credit as '學分數' From all_course Where dep_ID = '11'"; ….. ….. |