¿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
¿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
¿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)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
@Volker yup, solo tuve el mismo pensamiento. Actualizado. –
@Artefacto ¡buen trabajo, no estaba al tanto de ese filtro! Gracias. –
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.
no 'inval()' siempre devuelven un int, por lo ¿No es superflua la verificación 'is_int()'? –
@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
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í. –
Es probablemente almacena como una cadena en el $ _GET, echarlo a un int .
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']
...
Porque $ _GET es una matriz de cadenas.
Para comprobar si el parámetro GET contiene un entero debe usar is_numeric()
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?
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.
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";
}
No lo creo. – dachi
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
is_int() comprobar el tipo de la variable, no contenidos –