is_int и GET или POST

#php

#php

Вопрос:

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

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

Комментарии:

1. is_int() проверяет тип переменной, а не содержимое

Ответ №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() потому что он также распознает значения с плавающей запятой (1.23132)

Комментарии:

1. имейте в виду, что, например, is_numeric('47.11e5') возвращает true. Т.е. is_numeric() проверяет не только целые числа в десятичном представлении.

2. @Volker да, мне только что пришла в голову та же мысль. Обновлено.

Ответ №2:

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

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

Ответ №3:

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

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

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

Но дело в том, что приведение float к целому числу не будет равно самому себе, если это не целое число. Итак, я придумал что-то вроде этого:

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

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

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

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

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

Ответ №4:

Как я это исправил:

 $int_id = (int) $_GET["id"];

if((string)$int_id == $_GET["id"]) {
echo $_GET["id"];
}
  

Ответ №5:

Вероятно, он хранится в виде строки в $ _GET, преобразуйте его в int.

Ответ №6:

Потому что $_GET — это массив строк.

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

Ответ №7:

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

Комментарии:

1. не inval() всегда возвращает значение int, так что is_int() проверка не является излишней?

2. @Tom Haigh: Это всего лишь пример, просто разместите код так, чтобы условие возвращало true, проблема, поставленная OP. И да, это избыточно; либо следует использовать, но мне интересно, что задумал OP.

3. Боже, насколько глупо это решение? Извините, но это вообще не имеет смысла. Приведение к int внутри is_int() функции, вероятно, является худшим примером, который вы найдете здесь.

4. @GuidoH почему? он ответил на вопрос?

5. @GuidoH: Кто сказал, что это решение? Это просто пример того, как заставить условие принять значение true. Смотрите мой комментарий для Тома Хейга. Но я предпочел бы удалить эту часть, потому что это создает путаницу для вас и подобных. И вам следует следить за своим языком 🙂

Ответ №8:

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

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

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

Ответ №9:

Возможно, лучший способ проверить, является ли значение из GET или POST целым числом, — это проверка с помощью preg_match

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

Ответ №10:

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

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

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