2009-12-23 3 views
0

Для моего сайта требуется логин, который устанавливает разрешения на основе пользователя. В списке фотографий на сайте я должен определить, будет ли отображаться конкретная фотография, если пользователь имеет только гостевой доступ. Поэтому я подумал, что это заявление if else будет работать:Почему этот тест не работает?

if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) { 

    // show the photo if it isn't private and the user isn't a guest 

Но это не так.

Однако, если я отделяю этот тест на три строки, он работает просто отлично.

$is_private_photo = $mysql_row['guest_access'] == 'NO'; 
$is_guest = $_SESSION['user_level'] == 'GUEST'; 
$both_private_and_guest = ($is_private_photo AND $is_guest); 

if (!$both_private_and_guest) { 
    // show the photo if it isn't private and the user isn't a guest 

Что не так с первой версией?

+0

вау, 5 человек бил меня точно такой же ответ: D – tloach

+0

Спасибо всем за быстрые ответы. Наверное, я не продумал это очень хорошо. – Lonn

ответ

2

Логическое не действие должно применяться к результатам И, но в вашем примере кода оно применяется только к первому предложению (НЕ имеет более высокий приоритет, чем И). Вы можете решить эту проблему путем группирования оба условий:

if (!(($mysql_row['guest_access'] == 'NO' AND ($_SESSION['user_level'] == 'GUEST'))) { 
1

Это потому, что вы положили скобки в неправильном месте в первой версии. Эквивалентная форма второго варианта:

if (!$is_private_photo AND $is_guest) 

, который явно не то, что вы намеревались.

6

Ваш первый, если это

if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) 

Что на самом деле интерпретируется так:

if (
    (!($mysql_row['guest_access'] == 'NO')) 
    AND ($_SESSION['user_level'] == 'GUEST') 
) 

! применяется только к первому условию, не так, потому что он имеет более высокий уровень приоритета чем И (см. Operator Precedence)


Возможно, ваше состояние должно быть переписано с некоторыми дополнительными скобками:

if (!(($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST'))) 

Так ! применяются ко всему условию.

+0

+1 для деталей. –

0

Ваш '!' не применяется к выражению «AND» ... он применяется только к оператору ($ mysql_row ['guest_access'] == 'NO').

2

не оператор (!) Покрывает только первое условие, так как добавить еще один кронштейн, или сделать это

if ($mysql_row['guest_access'] != 'NO' AND... 
0

Вы только отрицая первое условие. Попробуйте следующее:

if (!($mysql_row['guest_access'] == 'NO' AND $_SESSION['user_level'] == 'GUEST')) { 
0

Ваш оператор отрицания не применяется, как ожидалось. Вы должны использовать что-то вроде:

if (! (($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST'))) 

if (! ($mysql_row['guest_access'] == 'NO') OR ! ($_SESSION['user_level'] == 'GUEST')) 
1

Сделать это следующим образом:

if (($mysql_row['guest_access'] != 'NO') AND ($_SESSION['user_level'] != 'GUEST')) { 
Смежные вопросы