filter_var和filter_input在输入数据验证方面的区别

4
这两个函数在验证用户输入时有什么区别?严格来说,就函数调用而言,并没有要求更改例如 $_POST 数组之类的内容。 $result = filter_var($_POST['user_input'], FILTER_VALIDATE_INT);
vs $result = filter_input(INPUT_POST, 'user_input', FILTER_VALIDATE_INT);
或者说,这两个调用之间没有任何区别,甚至性能上也不会有差异,只是个人偏好的问题吗?
PS:我知道 SO 上有一个类似的问题-Differences between filter_var and filter_input-但那只说明了如何调用这两种方法,而不是它们之间的实际区别。

我认为并没有太大的区别,filter_input 只是设计为以输入参数形式接收输入,而 filter_var 则可以接收变量,因此更为通用(我会查看文档并做出回应)。 - RDardelet
2个回答

4

根据我在 php.net 上的阅读,filter_var在您的代码中对任何变量都有效,每当您使用它时,它将检查该时刻的值。

filter_input 将检查输入的原始值,这意味着如果您更改了$_POST['something'],则filter_input(INPUT-POST, "something", FILTER)将对修改前的值执行检查。 它似乎也不会在未设置值时触发E_NOTICE

参考php.net上的文章


你是说 filter_input 而不是 “filter_var(…) 将对你修改之前的值进行检查”吧?那就是为什么我提到 $_POST 数组不需要被更改了。所以基本上,像 @deceze 之前提到的,差异仍然在于是否会触发通知。 - Chris Dev
是的,抱歉,我正在进行编辑 :D 不过,在代码执行后,如果CMS或框架可能会更改$_POST/GET... 变量,仍然可以访问原始输入,这可能非常有用。 - RDardelet

0
如果请求体中根本不包含参数user_input$_POST['user_input']将会触发一个通知,而filter_input(INPUT_POST, 'user_input', ..)则不会。

是的,因此应该事先使用isset()检查$_POST,如果缺少,则分配例如$result = null;,而在这种情况下,filter_input将直接返回null。否则,如果参数已设置,则没有区别吗? - Chris Dev
是的,如果参数存在,没有区别。不同之处在于filter_input透明地处理缺少输入的情况。 - deceze

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