2009-12-23 64 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 2009-12-23 16:14:37

+0

谢谢大家的快速反应。我想我没有想太多。详情请致电 – Lonn 2009-12-23 17:48:26

回答

2

逻辑非操作需要应用于AND结果,但是在您的代码示例中,它仅应用于第一个子句(NOT具有比AND更高的优先级)。您可以通过分组两个条件解决这个问题:

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。 – 2009-12-23 16:18:41

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')) {