urmel273: Cookie setzen mit Javascript: Ablaufdatum klappt nicht

Hallo, ich setze ein cookie mit JS und möchte dies später wieder auslesen. Dies klappt im Prinzip auch. Nur bekomme ich es nicht hin, daß ich das Ablaufdatum richtig gesetzt wird.

Hier mein Ansatz:

	var ablauf = new Date();  
	ablauf.setTime(ablauf.getTime() +  (365 * 24 * 3600 * 1000));  
	//alert(ablauf.toGMTString());  
	document.cookie = "Name=TEST; domain="+escape(".test")+"; expires=" + ablauf.toGMTString()+";";  
	document.cookie = "punkte_1=77";  
	document.cookie = "punkte_2=55";  

Hierbei wird mir im Firefox bei den Cookies als Website gar kein Name angezeigt, wenn ich die Seite lokal auf meinem eigenen PC ausführe, dagegen wird mir auf meiner hochgeladenen homepage der Anbieter angezeigt.
Ich bekomme hiermit auch die 2 cookies punkte_1 und punkte_2 eingetragen, aber mir wird <Gültig bis: Am Ende der Sitzung> angezeigt, obwohl ich 1 Jahr ausgewählt habe.

Was mache ich hier falsch?

Für was setze ich die beiden Parameter Name und domain eigentlich?

  1. Hallo,

    Das Schema, um EINEN Cookie zu setzen, ist:

    document.cookie = "$name=$wert; domain=$domain; expires=$datum";

    $xyz steht hier für eine Variable, einen Platzhalter.

    Konkretes Beispiel:

    document.cookie = "punkte_1=77; domain=example.org; expires=Thu, 01 Jan 2015 00:00:00 GMT"

    Wenn du ein expires setzen willst, musst du es AN DIESER STELLE angeben. Nicht bei einem anderen Cookie.

    document.cookie = "Name=TEST; domain="+escape(".test")+"; expires=" + ablauf.toGMTString()+";";

    Dies setzt einen Cookie mit dem Namen »Name« und dem Wert »TEST«.
    Die Domainangabe ist keine gültige Domain (».test«). Lass sie im Zweifelsfall weg.
    Die expires-Angabe gilt für DIESEN Cookie. Sie gilt nicht für deine anderen beiden Cookies.

    document.cookie = "punkte_1=77";
    document.cookie = "punkte_2=55";

    Diese beiden Cookies haben KEINE expires-Angabe.

    Ich bekomme hiermit auch die 2 cookies punkte_1 und punkte_2 eingetragen, aber mir wird <Gültig bis: Am Ende der Sitzung> angezeigt

    Das war zu erwarten.

    obwohl ich 1 Jahr ausgewählt habe.

    Nein, du setzt die beiden Cookies punkte_1 und punkte_2 ohne Expires.

    Für was setze ich die beiden Parameter Name und domain eigentlich?

    Anstatt »Name« musst du den gewünschten Namen des Cookies einsetzen.

    Die Domain gibt an, dass der Cookie für eine bestimmte Domain gesetzt wird.

    Du kannst die Domain weglassen, dann gilt der Cookie automatisch für die aktuelle Domain.

    Die Angabe der Domain ist (nur) dann sinnvoll, wenn du von einer anderen Subdomain auf den Cookie zugreifen willst (z.B. foo.example.org und bar.example.org). Das wäre sonst nämlich nicht möglich.

    Grüße
    Mathias

    1. Hallo Mathias,

      danke, damit funktioniert es perfekt. Jetzt habe ich das hier auch verstanden.

      Weißt Du vielleicht auch noch, wie ich es machen kann, daß ich meine Highscores nicht nur lokal auf meinem Rechner speichern kann, sondern daß ich sie für alle gemeinsam führen kann? Denn das mit den Cookies ist für mich nicht 100% zufriedenstellend.

      Hierzu gibt es 2 Varianten, die interessant wären:

      1. Speichern auf meinem Webspace (wo ich die Seite auch hochgeladen habe) für wirklich alle.
      2. Speichern auf einem zentralen Server in einem lokalen Netz, wo die einzelnen user auch ganz normallen Schreib- und Lesezugriff haben.

      1. wäre natürlich interessanter, weil universeller.
      2. wäre aber wenigstens eine gewisse Alternative. Wobei ich nicht weiß, ob das irgendwie geht, denn soweit ich weiß läßt JS auf normallem Weg kein Zugriff aufs Dateisystem zu oder irre ich mich und es geht doch?

      Vielen Dank,
      Sascha

      1. Hallo,

        1. Speichern auf meinem Webspace (wo ich die Seite auch hochgeladen habe) für wirklich alle.

        2. Speichern auf einem zentralen Server in einem lokalen Netz, wo die einzelnen user auch ganz normallen Schreib- und Lesezugriff haben.

        3. wäre natürlich interessanter, weil universeller.

        4. wäre aber wenigstens eine gewisse Alternative. Wobei ich nicht weiß, ob das irgendwie geht, denn soweit ich weiß läßt JS auf normallem Weg kein Zugriff aufs Dateisystem zu oder irre ich mich und es geht doch?

        JavaScript im Browser kann höchstens HTTP-Anfragen stellen und einen WebSocket öffnen. Auf Dateien auf einem fremden Server kann es nicht direkt zugreifen, schon gar nicht schreibend.

        Üblicherweise schickt JavaScript Daten via XMLHttpRequest per HTTP an einen Webserver. Der Webserver nimmt die Daten entgegen und speichert sie. Dazu bedarf es einer entsprechenden serverseitigen Logik, die in einer serverseitigen Programmiersprache geschrieben sein muss. Zur Speicherung können Dateien oder eine Datenbank verwendet werden. Da musst du schauen, was auf deinem Webspace zur Verfügung steht (oftmals PHP, Perl oder Python) und für dich am einfachsten umzusetzen ist.

        Grüße
        Mathias

        1. Hallo Mathias,

          ich hab Deine Antwort erst jetzt gesehen, sorry. Gibt es hier irgendwie die Möglichkeit ein Thema zu abonnieren, so daß man immer eine mail bekommt, wenn eine neue Antwort geschrieben wurde?

          Ich habe gerade nachgeschaut, ich hab bei meinem Provider tatsächlich PHP. Hab ich letzte Woche gerade bei meiner Umschulung zum Fachinformatiker ein ganzes Skript (300 Seiten) durchgearbeitet, so daß ich das wohl hinbekommen werde.
          Sämtliche Felder die übertragen werden sollen bekommen dann halt zusätzlich zur id noch ein name-Attribut und ich sende das ganze mittels POST. Wobei ich dann mal schauen muß, ob das auch geht, ohne daß gleich meine ganze Webseite neu aufgebaut werden muß.
          Kann ich da eigentlich separieren, daß nur bestimmte name-Felder übertragen werden oder werden da gleich alle genommen?
          Ist es eigentlich ein Problem für PHP, wenn ich einen bestimmten Namen für ein name-Attribut mehrfach vergeben habe( ids sind alle eindeutig)? Bei der Programmierung mit JS war das für mich so am bequemsten, da ich damit gleich eine ganze Menge Felder auf einmal adrressieren konnte, um sie so schneller löschen zu können.

          Viele Grüße!

          Sascha

          1. Hallo

            ich hab Deine Antwort erst jetzt gesehen, sorry. Gibt es hier irgendwie die Möglichkeit ein Thema zu abonnieren, so daß man immer eine mail bekommt, wenn eine neue Antwort geschrieben wurde?

            Nein, die Möglichkeit gibt es nicht. Die nächste Majorversion soll das können.

            Ich habe … bei meinem Provider tatsächlich PHP.

            Sämtliche Felder die übertragen werden sollen bekommen dann halt zusätzlich zur id noch ein name-Attribut und ich sende das ganze mittels POST. Wobei ich dann mal schauen muß, ob das auch geht, ohne daß gleich meine ganze Webseite neu aufgebaut werden muß.

            <http://de.selfhtml.org/html/formulare/definieren.htm#bereich@title=Du gibst dem form-Tag die Methode> „post“ und der Browser weiß dann, wie er das handeln soll. Du musst dann nur noch für die Verarbeitung auf der Zielseite (Wert des action-Attributs) sorgen.

            Kann ich da eigentlich separieren, daß nur bestimmte name-Felder übertragen werden oder werden da gleich alle genommen?

            Grundsätzlich werden alle Felder übertragen. Die sind dann im Zweifelsfall leer.

            Ist es eigentlich ein Problem für PHP, wenn ich einen bestimmten Namen für ein name-Attribut mehrfach vergeben habe( ids sind alle eindeutig)?

            Ja. PHP überschreibt dann den Wert des ersten Feldes (und, falls vorhanden, weiterer) mit dem des letzten Feldes mit dem Namen. Benenne die felder also unterschiedlich. Einzige Ausnahme ist, wenn du zusammengehörige Gruppen von Feldern (namentlich Checkboxen) hast. Du könntest dort ja mehrere Werte gleichen Namens haben wollen (ein Array). Dort musst du den Feldnamen allerdings die eckigen Klammern („[“ und „]“) hinzufügen, damit PHP das als Array erkennt.

            Nehmen wir <http://de.selfhtml.org/html/formulare/auswahl.htm#checkboxen@title=SelfHTMLs Checkboxenbeispiel>, das muss für PHP folgendermaßen notiert werden:

                <input type="checkbox" name="zutat[]" value="salami"> Salami<br>  
                <input type="checkbox" name="zutat[]" value="pilze"> Pilze<br>  
                <input type="checkbox" name="zutat[]" value="sardellen"> Sardellen
            

            Bei der Programmierung mit JS war das für mich so am bequemsten, da ich damit gleich eine ganze Menge Felder auf einmal adrressieren konnte, um sie so schneller löschen zu können.

            Das hört sich eher nach einer Klasse an.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3