2015-04-20 3 views
-5

У меня есть 2 ссылок сказатьЕсли оператор ведет себя странно

http://localhost/xyz?language=en 
http://localhost/xyz?language=es 

, для которого я хочу, чтобы проверить, если параметр языка есть нечто иное, чем ан/ES, то он должен перенаправить в какой-то http://localhost/xyz/errorpage

Для этого я есть ниже код:

if(isset($_GET['language'])){ 
    if(($_GET['language'] !== "en") || ($_GET['language'] !== "es")){ 
     header('Location: /xyz/errorpage'); 
    } 
} 

Но практически, когда я исполню любой из 2-х адресов или кладя значение language параметра на что-то другое, чем en/es:

http://localhost/xyz?language=en 
http://localhost/xyz?language=es 
http://localhost/xyz?language=esdfsdf 

Я перенаправлены errorpage

Не могу понять проблемы с кодом.

+3

FYI: Это называется выражением * if *, нет такой вещи, как «цикл if». – deceze

+0

Кроме того, подумайте об этом медленно ... * если X не A __or__ не B * ... один из них будет * всегда * применяться. – deceze

+1

Прежде всего, нет такой вещи, как «цикл if», цикл - это что-то, что, ну, петли, итерации, которые нет в инструкции 'if'. Во-вторых, если вы серьезно относитесь к программированию (на любом языке), я рекомендую вам изучить [булевую алгебру] (http://en.wikipedia.org/wiki/Boolean_algebra). –

ответ

4

изменить статус, если статут на && вместо || или ваше состояние будет всегда ложным.

if(isset($_GET['language'])){ 
    if($_GET['language'] !== "en" && $_GET['language'] !== "es"){ 
     header('Location: /xyz/errorpage'); 
    } 
} 
+0

_или ваше состояние будет всегда false_ - нет, это всегда будет верно :-) – panther

+0

да, жаль, что вы правы: D пропустить орфографию – nada

4

У вас плохое состояние, или лучше, оператор.

Использовать && вместо ||, или in_array().

if(($_GET['language'] !== "en") && ($_GET['language'] !== "es")) { 

Использование in_array() функции:

if (!in_array($_GET['languge'], array('en', 'es'))) { 
    header(); 
} 

Состояние if ($a != 'x' || $a != 'y') всегда true, первая или вторая часть условия есть правда. Других путей нет.

+0

, которая будет работать быстрее, in_array или операторов? –

+0

@OMTheEternity: не уверен, in_array лучше читать, пока вы будете работать с более чем двумя языками. И imho будет немного быстрее (когда функция find '' en'' в массиве вернет true. Когда у вас есть цепочка '&&', PHP должен сравнивать каждый из них и чем возвращать что-то). – panther

+1

Не важно, что быстрее. Вы будете запускать этот запрос миллиард раз в день? Если нет, вы уже потратили 100 миллиардов пробег состояния, думая об этом. in_array легче добавить, если вам это нужно в будущем. –

5

Заменить || по & &.

Причина: Вы хотите перенаправить, если это не en И не es.

Смежные вопросы