为什么当我手动给 $_POST 数组赋值时,filter_input() 返回 NULL?

6

我正在学习数据验证相关的练习,决定尝试使用filter_input()函数。当我尝试运行以下代码时:

$_POST['var'] = 10;

$filtered = filter_input(INPUT_POST, 'var', FILTER_VALIDATE_FLOAT);

var_dump($filtered);

var_dump($filtered) 返回 NULL。如果通过提交表单将 $_POST['var'] 赋值,则知道代码有效,但我想知道为什么手动将值分配给 $_POST[] 数组不会返回 float(10)


7年过去了,PHP仍然没有修复filter_input()的这个错误。因此,如果未设置变量,我最终会执行filter_var(@$_POST['var'])以消除PHP提示“未定义索引:var”,而filter_input()则为您处理此问题。令人失望。 - dossy
3个回答

13

filter_input() 不从 _POST/_GET/_COOKIE/_SERVER/_ENV 超全局数组中读取数据,而是分别从这些值的原始来源读取数据(这些原始来源也用于填充超级全局变量)。


我可以直接访问原始源代码吗? - user701510
2
如果您想使用INPUT_POST,它会专门验证已发布的POST数据。如果您想验证其他设置的数据,请不要使用INPUT_POST - deceze
@deceze 那么通过POST的XMLHttpRequests呢?那些数据也被“_POSTed_”了(smh),但是filter_input方法无法找到这些数据。为什么会这样? - doABarrelRoll721
@doABarrelRoll721 你有没有发布 JSON? - deceze
@deceze $.ajax({ type: 'POST', ..... 不过没关系,我已经解决了。现在我使用 filter_var。 - doABarrelRoll721

5
这是因为INPUT_POST使用的是原始的POST值,对它们在脚本中所做的修改没有影响。 然而,如果您想过滤该变量,可以使用以下方法:
filter_var($_POST['var'], FILTER_VALIDATE_FLOAT);

1
如果您想设置默认输入值和过滤器,请使用filter_var。因为filter_input不会过滤超全局变量的当前值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接