2010-08-17 38 views
10

¿Por qué is_int siempre devuelve falso en la siguiente situación?is_int y GET o POST

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

is_int() comprobar el tipo de la variable, no contenidos –

Respuesta

36

¿Por qué is_int siempre devuelve false?

Porque $_GET["id"] es una cadena, incluso si contiene un número.

Sus opciones:

  • utilizar la extensión filter. filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT) devolverá una variable de tipo entero si la variable existe, no es una matriz, representa un número entero y ese entero está dentro de los límites válidos. De lo contrario, devolverá false.

  • Fuerza echado a un entero (int)$_GET["id"] - probablemente no lo que quiere porque no se puede manejar adecuadamente los errores (es decir, "id" no ser un número)

  • Uso ctype_digit() para asegurarse de que la cadena se compone sólo de números, y por lo tanto es un número entero - técnicamente, esto devuelve true también con números muy grandes que van más allá del alcance int, pero dudo que esto sea un problema. Sin embargo,, tenga en cuenta que este método no reconocerá números negativos.

No utilice:

  • is_numeric() porque también reconocerá valores de coma flotante (1,23132)
+1

tenga en cuenta que, por ejemplo, 'is_numeric ('47 .11e5 ')' devuelve verdadero. Es decir. is_numeric() no solo prueba los enteros en representación decimal. – VolkerK

+0

@Volker yup, solo tuve el mismo pensamiento. Actualizado. –

+0

@Artefacto ¡buen trabajo, no estaba al tanto de ese filtro! Gracias. –

0

Debido $_GET['id'] es una cadena al igual que otras partes de la cadena de consulta. No lo está convirtiendo a entero en ninguna parte, así que is_int devuelve falso.

+0

no 'inval()' siempre devuelven un int, por lo ¿No es superflua la verificación 'is_int()'? –

+0

@Tom Haigh: Es solo un ejemplo, simplemente ponga el código para que la condición sea verdadera, un problema planteado por OP. Y sí, es redundante; cualquiera debe usarse, pero me pregunto qué está haciendo OP. – Sarfraz

+0

Omg, ¿qué tan estúpida es esa solución? Lo siento, pero eso no tiene ningún sentido. Casting a 'int' dentro de la función' is_int() 'es probablemente el peor ejemplo que encontrarás aquí. –

0

Es probablemente almacena como una cadena en el $ _GET, echarlo a un int .

2

Porque las variables HTTP siempre son cadenas o matrices. Y los elementos de las matrices son siempre cadenas o matrices.

Desea la función is_numeric, que será verdadera para "4". O eso, o envía la variable a un int $foo = (int) $_GET['id'] ...

0

Porque $ _GET es una matriz de cadenas.

Para comprobar si el parámetro GET contiene un entero debe usar is_numeric()

0

La solución sucia que estoy usando es el siguiente:

$val = trim($_GET['id']); 
$cnd = ($val == (int)$val); 
echo $cnd ? "It's an int" : "Not an int"; 

Aparte de lo obvio (código feo que se esconde detrás de su funcionamiento detalles del motor php), ¿alguien sabe casos en los que esto va mal?

0

La comprobación de enteros utilizando is_int($value) devolverá falso para cadenas.

Lanzando el valor - is_int((int) $value) - no ayudará porque las cadenas y carrozas darán lugar a falso positivo.

is_numeric($value) rechazará cadenas no numéricas, pero los flotantes aún pasan.

Pero lo que pasa es que un flotante para enteros no se igualará si no es un número entero. Así que se me ocurrió algo como esto:

$isInt = (is_numeric($value) && (int) $value == $value); 

Funciona bien para enteros y cadenas ... y algunos números flotantes.

Desafortunadamente, esto no funcionará para algunos enteros float.

$number = pow(125, 1/3); // float(5) -- cube root of 125 
var_dump((int) $number == $number); // bool(false) 

Pero esa es una pregunta completamente diferente.

0

Prabably mejor manera de comprobar si el valor de GET o POST es entero es cheque por preg_match

if(preg_match('/^[0-9]+$/', $_GET['id']){ 
    echo "is int"; 
} 
+0

No lo creo. – dachi

0

Puede posiblemente probar el intval() que se puede utilizar para probar el valor de su var. por ejemplo

If(intval($_GET['ID']==0) 

La función comprobará si la var es entero y volver TRUE si no FALSE