2010-11-04 37 views
13

`m pregunto por qué esto no funcionaphp validar número entero

echo gettype($_GET['id']); //returns string 
    if(is_int($_GET['id'])) 
    { 
    echo 'Integer'; 
    } 

Cómo validar los datos que pasan de GET/POST si es entero?

Respuesta

25

El manual dice:

Para probar si una variable es un número o una cadena numérica (como el formulario de entrada, que siempre es una cadena), debe uso is_numeric().

alternativa se puede utilizar la prueba basada en expresiones regulares como:

if(preg_match('/^\d+$/',$_GET['id'])) { 
    // valid input. 
} else { 
    // invalid input. 
} 
+2

Pero is_numeric() también acepta la notación exótico. –

+0

... y también acepta números decimales. 'preg_match' FTW. También puede aceptar entradas como '04'. – Ben

+3

¿No debería el preg_match aceptar números negativos también? Por lo que yo sé, un entero puede ser negativo, por lo que -5 debe aceptarse como Int. –

0

Parece que se está comprobando si una cadena contiene un número entero, en lugar de si esa variable es un entero. Si es así, debería verificar la funcionalidad de expresiones regulares de php. Le permite verificar patrones muy específicos en una cadena para validarla para cualquier criterio. (Por ejemplo, si contiene sólo caracteres numéricos)

Aquí está la página php http://php.net/manual/en/function.preg-match.php

y aquí es ver un resumen de las expresiones regulares (para hacer la cadena $ patrón) http://regexpr.com/cheatsheet/

0

Probar:

if(isNumeric($_GET['id'])) { 
    $cast_int = (int)$_GET['id']; 
} 

if(isset($cast_int)) { 
    echo gettype($cast_int)."<br />\n"; 
    if(is_int($cast_int)) 
    { 
     echo 'Integer'."<br />\n"; 
    } 
} else { 
    echo gettype($_GET['id'])." was passed<br />\n"; 
} 

function isNumeric($numeric) { 
    return preg_match("/^[0-9]+$/", $numeric); 
} 
0

tomo un enfoque un poco más paranoico para la desinfección de entrada GET

function sanitize_int($integer, $min='', $max='') 
{ 
    $int = intval($integer); 
    if((($min != '') && ($int < $min)) || (($max != '') && ($int > $max))) 
    return FALSE; 
    return $int; 
} 

Para ser aún más seguro, se puede extraer sólo los números primero y luego ejecutar la función anterior

function sanitize_paranoid_string($string, $min='', $max='') 
{ 
    $string = preg_replace("/[^a-zA-Z0-9]/", "", $string); 
    $len = strlen($string); 
    if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) 
    return FALSE; 
    return $string; 
} 

Código de: http://libox.net

27

Puede utilizar

$validatedValue = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); 

Ver http://php.net/filter_input y funciones relacionadas.

+0

Me encanta el filter_var y filter_input :) –

1

para validar los datos de formulario (cuerda) como un entero, se debe utilizar ctype_digit() Devuelve TRUE si cada carácter en el texto de la cadena es un dígito decimal, FALSE lo contrario. (PHP 4> = 4.0.4, PHP 5)

Referencia: http://php.net/manual/en/function.ctype-digit.php

+0

'ctype_digit()' solo verificará una cadena, por lo que 'ctype_digit (1) === false', mientras' ctype_digit ('1') === true'. Esto es muy útil para validar la entrada del usuario, ya que $ _GET y $ _POST contienen cadenas. – kfriend