Prise de tête avec if et elseif

Eléphanteau du PHP | 34 Messages

22 mai 2009, 10:18

Bonjour,

Je dois vérifier si l'épaisseur demandée dans une matière donnée est dispo:
exemple: plexiglas fumé n'est pas dispo en 3, 4 et 5mm
le dibond n'est dipo qu'en 3mm...

avant de rentrer dans le calcul du prix, je passe dans un traitement dans lequel j'essaye() de faire fonctionner le code suivant:

Code : Tout sélectionner

if ($matiere=='fume' && $epais=='3' || $epais=='4' || $epais=='5' ) { echo ("<font class=texte2>pas de $epais en fumé!</font>"); } else if ($matiere=='dib' && $epais=='4' || $epais=='5' || $epais=='6' || $epais=='8' || $epais=='10' ) { echo ("<font class=texte5>pas de $epais en dibond!</font>!"); }
je sors systematiquement au deuxième if même si j'ai choisi le plexiglas transparent qui, lui, est dispo dans toutes les épaisseurs...
je sais , ça doit être évident mais je ne sais pas comment dire:

si cette condition est respectée -->vérifie la deuxieme et si les 2 passent --> execute le script prévu

essayez ici: http://ridolfi.essai.free.fr/GRAVURE/sa ... d%E9coupe+
kayorn
"Je ne crois pas en l'au-delà, mais j'emporte tout de même un caleçon de rechange." --woody allen

Eléphant du PHP | 175 Messages

22 mai 2009, 10:38

Code : Tout sélectionner

if ($matiere=='fume' && $epais=='3' || $epais=='4' || $epais=='5' ) { echo ("<font class=texte2>pas de $epais en fumé!</font>"); } else if ($matiere=='dib' && $epais=='4' || $epais=='5' || $epais=='6' || $epais=='8' || $epais=='10' ) { echo ("<font class=texte5>pas de $epais en dibond!</font>!"); }
c'est un peu logique...
tu melanges les "et" et les "ou", il faut etre plus restrictif ;)
lis tes conditions en francais et fait les bons regroupements

Code : Tout sélectionner

if ($matiere=='fume' && ($epais=='3' || $epais=='4' || $epais=='5') ) { echo ("<font class=texte2>pas de $epais en fumé!</font>"); } else if ($matiere=='dib' && ($epais=='4' || $epais=='5' || $epais=='6' || $epais=='8' || $epais=='10') ) { echo ("<font class=texte5>pas de $epais en dibond!</font>!"); }
pour la derniere on peut aussi ecrire:

Code : Tout sélectionner

if ($matiere=='dib' && $epais!='3'){ echo ("<font class=texte5>pas de $epais en dibond!</font>!"); }
avec un bon exemple tu va comprendre ton erreur je pense, si ce n'est pas le cas n'hesite pas

Eléphanteau du PHP | 34 Messages

22 mai 2009, 10:56

les conditions en français:

si je choisis le transparent ---> je passe directement

si je choisis le fumé ($matiere && $epais)
--> je vérifie que c'est du 6 || 8mm || 10
---> si oui -->je passe direct
--> si c'est autre chose ---> "alerte"

si je choisis le dibond
---> je verifie que c'est du 3 mm
si oui ---> je passe direct
---> si non "alerte"

je suis plus clair?
s'il y a une autre façon je prends!
kayorn
"Je ne crois pas en l'au-delà, mais j'emporte tout de même un caleçon de rechange." --woody allen

Eléphant du PHP | 175 Messages

22 mai 2009, 11:14

pour la facon de ne pas se tromper la meilleur maniere est de l'ecrire en francais sur un papier avant.

ce qui donnerais :

- si ma matiere est transparente alors je passe

- si ma matiere est fumée et que son epaisseur est soit 6 soit 8 soit 10 alors je passe sinon alerte

apres tu peux traduire ces phrases en langage informatique plus facilement ave des "et" et des "ou" (&& et ||)

par exemple pour la matiere fume on peu ecrire:
if ($matiere=='fume' && ($epais!='6' &&  $epais!='8' && $epais!='10') ) { 
echo ("<font class=texte2>pas de $epais en fumé!</font>"); 

} 
dans cet exemple les parentheses ne sont pas forcement utiles mais ca permet une meilleur lisibilite pour des instructions plus complexes et des melanges entre les "ou" et les "et"


par exemple on pourrait avoir:
if ($matiere=='fume' && ($epais=='3' || $epais=='4' || $epais=='5') ) 
{ 
echo ("<font class=texte2>pas de $epais en fumé!</font>"); 

} 
la les parentheses sont obligatoires sinon ca foire

j'espere avoir ete plus clair

Eléphanteau du PHP | 34 Messages

22 mai 2009, 12:39

j'ai choisi de faire comme dans ta deuxième proposition et ça a l'air de tourner
j'ai fait la même chose pour les autres matières

Code : Tout sélectionner

<?php //si la surface est trop petite elle est ramenée à une valeur plancher $surface=$long*$large; if($surface <='0.02') { echo(" <font class=texte2>La surface a été portée à 0.02 M²</font><br>"); $surface=0.02; } /* je dois verifier 2 conditions en même temps la matière et son épaisseur par exemple, le plexi fumé en 3 mm n'est pas dispo. ou que le dibond n'est disponible qu'en 3mm */ if ($matiere=='fume' && ($epais=='2' || $epais=='3' || $epais=='4' || $epais=='5') ) { echo ("<font class=texte2>Le Plexi fumé en $epais n'est disponible </font>"); } if ($matiere=='dib' && ($epais!=='2')) { echo ("<font class=texte5>Le Dibond en $epais n'est disponible !</font>"); } if ($matiere=='kom' && ($epais!=='10')) { echo ("<font class=texte2>Le Komacell en $epais n'est disponible !</font>"); } ?>
kayorn
"Je ne crois pas en l'au-delà, mais j'emporte tout de même un caleçon de rechange." --woody allen

ViPHP
ViPHP | 1996 Messages

22 mai 2009, 22:40

Moi pour pas me tromper j'utilise switch + case ce qui donnerai :
switch ($matiere)
{
  case 'fume':
  switch ($epais)
  {
    case '3':
    case '4':
    case '5':
    echo ("<font class=texte2>pas de $epais en fumé!</font>");
    break;
  }
  break;

  case 'dib':
  switch ($epais)
  {
    case '4':
    case '5':
    case '6':
    case '8':
    case '10':
    echo ("<font class=texte5>pas de $epais en dibond!</font>!");
    break;
  }
  break;
}
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphanteau du PHP | 34 Messages

23 mai 2009, 08:02

j'avais essayé mais déjà que je me mélangeais les pinceaux avec les if :)
mais c'est vrai que c'est plus clair
kayorn
"Je ne crois pas en l'au-delà, mais j'emporte tout de même un caleçon de rechange." --woody allen

ViPHP
AB
ViPHP | 5818 Messages

23 mai 2009, 08:37

j'avais essayé mais déjà que je me mélangeais les pinceaux avec les if :)
mais c'est vrai que c'est plus clair
Dans ce cas, c'est bien de comprendre le fonctionnement des switch (qui resservira par la suite) car comme tu le dis, c'est plus clair :wink: