Почему is_int
всегда возвращает false в следующей ситуации?
echo $_GET['id']; //3 if(is_int($_GET['id'])) echo 'int'; //not executed
Почему is_int всегда возвращает false?
Поскольку $_GET["id"]
является строкой, даже если она содержит число.
Ваши варианты:
Используйте расширение фильтра . filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT)
вернет переменную с целым типом, если существует переменная, не является массивом, представляет собой целое число и это целое число находится в допустимых границах. В противном случае он вернет false
.
Force прикладывает его к integer (int)$_GET["id"]
– возможно, не то, что вы хотите, потому что вы не можете правильно обрабатывать ошибки (т. Е. «Id» не является числом)
Используйте ctype_digit()
чтобы убедиться, что строка состоит только из чисел и, следовательно, является целым числом – технически это возвращает true
также с очень большими числами, которые находятся за пределами области int
, но я сомневаюсь, что это будет проблемой. Однако обратите внимание, что этот метод не будет распознавать отрицательные числа.
Не используй:
is_numeric()
поскольку он также распознает значения float (1.23132) Поскольку переменные HTTP всегда являются либо строками, либо массивами. А элементы массивов всегда являются строками или массивами.
Вам нужна функция is_numeric
, которая вернет true для "4"
. Либо это, либо передайте переменную в int $foo = (int) $_GET['id']
…
Вероятно, он хранится как строка в $ _GET, отбрасывает его в int.
Потому что $ _GET – это массив строк.
Чтобы проверить, содержит ли параметр get целое число, вы должны использовать is_numeric()
Поскольку $_GET['id']
является строкой, как и другие части строки запроса. Вы не конвертируете его в целое число, поэтому is_int
возвращает false.
Грязное решение, которое я использую, таково:
$val = trim($_GET['id']); $cnd = ($val == (int)$val); echo $cnd ? "It's an int" : "Not an int";
Помимо очевидного (уродливого кода, который скрывает его работу за спецификой PHP-движка), знает ли кто-нибудь случаи, когда это происходит не так?
Проверка целых чисел с использованием is_int($value)
вернет false для строк.
is_int((int) $value)
значения – is_int((int) $value)
– не поможет, потому что строки и поплавки приведут к ложному срабатыванию.
is_numeric($value)
отклонит не числовые строки, но поплавки все равно пройдут.
Но дело в том, что float cast to integer не будет равным себе, если он не является целым числом. Поэтому я придумал что-то вроде этого:
$isInt = (is_numeric($value) && (int) $value == $value);
Он отлично работает для целых чисел и строк … и некоторых плавающих чисел.
Но, к сожалению, это не сработает для некоторых целых чисел.
$number = pow(125, 1/3); // float(5) -- cube root of 125 var_dump((int) $number == $number); // bool(false)
Но это совершенно другой вопрос.
Оптимально лучший способ проверить, является ли значение из GET или POST целым, проверяет preg_match
if( preg_match('/^[0-9]+$/', $_GET['id'] ){ echo "is int"; }
Вы можете попробовать intval()
который может быть использован для проверки значения вашего var. например
If(intval($_GET['ID']==0)
Функция проверяет, является ли var целым и возвращает TRUE
если не FALSE