webentwicklung-frage-antwort-db.com.de

pHP überprüfen, ob die Variable eine Ganzzahl ist

Gibt es eine schönere Möglichkeit, dies zu tun?

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

Ich habe es versucht

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

Aber is_int() funktioniert aus irgendeinem Grund nicht.

Meine Form sieht so aus

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

Ich habe is_int() recherchiert und es scheint, wenn 

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

Ich habe auch is_numeric() ausprobiert

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

es scheint, dass der einzige Weg, dies zu tun, ist: [das ist ein schlechter Weg, mach es nicht, siehe Hinweis unten]

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

Aber gibt es eine Funktion, um das oben genannte zu tun?


Zur Klarstellung möchte ich die folgenden Ergebnisse

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

Hinweis: Ich habe gerade herausgefunden, dass meine vorige Lösung, die ich vorgestellt habe, für alle Zeichenfolgen wahr ist. (Danke Redreggae)

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

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

Dies ist kein Duplikat von Prüfen, ob eine Variable eine Ganzzahl in PHP ist, da meine Anforderungen/Definitionen von Ganzzahl sich von denen unterscheiden.

34
Arian Faurtosh

versuche ctype_digit

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

Hinweis: Es funktioniert nur mit string-Typen. Sie müssen also Ihre normalen Variablen in string umwandeln:

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

Beachten Sie auch: Es funktioniert nicht mit negativen ganzen Zahlen. Wenn Sie dies brauchen, müssen Sie mit Regex gehen. Ich habe das zum Beispiel gefunden:

EDIT: Dank LajosVeres habe ich den Modifikator D hinzugefügt. 123\n ist also nicht gültig.

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

Mehr: Der einfache Test mit Casting wird nicht funktionieren, da "php" == 0 true und "0" === 0 false! .__ ist. Siehe Typenvergleichstabelle .

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

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

versuchen Sie die filter_var-Funktion

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

benutzen:

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

}
15
Dung Vu

In PHP sind $_POST Werte immer Text (string type).

Sie können eine Variable in den Integer-Typ wie folgt zwingen:

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

Das wird funktionieren, wenn Sie sicher sind, dass $_POST['id']sollte eine ganze Zahl sein. Wenn Sie jedoch absolut sichergehen möchten, dass nur Zahlen von 0 bis 9 enthalten sind und keine anderen Zeichen oder Symbole verwendet werden, verwenden Sie:

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/de/function.ctype-digit.php - es prüft, ob der String nur Ziffern enthält. Stellen Sie also sicher, dass Sie dieser Funktion nicht ein int übergeben höchstwahrscheinlich falsch zurückgeben; Alle von $_POST stammenden Werte sind jedoch immer Strings, damit Sie sicher sind. Negative Zahlen wie -18 werden nicht validiert, da - keine Ziffer ist. Sie können jedoch ctype_digit(ltrim($number, '-')) immer tun.

is_int prüft die Variable type, die in Ihrem Fall string ist. es wäre dasselbe wie (integer)$v === $v, da == einige wirklich verdeckte Dinge tut, um zwei Variablen eines anderen Typs zu vergleichen. Sie sollten === immer verwenden, es sei denn, Sie möchten, dass "0af5gbd" == 0 true zurückgibt

Denken Sie auch daran, dass ctype_digit Ihnen nicht sagt, ob die Zeichenfolge tatsächlich in eine gültige int konvertiert werden kann, da der maximale Integerwert PHP_INT_MAX ist. Wenn Ihr Wert größer ist, erhalten Sie trotzdem PHP_INT_MAX.

2
siergiej

Die akzeptierte Antwort mit ctype_digit ist korrekt, Sie können jedoch das Leben mit einer Funktion erleichtern. Dadurch wird die Variable in eine Zeichenfolge umgewandelt, sodass Sie nicht Folgendes tun müssen:

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

Verwendungszweck:

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

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

Wenn Sie auch Dezimalzahlen akzeptieren möchten, verwenden Sie Folgendes:

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

Die Verwendung von is_numeric() zur Überprüfung, ob eine Variable eine Ganzzahl ist, ist eine schlechte Idee. Diese Funktion sendet TRUE für 3.14. Es ist nicht das erwartete Verhalten

Um dies richtig auszuführen, können Sie eine der folgenden Optionen verwenden:

Betrachtet man dieses Variablenarray: 

$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
];

Die erste Option (FILTER_VALIDATE_INT Way):

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

Ausgabe :

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 ✔

Die zweite Option (CASTING COMPARISON Way):

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

Ausgabe :

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 ✔

Die dritte Option (CTYPE_DIGIT-Methode):

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

Ausgabe :

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 ✔

Die vierte Option (REGEX Way):

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

Ausgabe :

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

wenn Sie wissen, dass es sich um eine Stringvariable handelt (wie Werte nach dem Aufrufen oder Abrufen), können Sie Folgendes verwenden:

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

Verwenden Sie die folgende Universalfunktion, um alle Typen zu überprüfen:

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

    return false;
}
0
Andreas

is_int funktioniert einwandfrei, es wird kein zusätzlicher Code benötigt

oder Sie können mit is_numeric überprüfen

0
Juned Ansari

Ich benutze:

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

Beachten Sie, dass dies nur positive Ganzzahlzeichenfolgen abfängt

0
Luca C.