Я задаюсь вопросом, почему это не работает
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)
Похоже, вы проверяете, содержит ли строка целое число, а не если эта переменная является целым числом. Если это так, вы должны проверить функциональность регулярного выражения 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