PHP如果一个变量等于this或this


PHP If a variable equals this or this

我的PHP中有这个if语句:

if($_SESSION['usrName']!='test1'){
    header('location:login.php');
}

但我希望它是这样的:

if($_SESSION['usrName']!='test1' or 'user'){
    header('location:login.php');
}

但我不知道如何在PHP代码中做到这一点。我试过这个:

if($_SESSION['usrName']!='test1','user'){
    header('location:login.php');
}

这个:

if(($_SESSION['usrName']!='test1')||($_SESSION['usrName']!='user')){
    header('location:login.php');
}

有人能帮忙吗?

您必须将||替换为&&。因为您只想在两个条件都为true时重定向。

if(($_SESSION['usrName']!='test1') && ($_SESSION['usrName']!='user')){
    header('location:login.php');
}
if (!in_array($_SESSION['usrName'], array('test1', 'user')) {
    header('location:login.php');
}

这将检查变量$_SESSION['userName]是否不在字符串列表中,以简化其他允许的用户。

正如其他人所说,你需要小心你的布尔逻辑——(NOT X) || (NOT Y)等价于NOT (X AND Y),而你想要的是NOT (X OR Y),它等价于(NOT X) AND (NOT Y)

对于这种特殊情况,还有一些其他选项,尽管没有一个像您尝试的无效语法那样简洁。

首先,有in_array(),它很容易阅读,但如果你经常在长列表中使用它,它的效率就不是很高(对于这样的简单情况,不值得担心性能):

$allowed_users = array('test1', 'user');
if ( ! in_array($_SESSION['usrName'], $allowed_users ) { ... }

或者,您可以构建一个散列,其中用户名为;随着列表的增长,这会更加高效,因为PHP可以在不遍历整个列表的情况下检查密钥:

$allowed_users = array('test1' => true, 'user' => true);
if ( ! array_key_exists($_SESSION['usrName'], $allowed_users) ) { ... }
// Or, if you don't mind PHP raising a few notices about accessing undefined keys
if ( ! $allowed_user[ $_SESSION['usrName'] ] ) { ... }

最后,您可以使用一个switch语句,其中的标签贯穿始终,并使用一个充当"else"的default事例:

switch ( $_SESSION['usrName'] )
{
    case 'test1':
    case 'user':
        // These users are allowed :)
    break;
    default:
        header('location:login.php');
}

你选择使用哪一个(如果有的话)将取决于你对代码未来增长的预期,但它们是很有用的技巧。

您的最后一次尝试几乎是正确的。

然而。。。

if (var != something || var != something-else)

将永远是真的,因为其中一个条件将永远匹配。即使它等于一方,也不会等于另一方。

当你测试两个这样的阴性时,你需要使用AND(&&)而不是OR(||)。

if (($_SESSION['usrName']!='test1') && ($_SESSION['usrName']!='user'))

如果它不等于一个,并且也不等于另一个,这将匹配。

当前,您正在检查其中一个条件是否为真。如果其中任何一个条件正确,则最后一个条件将评估为true。我想你是想检查这两个条件是否都是真的。在这种情况下,您将需要&&而不是||

尝试:

if( ($_SESSION['usrName'] != 'test1') && ($_SESSION['usrName'] != 'user') ) {
    header('location:login.php');
}

您需要执行以下操作:

if($_SESSION['usrName'] != 'test1' and $_SESSION['usrName'] != 'user'){
    header('location:login.php');
}

你的第一次尝试相当于:

if(($_SESSION['usrName']!='test1') or 'user'){
    header('location:login.php');
}

第二个似乎是无效的语法

第三个几乎是正确的,您只需要用and&&替换||,因为任何东西都不等于"user"或"test1"