2 Stimmen

Wie kann ich in PHP den Query-String entfernen, um zu vermeiden, dass die Leute einen Prozess zweimal starten?

In php verwende ich GET, um einen Query-String zu erstellen, der eine Aktion auslöst: wenn ich zum Beispiel auf :

www.example.com/index.php?mode=action&name=launch_this

Es erhält mode=action und name=launch_this und das php startet eine Funktion namens "launch_this".

Aber wie kann ich verhindern, dass die Leute diese Seite aktualisieren und dann den Prozess neu starten?

Ich möchte in der Lage sein, diese Parameter einmal zu erhalten und die Url für den Client zu index.php ohne Parameter zu konvertieren.

Ist das möglich? Danke

5voto

JB Nizet Punkte 654813

Aktionen, die den Zustand des Servers ändern oder einen Prozess starten, sollten nicht GET, sondern POST verwenden. Wenn Sie POST verwenden und der Benutzer eine Aktualisierung vornimmt, wird der Browser zumindest eine Bestätigung verlangen.

Um Aktualisierungen zu vermeiden, sollten Sie eine Umleitung senden, sobald der Prozess gestartet ist:

  1. Benutzerbeiträge zum Start der Aktion
  2. Server startet Aktion und sendet eine Weiterleitung
  3. Der Browser des Benutzers empfängt die Weiterleitung und ruft die Seite unter der angegebenen URL auf.
  4. Der Benutzer aktualisiert und lädt die Seite neu, aber er startet die Aktion nicht erneut.

Dieses Muster ist als Post/redirect/get oder als "redirect after post" bekannt.

3voto

Dirk Punkte 2037

Hierfür können Sie das Post/Redirect/Get-Muster verwenden: http://en.wikipedia.org/wiki/Post/Redirect/Get

1voto

Daniel May Punkte 8106

post, redirect, get Ich würde in Erwägung ziehen, mir die Buchen/Umleiten/Gehen Muster.

0voto

Jakob Egger Punkte 11631

Bevor Sie eine Ausgabe an den Client senden, setzen Sie den Redirect-Header.

header("Location: index.php");

Dies führt dazu, dass der Browser die Seite index.php lädt, und die in der Adressleiste angezeigte URL ändert sich ebenfalls.

Sie können auch die history.replaceState() javascript-Funktion, um die URL im Browser zu ändern, aber diese Funktion wird nur von Safari und Firefox 4 unterstützt (siehe z.B. https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history )

0voto

Ramon Punkte 971

Sie könnten einen Wert in $_SESSION speichern und ihn vor der Ausführung überprüfen, wie

if(!isset($_SESSION['launched'])) {
   $_SESSION['launched'] = true;
   ...
   ...   
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X