Prenez une minute pour comprendre les déclarations et transactions préparées en PHP

醉折花枝作酒筹
Libérer: 2023-03-10 16:24:02
avant
2320 Les gens l'ont consulté

Cet article vous présentera les relevés et transactions préparés en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Prenez une minute pour comprendre les déclarations et transactions préparées en PHP

Apprentissage des opérations PDO en PHP (2) Prétraitement des instructions et des transactions

Dans l'article d'aujourd'hui, faisons un simple Apprenez l'utilisation des instructions et des transactions préparées dans PDO. Ce sont toutes des opérations sous l'objet PDO, et elles ne sont pas compliquées. Des applications simples peuvent être facilement mises en œuvre. Mais dans la plupart des cas, tout le monde utilise des cadres et il existe très peu de possibilités d’écriture manuscrite.

Fonction d'instruction préparée

Une instruction préparée consiste à préparer une instruction à exécuter, puis à renvoyer un objet PDOStatement. Généralement, nous utiliserons la méthode execute() de l'objet PDOStatement pour exécuter cette instruction. Pourquoi parle-t-on de prétraitement ? Parce que cela nous permet d'appeler cette instruction plusieurs fois et de remplacer les conditions de champ de l'instruction par des espaces réservés. Comparé à query() ou exec() utilisant directement des objets PDO, le prétraitement est plus efficace et permet au client/serveur de mettre en cache les requêtes et les méta-informations. Bien sûr, le point le plus important est que l'application d'espaces réservés peut empêcher efficacement les attaques par injection SQL de base. Nous n'avons pas besoin d'ajouter manuellement des guillemets aux instructions SQL et de laisser directement le prétraitement résoudre ce problème. Je pense que tout le monde peut l'apprendre. est également l’une des questions les plus fréquemment posées lors des entretiens. Le premier paramètre de la méthode

// 使用 :name 形式创建一个只进游标的 PDOStatement 对象
$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

var_dump($stmt);
// object(PDOStatement)#2 (1) {
//     ["queryString"]=>
//     string(57) "select * from zyblog_test_user where username = :username"
//   }

$stmt->execute([':username' => 'aaa']);
$aUser = $stmt->fetchAll();

$stmt->execute([':username' => 'bbb']);
$bUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……

var_dump($bUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "2"
//       [0]=>
//       string(1) "2"
//       ["username"]=>
//       string(3) "bbb"
//       ……
Copier après la connexion

prepare() est l'instruction SQL que nous devons exécuter. Dans ce code, nous utilisons un espace réservé sous la forme de :xxx, donc la méthode prepare() renvoie Nous devons. spécifiez la valeur d'espace réservé lors de l'exécution de la méthodeexecute() de l'objet PDOStatement. Dans le code, nous utilisons cette instruction SQL pour implémenter deux requêtes en remplaçant différents contenus d'espace réservé. Le deuxième paramètre de la méthode

prepare() est la propriété définie pour l'objet PDOStatement renvoyé. L'usage courant est le suivant : définir PDO::ATTR_CURSOR sur PDO::CURSOR_SCROLL obtiendra un curseur déroulant.

Certains pilotes ont des options au niveau du pilote, qui sont définies lors de la préparation. PDO::ATTR_CURSOR est le type qui définit le curseur de la base de données, et PDO::CURSOR_FWDONLY signifie créer un objet PDOStatement qui fait uniquement avancer le curseur. Il s'agit de l'option de curseur par défaut car ce curseur est le mode d'accès aux données le plus rapide et le plus courant en PHP. Pour en savoir plus sur les curseurs de base de données, vous pouvez vérifier vous-même le contenu pertinent.

De plus, PDOStatement peut également lier des données d'espace réservé via la méthode bindParam(). Nous continuerons à apprendre dans les articles suivants concernant les objets PDOStatement.

Ensuite, examinons l'utilisation de l'espace réservé ? pour implémenter la requête. L'espace réservé ? est lié sous la forme d'un indice lors de la liaison.

// 使用 ? 形式创建一个只进游标的 PDOStatement 对象
$stmt = $pdo->prepare("select * from zyblog_test_user where username = ?", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$stmt->execute(['aaa']);
$aUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……
Copier après la connexion

Bien sûr, ce type d'instruction précompilée ne se limite pas aux instructions de requête. Elle peut être ajoutée, supprimée ou modifiée, et prend également en charge les espaces réservés. Déclarations préparées pour manipuler des bases de données en PHP Cet article contient des exemples détaillés.

Capacités de transaction

Tout le monde doit avoir une certaine compréhension des transactions, je n'introduireai donc pas de concepts spécifiques ici. Regardons simplement les transactions dans PDO. atteint. Voyons d’abord ce qui se passe lorsqu’il n’y a aucune transaction.

$pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)"); // 成功插入

$pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 报错停止整个PHP脚本执行
// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist
Copier après la connexion

Supposons que ces deux tables doivent être mises à jour en même temps, mais que la deuxième instruction signale une erreur. En l’absence de transaction, notre première donnée sera insérée normalement avec succès, ce qui n’est pas le résultat dont nous avons besoin. À l'heure actuelle, nous avons besoin de l'aide des capacités de transaction, afin de pouvoir faire réussir ou échouer les deux tables en même temps.

try {
    // 开始事务
    $pdo->beginTransaction();

    $pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)");
    $pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 不存在的表

    // 提交事务
    $pdo->commit();
} catch (Exception $e) {
    // 回滚事务
    $pdo->rollBack();
    // 输出报错信息
    echo "Failed: " . $e->getMessage(), PHP_EOL;
    // Failed: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist
}
Copier après la connexion

La première est la méthode beginTransaction(), qui est utilisée pour désactiver la soumission automatique de la base de données et démarrer une transaction. Après cette méthode, elle ne sera fermée qu'après avoir rencontré commit() ou rollBack(. ) méthode.

La méthode commit() consiste à empaqueter et à soumettre toutes les opérations de données après beginTransaction() s'il n'y a pas d'accident pendant l'opération.

rollBack() consiste à restaurer les données Lorsqu'il y a un problème avec une instruction ou un code aprèsbeginTransaction(), l'opération de données précédente est annulée pour garantir que toutes les instructions aprèsbeginTransaction() réussissent ou. pas.

Trois fonctions simples comme celle-ci complètent pour nous toute l'opération de transaction. Nous discuterons de l'étude approfondie des transactions à l'avenir lorsque nous étudierons MySQL en profondeur. Ce que nous devons noter ici, c'est qu'il est préférable que l'objet PDO spécifie le mode d'erreur en lançant une exception. Si le mode d'erreur n'est pas spécifié, les erreurs dans la transaction ne seront pas signalées directement, mais renverront un code d'erreur. Nous devons utiliser le code d'erreur pour déterminer s'il faut valider ou annuler. C'est beaucoup moins concis et intuitif que le mécanisme d'exception.

总结

我们简单的梳理并学习了一下 PDO 中的预处理和事务相关的知识,接下来就要进入 PDOStatement 对象相关内容的学习。PDOStatement 对象就是 PDO 的预处理对象,也就是在日常开发中我们会接触到的最多的数据操作对象。这块可是重点内容,大家可不能松懈了哦!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84PDO%E6%93%8D%E4%BD%9C%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%8C%EF%BC%89%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5%E5%8F%8A%E4%BA%8B%E5%8A%A1.php
Copier après la connexion

推荐学习: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