#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