Maison > développement back-end > Problème PHP > Comment utiliser les transactions MySQLi et les instructions préparées en PHP

Comment utiliser les transactions MySQLi et les instructions préparées en PHP

醉折花枝作酒筹
Libérer: 2023-03-10 21:50:01
avant
1821 Les gens l'ont consulté

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.

Comment utiliser les transactions MySQLi et les instructions préparées en PHP

Traitement des transactions

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;
Copier après la connexion

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"
}
Copier après la connexion

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.

Relevés préparés

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"
//   }
Copier après la connexion

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.

Résumé

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
Copier après la connexion

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!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal