2009-07-24 11 views
4
if($country == 224 || $country == 223 || $country == 39 && $zip == ''){ 
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode"; 
    header("location: $SITE_PATH?p=account.profile.name"); 
    exit; 
} 
 
variable value 
-------- ----- 
$country  224 
$zip  11111 

場合、私は$zipが空でないことを知っているが、それがあるかのようにコードが実行されます。私はそれが値を持っていることを確認するデバッグステートメントでブラウザにそれを印刷します。奇妙なPHPの文の問題

$zipに値がない場合、私のプログラムが動作する原因は何ですか?

答えて

26

&&演算子は、||演算子よりも高いprecedenceです。だからあなたの表現は以下のようになります。

$country == 224 || $country == 223 || ($country == 39 && $zip == '') 

ソリューション:

($country == 224 || $country == 223 || $country == 39) && $zip == '' 
+9

私が追加することになりますオペレータの優先順位を覚えていれば、プログラマはこれを中継すべきではありません。仲間が優先順位を誤って解釈すると、維持管理が困難なバグが導入される可能性があります。私のアドバイスは、曖昧さを解消するために括弧を使用して、あなたの同僚を一見して書くことに自信を持たせることです。 – Eineki

0

これに変更するとどうなりますか?

if($country === 224 || $country === 223 || $country === 39 && $zip === ''){ 
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode"; 
    header("location: $SITE_PATH?p=account.profile.name"); 
    exit; 
} 

種類の変数のは、ここで問題を引き起こしている場合、私は好奇心、===は値変数の型の両方を比較します。

15

操作に括弧を使用して試しましたか?

($country == 22 || $country == 223 || $country == 39) && ($zip == '') 
0

はい...しかし正しい値のいずれかに設定されていますか?国は224または223または39で、zipは空文字列ですか?私は強調したい、ジップは "空の"文字列== ''です。

5

& &は||よりも高いオペレータも優先を持っていますので、あなたが効果的に言っている:

if($country == 224 || $country == 223 || ($country == 39 && $zip == '')) 
9

問題がorder in which PHP checks your boolean operatorsです。最初にそれは条件を見て、それからORと思っています:ああ、そうです!条件が満たされている。なぜ私はこの物の残りの部分を読んで実行しなければならないのですか?

実際これは機能です。

if (something_probable() OR something_very_expensive_to_compute()) 

次に、最初のテストがすでにテストに合格していれば、2番目のものを評価しない方がいいです。

は、括弧を使用してみてください:

if (($country == 224 || $country == 223 || $country == 39) && $zip == ''){ 

乾杯、

+0

おかげで私はこれを知らなかったし、これは何か知っているのはとても良いことのようだ! 私の問題のために働いていたのは – JasonDavis

+0

よろしいですか?回答のいずれかを受け入れることを忘れないでください(GumboとGortokが原則的に同じ回答をしています。私は誰が最初の人か分かりません)。 – Boldewyn

+0

運転席のディストリビューターに感謝しますか? – Boldewyn

5

私が最初に答えを好きで、とにかくないより読みやすくなりますコンパイラ場合、または:

<?php 

$need_zip_code = array(224, 222, 332, 222/* etc....*/); 

if (in_array($country, $need_zip_code) && $zip === '') { 
// do your stuff.... 
} 


?>