【问题标题】:Logical operators in phpphp中的逻辑运算符
【发布时间】:2014-11-22 18:08:22
【问题描述】:

我不明白这个。如果设置了 $_GET['action'] 并且操作不是“登录”或不是“消息”,我想要 doAction()。

我的非工作代码:

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" || $_GET['action'] !== "messages") )     {
   doAction();
}

如果我删除 ||它有效。

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login") ) {
   doAction();
}

有什么提示吗?

【问题讨论】:

  • a !== b 表示 a 不 等于 b
  • 是的。笔误,对不起。请查看我编辑的帖子。
  • 很奇怪的逻辑运算。
  • 你检查action 的 testin 值是多少?

标签: php php-5.4


【解决方案1】:

好的,让我们检查您的if 语句的执行情况:

  1. 假设,动作是 some_action 那么 isset($_GET['action']) true 和 $_GET['action'] !== "login" 是 true

由于 php 具有延迟执行(true 和 true 是 true),比较停止并且您的 doAction 执行,很好,正是我们需要的。

  1. 假设,动作是登录 那么 isset($_GET['action']) true 和 $_GET['action'] !== "login" 是 false 并且 $_GET['action'] !== "messages" 是 true (因为 login 绝对不是 messages强>)。所以 (true and (false or true)) 是true!

  2. 最后假设,动作是消息 那么isset($_GET['action']) true 和$_GET['action'] !== "login" 是true。考虑到延迟执行,您的 doAction 会再次运行。

好的!看起来doAction 将永远有效!

问题的解决方法是在你的if 中使用and (&&) 而不是or (||)

if (isset($_GET['action']) 
    && ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ) 
    // that should work properly!

【讨论】:

    【解决方案2】:

    您正在使用“不等于”运算符 (!==)。如果要测试值 是 login 还是 messages,则应使用 == 运算符:

    if ( isset($_GET['action']) && 
         ($_GET['action'] == "login" || $_GET['action'] == "messages") ) {
       doAction();
    }
    

    【讨论】:

    • 是的,我在原帖中有错字。对于那个很抱歉。请查看我编辑的帖子。
    【解决方案3】:
    if ( isset($_GET['action']) && 
         ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ) {
       doAction();
    }
    

    【讨论】:

    • 我使用了不等于运算符,因为问题是如果设置了 $_GET['action'] 并且操作不是“登录”或不是“消息”,并且在上面的代码条件中检查是否设置了操作并且操作是登录或消息而不是做某事..
    • 所以编辑你的答案以包含它。我相信@u_mulder 得到的是关于 StackOverflow 的完整答案应该包括固定代码和固定代码如何工作和/或问题中的代码为什么不起作用的解释。
    【解决方案4】:

    在 PHP 中使用 || 测试条件时,PHP 将按照条件的编写顺序对其进行测试,如果其中一个为真,则整个条件的计算结果为真。这意味着对于您的代码,如果 $_GET['action'] 的值为 'messages',则条件将评估为 true:

    if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ){
       doAction();
    }
    

    因为当解释器评估 $_GET['action'] !== "login" 并且 $_GET['action'] 的值为 'messages' 时,评估的结果为真,因此if 块将被执行。我建议您将代码更改为:

    if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ){
       doAction();
    }
    

    ||改成 && 表示 $_GET['action'] 的值不能是 'login' 也不能是 'messages'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多