何时使用filter_input(),何时使用filter_var()?

15

我传统上使用filter_var()函数对 $_GET $_POST 数据进行净化,例如:

 $foo =  filter_var($_GET['foo'], FILTER_SANITIZE_NUMBER_INT);

但是 PHP 也有一个函数 filter_input(),它有不同的语法来实现同样的功能:

$foo = filter_input(INPUT_GET, 'foo', FILTER_SANITIZE_NUMBER_INT);

这些只是同义词吗?使用它们有什么优势吗?

我查了手册,但没看到很大的区别(只有报告错误的方式/是否)。从语义/最佳实践的角度来看,哪个更合理?


2
filter_var 可以接受任何变量,所以您必须自己检查未定义的变量错误。相反,filter_input 使用 $_GET$_POST$_COOKIE$_ENV$_SERVER 的原始值,这意味着对这些变量所做的任何修改都不会被考虑在内。参见 https://secure.php.net/manual/en/function.filter-input.php#115086。 - Charlotte Dunois
1
@CharlotteDunois,所以filter_input是filter_var的更具体的情况?PHP会有另一个具有不同语法和如此少的附加功能的函数似乎很奇怪。 - Sablefoste
1个回答

19

它们之间的主要区别之一是它们如何处理未定义的变量/索引。如果$_GET['foo']不存在:

$foo = filter_var($_GET['foo'], FILTER_SANITIZE_NUMBER_INT);

返回一个空字符串""并生成以下内容:

注意:未定义的索引:foo

因此,通常需要将其包装在if(isset($_GET['foo']))中。
而:
$foo = filter_input(INPUT_GET, 'foo', FILTER_SANITIZE_NUMBER_INT);

返回NULL并且不会生成错误。

注意:函数filter_input不会操作当前的$_GET$_POST超全局变量,而是已经预填充并独立于这些数组。

如果在脚本中创建了$_GET['foo']但它不存在,则filter_input将无法看到它:

$_GET['foo'] = 1;
$foo = filter_input(INPUT_GET, 'foo', FILTER_SANITIZE_NUMBER_INT);

将返回null


3
那么唯一的好处就是节省额外的 isset() 检查吗?正如我在之前的评论中提到的,为什么 PHP 的开发者们要费心去写一个带有不同语法的额外函数,而只为了这样微不足道的好处呢?这并不是一个反问句,但我不知道是否有一个简单的答案... - Sablefoste
1
@Sablefoste 清洁正是我们所追求的。 - Charlotte Dunois
好的,我会接受这个答案,并立即忘记 filter_input。因为只需要知道一种语法类型比更短但是特殊情况代码更清晰(对我来说)。感谢您的回答!;) - Sablefoste
请查看 http://php.net/manual/en/function.filter-input.php#99124 了解更多差异。 - Gediminas
filter_input 可以用于既进行验证又进行清理吗?我尝试使用清理过滤器,但似乎没有成功。 - Hashim Aziz
@HashimAziz 你需要提出一个带有代码的问题,并展示你想要什么。 - AbraCadaver

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