2016-10-26 79 views
4

我传统上使用filter_var()功能消毒$_GET$_POST数据,如:何时使用filter_input()与filter_var()?

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

但是PHP也有一个功能filter_input(),具有不同的语法来完成同样的事情:

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

这些只是同义词吗?使用一个优势是否有优势?

我已经检查了手册页,但是我没有看到很多不同(只报告/报告错误的方式)。语义/最佳实践,最有意义的是什么?

+1

'filter_var'接受任何变量,所以你必须自己查找未定义的变量错误。 'filter_input'不是使用'$ _GET','$ _POST','$ _COOKIE','$ _ENV'或'$ _SERVER'的原始值,这意味着不会考虑对这些变量所做的任何修改。请参阅https://secure.php.net/manual/en/function.filter-input.php#115086 –

+0

@CharlotteDunois,因此filter_input是filter_var的更具体的情况吗?看起来奇怪的是,PHP会有另外一种语法不同的功能,所以增加的好处很少。 – Sablefoste

回答

6

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

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

返回一个空字符串""并产生:

注意:未定义指数:富

所以,你通常需要在包装这if(isset($_GET['foo']))

鉴于:

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

返回NULL,并且不产生错误。

+1

那么唯一的好处是保存额外的'isset()'检查?正如我在上面的其他评论中提到的那样,为什么PHP的制造者会为额外的好处带来额外的功能,并且语法不同?不是一个真正的修辞问题,但我不知道是否有一个简单的答案... – Sablefoste

+0

@Sablefoste清洁正是我们想要的。 –

+0

好的,我会接受答案,并立即忘记'filter_input'。因为只需要知道一种类型的语法就更简洁(对我来说),然后使用更短但特殊的代码。谢谢你的回答! ;) – Sablefoste