2016-10-26 95 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