Übergeben von Formulardaten

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

  • Übergeben von Formulardaten

    hallo,

    zur Zeit programmiere ich an einem Projekt mit vielen Formularen. Die Formulare werden so realisiert, dass die Seite sich beim Drücken des Submit-Buttons selber wieder aufruft, und in Abhängigkeit des Button-Wertes verschiedene Funktionen ausführt.

    Mein Problem ist nun, dass ich häufiger die Formulardaten in der Variablen _POST über mehrere Schritte erhalten muss. Wenn z.B. der Nutzer den Button Speichern betätigt, erscheint zuerst eine Warnmeldung (wirklich speichern ?), und anschließend soll entweder der neue oder der alte Formularinhalt (vor der Änderung) wieder angezeigt werden.

    Zur Zeit löse ich das Problem, indem ich z.B. in den Warnmeldemasken den ganzen Formularinhalt als hidden-Felder ablege. Dies ist jedoch extrem mühselig zu programmieren, und bei größeren Formularen extrem serviceunfreundlich.

    Besser wäre es, das gesamte _POST-Array in ein anderes Array zu laden und dieses komplett als hidden-Feld zu übergeben. Hier bin ich jedoch schon vor einigen Monaten gescheitert.

    Hat jemand eine Idee, wie man Formularinhalte eleganter von Schritt zu Schritt übergeben kann, statt sie jedesmal einzeln als Formularfeld (sichtbar oder unsichtbar) zwischenzuspeichern ?

    danke und Gruß

    Frank

  • #2
    Re: Übergeben von Formulardaten

    Original geschrieben von fnerstheimer
    [B]hallo,
    Besser wäre es, das gesamte _POST-Array in ein anderes Array zu laden und dieses komplett als hidden-Feld zu übergeben. Hier bin ich jedoch schon vor einigen Monaten gescheitert.
    mit serialize() wäre das sogar machbar, aber nicht empfehlenswert.

    die erst wahl bei der lösung des problems sind session

    Kommentar


    • #3
      ich habs (mit session, vielen Dank)

      hier ein kurzes Beispielprogramm, dass ein Formular öffnet, beim Druck auf den Button einen Warntext ausgibt, anschließend wieder ins Formular zurückspringt, und dabei die eingegeben Daten wieder herstellt.

      Diese Funktion lässt sich beliebig variieren, so können z.B. verschiedene Zustände für einen Rollback gespeichert werden.

      Die Session-ID bleibt so lange erhalten, bis der Benutzer das Browserfenster schliesst. Wechseln zu einer anderen Webseite löscht die ID nicht. Mit dem Befehl session_destroy() kann man die Session manuell beenden. Dies ist jedoch nicht nötig, wenn man nicht mehr benötigte Session-Variablen immer sofort löscht.

      PHP-Code:
      <?
      //Start der Session (muss am Beginn jeder Seite angegeben werden)
      $result = session_start();

      //Abfrage, ob Session gestartet, und Ausgabe der Session-ID
      if($result)
      {
        echo"<p>Die Session wurde erfolgreich gestartet</p>";
        $bla = session_id();
        echo"<p>Session-ID: ",$bla,"</p>";
      }
      else
      {
        echo"<p>Die Session konnte nicht gestartet werden.</p>";
      }


      //Formular Warnmeldung – Zustand nach Druecken des Buttons ‚warnung’
      if($button == 'warnung')
      {
        echo"  <form action='index.php' method='post'>                ";
        echo"    <p>Dies ist eine Warnung !</p>                       ";
        echo"    <input type='hidden' name='s' value='$s'>";
        echo"    <input type='submit' name='button' value= 'ok'>      ";
        echo"  </form>                                                ";
        
        // hier wird das Array _POST[] als Session-Variable gespeichert,
        // und bleibt für den nächsten Schritt erhalten
        session_register(_POST);
      }

      //Formular Startansicht und Zustand nach Drücken des Buttons ‘ok’
      else
      {
        echo"  <form action='index.php' method='post'>                                         ";
        echo"    <p>Text 1:<input type='text' size='20' name='text_1' value='$_POST[text_1]'></p>";
        echo"    <p>Text 2:<input type='text' size='20' name='text_2' value='$_POST[text_2]'></p>";
        echo"    <p>Text 3:<input type='text' size='20' name='text_3' value='$_POST[text_3]'></p>";
        echo"    <p>Text 4:<input type='text' size='20' name='text_4' value='$_POST[text_4]'></p>";
        
        // hier wird das Array _POST[] als Session-Variable gelöscht, NACHDEM die Formularfelder
        // wieder hergestellt worden sind. Das Loeschen der Session-Variablen ist notwendig, damit 
        // Aenderungen in den Formularfeldern uebernommen werden koennen. 
        session_unregister(_POST);
        echo"    <input type='submit' value= 'ok'>                                   ";
        echo"    <input type='submit' name='button' value= 'warnung'>                ";
        echo"  </form>                                                               ";
      }
      ?>
      Das Schöne an dieser Lösung ist, dass man immer nur das Array '_POST[]' speichern muss, egal, wie kompliziert das Formular ist.

      Danke an 3DMax für die Anregung.

      Gruß Frank
      Zuletzt geändert von fnerstheimer; 03.03.2008, 22:10.

      Kommentar


      • #4
        Warum nicht einfach das ganze Forumlar als Array in einer Session ablegen. Die Array Keys nennst du so wie die Forumlarfelder, dann kannst du unkompliziert wieder drauf zugreifen:

        So in etwa:

        PHP-Code:

        function formToArray($form_post) {

            
        $keys array_keys($form_post);

            foreach(
        $keys as $item) {
                
                
        $fields[$item] = $form_post[$item];
                
            }
            
            return 
        $fields;

        }

        $_SESSION['form'] = formToArray($_POST); 
        Zuletzt geändert von _mil28; 05.03.2008, 01:48.

        Kommentar


        • #5
          danke für den Hinweis

          es war mein erster Versuch, und ich war froh, dass es so gut geklappt hat.

          Das mit dem Formulararray ist immer dann sinnvoll, wenn ein Formularstatus über mehrere Schritte erhalten bleiben muss. Wenn es nur darum geht, einen Formularinhalt über einen Schritt zu "schleppen", ist die dirkete Verwendung von _POST[] einfacher.

          Ich habe das Beispiel gepostet, weil ich beim Googlen festgestellt habe, dass viele Leute genau das Problem haben. Sogar in Fachbüchern gibt es nur wenig darüber.

          Gruß Frank

          Kommentar


          • #6
            @mil28: Du würdest jedesmal dein Array überschreiben, anstatt es zu erweitern. Auch bereits vorhandenen Feldern trägst du nicht Rechnung

            @fnerstheimer: Bitte keine Daten, die du intern geprüft hast, nochmal zurückschicken! "Never Trust Incoming Data!" muss dein Leitsatz sein. Bitte verwende dafür Sessions. 3DMax hat dir dafür bereits einen Link gepostet. Das ist die Beste und einfachste Lösung!
            Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
            var_dump(), print_r(), debug_backtrace und echo.
            Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
            Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
            Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

            Kommentar


            • #7
              jetzt muss ich mich doch mal ein wenig ärgern

              so nett ich Deine Hilfsbereitschaft auch finde, mit Postings dieser Art kann ich nichts anfangen.

              Das Problem mit dem Übertragen von Daten über mehrere Formularinstanzen hinweg kann man schon fast als Standardproblem bezeichnen. Beim Googlen findet man hunderte Fragen in diese Richtung, aber keine vernünftige Antwort.

              Ich habe mich über den Link von 3DMax gefreut, und mein Beispiel danach aufgebaut. Wenn Du mein Listing noch einmal durchschaust, wirst Du feststellen, dass ich sehr wohl Sessions benutzt habe. Wenn ich wirklich etwas falsch gemacht habe, lass mich bitte nicht dumm sterben, auch wenn es drei oder vier Zeilen Schreibarbeit mehr kostet.

              Die Regeln zum Posten habe ich ebenfalls gelesen, habe sie gerade jetzt nochmal gelesen, und kann immer noch nichts entdecken, was ich falsch gemacht haben soll. Klär mich doch bitte konkret auf.

              Das mit Anführungsstrichen ja oder nein ist auch so eine Sache. Ich versuche eigentlich immer, meine Programme so korrekt wie möglich zu schreiben. Was jedoch soll man tun, wenn man innerhalb der echo-Anweisungen keine ineinander geschachtelten Anführungszeichen verwenden kann, ohne dass dies zu Parse-Fehlern führt ?

              Bitte nicht böse sein, aber dieses kluge Gerede ohne Konstruktivität kann ich nicht haben. Ich bin eher der Mensch, der praktische Lösungen sucht (und sie gerne auch an andere weitergibt).

              Gruß Frank
              Zuletzt geändert von fnerstheimer; 05.03.2008, 16:09.

              Kommentar


              • #8
                okay, hast recht dann vorher Abfrage rein, ob Session schon da ist:

                PHP-Code:

                function formToArray($form_post) {

                    
                $keys array_keys($form_post);

                    if (isset(
                $_SESSION['fields'])) {

                         
                $fields $_SESSION['fields'];

                    }

                    foreach(
                $keys as $item) {
                        
                        
                $fields[$item] = $form_post[$item];
                        
                    }
                    
                    return 
                $fields;

                }

                $_SESSION['form'] = formToArray($_POST); 
                Die Namen der Formularfelder müssen natürlich unique sein.

                Kommentar


                • #9
                  Ehrlich gesagt find ich die ganze Lösung hier nicht wirklich elegant. Mal so ein paar Dinge die mir auffallen:

                  Nehmen wir mal an du hast 5 Formularseiten, dann hast du

                  5x POST
                  5x php-seitig Validierung
                  5x haust du (auch noch mit echo) massig HTML-Code raus

                  Das ist zäh.

                  Mich fragt ja keiner aber ich würde das so machen.

                  1. Validieren mußt du ohnehin, das machst du mit JavaScript damit du keinen Refresh erleidest, wenn Fehler auftauchen, Fehlermeldungen blendest du ebenso per JS ein und aus
                  2. Ist die Valdierung erfolgreich schickst du per Ajax das Form los und speicherst $_POST in der Session
                  3. Als Callback machst du die Weiterleitung zum nächsten Formular ebenfalls in JavaScript

                  ---
                  Bis hier hin hast du deinem User schon viel Zeit gespart, weil die Validierung via $_POST wegfällt. Ebenso hast du dein großes Back-Button Problem gelöst: in deiner Fassung kriegt der User nämlich immer einer lästige POST-Frage vom Browser, wenn er den Back-Button verwendet.
                  ---

                  4. Beim finalen Post machst du PHP-seitig deine Sicherheitsvalidierung, sprich Anti-Injection-Kram, escapen, irgendwie so etwas und trägst deine gesamte Session in die Datenbank ein.

                  PHP-Code:

                      
                  if(get_magic_quotes_gpc()) {
                      
                         
                  $result stripslashes($result);
                      
                      }
                      
                      if (!
                  is_numeric($result)) {
                      
                         
                  $result mysql_real_escape_string($result);
                      
                      } 
                  ---
                  Jetzt hast du am Ende nur einmal PHP-seitig validiert, keine Probleme mehr mit dem Back-Button und vor allem hast du deine 1000 echos und den ganzen HTML-Code aus dem PHP-Teil. Insbesondere letzteres ist wichtig, weil du sonst den Cache von deinem Brwoser sabotierst.

                  nur ein Vorschlag ...
                  Zuletzt geändert von _mil28; 05.03.2008, 21:44.

                  Kommentar


                  • #10
                    mit JavaScript würde vieles einfacher gehen ...

                    nur leider ist JavaScript wg. dem Active Scripting im IE immer noch als Sicherheitsrisiko eingestuft. Man geht davon aus, dass etwa ein Drittel aller Internet-Nutzer das Active Scripting entweder deaktiviert haben oder durch irgendeinen Norton Schrott blockieren.

                    Das Problem mit dem active scripting hat vor einigen Jahren zum Tod von DHTML geführt, zur Erleichterung der geplagten Webseitenentwickler. Mit AJAX erleben wir jetzt DHTML 2.0, und der ganze Mist kocht wieder hoch.

                    Ich für meinen Teil benutze JavaScript nur für Funktionen, die für die Benutzbarkeit der Webseite keine Bedeutung haben. Für wichtige Dinge wie Fehlermeldungen bevorzuge ich Lösungen, die vielleicht unelegant sind, bei denen ich aber sicher bin, dass sie überall funktionieren.

                    Gruß Frank

                    Kommentar


                    • #11
                      falls ichs richtig verstanden hab, gehen die Formulare über mehrere Schritte (Seiten), und der Benutzer soll die möglichkeit haben von letzten bis zum ersten zurückzugehen wenn ihm bspw. was einfällt und es ändern können ohne das die Daten verloren gehen?

                      dann würd ich sagen Speicherst du es in ner Session wobei du die Session in schritte unterteilst

                      PHP-Code:
                      $_SESSION['FORMNAME]['schritt_xy']['variable_xy']=Bla; 
                      und je nach Belieben das ganze halt mit ner schleife durchlaufen um Programmierzeit zu sparen

                      allerdings sollte man dabei dann stark darauf achten wofür die daten Später verwendet werden um ner SQL Injection oder ähnlich gearteten dingen Vorzubeugen

                      Kommentar


                      • #12
                        gute idee

                        das mit dem schrittweisen zurückgehen-Können ist allerdings schon der nächste Schritt. Im Moment geht es nur darum, den abgeschickten Formularinhalt zu erhalten, wenn z.B. eine Fehlermeldungsmaske dazwischenliegt.

                        Ich probiere Deinen Vorschlag mal aus.

                        danke und Gruß Frank

                        Kommentar

                        Lädt...
                        X