第 9 章
DESCRIPTION
第 9 章. PHP 與 MySQL 連線. 大綱. 前置作業與檢查 指令說明 處理函式 操作範例 結論. 前置檢查. 在 php.ini 中,是否存在此一敘述: extension=php_mysql.dll, 使 MySQL 函數庫可以執行。 是否已拷貝 PHP 目錄中的 MySQL 相關函式庫至系統安裝目錄下的 system32 目錄下(在 WIN2000 預設是 C:\WINNT\system32,WIN XP 預設是 C:\WINDOWS\system32)? 需包含以下的函式庫檔案: libmysql.dll php5ts. dll - PowerPoint PPT PresentationTRANSCRIPT
前置檢查 在 php.ini 中,是否存在此一敘述: extension=php_mysql.dll ,
使 MySQL 函數庫可以執行。 是否已拷貝 PHP 目錄中的 MySQL 相關函式庫至系統安裝目錄下
的 system32 目錄下(在 WIN2000 預設是 C:\WINNT\system32 , WIN XP 預設是 C:\WINDOWS\system32 )?需包含以下的函式庫檔案:
libmysql.dll php5ts. dll php_mysql.dll php_mysqli.dl
連線檢查 此一程式目標是列出 MySQL 資料庫中 user 表格資料。
暫訂 root 密碼為 123456 。如果您的 MySQL資料庫 root 密碼並非 123456 ,請將範例中第二行中的 '123456' 改成您目前的 root 帳號所使用的密碼。
請將以下範例 test.php 檔案,放在 Apache 的htdoc 目錄下:
連線檢查 Cont.<?
$link = mysql_connect("localhost","root","123456");
// 連線mysql_query("use mysql");
// 選擇資料庫$result = mysql_query("select * from user",$link);
// 下 SQL 指令/* 以 HTML Table 方式解析傳回資料 */
echo "<table border=1>\n";
echo "<tr>\n";
/* 印出表頭 */
while ($field = mysql_fetch_field($result)) {
echo "<td>".$field->name."</td>\n";
}
echo "</tr>\n";
/* 印出表身 */
while ($row = mysql_fetch_row($result)) {
echo "<tr>\n";
for($i=0;$i<count($row);$i++){
echo "<td>".$row[$i]."</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
/* 釋放 result */
mysql_free_result($result);
/* 關閉連結 */
mysql_close($link);
?>
建立資料庫連線 在 PHP 網頁中建立 MySQL 連線非常簡單,僅需一行指令即可,如下所示: $link = mysql_connect(' 資料庫所在位置 ', ' 資料庫帳號 ', ' 資料庫密碼 ');
例如,要連接本機 MySQL 資料庫,資料庫帳號為 root ,資料庫密碼為 123456 ,則連線指令如下: $link = mysql_connect('localhost', 'root', '123456');
建立資料庫連線 Cont. 而為因應可能出現的錯誤(如資料庫未啟動、連線埠口被佔用等問題),此一指令最好加上錯誤處理機制如下:
$link = mysql_connect('localhost', 'root', '123456') or die("Could not connect : " . mysql_error());
此一 $link 變數便是以建立完成的資料庫連線,在未來執行資料庫查詢指令時使用。
選用資料庫 選用資料庫指令如下,在此以選用 mysql 資料庫為例:
mysql_query("use mysql");
也可以使用專屬的 API 來下指令:
mysql_select_db("mysql") or die("Could not select database");
執行 SQL 指令 在選用資料庫後,便可進行 SQL 指令的操作,以下的
範例是透過 PHP 程式,對 mysql 資料庫,執行 "select * from user" 這段 SQL 指令的作法:
$result = mysql_query("select * from user",$link);
其中, $result 變數將儲存查詢後的結果,而mysql_query() 函數即是下查詢指令專用的函數,至少需要傳入兩個參數,分別是 SQL 敘述與 SQL 連線。在此我們的 SQL 敘述為: "select * from user" , SQL連線為之前所建立的 $link 。
執行 SQL 指令 在選用資料庫後,便可進行 SQL 指令的操作,以下的
範例是透過 PHP 程式,對 mysql 資料庫,執行 "select * from user" 這段 SQL 指令的作法:
$result = mysql_query("select * from user",$link);
其中, $result 變數將儲存查詢後的結果,而mysql_query() 函數即是下查詢指令專用的函數,至少需要傳入兩個參數,分別是 SQL 敘述與 SQL 連線。在此我們的 SQL 敘述為: "select * from user" , SQL連線為之前所建立的 $link 。
執行 SQL 指令 Cont. 亦可分行撰寫:
$sqlstr="select * from user"; $result = mysql_query($sqlstr,$link);
如採用第二種寫法,變更 SQL 指令時,僅需變更$sqlstr 參數的內容,即可改變 SQL 指令。
而在查詢時,為因應可能出現的錯誤,此一指令最好加上錯誤處理機制如下:
$sqlstr="select * from user"; $result = mysql_query($sqlstr) or die("Query failed : " .
mysql_error());
分析傳回值 在 MySQL 執行完我們的 mysql 指令之後,接下來要做的便是分析所傳回的資料。
而分析資料分成兩個部分,其一為分析表頭,也就是分析所傳回資料的欄位名稱,其二為分析表身,也就是分析傳回的資料內容。
分析表頭 表頭資料就是欄位名稱,不見得一定要分析,通常在列印完整表格、找尋欄位對應關係等時才會進行分析。如以 user 表格為例,表頭資料便是『 Host 』、『 User 』、『 Password 』等欄位名稱。
而因 SQL 查詢子句的不同,所傳回的表頭欄位數也不同,因此通常以 while 指令進行分析
分析表頭 Cont. 以下的例子是以 php 的 while 指令配合 mysql_fetch_field() 函式
分析表頭,列印在表格的一行中:
while ($field = mysql_fetch_field($result)) { echo "<td>".$field->name."</td>\n"; } echo "</tr>\n";
在此一範例中, mysql_fetch_field() 函式必須傳入 $result 查詢結果變數,所產生的每個 $field 變數便代表一個欄位。每個欄位都有數種屬性(名稱、長度、型態等),在此我們透過 -> 運算子,取得 $field->name 此一名稱屬性,並透過 echo 指令列印出來。
分析表身 表身便是傳回資料的實際內容,如以 user 表格為例,
表身資料便是『 localhost 』、『 root 』等表格實際內容,在範例中,我們將表身內容以表格方式全部印出,程式碼如下:
while ($row = mysql_fetch_row($result)) { echo "<tr>\n"; for($i=0;$i<count($row);$i++){ echo "<td>".$row[$i]."</td>"; } echo "</tr>\n"; }
釋放資源 完成 SQL 操作後,必須釋放所建立的連線資源,以免過多的佔用造成系統效能的下降。釋放資源指令如下:
mysql_free_result($result); mysql_close($link);
PHP 中的 MySQL 處理函式功能 建立資料庫連線
函式名稱 mysql_connect() 或 mysql_pconnect()
傳入參數 [string SERVER [, string USERNAME [, string PASSWORD [, bool NEW_LINK [, int CLIENT_FLAGS]]]]]
傳回參數 建立完成的資料庫連線
範例 $link = mysql_connect('localhost', 'root', '123456');
說明 建立一 MySQL 伺服器連線。若使用 mysql_pconnect( ) 的話,則可以建立一個持續性的連線( persistent connection )。 其中所有的參數都可以省略。 當不加任何參數時, SERVER 的內定值為 localhost 、 USERNAME 的內定值為 PHP 執行程序的擁有者、 PASSWORD 則為空字串。而 SERVER 後方還可以加上冒號與埠號,代表使用哪個埠與 MySQL 連接,一般不特別指定的話,均使用預設埠 3306 。
PHP 中的 MySQL 處理函式功能 選用資料庫
函式名稱 mysql_select_db()
傳入參數 string DATABASE_NAME [, resource LINK_IDENTIFIER]
傳回參數
範例 mysql_select_db('db');
說明 此函數用來選定欲存取的資料庫。當 LINK_IDENTIFIER 參數被省略時,預設使用最近一次已建立的 connection;若沒有任何已建立的 connection 可供利用,則會自動執行未加參數的 mysql_connect() ,試圖自行建立新的 connection 。 另,亦可使用 mysql_query() 函數達到相同效果,如:mysql_query('use db');
PHP 中的 MySQL 處理函式功能 執行查詢
函式名稱 mysql_query()
傳入參數 string QUERY [, resource LINK_IDENTIFIER [, int RESULT_MODE]]
傳回參數
範例 mysql_query('select * from zip');
說明 本函數用來送出 任何標準的 SQL 查詢 字串給 MySQL 處理。若未指定 LINK_IDENTIFIER 參數,則會使用最近一次已建立的 connection 。 而當所執行的是 SELECT 、 SHOW 、 EXPLAIN 或 DESCRIBE 敘述時,將傳回一個 resource identifier ,執行失敗時傳回 FALSE 。 執行其它 SQL 敘述時,成功傳回 TRUE ,否則傳回 FALSE 。
PHP 中的 MySQL 處理函式
功能 釋放記憶體
函式名稱 mysql_free_result ()
傳入參數 resource RESULT
傳回參數
範例 mysql_free_result($result);
說明 釋放 $RESULT 所佔用的記憶體
PHP 中的 MySQL 處理函式功能 關閉連線
函式名稱 mysql_close ()
傳入參數 [resource LINK_IDENTIFIER]
傳回參數
範例 mysql_close ($link);
說明 關閉由 mysql_connect( ) 所建立的 MySQL 伺服器連線。 一般而言,當程式結束之後,由 mysql_connect( ) 所建立連線會自動中斷,這個函數是用不著的。但是將資料取出之後,程式還要對它們進行耗時又複雜的運算處理時,建議先結束資料庫的連線,以減輕 MySQL 的負擔。
PHP 中的 MySQL 處理函式
功能 計算傳回結果中資料筆數
函式名稱 mysql_num_rows
傳入參數 resource RESULT
傳回參數 資料筆數
範例 mysql_num_rows ($result);
功能 分析傳回內容,並擷取單筆資料
函式名稱 mysql_fetch_row ()
傳入參數 resource RESULT
傳回參數 單筆資料陣列
範例 用法一: $num_rows = mysql_num_rows($result); for ( $i=0; $i<$num_rows; $i++ ) { list($value1, $value2) = mysql_fetch_row($result); echo $value1; echo $value2; echo ...... } 用法二: while ( list($value1, $value2) = mysql_fetch_row($result) ) { echo $value1; echo $value2; echo ...... } 用法三: while ( $value = mysql_fetch_row($result) ) { echo $value[0]; echo $value[1]; echo ...... }
功能 分析陣列內容
函式名稱 mysql_fetch_array ()
傳入參數 resource result [, int result_type]
傳回參數
範例 用法一:(使用欄位編號分析) while ($row = mysql_fetch_array($result, MYSQL_NUM)) { printf("ID: %s Name: %s", $row[0], $row[1]); } 用法二:(使用欄位名稱分析) while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { printf("ID: %s Name: %s", $row["id"], $row["name"]);} 用法三:(同時使用欄位編號與名稱分析) while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { printf ("ID: %s Name: %s", $row[0], $row["name"]);}
範例:會員登入 Cont.create database db;// 如系統內已存在 db 資料庫,則此行不需要use db;
create table user(serial int unsigned not null primary key auto_increment,id varchar(20) not null ,passwd varchar(20));
insert into user values('','john','54321');
insert into user values('','mary','67890');
在這段 Script裡,我們建立了一個 db 資料庫,並在 db 資料庫中建立了一個包含序號、帳號、密碼三個欄位的表格 user ,並插入了兩個使用者,分別是 john (密碼為 54321 )和mary (密碼為67890 )。
範例:會員登入 Cont. 會員登入系統 login.php <html><head><meta http-equiv="content-type" content="text/html; charset=big5"><title> 會員登入系統範例 </title></head><body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"><h1 align="center"> 會員登入系統範例 </h1><form name="form2" action=chk.php method=post> <p align="center"> 請輸入帳號: <input type="text" name="user_id"></p> <p align="center"> 請輸入密碼: <input type="password" name="user_passwd"></p> <p align="center"><input type="submit" name="送出 "><input type="reset" name="重
設 "></p></form></body></html>
範例:會員登入 Cont. 會員登入系統 CHK.PHP<? $link = mysql_connect("localhost","root","123456");mysql_query("use db");$sqlstr="select * from user where id ='".$_POST['user_id']."' and passwd = '".
$_POST['user_passwd']."'";$result = mysql_query($sqlstr,$link);if(mysql_num_rows ($result)==1){
echo "<center> 會員登入成功 </center>";}else{
echo "<center> 會員登入失敗 </center>";}mysql_free_result($result);mysql_close($link);?>
範例:郵遞區號筆數查詢 查詢資料筆數亦是相當重要的功能,在此我們透過 MySQL該章所提之中華民國郵遞區號表格做範例。
輸入縣市名稱,即可查出該縣市的郵遞區號總筆數,共有 zip_num.php 與zip_num_cnt.php 兩個程式,請放置在Apache 的 htdocs 目錄下:
範例:郵遞區號筆數查詢 Cont. 郵遞區號筆數查詢範例 zip_num.php <html><head><meta http-equiv="content-type" content="text/html; charset=big5"><title>郵遞區號筆數查詢範例 </title></head><body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"><h1 align="center">郵遞區號筆數查詢範例 </h1><form name="form2" action=zip_num_cnt.php method=post> <p align="center"> 請輸入要查詢的縣市區域: <input type="text" name="zone"></p> <p align="center"><input type="submit" name="送出 "><input type="reset" name="重
設 "></p></form></body></html>
範例:郵遞區號筆數查詢 Cont. 郵遞區號筆數查詢範例 zip_num_cnt.php
<?
$link = mysql_connect("localhost","root","123456");
mysql_query("use db");
$sqlstr="select * from zip where zone ='".$_POST['zone']."'";
$result = mysql_query($sqlstr,$link);
echo $_POST['zone']." 共有 ".mysql_num_rows ($result). "筆郵遞區號資料 ";
mysql_free_result($result);
mysql_close($link);
?>
範例:查詢郵遞區號 如果要查詢某個縣市區域的所有郵遞區號?則需運用比對的 SQL語法進行查詢
以下的範例,輸入縣市名稱,即可查出該縣市的所有郵遞區號資料,共有zip.php 與 zip_query.php 兩個程式,請放置在 Apache 的 htdocs 目錄下:
範例:查詢郵遞區號 Cont. 郵遞區號內容查詢範例 zip.php <html><head><meta http-equiv="content-type" content="text/html; charset=big5"><title>郵遞區號內容查詢範例 </title></head><body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"><h1 align="center">郵遞區號內容查詢範例 </h1><form name="form2" action=zip_query.php method=post> <p align="center"> 請輸入要查詢的縣市區域: <input type="text" name="zone"></p> <p align="center"><input type="submit" name="送出 "><input type="reset" name="重
設 "></p></form></body></html>