Jan: Hänger bei Setzen/Löschen von Cookies

Hallo Leute!

Habe folgendes kleines Test-Script:

<?
if ($_COOKIE["TestCookie"] == "") {
 $text = "Cookie off";
 $title = "Start";
} else {
 $text = "Cookie on";
 $title = "Destroy";
}

if ($action == "on") {
 setcookie ('TestCookie', 'Hallo',time()+60*60*24*30, '/','localhost');
 $text = "Cookie on";
 $title = "Destroy";
}
if ($action == "off") {
 setcookie ("TestCookie", "", time() - 3600);
 $text = "Cookie off";
 $title = "Start";
}

if ($_COOKIE["TestCookie"] == "") {
 echo $text;
 echo "<br><form action="test1.php" method="post">\n";
 echo "<input type="hidden" name="action" value="on">\n";
 echo "<input type="submit" value=";
 echo $title;
 echo "></form>\n";
} else {
 echo $text;
 echo "<br><form action="test1.php" method="post">\n";
 echo "<input type="hidden" name="action" value="off">\n";
 echo "<input type="submit" value=";
 echo $title;
 echo "></form>\n";
}
?>

Nun funktionert es zwar so wie ich möchte, aber ich muss das Formular immer 2x abschicken, damit das Cookie gesetzt bzw. gelöscht wird.

Leider komme ich nicht dahinter, woran es liegt, dass es nicht beim ersten Klick klappt, sondern immer nen zweiten braucht.

Gruß, Jan

  1. Hi,

    Nun funktionert es zwar so wie ich möchte, aber ich muss das Formular immer 2x abschicken, damit das Cookie gesetzt bzw. gelöscht wird.
    Leider komme ich nicht dahinter, woran es liegt, dass es nicht beim ersten Klick klappt, sondern immer nen zweiten braucht.

    vielleicht daran, dass es zwar beim ersten Mal klappt, aber Dir Cookies nur dann existieren, wenn sie auch gesetzt wurden, was Du erst beim nächsten Request erfahren kannst.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. if ($_COOKIE["TestCookie"] == "") {
    $text = "Cookie off";
    $title = "Start";
    } else {
    $text = "Cookie on";
    $title = "Destroy";
    }

    if ($action == "on") {
    setcookie ('TestCookie', 'Hallo',time()+60*60*24*30, '/','localhost');

    Nun funktionert es zwar so wie ich möchte, aber ich muss das Formular immer 2x abschicken, damit das Cookie gesetzt bzw. gelöscht wird.

    Das sieht nur so aus, da Dein Code nicht richtig durchdacht ist. Es passiert folgendes:

    1. Du rufst die Seite das erste Mal auf. Es erscheint die Nachricht, daß kein Cookie gesetzt ist.

    2.
    a) Du drückst das Knöpken zum Setzen eines Cookies. Der Browser sendet die diese Nachricht an den Server.
    Da bis zu diesem Zeitpunkt noch kein Cookie gesetzt ist, kann der Browser auch kein Cookie zum Server schicken, was wiederum den Server dazu veranlasst, die Meldung auszugeben, daß kein Cookie gesetzt ist.

    b) Nachdem der Server die Meldung aus a), "Cookie off", ausgespuckt hat, lässt Du ihn das Formular auswerten ($action == "on" - benutze besser $_POST["action"] und schalte register_globals aus) und den Cookie setzen.

    3. Dein Browser bekommt die Antwort aus 2 vom Server: Den Text "Cookie off" sowie den Wunsch, einen Cookie zu speichern.

    Schalte in Deinem Browser die Cookiewarnungen ein und Du wirst sehen, daß tatsächlich nach dem ersten Abschicken ein Cookie gesendet wird.

    Gruß,
      soenk.e

    PS: Und immer schön daran denken, PHP läuft im Server, nicht im Browser.

    1. Habs hergebracht. Ich hab gemerkt, dass das Hidden-Feld "action" erst nach dem 2. Klick umgestellt wurde, habs etwas umgemodelt und jetzt passt es:

      Sie hier:

      <?
      if ($_COOKIE["TestCookie"] == "") {
       $text = "Cookie off";
       $title = "Start";
       $aktion = "on";
      } else {
       $text = "Cookie on";
       $title = "Destroy";
       $aktion = "off";
      }

      if ($_POST["action"] == "on") {
       setcookie ('TestCookie', 'Hallo',time()+60*60*24*30, '/','www.probase.at');
       $text = "Cookie on";
       $title = "Destroy";
       $aktion = "off";
      }
      if ($_POST["action"] == "off") {
       setcookie ("TestCookie", "", time() - 3600);
       $text = "Cookie off";
       $title = "Start";
       $aktion = "on";
      }

      echo $text;
       echo "<br><form action="test1.php" method="post">\n";
       echo "<input type="hidden" name="action" value=";
       echo $aktion;
       echo ">\n";
       echo "<input type="submit" value=";
       echo $title;
       echo "></form>\n";
      ?>

      Gruß, Jan