经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
来源:cnblogs  作者:硬核项目经理  时间:2021/6/28 9:41:33  对本文有异议

对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本。我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容。所以在这里,我们就不再多讲理论方面的东西了,直接上代码来看看 MySQLi 中这两大特性与 PDO 在使用上的区别。

事务处理

首先,我们还是要让 MySQLi 对于错误的语句也报出异常来。关于这个功能就和 PDO 很不一样了。在 PDO 中,我们直接指定连接的报错属性就可以了。而在 MySQLi 中,我们则需要指定 MySQLi_Driver 对象中的报错属性为抛出异常,很明显,MySQLi_Driver 就是 MySQLi 的驱动对象。

  1. // 使用异常处理错误情况
  2. $driver = new mysqli_driver();
  3. $driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;

这样就指定了在使用 MySQLi 扩展时,所有的错误信息都会作为异常抛出。

接下来的内容,其实就和 PDO 很相似了。

  1. try {
  2. // 开始事务
  3. $mysqli->begin_transaction();
  4. $mysqli->query("insert into tran_innodb (name, age) values ('Joe', 12)");
  5. $mysqli->query("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 不存在的表
  6. // 提交事务
  7. $mysqli->commit();
  8. } catch (Exception $e) {
  9. // 回滚事务
  10. $mysqli->rollback();
  11. var_dump($e->getMessage());
  12. // string(44) "Table 'blog_test.tran_innodb2' doesn't exist"
  13. }

我们同样是使用一个 begin_transaction() 来启动事务。然后通过 commint() 方法来提交事务。在这段测试代码中,第二条 SQL 语句是会报错的,于是进入了 catch 中,使用 rollback() 来回滚事务。

预处理语句

总体来说,事务的处理和 PDO 的区别不大,但是预处理语句和 PDO 中的使用的区别就有一些了。首先是我们的 MySQLi 中的占位符只有 ? 问号占位。另外也只有 bind_param() 没有类似于 PDO 中的 bindValue() 方法。

  1. $stmt = $mysqli->prepare("select * from zyblog_test_user where username = ?");
  2. $username = 'aaa';
  3. $stmt->bind_param("s", $username); // 绑定参数
  4. $stmt->execute(); // 执行语句
  5. $aUser = $stmt->fetch(); // 获取mysqli_result结果集对象
  6. $username='bbb';
  7. $stmt->bind_param('s', $username);
  8. $stmt->execute();
  9. $bUser = $stmt->fetch();
  10. var_dump($aUser);
  11. // array(4) {
  12. // ["id"]=>
  13. // int(1)
  14. // ["username"]=>
  15. // string(3) "aaa"
  16. // ["password"]=>
  17. // string(3) "aaa"
  18. // ["salt"]=>
  19. // string(3) "aaa"
  20. // }
  21. var_dump($bUser);
  22. // array(4) {
  23. // ["id"]=>
  24. // int(2)
  25. // ["username"]=>
  26. // string(3) "bbb"
  27. // ["password"]=>
  28. // string(3) "bbb"
  29. // ["salt"]=>
  30. // string(3) "123"
  31. // }

从代码中可以看出,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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14929397.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号