ugrás a tartalomhoz

Státusz megőrzése form-resubmit tiltással

pkadam · 2012. Jan. 8. (V), 06.27
Sziasztok!

A bonyolult cím ellenére a probléma elég gyakori:

1. Szeretném megakadályozni, hogy a lapot újratöltve a felhasználó ismételten elküldhesse az űrlapot.

2. Úgy eleget tenni az egyes pontnak, hogy a szkript "emlékezzen" arra, hogy az űrlap ki lett töltve, és annak megfelelően dobjon egy státusz-üzenetet. (Ez után a form újra szerepel, tehát külön fájlba nem tehető, illetve az URL után se fűzzünk semmit - és a lapot újratöltve a státusz már ne jelenjen meg.)

Arra lennék kíváncsi, hogy a legegyszerűbb megoldást találtam-e meg, vagy létezik-e erre jobb gyakorlat. Az én megfejtésem szerint:

1. Az elküldött űrlap feldolgozása után header('Location: '.$_SERVER['REQUEST_URI']); - Ez eddig tökéletes, csak emiatt már nem fog emlékezni az újratöltés után, hogy post-olva lett a form.

2. Ezért az átirányítás előtt egy $_SESSION['message'] változóban jelzem, hogy milyen visszajelzést kell adni a felhasználó számára (persze átirányítás után exit(), hogy a sessionbe bele is írja - vagy akár előtte egy session_write_close(), de előbbivel nem fut tovább feleslegesen a szkript), majd utána kiolvasom, és megjelenítem, ha talált $_SESSION['message']-et, végül unset()-elem azt.

Tehát van-e ennél jobb, célszerűbb módszer?

Előre is köszönve a válaszokat,
Ádám
 
1

egyedi azonosító

Poetro · 2012. Jan. 8. (V), 11.06
Az űrlap generálásakor beleírsz egy egyedi változót, amit eltárolsz munkamenetben. Ezt hagyományos űrlapmezőként berakod az űrlapba, így a felhasználó azt is el fogja küldeni. Amikor a felhasználó elküldi az űrlapot, akkor megnézed, hogy generáltál-e neki ilyen azonosítójú űrlapot, és ha igen, azt elküldte-e már. Ha már elküldte, akkor adsz a felhasználónak egy üzenetet, hogy az űrlapot már elküldte. Ha még nem küldte el, akkor eltárolod, hogy most már tényleg elküldte ezt az azonosítójú űrlapot, így tudod figyelmeztetni a felhasználót. Esetleg a régi űrlap azonosítókat (mondjuk amik régebbiek mint egy nap) törlöd a munkamenetből.
2

köszönöm

pkadam · 2012. Jan. 14. (Szo), 08.40
Köszönöm a válaszodat, maradtam az eredeti elképzelésnél, ez volt a legrugalmasabb, és ez eredményezte a legtisztább kódot, globális felhasználhatóságot.

function result($status,$message) {
	echo '<p class="' , ($status==0 ? 'error' : 'success').'">' , $message , '</p>';
}

function messageWrite($status,$message) {
	$_SESSION['message']['type'] = $status;
	$_SESSION['message']['text'] = $message;
	header('Location: '.$_SERVER['REQUEST_URI']);
	die();
}

function messageRead() {
	if ($_SESSION['message']) {
		result($_SESSION['message']['type'],$_SESSION['message']['text']);
		unset($_SESSION['message']);
	}
}