IF Abfragen
Folgendem Script geht ein php Formular voran indem der Wert Test übergeben wird.
Servus zusammen,
habe folgendes Problem mit einen script dass ich gerade am schreiben bin. Und zwar möchte ich
mehrere IF Vergleiche anstellen die sich wie folgt darstellen:
$test = $_POST["test"]; <------ wird von einer anderen Datei übergeben
if($test =="" )
{
echo "Es wurde kein Wert angegeben";
}
else if($test > "7")
{
echo "Wert ist zu hoch ";
}
else if($test < "6" )
{
echo "Wert ist zu niedrig ";
}
else
{
echo "Wert ist in Ordnung";
}
?>
Klappt auch alles Wunderbar nur wenn ich jetzt anstatt else if($test > "7") :
else if($test > "7,5") praktisch 7,5 als Wert hinterlege funktioniert die Übergabe nur bis 9,9
sobald vom Formular über dass ich die Daten übergebe der Wert 10 übergeben wird schreibt er mir die Antwort zu niedrig.
Wie kann dass denn sein ?
Hoffe das war nicht zu kompliziert !!
Kann mir da jemand helfen ?
Danke für eure Antworten
Gruß voipfreak
Servus zusammen,
habe folgendes Problem mit einen script dass ich gerade am schreiben bin. Und zwar möchte ich
mehrere IF Vergleiche anstellen die sich wie folgt darstellen:
$test = $_POST["test"]; <------ wird von einer anderen Datei übergeben
if($test =="" )
{
echo "Es wurde kein Wert angegeben";
}
else if($test > "7")
{
echo "Wert ist zu hoch ";
}
else if($test < "6" )
{
echo "Wert ist zu niedrig ";
}
else
{
echo "Wert ist in Ordnung";
}
?>
Klappt auch alles Wunderbar nur wenn ich jetzt anstatt else if($test > "7") :
else if($test > "7,5") praktisch 7,5 als Wert hinterlege funktioniert die Übergabe nur bis 9,9
sobald vom Formular über dass ich die Daten übergebe der Wert 10 übergeben wird schreibt er mir die Antwort zu niedrig.
Wie kann dass denn sein ?
Hoffe das war nicht zu kompliziert !!
Kann mir da jemand helfen ?
Danke für eure Antworten
Gruß voipfreak
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 168630
Url: https://administrator.de/contentid/168630
Ausgedruckt am: 25.11.2024 um 08:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo Voipfreak,
dieses Verhalten ist völlig korrekt :-P
Nur das was du Programmiert hast, entspricht nicht dem was du eigentlich möchtest !
Hä ? Was schreibt der Kerl den da !?
Ist eigentlich ganz einfach:
Es gibt Zahlen, also __numerische__ Werte und
es gibt Zeichen, also __alphanumerische__ Werte
Deswegen gibt es auch zwei Arten der Sortierung:
Wenn man numerisch sortiert:
Wenn man alphanumerisch sortiert
Deine Werte, sowohl die übergebenen aus dem Formular, als auch die in den Bedingungen selber sind alle __alphanumerisch__ !
Wie du an den Beispielen sehen kannst kommt, bei einem alphanumerischen Vergleich, die 10 __vor__ der 7 - selbst 1000000 kommt __vor__ der 2 !
Du musst als deine Zahlen numerisch vergleichen.
So kommt es auch das deine Vergleiche alle alphanumerisch sind.
Als erstes also erst mal alle Kommas durch Punkte ersetzen: 7,5 = 7.5 und
dann in den Vergleichen die Anführungszeichen um die Zahlen entfernen damit sie numerisch bleiben.
Zu den Eingaben vom Formular schau dir mal das "Type Juggling" an PHP-Manual - Type Juggling (cast)
Du musst also die erhaltene Zeichenkette in einen numerischen Wert umzuwandeln -casten !
Es gibt auch noch PHP-Manual - is_numeric() für den Fall das ein Anwende mal etwas anders als einen numerischen Wert eingibt
"Alle Benutzereingaben sind Böse und sollten entsprechend vorsichtig behandelt werden"
~Arano
dieses Verhalten ist völlig korrekt :-P
Nur das was du Programmiert hast, entspricht nicht dem was du eigentlich möchtest !
Hä ? Was schreibt der Kerl den da !?
Ist eigentlich ganz einfach:
Es gibt Zahlen, also __numerische__ Werte und
es gibt Zeichen, also __alphanumerische__ Werte
Deswegen gibt es auch zwei Arten der Sortierung:
Wenn man numerisch sortiert:
1
2
3
7
10
12
20
50
1
10
12
2
20
3
50
7
Deine Werte, sowohl die übergebenen aus dem Formular, als auch die in den Bedingungen selber sind alle __alphanumerisch__ !
Wie du an den Beispielen sehen kannst kommt, bei einem alphanumerischen Vergleich, die 10 __vor__ der 7 - selbst 1000000 kommt __vor__ der 2 !
Du musst als deine Zahlen numerisch vergleichen.
- Kommazahlen werden mit einem Punkt geschreiben: 7,5 = 7.5, 9,9 = 9.9
- Sobald numerische Werte (z.B. 7.5) in Anführungszeichen stehen, ist es eine Zeichenkette also alphanumerisch.
- Werte die von einem Formular übergeben werden sind __immer__ alphanumerisch.
So kommt es auch das deine Vergleiche alle alphanumerisch sind.
Als erstes also erst mal alle Kommas durch Punkte ersetzen: 7,5 = 7.5 und
dann in den Vergleichen die Anführungszeichen um die Zahlen entfernen damit sie numerisch bleiben.
Zu den Eingaben vom Formular schau dir mal das "Type Juggling" an PHP-Manual - Type Juggling (cast)
Du musst also die erhaltene Zeichenkette in einen numerischen Wert umzuwandeln -casten !
Es gibt auch noch PHP-Manual - is_numeric() für den Fall das ein Anwende mal etwas anders als einen numerischen Wert eingibt
"Alle Benutzereingaben sind Böse und sollten entsprechend vorsichtig behandelt werden"
~Arano
Anders gesagt:
POST-Übergabewerte sind immer Strings und
Was hier passiert ist kein Zahlenvergleich sondern ein
Das hat z.B. den Effekt:
Warum?
Weil hier die Buchstaben 1 und 7 verglichen werden und die 1 (entspricht 49) hat einen kleineren Wert als 7 (entspricht 55).
Karsten hilft an der Stelle auch nichts, denn:
Da hilft nur die Daten wirklich zu parsen (siehe die Kommentare zu
Denn sonst:
Das Dezimaltrennzeichen beim Programmieren ist immer der Punkt!
POST-Übergabewerte sind immer Strings und
"7,5"
ist auch ein String.Was hier passiert ist kein Zahlenvergleich sondern ein
strcmp()
.Das hat z.B. den Effekt:
<?php
var_dump("10,0" > "7,5"); #=> bool(false)
?>
Weil hier die Buchstaben 1 und 7 verglichen werden und die 1 (entspricht 49) hat einen kleineren Wert als 7 (entspricht 55).
Karsten hilft an der Stelle auch nichts, denn:
<?php
$a = "7,5";
var_dump((float)$a); #=> float(7)
?>
Da hilft nur die Daten wirklich zu parsen (siehe die Kommentare zu
floatval()
im Handbuch).Denn sonst:
<?php
var_dump("7,7" < 7.5); #=> bool(true)
?>
Das Dezimaltrennzeichen beim Programmieren ist immer der Punkt!