[RESOLU]PHP et MySQL problème avec des boucles!!

PHP et MySQL problème avec des boucles!! [RESOLU] - PHP - Programmation

Marsh Posté le 22-02-2007 à 10:48:51    

Bon j'estime que passer plus d'1 jour à bloquer sur un truc si bête c'est trop...
Voilà donc mon problème:
Je récupère des données d'un formulaire sous cette forme: "fred FR; andrea DE; sabine IT;...." donc g des noms et leur langue. Mon but est de dissocier les 2 car je dois aller chercher ds ma bd les login correspondants aux noms.
J'utilise donc 2 fois la fonctin explode, une fois pour les ";" et une fois pour les " ".
Je vous montre mon code et je vous mets quelques commentaires et les traces des echo:
 

Code :
  1. /* par exemple: $translator_list=fred FR; andrea DE; sabine IT; */
  2.             $liste = explode(";",$translator_list);
  3.             $nb_elt= sizeof($liste);
  4.             for ($i = 0; $i < $nb_elt; $i++){
  5.               $liste2 = explode("  ",$liste[$i]);
  6.               $nb_elt2= sizeof($liste2);     
  7. /*$liste[$i]=fred FR andrea DE sabine IT*/
  8.                
  9.                for ($j = 0; $j < $nb_elt2; $j++){                 
  10.                   if ($liste2[$j]!="" ){
  11.                     echo " we search $liste2[$j] ";
  12.                     $sql4=mysql_query("select user_login from Users where user_name='$liste2[$j]'" );                             
  13.                     while($sql4 and $data = mysql_fetch_array($sql4)){
  14.                        $userlogin=$data["user_login"];
  15.                        echo " login $userlogin";
  16.                     }
  17.                   }
  18.                 }
  19.             }


Voici ce que ça me retourne:  
we search fred login t_fred we search FR we search andrea we search DE we search sabine we search IT
En fait il ne cherche que la première valeur ds la bd alors que la valeur $liste2[$j] est bien correcte!
Je voudrais que ça retourne:
we search fred login t_fred we search FR we search andrea login t_andrea we search DE we search sabine login t_sabine we search IT
Si vous pensez connaître la solution à mon problème sahez que ça peut changer ma journée!!
Merci d'avance


Message édité par acorsa le 22-02-2007 à 16:13:33
Reply

Marsh Posté le 22-02-2007 à 10:48:51   

Reply

Marsh Posté le 22-02-2007 à 11:28:42    

ba déjà tu cherche tous les éléments de ta liste, chose que tu ne devrais pas faire.
 
Ensuite, quand tu explode la première fois il dois te créer une liste tel que :
 
liste[1]=fred FR
liste[2] =[espace] andrea DE....
 
lorsque tu explode la seconde fois, tu devrais claquer tout ça dans un tableau
$liste2[$i][]= explode("  ",$liste[$i]);
 
et une fois que tu as ce tableau, faire ta boucle pour lancer tes requêtes, mais uniquement avec la première colonne de liste2.
 

Reply

Marsh Posté le 22-02-2007 à 11:39:55    

Merci mais je ne peux pas faire de tableau à 2 dimension avec le explode....

Reply

Marsh Posté le 22-02-2007 à 11:46:15    

Avec explode tu fais un tableau à 1 dimlension certe, mais que tu stocke dans un tableau à 1 dimension... donc tu obtien un tableau à 2 dimensions. ;)

Reply

Marsh Posté le 22-02-2007 à 11:54:00    

Au risque de passer pour une boulette...tu peux m'écrire la ligne de code s'il te plaît? Parce-que j'y arrive pas...

Reply

Marsh Posté le 22-02-2007 à 12:24:33    

Code :
  1. $liste = explode(";",$translator_list);
  2. $i=0;
  3. foreach ($liste as $element){
  4.    $liste2[$i]= explode("  ",$element);
  5. }


 
normalement ça le fait... mais bon j'ais toujours des surprises avec les tableaux... :D
 
Si ça passe pas essaye ça :
 

Code :
  1. $liste = explode(";",$translator_list);
  2. $i=0;
  3. foreach ($liste as $element){
  4.    $liste2[$i][]= explode("  ",$element);
  5. }

Reply

Marsh Posté le 22-02-2007 à 12:33:22    

