從Web查詢資料庫:Web資料庫結構描述的工作原理
一個使用者的瀏覽器發出一個HTTP請求,請求特定的Web頁面,在該頁面中出發form表單提交到php指令檔(如:results.php)中處理
Web伺服器接收到對results.php頁面的請求後,檢索檔案,並將其傳遞給PHP引擎處理
PHP引擎開始解析指令碼。指令碼主要包括了串連資料庫和執行查詢的命令。PHP啟動了對MySQL伺服器的串連並向該伺服器發送適當的查詢。
MySQL伺服器接收到資料庫查詢的請求,開始處理這個查詢,並將查詢結果返回給PHP引擎。
PHP引擎完成了指令碼的運行後,將該HTML返回Web伺服器。
Web伺服器再將HTML返回給用戶端瀏覽器,使用者就可以看到響應後的結果頁面。
從Web查詢資料庫的基本步驟
檢查並過濾來自使用者的資料 首先,我們將過濾使用者可能在其搜尋條件的起始或結束位置不小心輸入的空白字元,這是用函數trim()來實現。 我們這麼麻煩的檢查使用者輸入資料的原因是防止多個介面串連資料庫,因為使用者從不同的介面進入,這樣可能導致安全問題。
然後,當準備使用使用者輸入的任何資料時,也要適當的過濾一些控制字元,當使用者輸入資料到資料庫時必須轉義資料,,此時 使用盜的函數有addslashes()函數、stripslashes()函數和get_magic_qutoes_gpc()函數。addslashes()函數為了資料 庫查詢語句等的需要在某些字元前加上了反斜線;stripslashes()函數去掉字串中的反斜線字元;get_magic_qutoes_gpc()函數 魔術添加逸出字元 “\”,擷取當前活動配置magic_quotes_runtime設定,如果運行時關閉魔術引號,返回0,否則返回1。我們也可以使用 htmispecialchars()對HTML中的特殊意義字元警醒編碼,htmispecialchars()函數把一些預定義的字元轉換為 HTML 實體 【預定義的字元是:& (和號) 成為 & " (雙引號) 成為 " ' (單引號) 成為 ' < (小於) 成為 < > (大於) 成為 >】
建立一個到適當資料庫的串連 PHP為串連MySQL提供了函數庫mysqli(i表示改進)。
當在PHP中使用mysqli函數庫是可以使用物件導向或面向過程的文法:
1、物件導向, @ $db = new mysqli('hostname','username','password','dbname');返回一個對象
2、面向過程: @ $db = mysqli_connect('hostname','username','password','dbname');返回一個資源,這個資源表示資料庫的串連,而且 如果使用過程方法,必須將這個資源傳遞到mysqli的所有其它函數。這與處理函數非常類似
mysqli的大多數函數都有物件導向介面和過程介面,二者的差異則在於過程版本的函數名稱以mysqli_開頭,同時要求傳入mysqli_connect()函數獲得的資源控制代碼。 對於這個規則來說,資料可串連是一個異常,因為它是由mysqli對象的建構函式來建立的。因此嘗試串連時需要進行檢查,mysqli_connect_errno()函數將在出現串連 錯誤時返回一個錯誤號碼,如果成功,則返回0.
請注意:
當串連到資料庫是,通常會議錯誤抑制符@作為第一含代碼。這樣可以巧妙的處理任何錯誤,也可以通過異常來處理。另外,MySQK對同時串連 資料庫的串連數量有一定的限制。MySQLi參數max_connections決定了同時串連的個數,該參數和相關的Apache參數MaxClients的作用是告訴伺服器拒絕新的串連請求, 從而保證系統資源不會再系統忙碌時或系統癱瘓時被請求或使用。要設定Apache中的MaxClients參數可以編輯系統中的httpd.conf檔案。要為MySQLi設定max_connections參數 可以編輯檔案my.conf。
選擇使用的資料庫: 在MySQL命令列使用 use dbname;命令;在php中可以用$db->select_db(dbname);或mysqli_select_db(db_resource,dbname)。
查詢資料庫 要執行資料庫查詢,首先應構造查詢語句:$query = "select * from user";然後運行 $result = $db->query($query);或者$result = mysqli_query($db,$query); 物件導向版本將返回一個結果對象;過程版本將返回一個結果資源。無論何種方法都將結果儲存在$result變數中工以後使用。如果函數運行失敗將返回false。
擷取查詢結果 使用不同的函數以不同的方式將查詢結果從結果對象或標識符中取出來,結果對象或標識符是訪問查詢返回行的關鍵。
通常我們要得到結果集中記錄行的行數,並且使用mysqli_fetch_assoc()函數。
返回行數:$num_results = $result->num_rows;(行數儲存在對象的num_rows成員變數中)或$num_results = mysqli_num_rows($result);
然後使用迴圈遍曆每一行,在迴圈中調用 $row = $result->fectch_assoc();或者 $row = mysqli_fetch_assoc($result);返回該行的資訊。 如果是對象返回行則每個關鍵詞為一個屬性名稱,每個值為屬性中的相應的值;如果以資源返回則返回數組。
還有其他從結果標識符中擷取結果的方法,例如:使用$row = $result->fecth_row($result);或者$row = mysqli_fetch_row($result);將結果取回 到一個列舉數組中;也可以使用$row = $result->fecth_object();或者 $row = mysqli_fecth_object($result);江一行去回到一個對象中。
從資料庫斷開 先釋放結果集:$result->free();或 mysqli_free_result($result);然後關閉資料庫連接:$db->close()或者 mysqli_close($db); 嚴格的說,這並不必須,因為指令碼執行完畢的時候他們將被自動關閉。
從Web查詢資料庫:使用Prepared語句
mysqli函數庫支援prepared語句的使用。它們對於在執行大量具有不同資料的相同查詢時,可以提高速度,也可以免受SQL注射風格(injection-stytle——的攻擊。
prepared語句的基本思想是可以向MySQL發送一個需要執行的查詢範本,然後在單獨發送資料。我們可以向相同的prepared語句發送大量的相同的資料;這個特性對批量處理的插入操作來說是非常有用的。
我們一般使用一下幾個步驟:
1、構造模板。已插入為例: $query = "insert into user values(?,?,?,?)";
2、使用prepared語句,構建一個語句對象或需要用來完成實際處理的資源。 $stmt = $db->prepare($query);或者mysqli_stmt_prepare($query);
3、調用$stmt->bind_param("sssd",$str1,$str3,$str3,$int4)或者mysqli_stmt_bind_param("sssd",$str1,$str3,$str3,$int4) 告訴php那些變數應該被問號所替換。第一個參數是一個格式化字串,後面是將要被替換的變數。
3、調用$stmt->execute()或者mysqli_stmt_execute()函數,將真正運行這個query語句
對於select類型查詢,可以使用$stmt->bind_result()或mysqli_stmt_bind_result()函數提供希望填充結果列的變數列表,然後每次調用 $stmt->fetch()或者mysqli_stmt_fetch()函數時,結果集下一行的值將被填充到這些綁定變數中。
使用PHP與資料庫互動的其他介面
PHP支援串連到許多不同資料庫的函數,包括Oracle、Microsoft SQL Server和PostgreSQL。通常,串連和查詢這些火速據庫的基本原理是相同的,個別 函數名稱可能不同。如果希望使用PHP還沒有提供支援的特殊資料庫,可以使用常規的ODBC函數。
ODBC表示開放的資料庫連接,他是串連資料庫的標準。ODBC只具有任何函數集的優先功能,如果要求必須相容所有的資料庫,就不能使用任何資料庫的特殊功能。
除了PHP附帶的函數庫以外,一些可供使用的資料庫抽象類別如MDB2允許為不同的資料庫類型使用相同的函數名。但是要提前安裝抽象層,例如安裝PEAR MDB2抽象層。