在`if`语句中使用`或`

时间:2013-10-15 10:20:14

标签: php conditional-statements

我不知道为什么这不起作用,在数据库字段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 个答案:

答案 0 :(得分:3)

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

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

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

您需要 AND 表达式(&&),因为您希望在值不是1 AND 而不是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

答案 1 :(得分: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']18不匹配,则会抛出该错误

答案 2 :(得分:0)

您直接从数据库中获取此信息(我在猜测),因此$o['statuss']最有可能是string(8)而不是int(8)

当您使用!== / ===时,strict comparison表示类型HAS相同(8 === '8'为false - 8 == '8'为不)。请改用!= / ==来避免这种情况。

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

那就是说,if ( $o['statuss'] !== 1 || $o['statuss'] !== 8 ) 总是是真的,好像它是8,那么它就不会是1,如果它是1然后它就不会是8.如果它们都不是,那么它也是真的。您在寻找&&运营商(意味着AND)吗?

答案 3 :(得分: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
}