Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que j'obtiens l'erreur MySQL 2014 : \'Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives\' ?

Pourquoi est-ce que j'obtiens l'erreur MySQL 2014 : \'Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives\' ?

DDD
DDDoriginal
2024-11-21 07:10:13171parcourir

Why Am I Getting MySQL Error 2014:

Causes de l'erreur MySQL 2014 : impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives

L'erreur MySQL 2014 se produit lorsque vous essayez d'exécuter une requête alors qu'une autre requête sans tampon est toujours actif. Cela peut se produire lors de l'utilisation d'instructions préparées avec PDO::ATTR_EMULATE_PREPARES défini sur false.

Explication

Lorsque PDO::ATTR_EMULATE_PREPARES est vrai, PDO émulera les instructions préparées en les convertissant en requêtes SQL normales. Cela signifie que le serveur exécutera la requête une fois pour chaque ligne de données, permettant aux requêtes sans tampon d'être exécutées simultanément.

Cependant, lorsque PDO::ATTR_EMULATE_PREPARES est faux, PDO enverra l'instruction préparée au serveur. et maintenez le curseur ouvert. Cela empêche l'exécution d'autres requêtes jusqu'à la fermeture du curseur.

Solutions

Il existe plusieurs solutions à cette erreur :

  • Activer les requêtes mises en mémoire tampon : Vous pouvez utiliser l'attribut PDO::MYSQL_ATTR_USE_BUFFERED_QUERY pour activer les requêtes mises en mémoire tampon. Cela amènera PDO à récupérer tous les résultats d'une requête en mémoire avant d'exécuter les requêtes suivantes.
  • **Utilisez fetchAll() : l'appel de fetchAll() sur une instruction préparée fermera le curseur et permettra d'exécuter d'autres requêtes. .
  • Fermez le curseur : Vous pouvez fermer explicitement le curseur sur une instruction préparée à l'aide de la méthode closeCursor().

Considérations supplémentaires

Dans l'extrait de code fourni, il existe un problème où la requête $stmt2 est exécutée plusieurs fois dans la boucle. Ceci est inutile et peut être déplacé en dehors de la boucle pour améliorer les performances.

Il est également recommandé d'utiliser des paramètres nommés (PDO::bindParam()) au lieu de paramètres de position (PDO::execute() avec un tableau) pour les déclarations préparées. Cela rend le code plus lisible et réduit le risque d'injection SQL.

Conclusion

L'erreur MySQL 2014 peut être causée par une mauvaise gestion des requêtes sans tampon. En utilisant des requêtes mises en mémoire tampon, en appelant fetchAll() ou en fermant le curseur, cette erreur peut être évitée.

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