2009-09-02 3 views
0

В приведенной ниже PHP если сравнить переменную с помощью == он работает, как я бы ожидать, что это, если я использую ! = тогда мой код брейки, может кто-то объяснить или помочь?PHP, если/иначе ошибки

$_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'; 
} 

ответ

9

$ _GET ['p'] не может быть двух разных предметов одновременно. Вы произносите первое выражение; p не из дома или нет. Это всегда верно. Вы должны использовать & & вместо ||

+0

велик, что работает – JasonDavis

+3

+1 простых нецелевым закона де Морган (http://en.wikipedia.org/wiki/Demorgan%27s_law) –

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

из-за http://en.wikipedia.org/wiki/Logical_disjunction (False ИЛИ True) == True – balint

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

(X == A) && (X == B) всегда ложно, так как условие A != B но X не может быть одновременно A и B одновременно. Таким образом, !((X == A) && (X == B)) и ваш (X != A) || (X != B) всегда верны.

3

Вы можете увидеть проблему DeMorgans Laws для отрицания

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

Решение вы даете невозможно, потому что нет никакого способа оба утверждения ложными, потому что это будет означать строка эквивалентна как по сравнению строки. Единственный способ, которым был бы заблокирован блок else, - это то, что оба они были ложными (из-за инструкции OR).