在“if”语句中使用“or”


Use `or` inside an `if` statment

我不知道为什么这不起作用,在数据库字段中statuss,这是8。我从波纹管代码中获取输出You cannot do that!

if ( $o['statuss'] !== 1 || $o['statuss'] !== 8 ) {
  $ret['result_msg'] = 'You cannot do that!';
  die(json_encode($ret));
}

我已经尝试过,但无济于事:

if ( ($o['statuss'] !== 1) || ($o['statuss'] !== 8) )

如果我只离开if ( $o['statuss'] !== 8 )那么一切都像预期的那样工作。

我认为

它工作正常,但你解释错了。您的值为 8。所以你的表达实际上是:

if (8 !== 1 || 8 !== 8) {
    // ...
}

你的第一个表达式是 true ,因为 8 不等于 1,所以你得到: You cannot do that! 如预期的那样。

您需要一个 AND 表达式 ( && ),因为您希望在值不是 1 而不是 8 时显示错误消息。


看来你不太明白这里发生了什么,所以让我进一步解释一下。

让我们分别考虑 1 到 8 之间的所有数字的$o['statuss'] !== 1$o['statuss'] !== 8

  • 1 !== 1 => false1 !== 8 => true :因为1 !== 8您将看到消息。
  • 2 !== 1 => true2 !== 8 => true :因为2 !== 1您将看到该消息。
  • 3 !== 1 => true3 !== 8 => true :因为3 !== 1您将看到该消息。
  • 4 !== 1 => true4 !== 8 => true :因为4 !== 1您将看到该消息。
  • 5 !== 1 => true5 !== 8 => true :因为5 !== 1您将看到该消息。
  • 6 !== 1 => true6 !== 8 => true :因为6 !== 1您将看到该消息。
  • 7 !== 1 => true7 !== 8 => true :因为7 !== 1您将看到该消息。
  • 8 !== 1 => true8 !== 8 => false :因为8 !== 1您将看到消息。

看,你永远不会真正进入else分支(或者至少跳过if分支)。

现在,如果您使用 AND 运算符,让我们执行相同的操作:

  • 1 !== 1 => false1 !== 8 => true :您不会看到该消息,因为并非所有条件都true
  • 2 !== 1 => true2 !== 8 => true :您将看到该消息,因为它们都是true
  • 3 !== 1 => true3 !== 8 => true :您将看到该消息,因为它们都是true
  • 4 !== 1 => true4 !== 8 => true :您将看到该消息,因为它们都是true
  • 5 !== 1 => true5 !== 8 => true :您将看到该消息,因为它们都是true
  • 6 !== 1 => true6 !== 8 => true :您将看到该消息,因为它们都是true的。
  • 7 !== 1 => true7 !== 8 => true :您将看到该消息,因为它们都是true的。
  • 8 !== 1 => true8 !== 8 => false :您不会看到该消息,因为并非所有条件都true

你可以用in_array来做到这一点

if ( !in_array($o['statuss'], array(1,8)) )
{
    $ret['result_msg'] = 'You cannot do that!';
    die(json_encode($ret));
}

使用in_array就是说,如果$o['statuss']18不匹配,则抛出该错误

您直接从数据库中获取此内容(我猜),因此$o['statuss']很可能string(8)蚂蚁而不是int(8).

当你使用!==/===时,它是严格的比较,这意味着类型必须相同(8 === '8'是假的 - 8 == '8'不是)。改用!=/==来避免这种情况。

或者,将其转换为 int: $o['statuss'] = (int)$o['statuss'];

也就是说,if ( $o['statuss'] !== 1 || $o['statuss'] !== 8 )永远是正确的,好像它是 8,那么它就不会是 1,如果它是 1,那么它就不会是 8。如果两者都不是,那也是真的。您是否正在寻找&&运算符(意思是 AND)?

在此语句中:if ( $o['statuss'] !== 1 || $o['statuss'] !==

8 ) 第一部分的计算结果为 true ($o['statuss'] !== 1 = true)。因此,您会收到此消息。

通过扭转局面来解决它:

if ( $o['statuss'] == 1 || $o['statuss'] == 8 ) 
{
// do your thing
}
else
{
// You cannot do this
}