am 5. März 2010
Was jetzt wohl kommt? Ein neuer Artikel natürlich. Aber erst mal muss ich mich entschuldigen, dass die Gewinnspielpreise erst in einer Woche raus gehen werden, da ich ab morgen für eine Woche beim Snowboarden bin. Ich hoffe ihr seid ein wenig neidisch. Ich wäre es. Falls ihr jetzt Angst habt, dass ihr sieben Tage nichts über PHP erfahren könnt, dann kann ich euch beruhigen. Es gibt eine Handvoll Co-Autoren, die euch durch die Woche bringen werden.
Soviel erstmal zum Organisatorischen. Jetzt zum Artikel, den ihr bestimmt schon sehnsüchtig erwartet. Es geht um das Post/Redirect/Get Pattern, das einem hilft, mit Post-Methoden umzugehen. Im Speziellen geht es eigentlich darum dass man nicht aus Versehen zwei Mal ein Formular abschickt, wenn man das gar nicht wollte. F5 und die Zurück-Taste im Browser sind da wohl die prominentesten Vertreter für. Ich gehe mal davon aus, dass euch das auch schon öfters passiert ist.
Die Lösung ist eigentlich schon im Namen des Musters beschrieben. Post -> Redirect -> Get. Also der erste Schritt ist ganz normal das Formular per Post abzusenden. Dann verarbeitet ihr in eurer Applikation die Anfrage genau so, wie ihr es immer macht. Bis jetzt sollte euch das Verhalten bekannt vorkommen, denn so werdet ihr eh schon arbeiten. Was man jetzt im “Normalfall” machen würde ich nach der Verarbeitung die Seite anzuzeigen auf der die Änderungen angezeigt werden.

Das machen wir jetzt aber nicht. Statt die Seite anzuzeigen leiten wir per 301 (permanently moved) weiter auf die Seite. Wir erinnern uns ans Redirect im Namen. Schon haben wir unsere Post-Anfrage in ein einfaches Get umgewandelt. Das tolle daran ist, das der Browser die alte Seite komplett vergessen hat, denn durch den 301 sollte er das auch.
Wenn ich jetzt ein F5 drücke oder im Browser zurückgehe, sollte nicht mehr abgesendet werden. Die Weiterleitung könnt ihr übrigens über die HTTP Header:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.neue-domain.de/bla.html");
header("Connection: close");
?>
Ich werde das die nächsten Tage für die Ideenschmiede umbauen, denn da kann man nämlich durch F5 ganz einfach bescheißen und das wollen wir ja nicht.