die ich zum Betrachten verschiedener “Seiten” einer Datenbank verwenden werde (Ergebnisse 1-10, 11-20 usw.). Ich kann die Funktion is_int() jedoch nicht richtig zum Laufen bringen. Das Einfügen von “1” in die URL (noobs.php?p=1) gibt mir den Fehler “Ungültige Seite” sowie so etwas wie “asdf”.
Kamera CHN
Verwenden is_numeric() zu prüfen, ob eine Variable eine ganze Zahl ist, ist eine schlechte Idee. Diese Funktion kehrt zurück TRUE zum 3.14 zum Beispiel. Es ist nicht das erwartete Verhalten.
Um dies korrekt zu tun, können Sie eine dieser Optionen verwenden:
# Check if your variable is an integer
if ( filter_var($variable, FILTER_VALIDATE_INT) === false ) {
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 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-Weg):
# 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-Weg):
# 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 ✔
Achten Sie auf FILTER_VALIDATE_INT (Ihr bevorzugter Weg) 0 gibt falsch zurück!
– Niksac
27. Juli 2015 um 14:39 Uhr
Verwenden Sie stattdessen filter_var($int, FILTER_VALIDATE_INT) !== false.
– Niksac
27. Juli 2015 um 15:15 Uhr
Ich denke, es gibt eine! fehlt bei if(filter_var($variable, FILTER_VALIDATE_INT) !== false) echo "its not an integer ,rechts?
– Adam
28. Juni 2016 um 9:36 Uhr
oder der Text sollte in “it is an iteger” geändert werden
– Adam
28. Juni 2016 um 9:37 Uhr
Der ‘CTYPE_DIGIT-Weg’ und der ‘REGEX-Weg’ schlagen beide für negative Ganzzahlen fehl. Der ‘REGEX-Weg’ kann behoben werden, indem überprüft wird, ob ein führendes negatives Vorzeichen vorhanden ist (-?), aber das glaube ich nicht ctype_digit kann auf prägnante Weise verwendet werden, um nach negativen ganzen Zahlen zu suchen. Außerdem kann der gepostete Code nicht die entsprechenden Ausgaben erzeugen.
– David F
13. Juli 2018 um 1:25 Uhr
Alle $_GET Parameter haben einen String-Datentyp, daher is_int wird immer false zurückgeben.
Sie können dies sehen, indem Sie anrufen var_dump:
var_dump($_GET['p']); // string(2) "54"
Verwenden is_numeric liefert das gewünschte Ergebnis (wohlgemerkt, das erlaubt Werte wie: 0x24).
Warnung: Dies wird für mehr als nur ints true zurückgeben, verwenden Sie eine der anderen Lösungen unten.
– Nathan Bell
20. August 2015 um 0:50 Uhr
Wenn der Browser sendet p in der Abfragezeichenfolge wird es als Zeichenfolge empfangen, nicht als Int. is_int() wird daher immer false zurückgeben.
Versuchen Sie es stattdessen is_numeric() oder ctype_digit()
Nur zum Spaß habe ich einige der genannten Methoden getestet, plus eine, die ich seit Jahren als Lösung verwende, wenn ich weiß, dass meine Eingabe eine positive Zahl oder ein String-Äquivalent ist.
Ich habe dies mit 125.000 Iterationen getestet, wobei jede Iteration denselben Satz von Variablentypen und -werten übergeben hat.
(Ich habe die Regex nicht einmal getestet, ich meine, ernsthaft … Regex dafür?)
Dinge zu beachten:
Methode 4 gibt für negative Zahlen immer „false“ zurück (negative Ganzzahl oder String-Äquivalent) und ist daher eine gute Methode, um konsistent zu erkennen, dass ein Wert eine positive Ganzzahl ist.
Methode 1 gibt true für eine negative Ganzzahl zurück, aber false für eine Zeichenfolge, die einer negativen Ganzzahl entspricht. Verwenden Sie diese Methode also nur, wenn Sie sicher sind, dass Ihre Eingabe niemals eine negative Zahl in Zeichenfolgen- oder Ganzzahlform enthalten wird, und wenn dies der Fall ist , wird Ihr Prozess dieses Verhalten nicht unterbrechen.
Schlussfolgerungen
Wenn Sie also sicher sind, dass Ihre Eingabe keine negative Zahl enthält, ist die Verwendung fast doppelt so schnell is_int und ctype_digit um zu bestätigen, dass Sie eine Ganzzahl haben. Die Verwendung von Methode 1 mit einem Fallback auf Methode 5, wenn die Variable eine Zeichenfolge und das erste Zeichen ein Bindestrich ist, ist die nächstschnellere Methode (insbesondere, wenn ein Großteil der Eingabe aus tatsächlichen ganzen Zahlen oder positiven Zahlen in einer Zeichenfolge besteht). Alles in allem, wenn Sie eine solide Konsistenz benötigen und keine Ahnung haben, welche Mischung von Daten hereinkommt, und Sie auf konsistente Weise mit Negativen umgehen müssen, filter_var($value, FILTER_VALIDATE_INT) !== FALSE Gewinnt.
Code, der verwendet wird, um die obige Ausgabe zu erhalten:
/!\ Beste Antwort ist nicht korrekt, is_numeric() gibt true für ganze Zahlen UND alle numerischen Formen wie “9.1” zurück
Nur für Integer können Sie das unfreundliche preg_match(‘/^\d+$/’, $var) oder den expliziten und 2-mal schnelleren Vergleich verwenden:
if ((int) $var == $var) {
// $var is an integer
}
PS: Ich weiß, dass dies ein alter Beitrag ist, aber immer noch der dritte in Google, der nach “php is integer” sucht
Das ist falsch, weil diese Bedingung auch dann erfüllt ist, wenn zB $var=”9″. Es sollte if ((int) $var === $var) sein. $a == $b Gleich TRUE, wenn $a gleich $b nach Typ-Jonglage ist. $a === $b Identisch WAHR, wenn $a gleich $b ist und sie vom gleichen Typ sind.
– valerij wasilcenko
17. April 2015 um 10:46 Uhr
beachte das (int) $var gibt Null zurück, wenn die Zeichenfolge nicht in eine Zahl umgewandelt werden kann, also: (int) 'banana' === 0
– Ignacio Segura
31. Oktober 2016 um 9:21 Uhr
Abgestimmt, da Kommentare zeigen, dass diese Antwort nicht richtig ist.
– EAmez
7. Februar 2020 um 9:01 Uhr
@IgnacioSegura, also ist es sicher, wenn es nach einem Validator wie verwendet wird if (is_numeric($var) && ((int) $var == $var)) {...}?
– Guney Ozsan
23. Mai 2020 um 13:01 Uhr
@GuneyOzsan, was Sie vorschlagen, klingt richtig, aber um ehrlich zu sein, habe ich vor zwei Jahren aufgehört, in PHP zu programmieren, und ich habe eine Menge Dinge vergessen. Tut mir leid, dass ich nicht hilfreicher sein könnte.
– Ignacio Segura
24. Mai 2020 um 15:14 Uhr
Aleksandr
Die Lösung von Doctormad ist nicht korrekt. Versuche dies:
$var="1a";
if ((int) $var == $var) {
var_dump("$var is an integer, really?");
}
das druckt
1a ist wirklich eine ganze Zahl?”
verwenden filter_var() mit FILTER_VALIDATE_INT Streit
$data = Array('0', '1', '1a', '1.1', '1e', '0x24', PHP_INT_MAX+1);
array_walk($data, function ($num){
$is_int = filter_var($num, FILTER_VALIDATE_INT);
if ($is_int === false)
var_dump("$num is not int");
});
das druckt
1a is not int
1.1 is not int
1e is not int
0x24 is not int
9.2233720368548E+18 is not int
Das ist falsch, weil diese Bedingung auch dann erfüllt ist, wenn zB $var=”9″. Es sollte if ((int) $var === $var) sein. $a == $b Gleich TRUE, wenn $a gleich $b nach Typ-Jonglage ist. $a === $b Identisch WAHR, wenn $a gleich $b ist und sie vom gleichen Typ sind.
– valerij wasilcenko
17. April 2015 um 10:46 Uhr
beachte das (int) $var gibt Null zurück, wenn die Zeichenfolge nicht in eine Zahl umgewandelt werden kann, also: (int) 'banana' === 0
– Ignacio Segura
31. Oktober 2016 um 9:21 Uhr
Abgestimmt, da Kommentare zeigen, dass diese Antwort nicht richtig ist.
– EAmez
7. Februar 2020 um 9:01 Uhr
@IgnacioSegura, also ist es sicher, wenn es nach einem Validator wie verwendet wird if (is_numeric($var) && ((int) $var == $var)) {...}?
– Guney Ozsan
23. Mai 2020 um 13:01 Uhr
@GuneyOzsan, was Sie vorschlagen, klingt richtig, aber um ehrlich zu sein, habe ich vor zwei Jahren aufgehört, in PHP zu programmieren, und ich habe eine Menge Dinge vergessen. Tut mir leid, dass ich nicht hilfreicher sein könnte.
– Ignacio Segura
24. Mai 2020 um 15:14 Uhr
phihag
Werte $_GET sind immer Strings – das sind GET-Parameter. Deswegen, is_int($_GET[...]) ist immer falsch.
Mit können Sie testen, ob ein String nur aus Ziffern besteht (also als Zahl interpretiert werden könnte). ist_numerisch.
8707000cookie-checkPrüfen, ob eine Variable in PHP eine Ganzzahl istyes