mysqli::multi_query boucle do...while infinie

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : mysqli::multi_query boucle do...while infinie

Re: mysqli::multi_query boucle do...while infinie

par Ryle » 18 nov. 2016, 12:30

Bonjour,

Le problème est en fait le même que lorsque l'on utilise une variable sans en vérifier l'existence au préalable.
Le next_result permet de passer au resultset suivant. Sans lui, tu boucles toujours sur la même ligne de résultat.
Le more_results permet de vérifier s'il existe bien un resultset suivant sur lequel passer.

La solution de ynx est effectivement la meilleure et pour la doc officielle, je ne suis pas sur qu'ils utilisent le paramètre strict pour leurs exemples. Les commentaires apportent souvent des informations complémentaires indispensables :)

Re: mysqli::multi_query boucle do...while infinie

par ynx » 18 nov. 2016, 11:58

Effectivement cette erreur semble connue et pas très récente (depuis PHP 5.3 apparemment), étonnant que la doc n'en parle quasiment pas (à part dans les commentaires) : http://php.net/manual/fr/mysqli.multi-query.php#100018

La correction proposée est d'appeler la fonction more_results() et next_result() dans le condition do while :
while ($mysqli->more_results() && $mysqli->next_result());

Re: mysqli::multi_query boucle do...while infinie

par carte-sd » 18 nov. 2016, 10:55

@ynx
En fait c'est justement PHP qui m'a déclenché une erreur stricte à cause de l'exemple de la doc officielle - je suis sous PHP 7.0.8 - :

Strict standards: mysqli::next_result() [mysqli.next-result.html: There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method in E:\users\...

Erreur tout à fait logique quand on y pense... On dirait que c'est un bug - je n'utilise pas le strict type -.

Re: mysqli::multi_query boucle do...while infinie

par ynx » 18 nov. 2016, 10:14

Salut,

Il semble que tu dois appeler la fonction mysqli->next_result() pour préparer le prochain résultat de requête sans boucler sur le même résultat.
Le premier exemple de la doc de la fonction multi_query() montre la solution à ton problème en appelant la fonction mysqli->next_result() dans la condition de la boucle do while : http://php.net/manual/fr/mysqli.multi-q ... ample-1910

Bonne journée,

mysqli::multi_query boucle do...while infinie

par carte-sd » 17 nov. 2016, 19:36

Bonsoir à tous,
J'aimerais comprendre pourquoi ce code produit une boucle infinie:

Code : Tout sélectionner

<?php $mysqli = new mysqli('localhost','user','pwd','test'); $query = "SELECT CURRENT_USER();"; $query.= "SELECT DATE_FORMAT(NOW(),'%d %m %Y');"; if($mysqli->multi_query($query)): do{ if($result = $mysqli->store_result()): while($row = $result->fetch_array()): printf('%s<br />',$row[0]); endwhile; $result->free(); endif; if($mysqli->more_results()): print '------------------<br />'; endif; }while(true === $mysqli->more_results()); endif; $mysqli->close();
Je n'arrive pas à comprendre :oops: