hawkmaster1: Unerklärliches Verhalten bei Form Submit

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

  1. 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

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    1. 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

      1. 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.

        1. Firefox: Es wird der erste Submit-Input übermittelt, auch wenn dieser unsichtbar ist.
        2. Chromium: Es wird wie beim Firefox der erste Submit-Input übermittelt, auch wenn dieser unsichtbar ist.
        3. IE 11: Es wird der erste sichtbare Submit-Input übermittelt. Er verhält sich so, wie du es anfangs erwartet hast.

        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:

        • Du kannst die Entscheidung von einem zusätzlichen Formularfeld abhängig machen (z.B. zwei Radiobuttons) und mit nur einem Submit arbeiten. Das erfordert aber eine weitere Eingabe vom Benutzer, sobald vom Standardwert abgewichen wird.
        • Du kannst eine Prüfung über JS einbauen, die eventuell vorhandene Abhängigkeiten prüft. Z.B.: Nimm cmd_Profil dann, wenn txt_kundenummer ausgefüllt ist, sonst nimm cmd_Home. Das solltest du aber nur bei einer Webanwendung machen, die eh JS voraussetzt.
        • Wenn du alleiniger Nutzer des Formulars bist, verlasse dich darauf, den richtigen™ Button zu benutzen und fluche herzhaft wie ein Bierkutscher, wenn du's vergisst.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    2. 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

      1. Hallo

        ein kleiner und unvollständiger Test.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
      2. 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

  2. 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

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. 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.

      1. 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

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. 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.

    2. 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