Egész szám ellenőrzés és az is_int?

img

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?

  1. ellenőrzi hogy van-e előjel (opcionális)

  2. egy preg_match-csel ellenőrzi, hogy az adott karakterek csak számok lehetnek. Ettől függően true vagy false értékkel tér vissza…

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!