当前位置: 首页 > 后端技术 > PHP

PHP中的MySQLi扩展学习(四)mysqli的事务和preparedstatements

时间:2023-03-29 14:39:12 PHP

对于MySQLi来说,transactions和preparedstatements当然是它能够淘汰MySQL(原版)扩展的资本。之前我们也了解过PDO中的事务和preparedstatements。所以这里,我们就不讲理论方面的东西了,直接上代码看看这两个特性在MySQLi和PDO在使用上的区别。事务处理首先我们还是要让MySQLi对错误的语句报异常。关于这个功能,它和PDO有很大的不同。在PDO中,我们可以直接指定连接的报错属性。在MySQLi中,我们需要在MySQLi_Driver对象中指定error属性为抛出异常。显然,MySQLi_Driver是MySQLi的驱动对象。//使用异常处理错误情况$driver=newmysqli_driver();$驱动程序->report_mode=MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT;这指定在使用MySQLi扩展时,所有错误消息都将作为异常抛出。下面的内容其实和PDO很像。try{//开始事务$mysqli->begin_transaction();$mysqli->query("insertintotran_innodb(name,age)values('Joe',12)");$mysqli->query("insertintotran_innodb2(name,age)values('Joe',12)");//不存在的表//提交事务$mysqli->commit();}catch(Exception$e){//回滚事务$mysqli->rollback();var_dump($e->getMessage());//string(44)"Table'blog_test.tran_innodb2'doesn'texist"}我们还使用begin_transaction()来启动事务。然后通过commint()方法提交事务。在本次测试代码中,第二条SQL语句会报错,于是进入catch,使用rollback()回滚事务。总的来说,事务的处理和PDO没有太大的区别,但是preparedstatements的使用和PDO有一些区别。首先是我们MySQLi中的占位符只有?问号占位符。另外,只有bind_param()没有类似PDO中bindValue()的方法。$stmt=$mysqli->prepare("select*fromzyblog_test_userwhereusername=?");$username='aaa';$stmt->bind_param("s",$username);//绑定参数$stmt->execute();//执行语句$aUser=$stmt->fetch();//获取mysqli_result结果集对象$username='bbb';$stmt->bind_param('s',$username);$stmt->execute();$bUser=$stmt->fetch();var_dump($aUser);//array(4){//["id"]=>//int(1)//["username"]=>//string(3)"aaa"//["password"]=>//string(3)"aaa"//["salt"]=>//string(3)"aaa"//}var_dump($bUser);//array(4){//["id"]=>//int(2)//["用户名"]=>//字符串(3)"bbb"//["密码"]=>//字符串(3)"bbb"//["salt"]=>//string(3)"123"//}从代码中可以看出,bind_param()方法的使用与PDO也有很大区别。它不需要下标,但有一个s参数。该参数表示绑定数据的类型,s为字符串类型。对于其他类型,我们会在MySQLi_STMT相关的内容中详细了解。总结其实从代码层面来看,大部分内容和PDO很相似,只是有些参数不同而已。对于我们来说,还是更多的是学习和理解,这样我们在封装或者使用一些以MySQLi作为底层数据库操作的框架时,才不会头晕。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/7。PHP中的MySQLi扩展学习(4)mysqli事务和准备语句。PHP参考文档:https://www.php.net/manual/zh/book.mysqli.php各媒体平台均可搜索【硬核项目经理】