POST Daten auf Ganzzahl > 0 prüfen

Mik3e

Erfahrenes Mitglied
Hi zusammen,

Ich stehe vor dem Problem, dass ich eine per POST übertragene Variable nach folgenden Kriterien prüfen muss:

1. Es muss eine Ganzzahl sein (keine Dezimalzahl)
2. Diese Zahl darf nicht negativ sein (>=0)

Ich habe die Lösung so angedacht (ist ja eigentlich ne simple Geschichte):
PHP:
if (!is_numeric($configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH']) || is_float($configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH']) || $configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH']<0) {
			$this->error->addErrorMessage("Sie haben einen ungültigen Wert für Mindestlänge des Kunden-Vornamens gewählt!");
			return false;
		}

Doch jetzt kommt das aber:
is_numeric klappt wunderbar, schließt aber Floats nicht aus. is_float (resp. is_double) funktioniert allerdings nicht, da er die Variable $configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH'] (vermutlich) als String ansieht.

D.h. ich kann bei der oberen Lösung den Wert 2.345 ohne Probleme eingeben.
Habt Ihr eine Idee, wie ich die Sache lösen kann? Ich verwende übrigens PHP 5.1.2...

Danke & Ciao,
Mike
 
Probier mal folgenden Ausdruck:
Code:
intval($configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH']) != $configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH'] || intval($configurationSettings['CUSTOMER_FIRST_NAME_MIN_LENGTH']) < 0
 
Hast Du es schon mal mathematisch versucht?
PHP:
if ($var != floor($var) || $var<0) {
    // bad value
}
Gruß hpvw
 
Hi,

Also hp's Variante hat nicht geklappt leider... Müsste man noch mit is_numeric bündeln.
Habe eine ähnliche Lösung wie Gumbo nach einigem rumprobieren mit [phpf]settype()[/phpf] gefunden, die mir recht elegant scheint:

PHP:
if (!is_numeric($var) || !settype($var, "integer") || $var<0) {
			$this->error->..........

Seht ihr dabei irgendein Problem Habs mit einigen Daten getestet, und es gab kein Problem. Der Vorteil ist, dass er Dezimalzahlen gleich in Ganzzahlen konvertiert. Allerdings weiß ich nicht, wie er bei der Typisierung rundet...

EDIT: Schwachsinn, er rundet natürlich nicht, sondern schneidet die nachkommstellen ab...
 
Ein Nachteil deiner Variante, Mike, ist, dass der Originalwert nicht bestehen bleibt. Falls dies für dich allerdings kein Grund ist, diese Variante nicht zu nutzen, erfüllt sie ihren Zweck.
 
Du kannst mal folgende Variante auf String-Basis auf Herz und Nieren testen:
PHP:
<form method="get" action="<?php echo basename($_SERVER['PHP_SELF']); ?>">
    <input type="text" name="var" value="<?php
        echo (isset($_GET['var'])?trim($_GET['var']):''); ?>">
    <input type="submit">
</form>
<?php
if (isset($_GET['var'])) {

    if (preg_replace("/[^\d]+/","",$_GET['var'])!=trim($_GET['var'])) {
        echo "BAD VALUE<br>\n";
    } else {
        echo "GOOD VALUE<br>\n";
    }

    var_dump($_GET['var']);
} else {
    echo "no value";
}
?>
Ich habe jetzt allerlei Eingaben getestet und konnte noch keinen Fehler entdecken. EDIT: Außer, dass ein leerer String akzeptiert wird, wenn dies nicht als 0 gewertet werden soll.

Gruß hpvw
 
Zurück