朱飛 劉曼琳
摘要:mysql與mysqli都是PHP語言中的函數(shù)。mysql只能用于PHP前期的版本中,在PHP5.5以后的版本中就無法使用了。由于MySQL數(shù)據(jù)庫的擴(kuò)展和不斷更新,mysql函數(shù)不能與之相適應(yīng),而mysqli函數(shù)可以很好地解決這一問題。本文結(jié)合PHP語言,從連接方式、相關(guān)類和mysqli的使用方法對(duì)進(jìn)行闡述。最后通過一個(gè)實(shí)例對(duì)比分析二者應(yīng)用的區(qū)別。
關(guān)鍵詞:php語言;mysql函數(shù);mysqli函數(shù);MySQL數(shù)據(jù)庫
中圖分類號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2020)07-0038-04
很多編程語言都能和MySQL數(shù)據(jù)庫搭配使用。但是對(duì)于輕量級(jí)的開發(fā)語句PHP來說,MySQL數(shù)據(jù)庫可以說是最佳搭檔。PHP對(duì)mysql的擴(kuò)展始終跟隨MySQL數(shù)據(jù)庫的發(fā)展,如果使用mysql擴(kuò)展庫中的函數(shù),在PHP訪問MySQL數(shù)據(jù)庫時(shí)就會(huì)更加簡(jiǎn)單、便捷[1]。在PHP之前的舊版本中,mysql函數(shù)可以使用一個(gè)面向過程的接口。但隨著MySQL數(shù)據(jù)庫的不斷發(fā)展,mysql函數(shù)不能在MySQL4.1以后的版本中運(yùn)用,為了很好地解決這個(gè)問題,mysqli應(yīng)運(yùn)而生。本文著重對(duì)PHP中mysql和mysqli的應(yīng)用情況進(jìn)行比較,其中包括服務(wù)器的連接、數(shù)據(jù)庫的選擇和數(shù)據(jù)庫的關(guān)閉等幾個(gè)方面。
1 mysql與mysqli簡(jiǎn)介
1.1 mysql簡(jiǎn)介
在PHP中的mysql函數(shù)的功能是允許用戶訪問MySQL數(shù)據(jù)庫服務(wù)器。在編譯PHP時(shí)要添加對(duì)MySQL的支持。在Windows系統(tǒng)上,PHP4版本中,mysql的相關(guān)擴(kuò)展已經(jīng)編譯入PHP。而PHP5以后是默認(rèn)未啟動(dòng)的,所以需要在phpin中激活php_mysql.dll動(dòng)態(tài)鏈接庫。
1.2 mysqli簡(jiǎn)介
mysqli也是用來處理database關(guān)系型數(shù)據(jù)庫的函數(shù),從表面上看比mysql多了一個(gè)i。這個(gè)i在這里就相當(dāng)于是improvement,可以理解為mysql的增強(qiáng)版本,在這個(gè)版本中包括了更多豐富的功能。mysqli可以配合MySQL4.1.13以后的服務(wù)端版本工作。對(duì)于mysqli來說,本身也增加了安全性,尤其是在SQL注入方面。需要注意的一點(diǎn)只有在PHP5或者M(jìn)ySQL4.1以后的版本中才能使用mysqli。mysqli的優(yōu)點(diǎn)有很多,比如: 在面向?qū)ο蠼涌?、多語句執(zhí)行、事務(wù)支持、prepared語言支持、嵌入式服務(wù)以及調(diào)試能力等方面[2]。
由于mysqli擴(kuò)展的各種優(yōu)勢(shì),以及強(qiáng)大的面向?qū)ο箝_發(fā)能力,到PHP5.3的時(shí)候,原來的mysql擴(kuò)展已經(jīng)被標(biāo)注為過時(shí)。而到了PHP7,原mysql擴(kuò)展被徹底廢棄。所以目前不管是否使用PHP7,一般都是用使用mysqli或pdo擴(kuò)展來操作MySQL數(shù)據(jù)庫。
2 mysql與mysqli的比較
2.1 連接方面
2.1.1 mysql的連接
mysql這個(gè)函數(shù)擁有非粘合連接功能。非持續(xù)連接函數(shù)的意思是每一個(gè)請(qǐng)求或者響應(yīng)都需要單獨(dú)的發(fā)送TCP連接請(qǐng)求,每一個(gè) TCP連接只能用來傳輸一個(gè)響應(yīng)報(bào)文和一個(gè)請(qǐng)求報(bào)文,在傳輸后就立刻關(guān)閉連接。也就意味著mysql每次連接都需要開啟一個(gè)連接的進(jìn)程,與服務(wù)器建立關(guān)系,這樣每次訪問MySQL服務(wù)器都需要消耗不少的資源。
2.1.2 mysqli的連接
mysqli函數(shù)擁有永久連接功能。永久連接函數(shù)的意思是所有的請(qǐng)求都使用同一個(gè)TCP連接發(fā)送,當(dāng)服務(wù)器發(fā)送響應(yīng)后,TCP連接保持打開。所以說在mysqli的不同次數(shù)運(yùn)行中是可以使用相同的連接進(jìn)程的,這樣就降低了服務(wù)器的開銷。在擴(kuò)展速度這一方面,mysqli擴(kuò)展的執(zhí)行速度遠(yuǎn)遠(yuǎn)超過了早期的mysql版本[3]。
2.2 相關(guān)類
由于mysqli擴(kuò)展被封裝成一個(gè)類,所以能夠使用面向?qū)ο蟮姆椒ㄟM(jìn)行編程,不過也可以使用面向過程的方式[4]。但是眾所周知,在對(duì)性能的要求不是特別高時(shí),應(yīng)首選面向?qū)ο蟮姆绞剑驗(yàn)槊嫦驅(qū)ο笥兄子诰S護(hù)、擴(kuò)展,低耦合等眾多的優(yōu)點(diǎn)。 mysqli擴(kuò)展還有一個(gè)特性,就是能夠支持預(yù)處理語言。這樣不僅提升了SQL語句多次執(zhí)行的性能,還改善了mysqli擴(kuò)展的調(diào)試能力,使編程效率得到了明顯的提升。mysqli擴(kuò)展不僅包含了mysql中所有的功能還添加了3個(gè)類,分別是mysqli、mysqli_result和mysqli_stmt。其中mysqli_stmt是完成mysqli預(yù)處理語句的重要類。 在mysqli中這三個(gè)類相互配合使用,以便于完成對(duì)MySQL數(shù)據(jù)庫的連接、數(shù)據(jù)操作和預(yù)處理等內(nèi)容。
2.3 使用方面
當(dāng)需要用到new mysqli()時(shí),要對(duì)php.ini文件進(jìn)行配置。因?yàn)閙ysqli類并不是自動(dòng)開啟的。在windows系統(tǒng)的配置文件php.ini中,把”extension=php_mysqli.dll”前面的”;”刪除,并且保存。然后關(guān)閉php.ini文件,并重新啟動(dòng)Apache。mysqli.dll既可以用對(duì)象的方式操作數(shù)據(jù)庫,也可以用過程的方式操作數(shù)據(jù)庫。關(guān)于mysqli.dll的特點(diǎn)總結(jié)有以下幾個(gè)方面:
(1)可以和mysql.dll一樣的方式使用。
(2)支持OO接口,簡(jiǎn)單調(diào)用。
(3)支持MYSQL4.1引入的新特性。
(4)能夠使用mysqli_init()等一系列的函數(shù),來進(jìn)行連接選項(xiàng)的高級(jí)設(shè)置。
為了與mysql.dll做一個(gè)比較,以下就列舉一些經(jīng)常能夠使用到的操作:
(1)mysqli.dll的面向過程方式操作。
$conn = mysqli_connect(“l(fā)ocalhost”,”root”,””);// 創(chuàng)建連接
$select=mysqli_select_db($conn,”lml_db”);//選擇名為lml_db的數(shù)據(jù)庫
$result=mysqli_query($conn,”select * from user”);//執(zhí)行SQL語句,這里以查詢user表中所有內(nèi)容為例
$row=mysqli_fetch_row($result);//為了簡(jiǎn)單這里只取一行數(shù)據(jù)
echo $row[0];//輸出第一個(gè)字段值
mysqli_close($conn);//關(guān)閉連接
mysql也有面向過程的方法,在mysql面向過程的方法中只是把mysqli換成mysql,具體區(qū)別和使用方法將在下文中詳細(xì)講述。假如mysqli是以面向過程的方法操作的話,有些函數(shù)必需要有特定資源。例如mysqli_ query()這個(gè)函數(shù),在這個(gè)函數(shù)中有三個(gè)參數(shù),分別$ conn數(shù)據(jù)可靠的連接標(biāo)識(shí)、$ query需要執(zhí)行的SQL語句和一個(gè)常量$ resultmode,這個(gè)常量通常由兩個(gè)選項(xiàng),一般使用默認(rèn)值MYSQLI_ STORE_ RESULT,這里不再詳細(xì)展開。我們重點(diǎn)需要注意的是前兩個(gè)參數(shù)$conn和$query,這二者的順序不能改變,數(shù)據(jù)庫的連接標(biāo)識(shí)$conn必須放在需要執(zhí)行的SQL語句之前。 這一點(diǎn)和mysql_query()是不一樣的。mysql_ query()有兩個(gè)參數(shù),第一個(gè)就是$ query需要執(zhí)行的 SQL語句,第二個(gè)是$ conn數(shù)據(jù)庫的連接標(biāo)識(shí),并且第二個(gè)參數(shù)$ conn數(shù)據(jù)庫的連接標(biāo)識(shí)不是必要的。在沒有定義的情況下,也就是默認(rèn)狀態(tài),會(huì)直接使用上一個(gè)打開的連接。 而且mysql_select_db和mysqli_select_db的參數(shù)剛好相反。這里需要重點(diǎn)強(qiáng)調(diào)的是 php5.5無法使用mysql_query,需要用mysqli_query。
(2)mysqli.dll的面向?qū)ο蠓绞讲僮鳌?/p>
$conn = new mysqli(“l(fā)ocalhost”,”root”,””);//創(chuàng)建連接
$conn->select_db(“l(fā)ml_db”);//選擇名為lml_db的數(shù)據(jù)庫
/*也可以在創(chuàng)建連接時(shí)就指定需要選擇的數(shù)據(jù)庫:$conn = new mysqli(“l(fā)ocalhost”,”root”,””,”lml_db”);*/
$result=$conn->query(“select * from user”);//執(zhí)行SQL語句,這里以查詢user表中所有內(nèi)容為例
$row=$result->fetch_row();//為了簡(jiǎn)單這里只取一行數(shù)據(jù)
echo $row[0];//輸出第一個(gè)字段值
$conn->close();//關(guān)閉連接
在mysql中沒有此類方式連接。在下文中著重進(jìn)行對(duì)比mysql和mysqli的面向過程方式之間的區(qū)別。
3 mysql與mysqli連接例析
以人員信息管理系統(tǒng)的添加用戶功能為例。首先在MySQL數(shù)據(jù)庫中創(chuàng)建一個(gè)數(shù)據(jù)庫,名為lml_db,在lml_db數(shù)據(jù)庫中創(chuàng)建用戶表user。user表中包含序號(hào)(id)、姓名(name)、入職日期(time)、年齡(age)和聯(lián)系方式(pnumber)。
PHP程序在與MySQL交互前需要先連接成功,然后在執(zhí)行SQL命令,具體流程圖和步驟如圖1。
3.1 mysqli連接數(shù)據(jù)庫的方式
3.1.1 連接數(shù)據(jù)庫服務(wù)器
要操作MySQL數(shù)據(jù)庫,必須與MySQL服務(wù)器建立連接,在PHP中通過mysqli_connect()函數(shù)來實(shí)現(xiàn)。代碼如下:
$host=”localhost”;
$user=”root”;
$pass=””;
$conn=mysqli_connect($host,$user,$pass);
其中$host是MySQL服務(wù)器的主機(jī)名稱(或IP),localhost是本機(jī)的意思;$user是登錄服務(wù)器的用戶名,默認(rèn)用戶名為root;$pass是服務(wù)器的用戶密碼,默認(rèn)為空。
3.1.2 選擇MySQL服務(wù)器中需要使用到的數(shù)據(jù)庫
與MySQL數(shù)據(jù)庫服務(wù)器連接成功后,使用mysqli_ select_db()函數(shù)選擇服務(wù)器中需要使用到的數(shù)據(jù)庫。
$select=mysqli_select_db($conn,”lml_db”);
其中參數(shù)$conn是MySQL服務(wù)器的連接標(biāo)識(shí)符;lml_db是要選擇的數(shù)據(jù)庫名稱。
3.1.3 執(zhí)行SQL語句
在PHP中用mysqli_query()函數(shù)來執(zhí)行對(duì)數(shù)據(jù)庫操作的SQL語句。mysqli_query()函數(shù)的語法如下:
$result=mysqli_query($conn,$sql);
其中參數(shù)$conn是MySQL服務(wù)器的連接標(biāo)識(shí)符;參數(shù)$sql是傳入的SQL語句,包括插入語句、刪除語句、修改語句、查詢語句。增添用戶使用到的是插入語句,例如,將姓名為王明、入職時(shí)間為2018年12月、年齡24歲、手機(jī)號(hào)為15505532271的人員信息插入到user表中,具體代碼如下:
$insert_sql=”insert into user (name,time,age,pnumber) values (‘王明,2018.12,24,15505532271)”;
然后執(zhí)行插入語句,據(jù)以代碼如下:
$result=mysqli_query($conn,$insert_sql);
3.1.4 關(guān)閉連接
當(dāng)我們對(duì)數(shù)據(jù)庫進(jìn)行連接時(shí),每次使用到mysqli_ connect()或mysqli_ query()函數(shù),都會(huì)損耗一定的系統(tǒng)資源。如果在用戶規(guī)模較小的情況下,去訪問網(wǎng)站是基本沒有問題的,但是如果用戶的數(shù)量超過了一定的規(guī)模,就會(huì)使系統(tǒng)的性能大幅度的下滑,嚴(yán)重情況下服務(wù)器會(huì)死機(jī)。為了防止這種情況的出現(xiàn),在使用完數(shù)據(jù)庫之后,應(yīng)該關(guān)閉與MySQL服務(wù)器的連接。把數(shù)據(jù)庫這個(gè)寶貴的資源讓給其他用戶繼續(xù)使用。關(guān)閉數(shù)據(jù)庫服務(wù)器連接用到的是mysqli_close()函數(shù)。該函數(shù)的語法如下:
mysqli_close($conn);
3.2 mysql連接數(shù)據(jù)庫的方式
3.2.1 連接數(shù)據(jù)庫服務(wù)器
$host=”localhost”;
$user=”root”;
$pass=””;
$conn=mysql_connect($host,$user,$pass);
3.2.2 選擇服務(wù)器中的數(shù)據(jù)庫
$select=mysql_select_db(“l(fā)ml_db”);
3.2.3 執(zhí)行SQL語句
$insert_sql=”insert into user (name,time,age,pnumber) values (‘王明,2018.12,24,15505532271)”;
$result=mysql_query($insert_sql);
通過上述實(shí)例可以看出以下幾點(diǎn):
(1)第一步連接數(shù)據(jù)庫服務(wù)器,用法基本相同。
(2)第二步選擇服務(wù)器中的數(shù)據(jù)庫,mysqli_select_db中有兩個(gè)參數(shù),第一個(gè)是數(shù)據(jù)庫的連接標(biāo)識(shí)$conn,第二個(gè)是需要選擇的數(shù)據(jù)庫名稱,這兩個(gè)參數(shù)都是必要的,并且順序不能改變。而mysql_select_db中只有需要選擇的數(shù)據(jù)庫名稱是必需的。
(3)第三步執(zhí)行是SQL語句時(shí)mysqli_query中有兩個(gè)參數(shù),第一個(gè)是數(shù)據(jù)庫的連接標(biāo)識(shí)$conn,第二個(gè)是需要執(zhí)行的SQL語句,這兩個(gè)參數(shù)都是必需的,并且順序不能改變。而mysql_query中只有需要執(zhí)行的SQL語句是必需的,數(shù)據(jù)庫連接標(biāo)識(shí)$conn可選;如果有$conn,必須放在SQL語句之后,如果沒有$conn,使用上一個(gè)打開的連接。
(4)最后一步關(guān)閉連接,使用mysqli_connect建立的是持久連接,使用結(jié)束后必須要手動(dòng)關(guān)閉mysqli_close。但是mysql_connect建立的是非持久連接,在腳本執(zhí)行完后會(huì)自動(dòng)的關(guān)閉,因此不需要手動(dòng)關(guān)閉。這里特別要注意,如果使用mysql_pconnect建立持久連接,mysql_close無法將其關(guān)閉。
4 結(jié)語
隨著MySQL數(shù)據(jù)庫的發(fā)展,mysql已經(jīng)無法滿足一些函數(shù)擴(kuò)展的使用,所以逐漸的被淘汰??傮w來說mysqli基本包含了mysql之前所有的功能,但是在用法上有所不同,主要是針對(duì)函數(shù)中的一些參數(shù)。而mysqli相對(duì)于mysql來說有很多比較明顯的優(yōu)點(diǎn),其中包括執(zhí)行效率、安全性、兼容性等各個(gè)方面[5]。mysqli在構(gòu)造函數(shù)和類方面更簡(jiǎn)單,在后期的可擴(kuò)展性也更為強(qiáng)大,并且mysqli的面向?qū)ο蠼涌谑钩绦虼a更加容易閱讀和理解,增強(qiáng)了數(shù)據(jù)訪問的穩(wěn)定性。
參考文獻(xiàn)
[1] 王彥輝,王天平.PHP+MySQL動(dòng)態(tài)網(wǎng)頁技術(shù)教程[M].大連:東軟電子出版社,2013.
[2] 程晨航,江妍,程仁貴.對(duì)PHP中mysqli擴(kuò)展模塊的探究及應(yīng)用[J].福建電腦,2015(1):26-27.
[3] 鄒天思.PHP從入門到精通[M].北京:清華大學(xué)出版社,2009.
[4] 馬曉娟.面向?qū)ο缶幊趟枷虢馕鯷J].電子技術(shù)與軟件工程,2014(21):254.
[5] 周建儒.mysqli預(yù)處理語句的技術(shù)分析[J].電子技術(shù)與軟件工程,2014(17):218.
數(shù)字技術(shù)與應(yīng)用2020年7期