從Web查詢(xún)數(shù)據(jù)庫(kù)之PHP與MySQL篇
一個(gè)用戶(hù)的瀏覽器發(fā)出一個(gè)HTTP請(qǐng)求,請(qǐng)求特定的Web頁(yè)面,在該頁(yè)面中出發(fā)form表單提交到php腳本文件(如:results.php)中處理
Web服務(wù)器接收到對(duì)results.php頁(yè)面的請(qǐng)求后,檢索文件,并將其傳遞給PHP引擎處理
PHP引擎開(kāi)始解析腳本。腳本主要包括了連接數(shù)據(jù)庫(kù)和執(zhí)行查詢(xún)的命令。PHP啟動(dòng)了對(duì)MySQL服務(wù)器的連接并向該服務(wù)器發(fā)送適當(dāng)?shù)牟樵?xún)。
MySQL服務(wù)器接收到數(shù)據(jù)庫(kù)查詢(xún)的請(qǐng)求,開(kāi)始處理這個(gè)查詢(xún),并將查詢(xún)結(jié)果返回給PHP引擎。
PHP引擎完成了腳本的運(yùn)行后,將該HTML返回Web服務(wù)器。
Web服務(wù)器再將HTML返回給客戶(hù)端瀏覽器,用戶(hù)就可以看到響應(yīng)后的結(jié)果頁(yè)面。
從Web查詢(xún)數(shù)據(jù)庫(kù)的基本步驟
檢查并過(guò)濾來(lái)自用戶(hù)的數(shù)據(jù) 首先,我們將過(guò)濾用戶(hù)可能在其搜索條件的起始或結(jié)束位置不小心輸入的空白字符,這是用函數(shù)trim()來(lái)實(shí)現(xiàn)。 我們這么麻煩的檢查用戶(hù)輸入數(shù)據(jù)的原因是防止多個(gè)接口連接數(shù)據(jù)庫(kù),因?yàn)橛脩?hù)從不同的界面進(jìn)入,這樣可能導(dǎo)致安全問(wèn)題。
然后,當(dāng)準(zhǔn)備使用用戶(hù)輸入的任何數(shù)據(jù)時(shí),也要適當(dāng)?shù)倪^(guò)濾一些控制字符,當(dāng)用戶(hù)輸入數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí)必須轉(zhuǎn)義數(shù)據(jù),,此時(shí) 使用盜的函數(shù)有addslashes()函數(shù)、stripslashes()函數(shù)和get_magic_qutoes_gpc()函數(shù)。addslashes()函數(shù)為了數(shù)據(jù) 庫(kù)查詢(xún)語(yǔ)句等的需要在某些字符前加上了反斜線;stripslashes()函數(shù)去掉字符串中的反斜線字符;get_magic_qutoes_gpc()函數(shù) 魔術(shù)添加轉(zhuǎn)義字符 “\”,獲取當(dāng)前活動(dòng)配置magic_quotes_runtime設(shè)置,如果運(yùn)行時(shí)關(guān)閉魔術(shù)引號(hào),返回0,否則返回1。我們也可以使用 htmispecialchars()對(duì)HTML中的特殊意義字符警醒編碼,htmispecialchars()函數(shù)把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體 【預(yù)定義的字符是:& (和號(hào)) 成為 & " (雙引號(hào)) 成為 " ' (單引號(hào)) 成為 ' < (小于) 成為 < > (大于) 成為 >】
建立一個(gè)到適當(dāng)數(shù)據(jù)庫(kù)的連接 PHP為連接MySQL提供了函數(shù)庫(kù)mysqli(i表示改進(jìn))。
當(dāng)在PHP中使用mysqli函數(shù)庫(kù)是可以使用面向?qū)ο蠡蛎嫦蜻^(guò)程的語(yǔ)法:
1、面向?qū)ο螅?@ $db = new mysqli('hostname','username','password','dbname');返回一個(gè)對(duì)象
2、面向過(guò)程: @ $db = mysqli_connect('hostname','username','password','dbname');返回一個(gè)資源,這個(gè)資源表示數(shù)據(jù)庫(kù)的連接,而且 如果使用過(guò)程方法,必須將這個(gè)資源傳遞到mysqli的所有其它函數(shù)。這與處理函數(shù)非常類(lèi)似
mysqli的大多數(shù)函數(shù)都有面向?qū)ο蠼涌诤瓦^(guò)程接口,二者的差異則在于過(guò)程版本的函數(shù)名稱(chēng)以mysqli_開(kāi)頭,同時(shí)要求傳入mysqli_connect()函數(shù)獲得的資源句柄。 對(duì)于這個(gè)規(guī)則來(lái)說(shuō),數(shù)據(jù)可連接是一個(gè)異常,因?yàn)樗怯蒻ysqli對(duì)象的構(gòu)造函數(shù)來(lái)創(chuàng)建的。因此嘗試連接時(shí)需要進(jìn)行檢查,mysqli_connect_errno()函數(shù)將在出現(xiàn)連接 錯(cuò)誤時(shí)返回一個(gè)錯(cuò)誤號(hào),如果成功,則返回0.
請(qǐng)注意:
當(dāng)連接到數(shù)據(jù)庫(kù)是,通常會(huì)議錯(cuò)誤抑制符@作為第一含代碼。這樣可以巧妙的處理任何錯(cuò)誤,也可以通過(guò)異常來(lái)處理。另外,MySQK對(duì)同時(shí)連接 數(shù)據(jù)庫(kù)的連接數(shù)量有一定的限制。MySQLi參數(shù)max_connections決定了同時(shí)連接的個(gè)數(shù),該參數(shù)和相關(guān)的Apache參數(shù)MaxClients的作用是告訴服務(wù)器拒絕新的連接請(qǐng)求, 從而保證系統(tǒng)資源不會(huì)再系統(tǒng)忙碌時(shí)或系統(tǒng)癱瘓時(shí)被請(qǐng)求或使用。要設(shè)置Apache中的MaxClients參數(shù)可以編輯系統(tǒng)中的httpd.conf文件。要為MySQLi設(shè)置max_connections參數(shù) 可以編輯文件my.conf。
選擇使用的數(shù)據(jù)庫(kù): 在MySQL命令行使用 use dbname;命令;在php中可以用$db->select_db(dbname);或mysqli_select_db(db_resource,dbname)。
查詢(xún)數(shù)據(jù)庫(kù) 要執(zhí)行數(shù)據(jù)庫(kù)查詢(xún),首先應(yīng)構(gòu)造查詢(xún)語(yǔ)句:$query = "select * from user";然后運(yùn)行 $result = $db->query($query);或者$result = mysqli_query($db,$query); 面向?qū)ο蟀姹緦⒎祷匾粋€(gè)結(jié)果對(duì)象;過(guò)程版本將返回一個(gè)結(jié)果資源。無(wú)論何種方法都將結(jié)果保存在$result變量中工以后使用。如果函數(shù)運(yùn)行失敗將返回false。
獲取查詢(xún)結(jié)果 使用不同的函數(shù)以不同的方式將查詢(xún)結(jié)果從結(jié)果對(duì)象或標(biāo)識(shí)符中取出來(lái),結(jié)果對(duì)象或標(biāo)識(shí)符是訪問(wèn)查詢(xún)返回行的關(guān)鍵。
通常我們要得到結(jié)果集中記錄行的行數(shù),并且使用mysqli_fetch_assoc()函數(shù)。
返回行數(shù):$num_results = $result->num_rows;(行數(shù)保存在對(duì)象的num_rows成員變量中)或$num_results = mysqli_num_rows($result);
然后使用循環(huán)遍歷每一行,在循環(huán)中調(diào)用 $row = $result->fectch_assoc();或者 $row = mysqli_fetch_assoc($result);返回該行的信息。 如果是對(duì)象返回行則每個(gè)關(guān)鍵詞為一個(gè)屬性名,每個(gè)值為屬性中的相應(yīng)的值;如果以資源返回則返回?cái)?shù)組。
還有其他從結(jié)果標(biāo)識(shí)符中獲取結(jié)果的方法,例如:使用$row = $result->fecth_row($result);或者$row = mysqli_fetch_row($result);將結(jié)果取回 到一個(gè)列舉數(shù)組中;也可以使用$row = $result->fecth_object();或者 $row = mysqli_fecth_object($result);江一行去回到一個(gè)對(duì)象中。
從數(shù)據(jù)庫(kù)斷開(kāi) 先釋放結(jié)果集:$result->free();或 mysqli_free_result($result);然后關(guān)閉數(shù)據(jù)庫(kù)連接:$db->close()或者 mysqli_close($db); 嚴(yán)格的說(shuō),這并不必須,因?yàn)槟_本執(zhí)行完畢的時(shí)候他們將被自動(dòng)關(guān)閉。
從Web查詢(xún)數(shù)據(jù)庫(kù):使用Prepared語(yǔ)句
mysqli函數(shù)庫(kù)支持prepared語(yǔ)句的使用。它們對(duì)于在執(zhí)行大量具有不同數(shù)據(jù)的相同查詢(xún)時(shí),可以提高速度,也可以免受SQL注射風(fēng)格(injection-stytle——的攻擊。
prepared語(yǔ)句的基本思想是可以向MySQL發(fā)送一個(gè)需要執(zhí)行的查詢(xún)模板,然后在單獨(dú)發(fā)送數(shù)據(jù)。我們可以向相同的prepared語(yǔ)句發(fā)送大量的相同的數(shù)據(jù);這個(gè)特性對(duì)批量處理的插入操作來(lái)說(shuō)是非常有用的。
我們一般使用一下幾個(gè)步驟:
1、構(gòu)造模板。已插入為例: $query = "insert into user values(?,?,?,?)";
2、使用prepared語(yǔ)句,構(gòu)建一個(gè)語(yǔ)句對(duì)象或需要用來(lái)完成實(shí)際處理的資源。 $stmt = $db->prepare($query);或者mysqli_stmt_prepare($query);
3、調(diào)用$stmt->bind_param("sssd",$str1,$str3,$str3,$int4)或者mysqli_stmt_bind_param("sssd",$str1,$str3,$str3,$int4) 告訴php那些變量應(yīng)該被問(wèn)號(hào)所替換。第一個(gè)參數(shù)是一個(gè)格式化字符串,后面是將要被替換的變量。
3、調(diào)用$stmt->execute()或者mysqli_stmt_execute()函數(shù),將真正運(yùn)行這個(gè)query語(yǔ)句
對(duì)于select類(lèi)型查詢(xún),可以使用$stmt->bind_result()或mysqli_stmt_bind_result()函數(shù)提供希望填充結(jié)果列的變量列表,然后每次調(diào)用 $stmt->fetch()或者mysqli_stmt_fetch()函數(shù)時(shí),結(jié)果集下一行的值將被填充到這些綁定變量中。
使用PHP與數(shù)據(jù)庫(kù)交互的其他接口
PHP支持連接到許多不同數(shù)據(jù)庫(kù)的函數(shù),包括Oracle、Microsoft SQL Server和PostgreSQL。通常,連接和查詢(xún)這些火速據(jù)庫(kù)的基本原理是相同的,個(gè)別 函數(shù)名稱(chēng)可能不同。如果希望使用PHP還沒(méi)有提供支持的特殊數(shù)據(jù)庫(kù),可以使用常規(guī)的ODBC函數(shù)。
ODBC表示開(kāi)放的數(shù)據(jù)庫(kù)連接,他是連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)。ODBC只具有任何函數(shù)集的優(yōu)先功能,如果要求必須兼容所有的數(shù)據(jù)庫(kù),就不能使用任何數(shù)據(jù)庫(kù)的特殊功能。
除了PHP附帶的函數(shù)庫(kù)以外,一些可供使用的數(shù)據(jù)庫(kù)抽象類(lèi)如MDB2允許為不同的數(shù)據(jù)庫(kù)類(lèi)型使用相同的函數(shù)名。但是要提前安裝抽象層,例如安裝PEAR MDB2抽象層。
- PHP入門(mén)教程之使用Mysqli操作數(shù)據(jù)庫(kù)的方法(連接,查詢(xún),事務(wù)回滾等)
- MySql數(shù)據(jù)庫(kù)查詢(xún)結(jié)果用表格輸出PHP代碼示例
- php查詢(xún)mysql數(shù)據(jù)庫(kù)并將結(jié)果保存到數(shù)組的方法
- php+mysqli使用面向?qū)ο蠓绞讲樵?xún)數(shù)據(jù)庫(kù)實(shí)例
- php+mysqli使用預(yù)處理技術(shù)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)的方法
- php+mysql數(shù)據(jù)庫(kù)查詢(xún)實(shí)例
- php基礎(chǔ)之連接mysql數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)
- 關(guān)于php操作mysql執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)的一些常用操作匯總
- php mysql數(shù)據(jù)庫(kù)操作類(lèi)
- PHP同時(shí)連接多個(gè)mysql數(shù)據(jù)庫(kù)示例代碼
- 常用的PHP數(shù)據(jù)庫(kù)操作方法(MYSQL版)
- PHP+mysql實(shí)現(xiàn)從數(shù)據(jù)庫(kù)獲取下拉樹(shù)功能示例
相關(guān)文章
配置php網(wǎng)頁(yè)顯示各種語(yǔ)法錯(cuò)誤
使用php集成開(kāi)發(fā)環(huán)境Appserv網(wǎng)頁(yè)會(huì)提示各種語(yǔ)法錯(cuò)誤,但自己配置開(kāi)發(fā)環(huán)境無(wú)法提示錯(cuò)誤,這種情況該怎么解決呢?感興趣的朋友可以了解下本文2013-09-09PHP擴(kuò)展程序?qū)崿F(xiàn)守護(hù)進(jìn)程
守護(hù)進(jìn)程就是在后臺(tái)一直運(yùn)行的進(jìn)程。比如我們啟動(dòng)的httpd,mysqld等進(jìn)程都是常駐內(nèi)存內(nèi)運(yùn)行的程序。,下面我們就來(lái)探討下,如何使用php來(lái)實(shí)現(xiàn)守護(hù)進(jìn)程2015-04-04php將數(shù)據(jù)庫(kù)中所有內(nèi)容生成靜態(tài)html文檔的代碼
比較簡(jiǎn)單了,而且我的代碼優(yōu)化也很是問(wèn)題 比較繁瑣。下面就直接上代碼了2010-04-04php數(shù)組索引的Key加引號(hào)和不加引號(hào)的區(qū)別
這篇文章主要介紹了php數(shù)組索引的Key加引號(hào)和不加引號(hào)的區(qū)別,加引號(hào)和不加引號(hào)是有嚴(yán)重的區(qū)別的,需要的朋友可以參考下2014-08-08swfupload 多文件上傳實(shí)現(xiàn)代碼
swfupload 采用flash+ajax方式上傳文件2008-08-08php用戶(hù)注冊(cè)時(shí)常用的檢驗(yàn)函數(shù)實(shí)例總結(jié)
這篇文章主要介紹了php用戶(hù)注冊(cè)時(shí)常用的檢驗(yàn)函數(shù),以類(lèi)的形式實(shí)例總結(jié)了用戶(hù)名驗(yàn)證、郵箱驗(yàn)證、QQ驗(yàn)證等常用的驗(yàn)證技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12PHP spl_autoload_register實(shí)現(xiàn)自動(dòng)加載研究
spl_autoload_register()函數(shù)應(yīng)該是主流框架使用最多的也是非常核心的函數(shù)之一,可實(shí)現(xiàn)自動(dòng)注冊(cè)函數(shù)和類(lèi),實(shí)現(xiàn)類(lèi)似__autoload() 函數(shù)功能,簡(jiǎn)化了類(lèi)的調(diào)用與加載,提高了工作的效率2011-12-12總結(jié)PHP刪除字符串最后一個(gè)字符的三種方法
這篇文章為大家講解的是php實(shí)現(xiàn)如何去掉字符串的最后一個(gè)字符的多種方法,感興趣的同學(xué)參考下。下面來(lái)一起看看。2016-08-08