Matze: Cookie wird bei der ersten Abfrage nicht erkannt

Hallo,

ich versuche mich an einer einfachen Abfrage ob ein Cookie erfolgreich gespeichert wurde oder nicht.

Beim ersten Aufruf des Scripts wird das Cookie zwar gesetzt,
das Script sagt mir trotzdem ich hätte keins.

Kann mir bitte jemand sagen woran das liegt?
Ausserdem sollte mir session_name('userid') und session_start('userid') ein Cookie mit dem Element userid und der SessionID als Wert erstellen.
Tut es aber nicht. Erst wenn ich den Wert mit $_COOKIE['userid'] = session_id(); selbst rein schreibe.
Schreib ich den Wert nicht rein, steht die SessionID erst nach dem zweiten Seitenaufruf im Cookie.

An was hab ich denn da wieder nicht gedacht?

Der Code:

  
<?PHP  
 ## Prüfen ob Cookies akzeptiert werden und Cookie setzen  
  
 setcookie('Website-Cookie');  
 if(!isset($_COOKIE['Website-Cookie'])){  
  $i = '1';  
 }else{  
  session_name('userid');  
  session_start('userid');  
  $_COOKIE['user'] = 'Matze';  
  $_COOKIE['userid'] = session_id();  
 }  
  
 ## AUSGABE-TEIL  
  
 switch($i){  
 case 1:  
  echo '<p>Für diesen Vorgang muss das Speichern von Cookies auf Ihrem System erlaubt sein.<br />  
  ERROR '.$error.'</p>';  
default:  
 /* nur ein bisschen Text */  
 }  
  
 ## Cookieinhalt anzeigen  
  
 echo '<pre>';  
 print_r($_COOKIE);  
 echo '</pre>';  
?>  

Danke und Grüße, Matze

  1. Hi Matze,

    An was hab ich denn da wieder nicht gedacht?

    Daran, dass du mit PHP und Cookies nicht in "Echtzeit" arbeiten kannst, mit Echtzeit meine ich z.B. wie bei Javascript, dass das Cookie unmittelbar gesetzt und dann wieder ausgelesen werden kann. Das steht übrigens auch im PHP Manual:

    Sind die Cookies einmal gesetzt, können Sie beim **nächsten** Seitenaufruf anhand
      der $_COOKIE oder $HTTP_COOKIE_VARS Arrays auf diese zugreifen.

    Das liegt ganz einfach daran, dass die Cookies erst als Teil der Response an den Client (den Browser) geschickt werden müssen. Erst beim nächsten Request kann der Browser das Cookie dann wieder mitsenden, erst beim nächsten Aufruf deines PHP-Scriptes kriegst du also das Cookie wieder von "außen" rein und hast es in $_COOKIE zur Verfügung.

    Viele Grüße,
      ~ Dennis.

    1. Hallo,

      Das liegt ganz einfach daran, dass die Cookies erst als Teil der Response an den Client (den Browser) geschickt werden müssen. Erst beim nächsten Request kann der Browser das Cookie dann wieder mitsenden, erst beim nächsten Aufruf deines PHP-Scriptes kriegst du also das Cookie wieder von "außen" rein und hast es in $_COOKIE zur Verfügung.

      natürlich. Danke.
      Ist meine ganze Idee der Abfrage ob Cookies akzeptiert werden so also fürn Ar***? Wie realisiert man sowas üblicherweise mit PHP?

      Danke und Grüße, Matze

      1. Hi,

        Ist meine ganze Idee der Abfrage ob Cookies akzeptiert werden so also fürn Ar***? Wie realisiert man sowas üblicherweise mit PHP?

        Ja. Ganz einfach, indem man die Session-Automatik nutzt.
        D.h. bei entsprechender (normaler) Einstellung künnert sich PHP selbst darum und schreibt die SessionID in die Links bzw. die Konstante SID, wenn der Browser kein SessionCookie liefert.

        freundliche Grüße
        Ingo

        1. Hallo,

          D.h. bei entsprechender (normaler) Einstellung künnert sich PHP selbst darum und schreibt die SessionID in die Links bzw. die Konstante SID, wenn der Browser kein SessionCookie liefert.

          das ist mir schon klar, man kann die SID auch manuell an die Links hängen.
          Mir geht es aber nicht primär um die Session, sondern darum wie ich abfragen kann ob Cookies akzeptiert werden.

          Sowas wär mir ganz lieb if(setcookie('Mein Cookie')){ /* tu was */ }, geht aber natürlich nicht.

          Grüße, Matze

          1. Hi,

            Mir geht es aber nicht primär um die Session, sondern darum wie ich abfragen kann ob Cookies akzeptiert werden.

            Genau so, wie PHP es bei Sessions automatisch macht:
            Wenn der Cookie beim naechsten Request wieder mitgeschickt wird, dann wurde *dieser* Cookie akzeptiert (und er wurde bei *diesem* Request wieder mitgeschickt - ob das beim naechsten auch noch der Fall sein wird, kannst du nicht wissen).

            Sowas wär mir ganz lieb if(setcookie('Mein Cookie')){ /* tu was */ }, geht aber natürlich nicht.

            Prinzipbedingt unmoeglich.

            MfG ChrisB

            1. Hallo,

              Genau so, wie PHP es bei Sessions automatisch macht:
              Wenn der Cookie beim naechsten Request wieder mitgeschickt wird, dann wurde *dieser* Cookie akzeptiert (und er wurde bei *diesem* Request wieder mitgeschickt - ob das beim naechsten auch noch der Fall sein wird, kannst du nicht wissen).

              ich danke euch, ich hab das Cookie jetzt eine Seite vorher gesetzt.
              Auch logisch, dass das Cookie erst beim nächsten Request verwendet werden kann.

              Grüße, Matze