我不明白这一点。如果设置了 $_GET['action'] 并且操作不是"登录"或不是"消息",我想做 Action()。
我的非工作代码:
if ( isset($_GET['action']) && ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ) {
doAction();
}
如果我删除||它有效。
if ( isset($_GET['action']) && ($_GET['action'] !== "login") ) {
doAction();
}
有什么提示吗?
好的,让我们检查一下您的if
语句的执行情况:
- 假设,行动是some_action那么
isset($_GET['action'])
真的,$_GET['action'] !== "login"
是真的
由于 php 具有延迟执行(true
并且true
true
),比较停止并且您的doAction
执行,很好,正是我们所需要的。
-
假设,操作是登录那么
isset($_GET['action'])
真的,$_GET['action'] !== "login"
是假的,$_GET['action'] !== "messages"
是真的(因为登录绝对不是消息)。所以(true
和(false
或true
))是true
! -
最后假设,行动就是消息那么
isset($_GET['action'])
真的,$_GET['action'] !== "login"
是真的。考虑到延迟执行,您的doAction
会再次运行。
好!看起来doAction
将永远有效!
解决此问题的方法是在if
中使用and (&&)
而不是or (||)
if (isset($_GET['action'])
&& ($_GET['action'] !== "login" && $_GET['action'] !== "messages") )
// that should work properly!
您正在使用"不等于"运算符(!==
)。如果要测试该值是login
还是messages
,则应使用 ==
运算符:
if ( isset($_GET['action']) &&
($_GET['action'] == "login" || $_GET['action'] == "messages") ) {
doAction();
}
if ( isset($_GET['action']) &&
($_GET['action'] !== "login" || $_GET['action'] !== "messages") ) {
doAction();
}
当使用 ||| 在 PHP 中测试条件时,PHP 将按照条件的编写顺序测试条件,如果其中一个为真,则整个条件的计算结果为 true。这意味着,对于您的代码,如果 $_GET['action'] 的值是 'messages',则条件的计算结果为 true:
if ( isset($_GET['action']) && ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ){
doAction();
}
因为当解释器计算 $_GET['action'] !== "login" 并且 $_GET['action'] 的值是 'messages' 时,该求值的结果为 true,因此 if 块中的代码将被执行。我建议您将代码更改为:
if ( isset($_GET['action']) && ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ){
doAction();
}
|| 更改为 &&,这意味着 $_GET['action'] 的值不能是"登录",也不能是"消息"。