奇怪的php if语句问题

时间:2009-07-24 19:29:16

标签: php conditional

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不是空的,但代码执行就像它一样。我甚至在调试语句中将其打印到浏览器以验证它是否具有值。

是什么导致我的程序表现得好像$zip没有值?

7 个答案:

答案 0 :(得分:26)

&&运算符的precedence运算符高于||运算符。所以你的表达式等于:

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

解决方案:

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

答案 1 :(得分:15)

您是否尝试过使用括号命令操作?

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

答案 2 :(得分:9)

问题是order in which PHP checks your boolean operators。首先它看到一个条件,然后是一个OR,它认为:哎呀,是的!条件得到满足。我为什么要费心阅读并执行剩下的这些东西?

实际上,这是一个功能。想想这个星座:

if (something_probable () OR something_very_expensive_to_compute ())

如果第一个已经通过测试,那么很好的PHP不评估第二个。

尝试使用括号:

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

干杯,

答案 3 :(得分:5)

&安培;&安培;运算符优先级高于|| ,所以你实际上在说:

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

答案 4 :(得分:5)

我喜欢第一个答案,但无论如何都不会更具可读性:

<?php

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

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


?> 

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

我很好奇如果变量的类型导致问题,===会比较值变量的类型。< / p>

答案 6 :(得分:0)

是的......但他们是否设置了正确的值之一?国家是224或223或39而zip是一个空白字符串?我想强调,zip是一个“空白”字符串==''。