2016-10-26 5 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); 

Возвращает пустую строку "" и генерирует:

Примечание: Undefined индекс: Foo

Таким образом, вы, как правило, нужно обернуть это в if(isset($_GET['foo'])).

Принимая во внимание:

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

NULL Возвращает и не генерирует ошибку.

+1

Таким образом, единственное преимущество в этом случае заключается в сохранении дополнительной 'isset()' check? Как я уже упоминал в своем другом комментарии выше, почему создатели PHP потрудились с дополнительной функцией с другим синтаксисом для такой небольшой дополнительной выгоды? Не совсем риторический вопрос, но я не знаю, есть ли простой ответ ... – Sablefoste

+0

@Sablefoste Чистота - это именно то, что мы хотим. –

+0

Хорошо, я приму ответ и сразу же забуду 'filter_input'. Потому что только наличие одного типа синтаксиса является более чистым (для меня), а затем коротким, но специальным кодом случая. Спасибо за ответ! ;) – Sablefoste