1 / 41

第 9 章

第 9 章. PHP 與 MySQL 連線. 大綱. 前置作業與檢查 指令說明 處理函式 操作範例 結論. 前置檢查. 在 php.ini 中,是否存在此一敘述: extension=php_mysql.dll, 使 MySQL 函數庫可以執行。 是否已拷貝 PHP 目錄中的 MySQL 相關函式庫至系統安裝目錄下的 system32 目錄下(在 WIN2000 預設是 C:WINNTsystem32,WIN XP 預設是 C:WINDOWSsystem32)? 需包含以下的函式庫檔案: libmysql.dll php5ts. dll

Download Presentation

第 9 章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第9章 PHP 與 MySQL 連線

  2. 大綱 • 前置作業與檢查 • 指令說明 • 處理函式 • 操作範例 • 結論

  3. 前置檢查 • 在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

  4. 連線檢查 • 此一程式目標是列出MySQL資料庫中user表格資料。 • 暫訂root密碼為123456。如果您的MySQL資料庫root 密碼並非123456,請將範例中第二行中的 '123456'改成您目前的root帳號所使用的密碼。 • 請將以下範例test.php檔案,放在Apache的htdoc目錄下:

  5. <? $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.

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

  7. 建立資料庫連線 • 在PHP網頁中建立MySQL連線非常簡單,僅需一行指令即可,如下所示: • $link = mysql_connect('資料庫所在位置', '資料庫帳號', '資料庫密碼'); • 例如,要連接本機MySQL資料庫,資料庫帳號為root,資料庫密碼為123456,則連線指令如下: • $link = mysql_connect('localhost', 'root', '123456');

  8. 建立資料庫連線 Cont. • 而為因應可能出現的錯誤(如資料庫未啟動、連線埠口被佔用等問題),此一指令最好加上錯誤處理機制如下: • $link = mysql_connect('localhost', 'root', '123456') or die("Could not connect : " . mysql_error()); • 此一$link變數便是以建立完成的資料庫連線,在未來執行資料庫查詢指令時使用。

  9. 選用資料庫 • 選用資料庫指令如下,在此以選用mysql資料庫為例: • mysql_query("use mysql"); • 也可以使用專屬的API來下指令: • mysql_select_db("mysql") or die("Could not select database");

  10. 執行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。

  11. 執行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。

  12. 執行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());

  13. 分析傳回值 • 在MySQL執行完我們的mysql指令之後,接下來要做的便是分析所傳回的資料。 • 而分析資料分成兩個部分,其一為分析表頭,也就是分析所傳回資料的欄位名稱,其二為分析表身,也就是分析傳回的資料內容。

  14. 分析表頭 • 表頭資料就是欄位名稱,不見得一定要分析,通常在列印完整表格、找尋欄位對應關係等時才會進行分析。如以user表格為例,表頭資料便是『Host』、『User』、『Password』等欄位名稱。 • 而因SQL查詢子句的不同,所傳回的表頭欄位數也不同,因此通常以while指令進行分析

  15. 分析表頭 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 指令列印出來。

  16. 分析表身 • 表身便是傳回資料的實際內容,如以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"; • }

  17. 釋放資源 • 完成SQL操作後,必須釋放所建立的連線資源,以免過多的佔用造成系統效能的下降。釋放資源指令如下: • mysql_free_result($result); • mysql_close($link);

  18. 功能 建立資料庫連線 函式名稱 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處理函式

  19. 功能 選用資料庫 函式名稱 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處理函式

  20. 功能 執行查詢 函式名稱 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處理函式

  21. 功能 釋放記憶體 函式名稱 mysql_free_result () 傳入參數 resource RESULT 傳回參數 範例 mysql_free_result($result); 說明 釋放 $RESULT 所佔用的記憶體 PHP中的MySQL處理函式

  22. 功能 關閉連線 函式名稱 mysql_close () 傳入參數 [resource LINK_IDENTIFIER] 傳回參數 範例 mysql_close ($link); 說明 關閉由mysql_connect( ) 所建立的MySQL 伺服器連線。 一般而言,當程式結束之後,由mysql_connect( ) 所建立連線會自動中斷,這個函數是用不著的。但是將資料取出之後,程式還要對它們進行耗時又複雜的運算處理時,建議先結束資料庫的連線,以減輕MySQL 的負擔。 PHP中的MySQL處理函式

  23. 功能 計算傳回結果中資料筆數 函式名稱 mysql_num_rows 傳入參數 resource RESULT 傳回參數 資料筆數 範例 mysql_num_rows ($result); PHP中的MySQL處理函式

  24. 功能 分析傳回內容,並擷取單筆資料 函式名稱 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 ...... }

  25. 功能 分析陣列內容 函式名稱 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"]); }

  26. 範例:會員登入 • 會員登入功能中,最重要的,便是透過資料庫查詢,驗證使用者所輸入的帳號與密碼是否正確。以下便是一個會員登入的完整範例:

  27. 範例:會員登入 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)。

  28. 範例:會員登入 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>

  29. 範例:會員登入 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); ?>

  30. 範例:會員登入 Cont.

  31. 範例:郵遞區號筆數查詢 • 查詢資料筆數亦是相當重要的功能,在此我們透過MySQL該章所提之中華民國郵遞區號表格做範例。 • 輸入縣市名稱,即可查出該縣市的郵遞區號總筆數,共有zip_num.php與zip_num_cnt.php兩個程式,請放置在Apache的htdocs目錄下:

  32. 範例:郵遞區號筆數查詢 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>

  33. 範例:郵遞區號筆數查詢 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); ?>

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

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

  36. 範例:查詢郵遞區號 • 如果要查詢某個縣市區域的所有郵遞區號?則需運用比對的SQL語法進行查詢 • 以下的範例,輸入縣市名稱,即可查出該縣市的所有郵遞區號資料,共有zip.php與zip_query.php兩個程式,請放置在Apache的htdocs目錄下:

  37. 範例:查詢郵遞區號 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>

  38. 範例:查詢郵遞區號 Cont.

  39. 範例:查詢郵遞區號 Cont.

  40. 範例:查詢郵遞區號 Cont.

  41. 結論 • 透過以上幾個範例的練習,應可更為瞭解整個PHP連接、操作MySQL的細部流程。 • 在PHP中撰寫動態的SQL敘述,會是一開始較難入手的部分,在撰寫時,需小心運用單引號與雙引號,並需多加測試才能正式上線。

More Related