is_int和GET或POST

时间:2010-08-17 13:25:19

标签: php

为什么is_int在以下情况下总是返回false?

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

10 个答案:

答案 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的非常大的数字的范围,但我怀疑这将是一个问题。 ,请注意此方法无法识别否定数字。

不要使用:

答案 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