Sokszor lehet szükségünk egész szám ellenőrzésre. Ha biztonságos programot készítünk és például adatbázisban tárolt id-val dolgozunk, ellenőriznünk kell, hogy a kapott paraméter biztosan jó-e. Persze ez csak egy példa, de belegondolva rengeteg helyen használható.
Tudom vannak beépített int ellenőrző függvények a phpban, de ezek "nem jól működnek" :) pár teszt:
var_dump(is_int(23)); //bool true
var_dump(is_int("23")); //bool false
var_dump(is_int(23.5)); //bool false
var_dump(is_int(true)); //bool false
Tehát maga az is_int függvény nem tudja kezelni a stringként kapott int értéket… ez annyiból gáz hogy pl egy POST vagy GET kezelésnél automatikusan stringként kapsz értéket.
32 bites környezetben:
is_int( 2147483647 ); // true
is_int( 2147483648 ); // false
is_int( 9223372036854775807 ); // false
is_int( 9223372036854775808 ); // false
64 bites környezetben:
is_int( 2147483647 ); // true
is_int( 2147483648 ); // true
is_int( 9223372036854775807 ); // true
is_int( 9223372036854775808 ); // false
Tehát maga a futtató környezet is sokat jelent.
És akkor jöjjön pár megoldás :)
Ha nem csak IDt ellenőrzöl meg lehet csinálni ezzel (negatív számokra is visszatér):
function isInt($input){
return preg_match('@^[-]?[0-9]+$@',$input) === 1;
}
Mit is csinál a kód?
ellenőrzi hogy van-e előjel (opcionális)
Ezzel tehát nem csak int ellenőrizhető, hanem szám alapú string is.
Másik lehetőség, hogy a típusokat vetjük össze:
Az adott technikákat összevetve, ebből is van, ami lassabb és van, ami gyorsabb (10000 lekérésre tesztelve!)
$foo = is_int($i);
// 0.0032429695129395 seconds
$foo = ((int) $i) == $i;
// 0.0020270347595215 seconds
$foo = ((int) $i) === $i;
// 0.001600980758667 seconds
Mint azt Dacccs barátom is említette: “Ennél evidens, hogy a harmadik lesz a leggyorsabb, ugyan is itt már bitműveletekről van szó, és a bitművelet, ami a leggyorsabban kiértékelődik.”
Aztán a számomra is kedvelt és használt módszer, ami tuti megfelel az elvárásoknak:
function isInt($int){
//először is ellenőrizzük hogy szám érték-e
if(is_numeric($int) === TRUE){
// szám, de integernek kell lennie
if((int)$int === $int){
return TRUE;
}else{
//szám, de nem int
return FALSE;
}
}else{
//egyáltalán nem szám
return FALSE;
}
}
Na ez tuti hogy csak az egész számokat engedi át :)
Néhány teszt eset:
isInt(255); //TRUE
isInt(25.5); //FALSE
isInt("255"); //TRUE
isInt("25.5"); //FALSE
isInt("01321"); //TRUE
isInt("Hello 255"); //FALSE
isInt("Teszt"); //FALSE
isInt(""); //FALSE
A fegyver a kezetekben van, Ti döntsétek el, hogy melyik ravaszt húzzátok meg!