为什么is_int
在以下情况下总是返回false?
echo $_GET['id']; //3
if(is_int($_GET['id']))
echo 'int'; //not executed
答案 0 :(得分:38)
为什么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 :(得分:2)
因为HTTP变量总是字符串或数组。数组的元素总是字符串或数组。
您需要is_numeric
函数,该函数将为"4"
返回true。要么是,要么将变量强制转换为int $foo = (int) $_GET['id']
...
答案 2 :(得分:1)
使用is_int($value)
检查整数将为字符串返回false。
转换值 - is_int((int) $value)
- 无济于事,因为字符串和浮点数会导致误报。
is_numeric($value)
将拒绝非数字字符串,但浮动仍然会通过。
但问题是,如果它不是整数,则转换为整数的浮点数将不等于它自己。所以我想出了类似的东西:
$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)
但这是一个完全不同的问题。
答案 3 :(得分:1)
我如何解决它:
$int_id = (int) $_GET["id"];
if((string)$int_id == $_GET["id"]) {
echo $_GET["id"];
}
答案 4 :(得分:0)
因为$_GET['id']
是 字符串 ,就像查询字符串的其他部分一样。您没有将它转换为整数,因此is_int
返回false。
答案 5 :(得分:0)
它可能存储为$ _GET中的字符串,将其转换为int。
答案 6 :(得分:0)
因为$ _GET是一个字符串数组。
要检查get参数是否包含整数,您应该使用is_numeric()
答案 7 :(得分:0)
我正在使用的肮脏解决方案是:
$val = trim($_GET['id']);
$cnd = ($val == (int)$val);
echo $cnd ? "It's an int" : "Not an int";
除了显而易见的(丑陋的代码隐藏其在php引擎细节背后的工作方式)之外,有没有人知道出现这种情况的情况?
答案 8 :(得分:0)
检查来自GET或POST的值是否为整数的最佳方法是检查preg_match
if( preg_match('/^[0-9]+$/', $_GET['id'] ){
echo "is int";
}
答案 9 :(得分:0)
您可以尝试使用intval()
来测试var的值。 e.g
If(intval($_GET['ID']==0)
该函数将检查var是否为整数,如果不是TRUE
则返回FALSE