Besoin d'aide sur une boucle "if else if else"

Besoin d'aide sur une boucle "if else if else" - PHP - Programmation

Marsh Posté le 29-12-2010 à 10:02:20    

Bonjour,
 
J'essaye de passer une BD Access sur SQL avec une interface PHP. Cette BD est très complexe, et je progresse petit à petit. Pourtant, le résultat que j'obtiens sur une boucle if, else if, else est assez bizarre, et je patine depuis quelques temps pour m'en dépatouiller. Je sollicite donc votre aide pour un p'tit coup de pouce. Voilà la partie qui pose problème :
 

Code :
  1. $req = mysql_query($req_search,$db_link) or die(mysql_error());
  2. $nb_stage = mysql_num_rows($req);
  3. $_SESSION['j']=1;
  4. if($nb_stage=4){
  5.     while($row = mysql_fetch_array($req)){
  6.       include("aff_stage.php" );
  7.       $_SESSION['j']++;
  8.   }
  9. }
  10. else if($nb_stage=3){
  11.     while($row = mysql_fetch_array($req)){
  12.       include("aff_stage.php" );
  13.       $_SESSION['j']++;
  14.   }
  15. }
  16. else if($nb_stage=2){
  17.     while($row = mysql_fetch_array($req)){
  18.       include("aff_stage.php" );
  19.       $_SESSION['j']++;
  20.   }
  21. }
  22. else if($nb_stage=1){
  23.   $row = mysql_fetch_array($req);
  24.     include("aff_stage.php" );
  25. }
  26. else{
  27.   echo "Aucun stage pour ce stagiaire";
  28. }


 
Les trois premières boucles fonctionnent bien, si j'ai 4 stages, 3 stages ou 2 stages, l'affichage des stages fonctionnent. Les deux dernières boucles ne fonctionnent pas si 1 stage ou aucun stage. Je n'ai même pas l'include de aff_stage.php, et encore moins un message d'erreur.
 
Voilà le code de aff_stage.php si ça vous ait utile.  
 

Code :
  1. <?php
  2. $stage = $_SESSION['j'];
  3. echo "stage : $stage";
  4. ?>
  5. <?php
  6. echo '
  7.   <TABLE>
  8.     <TR BGCOLOR="#AAAAAA">
  9.       <TD>Lieux :</TD>
  10.       <TD>'.$row["lieux"].'</TD>
  11.     </tr>
  12.  
  13.     <TR BGCOLOR="#AAAAAA">
  14.       <TD>Dispositif :</TD>
  15.       <TD>'.$row["disp"].'</TD>
  16.     </TR>
  17.   </TABLE>
  18.   ';
  19. ?>


 
Franchement, je tourne en rond, et je ne trouve aucune solution...  
 
Merci de votre aide !

Reply

Marsh Posté le 29-12-2010 à 10:02:20   

Reply

Marsh Posté le 29-12-2010 à 10:09:30    

'opérateur de comparaison est == en php , pas =

Reply

Marsh Posté le 29-12-2010 à 10:33:18    

Merci, ça fonctionne à présent pour le cas "aucun stage", mais si un stagiaire a effectué un seul stage, ça m'affiche aussi "aucun stage". Autrement dit, les lignes 23 à 26 ne fonctionnent pas :(
 
EDIT : j'ai rien dit, ça fonctionne aussi !


Message édité par Antoine T le 29-12-2010 à 10:34:55
Reply

Marsh Posté le 29-12-2010 à 10:39:13    

Pourquoi tu fais des if else dans tous les sens ?  
ils font tous la même chose
 
Un simple :  

Code :
  1. $req = mysql_query($req_search,$db_link) or die(mysql_error());
  2. $nb_stage = mysql_num_rows($req);
  3. $_SESSION['j']=1;
  4. if($nb_stage> 0 ){
  5.    while($row = mysql_fetch_array($req)){
  6.      include("aff_stage.php" );
  7.      $_SESSION['j']++;
  8.  }
  9. }else{
  10.  echo "Aucun stage pour ce stagiaire";
  11. $_SESSION['j']  = 0;
  12. }


Ensuite, ton affstage.php qui fait appel a des variables définies ailleurs, c'est saaaâaaaale.
 
 
fait une fonction afficheUnStage($nom_stage,$lieux,$dispositif) par exemple

Reply

Marsh Posté le 29-12-2010 à 10:52:22    

