Sven Rautenberg: Gästebuch fertig! :-)

Beitrag lesen

Moin!

Oh, danke für den Link!
Aber: Mit $_SERVER["PHP_SELF"] ruft sich ja das Formular immer wieder selbst auf.

Ja und?

Entscheidend ist doch: Das Formular wird abgeschickt, und in Abhängigkeit von den gemachten Eingaben kommt garantiert irgendeine neue HTML-Seite zum Vorschein. Deren URL ist zweitrangig.

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.

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.

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.

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.

Es sollen natürlich bei erfolgreichem Eintragen die Felder nicht mehr gefüllt werden, um unabsichtliche Mehrfachpostings auszuschliessen.

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.

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ß.

- Sven Rautenberg