Prüfen, ob eine Variable eine Ganzzahl in PHP ist
Ich habe den folgenden code
$page = $_GET['p'];
if($page == "")
{
$page = 1;
}
if(is_int($page) == false)
{
setcookie("error", "Invalid page.", time()+3600);
header("location:somethingwentwrong.php");
die();
}
//else continue with code
die werde ich verwenden für die Suche auf verschiedenen "Seiten" einer Datenbank (Ergebnisse 1-10, 11-20, usw.). Ich kann nicht scheinen, um die is_int () - Funktion, um korrekt zu arbeiten, jedoch. Setzen Sie "1" in der url (noobs.php?p=1) gibt mir den Fehler durch ungültige Seite-Fehler, als auch als sowas wie "asdf".
InformationsquelleAutor der Frage ahota | 2011-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
is_numeric()
für die überprüfung, ob eine variable eine Zahl ist eine schlechte Idee. Diese Funktion gibtTRUE
für3.14
zum Beispiel. Es ist nicht das erwartete Verhalten.Diese richtig zu tun können, verwenden Sie eine der folgenden Optionen:
Unter Berücksichtigung dieser Variablen-array :
Die erste option (FILTER_VALIDATE_INT Weg) :
Ausgabe :
Die zweite option (GIEßEN-VERGLEICH Weg) :
Ausgabe :
Die Dritte option (CTYPE_DIGIT Weg) :
Ausgabe :
Die vierte option (REGEX Weg) :
Ausgabe :
InformationsquelleAutor der Antwort CaM2091
Alle
$_GET
Parameter einen string-Datentyp, daheris_int
wird immer false zurückgeben.Können Sie sehen, das durch den Aufruf von
var_dump
:Mit
is_numeric
wird das gewünschte Ergebnis (wohlgemerkt, das können Werte wie:0x24
).InformationsquelleAutor der Antwort Tim Cooper
Wenn der browser sendet
p
im querystring, es wird empfangen als string, nicht einen int.is_int()
wird daher immer false zurück.Stattdessen versuchen
is_numeric()
oderctype_digit()
InformationsquelleAutor der Antwort Michael Berkowski
/!\ Beste anwser ist nicht korrekt, is_numeric() gibt true zurück, für integer UND alle numerischen Formen wie "9.1"
Für integer können Sie nur die verwenden, die unfreundlich preg_match('/^\d+$/', $var) oder die explizite und 2-mal schneller Vergleich :
PS: ich weiß, dies ist eine alte post, aber immer noch die Dritte in der google-Suche nach "php integer"
InformationsquelleAutor der Antwort doctormad
Sie könnten versuchen, mit einem casting-operator für die Konvertierung in eine Ganzzahl:
InformationsquelleAutor der Antwort Drewdin
Nur für kicks, getestet habe ich ein paar der genannten Methoden, plus eine, die ich verwendet habe, als meine go-to-Lösung für Jahre, wenn ich weiß, dass meine Eingabe ist eine positive Zahl oder Zeichenkette entspricht.
Getestet habe ich diese mit 125.000 Iterationen, wobei jede iteration die übergabe in den gleichen Satz von Variablen, Typen und Werte.
Methode 1:
is_int($value) || ctype_digit($value)
Methode 2:
(string)(int)$value == (string)$value
Methode 3:
strval(intval($value)) === strval($value)
Methode 4:
ctype_digit(strval($value))
Methode 5:
filter_var($value, FILTER_VALIDATE_INT) !== FALSE
Methode 6:
is_int($value) || ctype_digit($value) || (is_string($value) && $value[0] === '-' && filter_var($value, FILTER_VALIDATE_INT) !== FALSE)
Methode 1: 0.0552167892456
Methode 2: 0.126773834229
Methode 3: 0.143012046814
Methode 4: 0.0979189872742
Methode 5: 0.112988948822
Methode 6: 0.0858821868896
(Ich wusste nicht einmal, testen der regex, ich meine, ernsthaft... regex?)
Dinge zu beachten:
Methode 4 liefert stets false für negative zahlen (negative integer-oder string-äquivalent), so ist eine gute Methode, um konsequent zu erkennen, dass ein Wert eine positive Ganzzahl ist.
Methode 1 ergibt true für eine negative ganze Zahl, aber die falsche für eine entsprechende Zeichenfolge eine negative ganze Zahl, so ist diese Methode nicht verwenden, es sei denn, Sie sind sicher, Ihre Eingabe werden, enthalten nie eine negative Zahl in eine Zeichenkette oder ein integer-Formular, und wenn Sie es tut, wird Ihr Prozess nicht brechen dieses Verhalten nicht.
Schlussfolgerungen
Es scheint also, dass, wenn Sie sicher sind, dass Ihre Eingabe nicht include eine negative Zahl ist, dann ist es fast doppelt so schnell
is_int
undctype_digit
um zu überprüfen, dass Sie haben eine Ganzzahl. Methode 1 verwenden, mit einer fallback-Methode 5 wenn die variable ist ein string und das erste Zeichen ist ein Strich, ist die nächste Schnellste (vor allem, wenn eine Mehrheit der Eingang ist tatsächlich ganze zahlen oder positive zahlen in einer Zeichenfolge). Alles in allem, wenn Sie brauchen Feste Konsistenz, und Sie haben keine Ahnung, was das mischen von Daten kommen, und Sie müssen Verneinung in konsistenter Weise,filter_var($value, FILTER_VALIDATE_INT) !== FALSE
gewinnt.Code verwendet, um den Ausgang oben:
InformationsquelleAutor der Antwort Jonathan Falkner
Werte
$_GET
sind immer strings – das ist, was GET-Parameter kommen. Daheris_int($_GET[...])
ist immer falsch.Können Sie testen, ob ein string nur aus Ziffern besteht(d.h. interpretiert werden könnte als eine Zahl) mit is_numeric.
InformationsquelleAutor der Antwort phihag
Ich hatte ein ähnliches problem nur das jetzt!
Können Sie die
filter_input()
Funktion mitFILTER_VALIDATE_INT
undFILTER_NULL_ON_FAILURE
zu filtern, die nur ganzzahlige Werte aus der$_GET
variable. Funktioniert Recht genau! 🙂Überprüfen Sie heraus meine Frage hier: Wie um zu überprüfen, ob eine variable in $_GET-Array eine Ganzzahl ist?
InformationsquelleAutor der Antwort maxxon15
Versuchen Gießen und überprüfen, ob es ist eine Zahl, die zunächst.
InformationsquelleAutor der Antwort Brad Christie
doctormad die Lösung ist nicht korrekt. versuchen Sie dies:
diese Drucke
verwenden filter_var() mit FILTER_VALIDATE_INT argument
diese Drucke
InformationsquelleAutor der Antwort Aleksandr
Verwenden
is_int($var)
Hier ist tutorial darüber, is_int()
InformationsquelleAutor der Antwort Malay M
Eine ganze Zahl (beginnend mit 0 wird die Ursache fatal error in PHP 7, da es möglicherweise zu interpretieren als eine oktale Zeichen.
So möchten Sie vielleicht zu entfernen führende Nullen vor Ihrer ganze Zahl, die erste:
InformationsquelleAutor der Antwort Lucas Bustamante