php validate integer

Я задаюсь вопросом, почему это не работает

echo gettype($_GET['id']); //returns string if(is_int($_GET['id'])) { echo 'Integer'; } 

Как проверить данные, передаваемые из GET / POST, если они целые?

В руководстве написано:

Чтобы проверить, является ли переменная числом или числовой строкой (например, ввод формы, которая всегда является строкой), вы должны использовать is_numeric ().

Альтернативу вы можете использовать тест, основанный на регулярном выражении, как:

 if(preg_match('/^\d+$/',$_GET['id'])) { // valid input. } else { // invalid input. } 

Можешь использовать

 $validatedValue = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); 

См. http://php.net/filter_input и связанные функции.

Как насчет intval ?

 $int = intval($_GET['id']); 

Чтобы проверить данные формы (string) как целое число, вы должны использовать ctype_digit() Он возвращает TRUE если каждый символ в текстовом тексте является десятичной цифрой, в противном случае FALSE . (PHP 4> = 4.0.4, PHP 5)

Ссылка: http://php.net/manual/en/function.ctype-digit.php

Похоже, вы проверяете, содержит ли строка целое число, а не если эта переменная является целым числом. Если это так, вы должны проверить функциональность регулярного выражения php. Это позволяет вам проверять очень специфичные шаблоны в строке, чтобы проверить ее для любых критериев. (например, если он содержит только числовые символы)

Вот страница php http://php.net/manual/en/function.preg-match.php

и вот чит-лист на регулярных выражениях (чтобы создать строку $ pattern) http://regexpr.com/cheatsheet/

Пытаться:

 if(isNumeric($_GET['id'])) { $cast_int = (int)$_GET['id']; } if(isset($cast_int)) { echo gettype($cast_int)."<br />\n"; if(is_int($cast_int)) { echo 'Integer'."<br />\n"; } } else { echo gettype($_GET['id'])." was passed<br />\n"; } function isNumeric($numeric) { return preg_match("/^[0-9]+$/", $numeric); } 

Я принимаю несколько более параноидальный подход к дезинфекции ввода GET

 function sanitize_int($integer, $min='', $max='') { $int = intval($integer); if((($min != '') && ($int < $min)) || (($max != '') && ($int > $max))) return FALSE; return $int; } 

Чтобы быть еще более безопасным, вы можете сначала извлечь только номера, а затем запустить функцию выше

 function sanitize_paranoid_string($string, $min='', $max='') { $string = preg_replace("/[^a-zA-Z0-9]/", "", $string); $len = strlen($string); if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return FALSE; return $string; } 

Код от: http://libox.net