switch - case wird nicht angesprungen
henman
- php
hallöchen!
ich hab folgendes Problem:
Über $_GET lass ich mir eine Variable "holen", diese lass ich dann nochmal die Funktion htmlspecialchars durchlaufen und setze sie dann in switch ein
Komischerweise wird nie das entsprechende case angesprungen. Ich hab mir die Variable mit echo ausgeben lassen - ein simples Wort ohne äöü oder sonstiges -, das wird angezeigt. Nur klappt der switch nicht, auch nicht, wenn ich htmlspecialchars weglasse.
Hier mal ein Beispiel-Quelltext:
if (!$_GET["o"])
$ordnen = "";
else
{$ordnen =htmlspecialchars($_GET["o"]);
echo $ordnen;
switch ($ordnen){
case 'username':$ordnen = "username";
case 'reg':$ordnen = "user_regdate";
case 'posts':$ordnen = "user_posts";
case 'gil':$ordnen = "user_points";
case 'clan':$ordnen = "clan_id";
case 'email':$ordnen = "user_email";
case 'icq':$ordnen = "user_icq";
case 'msn':$ordnen = "user_msnm";
case 'yim':$ordnen = "user_yim";
case 'web':$ordnen = "user_website";
default:exit;
}
$ordnen = "ORDER BY \".$ordnen."\ DESC";
}
echo "
<span class=\"member_username\">
<a href=\"".$adressanhang_o."=user\"><b>Username</b></a>
</span>
<span class=\"member_regdate\"><a href=\"".$adressanhang_o."=reg\"><b>Registrierung</b>
</span>
<span class=\"member_posts\"><a href=\"".$adressanhang_o."=posts\"><b>Beiträge</b>
</span>
<span class=\"member_gil\"><a href=\"".$adressanhang_o."=gil\"><b>Gil</b>
</span>
<span class=\"member_clan\"><a href=\"".$adressanhang_o."=clan\"><b>Clan</b>
</span>
<span class=\"member_email\"><a href=\"".$adressanhang_o."=email\"><b>E-Mail</b>
</span>
<span class=\"member_ICQ\"><a href=\"".$adressanhang_o."=icq\"><b>ICQ</b>
</span>
<span class=\"member_MSN\"><a href=\"".$adressanhang_o."=msn\"><b>MSN</b>
</span>
<span class=\"member_YIM\"><a href=\"".$adressanhang_o."=yim\"><b>YIM</b>
</span>
<span class=\"member_website\"><a href=\"".$adressanhang_o."=web\"><b>Web</b>
</span>";
$adressanhang_o ist nur ein weiterer Teil der Url
Ich wette, es ist wiedermal nur eine Kleinigkeit, aber ich komm nicht drauf. Auch Google konnte nicht helfen.
Fragt mich nicht, warum das erste "<span class=" anders eingefärbt ist, es sollte aber in Wirklichkeit korrekt sein.
Danke für die Hilfe
Hi
Ich wette, es ist wiedermal nur eine Kleinigkeit,
kleine Ursache, grosse Wirkung: break vergessen.
Gruesse, Joachim
kleine Ursache, grosse Wirkung: break vergessen.
... und ich guck immer schön die Dokumentation rauf und runter: "ach sieh an, da steht break!... egal."
Dankeschön :)
Hello,
ich hab folgendes Problem:
Über $_GET lass ich mir eine Variable "holen", diese lass ich dann nochmal die Funktion htmlspecialchars durchlaufen und setze sie dann in switch ein
Wozu soll das htmlspecialchars() gut sein, wenn Du mit Rohdaten arbeiten willst? htmlspecialchars() macht aus den Rohdaten html-fähige Werte, also solche, die im html-Kontext verwendet werden dürfen.
In Deinem Fall käme eventuell stripslashes() in Frage, wenn die magric Quotes eingeschaltet sind bei deiner PHP-Installation -> http://de2.php.net/manual/de/function.get-magic-quotes-gpc.php
Komischerweise wird nie das entsprechende case angesprungen. Ich hab mir die Variable mit echo ausgeben lassen - ein simples Wort ohne äöü oder sonstiges -, das wird angezeigt. Nur klappt der switch nicht, auch nicht, wenn ich htmlspecialchars weglasse.
Hier mal ein Beispiel-Quelltext:
[code lang=php]
#> if (!$_GET["o"])
#> $ordnen = "";
#> else
if isset($_GET["o"])
{
#> {$ordnen =htmlspecialchars($_GET["o"]);
#> echo $ordnen;
echo "o: {$_GET["o"]}";
#> switch ($ordnen){
switch $_GET["o"]
{
case 'username': $ordnen = "username";
break;
case 'reg': $ordnen = "user_regdate";
break;
case 'posts': $ordnen = "user_posts";
break;
case 'gil': $ordnen = "user_points";
break;
case 'clan': $ordnen = "clan_id";
break;
case 'email': $ordnen = "user_email";
break;
case 'icq': $ordnen = "user_icq";
break;
case 'msn': $ordnen = "user_msnm";
break;
case 'yim': $ordnen = "user_yim";
break;
case 'web': $ordnen = "user_website";
break;
default:exit;
}
$ordnen = "ORDER BY ".$ordnen."\ DESC";
Die Switch-Anweisung bestimmt über das passende Case den Einsprungspunkt in die nachfolgende Sequenz. Das bedeutet also, dass alle Anweisungen, die nach dem case-Treffer folgen, ausgeführt werden. Eine weitere Case-Auswertung findet aber nicht statt!
Um nur die eine Anweisung direkt nach den Case-Treffer ausführen zu lassen, muss ihr ein jeweils ein break folgen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Wozu soll das htmlspecialchars() gut sein, wenn Du mit Rohdaten arbeiten willst? htmlspecialchars() macht aus den Rohdaten html-fähige Werte, also solche, die im html-Kontext verwendet werden dürfen.
Ich versuche nur, die Seite so gut es geht gegen XSS o.ä. abzusichern, aber ich bin noch "nicht lang im Geschäft". ;)
das mit break; wurd ja schon geklärt. Ich dachte, dass das nur nötig ist, wenn mit Zahlen gearbeitet wird, denn 2 kann ja größer sein als 1, aber nicht Zwei größer Eins oder Paul größer Maik... oder nicht?
Wieder was dazugelernt.
Hallo,
»» Wozu soll das htmlspecialchars() gut sein, wenn Du mit Rohdaten arbeiten willst? htmlspecialchars() macht aus den Rohdaten html-fähige Werte, also solche, die im html-Kontext verwendet werden dürfen.
Ich versuche nur, die Seite so gut es geht gegen XSS o.ä. abzusichern, aber ich bin noch "nicht lang im Geschäft". ;)
die Absicht ist an sich richtig, nur das Werkzeug falsch. ;-)
das mit break; wurd ja schon geklärt. Ich dachte, dass das nur nötig ist, wenn mit Zahlen gearbeitet wird, denn 2 kann ja größer sein als 1, aber nicht Zwei größer Eins oder Paul größer Maik... oder nicht?
Erstens: Doch, auch für Strings gibt es eine größer/kleiner-Relation, dabei werden die Strings einfach Zeichen für Zeichen vergleichen. So gilt z.B.
"Wurm" > "Turm" weil der Code von 'W' größer ist als von 'T'
"sieben" < "siegen" weil der Code von 'b' kleiner ist als von 'g'
"Pilsen" > "Pils" weil die ersten vier Zeichen gleich sind, "Pilsen"
aber noch zwei Zeichen mehr hat.
Interessant ist das, wenn man glaubt, Zahlen zu vergleichen, in Wahrkeit aber mit Strings hantiert - beispielsweise beim Lesen von Eingabefeldern. Das führt zu unerwarteten Ergebnissen wie z.B.
"31" > "1000" weil das Zeichen '3' einen höheren Code hat als '1'
Allerdings ist das hier alles irrelevant, weil die switch-case-Anweisung ja in jedem Zweig nur auf Gleichheit prüft und nicht auf größer oder kleiner.
Zweitens: Die switch-case-Konstruktion arbeitet per Definition so, dass der erste zutreffende case-Zweig angesprungen wird, alle nachfolgenden aber der Reihe nach auch, wenn man nicht mit einem break aus der switch-Anweisung "ausbricht".
Wieder was dazugelernt.
Das ist immer gut.
So long,
Martin