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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Quelle version de PHP utilises-tu ?

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

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

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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

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