//利用非常处理缺点情形$driver=newmysqli_driver();$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 的差异不大,但是预处理语句和 PDO 中的利用的差异就有一些了。首先是我们的 MySQLi 中的占位符只有 ? 问号占位。其余也只有 bind_param() 没有类似于 PDO 中的 bindValue() 方法。
$stmt=$mysqli->prepare("selectfromzyblog_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)//["username"]=>//string(3)"bbb"//["password"]=>//string(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扩展学习(四)mysqli的事务与预处理语句.php
参考文档:
https://www.php.net/manual/zh/book.mysqli.php