我的网站需要登录才能根据用户建立权限。在网站的照片列表中,如果用户只有访客访问权限,我必须确定是否会显示特定的照片。所以我认为这个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 :(得分:6)
你的第一个是
if (!($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST'))
实际解释如下:
if (
(!($mysql_row['guest_access'] == 'NO'))
AND ($_SESSION['user_level'] == 'GUEST')
)
!
仅适用于第一个条件,而不是两个条件,因为它的优先级高于AND(请参阅Operator Precedence)
你的病情可能应该用一些额外的括号重写:
if (!(($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')))
因此!
适用于整个条件。
答案 1 :(得分:2)
逻辑非操作需要应用于AND结果,但在您的代码示例中,它仅应用于第一个子句(NOT的优先级高于AND)。您可以通过对两个条件进行分组来解决它:
if (!(($mysql_row['guest_access'] == 'NO' AND ($_SESSION['user_level'] == 'GUEST'))) {
答案 2 :(得分:2)
not运算符(!)仅涵盖第一个条件,因此要么添加另一个括号,要么执行此操作
if ( $mysql_row['guest_access'] != 'NO' AND...
答案 3 :(得分:1)
这是因为你把括号放在第一个版本的错误位置。第二个版本的等效形式是
if (!$is_private_photo AND $is_guest)
这显然不是你想要的。
答案 4 :(得分:1)
像这样:
if (($mysql_row['guest_access'] != 'NO') AND ($_SESSION['user_level'] != 'GUEST')) {
答案 5 :(得分:0)
你的'!'没有被应用于'AND'语句......它只被应用于($ mysql_row ['guest_access'] =='NO')语句。
答案 6 :(得分:0)
你只是否定了第一个条件。试试这个:
if (!($mysql_row['guest_access'] == 'NO' AND $_SESSION['user_level'] == 'GUEST')) {
答案 7 :(得分:0)
您的否定运算符未按预期应用。你应该使用类似的东西:
if ( ! (($mysql_row['guest_access'] == 'NO') AND ($_SESSION['user_level'] == 'GUEST')) )
if ( ! ($mysql_row['guest_access'] == 'NO') OR ! ($_SESSION['user_level'] == 'GUEST') )