Vous n'êtes pas identifié(e).
Pages :: 1
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> né : '.$row2['date_naissance'].''; }
if (!empty($row2['date_dc']))
{ echo '<br> 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> né : '.$row3['date_naissance'].''; }
if (!empty($row3['date_dc']))
{ echo '<br> 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
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
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> 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
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
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
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
Pages :: 1