Ankündigung

Einklappen
Keine Ankündigung bisher.

Formularverarbeitung best practice?

Einklappen

Neue Werbung 2019

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

  • Formularverarbeitung best practice?

    Hi,

    ich hab mal ein paar Überlegungen angestellt und bin jetzt auf der Suche nach Denkanstößen.

    Und zwar habe ich ein Formular mit ~50 Input Feldern.
    Die ganzen Daten aus dem Formular sollen in eine MySQL Datenbank gespeichert werden.

    Wenn ich jetzt den Submit Button drücke wird das ganze in PHP verarbeitet (logisch).
    Wenn man jetzt nach den (meisten?) PHP-Tutorials im Internet geht würde man mit folgendem Ansatz beginnen:

    PHP-Code:
    $input1 $_POST["input1"];
    $input2 $_POST["input2"];
    $input3 $_POST["input3"]; 
    usw...

    Da $_POST aber ein Array ist, geht das natürlich viel einfacher, vor allem bei 50 Feldern!
    Die Frage ist: welche Vorgehensweise?
    Auch in Relation zur Sicherheit? Ein bisschen mit Greasemonkey o.Ä. rumspielen oder gar
    ein eigenes Formular an das PHP Script schicken und schon geht's ungefiltert in die Datenbank.
    Vielleicht könnte man ein Array mit den erlaubten Feldern erstellen und dann mit array_diff() vergleichen?

    Und wie bekomme ich das ganze dann möglichst elegant in den SQL-Query?

    Irgendwelche Ideen oder Kritik?

    /iceteea

  • #2
    Hallo iceteea,

    Formulare in der "klassischen" Art haben immer das Problem, dass ihr Scope nicht klar ist. Aus diesem Grund ist die Lösung hier die Abstraktion eines Formulars in ein Objekt. Dieses kannst du dann nach seinen (bereits validierten und gefilterten) Feldern fragen und diese entsprechend auslesen und verarbeiten.

    Bereits implementierte Ansätze sind Zend_Form und APF-Formulare. Letztere bieten dir ein Formular als echten DOM-Baum an, in dem die Kinder des Formulars die Felder repräsentieren. Darüber kannst du dann iterieren und die jeweiligen Felder zur Befüllung der Datenbank nutzen.

    Um nicht 50 Felder per Hand definieren zu müssen, kannst du diese dynamisch zusammen stellen und anschließend auch wieder dynamisch auslesen. Inkludiert sind hier ebenfalls Validierung und Filterung, die dynamisch wie statisch an ein Feld geheftet werden können.

    Solltest du Fragen haben oder ein konkretes Beispiel für deinen Anwendungsfall benötigen, sag Bescheid.

    Kommentar


    • #3
      Zitat von iceteea Beitrag anzeigen
      Da $_POST aber ein Array ist, geht das natürlich viel einfacher, vor allem bei 50 Feldern!
      Die Frage ist: welche Vorgehensweise?
      Welche Vorgehensweise für was? Für die Validierung, für die Speicherung, für die Zuweisung der Variablen?!

      Zur Verarbeitung musst du kein

      PHP-Code:
      $input1 $_POST['input1']; 
      machen. Warum auch? Validiere die erwarteten Formularfelder und verarbeite auch ausschließlich diese weiter. Ob dann jemand ein Formularfeld hinzufügt dass dann unter dem Key 'boese' irgendwelchen Schadcode beinhaltet kann dir ja egal sein, da du eh nie drauf zugreifst. Wenn ein Fehler bei der Validierung auftritt schmeißt du eine Exception und lässt diese dann im Formular ausgeben, ohne das Formular zu speichern.

      Viele Grüße und schönes WE,

      Dirk

      Kommentar


      • #4
        Ich würde es folgendermaßen machen:
        PHP-Code:
        $usedKeys = array(
            
        'key1' => 'type''key2' => 'type''etc' => 'type'
        );
        $result = array();

        //Formular auslesen
        if (isset($_POST['send'])) {
            foreach (
        $usedKeys as $key => $type)
            {
                if (!isset(
        $_POST[$key])) continue;
                
        $tmp = ($type$_POST[$key];
                
        $result[$key] = $tmp;
           }
        }
        //Formular anzeigen 
        Damit gehst du eigentlich sehr sicher, dass nur die erwarteten Typen in den Variablen sind.

        Kommentar


        • #5
          $tmp = ($type) $_POST[$key];
          Das funktioniert? Habe ich noch nie ausprobiert..

          Genau genommen hat man mit diesem Type casting aber nicht viel gewonnen. Und optionale Angaben bekommt man damit auch nicht gedeckelt.

          Kommentar


          • #6
            Danke, hier sind ja schonmal ein paar Infos zusammengetragen worden.

            Mir geht es auch darum nicht im SQL-Query alle Post-Variablen einzeln definieren zu müssen (In meinem Fall haben die Input-Felder und somit die Variablen den selben Namen wie die Felder in der Datenbank (ich weis dass es mir misslungen ist dies im ersten Post zu formulieren) ).

            Normalerweise (oder auch nicht...) sehe das dann ja ungefähr so aus:

            PHP-Code:
            $eintrag "
              INSERT INTO Tabellenname
                (Spaltenname1, Spaltenname2, Spaltenname3)
              VALUES
                ('
            $_POST[Spaltenname1]', '$_POST[Spaltenname2]', '$_POST[Spaltenname3]')
            "

            Bei 50 Feldern...

            Man könnte das jetzt natürlich mit Foreach loopen,
            könnte aber bei häufigen Zugriffen unperformant ausgehen - sehe ich das richtig?
            Oder geht's noch eleganter?

            Ich poste das jetzt mal auf die Gefahr hin noch etwas traumatisiert von der Uhrzeit zu sein (Winnipeg)

            Kommentar


            • #7
              Zitat von iceteea Beitrag anzeigen
              PHP-Code:
              $eintrag "
                INSERT INTO Tabellenname
                  (Spaltenname1, Spaltenname2, Spaltenname3)
                VALUES
                  ('
              $_POST[Spaltenname1]', '$_POST[Spaltenname2]', '$_POST[Spaltenname3]')
              "

              Bei 50 Feldern...

              Oder geht's noch eleganter?
              http://de.wikipedia.org/wiki/Normali...28Datenbank%29

              Kommentar


              • #8
                Der Link ist sicherlich hilfreich, und auf jeden Fall einen Klick wert.

                Allerdings entbehrt sich mein spezieller Fall dieser Form der Optimierung,
                da alle 50 Felder in der selben Relation stehen und schlicht keine Redundanzen existieren (Stammdaten von Artikeln (Länge, Höhe, Breite - wüsste nicht wie man da die virtuelle Datenmenge ohne Verluste reduzieren könnte) ).

                Trotzdem vielen Dank!

                Kommentar


                • #9
                  Nein, nein, der Tipp ist, aus den Spalten Zeilen zu machen. Weniger Normalisierung als die Schaffung eines key-value-Stores, um dynamisch arbeiten zu können.

                  Ansonsten (und vielleicht sogra trotzdem) wirst Du nicht umhin kommen, alle Zielfelder in PHP fest zu verdrahen und ggf. noch ein Mapping auf die entspr. name-Attribute anzulegen.

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Das funktioniert? Habe ich noch nie ausprobiert..
                    Nein geht nicht, aber settype() gibt's.

                    Kommentar

                    Lädt...
                    X