410 likes | 527 Views
第 9 章. PHP 與 MySQL 連線. 大綱. 前置作業與檢查 指令說明 處理函式 操作範例 結論. 前置檢查. 在 php.ini 中,是否存在此一敘述: extension=php_mysql.dll, 使 MySQL 函數庫可以執行。 是否已拷貝 PHP 目錄中的 MySQL 相關函式庫至系統安裝目錄下的 system32 目錄下(在 WIN2000 預設是 C:WINNTsystem32,WIN XP 預設是 C:WINDOWSsystem32)? 需包含以下的函式庫檔案: libmysql.dll php5ts. dll
E N D
第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目錄下:
<? $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.
連線檢查 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);
功能 建立資料庫連線 函式名稱 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); PHP中的MySQL處理函式
功能 分析傳回內容,並擷取單筆資料 函式名稱 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>
結論 • 透過以上幾個範例的練習,應可更為瞭解整個PHP連接、操作MySQL的細部流程。 • 在PHP中撰寫動態的SQL敘述,會是一開始較難入手的部分,在撰寫時,需小心運用單引號與雙引號,並需多加測試才能正式上線。