從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抽象層。