【问题标题】:PHP filter_input validate INTPHP filter_input 验证 INT
【发布时间】:2014-08-11 18:18:44
【问题描述】:

我有这段代码:

$range = array (
    'options' => array (
        'min_range' => 0,
        'max_range' => 10
    )
);

if (!$number = filter_input(INPUT_POST, 'number', FILTER_VALIDATE_INT, $range)) {
    exit ('Error');
}

“数字”输入将从 a 发送,选项范围为 0 到 10。

问题是如果 number = 0 这将返回“错误”。

这有什么问题?

谢谢

【问题讨论】:

  • 这是operator precedence:您首先将函数调用的结果分配给$number,然后将结果取反,将其转换为布尔值(它可能是布尔值、整数或NULL)。

标签: php filter


【解决方案1】:

这是因为!0 为真。为什么?通过添加!,您正在进行布尔检查,因此您的变量会被转换。并根据manual

转换为布尔值时,以下值被视为FALSE

  • 布尔值FALSE 本身

  • 整数0(零)

  • 浮点数0.0(零)

  • 空字符串和字符串"0"

  • ...

所以整数 0 被转换为 false 而所有其他整数都被转换为 true

这就是为什么您需要为falsenull 执行type safe check 的原因,因为这些是filter_input() 在由于某种原因失败时返回的值。

$number = filter_input(INPUT_POST, 'number', FILTER_VALIDATE_INT, $range);
if ($number === false) {
    //filter failed
}
if ($number === null) {
    //variable was not set
}

【讨论】:

  • 但是 0 和其他数字之间有什么区别,因为它们都在同一个范围内?
  • @medk 这个答案有问题吗?当然,如果您只是在寻找不特定的错误,您可以在一个 if() 中同时进行两项检查
  • 此解决方案也适用于 filter_var() php.net/manual/en/function.filter-var.php
【解决方案2】:

我找到了解决办法!

if (
    !$number = filter_input(INPUT_POST, 'number', FILTER_VALIDATE_INT, $range) === 0 
    || !filter_input(INPUT_POST, 'number', FILTER_VALIDATE_INT, $range) === FALSE) 
{
    exit ('Error');
}

【讨论】:

  • 你在这里把事情复杂化了。尽管您已经将结果(至少您尝试过,这些复杂结构的问题在于它们很容易失败)存储到变量中,但您正在执行两次相同的操作。 @kingkero 在他的回答中有一些非常有效的观点,您应该尝试采用这些观点。如果您想将所有内容都纳入 if 条件,有一种方法可以做到这一点,它以 if (FALSE === ...) { 开头。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多