在PHP中使用IF语句的奇怪行为

时间:2012-04-03 14:03:01

标签: php

我注意到我的脚本中有一些奇怪的行为,不知道为什么会出现这种行为。

if ($date != 'NOW()' ||  $date != 'NULL')
{
   // throw error      
} else {
   // run functions
}

我在我的一个函数中有一个类似于上面的IF语句,我从我的函数传递值'NULL',它正在接收。但是在与IF语句进行比较时,它不起作用。它总是跳过其他声明。

更新
下面是我的函数的完整代码,我希望它有所帮助。

public function setLastLoginDate( $date )
{
    if (isset($date) && !empty($date))
    {
        if ($date != 'NOW()' ||  $date != 'NULL' || is_datetime(convertDateTimeToSql($date)) == false)
        {
            $this->errors['user_last_login'] = 'invalid date specified.';
        } else {
            this->properties['user_last_login'] = $date;
        }
    }
}

最后更新
使用&&确实工作而不是||,但我从来没有打算使用&&amp ;. 如果这就是它的假设那么我想我必须重新阅读。

不是&&检查两个变量是否返回true? 像if (is_string($foo) && strlen($foo) > 1)? 但我想检查变量是否包含任何值

但这对我来说也很有用:

if ( $date == 'NOW()' ||  $date == 'NULL' || is_datetime(convertDateTimeToSql($date)) == true )
{
    $this->properties['user_last_login'] = $date;
} else {
    $this->errors['user_last_login'] = 'invalid date specified.';
}

进行了一些测试及其工作,因为我想要它与上述。 上面使用它有什么问题吗?

由于

7 个答案:

答案 0 :(得分:6)

您询问条件不是值而不是其他值,这将始终返回true。可能你想使用代替(&&而不是||)。

答案 1 :(得分:4)

您的语句永远不会解析为false,因为字符串不能是两个不同的东西。条件为&&

所以你的陈述看起来像这样:

if( $date! = 'NOW()' && $date != 'NULL' ){
   // run functions
}else{
   // throw error
}

答案 2 :(得分:4)

检查您的if语句条件。你确定要比较那样吗?在我看来,date不能同时是'NOW()'和'NULL',这意味着你的if语句总是会成真。

还添加一些括号。

也许这更好?

if (($date != 'NOW()') && ($date != 'NULL'))
{
   // run functions
} else {
   // throw error
}

答案 3 :(得分:2)

你说if总是直接跳到 else 但是脚本的部分无法运行。原因是,正如其他人所指出的那样,你使用 OR ,你应该使用 AND 。 $ date变量永远不能同时为'NULL'和'NOW()',这意味着 if 将始终返回true并执行“无效日期”部分。

原因如下:

$date = 'NULL'

检查分三步完成(这些步骤可能不正确),

A:

$date != 'NOW()' // This returns true because $date is 'NULL'

B:

$date != 'NULL' // This returns false because $date is not 'not equal' to 'NULL'

C:

if (A || B) // If either one or both A and B is true then this is true.
            // Since $date can never be both NULL and NOW() at the same time
            // one of A or B is guaranteed to be true so the if() will always return true.

您需要的是:

C:

if (A && B) // If BOTH A and B are true then this is true.

答案 4 :(得分:1)

if ($date != 'NOW()' || $date != 'NULL')

这种逻辑捕获了一切。你确定它正在跳过else吗?事实上永远不会使用else; $date永远不能与'NOW()''NULL'相等。

答案 5 :(得分:0)

除了你||条件if之外,&&条件可能else检查它是否真正跳转到else部分。那是不可能的。

在您的伪代码中,您提到您在if部分中抛出错误,但这与您稍后发布的实际代码不符。在else之后,您有错误部分。

也许你刚刚交换了这一行,你仍然认为它会转到{{1}}部分。

答案 6 :(得分:-2)

NOW()是一个mysql函数,而不是PHP函数。同时删除引号。