PHP语言中mysql与mysqli应用浅析

2020-08-21 09:09朱飞刘曼琳
数字技术与应用 2020年7期

朱飞 刘曼琳

摘要: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.