PHPにおけるMySQLi拡張学習(四)mysqliのトランザクションと前処理文

3269 ワード

MySQLiにとって、トランザクションとプリプロセッシング文はもちろん、MySQL(元の)拡張資本を淘汰できる理由です.PDOのトランザクションとプリプロセッシング文に関する内容も学習しました.そこで、ここでは理論的なことをあまり話さず、MySQLiの2つの特性と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()メソッドでコミットされます.このテストコードでは、2番目の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
各メディアプラットフォームで検索可能【ハードコアプロジェクトマネージャ】