Hi Sven,
So, nun hab ich mir dein Posting dreimal durchgelesen, bis ich draufgekommen bin, was du meinst. ;-)
Der Vorteil des Affenformulars ist, dass du in der Grundform ohne weitere Funktionalität die Formulareingaben immer wieder in einem neuen Formular als vorausgefüllten Text zurückkriegst.
Dein jetziges System hat eben den Nachteil, dass du die Formularinformationen zuerst zu deinem Prüfskript übermittelst. Dort stellst du dann fest, dass irgendwas nicht stimmt - und leitest nur einen Fehlercode weiter (bzw. "zurück) zur erneuten Formularseite. Die gemachten Formulareingaben aber gehen verloren.
Stimmt, erst aufgrund des gelieferten Fehlecodes kann ich entscheiden, welche Nachricht ausgegeben werden soll.
Wenn ich nun mit diesem Action-Attribut die Prüfung durchführe und danach bei erfolgreicher Prüfung auf die eigentliche Verarbeitungsdatei weiterleite?
Warum dies? Du prüfst ganz oben im einzigen PHP-Skript (dem mit dem Affenformular), ob die Bedingungen für einen gültigen Gästebucheintrag erfüllt sind. Wenn dies der Fall ist, trägst du die Daten in die Datei ein, speicherst sie, und leitest dann zurück auf irgendeine Seite mit z.B. der Ausgabe des vollständigen Gästebuchs. Weiterleitungen mit header() sind in diesem Falle gut, weil du damit das Reload-Problem umgehst.
Und genau daran hab ich mich aufgehängt, bis ich auf die Idee kam, daß ich ja, im Falle eines erfolgreichen Abschickens, dieselbe Seite mit header() wieder aufrufen könnte. In dem Falle würden ja die Daten nicht wieder eingefügt, da die Seite neu geladen wird.
Hab ich das nun richtig verstanden?
Wenn am Formular aber irgendwas auszusetzen ist, kommt ein ELSE zum Tragen. Und dieses ELSE ist dein Affenformular. Das bedeutet: Beim Erstaufruf gibts kein $_POST, also muß auch nichts angemeckert werden, sondern es kommt direkt das Formular. Wenn aber was abgeschickt wurde, existiert Inhalt in $_POST, der dann, wenn ELSE dran ist, nicht korrekt war, also mit einem Kommentar (welcher, wurde vorher festgelegt) angemeckert wird, und der ungültige Inhalt von $_POST wird in die Formularfelder zurückgefüllt, damit der Benutzer Informationen nachtragen kann.
Dazu noch eine, nein, zwei Fragen:
Kristian Köhntopp verwendet in seinem Beispielformular $_REQUEST anstatt $_POST. Gibt es dafür einen besonderen Grund?
Laut http://www.php.net/manual/de/language.variables.predefined.php sind die darin enthaltenen Daten nicht vertrauenswürdig.
Und zweitens verwendet er anstatt dem Echo-Befehl "print", was imho dasselbe bewirkt.
Steckt da etwa eine Funktionalität dahinter, den ich (noch) nicht realisiert habe?
Nur auf diese Weise kriegst du eine gute Benutzerfreundlichkeit hin. Denn bis auf Opera haben irgendwie (mein Eindruck kann bei Mozilla/Firefox auch täuschen) alle Browser Probleme, bei Formularseiten von der "Es fehlt was!"-Meckerseite zurückzublättern und den schon mal abgeschickten Formularinhalt wieder anzuzeigen. Meist ist das Formular dann wieder komplett leer, so wie es beim ersten Mal vom Server geladen wurde.
Auf alle Fälle ist es am benutzerfreundlichsten, wenn im Fehlerfalle die ausgefüllte Seite wieder erscheint, ohne blättern zu müssen.
Wie gesagt: Mehrfachpostings durch unabsichtliches Reload verhindert man durch ein Redirect von der POST-Ergebnisseite. Ein geglücktes POST-Formular erzeugt also keine eigene Danke-Seite (oder was da sonst so drauf stehen mag), sondern leitet zu einer Danke-Seite weiter. Das kann auch wieder dasselbe Skript sein, welches mit einem Parameter dann in einen dritten Zweit geht und nur "Danke" ausgibt - oder eben zurück auf Null geht und das Gästebuch (inkl. des neuen Postings) sowie das leere Formular ausgibt - genauso wie beim ersten Aufruf.
Damit ich sicher bin: Hast du nun davon gesprochen, was ich oben schon angedeutet habe? Nämlich auf dieselbe Seite weiterzuleiten, wobei ich dann keine ausgefüllten Formularfelder mehr erhalte?
Trenne dich mal gedanklich von der Vorstellung, dass ein PHP-Skript exakt EINE einzige Aufgabe erfüllen darf. Das ist in der Regel eine eher ungünstige Aufgabenteilung, wenn man beim Aufruf einer URL noch nicht zwingend weiß, was man dem User denn mitteilen will, sondern das von den gesendeten Daten abhängig machen muß.
Auf alle Fälle mal ein herzliches Dankeschön. Ich werde mir mal ein Testformular zusammenbauen und die Funktionalität austesten, bis ich wirklich alle Vorgänge kapiert habe.
Danke!
Gruß
Kurt
Nein, ich beantworte keine Anfragen per e-mail.
ss:( zu:) ls:[ fo:) de:] va:| ch:| sh:( n4:° rl:( br:? js:| ie:% fl:( mo:?
"Das Glueck besteht darin, in dem zu Masslosigkeit neigenden Leben das rechte Mass zu finden." (Leonardo da Vinci; it. Universalgenie; 1452-1519)
http://elektro-dunzinger.at
http://shop.elektro-dunzinger.at