PHP如果一个变量等于这个或那个

3

我在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');
}

And this:

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

可以有人帮忙吗?

2
你的最后一次尝试是正确的。 - Brad
2
@Brad 不完全是这样的,为了得到正确的结果需要使用逻辑运算符 &&。 - StephenTG
2
@Brad,实际上这是不正确的,因为使用OR条件它总是会评估为TRUE。任何给定的字符串将始终不等于test1或不等于user - Mike Brant
1
我猜Brad(和他的点赞者)认为这是“==”,因为在代码中测试“!=”特定用户名是一件相当不寻常的事情。我自己也不得不再次查看。 - Izkata
1
@StephenTG,是的,我打字太快了。我一发布就立刻修正了它,但你比我更快地发现了它。(插入胸口抽搐和临终挣扎声。)无论如何+1。 - lostphilosopher
显示剩余5条评论
6个回答

9
你需要将||替换为&&。因为只有当两个条件都为真时,才会重定向。
if(($_SESSION['usrName']!='test1') && ($_SESSION['usrName']!='user')){
    header('location:login.php');
}

1
@Danbyization:太好了。当15分钟的计时器结束时,如果您将一个正确答案标记为正确答案,那将是非常棒的。 - Tobias Golbs

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

这段代码检查变量 $_SESSION['usrName'] 是否不在字符串列表中,以简化允许其他用户访问的操作。


不确定为什么这个回答会被踩 - 它可能不是很高效,但它会检查会话变量是否等于测试字符串中的任何一个。 - IMSoP
我是其中一个投反对票的人 - 这是因为没有尝试指出不同之处或者解释答案。 - jcsanyi
5
我理解你的想法,虽然你不解释你的反对意见以帮助 Faisal 改进回答,这可能被认为是虚伪的。 - IMSoP
1
我同意我可能应该更主动地要求用户改进他们的答案。然而,当面对一堵相似答案的墙时,我发现将那些只是代码的答案移到底部有助于找到更好的答案。如果答案得到改进,我会尝试记得回来检查并取消踩的操作(就像在这种情况下所做的那样)。 - jcsanyi

4
正如其他人所说,您需要小心使用布尔逻辑 - (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语句,并使其具有“穿透”效果,而default案例则充当“其他情况”:

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

这些技巧与代码未来的增长有关,你可以根据需要选择使用其中的任何一个。这些技巧非常实用易懂。

1
非常详细的解释和选项清单,点个赞。我特别喜欢开头关于布尔型否定的概述。 - jcsanyi
真正理解布尔代数的重要性是多么惊人啊。我甚至在规划 PHP 代码时会涂鸦卡诺图... - IMSoP

2
你的最后一次尝试几乎正确。
但是...
if (var != something || var != something-else)

这总是成立的,因为其中一个条件总是会匹配。即使它等于一侧,它也不会等于另一侧。

当你测试两个负值时,需要使用 AND (&&) 而不是 OR (||)。

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

这将匹配不等于一个 并且 不等于另一个的情况。

1
你需要做类似以下的事情:
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'


1

目前,你正在检查这两个条件中的任意一个是否为真。如果这两个条件中有一个是正确的,最后一个条件会被评估为真。我猜你想检查这两个条件是否都为真。在这种情况下,你需要使用 && 而不是 ||

尝试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接