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