【问题标题】:Why does 'if statement' ignores conditions or reads them as if they are not true when they actually are?为什么“if 语句”会忽略条件或将它们视为不真实的条件,而实际上它们是不真实的?
【发布时间】:2020-06-04 03:08:34
【问题描述】:

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

我正在编写一个代码,旨在防止某些网站用户访问网站的特定部分,称为 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 语句,但我还没有尝试过,因为如果可能的话,我更喜欢这样做。

提前致谢!

【问题讨论】:

    标签: php if-statement logical-operators


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      $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 方法之一。)

      【讨论】:

      • 感谢您的澄清,您帮助我更好地理解了?
      【解决方案3】:

      您需要使用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
      }
      

      【讨论】:

      • 请添加您的解决方案的一些解释。
      猜你喜欢
      • 2022-11-27
      • 2016-10-03
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多