2009-09-02 10 views
0

Dans le PHP ci-dessous si je compare une variable en utilisant == cela fonctionne comme je l'attendre, si je l'utilise ! = alors mes pauses de code, quelqu'un peut-il expliquer ou aider?PHP/si des erreurs d'autre

$_GET['p'] = 'home'; 

// DOES NOT work, it will always return "show JS" regardless to what string I have 
if ($_GET['p'] != 'home' || $_GET['p'] != 'create.account'){ 
    echo 'show JS'; 
}else{ 
    echo 'do not show JS'; 
} 

// Works as I would expect it to 
if ($_GET['p'] == 'home' || $_GET['p'] == 'create.account'){ 
    echo 'do not show JS'; 
}else{ 
    echo 'show JS'; 
} 

Répondre

9

$ _GET ['p'] ne peut pas être deux choses différentes en même temps. Vous dites int la première expression; p pas à la maison ou pas créer.account. C'est toujours vrai. Vous devez utiliser & & au lieu de ||

+0

grande qui fonctionne – JasonDavis

+3

+1 simple loi mauvaise application de De Morgan (http://en.wikipedia.org/wiki/Demorgan%27s_law) –

0
if ($_GET['p'] != 'home' && $_GET['p'] != 'create.account') 
+0

à cause de http://en.wikipedia.org/wiki/Logical_disjunction (Faux OU Vrai) == Vrai – balint

2
(X != A) || (X != B) 
≡ !(X == A) || !(X == B) 
≡ !((X == A) && (X == B)) 

(X == A) && (X == B) est toujours fausse puisque la condition A != B mais X ne peut pas être à la fois A et B en même temps. Donc !((X == A) && (X == B)) et votre (X != A) || (X != B) est toujours vrai.

3

Vous pouvez voir le problème par DeMorgans Laws pour la négation

!(A || B) === (!A && !B) 

La solution que vous donnez est impossible parce qu'il n'y a aucun moyen pour les deux déclarations sont fausses, car cela impliquerait la chaîne est équivalente à la fois le rapport cordes. La seule façon dont le bloc else serait frappé est si les deux étaient faux (à cause de l'instruction OR).