2012-04-03 10 views
1

私のスクリプトでは奇妙な振る舞いに気づいています。PHPのIF文を使った奇妙な振る舞い

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

私は私の機能の一つで、上記と同様のIF文を持って、私はそれがうまく受信している私の関数から値'NULL'を渡します。しかし、IF文との比較を行うときには機能しません。常にelse文にスキップします。

UPDATE:以下
私はそれが役に立てば幸い、私の関数の完全なコードです。 & &を使用して

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; 
     } 
    } 
} 

LAST UPDATE
代わりに||の作業を行いますが、私は& &を使用することを意図することはありません。 それは私がそれについて再読しなければならないと思われる方法であるならthatsです。

& &は、2つの変数が真を返すかどうかをチェックしませんか? のように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.'; 
} 

は、いくつかのテストとその作業をしました。 上記のように何か問題がありますか?文字列は、2つの異なるものにすることはできませんので

おかげ

+0

が、私は基本的にここに文字列を代入し、それを文字列に比較しています。これはうまくいくが、理由は不明だ。私は、日付変数が '' NOW() ''という文字列であるかどうかをチェックしています。スクリプトの値が必要だとわかったら、この値を渡します。何をすべきかは変数に値 '' NOW() 'を代入することです。後で準備関数を実行します。データベースフィールド 'date'に値を代入すると、mysql関数' 'NOW()''をそれに送ります。 – Zubair1

+0

btw、私は別の機能で同様の動作をしています。しかし、それは何らかの未知の理由でうまくいっています。 – Zubair1

+0

は、より説明しやすくするために、より多くのコードで更新されています。 – Zubair1

答えて

6

条件は、これは常にtrueを返します、値ない別の値でない場合は、尋ねます。おそらくを代わりに使用したかったでしょうか(||の代わりに& &)。

+0

$ date変数が 'this'か' that'であるかどうかチェックしたいと思います。 – Zubair1

+0

@ Zubair1 - 代わりに、$ dateが 'not this 'か' not that'かどうかをチェックします。 – martinstoeckli

+1

@ Zubair1 - あなたのアップデートを見た後、あなたは本当に 'または'を使用したかったと思います。しかし、あなたは '=='で平等をチェックし、 '!='で不等式をチェックしないでください。 – martinstoeckli

4

あなたの文はfalseに解決されることはありません。条件を&&にします。

だからあなたの文は次のようになります:

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

は私がNULLの比較は致しておりません条件とテストは – Zubair1

+0

が次に各' 'ダイ(「テスト」)で、それをデバッグ「)(NOW」'渡ししようとした場合でも、その文字列の比較、その同じことを気づいていない場合 –

-2

NOW()は、MySQLの機能ではなく、PHPの一つです。また、引用符を削除します。

+0

私はMySQLのクエリを準備する関数でこれをやっている。 – Zubair1

+0

@ zubair1 - あなたは**ダウンボートを説明するために気をつけてください。この情報を質問自体に入れることはあなたの責任ではありませんか?私はあなたの気持ちを読んでくれると期待していますか? –

+0

私は無礼ではありませんが、可能な限り詳細を提供しましたが、あなたは 'NOW()'がmysql関数私は明らかにそれを文字列で使用しています。mysql関数の文字列を表示しているかどうかは関係ありません。明示的にすべてを読んでいないか、理解していません。 – Zubair1

4

if文の条件を確認してください。あなたはその方法を比較してもよろしいですか?私が見ているように、dateは 'NOW()'と 'NULL'を同時に指定することはできません。つまり、if文が常にtrueになります。

また、かっこを追加します。

おそらくこれは良いですか?

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

私は基本的にここに文字列を割り当て、それを文字列と比較しています。これはうまくいくが、理由は不明だ。私は、日付変数が '' NOW() ''という文字列であるかどうかをチェックしています。スクリプトの値が必要だとわかったら、この値を渡します。何をすべきかは変数に値 '' NOW() 'を代入することです。後で準備関数を実行します。データベースフィールド 'date'に値を代入すると、mysql関数' 'NOW()''をそれに送ります。 – Zubair1

1

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

このロジックはすべてをキャッチ。 elseにスキップしてもよろしいですか?実際にはは決してを使用してください。else; $dateは、'NOW()''NULL'の両方に決して等しいことはありません。

0

さらに||あなたはifの状態にあるかもしれません。これはおそらく&&である必要があります。実際にはelse部分にジャンプしてください。それは可能ではありません。

は、あなたの擬似コードでは、あなたが else部分でエラーを投げるが、それはあなたが後で投稿あなたの実際のコードに対応していないと述べました。そこに ifの直後にエラー部分があります。

たぶん、あなたはちょうどこのラインを入れ替えて、あなたはまだそれがelse部分に行くと思います。

2

ifは常にに、それ以外の場合はに直接スキップしますが、スクリプトの一部が実行される方法はありません。他の人はあなたがを使用する必要がありますORを使用している、指摘したような理由で、あります。 $ date変数は 'NULL'と 'NOW()'の両方に同時に指定することはできません。つまり、が常にtrueを返し、「無効な日付」の部分を実行する場合はを意味します。

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

B:

チェックが効果的に3つの段階(これらが正しい順序でないかもしれません)、

Aで行われ

$date = 'NULL' 

:なぜここに

です

$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.