上次总结了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() 该函数设置在数据库间传输字符时所用的默认字符编码