PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 18-09-2012 14:08:54

t14
Membre
Inscription : 10-09-2009
Messages : 96

Boucle while

Bonjour,

Je n'arrive pas à executer une boucle while comme je veux.
Dans ma base, un enregistrement comporte notamment l'id, un num_indiv, un num_pere, .....
Tous les num_pere se retrouve en num_indiv.
En partant d'un enregistrement A, je veux afficher tous ceux qui y sont liés, soit ses fils.
Je doit donc rechercher tous les enregistrements (B) qui ont un num_pere égal au num_indiv A.
Une fois trouvé, je recherche tous les enregistrements ayant B ayant un num_pere égal au num_indiv de B
.............etc

Et là je bloque ................ je n'arrive pas à boucler pour lire toute la base !!!

<?php   
$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>';

$select2 = 'SELECT * FROM individus WHERE num_pere LIKE "'.$row1['num_indiv'].'"';
$result2 = mysql_query($select2,$link) or die ('Erreur : '.mysql_error() );

while ($row2 = mysql_fetch_array($result2))
{   
    echo ''.$row2['nom'].' '.$row2['prenom'].'<br>&nbsp;&nbsp;&nbsp;&nbsp;né : '.$row2['date_naissance'].'';    }
    if (!empty($row2['date_dc']))
    {    echo '<br>&nbsp;&nbsp;&nbsp;&nbsp;dcd : '.$row2['date_dc'].'';    }
       
        $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'].'<br>&nbsp;&nbsp;&nbsp;&nbsp;né : '.$row3['date_naissance'].'';    }
                if (!empty($row3['date_dc']))
                {    echo '<br>&nbsp;&nbsp;&nbsp;&nbsp;dcd : '.$row3['date_dc'].'';    }
                echo '</td></tr>';   
            }   
        }
}

?>
Je pourrais continuer les WHILE jusqu'à balayer toiute la base, mais il doit y avoir moyen de jouer avec une ou deux boucle WHILE !!!!

Merci de me donner un coup de main.

Hors ligne

#2 19-09-2012 06:54:03

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Boucle while

Saluton,
MySQL, en particulier, mais les SGBDR en général, ont du mal avec les représentations hiérarchiques ou arborescentes.
MySQL ne possédant pas de processus de requêtes récursives, c'est donc vers une représentation intervallaire de tes données qu'il faut te tourner.
Je t'engage à bien étudier ce tuto de SQLPro : Gestion d'arbres par représentation intervallaire


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 19-09-2012 17:04:17

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Boucle while

Ouuups ! J'ai été voir ton lien sur les arbres par représentation intervallaire, et cela m'a l'air ardu .......... !!!!!

Par contre, je ne comprends pas pourqoui ce code ne fonctionne pas :

$select1 = 'SELECT * FROM individus WHERE id LIKE "168"';
$result1 = mysql_query($select1,$link) or die ('Erreur : '.mysql_error() );
$row1 = mysql_fetch_array($result1);
echo '<table>';
echo '<tr><td>';
echo ''.$row1['nom'].' '.$row1['prenom'].'<br>';
echo '</td></tr>';

$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() );

                while ($row2 = mysql_fetch_array($result2))   
                { 
                echo '<tr><td>';
                echo ''.$row2['nom'].' '.$row2['prenom'].'<br>&nbsp;&nbsp;&nbsp;&nbsp;né : '.$row2['date_naissance'].'';   
    echo '</td></tr>';
                } 
$row1['num_indiv'] = $row2['num_indiv'];         
}
?>

C'est une simple boucle ! Ou il y a des erreurs ..... ???

Hors ligne

#4 20-09-2012 07:12:06

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Boucle while

Bonjour,


A partir du moment où tes ids sont numériques, remplace tes LIKE par = dans tes requêtes. Et on évite les SELECT * (la fameuse guerre des étoiles).

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 20-09-2012 17:01:45

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Boucle while

Jc a écrit :

Bonjour,


A partir du moment où tes ids sont numériques, remplace tes LIKE par = dans tes requêtes. Et on évite les SELECT * (la fameuse guerre des étoiles).

++

Bonjour,

Mes ids sont numériques, num_pere et num_indiv déclarés en "decimal" dans la base. J'ai remplacé les LIKE par =, et les * des requêtes par id, num_indiv, nom, prenom, num_pere.
Je fait également afficher les ids, et je me suis rendu compte que j'affiche presque toute la base de id=1 à id=344(en sautant quelques id (le 3, le 4, le 6, du 14 au 19 inclus, ..............! Pourquoi, je ne sais pas ?). Et l'affichage (1 à 344) recommence .........
Mais aucun lien avec les num_pere et num_indiv.
Par exemple, le premier enregistrement qui s'affiche (issu du 2° while, avec id=1), ne comporte pas de num_pere et ne devrait donc pas s'afficher !??

Dernière modification par t14 (20-09-2012 17:02:46)

Hors ligne

#6 21-09-2012 23:44:31

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Boucle while

Bonjour,

1) Je ne comprends pas ni la pertinence ni le pourquoi d'un decimal en id numérique.
2) Sur un fetch_array ou un fetch_num d'ailleurs, qu'il n'y ait qu'une seule ligne de résultat ou plusieurs, (donc exception faite de l'absence de lignes), il y a forcément au moins une ligne et donc on obtient forcément un tableau à deux dimensions dans le resultset. Ainsi dans le cas de la première requête c'est $row1[0]['nom'] qu'il faut écrire et non $row1['nom'].
3) La requête du milieu ....

$select = 'SELECT * FROM individus' ;
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );

ne sert strictement à rien ici.
4) Dans la dernière requête, je suppose que le num_indiv corresponds à l'id. Je rappele à ce propos qu'il est nécessaire que num_indiv soit du même type que id . La dernière requête retourne tous les enfants de $row1[0]['id'] et non $row1[0]['num_indiv'] (au lieu de $row1['num_indiv'] qui dans ce cas signifie que la requête retourne les petits-enfants de $row1[0]['id']).

++

Dernière modification par Jc (22-09-2012 11:49:09)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums