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.
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
versuchen Sie die filter_var
-Funktion
filter_var($_POST['id'], FILTER_VALIDATE_INT);
benutzen:
if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) {
//Doing somethings...
}
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'];
}
preg_match('/^\d+$/D',$variable) //edit
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
.
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;
}
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
];
# 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 ✔
# 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 ✔
# 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 ✔
# 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 ✔
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;
}
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;
}
is_int funktioniert einwandfrei, es wird kein zusätzlicher Code benötigt
oder Sie können mit is_numeric überprüfen
Ich benutze:
is_int($val)||ctype_digit($val)
Beachten Sie, dass dies nur positive Ganzzahlzeichenfolgen abfängt