0

我正在观看一个视频教程,讲师正在测试表单提交。

他使用的代码是:

$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",它就起作用了。


顺便说一句,该字段是MySQL'visible'中的布尔值,又名。tinyint(1)

以下是该字段在表单上的 HTML:

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

有任何想法吗?预先感谢您的帮助。


更新:

我不确定发生了什么,但由于某种原因,代码现在可以在没有引号的情况下运行。很抱歉有任何混淆。

4

2 回答 2

1

在比较之前,请执行以下操作:

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

希望能帮助到你

于 2011-12-26T04:16:25.560 回答
0

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

然而,第二个和第三个条件违反了一些 PHP 内部的类型转换规则。如果您为参数传递一个空字符串值,则 empty() 将返回 true,因此 && 运算符将检查第二个条件。空字符串与整数 0 的比较再次返回 true,因此 $value != 0 返回 false,因此条件不适用。

这就是为什么如果您为“位置”(或任何其他)的必填字段发送一个空字符串,上面的代码不会将其视为错误并且验证失败。

由于您希望设置所有值且不为空,但可见字段的值可能为“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'。

于 2011-12-26T05:01:36.747 回答