FILTER_SANITIZE vs FILTER VALIDATE, какая разница – и какую использовать?

В настоящее время я делаю свое вроде калькуляторного приложения на PHP с формой как методом ввода. Для защиты ввода я использую filter_input() . В качестве фильтра эта функция принимает один из элементов из двух групп: FILTER_SANITIZE и FILTER_VALIDATE , который я должен использовать для фильтрации ввода из формы?

 $number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_VALIDATE_FLOAT)); 

или

 $number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_SANITIZE_FLOAT)); 

    Это зависит от того, что вам нужно или подходит для вашего приложения. Можно было бы утвердить это и сказать «Да, это (или нет) действительный float», в то время как другой очистит его для любого недопустимого значения и вернет его, а не скажет ничего, если исходный вход был действительным или не для начала.

    То же самое относится к другим FILTER_SANITIZE_* и FILTER_VALIDATE_* , но в этом примере мы рассмотрим проверку и санитарию с плавающей точкой, как задано в исходном вопросе.

    Давайте взглянем!

     $float = 0.032; $not_float = "0.03b2"; var_dump(filter_var($float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); var_dump(filter_var($not_float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); var_dump(filter_var($float, FILTER_VALIDATE_FLOAT)); var_dump(filter_var($not_float, FILTER_VALIDATE_FLOAT)); 

    Возврат с вышеуказанных свалок будет

     string(5) "0.032" // $float FILTER_SANITIZE_NUMBER_FLOAT string(5) "0.032" // $not_float FILTER_SANITIZE_NUMBER_FLOAT float(0.032) // $float FILTER_VALIDATE_FLOAT bool(false) // $not_float FILTER_VALIDATE_FLOAT 

    FILTER_SANITIZE_NUMBER_FLOAT вернет строку дезинфицированного значения (PHP не является строго типизированным языком, поэтому "0.032" == 0.032 ).
    Вы также должны отметить флаг FILTER_FLAG_ALLOW_FRACTION , который сохраняет десятичное значение на месте (без этого флага он вернет 0032 ).

    Как вы можете видеть, любой FILTER_VALIDATE_FLOAT вернет логическое значение false если оно не является допустимым поплавком, и фактическое значение, если оно было действительным (что является «правдивым» значением). Имейте в виду, что 0.00 будет «ложным» значением, поэтому, если вы хотите проверить, не прошла ли проверка, вы должны использовать строгое сравнение, если вход был нолем, но все еще действителен.

     if (filter_var($input, FILTER_VALIDATE_FLOAT) === false) { // Oh noes! $input wasn't a valid float! } 

    Вы можете увидеть это сами в этой живой демонстрации .

    Заключить
    Если вы хотите использовать его в вычислениях, вы можете проверить его и сообщить пользователю о его недопустимом формате, но вы можете его дезинфицировать и использовать в любом случае.