Foros del Web » Programando para Internet » PHP »

Fácil: Campo form devuelve un string y no un numero (mas largo)

Estas en el tema de Fácil: Campo form devuelve un string y no un numero (mas largo) en el foro de PHP en Foros del Web. Tengo un input que pide un número luego recojo esta variable y compruebo si es is_int() y me dice que no!. Supongo que habrá que ...
  #1 (permalink)  
Antiguo 23/02/2008, 17:36
Avatar de darkgaze  
Fecha de Ingreso: febrero-2006
Ubicación: Madrid, España
Mensajes: 462
Antigüedad: 18 años, 2 meses
Puntos: 2
Exclamación Fácil: Campo form devuelve un string y no un numero (mas largo)

Tengo un input que pide un número

luego recojo esta variable y compruebo si es is_int() y me dice que no!.

Supongo que habrá que hacer un casting.... (int)$num

pero no! porque si hago casting si pongo 'a' lo coje como un número también!.

Cómo demonios cojo un numero por un formulario... y que sea un número y no un string'?? si está bien, entonces por qué cuando meto un número no me lo lee bien???

Código PHP:
$num htmlentities$_POST['numero'] );
    if ( empty(
$num) || !is_int($num) || !rango_correcto($num,500000) )
        {.... 
Y me falla la prueba is_int.
Pues no entiendo nada...
__________________
Darkgaze
  #2 (permalink)  
Antiguo 23/02/2008, 18:41
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Fácil: Campo form devuelve un string y no un numero (mas largo)

Esto lo tenía como artículo en mi blog, antes de que sufriera un error en la base de datos...

Espero te sirva

------------------------------------------------------


¿Cómo hacer para estar seguro de que un parámetro obtenido por GET (o POST) es un número entero?
Intentando resolver esta pregunta he intentado varias técnicas a lo largo del tiempo, y haciendo esas pruebas he llegado a entender más sobre cómo funcionan las comparaciones y las conversiones automáticas de tipos en PHP.

Parto de la base de que no sirve usar una conversión directa con (int), o intval(), ya que si bien estaría seguro de que el valor que obtengo es un entero, eso no quiere decir que sea un valor válido, ya que cualquier cadena puede convertirse a entero (si no comienza con números, su valor es cero). Ante la duda, nada mejor que consultar la página sobre manipulación de tipos del manual de PHP.


Primer intento: is_int
La primera idea es comprobar con la función is_int.
Sin embargo, esto no funciona, porque PHP considera cadenas a estas variables.
¿Cómo lo sé? Por 2 motivos:

1.- La propia página del manual lo advierte: "Para probar si una variable es un número o una cadena numérica (como en el caso de la entrada de un formulario, que es siempre una cadena), debe usar is_numeric()".

2.- gettype($_GET['uno']);
Devuelve "string", aunque el valor de $_GET['uno'] sea 12, por ejemplo.

is_int($_GET['uno']);
Devuelve false, en el mismo caso que el anterior.


Segundo intento: is_numeric
is_numeric serviría, excepto porque también acepta números con coma (punto, en realidad). De nuevo, podríamos simplemente convertirlo a entero con (int), pero no sería el valor original y por lo tanto no sería un valor válido.

Tercer intento: comparación con entero
Otra opción puede ser hacer una comparación como
$_GET['var'] == (int) $_GET['var'];

En teoría funcionaría, pero no es así.
PHP es un tanto "especial" en lo que refiere a las conversiones de tipos: siempre que haya un entero en un lado de la comparación, convertirá el otro lado en entero.
Por lo tanto, la comparación SIEMPRE será cierta, ya que el lado izquierdo de la comparación será convertido también, resultando en lo mismo que si escribiese

(int) $_GET['var'] == (int) $_GET['var'];


Cuarto intento: comparación de idénticos
Bueno, si PHP convierte a entero ambos lados y por eso no sirve el ejemplo anterior, bastaría con usar el comparador ===, ¿no?
¡NO! Porque siempre serán de tipos diferentes, ya que como se dijo antes, las variables GET son tomadas como cadenas.

Quinto intento: complicado pero funciona
Finalmente decidí ir por algo más complejo pero que evita todos los problemas de los casos anteriores.
¿Qué hacer? La comparación con un entero es necesaria, porque después de todo lo que necesitamos es un entero, pero no podemos comparar una cadena con un entero porque la cadena será convertida...
Solución: volver a convertir al entero en cadena.

Código PHP:
if ( $_GET['var'] == (string) intval($_GET['var']) ) {
    echo 
"¡Es entero!";

Esa es la mejor solución que he encontrado, ¿alguien conoce alguna mejor?


-------------------------------------------

Distribuir como se quiera, siempre que se me mencione como autor


Saludos.
  #3 (permalink)  
Antiguo 24/02/2008, 07:40
Avatar de darkgaze  
Fecha de Ingreso: febrero-2006
Ubicación: Madrid, España
Mensajes: 462
Antigüedad: 18 años, 2 meses
Puntos: 2
Re: Fácil: Campo form devuelve un string y no un numero (mas largo)

ostras!

muy buena idea!! es justo lo que buscaba... pues yo no conozco otra mejor idea...

aunque no creas... la comparación con el string no está nada mal... pero buena explicación.

Lo probaré, MUCHAS GRACIAS.
__________________
Darkgaze
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:30.