Formular-Daten in Variablen speichern und an das Formular zurückgeben

  • Hallo Leute,


    ich schreib für meinen D Grundkurs grad ne Website bei der ein Teil eine Umfrage ist.
    Die Umfrage generell ist nicht das Problem.
    Das ganze geht über das Thema "Heimat" und es soll eine Spontan-Beantwortung mit 5 Schlagwörtern erfolgen.


    Danach will ich ein weiteres Formular erscheinen lassen (darunter) wenn also auf den Weiter-Button gedrückt wurde und die Benutzereingaben sollen in Variablen gespeichert werden und wieder im Formular zurückgegeben werden. Am Schluss soll das ganze mit einer Rechenaufgabe als Spamschutz abgerundet werden.


    Hier meinen Code den ich bis jetzt habe:





    Wenn ihr mir recht zeitnah helfen könntet wäre das echt cool

  • So, ich fange hier mal beim HTML an:


    das ist so einfach semantisch und auch logisch eine Katastrophe(sry) : :S
    zur Darstellung eines Formulars sollte man keine Tabellen benutzen, nutz stattdessen die HTML-Tags fieldset,legend,label.
    Eine textarea hat kein value-Attribut, der Inhalt steht hier direkt ziwschen den zwei Textarea Elementen.


    Zudem noch eine Anmerkung $_SERVER['PHP_SELF'] ist unsicher , nutz staddessen $_SERVER['SCRIPT_NAME'].


    Hier mal eine kleine, schnelle , sauberere Umsetzung des Formulars:




    Soweit zum HTML :)

  • Erkläre doch bitte den Unterschied zw. <?php $_Server['PHP_SELF']; ?> ; <?=$_SERVER['PHP_SELF']; ?> und <?php $_SERVER['SCRIPT_NAME']; ?>
    Bin noch nicht so fortschrittlich in PHP :D
    Und ehrlich ist die Umsetzung in der Tabelle doch naja schöner :D vllt ist es nicht so "modern" oder semantisch oder ne Katastrophe, ok aber es muss nicht perfekt sein :D und trotzdem finde ich siehts besser in der Tabelle aus. Auch wenns von Google-Bots oder anderen nicht gut ausgelesen werden kann

  • Und dann noch zum PHP:




    Dort nutze ich immer eine recht einfache Struktur um die Pflichfelder zu prüffen. $error gibt an ob ein Fehler gefunden wurde true/false und $style gibt den Namen der CSS-Klasse an , die bei einem nicht ausgefüllten Feld in Erscheinung treten soll(bei mir meist ein Rahmen oder Ähnliches). Dann setze ich anfangs alle Felder in einem Assoziativen Array($input) mit den Name-Attributen der zu verarbeitenden Felder und setze den Wert auf einen Leerstring. Zudem erstelle ich ein Array mit den Pflicht-Feldern($pflicht) , bei dem ich mit selbem Prinzip vorgehe. Nachher prüfe ich die Post Variablen und setzte bei einem leeren Feld die Fehlerklasse und sonst den jeweiligen Input, um ihn unten wieder in die Felder zu schreiben.
    (Hoffe ich konnte das einigermaßen erklären, sonst bitte nachfragen)



    Nachher überprüft man noch ob das Formular abgesendet wurde und alles ausgefüllt wurde und bindet dann eben das zweite Formular auch noch ein/oder nicht:


    PHP
    1. if ($_POST['weiter'] === "Weiter" && $error === false)
    2. {
    3. include('pfad/zu/deiner/datei.php');
    4. }


    Zu deiner Frage: https://phpsecurity.wordpress.…3/the-danger-of-php_self/


    Hoffe mal ich konnte dir ein wenig helfen, sonst einfach nachfragen :)

  • Ok aus dem Thread von deinem geposteten Link bin ich nicht ganz so schlau geworden... und wenn ich mir das so anschaue kann man dann das php nach dem "öffnenden" <?php weglassen?


    und aus deinem PHP script werde ich ebenfalls nicht ganz schlau.
    Die prinzipielle Vorgehensweise ist verstanden nur die Umsetzung nicht wirklich.


    Vllt ein konkretes bsp :/ ?

  • Und ehrlich ist die Umsetzung in der Tabelle doch naja schöner :D vllt ist es nicht so "modern" oder semantisch oder ne Katastrophe, ok aber es muss nicht perfekt sein :D und trotzdem finde ich siehts besser in der Tabelle aus. Auch wenns von Google-Bots oder anderen nicht gut ausgelesen werden kann


    Naja die Gestaltung muss dann eben von dir via CSS vorgenommen werden, das so ein 0815 HTML-only Formularnicht so toll aussieht ist doch völlig selbstverständlich :D
    Im Grunde nimmst du dir durch den Einsatz von Tabellen viel gestalterischen Spielraum. Ich bleibe bei meiner Meinung das man Tabellen nur für tabellarische Inhalte einsetzen soll , aber jedem das seine, da muss jeder selbst draufkommen :)

  • und wenn ich mir das so anschaue kann man dann das php nach dem "öffnenden" <?php weglassen?


    und aus deinem PHP script werde ich ebenfalls nicht ganz schlau.
    Die prinzipielle Vorgehensweise ist verstanden nur die Umsetzung nicht wirklich.


    Vllt ein konkretes bsp :/ ?


    Kann man , wenn die php.ini entsprechend definiert ist, sollte man aber vermeiden.
    http://php.net/manual/en/ini.core.php#ini.short-open-tag


    Benutz lieber nur <?php und <?= (ab 5.4 immer verfügbar).



    Um nocheinmal auf mein Script zu kommen(das ich übrigens genau für dein Formular geschrieben habe).


    Ich lege anfangs zwei assoziative Arrays fest, eines mit den name-Attributen aller Formularfelder(außer dem Submitbutton) und
    ein anderes mit allen Pflichtfeldern. Zudem iniatilisiere ich eine Prüfvariable die anfangs auf false steht(da am Anfang ja noch kein Fehler ist).
    Dann durchlaufe ich das Array mit allen Feldern und prüfe , ob unter dem selben Schlüssel im Pflicht-Array auch ein Wert vorliegt.
    Falls ja, handelt es sich um ein Pflichtfeld und ich prüfe ob der entsprechende Post-Wert gesetzt ist. Ist dem so , wird genauso
    wie wenn kein Pflichfeld vorliegt der übertragene Wert im Input-Array gesetzt um im später im Formular wieder auszugeben und die Benutzerfreudnlichkeit
    zu erhöhen. Liegt allerdings ein Pflichtfeld vor, welches nicht gesetzt ist im übertragenen $_POST-Array setze ich im entsprechenden Pflicht-Array den Wert
    auf die CSS-Klasse um später darauf graphisch aufmerksam zu machen, zudem setzte ich die Prüfvariable noch auf true da nun ein Fehler vorliegt.


    mfg Nita

  • ok das habe ich jetzt auch so einigermaßen beim zweiten mal durchlesen gecheckt :D Mir stellt sich nun die Frage, wie ich das mit der CSS-Klasse anstelle... und dann wie ich ein weiteres Formular, habe ich wohl vergessen, in der selben Datei aufbaue, welches nach weiter drücken nachdem keine fehler aufzuweisen sind erscheint

  • Die definierst du einfach in der CSS-Datein, in meiner obigen HTML-Datei habe ich das mal ergänzt :)


    Zum Formular:


    Schöner wäre es wie ich es oben gemacht habe in einer eigenen Datei , sonst aber so:




    PHP
    1. if (isset($_POST['weiter']) && $error === false)
    2. {


    HTML
    1. <form>
    2. </form>



    PHP
    1. }
  • Nur so zwischen drin.. eine Rechenaufgabe ist KEIN SPAM-Schutz mehr.. die BOT's sind ziemlich Intelligent und füllen selbst Inputfelder mit skurrilen Namen nicht mehr aus. Es gibt aber die Möglichkeit auf das Visuelle zu setzen.. benutze einen SPAM-Schutz der in diese Richtung geht.. damit bist du vorerst SPAMM'er los und deine User müssen keine Kryptischen Zeichen entziffern, die der BOT auch entziffern kann.. ;)
    Hier eine Möglichkeit: https://github.com/wolf-w/pastebox/tree/master/vtcha
    Beispiel: http://codepen.io/wolf-w/pen/emVjQv


    Viel Spaß. :)

  • Finde dein Beispiel oben sehr interessant und hilfreich, sowas kam mir bisher noch nie unter :)
    Intressehalber würde mich interessieren was bei deinem vtcha bei deaktiviertem JavaScript passiert,
    kann man das ganze dadurch umgehen, oder wird das Formular für diese Leute dann unbenutzbar?


    Edit:



    Da du oben davon redest das die Bots langsam intelligent werden, glaubt ihr das ein serverseitiger
    Honeypot-Schutz nicht mehr ausreicht, oder sind diese derzeit noch relativ sicher?

  • Ohne Javascript ist das Formular unbenutzbar, genauso für benachteiligte Menschen.
    Erstere benutzer kann man inzwischen ziemlich ignorieren (außer die Zielgruppe ist in diese Richtung gerichtet..)
    Die Benachteiligten Benutzer.. sind vergleichbar mit den Fähigkeiten eines SPAM-BOT'S .. somit ist es sehr schwierig (wenn nicht unmöglich) eine Lösung zu finden. (evlt über alternative Kontaktmethoden ...?) .. wenn hier jemand einen guten Vorschlag hat, ich freue mich drüber!


    Honeypot's sind noch effektiv meiner Meinung nach, wenn sie individuell angewandt werden.. allerdings werden diese auch weniger effektiv werden, genauso wie BOT's in Zukunft auch visuelle Aufgaben lösen werden können.

  • Nun ich denke da brauche ich noch ein wenig mehr zeit mich da reinzulesen wegen des spamschutzes...
    die habe ich nicht so richtig da die site nicht zu lange dauern darf... es ist "nur" ein schulprojekt welches die Projektarbeit unseres Deutsch-Grundkurses dalegen soll und ich meldete mich für die Website weil das sonst niemand aus unserem kurs kann...
    Dazu gehört auch eine Umfrage...
    Klar könnte ich das Formular auch komplett auftauchen lassen oder auf mehrere Seiten aufteilen...
    Nur wollte ich mir Platz sparen und unnötige Weiterleitungen und ein "Schritt-für-Schritt" Formular in eine einzige Datei packen.


    Jetzt die konkrete Frage: Ist DAS möglich?


    Also wenn der Benutzer die 5 Schlagwörter eingegeben hat, auf "Weiter" klickt und wenn keine Fehler da sind einfach der nächste Teil dazu auftaucht?


    EDIT:


    Ist es möglich eine neue Variable kreieren zu lassen?