web-dev-qa-db-fra.com

php vérifier si la variable est un entier

Y a-t-il une meilleure façon de faire cela?

if( $_POST['id'] != (integer)$_POST['id'] )
    echo 'not a integer';

J'ai essayé

if( !is_int($_POST['id']) )

Mais is_int() ne fonctionne pas pour une raison quelconque.

Ma forme ressemble à ceci

<form method="post">
   <input type="text" name="id">
</form>

J'ai recherché is_int(), et il semble que si 

is_int('23'); // would return false (not what I want)
is_int(23);   // would return true

J'ai aussi essayé is_numeric()

is_numeric('23'); // return true
is_numeric(23); // return true
is_numeric('23.3'); // also returns true (not what I want)

il semble que la seule façon de faire est: [c'est une mauvaise façon, ne le faites pas, voir la note ci-dessous]

if( '23' == (integer)'23' ) // return true
if( 23 == (integer)23 ) // return true
if( 23.3 == (integer)23.3 ) // return false
if( '23.3' == (integer)'23.3') // return false

Mais existe-t-il une fonction pour faire ce qui précède?


Juste pour clarifier, je veux les résultats suivants

23     // return true
'23'   // return true
22.3   // return false
'23.3' // return false

Remarque: je viens de découvrir que ma solution précédente que je vous avais présentée redeviendra vraie pour toutes les chaînes. (merci redreggae)

$var = 'hello';
if( $var != (integer)$var )
    echo 'not a integer';

// will return true! So this doesn't work either.

Ce n'est pas un doublon de Vérifier si une variable est un entier dans PHP , car mes exigences/définitions d'entier sont différentes de celles de theres.

34
Arian Faurtosh

essayez ctype_digit

if (!ctype_digit($_POST['id'])) {
    // contains non numeric characters
}

Remarque: Cela fonctionnera uniquement avec les types string. Donc, vous devez utiliser string vos variables normales:

$var = 42;
$is_digit = ctype_digit((string)$var);

Notez également que cela ne fonctionne pas avec les entiers négatifs. Si vous en avez besoin, vous devrez utiliser regex. J'ai trouvé ceci par exemple:

EDIT: Merci à LajosVeres, j'ai ajouté le modificateur D. Donc, 123\n n'est pas valide.

if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) {
    echo 'String is a positive or negative integer.';
}

Plus: Le test simple avec casting ne fonctionnera pas car "php" == 0 est true et "0" === 0 est false! Voir table de comparaisons de types pour cela.

$var = 'php';
var_dump($var != (int)$var); // false

$var = '0';
var_dump($var !== (int)$var); // true
53
bitWorking

essayez la fonction filter_var

filter_var($_POST['id'], FILTER_VALIDATE_INT);

utilisation:

if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) { 
    //Doing somethings...

}
15
Dung Vu

Dans PHP $_POST, les valeurs sont toujours du texte (type string).

Vous pouvez forcer une variable dans le type entier comme ceci:

$int_id = (int)$_POST['id'];

Cela fonctionnera si vous êtes certain que $_POST['id'] devrait être un entier. Mais si vous voulez être absolument sûr qu'il ne contient que des nombres de 0 à 9 et qu'aucun autre signe ou symbole n'utilise:

if( ctype_digit( $_POST['id'] ) )
{
  $int_id = (int)$_POST['id'];
}
8
Sébastien
preg_match('/^\d+$/D',$variable) //edit 
2
Lajos Veres

Check it out: http://php.net/manual/en/function.ctype-digit.php - il valide si la chaîne ne contient que des chiffres, assurez-vous donc de ne pas passer d'int à cette fonction retourne probablement faux; Cependant, toutes les valeurs provenant de $_POST sont toujours des chaînes afin que vous soyez en sécurité. De plus, il ne validera pas les nombres négatifs tels que -18 car - n'est pas un chiffre, mais vous pouvez toujours faire ctype_digit(ltrim($number, '-'))

is_int vérifie la variable type qui dans votre cas est string; ce serait la même chose que (integer)$v === $v puisque == fait des choses vraiment obscures afin de comparer deux variables d'un type différent; vous devriez toujours utiliser === à moins que vous ne vouliez un message comme "0af5gbd" == 0 pour renvoyer true

De plus, gardez à l'esprit que ctype_digit ne vous dira pas si la chaîne peut être réellement convertie en une int valide puisque la valeur entière maximale est PHP_INT_MAX; Si votre valeur est supérieure à celle-ci, vous obtiendrez quand même PHP_INT_MAX.

2
siergiej

La réponse acceptée avec ctype_digit est correcte, mais vous pouvez vous simplifier la vie avec une fonction. Cela convertira la variable en une chaîne, vous n'aurez donc pas à:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }
    if(ctype_digit($x)){
      return true;
    }
    return false;
}

Usage:

if (is_num(56)) {
    // its a number
}

if (is_num('56')) {
    // its a number
}

Si vous voulez aussi accepter les décimales, utilisez ceci:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }    
    if (strpos($x,'.')!==false) {      
        if(substr_count($x,'.')>1||strpos($x,'.')<1||strpos($x,'.')>=strlen($x)){
            return false;    
        }
        $x=str_replace('.','',$x);    
    }
    if(ctype_digit($x)){
        return true;
    }  
    return false;
}
1
David D

Utiliser is_numeric() pour vérifier si une variable est un entier est une mauvaise idée ..__ Cette fonction enverra par exemple TRUE pour 3.14. Ce n'est pas le comportement attendu

Pour le faire correctement, vous pouvez utiliser l'une de ces options:

Considérant ce tableau de variables: 

$variables = [
    "TEST 0" => 0,
    "TEST 1" => 42,
    "TEST 2" => 4.2,
    "TEST 3" => .42,
    "TEST 4" => 42.,
    "TEST 5" => "42",
    "TEST 6" => "a42",
    "TEST 7" => "42a",
    "TEST 8" => 0x24,
    "TEST 9" => 1337e0
];

La première option (voie FILTER_VALIDATE_INT):

# Check if your variable is an integer
if( ! filter_var($variable, FILTER_VALIDATE_INT) ){
  echo "Your variable is not an integer";
}

Sortie:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

La deuxième option (CASTING COMPARISON Way):

# Check if your variable is an integer
if ( strval($variable) != strval(intval($variable)) ) {
  echo "Your variable is not an integer";
}

Sortie:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

La troisième option (CTYPE_DIGIT Way):

# Check if your variable is an integer
if( ! ctype_digit(strval($variable)) ){
  echo "Your variable is not an integer";
}

Sortie:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

La quatrième option (REGEX Way):

# Check if your variable is an integer
if( ! preg_match('/^\d+$/', $variable) ){
  echo "Your variable is not an integer";
}

Sortie:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
1
CaM2091

si vous savez que c'est une variable chaîne (comme post o get values), vous pouvez utiliser:

function is_really_integer($var) {
  return $var == (string)(integer)$var;
}
1
glerendegui

Utilisez la fonction universelle suivante pour vérifier tous les types:

function is_digit($mixed) {
    if(is_int($mixed)) {
        return true;
    } elseif(is_string($mixed)) {
        return ctype_digit($mixed);
    }

    return false;
}
0
Andreas

is_int fonctionne parfaitement, il n'y a pas besoin de code supplémentaire

ou vous pouvez vérifier avec is_numeric

0
Juned Ansari

J'utilise:

is_int($val)||ctype_digit($val)

Notez que cette capture ne contient que des chaînes entières positives

0
Luca C.