Is_int и GET или POST

Почему is_int всегда возвращает false в следующей ситуации?

echo $_GET['id']; //3
if(is_int($_GET['id']))
    echo 'int'; //not executed

Ответ 1

Почему is_int всегда возвращает false?

Потому что $_GET["id"] - это строка, даже если она содержит число.

Ваши варианты:

  • Используйте расширение filter. filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT) возвращает целочисленную типизированную переменную, если существует переменная, не является массивом, представляет собой целое число и целое число находится в допустимых границах. В противном случае он вернет false.

  • Принудительно применить его к целому числу (int)$_GET["id"] - возможно, это не то, что вы хотите, потому что вы не можете правильно обрабатывать ошибки (т.е. "id" не является числом)

  • Используйте ctype_digit(), чтобы убедиться, что строка состоит только из чисел и, следовательно, является целым числом - технически это возвращает true также с очень большими числами, которые находятся за пределами int, но я сомневаюсь, что это будет проблемой. Однако, обратите внимание, что этот метод не будет распознавать отрицательные числа.

Не использовать:

  • is_numeric(), поскольку он также распознает значения float (1.23132)

Ответ 2

Поскольку переменные HTTP всегда являются либо строками, либо массивами. А элементы массивов всегда являются строками или массивами.

Вам нужна функция is_numeric, которая вернет true для "4". Либо это, либо передайте переменную int $foo = (int) $_GET['id']...

Ответ 3

Потому что $_GET['id'] является строкой , как и другие части строки запроса. Вы не конвертируете его в целые числа, поэтому is_int возвращает false.

Ответ 4

Он, вероятно, хранится как строка в $_GET, отбрасывает его в int.

Ответ 5

Поскольку $_GET - это массив строк.

Чтобы проверить, содержит ли параметр get целое число, вы должны использовать is_numeric()

Ответ 6

Грязное решение, которое я использую, следующее:

$val = trim($_GET['id']);
$cnd = ($val == (int)$val);
echo $cnd ? "It an int" : "Not an int";

Помимо очевидного (уродливого кода, который скрывает его работу за спецификой PHP-движка), знает ли кто-нибудь случаи, когда это идет не так?

Ответ 7

Проверка целых чисел с использованием is_int($value) вернет false для строк.

Приведение значения - is_int((int) $value) - не поможет, потому что строки и поплавки приведут к ложному срабатыванию.

is_numeric($value) отклонит не числовые строки, но поплавки все равно пройдут.

Но дело в том, что float cast to integer не будет равным себе, если это не целое число. Поэтому я придумал что-то вроде этого:

$isInt = (is_numeric($value) && (int) $value == $value);

Он отлично работает для целых чисел и строк... и некоторых плавающих чисел.

Но, к сожалению, это не сработает для некоторых целых чисел float.

$number = pow(125, 1/3); // float(5) -- cube root of 125
var_dump((int) $number == $number); // bool(false)

Но это совсем другой вопрос.

Ответ 8

Хороший способ проверить, является ли значение из GET или POST целым, проверяет preg_match

if( preg_match('/^[0-9]+$/', $_GET['id'] ){
   echo "is int";
}

Ответ 9

Вы можете попробовать intval(), который можно использовать для проверки значения вашего var. например

If(intval($_GET['ID']==0)

Функция проверяет, является ли var целым числом и возвращает TRUE, если не FALSE