IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Foreach imbriqué aprés un select mysql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut Foreach imbriqué aprés un select mysql
    Bonjour à tous,

    voilà, j'ai écrit ce bout de code et j'aurais aimé savoir si c'est correct ou si y a moyen de l'optimiser svp !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
     $SELECsqL0 = "SELECT * FROM testA where ma_bd = 5";
     $SELECsqL1 = "SELECT * FROM testB where mb_jt = '$VAL_CO'";
     
    foreach ($CONNpdo1->query($SELECsqL0) as $row)
              {
    $incremrow = $row['user_jt'];			
    echo "
      <div class=\"niveau\" id=\"COGE0\">
    	<span class=\"plus\" id=\"COVDEPn".$incremrow."\" onClick=\"nivoplus('COVDEP','$incremrow');return(false)\">+</span>
    	<a href=\"\">$row[ma_lib]</a><br />
    	<ul class=\"niveau\" id=\"COVDEP".$incremrow."\">";
     foreach ($CONNpdo1->query($SELECsqL1) as $row)
        {
    	echo "<img src=\"pics/archi/h1.png\" width=\"14\" height=\"19\" align=\"middle\"/> $row[nom] $row[prenom]<br />";
        }
    echo "</ul></div>\n";
               }	
     
    $CONNpdo1 = null;
    merci à vous pour votre aide !!

    Inter-Rupteur

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Repeter X fois la même requête est evidemment mauvais.
    Si tu as besoin d'afficher X fois le résultat de $SELECsqL1, il faut executer une fois cette requete, construire et stocker ce que tu veux afficher et l'afficher ensuite X fois.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    tu ferais cela comment car je comprends le principe, mais pour le mettre en oeuvre, c'est une autre histoire...

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Comme ceci tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
     
     $SELECsqL0 = "SELECT * FROM testA where ma_bd = 5";
     $SELECsqL1 = "SELECT * FROM testB where mb_jt = '$VAL_CO'";
     $rows1 = $CONNpdo1->query($SELECsqL0);
     $rows2 = $CONNpdo1->query($SELECsqL1);
    foreach ($rows1 as $row1){
        $incremrow = $row['user_jt'];			
        echo "
            <div class=\"niveau\" id=\"COGE0\">
        	<span class=\"plus\" id=\"COVDEPn".$incremrow."\"     onClick=\"nivoplus('COVDEP','$incremrow');return(false)\">+</span>
    	<a href=\"\">$row1[ma_lib]</a><br />
    	<ul class=\"niveau\" id=\"COVDEP".$incremrow."\">";
        foreach ($rows2 as $row2){
            // etc
        }
    }
    De plus, les deux boucles ne devrait pas utiliser la même variable $row.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Merci ThomasR, j'étais pas trop loin !!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    j'ai un souci de nouveau... J'essaye de mettre en place une boucle imbriquée dans le 2eme Foreach, mais ca passe pas... J'ai testé avec un foreach, for et un while, le résultat est tjrs le même (voir ci-dessous : résultat normal) !!!

    Je remet le code avec le 2eme foreach :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $SELECsqL0 = "SELECT * FROM testA where ma_bd = 5";
    $SELECsqL1 = "SELECT * FROM testB where mb_jt = '$VAL_CO'";
     
     $rows1 = $CONNpdo1->query($SELECsqL0);
     $rows2 = $CONNpdo1->query($SELECsqL1);
     
    foreach ($rows1 as $row1){
        $incremrow = $row['user_jt'];			
        echo "
            <div class=\"niveau\" id=\"COGE0\">
        	<span class=\"plus\" id=\"COVDEPn".$incremrow."\"     onClick=\"nivoplus('COVDEP','$incremrow');return(false)\">+</span>
    	<a href=\"\">$row1[ma_lib]</a><br />
    	<ul class=\"niveau\" id=\"COVDEP".$incremrow."\">";
     
    foreach ($rows2 as $row2)
               {		
       echo "<img src=\"pics/archi/h1.png\" width=\"14\" height=\"19\" align=\"middle\"/>$row[nom] $row[prenom]<br />";
    	}				
     
     echo "</ul>";
             }
    voici le résultat normal :



    le probleme est que test1 doit récupérer que les AAAA-3 et test2 que les IIII-4, etc... J'ai testé avec un 3eme foreach imbriqué dans le 2eme foreach, et le résultat était le même... Idem pour un for et while !! Donc là je séche...

    voici 2 tables de ma base de données ou se trouve user_jt (la jointure entre les deux tables) que je n'arrive pas à utiliser afin de classer les datas en fonction de test1, test2, etc... :

    table testA


    table testB


    J'ai aussi un fichier var-test.php avec des valeurs déclarées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $test  = 2;
    $test1 = 3;
    $test2 = 4;
    etc...


    J'espère que j'ai été kler...

    Merci à vous
    Inter-Rupteur

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans un cas comme ça, je prefere une jointure a des requetes imbriqués :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    $SELECsqL0 = "SELECT * FROM testA 
    JOIN testB using (user_jt) 
    WHERE ma_bd = 5
    AND mb_jt = '$VAL_CO'
    ORDER BY mlt_id";
     
     $rows1 = $CONNpdo1->query($SELECsqL0);
     
    $current_mlt_id = 0;
    foreach ($rows1 as $row){
        $incremrow = $row['user_jt'];			
        if ($row['mlt_id'] != $current_mlt_id) {
           echo "
            <div class=\"niveau\" id=\"COGE0\">
        	<span class=\"plus\" id=\"COVDEPn".$incremrow."\"     onClick=\"nivoplus('COVDEP','$incremrow');return(false)\">+</span>
    	<a href=\"\">$row[ma_lib]</a><br />
    	<ul class=\"niveau\" id=\"COVDEP".$incremrow."\">";
     
            $current_mlt_id = $row['mlt_id'];
        }
     
       echo "<img src=\"pics/archi/h1.png\" width=\"14\" height=\"19\" align=\"middle\"/>$row[nom] $row[prenom]<br />";
     
     
     echo "</ul>";
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Bonjour Sabotage,

    et merci pour ta réponse !! J'avais pensé à une solution de ce type auparavant et je l'ai abondonné car le résultat était complétement différent. Je viens de tester la tienne, et on s'y rapproche un peu plus malgré encore un souci. Voilà le résultat :






    Une partie des datas se retrouvent en dehors...

    Merci à toi
    Inter-Rupteur

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut que tu places les elements HTML au bon endroit, j'ai juste repris ce que tu avais écris sans l'adapter.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    J'ai effectué les modifications aux HTML comme convenu !
    Par contre, il a fallu que je rajoute une condition dans le 1er If pour gérer les fins de </ul>, sinon j'avais un espace entre Test (parent) et les autres test1, etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (($row['user_jt']-1) == $ul_jt)
    	  {  
    	  }
    	  else
    	  {
    		echo "</ul>";
    	  }
    Donc là ca tourne !! J'en ai plusieurs comme ceux là à faire mais avec des arbos plus profondes !! J'espère que le modéle sera portable !!
    Je te tiendrai au courant !!

    Merci beaucoup Sabotage !

    Inter-rupteur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Oracle -> MySQL] requête UPDATE d'après un SELECT
    Par Paul TOTH dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/03/2010, 12h50
  2. [SGBD] Select MySQL
    Par Roromix dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/05/2006, 00h46
  3. Réponses: 2
    Dernier message: 28/11/2005, 10h12
  4. [Dates] foreach imbrique ?
    Par pascale86 dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2005, 12h04
  5. [JPox] NullPointerException aprés un SELECT
    Par MinsK dans le forum Persistance des données
    Réponses: 3
    Dernier message: 05/07/2005, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo