2009-04-21 5 views
0

Vu le code suivant:AOP PHP Méthode Prepare tombe en panne alors dans une boucle

// Connect to MySQL up here 

$example_query = $database->prepare('SELECT * FROM table2'); 
if ($example_query === false) die('prepare failed'); 

$query = $database->prepare('SELECT * FROM table1'); 
$query->execute(); 
while ($results = $query->fetch()) 
{ 
    $example_query = $database->prepare('SELECT * FROM table2'); 
    if ($example_query === false) die('prepare failed'); //it will die here 
} 

je tente évidemment de préparer des déclarations à SELET tout de table2 deux fois. Le second (celui de la boucle WHILE) échoue toujours et provoque une erreur.

Ceci est seulement sur mon serveur de production, en développement local, je n'ai pas de problèmes donc il doit y avoir une sorte de paramètre quelque part. Ma pensée immédiate est que MySQL a une sorte de paramètre max_connections qui est mis à 1 et une connexion est maintenue ouverte jusqu'à ce que la boucle WHILE est terminée alors quand j'essaie de préparer une nouvelle requête, il est dit "Nope trop déjà connecté "et chie.

Des idées? Oui je sais qu'il n'y a pas besoin de le faire deux fois, dans mon code actuel, il est seulement préparé dans la boucle WHILE, mais comme je l'ai dit qui échoue sur mon serveur de production, après quelques tests, j'ai découvert qu'un une requête SELECT * simple échoue dans la boucle WHILE mais pas en dehors de celle-ci. L'exemple de code que j'ai donné est évidemment très édulcoré pour illustrer le problème.

+1

Je ne comprends pas ce que vous dites. Si vous utilisez prepare() dans la boucle, vous vous trompez. Préparez-vous en dehors de la boucle, exécutez l'intérieur. –

Répondre

0

Il ne devrait pas être nécessaire de préparer $ exemple_query plus d'une fois. Il suffit d'exécuter la requête dans votre boucle. Si vous devez préparer une nouvelle requête dans chaque itération de boucle, un exemple explicite $ example_query-> closeCursor() à la fin de la boucle doit libérer toutes les ressources associées à l'objet instruction.

+0

Désolé, je suppose que je n'étais pas plus clair. Je suis en train de faire ça mais ça échoue sur mon serveur prod. Après un test, j'ai remarqué qu'il échoue à cause de l'endroit où il se trouve. –

0

Le problème était que je ne pouvais pas faire quelque chose pendant une requête unbuffered était en cours d'exécution (ce qui était dans la boucle while)

solution a été d'ajouter la ligne suivante pour assurer des requêtes mises en mémoire tampon ont été utilisées:

$database->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); 
Questions connexes