php为空的奇怪行为,0 vs“0”

时间:2011-12-26 04:02:05

标签: php boolean tinyint

我正在观看教师正在测试表单提交的视频教程。

他正在使用的代码是:

$required_fields = array('menu_name', 'position', 'visible');

foreach ($required_fields as $fieldname) {
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] != 0) {
        $errors[] = $fieldname;
    } 
}

注意if statement &&$_POST[$fieldname] != 0所处的条件0

由于某些原因,这对我不起作用。

但是,当我提供$_POST[$fieldname] != "0"这样的'visible'引号时,它就会起作用。


BTW,tinyint(1)字段在MySQL中是一个布尔值,也就是Visible: <input type="radio" name="visible" value="1" <?php if ($sel_subject['visible'] == "1") {echo "checked=\"checked\"";} ?> /> Yes &nbsp; <input type="radio" name="visible" value="0" <?php if ($sel_subject['visible'] == "0") {echo "checked=\"checked\"";} ?> /> No

以下是此字段表单上的HTML:

{{1}}

有什么想法吗?提前感谢您的帮助。


更新

我不确定发生了什么,但由于某种原因,代码现在没有引号。抱歉有任何困惑。

2 个答案:

答案 0 :(得分:1)

在比较之前,请执行:

$fieldName = (int) $_POST[$fieldname];

希望有所帮助

答案 1 :(得分:0)

我认为你已经在if()中定义了条件,以确保所有post params都有一个值,并且不是空的,但是它们可以有0作为值(对于可见的param)。

然而,第二和第三个条件是针对某些PHP内部类型转换规则的。 如果为参数传递一个空字符串值,那么empty()将返回true,因此&amp;&amp;操作员会去检查第二个条件。空字符串与整数0的比较再次返回true,因此$ value!= 0返回false,因此条件不适用。

这就是为什么如果你为'position'(或任何其他)所需的字段发送一个空字符串,上面的代码就不会将它视为错误而验证失败。

由于您希望设置所有值且不为空,但可见字段的值可能为“0”,我建议您将比较更改为:

foreach ($required_fields as $fieldname) {
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] !== "0")) {
        $errors[] = $fieldname;
    } 
}

请记住,所有HTTP参数(GET,POST,...)都作为字符串值发送到PHP脚本。使用==或!=运算符将字符串与整数0进行比较时,会导致PHP将字符串值转换为整数,因此''或'0'之间没有区别。但是通过使用===或!==运算符并将0作为字符串,不会转换任何值。所以你可以区分''和'0'。