Php validate integer

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

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

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

Ответы

Ответ 1

руководство говорит:

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

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

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

Ответ 2

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

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

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

Ответ 3

Как насчет intval?

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

Ответ 4

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

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

Ответ 5

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

Здесь php-страница http://php.net/manual/en/function.preg-match.php

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

Ответ 6

Попробуйте:

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);
}

Ответ 7

Я принимаю несколько более параноидальный подход к дезинфекции ввода 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