Merci beaucoup!!Je récupère uniquement les noms....ms le problème est toujours là...La requête ne marche pas!;-(
Je te remets mon code:

Code :
  1. $liste = explode(";",$translator_list);
  2.             $nb_elt= sizeof($liste);
  3.             $i=0;
  4.             foreach ($liste as $element){
  5.               $liste2[$i]= explode("  ",$element);
  6.               echo $liste2[$i][$i];               
  7. /*là ça m'affiche les noms nickel...*/
  8.               $sql4=mysql_query("select user_login from Users where user_name='$liste2[$i][$i]'" ); 
  9. /*ms la requête ne marche pas avec $liste2[$i][$i] en paramètre...*/                           
  10.                     while($sql4 and $data = mysql_fetch_array($sql4)){
  11.                        $userlogin=$data["user_login"];
  12.                        echo " login $userlogin";
  13.                     }
  14.              }


ça rentre jamais ds le while!!


Message édité par acorsa le 22-02-2007 à 12:35:29
Reply

Marsh Posté le 22-02-2007 à 13:26:27    

j'avais oublié un point fondamental ... l'incrémentation de la variable $i... (tête en l'air.. oui un peu :D)

Code :
  1. $liste = explode(";",$translator_list);
  2.       $i=0;
  3.       foreach ($liste as $element){
  4.         $liste2[$i]= explode("  ",$element);
  5.         $i++;
  6.       }
  7.       foreach ($liste2 as $element2) {
  8.         $sql4=mysql_query("select user_login from Users where user_name='".$element2[0]."'" );
  9.         while($sql4 and $data = mysql_fetch_array($sql4)){
  10.                       $userlogin=$data["user_login"];
  11.                       echo " login $userlogin";
  12.          }
  13.       }
 

concaténation de chaine da caractére...... notion à revoir ;)

 

EDIT : alors vi, j'ais séparé les deux boucles foreach.. tu peux trés bien les laisser ensemble, mais disons que vu qu'elles font deux choses différentes, ce sera plus facile par la suite à séparer en fonctions.


Message édité par chani_t le 22-02-2007 à 13:28:32
Reply

Marsh Posté le 22-02-2007 à 14:53:04    

Hélas...ça ne marche toujours pas....
Si j'affiche la valeur de $element2[0], c'est bein es bonnes valeurs ms  ds la requête seule la première marche.
Comme au tout début...

Reply

Marsh Posté le 22-02-2007 à 15:15:19    

et si tu affiche tes requêtes avant de les envoyer ?

 
Code :
  1. $req="select user_login from Users where user_name='".$element2[0]."'";
  2. echo $req."<br/>";
  3. $sql4=mysql_query($req) or die ("Exécution de requête de login impossible : ".$req);
 

tu pourrais afficher ce que ça donne ?

Code :
  1. while($data = mysql_fetch_array($sql4)){
  2.                      $userlogin=$data["user_login"];
  3.                      echo " login $userlogin";
  4.         }
 

EDIt : yavais une erreur dans ton while


Message édité par chani_t le 22-02-2007 à 15:20:05
Reply

Marsh Posté le 22-02-2007 à 15:15:19   

Reply

Marsh Posté le 22-02-2007 à 15:34:16    

y'avait pas d'erreur ds mon while! C'était quoi l'erreur?
Bon alors un truc de fou.....Gra^ce à ton test g pu m'apercevoir que ce qui me fait ch$$$ depuis 2 jours....c'est: un espace avant le nom!!!!
$element2[0] me retourne " renaud" par exemple!!
C'est fou ça hein??

Reply

Marsh Posté le 22-02-2007 à 15:46:10    

ba.... le while($sql4 AND $data etc...) le $sql4 te sert à quoi ... (j'avoue n'avoir j'amais vu).
 
Quand à l'espace.. je l'avais mentionné quelque post au dessus... :D

Reply

Marsh Posté le 22-02-2007 à 15:56:52    

c vrai????Non non je n'ai pas soupçonné ça..en tout cas je te remercie!!!
Je commençais à désepérer...
Bonne journée et à bientôt peut-être!;-)

Reply

Marsh Posté le 22-02-2007 à 16:00:09    

;)... en tournant autour du probléme... ou y arrive quand même :D bonne continuation

Reply

Marsh Posté le 22-02-2007 à 16:13:15    

ouai ms faut tourner longtemps..et toute seule je m'essouffle !!Merci

Reply

Marsh Posté le 22-02-2007 à 16:30:00    

chani_t a écrit :

ba.... le while($sql4 AND $data etc...) le $sql4 te sert à quoi ... (j'avoue n'avoir j'amais vu).

Ca permet de tester implicitement (php style) si $sql4 est une ressource non nulle, vu qu'elle est utilisée juste après dans le fetch() [:aloy]
 
On peut faire plus parlant :

Code :
  1. if (is_resource($sql4))
  2.    while ($data = mysql_fetch_...())
  3.    {
  4.       //...
  5.    }

mais j'ai jamais bien compris l'utilité de faire ce genre de tests en php [:airforceone]

Reply

Marsh Posté le 22-02-2007 à 16:54:24    

si $sql4 n'est pas une ressource ( erreur SQL , perte de connexion a la bdd , ... )  et que ton serveur est configurer pour t'afficher les warning, tu as nue belle ligne t indiquant que sql4 n'est pas une ressources

Reply

Marsh Posté le 22-02-2007 à 16:56:34    

mouais... ok, bon je pense pas que je le ferai de manière implicite, je préfere le faire explicitement ... m'enfin c'est bon à savoir.

Reply

Marsh Posté le 22-02-2007 à 17:23:59    

Et côté vitesse d'exécution, le test implicite comme ça, direct dans la boucle, s'effectue à chaque itération du while(), bouffant ainsi une quantité inconsidérée de temps CPU :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed