【问题标题】:Strange behavior with php empty and 0 vs "0" [closed]php为空且0 vs“0”的奇怪行为[关闭]
【发布时间】:2011-12-26 04:02:04
【问题描述】:

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

他使用的代码是:

$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

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

但是,当我像 $_POST[$fieldname] != "0" 这样给出 0 引号时,它会起作用。


顺便说一句,'visible' 字段是一个布尔值,也就是 MySQL 中的 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

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


更新:

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

【问题讨论】:

  • 我应该补充一点,我尝试在 HTML 中使用引号和不使用引号进行更改,但这没有区别。
  • 你能检查正在使用的代码吗?看起来foreach 中的if 语句在{ 之前缺少)
  • @Tim 抱歉,我没有看到这个问题。我想日食会提醒我的。
  • if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) &amp;&amp; $_POST[$fieldname] != 0)) {if 表达式从未正确关闭。
  • 啊,你是对的。这是一个错字......但在代码中,我已经关闭了if 条件。很抱歉造成混乱。

标签: php boolean tinyint


【解决方案1】:

在比较之前,做:

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

希望对你有帮助

【讨论】:

  • 你能描述一下这是做什么的吗?
  • @Nathan 它将它转换为一个 int,基本上把它塞进一个 int 而不是一个字符串。所有表单输入都是字符串,偶数,这意味着将0放入表单中,当它发送到服务器时返回字符串“0”,而不是数字/int 0。当然,如果他们的输入是“0username”,将其转换为 int 只会留下数字 0。除非您希望来自表单的数据始终为数字,否则这不是您要查找的内容。
  • @Nathan 另外,当您将字符串转换为不以数字开头的 int 时,例如 (int)"menuname",结果为 0。所以它对您来说有点没用,因为所有字段都没有数字数据如果转换为 int,则为 0。
【解决方案2】:

我认为您已经在 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'。

【讨论】:

  • 这对我来说需要消化很多 :-) 但正是我感兴趣的细节类型。不确定你是否注意到我对帖子的更新/编辑,但出于某种原因(我不知道为什么),但验证开始正常工作。我仍然会花时间研究你写的东西。看来这里有一些细节可以帮助我理解。谢谢。
  • 欢迎内森。如果您需要,我很乐意描述更多。但是我认为,如果您从 HTML 表单中发送空值(在 HTML 字段中不输入任何内容并提交),您的代码将不会考虑错误。如果这不是您想要的,那么我建议的修改可能会有所帮助。 :)
猜你喜欢
  • 2013-07-04
  • 2016-02-16
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多