PHP - Post-Redirect-Get (PRG)

Hallo那里,有抱负的程序员们!今天,我们将深入了解一个重要的网页开发模式,称为Post-Redirect-Get,简称PRG。如果你是编程新手,不用担心;我会一步一步地引导你了解这个概念,就像我在多年教学中对无数学生所做的那样。所以,拿起一杯咖啡(或者你最喜欢的饮料),让我们一起踏上这段激动人心的旅程!

PHP - Post-Redirect-Get (PRG)

Was ist Post-Redirect-Get (PRG)?

Stellen Sie sich vor, Sie füllen ein Formular aus, um online eine Pizza zu bestellen. Sie klicken auf senden, und dann... Hoppla! Sie aktualisieren versehentlich die Seite. Plötzlich haben Sie zwei Pizzen anstelle von einer bestellt! Dies ist das Problem, das das Post-Redirect-Get-Muster hilft zu lösen.

PRG ist ein Web-Entwicklungsmuster, das verhindert, dass Dubletten von Formularübermittlungen entstehen, wenn ein Benutzer die Seite nach dem Absenden des Formulars aktualisiert. Es ist wie ein Verkehrsbeamter für Ihre Webanwendungen, der sicherstellt, dass Daten reibungslos fließen und nicht versehentlich dupliziert werden.

Wie PRG funktioniert

  1. Der Benutzer sendet ein Formular mit einer POST-Anfrage.
  2. Der Server verarbeitet die Formulardaten.
  3. Anstatt eine direkte Antwort zu senden, leitet der Server an eine Erfolgseite weiter.
  4. Der Browser des Benutzers folgt der Umleitung mit einer GET-Anfrage.
  5. Der Server antwortet auf die GET-Anfrage mit der endgültigen Seite.

Nun schauen wir uns das mit einigen Codebeispielen in Aktion an!

Beispiel 1: Eine einfache PRG-Implementierung

Lassen Sie uns mit einem einfachen Beispiel beginnen, wie PRG in PHP funktioniert. Wir erstellen ein einfaches Formular, das Benutzern ermöglicht, ihre Lieblingsfarbe zu senden.

Schritt 1: Das HTML-Formular (form.php)

<!DOCTYPE html>
<html>
<head>
<title>Lieblingsfarbe Formular</title>
</head>
<body>
<h1>Was ist deine Lieblingsfarbe?</h1>
<form action="process.php" method="post">
<input type="text" name="color" required>
<input type="submit" value="Senden">
</form>
</body>
</html>

Dieses Formular sendet eine POST-Anfrage an process.php, wenn es abgeschickt wird.

Schritt 2: Formularverarbeitung (process.php)

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$color = $_POST['color'];

// Die Farbe in der Sitzung speichern
$_SESSION['favorite_color'] = $color;

// Umleitung zur Ergebnisseite
header('Location: result.php');
exit;
} else {
// Wenn jemand versucht, diese Seite direkt aufzurufen, leiten Sie sie zum Formular um
header('Location: form.php');
exit;
}

Lassen Sie uns das zusammenbrechen:

  1. Wir starten eine Sitzung, um Daten zwischen den Seiten zu speichern.
  2. Wir prüfen, ob die Anfragemethode POST ist.
  3. Wenn ja, speichern wir die übermittelte Farbe in der Sitzung.
  4. Wir leiten den Benutzer dann zu result.php weiter.
  5. Wenn jemand versucht, diese Seite direkt aufzurufen (nicht über POST), leiten wir sie zurück zum Formular.

Schritt 3: Anzeige des Ergebnisses (result.php)

<?php
session_start();

if (isset($_SESSION['favorite_color'])) {
$color = $_SESSION['favorite_color'];
// Die Sitzungsvariablen löschen, um das Anzeigen alter Daten bei der Aktualisierung zu verhindern
unset($_SESSION['favorite_color']);
} else {
$color = 'Keine Farbe übermittelt';
}
?>

<!DOCTYPE html>
<html>
<head>
<title>Deine Lieblingsfarbe</title>
</head>
<body>
<h1>Deine Lieblingsfarbe</h1>
<p>Du hast gesagt, deine Lieblingsfarbe ist: <?php echo htmlspecialchars($color); ?></p>
<a href="form.php">Eine andere Farbe senden</a>
</body>
</html>

Hier ist, was passiert:

  1. Wir starten die Sitzung wieder, um auf die gespeicherten Daten zuzugreifen.
  2. Wir prüfen, ob eine Lieblingsfarbe in der Sitzung gespeichert ist.
  3. Wenn ja,显示它并清除 Sitzungsvariablen.
  4. Wenn nicht,显示默认消息。

Jetzt wird der Benutzer beim Aktualisieren der Ergebnisseite keine Formulardaten erneut senden. Cool, oder?

Beispiel 2: PRG mit Datenbankinteraktion

Lassen Sie uns unser Beispiel einen Schritt weiterführen und uns vorstellen, dass wir ein Pizza-Bestellsystem betreiben. Wir verwenden eine Datenbank, um Bestellungen zu speichern, und implementieren PRG, um doppelte Bestellungen zu verhindern.

Schritt 1: Das Bestellformular (order_form.php)

