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 :

Problème sur boucle WHILE


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut Problème sur boucle WHILE
    Bonjour,

    J'ai un problème avec mes boucles while.
    Dans ma base, un enregistrement comporte notamment l'id, le num_indiv, le num_pere, .....
    On retrouve automatiquement tous les num_pere en num_indiv.
    En partant d'un enregistrement, je veux afficher tous ceux qui y sont liés en comparrant le num_indiv et le num_pere.
    Donc j'affiche mon premier enregistrement. Je regarde son num_pere et je cherche le num_indiv équivalent pour l'afficher ou les afficher ....... etc .................
    En fait, c'est un arbre généalogique descendant.
    Je suis arrivé au point où je boucle sur la troisième "boucle". Et je ne sais pas comment continuer ....
    Je vous ai épuré mon script des TR, TD, .............
    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
    $select1 = 'SELECT * FROM individus WHERE id LIKE "168"'; 
    $result1 = mysql_query($select1,$link) or die ('Erreur : '.mysql_error() );
    $row1 = mysql_fetch_array($result1);
     
    echo ''.$row1['nom'].' '.$row1['prenom'].'<br>';
     
    $select = 'SELECT * FROM individus'; 
    $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
     
    while ($row = mysql_fetch_array($result)) 
    {	
    	$select2 = 'SELECT * FROM individus WHERE num_pere LIKE "'.$row1['num_indiv'].'"'; 
    	$result2 = mysql_query($select2,$link) or die ('Erreur : '.mysql_error() );
    	$row2 = mysql_fetch_array($result2);
     
    		echo ''.$row2['nom'].' '.$row2['prenom'].'';
     
    		$select3 = 'SELECT * FROM individus WHERE num_pere LIKE "'.$row2['num_indiv'].'"'; 
    		$result3 = mysql_query($select3,$link) or die ('Erreur : '.mysql_error() );
    		while ($row3 = mysql_fetch_array($result3)) 
    		{	
    			if ($row3['num_pere'] = $row2['num_indiv'])
    			{
    				echo ''.$row3['nom'].' '.$row3['prenom'].'';		
    			}	
    		}
    }

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par t671 Voir le message
    Je suis arrivé au point où je boucle sur la troisième "boucle". Et je ne sais pas comment continuer ....
    Je dirais comme pour la deuxième et à la quatrième je te répondrai comme à la troisième. Il suffit de loger ton code dans une fonction et faire en sorte qu'elle s'appelle elle-même autant de fois que nécessaire :
    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
    $root_id = 168;
    $sql     = "SELECT * FROM individus WHERE id = {$root_id}";
    $exec    = mysql_query($sql);
     
    if ($exec === false) {
        die('Erreur : '.mysql_error());
    }
     
    $data = mysql_fetch_assoc($exec);
     
    $tree_builder =
        function($pere_id) use (&$tree_builder)   // closure récursif
        {
            $sql  = "SELECT * FROM individus WHERE num_pere = {$pere_id}";
            $exec = mysql_query($sql);
            if ($exec === false) {
                die('Erreur : '.mysql_error());
            }
            while($data = mysql_fecth_assoc($exec)) {
                echo $data['nom'], ' ', $data['prenom'];
                $tree_builder($data['num_indiv']);
            }
        };
     
    echo $data['nom'], ' ', $data['prenom'], '<br /';
    $tree_builder($data['num_indiv']);
    Il faut juste faire attention avec la récursion c'est au niveau de la consommation mémoire et des performances. A partir d'un certain nombre d'appels récursifs, ça consomme beaucoup et ça se dégrade fortement.

    Si tu dois utiliser des arbres de profondeur infinie, il vaudrait peut-être mieux que tu regardes pour transformer la récursion en itération ou du côté de l'arbre intervallaire

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Oupsssss !!! Je pensais que cela aurait été plus simple ....... Et merci pour ton aide !
    Dans ta réponse, je suppose que $pere_id équivaut à $num_pere ?
    Et à l'éxécution, j'ai le message : Parse error: syntax error, unexpected T_FUNCTION pour la ligne function($pere_id) use (&$tree_builder) // closure récursif.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Quelle version de PHP utilises-tu ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Quelle version de PHP utilises-tu ?
    PHP Version 5.2.6

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    les closures ne sont utilisables qu'à partir de la 5.3.0
    Il faut reprendre légèrement le code pour transformer le closure en simple fonction

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    les closures ne sont utilisables qu'à partir de la 5.3.0
    Il faut reprendre légèrement le code pour transformer le closure en simple fonction
    Et tu fais ça comment ?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    comme ça :
    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
    function descendants($pere_id)
    {
        $sql  = "SELECT * FROM individus WHERE num_pere = {$pere_id}";
        $exec = mysql_query($sql);
        if ($exec === false) {
            die('Erreur : '.mysql_error());
        }
        while($data = mysql_fecth_assoc($exec)) {
            echo $data['nom'], ' ', $data['prenom'];
            descendants($data['num_indiv']);
        }
    };
     
    echo $data['nom'], ' ', $data['prenom'], '<br /';
    descendants($data['num_indiv']);

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    J'ai Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1, qui correspond au SELECT ??? Je ne comprends pas, car les " sont correctes !?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    c'est bien des entiers tes id et num_pere également ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    c'est bien des entiers tes id et num_pere également ?
    Oui, tout à fait.
    Mais je ne travaille qu'avec les num_pere que je lis et je vais chercher l'équivalent en num_indiv (et non id).

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    je pense que le problème vient du fait que $data['num_indiv'] n'est pas toujours renseigné, je me trompe ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    je pense que le problème vient du fait que $data['num_indiv'] n'est pas toujours renseigné, je me trompe ?
    Les num_indiv sont toujours renseignés. Pour chaque individu, j'ai un num_indiv, et un seul.
    Par contre, des num_pere peuvent être vide ..... (je n'ai pas trouvé le père).

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Poses des echo au niveau des $sql pour tracer les chaines envoyés à mysql.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Poses des echo au niveau des $sql pour tracer les chaines envoyés à mysql.
    J'ai remplacé $pere_id par num_pere, puis num_indiv.
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql  = "SELECT * FROM individus WHERE num_pere = {$num_indiv}";    
        $exec = mysql_query($sql);
        echo $sql;
    ne me retourne aucun résultat (vide) !!!???

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Pourquoi entourer $num_indiv avec des accolades ?

    Et pour débugguer, il faut mettre le echo avant le mysql_query.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Voilà où j'en suis :

    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
    $root_id = 168;
    $sql     = "SELECT * FROM individus WHERE id = {$root_id}";
    $exec    = mysql_query($sql);
     
    function descendants($parent_id)
    {
        $sql  = 'SELECT * FROM individus WHERE num_pere = "'.$row['num_indiv'].'"' ;
        echo $sql;
        $exec = mysql_query($sql);
     
        if ($exec === false) {
            die('Erreur : '.mysql_error());
        }
        while($data = mysql_fecth_assoc($exec)) {
            echo $data['nom'], ' ', $data['prenom'];
            descendants($data['num_indiv']);
        }
    };
     
    echo $data['nom'], ' ', $data['prenom'], '<br />';
    descendants($data['num_indiv']);
    echo $sql; ne me retourne que la commande .......... bien sûr !
    Et j'ai l'erreur Fatal error: Call to undefined function mysql_fecth_assoc()

  18. #18
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,
    Tu as oublié en cours de route des bouts de code

    Citation Envoyé par t671 Voir le message
    Et j'ai l'erreur Fatal error: Call to undefined function mysql_fecth_assoc()
    Tu aurais pu te rendre compte qu'il y avait une faute de frappe : fecth -> fetch
    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
    $root_id = 168;
    $sql     = "SELECT * FROM individus WHERE id = {$root_id}";
    $exec    = mysql_query($sql);
     
    if ($exec === false) {
        die('Erreur : '.mysql_error());
    }
     
    $data = mysql_fetch_assoc($exec);
     
    function descendants($parent_id)
    {
        $sql  = "SELECT * FROM individus WHERE num_pere = {$parent_id}";
        echo $sql;
        $exec = mysql_query($sql);
     
        if ($exec === false) {
            die('Erreur : '.mysql_error());
        }
        while($data = mysql_fetch_assoc($exec)) {
            echo $data['nom'], ' ', $data['prenom'];
            descendants($data['num_indiv']);
        }
    }
     
    echo $data['nom'], ' ', $data['prenom'], '<br />';
    descendants($data['num_indiv']);

  19. #19
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    echo $sql; ne me retourne que la commande .......... bien sûr !
    Tu veux dire la requête ?
    Mais dans la requête, la variable $row['num_indiv'] est-elle valorisée ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Problème de boucle while dans un popup
    Par drogba72 dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2009, 14h19
  2. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  3. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  4. Réponses: 3
    Dernier message: 11/06/2006, 12h09
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

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