Unerklärliches Verhalten bei Form Submit
hawkmaster1
- html
Hallo, ich habe heute ein für mich unerklärliches Verhalten bei einem Form Submit entdeckt. Ich habe zwar eine Lösung aber keine Erklärung dafür.
Es gibt eine PHP Seite mit einer Navigation oben. Wenn ich den versteckten Input Type Text "cmd_Home" so drin lasse und im Textfeld txt_kundenummer bin, dann auf die Enter Taste klicke, wird das Formular neu geladen und in der Echo Ausgabe unten steht dann "cmd profil ist ". Der Input cmd_Profil wird also nicht ausgewertet.
Wenn ich jedoch den kompletten hidden Submit Button cmd_Home rausnehme und dann wieder das gleiche mache (Textfeld => Enter taste) dann gibt die Echo Meldung "cmd profil ist Hans-Peter"
Wieso verhält sich das so? Warum ist es anders wenn das cmd_Home Input davor steht?
<form method="post" name="frm_myform" action="test.php">
<input type="submit" style="visibility:hidden" title="Home" value="Home" name="cmd_Home">
Hallo
<input type="submit" title="Profil" value="Hans-Peter" name="cmd_Profil">
....
<input type="text" value="" name="txt_kundenummer">
..
..
echo "cmd profil ist " . $_POST['cmd_Profil'] . "<br>";
Gruss Hawk
Hallo
Wenn ich den versteckten Input Type Text "cmd_Home" so drin lasse und im Textfeld txt_kundenummer bin, dann auf die Enter Taste klicke, wird das Formular neu geladen und in der Echo Ausgabe unten steht dann "cmd profil ist ". Der Input cmd_Profil wird also nicht ausgewertet.
Wenn ich jedoch den kompletten hidden Submit Button cmd_Home rausnehme und dann wieder das gleiche mache (Textfeld => Enter taste) dann gibt die Echo Meldung "cmd profil ist Hans-Peter"
Wieso verhält sich das so? Warum ist es anders wenn das cmd_Home Input davor steht?
Beim Submit über die Enter-Taste wird der erste Submit-Input übermittelt. Dabei ist es egal, ob du ihn per CSS ausgeblendet hast. Wozu brauchst du überhaupt einen versteckten Submit-Input?
Tschö, Auge
Hallo Auge,
Beim Submit über die Enter-Taste wird der erste Submit-Input übermittelt. Dabei ist es egal, ob du ihn per CSS ausgeblendet hast. Wozu brauchst du überhaupt einen versteckten Submit-Input?
Ist das immer so das dann nur der erste Submit Input übermittelt wird?
Ich brauche den eigentlich gar nicht bzw. will den eigentlich gar nicht da. Das Problem was ich habe ist jedoch: Wenn ich den versteckten "cmd_Home" weglasse, dann wird mit ja der Input "cmd_Profil" übertragen. Und den werte ich weiter unten im Code aus und inkludiere eine neue Datei.
if(isset($_POST['cmd_Profil'])){ include(profil.php); }
Und das ist dann falsch. Ich will dies nur inkludieren wenn wirklich nur auf den Button "cmd_Profil" geklickt wird. Das mit dem versteckten "cmd_Home" ist nur eine Notlösung.
Gruss hawk
Hallo
Beim Submit über die Enter-Taste wird der erste Submit-Input übermittelt. Dabei ist es egal, ob du ihn per CSS ausgeblendet hast. Wozu brauchst du überhaupt einen versteckten Submit-Input?
Ist das immer so das dann nur der erste Submit Input übermittelt wird?
Ich habe das mal mit nur drei Browsern mit einer lokalen Datei („file:///…“) und der Methode GET getestet.
Wenn ich den versteckten "cmd_Home" weglasse, dann wird mit ja der Input "cmd_Profil" übertragen. Und den werte ich weiter unten im Code aus und inkludiere eine neue Datei.
Und das ist dann falsch. Ich will dies nur inkludieren wenn wirklich nur auf den Button "cmd_Profil" geklickt wird. Das mit dem versteckten "cmd_Home" ist nur eine Notlösung.
Was mir auf Anhieb durch den Kopf geht:
Tschö, Auge
Hi,
Beim Submit über die Enter-Taste wird der erste Submit-Input übermittelt.
das ist AFAIK nicht so spezifiziert, wird aber von den meisten Browsern anscheinend gemacht.
Soweit ich die Spezifikation im Kopf habe, werden grundsätzlich nur "successful controls" übermittelt, das sind beispielsweise nur aktive Checkboxen, nur ausgewählte Radiobuttons, und eben auch nur betätigte Submit-Buttons.
Will heißen: Es wird derjenige Submit-Button übermittelt, der explizit geklickt wurde.
Schickt man das Formular aber normal ab, also mit der Enter-Taste, dann gilt eigentlich gar kein Submit als "successful". Ich wäre daher auch nicht überrascht, wenn gar keiner ankäme. Bei einem Formular mit nur einem Submit ist das Verhalten aber wohl einheitlich; dieser eine gilt automatisch als "successful". Bei mehreren Submits ist es AFAIK undefiniert.
Ciao,
Martin
Hallo
ein kleiner und unvollständiger Test.
Tschö, Auge
Yo!
Beim Submit über die Enter-Taste wird der erste Submit-Input übermittelt.
das ist AFAIK nicht so spezifiziert, wird aber von den meisten Browsern anscheinend gemacht.
Mit HTML5 ist es spezifiziert – http://www.w3.org/TR/html5/forms.html#implicit-submission:
“A form element's default button is the first submit button in tree order whose form owner is that form element. If the user agent supports letting the user submit a form implicitly (for example, on some platforms hitting the "enter" key while a text field is focused implicitly submits the form), then doing so for a form whose default button has a defined activation behavior must cause the user agent to run synthetic click activation steps on that default button.”
MfG ChrisB
echo "cmd profil ist " . $_POST['cmd_Profil'] . "<br>";
Und wieder der Kapitalfehler. Nutzereingaben sind per se böse. Niemals Nutzereingaben unbehandelt in HTML ausgeben!
echo 'cmd profil ist ' . htmlspecialchars($_POST['cmd_Profil']) . '<br>';
Die doppelten Anführungszeichen hab ich auch gleich mal korrigiert; das br
-Element noch nicht.
LLAP
Tach!
echo "cmd profil ist " . $_POST['cmd_Profil'] . "<br>";
Und wieder der Kapitalfehler. Nutzereingaben sind per se böse. Niemals Nutzereingaben unbehandelt in HTML ausgeben!
Nicht-Nutzereingaben haben dasselbe böse-Potential. Das Unterscheiden zwischen Nutzereingaben und anderen Daten ist auch per se böse.
Ausgaben zu Testzwecken, und danach sieht es mir in dem Fall aus, fallen nicht unter "niemals".
dedlfix.
Und wieder der Kapitalfehler. Nutzereingaben sind per se böse. Niemals Nutzereingaben unbehandelt in HTML ausgeben!
Nicht-Nutzereingaben haben dasselbe böse-Potential. Das Unterscheiden zwischen Nutzereingaben und anderen Daten ist auch per se böse.
OK.
Ausgaben zu Testzwecken, und danach sieht es mir in dem Fall aus, fallen nicht unter "niemals".
Beispielcodes im Forum, den auch Unwissendere mitlesen, fallen immer unter „niemals“.
LLAP
Tach!
Ausgaben zu Testzwecken, und danach sieht es mir in dem Fall aus, fallen nicht unter "niemals".
Beispielcodes im Forum, den auch Unwissendere mitlesen, fallen immer unter „niemals“.
Auch bei Beispielcodes kann man differenziert an eine Erklärung herangehen und muss kein Absolutum verkünden. Deine Aussage war auch insofern nicht ganz passend, weil es sich nicht um eine Nutzereingabe sondern um eine des Entwicklers handelte. Jetzt sind meine Erbsen alle.
dedlfix.
Hallo Gunnar,
Und wieder der Kapitalfehler. Nutzereingaben sind per se böse. Niemals Nutzereingaben unbehandelt in HTML ausgeben!
Ich verstehe ja schon das man immer wieder auf das Thema Sicherheit hinweisen soll. Ich habe aber doch extra geschrieben das es sich hier rein um eine Test- bzw. Kontrollausgabe handelt. von daher...
Gruss Hawk