Почему is_int
всегда возвращает false в следующей ситуации?
echo $_GET['id']; //3
if(is_int($_GET['id']))
echo 'int'; //not executed
Почему is_int
всегда возвращает false в следующей ситуации?
echo $_GET['id']; //3
if(is_int($_GET['id']))
echo 'int'; //not executed
Почему 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)Поскольку переменные HTTP всегда являются либо строками, либо массивами. А элементы массивов всегда являются строками или массивами.
Вам нужна функция is_numeric
, которая вернет true для "4"
. Либо это, либо передайте переменную int $foo = (int) $_GET['id']
...
Потому что $_GET['id']
является строкой , как и другие части строки запроса. Вы не конвертируете его в целые числа, поэтому is_int
возвращает false.
Он, вероятно, хранится как строка в $_GET, отбрасывает его в int.
Поскольку $_GET - это массив строк.
Чтобы проверить, содержит ли параметр get целое число, вы должны использовать is_numeric()
Грязное решение, которое я использую, следующее:
$val = trim($_GET['id']);
$cnd = ($val == (int)$val);
echo $cnd ? "It an int" : "Not an int";
Помимо очевидного (уродливого кода, который скрывает его работу за спецификой PHP-движка), знает ли кто-нибудь случаи, когда это идет не так?
Проверка целых чисел с использованием 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)
Но это совсем другой вопрос.
Хороший способ проверить, является ли значение из GET или POST целым, проверяет preg_match
if( preg_match('/^[0-9]+$/', $_GET['id'] ){
echo "is int";
}
Вы можете попробовать intval()
, который можно использовать для проверки значения вашего var. например
If(intval($_GET['ID']==0)
Функция проверяет, является ли var целым числом и возвращает TRUE
, если не FALSE