Elischa: Cookies löschen

Hallo,

warum werden die Cookies nicht gelöscht?

setcookie("visitorId","",time() - 3600);
setcookie("warenkorbId","",time() - 3600);

Laut php.net stimmt meine Schreibweise.

  1. Hi,

    warum werden die Cookies nicht gelöscht?

    wie ermittelst Du, ob die Cookies gelöscht wurden?

    cu,
    Andreas a/k/a MudGuard

    1. Hallo,

      wie ermittelst Du, ob die Cookies gelöscht wurden?

      Indem ich in die Browser Einstellungen schaue ob das Cookie einen anderen Wert hat, denn in meiner index.php wird folgendes festgelegt

      if (!isset($_COOKIE['warenkorbId']))
          {
              setcookie("warenkorbId", uniqid(), time()+86400);
              $userWarenkorbID = htmlspecialchars($_COOKIE["warenkorbId"]);
          } else {
              $userWarenkorbID = htmlspecialchars($_COOKIE["warenkorbId"]);
          }
      

      Wenn es also funktionieren würde, dann sollte ich nach dem löchen einen neuen Cookie Wert haben, richtig?

      1. Tach!

        if (!isset($_COOKIE['warenkorbId']))
            {
                setcookie("warenkorbId", uniqid(), time()+86400);
                $userWarenkorbID = htmlspecialchars($_COOKIE["warenkorbId"]);
            } else {
                $userWarenkorbID = htmlspecialchars($_COOKIE["warenkorbId"]);
            }
        

        Was machst du denn mit htmlspechialchars() an den Eingabedaten? Eigentlich will man mit Rohdaten arbeiten und erst beim Einfügen in die Ausgabe das htmlspechialchars() anwenden.

        Wenn es also funktionieren würde, dann sollte ich nach dem löchen einen neuen Cookie Wert haben, richtig?

        Jein. In $_COOKIE steht, was vom Client kommt, beziehungsweise was mit seinem Request mitkam. Ein setcookie() allein bewirkt keine Änderung in $_COOKIE. Erst wenn die Response mit dem setcookie() beim Client beim Client angekommen ist und dieser einen neuen Request stellt, kannst du in $_COOKIE die Änderungen beobachten.

        dedlfix.

        1. Hallo,

          Was machst du denn mit htmlspechialchars() an den Eingabedaten? Eigentlich will man mit Rohdaten arbeiten und erst beim Einfügen in die Ausgabe das htmlspechialchars() anwenden.

          Hab ich geändert

          // Cookie für den Warenkorb eines Users anlege
          if (!isset($_COOKIE['warenkorbId']))
              {
                  setcookie("warenkorbId", uniqid(), time()+86400);
                  $userWarenkorbID = $_COOKIE["warenkorbId"];
              } else {
                  $userWarenkorbID = $_COOKIE["warenkorbId"];
              }
          

          Jein. In $_COOKIE steht, was vom Client kommt, beziehungsweise was mit seinem Request mitkam. Ein setcookie() allein bewirkt keine Änderung in $_COOKIE. Erst wenn die Response mit dem setcookie() beim Client beim Client angekommen ist und dieser einen neuen Request stellt, kannst du in $_COOKIE die Änderungen beobachten.

          Mein Problem habe ich nach längerem basteln so gelöst bekommen (zumindest funktionierte es bei meinem Test).

          In meiner header.php liegt

          if (isset($_SESSION['loeschenCookieWKID'])) {
          
             if ($_SESSION['loeschenCookieWKID'] === 1) 
          	{
          	  setcookie("visitorId","",time() - 3600);
          	  setcookie("warenkorbId","",time() - 3600);
             }
          }
          

          In meiner anfrage.php habe ich dieses ans Ende des insert Scriptes eingefügt:

          $_SESSION['loeschenCookieWKID'] = 1;
          

          Was ich nicht ganz verstehe warum ich diesen Umweg gehen muss?

          1. Tach!

            Was ich nicht ganz verstehe warum ich diesen Umweg gehen muss?

            Das weiß ich auch nicht, weil ich nicht weiß, was du exakt machst und wie du dabei feststellst, dass der Cookie nicht gelöscht sei (oder gelöscht worden ist, nachdem die Response beim Client ankam).

            Nochmal: Ein setcookie() bewirkt keine direkte Änderung in $_COOKIE. Das ist erst im nächsten Request geändert, nachdem der Client tätig war.

            dedlfix.

            1. Hallo,

              Das weiß ich auch nicht, weil ich nicht weiß, was du exakt machst und wie du dabei feststellst, dass der Cookie nicht gelöscht sei (oder gelöscht worden ist, nachdem die Response beim Client ankam).

              ich rufe im Firefox die Cookie Verwaltung auf und schau ob in dem Cookie ein anderer Wert steht. Wenn ja würde es gelöscht und neu angelegt, wenn nein, hat sich nichts getan :)

              EDIT: Wäre es also besser, den Wert vom Cookie direkt zu ändern anstatt zu löschen?

              1. Tach!

                ich rufe im Firefox die Cookie Verwaltung auf und schau ob in dem Cookie ein anderer Wert steht. Wenn ja würde es gelöscht und neu angelegt, wenn nein, hat sich nichts getan :)

                Du schaust aber auch in den Entwicklertools des Browsers nach, ob der Set-Cookie-Header wie gewünscht mitgesendet wurde?

                dedlfix.

          2. Hi,

            // Cookie für den Warenkorb eines Users anlege
            if (!isset($_COOKIE['warenkorbId']))
                {
                    setcookie("warenkorbId", uniqid(), time()+86400);
                    $userWarenkorbID = $_COOKIE["warenkorbId"];
                } else {
                    $userWarenkorbID = $_COOKIE["warenkorbId"];
                }
            

            in dieser Abfrage hast du ein Logikproblem: Erst fragst du ab, ob $_COOKIE["warenkorbId"] nicht existiert. Wenn es tatsächlich nicht existiert (also im if-Zweig), dann weist du diesen nicht existierenden Wert an $userWarenkorbID zu. Denn dass setcookie() nichts ins $_COOKIE-Array schreibt, hat dedlfix ja schon ausführlich erläutert. Dort steht die Information erst beim nächsten Request.

            Und selbst wenn es von der Logik richtig wäre: Du hast im if- und im else-Zweig dieselbe Anweisung. Die könntest du also auch aus dem if-Konstrukt rausziehen und dahinter notieren.

            So long,
             Martin

      2. Wenn es also funktionieren würde, dann sollte ich nach dem löchen einen neuen Cookie Wert haben, richtig?

        Wenn Du wissen willst, ob ein Cookie gelöscht wurde, solltest Du gucken ob er gelöscht wurde und nicht gucken ob er einen anderen Wert beinhaltet.