2010-11-04 11 views
13

`m chiedo perché questo non funzionaphp validate intero

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

Come convalidare i dati che passano da GET/POST se è intero?

risposta

25

Il manual dice:

Per testare se una variabile è un numero o una stringa numerica (come ingresso forma, che è sempre una stringa), è necessario uso is_numeric().

alternativa è possibile utilizzare il test basato regex come:

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

Ma is_numeric() accetta anche la notazione esotici. –

+0

... e accetta anche i numeri decimali. 'preg_match' FTW. Può anche accettare input come '04'. – Ben

+3

Non dovresti accettare anche i numeri negativi con preg_match? Per quanto ne so, un intero può essere negativo, quindi -5 dovrebbe essere accettato come Int. –

0

Sembra che si sta verificando se una stringa contiene un intero, piuttosto che se tale variabile è un numero intero. In tal caso, dovresti controllare la funzionalità regex (espressione regolare) di php. Permette di verificare la presenza di schemi molto specifici in una stringa per convalidarli per qualsiasi criterio. (Come ad esempio se contiene solo caratteri numerici)

Ecco la pagina php http://php.net/manual/en/function.preg-match.php

ed ecco un foglietto sulle espressioni regolari (per rendere la stringa $ pattern) http://regexpr.com/cheatsheet/

0

Prova:

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

prendo un approccio leggermente più paranoico di sanificazione ingresso GET

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

Per essere ancora più sicuri, è possibile estrarre solo i numeri e poi esegue la funzione di cui sopra

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; 
} 

Codice da: http://libox.net

27

Può usare

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

Vedi http://php.net/filter_input e le relative funzioni.

+0

Mi piace filter_var e filter_input :) –

1

Per convalidare i dati del modulo (stringa) come un intero, si dovrebbe usare ctype_digit() Restituisce TRUE se ogni carattere di testo stringa è una cifra decimale, FALSE altrimenti. (PHP 4> = 4.0.4, PHP 5)

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

+0

'ctype_digit()' controllerà solo una stringa, quindi 'ctype_digit (1) === false', mentre' ctype_digit ('1') === true'. Questo è molto utile per convalidare l'input dell'utente, poiché $ _GET e $ _POST contengono stringhe. – kfriend