2010-06-28 2 views
7

Ecco il mio codice:

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

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

Si entra sempre all'interno del caso.

+0

E '$ _GET' contiene effettivamente ... cosa? –

+0

numeri da 1 a infinito. – ilhan

risposta

31

is_int controlla che il tipo di dati è un numero intero, ma tutto in $_GET sarà una stringa . Pertanto, restituirà sempre false.

In un pizzico, si potrebbe lanciare ad un intero e poi controllare! = 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'); 
} 

Ma una soluzione più robusta comporterebbe un certo tipo di stringa di input di validazione/filtraggio, come PHP di built-in filter_input_array().

(messaggio modificato l'ott/13 dal momento che continua a ricevere upvotes ed è stato un po 'confusamente formulata.) Ingresso

+3

Ha esaurito le upvotes per il giorno, ma questa risposta in realtà dice il motivo per cui usare is_numeric.Qualsiasi parametro di richiesta HTTP inviato da POST o GET sarà sempre una stringa. –

+0

+1 - sebbene da menzionare, 'is_numeric' non ha lo stesso effetto, come ad es. anche i valori esadecimali passano oltre agli altri (vedi php.net) – Helmut

+0

@Helmut, sì, 'is_numeric()' non è adatto per il controllo degli ID interi. In pratica, tutti gli input dell'utente dovrebbero essere passati attraverso 'filter_var()' o qualche altra routine altrettanto esplicita. – Matthew

5

utente in ordine di $ _GET (così come gli altri superglobals) tutti prendono la forma di stringhe.

is_int controlli la tipo (cioè string) del valore, non se contiene valori interi simili. Per verificare che l'input sia una stringa intera, suggerirei qualcosa come ctype_digit o un numero intero filter (FILTER_VALIDATE_INT - questo ha il vantaggio di cambiare effettivamente il valore per digitare numeri interi). Ovviamente si potrebbe anche convertirlo con (int).

3

Dalla documentazione di PHP per is_int:

Nota: Per testare se una variabile è un numero o di una stringa numerica (come modulo di input, che è sempre una stringa), è necessario utilizzare is_numeric().

1

ingresso Qualsiasi utente viene in forma di stringa, perché PHP non ha alcun modo per dire che tipo di dati che ci si aspetta i dati siano.

Trasferirlo su un numero intero o utilizzare un'espressione regolare se si desidera assicurarsi che sia un numero intero.

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

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

Prova utilizzando is_numeric invece di is_int. is_numeric controlla se viene dato qualcosa che può essere un numero ($_GET restituisce le stringhe, credo). is_int controlli per vedere se la variabile è di tipo int

0

Oppure, è possibile utilizzare una corrispondenza regolare per verificare se la stringa è un numero intero.

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