В настоящее время я делаю что-то вроде калькуляторного приложения на 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));
Это действительно зависит от того, что вам нужно или подходит для вашего приложения. Один из них подтвердит это и скажет: «Да, это (или не является) действительное значение с плавающей запятой», а другой очистит его от любого неприемлемого значения и вернет его, и ничего не скажет, если исходный ввод был действительным или не для начала.
То же самое относится и к другим 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
, но есть и другие фильтры проверки и проверки. Смотрите ссылки ниже для полного описания.
Других решений пока нет …