41
第9第 PHP 第 MySQL 第第

第 9 章

Embed Size (px)

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 Presentation

Citation preview

第 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 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);

?>

連線檢查 Cont.

如可產生此一畫面,表示 PHP 與 MySQL 連線正確無誤

建立資料庫連線 在 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);?>

範例:會員登入 Cont.

範例:郵遞區號筆數查詢 查詢資料筆數亦是相當重要的功能,在此我們透過 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);

?>

範例:郵遞區號筆數查詢 Cont.

範例:郵遞區號筆數查詢 Cont.

範例:查詢郵遞區號 如果要查詢某個縣市區域的所有郵遞區號?則需運用比對的 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> 

範例:查詢郵遞區號 Cont.

範例:查詢郵遞區號 Cont.

範例:查詢郵遞區號 Cont.

結論 透過以上幾個範例的練習,應可更為瞭解整個 PHP 連接、操作 MySQL 的細部流程。

在 PHP 中撰寫動態的 SQL 敘述,會是一開始較難入手的部分,在撰寫時,需小心運用單引號與雙引號,並需多加測試才能正式上線。