我正在观看教师正在测试表单提交的视频教程。
他正在使用的代码是:
$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
<input type="radio" name="visible" value="0" <?php if ($sel_subject['visible'] == "0") {echo "checked=\"checked\"";} ?> /> No
。
以下是此字段表单上的HTML:
{{1}}
有什么想法吗?提前感谢您的帮助。
更新
我不确定发生了什么,但由于某种原因,代码现在没有引号。抱歉有任何困惑。
答案 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'。