2010-02-19 6 views
2

Quelles sont exactement les règles pour configurer plusieurs instructions préparées simultanément (avec une seule connexion DB)? J'ai souvent des boucles qui incluent plusieurs requêtes; ce serait bien de mettre en place 3 déclarations préparées, de les parcourir, puis de les fermer toutes.Instructions multiples préparées MySQL avec la même connexion

Ce que j'ai trouvé, c'est que parfois, ils travaillent ensemble, parfois non. Par exemple, j'ai été capable de configurer 3 instructions SELECT simultanées. Mais je pense qu'avoir un SELECT préparé et un INSERT sur la même table, courant dans une boucle, me déconnecte de la base de données (ou au moins cela ne fonctionne pas comme il se doit). Cependant, lorsque je change les instructions préparées en requêtes régulières, je peux exécuter les mêmes requêtes dans le même ordre, très bien. Je suis à peu près un novice et j'apprécierais quelques éclaircissements sur la façon dont cela fonctionne!

+0

s'il vous plaît poster votre code. –

+0

Je travaillais sur la simplification de mon code pour poster ici, et je pense que j'ai résolu mon problème immédiat: si j'utilise mysqli_stmt_free_result() après la requête SELECT, cela semble faire l'affaire. Il n'y a donc rien de fondamentalement erroné à propos de l'ouverture de plusieurs déclarations préparées, en les bouclant, et en les fermant toutes plus tard? – user276598

Répondre

1

Vous semblez avoir un bon candidat pour une procédure stockée. Lorsque vous devez insérer des données dans une table en fonction des résultats d'une autre requête de sélection, vous pouvez généralement le faire dans une procédure stockée légèrement plus rapidement qu'avec un code de langage de programmation.

En ce qui concerne les raisons pour lesquelles votre système actuel ne fonctionne pas; Je pense que vous voyez probablement les 'Commandes désynchronisées'; vous ne pouvez pas exécuter cette commande maintenant dans votre code client, vous appelez les fonctions client dans le mauvais ordre '

Cela se produit avec les instructions préparées car elles retournent deux ensembles de résultats. Ainsi, lorsque vous récupérez une ligne de votre requête select et que vous essayez ensuite de faire une insertion, un autre ensemble de résultats est en attente dans le canal. Vous devez récupérer ce second résultat avant de faire votre insertion. Donc, pour résumer, vous devriez probablement utiliser une requête normale ou utiliser une procédure stockée.

+0

merci, cela clarifie les choses. Je vais aller en apprendre davantage sur les procédures stockées maintenant. – user276598

+0

tout le meilleur. En note de bas de page Il pourrait en effet être possible (en fonction de vos données) de réécrire votre SQL pour utiliser la syntaxe INSERT SELECT (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html) et de le faire dans une requête. – e4c5

Questions connexes