乐趣区

关于php: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 为底层数据库操作的框架时不至于昏头昏脑。

测试代码:

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

各自媒体平台均可搜寻【硬核项目经理】

退出移动版