Почему «оператор if» игнорирует условия или читает их так, как будто они не соответствуют действительности, когда они действительно существуют? - PullRequest
1 голос
/ 19 февраля 2020

Я наткнулся на что-то, что вызывает у меня действительно тяжелое время, и я не могу понять это, поэтому, пожалуйста, посмотрите на мою ситуацию и помогите мне ...

Я пишу код, который Предполагается, что некоторые пользователи сайта не смогут получить доступ к определенной c части сайта, называемой заказами. php

Каждый пользователь имеет ранее назначенную роль, и я пытаюсь добиться этого ограничения, разрешив только несколько ролей для доступа к нему, поэтому, если у вас нет определенных c ролей, которым разрешено посещать назначенный вам сайт, вы будете перенаправлены на домашнюю страницу.

Это одна из из способов, которые я пробовал

    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
    }

Таким образом, если вы являетесь администратором, вам разрешено посещать страницу, и если у вас есть другая роль тогда вы будете перенаправлены.

Причина, по которой я использую !==, заключается в том, что я хочу, чтобы код определял, может ли этот пользователь посещать эту часть веб-сайта в начале, вместо того, чтобы указывать ему показывать код пользователям. с этими несколькими c ролями и перенаправлением всех остальных.

$userrole ранее было установлено равным переменной $_SESSION, которая ch содержит значение фактической роли пользователя и определяется при входе в систему; если я его повторю, он печатает имя роли, чтобы точно не вызывать проблему.

Я нашел некоторые посты, предлагающие использовать операторы switch, но я еще не пробовал их, так как я предпочитаю делать это таким образом, если это возможно.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 19 февраля 2020

Я думаю, что вы хотите сделать это, потому что вы хотите ограничить эту страницу, если у пользователя нет требуемой роли:

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 голосов
/ 20 февраля 2020

$userrole - это одна вещь, поэтому она может быть равна только одной вещи, что означает, что она будет не равна всему остальному.

Поэтому, когда вы сравниваете ее с множество вещей, использующих !==, только одно из этих сравнений может быть ложным. Когда вы создаете логическое выражение, подключая набор выражений, используя OR или ||, тогда только одно из внутренних выражений должно быть истинным, чтобы все выражение было истинным.

Примите спецификацию c пример, где $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. Только один из остальных может быть ложным.

Другие ответы уже предложили несколько хороших идей для других способов сделать это. Я просто хотел добавить немного больше объяснений. (Лично я бы go использовал один из методов in_array.)

1 голос
/ 19 февраля 2020

Вам необходимо использовать оператор 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
}
...