Heim > Artikel > Backend-Entwicklung > So verwenden Sie MySQLi-Transaktionen und vorbereitete Anweisungen in PHP
Für MySQLi sind Transaktionen und vorbereitete Anweisungen natürlich das Kapital, das es ermöglicht, MySQL-Erweiterungen zu eliminieren. Wir haben auch schon früher etwas über Transaktionen und vorbereitete Kontoauszüge in PDO gelernt. Deshalb werden wir hier nicht mehr über die Theorie sprechen und direkt zum Code gehen, um den Unterschied in der Verwendung dieser beiden Funktionen in MySQLi und PDO zu sehen.
Zuallererst müssen wir MySQLi weiterhin erlauben, auch Ausnahmen für falsche Anweisungen zu melden. Diese Funktion unterscheidet sich stark von PDO. In PDO können wir das Fehlerberichtsattribut der Verbindung direkt angeben. In MySQLi müssen wir das Fehlerattribut im MySQLi_Driver-Objekt angeben, um eine Ausnahme auszulösen. Offensichtlich ist MySQLi_Driver das Treiberobjekt von MySQLi.
// 使用异常处理错误情况 $driver = new mysqli_driver(); $driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
Dies gibt an, dass bei Verwendung der MySQLi-Erweiterung alle Fehlermeldungen als Ausnahmen ausgegeben werden.
Der folgende Inhalt ist PDO tatsächlich sehr ähnlich.
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" }
Wir verwenden auch begin_transaction(), um die Transaktion zu starten. Anschließend wird die Transaktion über die Methode „comint()“ festgeschrieben. In diesem Testcode meldet die zweite SQL-Anweisung einen Fehler, gibt also den Catch ein und verwendet rollback(), um die Transaktion zurückzusetzen.
Im Allgemeinen gibt es keinen großen Unterschied zwischen Transaktionsverarbeitung und PDO, es gibt jedoch einige Unterschiede zwischen der Verwendung vorbereiteter Anweisungen und PDO. Der erste ist, dass die Platzhalter in unserem MySQLi nur Fragezeichen-Platzhalter sind. Darüber hinaus ähnelt nur bind_param() nicht der bindValue()-Methode in PDO.
$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" // }
Wie aus dem Code ersichtlich ist, unterscheidet sich auch die Verwendung der Methode bind_param() stark von der von PDO. Es erfordert keinen Index, sondern erhält einen s-Parameter. Dieser Parameter gibt den Typ der gebundenen Daten an, s ist der String-Typ. Wir werden mehr über andere Typen erfahren, wenn wir MySQLi_STMT-bezogene Inhalte untersuchen.
Tatsächlich sind die meisten Inhalte auf Codeebene PDO sehr ähnlich, einige Parameter unterscheiden sich jedoch. Für uns geht es noch mehr ums Lernen und Verstehen, um nicht verwirrt zu werden, wenn wir einige Frameworks kapseln oder verwenden, die MySQLi als zugrunde liegende Datenbankoperation verwenden.
Testcode:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/7.PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句.php
Empfohlenes Lernen: php-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSo verwenden Sie MySQLi-Transaktionen und vorbereitete Anweisungen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!