Firefox und der verflixte doppelte Formaufruf

3 Juni 2009 von Elmar Kommentieren »

Tja heute war es wieder mal soweit, ein Problem bei dem man sich irgendwann zweifelsohne fragt, ob man sich einen anderen Beruf suchen sollte.

Die Ausgangslage:  Eine HTML-Datei enthält ein Formular, das per GET seine Daten an eine PHP5 Datei übergibt, die wiederum eine E-Mail versendet und einen Text ausgibt das Versand erfolgreich war. Naja da denken wir doch alle mal „toll, na und“. Gut programmiert, auf Firefox, Internet Explorer 8, Safari und Opera getestet. Funktioniert. Toll. Ich bin der König der Welt.

Dann kommt die Meldung vom Kunden, das Skript versendet via Firefox 3  die Mail zweimal. Bei mir natürlich nicht. Super. Also schaut man das auf einen anderen Rechner (gleiche Firefox Version) an, siehe da, tatsächlich nur im FiFo auf dem Rechner wird die Mail zweimal versendet, obwohl nur einmal auf den Submit-Knopf gedrückt wird. Im IE auf dem gleichen Rechner kein Problem. Das gibts doch nicht, denke ich mir nur. Aber ich sehe das es das doch gibt.

Na gut, OK, schnell nachgooglet (ich hasse diesen Ausdruck) und siehe da, auch andere Leute haben das Problem, aber keine eine Lösung. Ausser den Cache des Browsers zu löschen. Naja gut irgendwie schlecht für ein Script, wenn man dem User sagen muss, das man vor der Ausführung seinen Cache löschen soll. Geht nicht.

Nun, so leicht geben wir und nicht geschlagen. Also fassen wir zusammen: Auf ganz bestimmten Rechnern wird das Formular im FireFox aus unerfindlichen Gründen zweimal ausgeführt und eine Lösung muss her, die auf allen möglichen Varianten läuft.

Da frohlockt das Programmiererherz,  eine unkonventionelle Lösung musste her und das kam dabei raus:

session_set_cookie_params (1);
session_start();
$double_off = false;
if (!isset($_SESSION['cnt']))  
	
	$_SESSION['cnt'] = 0; 
	}  
else    
	
	$_SESSION['cnt']++;  
	}
if ($_SESSION['cnt'] >0) 
	{ 
	$double_off = true; 
	}  

So was geht da vor sich in Kurzform: Im Script wird mit ein Session-Cookie mit einer Laufzeit von einer Sekunde kreiert. Ist die Sessionvariable ‚cnt‘ wird falls sie noch nicht vorhanden ist mit dem Wert 0 initialisiert, ist sie schon da, wir inkrementiert. In den Fall das ‚cnt‘ größer als 0 ist, wir die boolean’sche Variable $double_off auf true gesetzt. Sprich wird das Script auf einem Client innerhalb einer Sekunde ein zweites Mal aufgerufen, kann dies aus der Variable $double_off ausgelesen werden. In meinem Fall wurde dann die Mail nicht noch einmal versendet. Ich weiss eine recht pragmatische Lösung, aber es funktioniert. Bleibt nur zu hoffen, das die Jungs @Mozilla diesen lästigen Bug entfernen, bis dahin kann dieser Fix Abhilfe schaffen.

Werbung
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

Kommentare geschlossen.