eddi: Cookiesetzung überprüfen

Beitrag lesen

Hallo,

Ich weiß das es sich auch mit dem Rückgabewert von setcookie() überprüfen lässt...

das ist schon mal nicht korrekt. Die Rückgabe von setcookie() sagt nichts darüber aus, ob der Browser Cookies akzepiert. Sie gibt nur darüber auskunft, ob der entsprechende HTTP-Header des Response gesetzt werden konnte.
 Ein möglicher Fall, wo diese Funktion FALSE zurückgeben kann, tritt auf, wenn bereits eine Ausgabe des Inhalts vor setcookie() stattfand.

Jedoch wurde immer ausgegeben, dass Cookies nicht aktiviert seien, unabhängig vom Browser. Nachdem ich die F5 Taste betätigt hatte wurde dann richtigerweise ausgegeben dass cookies aktiviert wären.

In der Beschreibung der funktion setcookie() findet sich unter "Häufige Probleme:" gleich als erstes:

Cookies werden nicht sichtbar, bevor nicht eine Seite geladen wird,
        für die das Cookie sichtbar sein soll. Um zu testen, ob ein Cookie
        erfolgreich gesetzt wurde, prüfen Sie noch vor der Ablaufzeit auf
        DER NÄCHSTEN GELADENEN SEITE[!], ob das Cookie vorhanden ist. ...

Wenn in Deinem Script das Cookie gesetzt wird, wird gleichfalls auch der Inhalt des Scripts ausgeliefert. Jedoch werden Cookies nur bei einem Request gesendet und dieser erfolgte ja bereits. Also kann erst beim nächsten Request abgeprüft werden, ob der Browser ein Cookie sendet.

Üblicherweise wird dies mit einer Weiterleitung verbunden:

if(!$_GET['pruef']){ // noch kein Cookie gesetzt  
   setcookie('Kecks','Butter',time()+600);  
   if(substr(php_sapi_name(),0,3)!='cgi') // CGI-/Modul-Unterscheidung  
        header($_SERVER['SERVER_PROTOCOL'].' 307 Temporary Redirect');  
   else header('Status: 307');  
  
   // Erstellen des QueryStrings  
   $qs=($_SERVER["QUERY_STRING"]!=='' ? '&' : '?').'pruef=1';  
   // Umleitung auf selbes Script + $_GET['pruef']  
   header('Location: http://'.$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"].$qs);  
}  
else echo 'cookie '.(isset($_COOKIE['Kecks']) ? '' : 'nicht ').'aktiviert';

Gruß aus Berlin!
eddi