J'avoue que j'ai du mal avec les fonctions :( Ca serait du genre :
 

Code :
  1. function afficheUnStage($nom_stage,$lieux,$dispositif){
  2. echo '
  3.    <TABLE>
  4.      <TR BGCOLOR="#AAAAAA">
  5.        <TD>Lieux :</TD>
  6.        <TD>$lieux</TD>
  7.      </tr>
  8.  
  9.      <TR BGCOLOR="#AAAAAA">
  10.        <TD>Dispositif :</TD>
  11.        <TD>$disp</TD>
  12.      </TR>
  13.    </TABLE>
  14.    ';
  15. }


 
Désolé si la question parait bête...

Reply

Marsh Posté le 29-12-2010 à 11:43:44    

oui , c'est ça ( attention aunom des variables, $dispositif et $disp, $lieux ,...)

Reply

Marsh Posté le 29-12-2010 à 11:50:19    

Ok, encore une question bête (mais il parait qu'il n'y a pas de question bête) :  
- je cale ma fonction dans un fichier fonctions.php
- dans aff_stage.php, je fais donc un include sur fonctions.php
- et j'ai juste à marquer la fonction afficheUnStage()?
 
j'ai pas encore franchi le cap, je ne programme pas en POO, juste en fonctionnel. Merci pour ta patience et ton aide !

Reply

Marsh Posté le 29-12-2010 à 13:08:46    

tu n'inclues plus aff_stage, mais juste fonction.php ( une seule fois)
quand tu as besoin de l'utiliser tu l'appelle avec les paramètres qui vont bien,genre :  
 
afficheUnStage($row['nom_stage'],$row['lieux'],$row['dispositif'])

Reply

Marsh Posté le 29-12-2010 à 13:36:59    

à la place des if else à la chaîne, renseigne toi sur "Switch" en php
 
http://php.net/manual/fr/control-structures.switch.php
 

Code :
  1. <?php
  2. if ($i == 0) {
  3.     echo "i égal 0";
  4. } elseif ($i == 1) {
  5.     echo "i égal 1";
  6. } elseif ($i == 2) {
  7.     echo "i égal 2";
  8. }
  9. switch ($i) {
  10.     case 0:
  11.         echo "i égal 0";
  12.         break;
  13.     case 1:
  14.         echo "i égal 1";
  15.         break;
  16.     case 2:
  17.         echo "i égal 2";
  18.         break;
  19. }
  20. ?>

Reply

Marsh Posté le 29-12-2010 à 14:54:14    

@antac
J'utilise déjà le switch pour tester les différents boutons d'un formulaire  
(exemple case enregistrer
                 case mise à jour
                 case annuler)
 
Mais y a t'il un réel intérêt à utiliser switch plutôt que if else? Car en terme de lignes, ça se vaut, en lisibilité aussi, du moins je trouve.
 
@flo850
Ok, je vais tester de suite ! Merci.

Reply

Marsh Posté le 29-12-2010 à 14:54:14   

Reply

Marsh Posté le 29-12-2010 à 15:04:57    

Le switch est nettement plus lisible plutôt que 3 km de if else if imbriqués.

 

A la relecture , on comprend que la décision est restreint à ce bloc de code et il est visuellement facile de checker les cas différents. Et en plus, c'est plus simple à modifier


Message édité par smaragdus le 29-12-2010 à 15:06:07
Reply

Marsh Posté le 30-12-2010 à 13:38:02    

En fait, je l'aurai fait comme ça moi

Code :
  1. $req = mysql_query($req_search,$db_link) or die(mysql_error());
  2. $nb_stage = mysql_num_rows($req);
  3. $_SESSION['j']=1;
  4. if (($nb_stage>=1) && ($nb_stage<=4))
  5. {
  6.   while($row = mysql_fetch_array($req))
  7.   {
  8. include("aff_stage.php" );
  9. if ($nb_stage!=1)
  10.  $_SESSION['j']++; 
  11.   }
  12. }
  13. else
  14. echo "Aucun stage pour ce stagiaire";


Message édité par antac le 30-12-2010 à 13:38:27
Reply

Marsh Posté le 30-12-2010 à 14:07:53    

Ca fonctionne à merveille ! Et c'est très lisible, merci antac.

Reply

Marsh Posté le 31-12-2010 à 11:07:57    

Et le jour où tu as un $nb_stage qui vaut 5 ?


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 31-12-2010 à 11:43:14    

Ca ne devrait à priori pas arriver, un même stagiaire fait généralement 1 ou deux stages, dans des rares cas 3 stages, et je n'ai encore jamais vu 4 stages. Si jamais cela devait arriver, il me suffit de changer cette valeur
 

Code :
  1. if (($nb_stage>=1) && ($nb_stage<=4))

Reply

Marsh Posté le 31-12-2010 à 11:45:52    

Non mais c'était une question rhétorique hein :o

 

Tout ça pour dire qu'il faut juste remplacer cette ligne par

Code :
  1. if($nb_stage > 0)

comme l'a dit flo850 ;)

 

Ca ne coûte rien, et ça t'évitera de devoir débugguer (toi ou ton successeur) le jour où quelqu'un fait 5 stages :o


Message édité par Dj YeLL le 31-12-2010 à 11:46:02

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 31-12-2010 à 14:47:11    

Entendu ! C'est vrai qu'il faut tout de suite prendre ces bonnes habitudes. Et c'est encore plus simple à la lecture. J'essaye en ce moment de simplifier au max mon code, car j'étais arrivé à une véritable usine à gaz... Merci pour l'astuce !

Reply

Marsh Posté le 31-12-2010 à 15:17:13    

C'est sur, je donnais une simple retranscription de ton if/else/if...

Reply

Sujets relatifs:

Leave a Replay

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