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

和这个:

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

有人可以帮忙吗?

4

6 回答 6

9

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

if(($_SESSION['usrName']!='test1') && ($_SESSION['usrName']!='user')){
    header('location:login.php');
}
于 2013-07-30T18:19:00.263 回答
9
if (!in_array($_SESSION['usrName'], array('test1', 'user')) {
    header('location:login.php');
}

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

于 2013-07-30T18:20:18.977 回答
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充当“else”的案例:

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

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

于 2013-07-30T18:37:42.340 回答
2

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

然而...

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

...将始终为真,因为其中一个条件将始终匹配。即使它等于一侧,也不会等于另一侧。

当您像这样测试两个底片时,您需要使用 AND ( &&) 而不是 OR ( ||)。

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

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

于 2013-07-30T18:21:05.720 回答
1

您需要执行以下操作:

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

你的第一次尝试相当于:

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

第二个似乎是无效的语法

第三个几乎是正确的,您只需要替换||andor &&,因为任何内容都不等于 'user' 或 'test1'

于 2013-07-30T18:18:52.630 回答
1

目前,您正在检查任一条件是否为真。如果任一条件正确,最后一个条件将评估为真。我假设您正在尝试检查这两个条件是否都为真。在这种情况下,您需要&&代替||.

尝试:

if( ($_SESSION['usrName'] != 'test1') && ($_SESSION['usrName'] != 'user') ) {
    header('location:login.php');
}
于 2013-07-30T18:19:06.270 回答