Buttonname trotz disabled

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Buttonname trotz disabled

    Hallo.

    Ich brauche in einem Form 2 Buttons.

    Da die Benutzer ständig doppelt auf Buttons klicken, wird das Form 2x abgeschickt und ich erhalte doppelte Einträge in der DB.

    Also schalte ich den jew. gedrückten Button nach dem Klick einfach ab.

    Und hier klemmt es nun, denn wenn ich this.disabled=true; setze, wird mir der Button-Name nicht mehr übermittelt und ich weiß nicht, welchen Button sie gedrückt haben.

    Hier mal ein minimalistisches Beispiel buttontest.php:
    PHP-Code:
    <?php
    print_r
    ($_POST);
    echo 
    "<form name='buttontest' action='buttontest.php' method='post'>";
    echo 
    "<input type='submit' name='buttoneins' id='buttoneins' value='Button 1 (disabled)' onclick='this.disabled=true;document.buttontest.submit();'>";
    echo 
    "<input type='submit' name='buttonzwei' id='buttonzwei' value='Button 2' onclick='document.buttontest.submit();'>";
    echo 
    "</form>";
    ?>
    "buttoneins" wird nie übermittelt.
    (Im obigen Beispiel wird Button 2 nicht abgeschaltet. Im richtigen Skript natürlich schon, sonst wäre es ja auch einfach zu unterschieden, welcher Button gedrückt wurde. )

    Wie bekomme ich es nun hin, dass ich
    1. weiß, welcher Button gedrückt wurde
    2. wg. des Doppelklicks keine doppelten Einträge mehr bekomme?

    cya
    Zuletzt geändert von sallow2001; 22.06.2012, 11:08. Grund: Lösung selber gefunden

  • #2
    Hab's geschafft. Falls auch mal jemand vor diesem Problem steht, hier eine Lösung:

    PHP-Code:
    <?php
    sleep
    (1);
    if (isset(
    $_POST['buttonpressed1']))
    {
       echo 
    "Button 1 wurde gedrueckt.<br>\n";
    }
    if (isset(
    $_POST['buttonpressed2']))
    {
       echo 
    "Button 2 wurde gedrueckt.<br>\n";
    }
    echo 
    "<form name='buttontest' action='buttontest.php' method='post'>\n";
    echo 
    "<input type='submit' name='buttoneins' id='buttoneins' value='Button 1' onclick='document.getElementById(\"buttonpressed1\").checked=true; document.getElementById(\"buttonzwei\").disabled=true; this.disabled=true; document.buttontest.submit(); '>\n";
    echo 
    "<input type='submit' name='buttonzwei' id='buttonzwei' value='Button 2' onclick='document.getElementById(\"buttonpressed2\").checked=true; document.getElementById(\"buttoneins\").disabled=true; this.disabled=true; document.buttontest.submit(); '>\n";
    echo 
    "<input type='checkbox' name='buttonpressed1' id='buttonpressed1' style='display:none;' value=''>\n";
    echo 
    "<input type='checkbox' name='buttonpressed2' id='buttonpressed2' style='display:none;' value=''>\n";
    echo 
    "</form>\n";
    ?>
    sleep() ist drin, damit man beim Testen sieht, dass die Buttons wirklich disabled werden. Sonst geht's halt zu schnell.

    Beim onclick setze ich den Wert einer Checkbox (die aber unsichtbar ist), dessen Wert per POST übermittelt wird.

    Also kann ich anhand des Checkbox-Wertes bzw. -Namens ermitteln, welcher Button gedrückt wurde.

    Erfolgreich getestet im FF 13.0.1 und IE8
    [COLOR=red]EDIT:[/COLOR] Im IE9 und SRWare Iron 17.0.x geht's auch.
    (Hatte ich nicht anders erwartet, aber man muss es ja mal getestet haben. )

    cya
    Zuletzt geändert von sallow2001; 22.06.2012, 11:26.

    Kommentar


    • #3
      ...und wenn ich JavaScript deaktiviere, geht's nicht mehr

      mfg streuner
      Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
      der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

      "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

      Kommentar


      • #4
        Das ist irgendwie klar, oder?

        cya

        Kommentar


        • #5
          Ich dachte, Du hättest jetzt einen Alternativ-Vorschlag für mich (uns), wie man das ohne JavaScript und ohne Client-Zusatzsoftware realisieren kann?

          cya

          Kommentar


          • #6
            Warum kennzeichnest du das Formular nicht mit einem eindeutigen Token, der nur einmalig gültig ist? Dann kann der Benutzer das Formular 100mal absenden, wird es nur beim ersten mal etwas bewirken.

            Kommentar


            • #7
              Um sich gegen einen Angreifer zu wehren, ist ein Token eine gute Wahl, doch für den LIVE-Betrieb mit Usern wohl eher nicht zu empfehlen.

              Angenommen, ich statte das Formular mit einem Token aus.

              a)
              Der Benutzer füllt das Formular aus

              b)
              Der klickt 1x auf den Button

              c)
              Das Form wird ans Skript geschickt, das Skript prüft den (das?) Token, löscht ihn bzw. macht ihn ungültig und am Ende kommt die Meldung "Speicherung erfolgreich" (oder was auch immer das Skript machen sollte)
              Alles in Butter.

              Aber:
              Nach dem ersten Klick wird ja der Token ungültig gemacht, so dass die Gültigkeitsprüfung beim 2. Aufruf (also durch den 2. Klick) einen Fehler verursachen würde. (Fehlermeldung, weiße Seite, whatever)

              Das heißt, dass der Benutzer ständig in eine Fehlermeldung rennen wird, weil er zu blöd ist (sorry, ist leider so) zu verstehen, dass man Buttons nur einmal anklicken muss.

              Die Folge ist: Mein Telefon läuft heiß und mein Auftraggeber bekommt einen Wutanfall, weil seine Leute nicht effektiv arbeiten können.

              Oder sehe ich das Szenario falsch?

              cya

              Kommentar


              • #8
                Richtig. Optimal wäre eine clientseitige Lösung mittels JavaScript um eine bessere Deppensi... ähh... Usability zu gewährleisten, sowie eine serverseitige Lösung, um mutwilligen Mehrfachversand bzw. Clients ohne JavaScript abzufangen.

                Kommentar


                • #9
                  Mutwillig klickt bei mir niemand drauf (bekannter Benutzerkreis). Das sind nur User, die das System benutzen wollen/müssen...nur sind sie manchmal halt etwas deppert.

                  cya

                  Kommentar


                  • #10
                    Na dann zerstöre den Token halt nicht, sondern deklariere ihn nur als bereits verarbeitet – und wenn er zum zweiten Mal verwendet wird, gibst du eine Meldung aus, dass die Daten bereits gespeichert wurden … zusammen mit der clientseitigen Doppel-Abschick-Sperre sollte das doch wohl das Höchstmaß an Komfort bieten, das man als Deppennutzer erwarten darf.

                    (Das Vorhalten der Tokens muss natürlich nicht bis in alle Ewigkeit erfolgen, für einen begrenzten Zeitraum reicht aus.)
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Ich will ja nicht gegenreden, aber....

                      Zitat von wahsaga Beitrag anzeigen
                      dass die Daten bereits gespeichert wurden …
                      ...was ist, wenn sie nicht gespeichert wurden, weil ein Fehler bei der Eingabe vorlag? (bspw. Feld nicht ausgefüllt)

                      Was soll ich dann anzeigen. "Fehler passiert, aber weiß nicht mehr, welcher"? Oder soll ich die "alte" Fehlermeldung auch noch mitschleppen und alles merken, was gut und was schiefgelaufen ist? (Daten gespeichert, Mail geschickt, interne Nachricht abgesetzt,...)

                      Nee, sorry, da sehe ich den Aufwand/Nutzen von Tokens nicht.

                      cy

                      Kommentar


                      • #12
                        Zitat von sallow2001 Beitrag anzeigen
                        ...was ist, wenn sie nicht gespeichert wurden, weil ein Fehler bei der Eingabe vorlag? (bspw. Feld nicht ausgefüllt)
                        Dann kennzeichnest du das Token selbstverständlich noch nicht als benutzt …

                        Und das bei fehlerhafter Validierung das ganze in Affenformular-Manier erneut vorgelegt wird, sollte eh selbstverständlich sein.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Zitat von wahsaga Beitrag anzeigen
                          Dann kennzeichnest du das Token selbstverständlich noch nicht als benutzt …
                          Aber trotzdem müsste ich mir beim 1. Klick merken, dass das Formular bereits abgeschickt wurde, denn sonst käme ich beim 2. Klick in einen Teufelskreis.

                          Zitat von wahsaga Beitrag anzeigen
                          Und das bei fehlerhafter Validierung das ganze in Affenformular-Manier erneut vorgelegt wird, sollte eh selbstverständlich sein.
                          Affenformular-Manier? Sorry, das sagt mir nichts. Was ist das?

                          cya

                          Kommentar


                          • #14
                            Zitat von sallow2001 Beitrag anzeigen
                            Aber trotzdem müsste ich mir beim 1. Klick merken, dass das Formular bereits abgeschickt wurde, denn sonst käme ich beim 2. Klick in einen Teufelskreis.
                            Warum?

                            Zitat von sallow2001 Beitrag anzeigen
                            Affenformular-Manier? Sorry, das sagt mir nichts. Was ist das?
                            Affenformular ? Wikipedia

                            Kommentar


                            • #15
                              Zitat von sallow2001 Beitrag anzeigen
                              Aber trotzdem müsste ich mir beim 1. Klick merken, dass das Formular bereits abgeschickt wurde, denn sonst käme ich beim 2. Klick in einen Teufelskreis.
                              Wieso? Nicht erfolgreich validierte Daten werden nicht in die DB eingetragen, und der Benutzer zum Nachbessern aufgefordert – ganz egal, ob er sie zum ersten oder dreiunfünzigsten Mal abgeschickt hat.

                              (Damit er nicht umsonst abschickt, wenn die Daten noch gar nicht vollständig sind, können die neuen HTML5-Attribute für Formularelemente sowie JavaScript zum Einsatz kommen.)
                              Affenformular-Manier? Sorry, das sagt mir nichts. Was ist das?
                              :seufz: http://www.google.com/search?q=affenformular
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X