[RESOLU] If, elseif, else qui ne marche pas.

Eléphant du PHP | 58 Messages

18 mars 2013, 19:07

Bonjour
J'utilise if/elseif/else pour générer un texte sous différentes conditions. Voici le code que j'utilisais au début:
if ($image_gen="AV") {$type="une étoile blanche de la séquence principale";}
elseif ($image_gen="BV"or"BIV") {$type="une étoile bleue massive";}
elseif ($image_gen="FI"or"GI") {$type="une géante jaune";}
elseif ($image_gen="KI"or"MI") {$type="une géante rouge";}
elseif ($image_gen="FIV"or"GIV"or"KIV") {$type="une sous-géante";}
elseif ($image_gen="FV") {$type="une naine jaune-blanche";}
elseif ($image_gen="GV") {$type="une naine jaune";}
elseif ($image_gen="KV") {$type="une naine orange";}
elseif ($image_gen="MV") {$type="une naine rouge";}
elseif ($image_gen="PSR") {$type="un pulsar";}
elseif ($image_gen="WD") {$type="une naine blanche";}
elseif ($image_gen="sdB") {$type="sous-naine chaude";}
elseif ($image_gen="GVGV") {$type="une étoile binaire constituée de deux naines jaunes";}
elseif ($image_gen="GVMV") {$type="une étoile binaire constituée d'une naine jaune et d'une naine rougge";}
elseif ($image_gen="KVMV") {$type="une étoile binaire constituée d'une naine orange et d'une naine rouge";}
elseif ($image_gen="MIMV") {$type="une étoile binaire constituée d'une géante rouge et d'une naine rouge";}
elseif ($image_gen="MVMV") {$type="une étoile binaire constituée de deux naines rouges";}
elseif ($image_gen="sdBMV") {$type="une étoile binaire constituée d'une sous-naine chaude et d'une naine rouge";}
elseif ($image_gen="WDMV") {$type="une étoile binaire constituée d'une naine blanche et d'une naine rouge";}
elseif ($image_gen="PSRWD") {$type="une étoile binaire contituée d'un pulsar et d'une naine blanche";}
else {$type="une étoile dont les caractéristiques sont encore peu connues";}
echo"
$star_name est $type 
	";
Le problème est que l'opération s’arrête au "if" et le considère comme VRAI alors que c'est rarement le cas.

par exemple pour l'étoile 42 Dra ça me donne:
42 Dra est une étoile blanche de la séquence principale
Alors que $image_gen="KI". En coupant tout les elseif, j'obtiens toujours le même résultat.

Je me suis alors dit qu'en écrivant $image_gen="AV" dans la condition je la rendais vraie. chose que j'ai vérifiée en écrivant echo"$image_gen";, ce qui me donnait toujours AV. J'ai alors changé les = en == et ça a avancé... mais pas de beaucoup. Cette fois ci echo"$image_gen"; me donne ce qu'il faut... mais le code ne marche toujours pas, cette fois ça s’arrête à la deuxième étape, ça m'écrit toujours "$star_name est une étoile bleue massive".

Je me suis dit que c'est peut être le "ou" qui gène, je l'ai enlevé et ça ne change rien.

Pouvez vous m'aider s'il vous plait?

Mammouth du PHP | 504 Messages

18 mars 2013, 19:53

ton probleme pourrait venir de tes opérateurs qui me semblent pas vraiment conforme:

une égalité exacte, c'est == etc.. etc.. essaies de voir la doc pour revoir ton code.

doc http://www.phpsources.org/tutoriel-conditionnel-if.htm

Mammouth du PHP | 2278 Messages

18 mars 2013, 21:46

Le problème vient de l'opérateur.
$a = $b ;// signifie $a reçoit la valeur de $b; opération qui renvoie toujours en plus TRUE
par conséquent:
$c = ($a = $b) ; $c est toujours vrai
$c = ($a == $b);// $c prend la valeur de la comparaison entre a$ et b$ Vrai ou FAUX
$c = ($a === $b);// $c prend la valeur de la comparaison stricte entre a$ et b$ Vrai s'ils sont égaux et du même type (obligé pour certaines fonctions comme strpos qui renvoient l'entier 0 si la chaine cherchée est en première position, et le booléen FAUX (qui vaut 0 en étant d'un type différent) si elle n'est pas trouvée ou FAUX.

Ceci étant dit, cette accumulation de if serait agréablement remplacée par un switch plus facile à lire et plus facile à étendre.
switch ($gen)
{
    case "AV":une étoile blanche de la séquence principale";
    break;
    default:
    $type = "Inconnu";
}
On pourrait aussi,imaginer un tableau :
<?PHP
$genres = array(
"AV", "BV", "BIV");

$types = array(
"une étoile blanche de la séquence principale", "une étoile bleue massive", "une étoile bleue massive");
$place = array_search ("BV", $genres);
if ($place !== false)
{
	$type = $types[$place];
}
print "$type";

?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 18 Messages

18 mars 2013, 22:08

Ou tu peux faire le tout avec le fonction switch

Sylvain

Eléphant du PHP | 58 Messages

20 mars 2013, 10:37

Merci.

Le bug semble venir de l'opérateur OR, mais je note néanmoins la méthode switch qui a l'air très facile à utiliser.

ViPHP
xTG
ViPHP | 7331 Messages

20 mars 2013, 10:56

Merci.

Le bug semble venir de l'opérateur OR, mais je note néanmoins la méthode switch qui a l'air très facile à utiliser.
Aucun bug sur l'opérateur OR.
Juste ton utilisation de cet opérateur qui est mauvaise.
elseif ($image_gen="FIV"or"GIV"or"KIV") // n'est pas correct
elseif ($image_gen="FIV" or $image_gen="GIV" or $image_gen="KIV") // est correct

Eléphant du PHP | 58 Messages

20 mars 2013, 10:57

Merci.

Le bug semble venir de l'opérateur OR, mais je note néanmoins la méthode switch qui a l'air très facile à utiliser.
Aucun bug sur l'opérateur OR.
Juste ton utilisation de cet opérateur qui est mauvaise.
elseif ($image_gen="FIV"or"GIV"or"KIV") // n'est pas correct
elseif ($image_gen="FIV" or $image_gen="GIV" or $image_gen="KIV") // est correct
C'est sans doutes e que je voulais dire.

ViPHP
xTG
ViPHP | 7331 Messages

20 mars 2013, 12:35

Grumf... Et en voulant corriger j'ai posté du faux...
elseif ($image_gen=="FIV" or $image_gen=="GIV" or $image_gen=="KIV")
Là ! J'aime pas laisser trainer des bugs derrière moi. On serait capable de me le reprocher. :P