【问题标题】:Zero considered as empty in PHP零在 PHP 中被认为是空的
【发布时间】:2017-07-29 15:41:48
【问题描述】:

我的 php 表单中的 输入字段 有问题。它看起来像:

<input type="number" name="tmax" max="99" min="-99" placeholder="Temperatura max."> 

我想检查 字段 是否为空。但问题是 php 认为 0 为空。

if (empty($_POST['tmax'])) {
  $tmax = null;
}else {
  $tmax = $_POST['tmax'];
}

如果用户将 输入字段 留空,则该值被视为“null”,这非常有效。但是如果用户写了0,这是表单中的一种可能,也被视为空。

我还在 SQL 中将默认设置为 null,但问题是,如果输入为空,程序会在表中插入 0

解决方案:

这个解决方案对我来说很好:

if ($_POST['tmax'] == "") {
  $tmax = null;
}else {
  $tmax = $_POST['tmax'];
}

还有is_numeric()

if (is_numeric($_POST['tmax'])) {
  $tmax = $_POST['tmax'];
}else {      
    $tmax = 'null';
}

【问题讨论】:

  • 度数为0时尝试创建自定义语句

标签: php forms input is-empty


【解决方案1】:

检查条件是否为空,也不为零。零值是“空”,因此通过添加这两个检查,您可以确保如果输入为空并且不为零,变量 $tmax 将设置为 null

if (empty($_POST['tmax']) && $_POST['tmax'] != 0) {
    $tmax = null;
} else {
    $tmax = $_POST['tmax'];
}

这也将接受“foo”作为值,因此您应该检查或验证输入是否为有效数字(并且也在您指定的范围内)。您还可以实现is_numeric($_POST['tmax']),或者更好的是,使用filter_var($_POST['tmax'], FILTER_VALIDATE_INT) 对其进行验证,以确保输入的内容实际上是一个数字。

【讨论】:

  • 恕我直言,使用 empty 是一种令人困惑的技术,然后添加额外的测试以纠正 emptys “过于包容”的设计 - 如果它的情况 empty 不做什么在我看来,是想要的,不要使用它。我更喜欢从语义更简单的更基本的调用中构建。你提到is_numeric - 这似乎是更好的起点。
【解决方案2】:

正如您所说,0 被认为是空的。

你想要的函数是isset()。

if (!isset($_POST['tmax'])) {
    $tmax = null;
} else {
    $tmax = $_POST['tmax'];
}

或者,删除 not 运算符并切换代码块。

【讨论】:

    【解决方案3】:

    此代码应该适用于您想要获取的内容。

    if (!isset($_POST['tmax']) || $_POST['tmax'] == '') {
        $tmax = null;
    }else {
        $tmax = $_POST['tmax'];
    }
    

    【讨论】:

      【解决方案4】:

      如果你想有占位符 - 你可以使用这个代码:

      <input type="number" name="tmax" max="99" min="-99" onclick="if (this.value == '') {this.value='0';} " placeholder="Temperatura max.">
      

      不要忘记添加验证(在发送表单检查空文件之前)

      和php到:

      $tmax = 0;
      if (isset($_POST['tmax'])) {
        $tmax = $_POST['tmax'];
      }
      

      【讨论】:

      • 感谢您的回复,但这个解决方案对我来说并不美观,因为信息显示在占位符上,并且用户可以通过“价值”看到信息。
      • 好的,我现在更改答案 - 使用占位符
      • 如果您想要用默认值替换空字段,这是一个很好的技术。 [为未来的读者澄清:原始问题想要相反的行为 - 如何区分空值,这意味着“未设置”,并且在他的代码中是允许的,并且值为零。]
      【解决方案5】:

      你可以使用

      if ($_POST['tmax'] == "") {
        $tmax = null;
      }else {
        $tmax = $_POST['tmax'];
      }
      

      【讨论】:

      • 这会引发通知。
      • 查看 lucianov 的更好答案,其中包括 !isset 以避免 chris 提到的 php 警告。或下面的任何其他答案(Lesiuk 除外,这对于不同的情况非常有用,但不是这里要求的)。
      【解决方案6】:

      您可以使用!is_numeric() 代替empty()

      感谢拉法这么重要的说明

      【讨论】:

      • 注意:要测试一个变量是数字还是数字字符串(比如表单输入,总是字符串),必须使用is_numeric( )。不过非常感谢!它对我有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2016-10-21
      相关资源
      最近更新 更多