php操作mysql数据库的扩展有哪些_学习笔记--php--mysql数据库操作--mysqli扩展库(一)...

上次总结了php的mysql扩展库基本用法后,这次继续总结同样是用来操作mysql数据库的mysqli扩展库的用法.

mysqli扩展库和mysql扩展库的功能大致相同,都是用来操作mysql数据库的扩展.但mysqli扩展更偏重面向对象的编程风格.当然mysqli依然支持面向过程的编程思路,但既然支持了面向对象,还是推荐使用面向对象的风格来使用mysqli扩展库中的函数实现对数据库的操作.mysqli扩展同时也是mysql扩展的加强版,无论是执行效率还是功能实现上都比mysql扩展有所提高.所以了解mysqli扩展的使用方法还是非常有必要的.

(一)mysqli扩展基本使用

那么要想使用mysqli扩展,还是需要在php的配置文件中启用mysqli扩展,然后重启apache服务器来加载这个模块.使用mysqli扩展库操作数据库的一贯思路如下:

1.首先还是获取一个数据库连接.

因为mysqli是面向对象的编程风格,所以关于数据库的一切操作都是基于一个数据库连接对象来实现的.那么获取一个数据库连接只需实例化一个mysqli对象:

$mysqli = new mysqli($host,

$user, $password, $db_name, $port);

在创建这个mysqli对象的同时,可以向它的构造函数传入五个参数,分别代表了主机名$host,数据库服务器用户名$server,密码$password,数据库名称$db_name,数据库服务器端口号$port.

可以对成员属性$mysqli->connect_error进行判断,如果连接成功,该属性赋值为null,否则赋值为错误信息.

2.获得数据库连接对象后,就可以调用对象中的成员函数对数据库进行操作.

操作数据库所要使用的一个重要函数就是$mysqli->query($sql)函数.该函数传入一个sql语句作为参数,会向当前数据库发送一条sql命令.如果sql语句是dml语句,则返回布尔值.如果是dql语句,成功则返回一个资源集对象mysqli_result对象,失败则返回false.注意:在连接好数据库后,应当设置客户端字符集编码'set

names utf8'.

不论sql语句究竟是dml语句还是dql语句,我们都可以调用$mysqli->affected_rows()函数来获取上一次向数据库发送sql语句时所有影响的行数.

3.处理资源集对象

当成功执行了一条dql语句后,$mysqli->query()函数将返回一个资源集类型的对象mysqli_result.这里需要强调的是,资源集对象是mysqli对象调用query()函数后的返回值,但mysqli_result和mysqli已经是两个不同对象了,关于资源集的一切操作,都将调用mysqli_result对象中的方法来进行处理.mysqli_result对象主要通过它的成员函数$mysqli_result->fetch_row(),$mysqli_result->fetch_assoc(),$mysqli_result->fetch_array()这几个函数来取出结果集中的记录.这和mysql扩展中的fetch函数取出数据的方式是非常类似的.同时$mysqli_result对象中还有几个成员属性是很有用的,如$field_count属性保存资源集中列的个数,$num_rows属性保存有资源集的行数.

4.释放资源集对象

获取完所有资源集后,还是需要调用$mysqli_result对象的成员函数free()来释放资源集,其实也就相当于调用了$mysqli_result对象的析构函数.

5.释放数据库连接

数据库操作完成后,需要调用$mysqli对象的close()函数,回收数据库连接资源.

(二)mysqli批处理技术

mysqli扩展除了可以像mysql扩展一样对数据库进行基本的操作外,还提供了一些提高数据库操作效率的方法来操作数据库.mysqli的批量执行函数multi_query()就是其中之一.

在操作数据库时,mysqli扩展的query()函数可以向数据库发送sql命令,但有时,业务逻辑需要向数据库发送大量sql命令时,那通过程序循环来反复调用query()函数则并不是那么的妥当了.所以mysqli扩展还提供了一个multi_query()函数这个函数可以向数据库批量发送多条sql语句.

同样的,multi_query()函数可以执行各种形式的sql语句.

那么multi_query()函数究竟如何使用呢?

首先还是需要实例化一个mysqli对象.因为multi_query()函数是mysqli类的成员函数.该函数必须传入一个字符串类型的参数.这个字符串中可以拼接多条sql语句,每条语句之间用分号';'分隔.

$sql = 'set names utf8;';

$sql .= 'select * from

`test`;';

$sql .= 'delete from `test`;';

$mysqli->multi_query($sql);

这样就可以一次向数据库发送多条sql语句了.

需要注意的是:在这一系列sql语句中,一旦出现了一条mysql无法执行的sql语句(报错),那么后续的sql语句也将不会再执行下去.同时multi_query()函数的逻辑返回值也跟第一条sql语句有极大关系.第一条sql语句如果可以正确执行,那无论之后的sql语句能否成功执行,都将返回true.同时,mysqli对象的errno(错误编号)属性,error(错误信息)属性也只和第一条sql语句相关.这意味着即使multi_query()方法的返回值为true,后续sql语句也是有可能存在错误的.

当批量执行dml语句时,query()函数的返回值仅限于true或者false.但当批量执行dql语句时则会返回多个结果集.下面总结一下如果处理批量执行select语句后返回的多个结果集.

关于批量执行select语句后获取结果集的方法:

if($mysqli->multi_query($sql)){

do

{

$res = $mysqli->store_result();

while($row = $res->fetch_row()){

foreach($row as $val){

echo '--'.$val.'

';

}

}

echo '*********************

';

}while($mysqli->next_result());

上方代码的意思是首先对multi_query()函数的返回值进行判断,如果返回值为非false那说明至少有一条sql语句被正确执行了.那么执行do..while循环.循环内最关键的一步在于调用了$mysqli对象的store_result()函数.这个函数会返回当前一个结果集对象并同时指向下一个结果集对象.有多少个结果集对象取决于执行了多少个dql语句.然后还是按行取出结果集中的数据.在整个do..while内的代码执行结束后,调用$mysqli对象的next_result()函数进行判断,时候还有更多结果集,成功返回true,失败返回false.这样就可以循环取出多个结果集,并将结果集中的记录一一取出.

这个思路感觉不是那么的好理解,后来自己又总结了另外一种批量执行select语句获取结果集的方式,代码如下:

$mysqli->multi_query($sql);

while($mysqli->more_results()){

echo '

**************************

';

$mysqli->next_result();

$res = $mysqli->store_result();

while($row = $res->fetch_row()){

foreach($row as $val){

echo '--'.$val.'

';

}

}

}

这段代码的过程是这样的:首先执行multi_query()函数批量执行sql语句.

然后通过while循环,先调用$mysqli对象的more_results()函数判断,如果还有未处理的结果集该函数将返回true,否则返回false.循环中先调用$mysqli->next_result()函数,指向下一个结果集,然后调用store_result()函数将结果集对象取出,然后进行循环取出数据.个人认为这个方式比较符合人的想法.首先判断是否还有未处理的结果集,有则指向它并取出,没有则循环结束.

当处理完一个资源集对象后推荐及时释放资源集和mysqli连接.

以上即使用mysqli扩展对数据库进行基本操作和批处理操作的一般思路.$mysqli类中还有一些辅助型的成员属性和函数.

$mysqli->affected_rows  该属性保存上一次成功执行sql语句后受影响的行数

$mysqli->connect_error  该属性保存上一次数据库连接出错时的错误信息

$mysqli->set_charset()  该函数设置在数据库间传输字符时所用的默认字符编码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值