Разница между filter_var и filter_input при проверке входных данных

В чем разница между использованием одной из этих двух функций при проверке ввода пользователя? Строго говоря о вызовах функций, например, нет необходимости изменять массив $_POST.

$result = filter_var($_POST['user_input'], FILTER_VALIDATE_INT);

vs

$result = filter_input(INPUT_POST, 'user_input', FILTER_VALIDATE_INT);

Или между двумя вышеприведенными вызовами нет никакой разницы, даже не с точки зрения производительности, а скорее просто вопрос предпочтений?

PS: я знаю, что на SO есть похожий вопрос - Различия между filter_var и filter_input - но это просто указывает, как следует вызывать 2 метода, а не в чем фактическая разница.


person Chris Dev    schedule 14.07.2016    source источник
comment
Я не думаю, что есть такая разница, filter_input просто предназначен для ввода в качестве параметра, а filter_var будет принимать переменную, поэтому он более общий (я проверю документ по этому поводу и сделаю ответ)   -  person RDardelet    schedule 14.07.2016


Ответы (2)


Если тело запроса вообще не содержит параметр user_input, $_POST['user_input'] вызовет уведомление, а filter_input(INPUT_POST, 'user_input', ..) — нет.

person deceze♦    schedule 14.07.2016
comment
Да, поэтому $_POST следует априори сверять с isset(), и если отсутствует присваивать, например, $result = null;, а filter_input в этом случае возвращает непосредственно null. А в остальном, если параметр задан, разницы нет? - person Chris Dev; 14.07.2016
comment
Да, если параметр существует, нет никакой разницы. Разница именно в том, что filter_input прозрачно обрабатывает случай отсутствия ввода. - person deceze♦; 14.07.2016

Из того, что я прочитал на php.net,

filter_var будет просто работать для любой переменной в вашем коде, всякий раз, когда вы ее используете, она будет проверять значение в этот момент.

Значение filter_input будет проверять исходные значения вашего ввода, а это означает, что если вы измените $_POST['something'], filter_input(INPUT-POST, "something", FILTER) выполнит проверку значения, которое у него было до того, как вы его изменили. Также кажется, что при выполнении не вызывается E_NOTICE, если значение не установлено.

Справочная запись на php.net

person RDardelet    schedule 14.07.2016
comment
Вместо filter_var(...) будет выполняться проверка значения, которое было до того, как вы его изменили, вы имеете в виду filter_input, нет? Вот почему я упомянул, что массив $_POST не нужно менять, поэтому в основном разница остается, как указано ранее @deceze: уведомление срабатывает. - person Chris Dev; 14.07.2016
comment
Да, извините, сейчас я редактирую :D Тем не менее, доступ к исходному вводу может быть весьма полезным, если ваш код будет выполнен после CMS или фреймворка, который может изменить переменные $_POST/GET.... - person RDardelet; 14.07.2016