FILTER_SANITIZE против 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));

3

Решение

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

То же самое относится и к другим 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!
}

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

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

Другие фильтры
Экзамен здесь показывает использование FILTER_SANITIZE_FLOAT, но есть и другие фильтры проверки и проверки. Смотрите ссылки ниже для полного описания.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]