Jonas: Cookies werden nicht korrekt gesetzt

Beitrag lesen

Hallo werte Programmierergemeinde,

da ich nun seit ca. 12 Stunden an einem Problem bzgl. Cookies sitze und einfach keine Lösung finden kann, springe ich hiermit über meinen Schatten und suche Rat :)

Es geht um eine Webapplikation zur Erstellung personalisierter Startseiten, welche auf PHP und einer Menge JS basiert. Der Grundgedanke der Implementierung basiert auf objektorientierter Programmierung in PHP: Eine personalisierte Seite wird durch eine Instanz der Page-Klasse repräsentiert, diese wiederum enthält Instanzen einer Widget-Klasse, welche ein Element der personalisierten Seite darstellt. Um dem User eine Login-Prozedur zu ersparen, speichere ich den entsprechenden Status der individuellen Seite, also das Page-Objekt, in einem Cookie. Ich hoffe, dass diese Infos vorerst reichen. Nun zu meinem Problem:
Betritt ein User die Seite, existiert entweder ein COOKIE oder auch nicht und es wird eins angelegt. Das sollte bzgl. der Lösungssuche keinen Unterschied machen, dennoch der Code:

	  
if(!isset($_COOKIE[COOKIE_NAME]) && empty($_COOKIE[COOKIE_NAME])) {  
		/* JUST SAMPLE CODE FOR DEFAULT PAGE */  
		$page = new Page('Default');  
		$page->addRSS('http://welt.de/wirtschaft/?service=Rss');  
		$widgets = $page->getWidgetList();  
		setcookie(COOKIE_NAME, base64_encode(serialize($page)), getCookieExpDate(), '/');  
	} else {  
		$page = unserialize(base64_decode($_COOKIE[COOKIE_NAME]));  
		$widgets = $page->getWidgetList();  
	}  

Per XMLHttpRequest wird jedes vorhandene Widget (in diesem Fall nur ein RSS Feed) aktualisiert. Hierzu wird ein Request auf die Datei 'pageController.php' ausgeführt. Über entsprechende POST-Daten entscheidet diese, was zu tun ist und landet im Fall des Refresh-Befehls in folgendem Block:

  
case 'refreshWidget':  
        if(isset($_COOKIE[COOKIE_NAME], $_POST['ID'])) {  
	$page = unserialize(base64_decode($_COOKIE[COOKIE_NAME]));  
	$widget = $page->getWidget($_POST['ID']);  
					  
	     if($widget->refreshContent()) {  
		setCookie(COOKIE_NAME, '', time()-42000, '/');  
		setcookie(COOKIE_NAME, base64_encode(serialize($page)), getCookieExpDate(), '/');  
                $widget->showContent(1);					  
	     } else {  
		$widget->showContent(1);  
	     }  
	}  
	break;  

Genau hier liegt das Problem. Das 'alte' Cookie, welches aus der vorhergehenden Seite stammt, soll gelöscht, bzw. überschrieben werden. Dies ist notwendig, da auf $widget refreshContent() angewendet wurde, die Inhalte dieses Widgets also aktualisiert wurden. Auf diese Weise kann ich ältere Daten cachen und falls die Ressource mal nicht verfügbar sein sollte, dem User zumindest alte Daten bereitstellen.
Führe ich den Code in dieser Form aus, existiert nach dem refreshContent() kein Cookie. D.h. das Cookie wird gelöscht, das neue aber nicht geschrieben. Wende ich setcookie an, ohne das Cookie vorher zu löschen, steht im Nachhinein das alte Cookie geschrieben, d.h. es wird nicht aktualisiert.

Findet ihr ein Problem in diesem Code?

Vielen Dank im voraus, beste Grüße,
Jonas