<!DOCTYPE html>
<html>
<head>
<title>Pizza Bestellformular</title>
</head>
<body>
<h1>Bestelle deine Pizza</h1>
<form action="process_order.php" method="post">
<label for="pizza_type">Pizza Typ:</label>
<select name="pizza_type" id="pizza_type" required>
<option value="margherita">Margherita</option>
<option value="pepperoni">Pepperoni</option>
<option value="veggie">Vegetarisch</option>
</select>
<br><br>
<label for="size">Größe:</label>
<select name="size" id="size" required>
<option value="small">Klein</option>
<option value="medium">Mittel</option>
<option value="large">Groß</option>
</select>
<br><br>
<input type="submit" value="Bestellung aufgeben">
</form>
</body>
</html>

Schritt 2: Bestellverarbeitung (process_order.php)

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pizza_type = $_POST['pizza_type'];
$size = $_POST['size'];

// In einer realen Anwendung möchten Sie diese Eingaben bereinigen und validieren

// Mit der Datenbank verbinden (normalerweise würden Sie dies in eine separate Datei platzieren)
$db = new PDO('mysql:host=localhost;dbname=pizza_shop', 'benutzername', 'passwort');

// Die Bestellung einfügen
$stmt = $db->prepare("INSERT INTO orders (pizza_type, size) VALUES (?, ?)");
$stmt->execute([$pizza_type, $size]);

// Die Bestell-ID abrufen
$order_id = $db->lastInsertId();

// Die Bestell-ID in der Sitzung speichern
$_SESSION['last_order_id'] = $order_id;

// Umleitung zur Bestätigungsseite
header('Location: order_confirmation.php');
exit;
} else {
// Wenn jemand versucht, diese Seite direkt aufzurufen, leiten Sie sie zum Formular um
header('Location: order_form.php');
exit;
}

Dieses Skript:

  1. Verarbeitet die Formulardaten.
  2. Fügt die Bestellung in eine Datenbank ein.
  3. Speichert die Bestell-ID in der Sitzung.
  4. Leitet an eine Bestätigungsseite weiter.

Schritt 3: Bestellbestätigung (order_confirmation.php)

<?php
session_start();

if (isset($_SESSION['last_order_id'])) {
$order_id = $_SESSION['last_order_id'];
// Die Sitzungsvariablen löschen
unset($_SESSION['last_order_id']);

// In einer realen Anwendung würden Sie hier die Bestelldetails aus der Datenbank abrufen
// Für dieses Beispiel显示 nur die Bestell-ID
$message = "Ihre Bestellung (ID: $order_id) wurde erfolgreich aufgegeben!";
} else {
$message = "Keine recente Bestellung gefunden. Bitte platzieren Sie eine neue Bestellung.";
}
?>

<!DOCTYPE html>
<html>
<head>
<title>Bestellbestätigung</title>
</head>
<body>
<h1>Bestellbestätigung</h1>
<p><?php echo htmlspecialchars($message); ?></p>
<a href="order_form.php">Eine andere Bestellung aufgeben</a>
</body>
</html>

Diese Bestätigungsseite:

  1. Ruft die Bestell-ID aus der Sitzung ab.
  2. 显示一个确认消息。
  3. Löscht die Sitzungsvariablen, um das Anzeigen der gleichen Bestellung bei der Aktualisierung zu verhindern.

Warum PRG wichtig ist

  1. Verhindert Dubletten von Übermittlungen: Wenn ein Benutzer die Bestätigungsseite aktualisiert, wird er seine Bestellung nicht versehentlich erneut senden.
  2. Verbessert das Benutzererlebnis: Benutzer sehen eine saubere URL in ihrer Adressleiste, nicht eine lange Zeichenkette aus Formulardaten.
  3. Folgt REST-Prinzipien: GET-Anfragen werden zum Abrufen von Daten verwendet, während POST-Anfragen zum Senden von Daten verwendet werden.

Häufige PRG-Methoden

Hier ist eine Tabelle der häufig verwendeten Methoden im PRG-Muster:

Methode Beschreibung
$_SERVER['REQUEST_METHOD'] Prüft die HTTP-Anfragemethode (GET, POST, etc.)
header('Location: ...') Sendet eine Umleitungsheader an den Browser
exit Stellt sicher, dass kein weiterer Code nach der Umleitung ausgeführt wird
session_start() Startet eine neue Sitzung oder fortsetzt eine bestehende
$_SESSION Speichert und abruft Sitzungsdaten
isset() Prüft, ob eine Variable gesetzt ist und nicht NULL ist
unset() Vernichtet eine angegebene Variable

Denken Sie daran, junge Padawans, das PRG-Muster ist wie die Macht im Web-Entwicklungsprozess. Es bringt Gleichgewicht in Ihre Anwendungen, indem es die dunkle Seite der doppelten Formularübermittlungen verhindert. Möge der Code mit Ihnen sein!

Zusammenfassend ist das Post-Redirect-Get-Muster ein leistungsfähiges Werkzeug in Ihrem Web-Entwicklungswerkzeugkasten. Es hilft, robustere und benutzerfreundlichere Anwendungen zu erstellen, indem es versehentliche doppelte Übermittlungen verhindert. Während Sie Ihre Reise in PHP und Web-Entwicklung fortsetzen, werden Sie viele weitere Situationen finden, in denen PRG den Tag retten kann. Bleiben Sie amüsiert, neugierig und viel Spaß beim Coden!

Credits: Image by storyset