2010-06-28 23 views
7

Aquí está mi código:

<?php 
$id = $_GET["id"]; 

if (is_int($id) === FALSE) { 
    header('HTTP/1.1 404 Not Found'); 
    exit('404, page not found'); 
    } 
?> 

Siempre entra dentro del caso.

+0

Y '$ _GET' en realidad contiene ... ¿qué? –

+0

números del 1 al infinito. – ilhan

Respuesta

31

is_int comprueba que el tipo de datos es un entero, pero todo en $_GET será una cadena . Por lo tanto, siempre devolverá false.

En caso de necesidad, se puede echar a un entero y para verificar si! = 0.

$id = isset($_GET['id']) ? (int) $_GET['id'] : null; 

if (!$id) { // === 0 || === null 
    header('HTTP/1.1 404 Not Found'); 
    exit('404, page not found'); 
} 

Pero una solución más robusta podría implicar algún tipo de cadena de entrada de validación/filtrado, como PHP incorporado en filter_input_array().

(post Editado el Oct/13 ya que todavía está recibiendo upvotes y fue redactado modo algo confuso.) De entrada

+3

Se agotó el número de votos por día del día, pero esta respuesta en realidad dice la razón por la cual se usa is_numeric.Cualquier parámetro de solicitud HTTP enviado por POST o GET siempre será una cadena. –

+0

+1 - aunque debe mencionarse, 'is_numeric' no tiene el mismo efecto, como p. Ej. también deja pasar los valores hexadecimales además de otros (vea php.net) – Helmut

+0

@Helmut, sí, 'is_numeric()' no es apropiado para verificar los ID enteros. En la práctica, toda la entrada del usuario se debe pasar a través de 'filter_var()' o alguna otra rutina similarmente explícita. – Matthew

5

usuario en array $ _GET (así como los demás superglobals) todos toman la forma de cuerdas.

is_int comprueba el tipo (es decir string) del valor, no si contiene valores enteros-similares. Para la verificación de que la entrada es una cadena entera, sugeriría algo como ctype_digit o un número entero filter (FILTER_VALIDATE_INT). Esto tiene la ventaja de realmente cambiar el valor a tipo entero. Por supuesto, también podría encasillarlo con (int).

3

De la documentación de PHP para is_int:

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

1

Cualquier entrada de usuario entra como una cadena, porque PHP no tiene forma de decir qué tipo de datos espera que sean los datos.

Llénelo en un número entero o use una expresión regular si desea asegurarse de que se trata de un número entero.

<?php 
$id = $_GET["id"]; 

if ((int) $id == 0) { 
    header('HTTP/1.1 404 Not Found'); 
    exit('404, page not found'); 
    } 
?> 
1

Trate de usar en lugar de is_numericis_int. is_numeric comprueba si se le da algo que puede ser un número ($_GET devuelve cadenas, creo). is_int comprueba si la variable es de tipo int

0

O bien, podría utilizar una coincidencia de expresiones regulares para comprobar si la cadena es un número entero.

if(preg_match('/^\d+$/',$_GET['id'])) { 
    // is an integer 
} 
Cuestiones relacionadas