我的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"