为什么 'if statement' 忽略条件或将它们读取为好像它们实际上不是真的?

Why does 'if statement' ignores conditions or reads them as if they are not true when they actually are?

我偶然发现了一些让我非常困难的事情,我无法弄清楚,请看看我的情况并帮助我...

我正在编写一个代码,该代码应该可以防止某些网站用户访问网站的特定部分 orders.php

每个用户都有一个先前分配的角色,我试图通过只允许少数角色访问它来实现此限制,因此如果您没有允许访问该网站的某些特定角色分配给您,您将被重定向到主页。

这是我尝试过的方法之一

    if( $userrole !== 'Administrator' OR
        $userrole !== 'Manager' OR
        $userrole !== 'Product Hunter' OR
        $userrole !== 'Product Selector' OR
        $userrole !== 'Analytic' OR
        $userrole !== 'Order Manager'){
        header('Location: ../dashboard.php');
        die;
    }
    else{
     //code here
    }

我尝试使用 || 而不是 OR,但它也不起作用

我还尝试对每个角色使用 elseif 语句,如下所示:

if( $userrole !== 'Administrator'){
        header('Location: ../dashboard.php');
        die;
    }
    elseif( $userrole !== 'Manager'){
        header('Location: ../dashboard.php');
        die;
    }
    elseif( $userrole !== 'Product Hunter'){
        header('Location: ../dashboard.php');
        die;
    }
    elseif( $userrole !== 'Product Selector'){
        header('Location: ../dashboard.php');
        die;
    }
    elseif( $userrole !== 'Analytic'){
        header('Location: ../dashboard.php');
        die;
    }
    elseif( $userrole !== 'Order Manager'){
        header('Location: ../dashboard.php');
        die;
    }
   else{
    //code goes here
   }

据我了解,代码将在读取您的角色名称时继续执行 else 语句,例如,如果您是管理员,那么它将执行 else 语句,因为据说如果你不是一些指定的角色然后你将被重定向并且因为你是指定的角色之一然后代码将为你执行但是出于某种奇怪的原因,无论您是管理员、经理还是访客,它都会将您重定向到主页...

代码允许您访问网站而不是将您重定向到主页的唯一方法是当您只指定一个角色时,例如:

    if( $userrole !== 'Administrator'){
        header('Location: ../dashboard.php');
        die;
    }else{
     //code goes here
    }

这样,如果您是管理员,则可以访问该页面,如果您具有任何不同的角色,则会被重定向。

之所以使用!==是因为我希望代码在开始时就定义这个用户是否可以访问网站的这一部分,而不是告诉它向具有这几个特定的​​用户显示代码角色并重定向其他所有人。

$userrole 之前设置为等于 $_SESSION 变量,该变量包含用户实际角色的值并在登录时定义,如果我回显它,它会打印用户的名称角色,这样肯定不会导致问题。

我发现一些建议使用 switch 语句的帖子,但我还没有尝试过,因为如果可能的话我更喜欢这样做。

提前致谢!

您需要使用 and 运算符。如果用户没有这些角色,您将重定向到仪表板

if( $userrole !== 'Administrator' &&
    $userrole !== 'Manager' &&
    $userrole !== 'Product Hunter' &&
    $userrole !== 'Product Selector' &&
    $userrole !== 'Analytic' &&
    $userrole !== 'Order Manager'
){
    header('Location: ../dashboard.php');
    die;
}
else{
    //code here
}

我想你想这样做,因为如果用户没有必需的角色,你想限制这个页面:

if( $userrole !== 'Administrator' &&
    $userrole !== 'Manager' &&
    $userrole !== 'Product Hunter' &&
    $userrole !== 'Product Selector' &&
    $userrole !== 'Analytic' &&
    $userrole !== 'Order Manager'){
    header('Location: ../dashboard.php');
    die;
}
else{
 //code here
}

我认为更好的方式:

$aAllowedRoles = array(
    'Administrator', 
    'Manager', 
    'Product Hunter', 
    'Product Selector', 
    'Analytic', 
    'Order Manager'
);

if ( !in_array($userrole, $aAllowedRoles) ) {
    header('Location: ../dashboard.php');
    die;
} 

// code here

$userrole是一回事,所以它只能等于一件事,这意味着它将不等于其他所有东西。

因此,当您使用 !== 将其与一组事物进行比较时,这些比较中只有一个可能是错误的。当您通过使用 OR|| 连接一组表达式来构造布尔表达式时,只有一个内部表达式必须为真才能使整个表达式为真。

举个具体的例子,其中$userrole = 'Administrator'.

$userrole !== 'Administrator' 将为假,但 $userrole !== 'Manager' 和所有其他比较将为真。所以表达式变成

if( false OR
    true OR
    true OR
    true OR
    true OR
    true){
    header('Location: ../dashboard.php');
    die;
}

这简化为

if (true){
    header('Location: ../dashboard.php');
    die;
}

同样处理您的 elseif 方法。只有一个 elseif 可能为假。

其他答案已经为其他方法提供了一些好的想法。我只是想添加更多解释。 (我个人会使用 in_array 方法之一。)