朱飛 劉曼琳



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