Pb de boucle While avec 2 bases

Pb de boucle While avec 2 bases - PHP - Programmation

Marsh Posté le 04-12-2009 à 17:02:07    

Bonjour à tous,
 
Voila je suis en train de préparer une page ou j'ai besoin d'afficher des données provenant de 2 tables
 
Je m'explique un peu plus
 
J'ai une table activites dont je veux afficher le contenu et une deuxième table qui sera affiché suivant le contenu de la première grâce à un id
 
Mon problème est que j'ai seulement ma première ligne qui s'affiche  
 
voici le code :
 

Code :
  1. <?php
  2.    $activite = "SELECT * FROM activites WHERE privilege='$priv'";
  3.    $query2=mysql_query($activite) or die("Exécution de la requête impossible query2:" .mysql_error());
  4.    $heure = "SELECT * FROM horaires";
  5.    $query3=mysql_query($heure) or die("Exécution de la requête impossible query3:" .mysql_error());
  6.    while ($ligne2=mysql_fetch_array($query2) and ($ligne3=mysql_fetch_array($query3)))
  7.    {
  8.    ?>
  9.                 <tr>
  10.                 <td align="left" class="activite">Atelier :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne2['ateliers'];?></td>
  11.                 </tr>
  12.                 <tr>
  13.                 <td align="left" class="activite">Responsable :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne2['personne'];?></td>
  14.                 </tr>
  15.                 <tr>
  16.                 <td align="left" class="activite">Lieu :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne2['lieu'];?></td>
  17.                 </tr>
  18.                 <tr>
  19.                 <td align="left" class="activite">Participation :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne2['participation'];?></td>
  20.                 </tr>
  21.                 <tr>
  22.                 <td align="left" class="activite2" colspan="3">
  23.                 <?php
  24.    if ($ligne3['id_act'] == $ligne3['id_act'])
  25.    {?> 
  26.                 <table>
  27.    <tr><td align="left" class="activite">participants :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne3['participants'];?></td></tr>
  28.                 <tr><td align="left" class="activite">Jour :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne3['jour'];?></td></tr>
  29.                 <tr><td align="left" class="activite">Horaires :</td><td width="10"></td><td align="left" class="activite2">de <?php echo $ligne3['heure_debut'];?> à <?php echo $ligne3['heure_fin']; ?></td></tr>
  30.                 </table>
  31.                 </td>
  32.                 <?php }
  33.    else
  34.    { ?>
  35.    </td>
  36.    <?php } ?>
  37.                 </tr>
  38.                 <tr>
  39.                 <td align="left" class="activite">Description :</td><td width="10"></td><td align="left" class="activite2"><?php echo $ligne2['descript'];?></td>
  40.                 </tr>
  41.                 <tr>
  42.                 <td align="left" class="activite" height="20"></td>
  43.                 </tr>
  44.                 <?php }
  45.    ?>


 
 
pourriez vous m'aider à résoudre mon problème car je ne trouve pas......
Précision, je suis en plein apprentissage de ce language, donc l'optimisation n'est pas encore au goût du jour  ;)  
 
Merci d'avance pour vos réponses

Reply

Marsh Posté le 04-12-2009 à 17:02:07   

Reply

Marsh Posté le 04-12-2009 à 17:23:02    

Salut,

 

Pour commencer, deux trucs :

 

1) Ne mets jamais de "select *" dans les requêtes, car :
- tu ne sais pas explicitement ce que tu récupères
- tu récupères potentiellement beaucoup trop d'information par rapport à ce qui est nécessaire
- pour la maintenance, c'est pas top

 

2) Dans les die()

 

PHP te permet d'écrire des chaînes de caractères de deux manières : avec des quotes et avec des guillemets. Pour comprendre la différence, voici un exemple :

 

$machaine = 'test';

 

echo '$machaine';
echo "$machaine"

 

Le premier echo affichera $machaine
Le second echo affichera test

 

Tout ça pour dire que tu as oublié les $ devant le nom des variables dans tes die.

  

Ensuite, voici ton souci : tu ne peux pas utiliser un while() avec deux boucles en même temps, ce n'est pas logique.

 

Il faut utiliser deux boucles impriquées :

 

while (mysql_fetch...1) {

 

 // Je détermine ma seconde requête à partir du résultat de la première
  while (mysql_fetch...2) {
    // Code
  }

 

}

 

Là, dans ton code, tu sélectionnes tous les horaires sans tenir compte de l'activité.


Message édité par Fred999 le 04-12-2009 à 17:23:48
Reply

Marsh Posté le 04-12-2009 à 17:24:53    

Enfin, si tu utilises des classes, le align="left" devrait être dans le CSS...

Reply

Marsh Posté le 04-12-2009 à 17:51:38    

Bonsoir,  
merci pour les infos
 
pour les *, je veux effectivement récupérer toutes les infos de ma base c'est donc pour cela que j'ai utilisé ce sigle (pas bien quand même ??)
 
euh... pour mes die, c'est simplement qu'au début, j'avais une erreur de "query empty" et comme j'en ai 2, c'était simplement pour les différencier :)
 
J'ai effectivement essayé dans un premier temps cette solution d'imbriquer 2 while, mais je tombe toujours sur le même résultat c'est à dire que j'ai seulement ma première ligne qui apparaît...
 
Je refais un essai en mettant les 2 while imbriqués

Reply

Marsh Posté le 04-12-2009 à 17:57:51    

Même si tu veux tous les champs, habitue-toi à les écrire explicitement. Le jour où tu devras récupérer le code de qqun d'autre, tu seras bien content de ne pas avoir à aller voir la structure de la table...
 
Pour les chaînes, je voulais dire que  
die("Exécution de la requête impossible $query2:" .mysql_error());
est plus explicite que
die("Exécution de la requête impossible query2:" .mysql_error());
même si ta ligne est correcte.

Reply

Marsh Posté le 04-12-2009 à 18:05:17    

enought a écrit :

Bonsoir,  
merci pour les infos
 
pour les *, je veux effectivement récupérer toutes les infos de ma base c'est donc pour cela que j'ai utilisé ce sigle (pas bien quand même ??)
 
euh... pour mes die, c'est simplement qu'au début, j'avais une erreur de "query empty" et comme j'en ai 2, c'était simplement pour les différencier :)
 
J'ai effectivement essayé dans un premier temps cette solution d'imbriquer 2 while, mais je tombe toujours sur le même résultat c'est à dire que j'ai seulement ma première ligne qui apparaît...
 
Je refais un essai en mettant les 2 while imbriqués


 
 
Eh bien c'est une très bonne nouvelle, cela fonctionne !!
 
Merci beaucoup pour votre aide ^^
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed