0

我不知道为什么这不起作用,在数据库字段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 ),那么一切都会像预期的那样工作。

4

4 回答 4

3

我认为它工作正常,但你解释错了。你的价值是8。所以你的表达其实是:

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

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

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


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

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

  • 1 !== 1=> false, 1 !== 8=> true: 因为1 !== 8你会看到消息。
  • 2 !== 1=> true, 2 !== 8=> true: 因为2 !== 1你会看到消息。
  • 3 !== 1=> true, 3 !== 8=> true: 因为3 !== 1你会看到消息。
  • 4 !== 1=> true, 4 !== 8=> true: 因为4 !== 1你会看到消息。
  • 5 !== 1=> true, 5 !== 8=> true: 因为5 !== 1你会看到消息。
  • 6 !== 1=> true, 6 !== 8=> true: 因为6 !== 1你会看到消息。
  • 7 !== 1=> true, 7 !== 8=> true: 因为7 !== 1你会看到消息。
  • 8 !== 1=> true, 8 !== 8=> false: 因为8 !== 1你会看到消息。

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

现在,如果您使用AND运算符,我们也这样做:

  • 1 !== 1=> false, 1 !== 8=> true:您不会看到该消息,因为并非所有条件都满足true
  • 2 !== 1=> true, 2 !== 8=> true:您将看到该消息,因为它们都是true.
  • 3 !== 1=> true, 3 !== 8=> true:您将看到该消息,因为它们都是true.
  • 4 !== 1=> true, 4 !== 8=> true:您将看到该消息,因为它们都是true.
  • 5 !== 1=> true, 5 !== 8=> true:您将看到该消息,因为它们都是true.
  • 6 !== 1=> true, 6 !== 8=> true:您将看到该消息,因为它们都是true.
  • 7 !== 1=> true, 7 !== 8=> true:您将看到该消息,因为它们都是true.
  • 8 !== 1=> true, 8 !== 8=> false:您不会看到该消息,因为并非所有条件都满足true
于 2013-10-15T10:24:57.307 回答
1

你可以用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']不匹配1或者8然后抛出该错误

于 2013-10-15T10:26:33.177 回答
0

您是直接从数据库中获取的(我猜),所以$o['statuss']很可能是string(8)ant not int(8)

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

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

也就是说,if ( $o['statuss'] !== 1 || $o['statuss'] !== 8 )永远是真的,如果它是 8,那么它就不是 1,如果它是 1,那么它就不是 8。如果它们都不是,那么它也是真的。您在寻找&&运算符(意​​思是 AND)吗?

于 2013-10-15T10:22:43.600 回答
0

在这个语句中: if ( $o['statuss'] !== 1 || $o['statuss'] !== 8 ) 第一部分评估为真 ($o['statuss'] !== 1 =真的)。因此,您会收到此消息。

通过扭转局面来解决它:

if ( $o['statuss'] == 1 || $o['statuss'] == 8 ) 
{
// do your thing
}
else
{
// You cannot do this
}
于 2013-10-15T10:23:57.367 回答