Maison > Article > développement back-end > Comment utiliser les transactions MySQLi et les instructions préparées en PHP
Pour MySQLi, les transactions et les instructions préparées sont bien entendu le capital qui lui permet d'éliminer les extensions MySQL. Nous avons également entendu parler des transactions et préparé des déclarations dans PDO auparavant. Ici, nous ne parlerons donc plus de théorie, et passerons directement au code pour voir la différence dans l'utilisation de ces deux fonctionnalités dans MySQLi et PDO.
Tout d'abord, nous devons toujours laisser MySQLi signaler également les exceptions pour les déclarations erronées. Cette fonction est très différente de PDO. Dans PDO, nous pouvons spécifier directement l'attribut de rapport d'erreurs de la connexion. Dans MySQLi, nous devons spécifier l'attribut error dans l'objet MySQLi_Driver pour lever une exception. Évidemment, MySQLi_Driver est l'objet pilote de MySQLi.
// 使用异常处理错误情况 $driver = new mysqli_driver(); $driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
Ceci spécifie que lors de l'utilisation de l'extension MySQLi, tous les messages d'erreur seront générés comme exceptions.
Le contenu suivant est en fait très similaire à 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" }
Nous utilisons également un start_transaction() pour démarrer la transaction. Validez ensuite la transaction via la méthode commit(). Dans ce code de test, la deuxième instruction SQL signalera une erreur, elle entre donc dans le catch et utilise rollback() pour annuler la transaction.
En général, il n'y a pas beaucoup de différence entre le traitement des transactions et le PDO, mais il existe quelques différences entre l'utilisation des relevés préparés et du PDO . La première est que les espaces réservés dans notre MySQLi ne sont que des espaces réservés en forme de point d'interrogation ? De plus, seul bind_param() n'est pas similaire à la méthode bindValue() dans 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" // }
Comme le montre le code, l'utilisation de la méthode bind_param() est également très différente de PDO. Il ne nécessite pas d'indice, mais reçoit un paramètre s. Ce paramètre indique le type de données liées, s est le type de chaîne. Nous en apprendrons davantage sur d’autres types lorsque nous étudierons le contenu lié à MySQLi_STMT.
En fait, au niveau du code, la plupart du contenu est très similaire à PDO, mais certains paramètres sont différents. Pour nous, il s'agit encore davantage d'apprendre et de comprendre, afin de ne pas se tromper lors de l'encapsulation ou de l'utilisation de certains frameworks qui utilisent MySQLi comme opération de base de données sous-jacente.
Code de test :
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/7.PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句.php
Apprentissage recommandé : Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!