Uneori/deseori codul necesar inserării datelor într-o tabelă MySQL poate să fie pe aceiaşi pagină cu formularul. Asta poate duce la inserări suplimentare inutile ale aceloraşi date, duplicându-le. Desigur, o soluţie lejeră ar putea fi utilizarea INSERT... ON DUPLICATE KEY UPDATE
. Dacă nu este necesară sau posibilă o astfel de metodă, se poate recurge la variabile de tip sesiune, folosind metoda Post/Redirect/Get (PRG), care asigură că orice reîncărcare a paginii după trimiterea formularului va rezulta într-o cerere GET, nu într-o resubmitere POST. Astfel, chiar dacă utilizatorul dă refresh, datele nu vor fi inserate din nou în baza de date. Aceştia ar fi nişte paşi de urmat:
- inițializarea sesiunii: adăugarea
session_start();
la începutul scriptului pentru a putea folosi variabile de sesiune. - procesarea formularului și redirectionarea:
- după procesarea formularului și inserarea datelor, stocăm un mesaj de succes în sesiune:
$_SESSION['mesaj'] = "Detaliile selectate au fost înscrise în tabelă.";
- redirecţionăm utilizatorul către aceeași pagină:
header("Location: " . $_SERVER['PHP_SELF']); exit();
- după procesarea formularului și inserarea datelor, stocăm un mesaj de succes în sesiune:
- afișarea mesajului de succes:
- după redirecţionare, verificăm dacă există un mesaj în sesiune și îl afișăm.
- ștergem mesajul din sesiune pentru a nu-l afișa la reîncărcări ulterioare ale paginii.
În figură este redat cu albastru traseul care nu s-a modificat, cel roşu este cel înlocuit, iar cel verde este soluţia PRG.
O astfel de metodă permite prevenirea resubmiterii formularului la reîncărcarea paginii, menține codul de procesare și afișare în același fișier, simplificând astfel structura aplicației şi poate oferi feedback fără riscul de inserări duplicate.
Un exemplu simplu cu o astfel de precauţie anti-resubmit este redat mai jos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php session_start(); // necesar utilizării variabilei sesiune "mesaj" $conn = new mysqli("localhost", "root", "", "test"); if ($_SERVER["REQUEST_METHOD"] == "POST") { $nume = $_POST["nume"]; $prenume = $_POST["prenume"]; $functia = $_POST["functia"]; $stmt = $conn -> prepare("INSERT INTO firma(nume, prenume, functia) VALUES (?, ?, ?)"); $stmt -> bind_param("sss", $nume, $prenume, $functia); if($stmt -> execute()) { $stmt->close(); // variabila MESAJ $_SESSION['mesaj'] = "Detaliile selectate au fost înscrise în noua tabelă."; } header("Location: " . $_SERVER['PHP_SELF']); // redirecţionare către aceeaşi pagină exit(); } ?> <!DOCTYPE html> <html> <head> <title>Exemplu PRG</title> </head> <body> <h1>Exemplu Post-Redirect-Get</h1> <form action="<?= $_SERVER['PHP_SELF'];?>" method="post"> <label for="nume">Name:</label> <input type="text" name="nume" required><br> <label for="prenume">Prenume:</label> <input type="text" name="prenume" required><br> <label for="functia">Functia:</label> <input type="text" name="functia" required><br> <input type="submit" value="Submit"> </form><?php if (isset($_SESSION['mesaj'])) { // afişarea şi ştergerea variabilei sesiune "mesaj" echo "<p>" . $_SESSION['mesaj'] . "</p>"; unset($_SESSION['mesaj']); // Ștergem mesajul din sesiune } ?> </body> </html> |
- Adaptare după Wikipedia.