PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
对于 mysqli 来说,事务和预处理语句当然是它之所以能够淘汰 mysql(原始) 扩展的资本。我们之前也已经学习过了 pdo 中关于事务和预处理语句相关的内容。所以在这里,我们就不再多讲理论方面的东西了,直接上代码来看看 mysqli 中这两大特性与 pdo 在使用上的区别。
事务处理
首先,我们还是要让 mysqli 对于错误的语句也报出异常来。关于这个功能就和 pdo 很不一样了。在 pdo 中,我们直接指定连接的报错属性就可以了。而在 mysqli 中,我们则需要指定 mysqli_driver 对象中的报错属性为抛出异常,很明显,mysqli_driver 就是 mysqli 的驱动对象。
// 使用异常处理错误情况 $driver = new mysqli_driver(); $driver->report_mode = mysqli_report_error | mysqli_report_strict;
这样就指定了在使用 mysqli 扩展时,所有的错误信息都会作为异常抛出。
接下来的内容,其实就和 pdo 很相似了。
try { // 开始事务 $mysqli->begin_transaction(); $mysqli->query("insert into tran_innodb (name, age) values ('joe', 12)"); $mysqli->query("insert into tran_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't exist" }
我们同样是使用一个 begin_transaction() 来启动事务。然后通过 commint() 方法来提交事务。在这段测试代码中,第二条 sql 语句是会报错的,于是进入了 catch 中,使用 rollback() 来回滚事务。
预处理语句
总体来说,事务的处理和 pdo 的区别不大,但是预处理语句和 pdo 中的使用的区别就有一些了。首先是我们的 mysqli 中的占位符只有 ? 问号占位。另外也只有 bind_param() 没有类似于 pdo 中的 bindvalue() 方法。
$stmt = $mysqli->prepare("select * from zyblog_test_user where username = ?"); $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 为底层数据库操作的框架时不至于晕头转向。
测试代码:
参考文档:
关注公众号:【硬核项目经理】获取最新文章
添加微信/qq好友:【xiaoyuezigonggong/149844827】免费得php、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
b站id:482780532
推荐阅读
-
PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
-
PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作
-
PHP中的MySQLi扩展学习(三)mysqli的基本操作
-
PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法
-
PHP中的MySQLi扩展学习(一)MySQLi介绍
-
PHP中的PDO操作学习(二)预处理语句及事务
-
PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
-
PHP中如何使用mysqli的事务与预处理语句
-
PHP中的PDO操作学习(二)预处理语句及事务
-
PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作