Maison  >  Article  >  base de données  >  Tutoriel sur l'utilisation des instructions préparées préparer, exécuter et désallouer dans MySQL

Tutoriel sur l'utilisation des instructions préparées préparer, exécuter et désallouer dans MySQL

黄舟
黄舟original
2017-08-23 13:45:021909parcourir

Cet article présente principalement le tutoriel d'utilisation des instructions préparées préparer, exécuter et désallouer dans MySQL. Les amis dans le besoin peuvent s'y référer

MySQL fait officiellement référence à préparer, exécuter et désallouer comme PREPARE STATEMENT.
J'ai l'habitude de l'appeler [déclaration prétraitée].

Son utilisation est très simple,


PREPARE stmt_name FROM preparable_stmt
EXECUTE stmt_name
  [USING @var_name [, @var_name] ...]  -
{DEALLOCATE | DROP} PREPARE stmt_name

Par exemple :


mysql> PREPARE pr1 FROM 'SELECT ?+?';
Query OK, 0 rows affected (0.01 sec)
Statement prepared
mysql> SET @a=1, @b=10 ;
Query OK, 0 rows affected (0.00 sec)
mysql> EXECUTE pr1 USING @a, @b;
+------+
| ?+? |
+------+
| 11  |
+------+
1 row in set (0.00 sec)

mysql> EXECUTE pr1 USING 1, 2;  -- 只能使用用户变量传递。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near '1, 2' at line 1
mysql> DEALLOCATE PREPARE pr1;
Query OK, 0 rows affected (0.00 sec)

L'utilisation de PAREPARE STATEMENT peut réduire l'analyse syntaxique à chaque fois que vous exécutez SQL
Par exemple, si vous l'utilisez pour exécuter SELECT et DELETE avec des conditions WHERE, ou UPDATE ou INSERT, il vous suffit de modifier. la valeur variable à chaque fois.
Cela peut également empêcher l'injection SQL. Les valeurs des paramètres peuvent contenir des caractères d'échappement et des délimiteurs.

Applicable aux applications ou aux scripts SQL.

Plus d'utilisations :

De même, PREPARE... FROM peut directement connecter des variables utilisateur :


mysql> CREATE TABLE a (a int);
Query OK, 0 rows affected (0.26 sec)
mysql> INSERT INTO a SELECT 1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> INSERT INTO a SELECT 2;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO a SELECT 3;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> SET @select_test = CONCAT('SELECT * FROM ', @table_name);
Query OK, 0 rows affected (0.00 sec)

mysql> SET @table_name = 'a';
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE pr2 FROM @select_test;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE pr2 ;
+------+
| a  |
+------+
| 1  |
| 2  |
| 3  |
+------+
3 rows in set (0.00 sec)

mysql> DROP PREPARE pr2;  -- 此处DROP可以替代DEALLOCATE
Query OK, 0 rows affected (0.00 sec)

Chaque fois EXECUTE est exécuté une fois, c'est une bonne habitude d'exécuter l'instruction DEALLOCATE PREPARE..., qui peut libérer toutes les ressources de la base de données (telles que les curseurs) utilisées dans l'exécution.

De plus, si une session contient trop d'instructions préparées, la limite supérieure de max_prepared_stmt_count peut être atteinte.

Les déclarations préparées ne peuvent être utilisées que dans la session du créateur et ne peuvent pas être utilisées dans d'autres sessions.

Et lorsque vous quittez la session de quelque manière que ce soit (normale ou anormale), les instructions préparées précédemment définies n'existeront plus.

Si elle est utilisée dans une procédure stockée, si elle n'est pas DEALLOCATEd dans la procédure, l'instruction préparée sera toujours valide après la fin de la procédure stockée.

Résumé

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!

Déclaration:
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