Refresh fără INSERT

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:

  1. inițializarea sesiunii: adăugarea session_start(); la începutul scriptului pentru a putea folosi variabile de sesiune.
  2. 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();
  3. 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.

Sursa figură:

Author: Ovidiu.S

Suficient de pasionat de această zonă profesională ca, în cazul în care ştiu ceva - cât de puţin - să împărtăşesc cu alţii.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *