Cookie Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Cookie Problem

    Hy Community,
    ich mach zwar erst seit zwei tagen mit php rum, aber hab hier einen fehler, auf den ich mit googlen allein nicht mehr komme. Vielleicht könnt Ihr mir helfen?

    Wenn ich diese-php datei ausführe (durch ein send form aus einer html seite) funktioniert alles wunderbar, nur den cookie möchte ich
    nicht am anfang, sondern an der markierten stelle setzten.

    da dies scheinbar nur am anfang (also noch vor "<html>") gemacht werden muss, weiss ich nur die alternative in zwischen den andern tags wieder zu löschen?

    ich habe mit
    setcookie("WorkaholicREC01", $AktuellesDatum, time() -1000);
    versucht den cookie zu löschen, dies ging aber nicht, der cookie war anschliessned immernoch da!?

    mir wäre es aber aufgrund der sicherheit lieber, den cookie erst an der bestimmten stelle zu setzen....


    Hier eine Ablaufbeschreibung:
    ->es handelt sich um ein abstimmungsverfahren indem am anfang des php codes getestet wird, ob das formular korrekt ausgefüllt wurde.
    -> wenn ja, wird getestet ob bereits abgestimmt wurde (cookie)
    -> wenn kein cookie da ist, erfolgt die abstimmung und erst in diesem schritt soll das cookie gesetzt werden...
    -> problem ist, dass bei einem formularfehler der user zurück zur seite geführt wird um angaben zu korrigieren
    -> wenn er jetzt erneut versucht abzustimmen ist das cookie schon da! (wurde ja direkt beim aufruf der seite gesetzt) Es geht nun natürlich nichtmal mit korrekten angaben mehr...


    Hier der Code:
    (Ich habe versucht ihn möglichst verständlich zu kommentieren, sorry fals das nicht geglückt sein sollte.
    Danke im Vorraus)

    -----

    //Cookie bisher:

    <?php
    $AktuellesDatum = date("d.m.Y H:i:s");
    $Gueltigkeit = time()+86400;
    setcookie("WorkaholicREC01", $AktuellesDatum, $Gueltigkeit);
    ?>

    //start

    <html>
    <head>
    <title>Feedbackformular mit PHP</title>
    </head>
    <body bgcolor="#FAF4E9">

    <?php

    $Empfaenger = "hier steht normal meine mailaddy";
    $Punkte = $_REQUEST['Punkte'];
    $Comment = $_REQUEST['comment'];


    //check ob form abgesendet

    if($_REQUEST['Send'])
    {

    //check ob cookie da
    if($_COOKIE['WorkaholicREC01'])
    {

    echo"Danke, aber Du hast heute schon für diesen Beat abgestimmt...";


    }


    else{

    //Check ob Punkte angegeben wurden

    if(empty($_REQUEST['Punkte']))
    {


    echo"Geh bitte <a href=\"javascript:history.back();\">zurück</a> und gib Punkte an!";
    setcookie("WorkaholicREC01", "");

    }


    //OK Führe Abstimmung aus

    else
    {


    //HIER WILL ICH DEN COOKIE SETZEN LASSEN!


    // Länge der Counteranzeige für Statistikausgabe
    $digits=6;
    $digits2=7;

    // Name der Counterdatei
    $counts="Variable01a.txt";
    $counts2="Variable01b.txt";


    // Wenn die Zählerdatei nicht existiert, lege sie neu an und setze Zähler auf Null
    if (!file_exists($counts)){
    $fp=fopen($counts,"w");
    flock($fp,2);
    $hits = 0;
    fputs($fp,$hits,$digits);
    flock($fp,3);
    fclose($fp);
    clearstatcache();
    chmod ($counts, 0777);
    }


    // Zähle eins hinzu
    $fp=fopen($counts,"r+");
    flock($fp,2);
    $hits=fgets($fp,$digits);
    $hits++;
    rewind($fp);
    fputs($fp,$hits,$digits);
    flock($fp,3);
    fclose($fp);


    //Wenn die Zählerdatei Punkte nicht existiert, lege sie neu an und setze Zähler auf 0
    if (!file_exists($counts2)){
    $fp2=fopen($counts2,"w");
    flock($fp2,2);
    $hits2 = 0;
    fputs($fp2,$hits2,$digits2);
    flock($fp2,3);
    fclose($fp2);
    clearstatcache();
    chmod ($counts2, 0777);
    }


    // Zähle Punkte hinzu und berechne Durchschnitt
    $fp2=fopen($counts2, "r+");
    flock($fp2,2);
    $hits2=fgets($fp2,$digits2);
    $hits2 += $Punkte;
    $PunkteD = $hits2/$hits;
    rewind($fp2);
    fputs($fp2,$hits2,$digits2);
    flock($fp2,3);
    fclose($fp2);

    $Mailnachricht = "Sie haben folgende Nachricht erhalten: \n\n";

    while(list($Formularfeld, $Wert)=each($_REQUEST))
    {
    if($Formularfeld!="Send")
    {
    $Mailnachricht .= $Formularfeld.": ".$Wert."\n";
    }
    }

    $Mailbetreff = "Workaholic BEATS BEWERTUNG: ".$_REQUEST['Beat']." Durchschnitt ".round($PunkteD,2)." Stimmen ".$hits;

    mail($Empfaenger, $Mailbetreff, $Comment, $Punkte);
    echo"Vielen Dank für Dein Feedback!<br/> Es wurden bisher ", $hits, " Bewertungen abgegeben.<br/> Durchschnitt: ", round($PunkteD,2) ,"<br/><br/> Grüsse aus Karlsruhe";

    }
    }
    }
    else
    {
    echo"Ein Fehler ist aufgetreten !? Bei dauerhaftem Problem bitte eine eMail an den Administrator senden!";
    }
    ?>
    </body>
    </html>

    -----


    Danke fürs Lesen

    Tyler

  • #2
    um ein cookie zu löschen, musst du das mit den SELBEN daten tun, mit denen du es gesetzt hast (außer dem expires-wert natürlich).

    insofern nicht einen neuen wert für $AktuellesDatum verwenden, sondern den selben, der im Cookie gespeichert ist.

    den erfährst du ja leicht, denn er steht ja in $_COOKIE['WorcaholicREC01'] drin.

    greetz, high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      Und zum Problem selbst: Einen Cookie setzen heißt, bestimmte HTTP-Header an den Browser zu senden. Diese Header erzeugt die Funktion setcookie() und übergibt sie sofort an den Client.

      HTTP-Header kann man aber nur vor der eigentlichen Ausgabe senden.
      Dein HTML-Code weist den Webserver an, die Header mit einer leeren Zeile abzuschließen. Das deutet dem Browser, das von nun an nur noch HTML-Code kommt, keine Header mehr.

      Zu dem Thema gibt es hier auch einen sticky thread ("Headers already sent"), den du lesen solltest. Nähere Details findest du auf php.net/manual.

      Lösung: Ausgabe puffern oder Code umstrukturieren - vorzugsweise letzteres.

      Kommentar


      • #4
        Guuuuter Mann ;-)

        siehste, das ist mir auf die schnell egar nicht aufgefallen..
        sollte mir angewöhnen, doch erst zu ende zu lesen, bevor ich was schreiben.. *patsch*

        greetz, high
        Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
        When everything else fails, manipulate the data...
        Beschriftungen / Großformatdruck / Werbemittel

        Kommentar


        • #5
          deine antwort war aber auch nicht fehl am platz ...
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Danke erstmal für die anworten!

            Wenn ich das richtig verstehe, ist es also weder möglich den header erst während des ablaufs des skripts beim client zu sichern,
            noch das cookie an der erhofften stelle zu löschen.
            Denn ich weiss ja nicht wann (vor wieviel sekunden) das cookie gesetzt wurde.. oder wie bekomme ich das syntaktisch raus?

            Zu "Headers already sent" hab ich hier zwar jetzt was gesehen und gelesen, allerings ging bei mir keine lampe an..

            Kommentar


            • #7
              okay..

              du hast ja was in das cookie vorher reingeschrieben:

              mit set_cookie('kannmirdasniemerken',$aktuellezeit,$gueligkeit);

              deshalb wird beim erneuten aufruf der seite in deinem superglobalen $_COOKIE[] array ein feld zu finden sein, dass so aussieht:

              'kannmirdanichtmerken'=>'(der damals reingeschriebene wert von $aktuellezeit).'

              zu löchen wäre das zum beispiel dann mit

              set_cookie('kannmirdasnichtmerken',$_COOKIE['kannmirdasnichtmerken'],$time()-3600);

              und das ganze BEVOR irgendeine text-ausgabe (Lerrzeichen oder Leerzeilen sind auch text... wird immer gerne vergessen) passiert.

              greetz, high
              Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
              When everything else fails, manipulate the data...
              Beschriftungen / Großformatdruck / Werbemittel

              Kommentar


              • #8
                Original geschrieben von Tyler80
                Wenn ich das richtig verstehe, ist es also weder möglich den header erst während des ablaufs des skripts beim client zu sichern,
                Doch, wäre es (falls ich richtig interpretiert habe, was du da sagen wolltest) - Stichwort output buffering.
                Aber das halte ich im allgemeinen für schlechten Stil, zur Vermeidung solcher "Probleme" den grundlegenden Scriptablauf derart zu vergewaltigen.
                Denn ich weiss ja nicht wann (vor wieviel sekunden) das cookie gesetzt wurde..
                Wie highrise schon sagte, natürlich weißt du das - denn der Client hat dir den gesetzten Wert ja wieder übermittelt.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9

                  ich hab jetzt mit dem hier versucht das cookie zu löschen . ging aber auch nicht, bekomm sogar einen fehler...


                  if(empty($_REQUEST['Punkte']))
                  {
                  setcookie("WorkaholicREC01", $_COOKIE['WorkaholicREC01'],$time()-86500);

                  echo"Geh bitte <a href=\"javascript:history.back();\">zurück</a> und gib Punkte an!";

                  }


                  ---

                  Also mein Problem ist,
                  dass wenn dieses Skript aufgerufen wird, gleich das cookie gesetzt wird.

                  Während des Skripts ist ein Abfangmechanismus, falls das abgeschickte Formular vom Besucher meiner Seite nicht vollständig ausgefüllt wurde. Er wird gebeten es erneut und korrekt auszufüllen.
                  Wenn er dann zurück geht und es erneut versucht abzuschicken blockt das das cookie, das dann schon da ist.


                  Hier nochmal die genaue Ablaufbeschreibung:
                  ->es handelt sich um ein abstimmungsverfahren, indem am anfang des php codes getestet wird, ob das formular korrekt ausgefüllt wurde.
                  -> wenn ja, wird getestet ob bereits abgestimmt wurde (cookie)
                  -> wenn kein cookie da ist, erfolgt die abstimmung und erst in diesem schritt soll das cookie gesetzt werden...
                  -> problem ist, dass bei einem formularfehler der user zurück zur seite geführt wird um angaben zu korrigieren
                  -> wenn er jetzt erneut versucht abzustimmen ist das cookie schon da! (wurde ja direkt beim aufruf der seite gesetzt) Es geht nun natürlich nichtmal mit korrekten angaben mehr...

                  Zuletzt geändert von Tyler80; 08.07.2006, 17:34.

                  Kommentar


                  • #10
                    sorry.. mein fehler...
                    es muss natürlich time() heißen und nicht $time()

                    greetz, high
                    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                    When everything else fails, manipulate the data...
                    Beschriftungen / Großformatdruck / Werbemittel

                    Kommentar


                    • #11
                      Kein Fehler mehr, aber damit gehts auch nicht !? Das Cookie ist auch nach dem echo noch im browser

                      so siehts aus:

                      if(empty($_REQUEST['Punkte']))
                      {

                      setcookie("WorkaholicREC01", $_COOKIE['WorkaholicREC01'], time() -86500);

                      echo"Geh bitte <a href=\"javascript:history.back();\">zurück</a> und gib Punkte an!";


                      }

                      Kommentar


                      • #12
                        An welcher Stelle machst du das Fest?

                        Bedenke bitte: wenn du ein Cookie während des Scriptes löschst, dann wird für diese Durchlauf das Cookie immernoch gesetzt sein, weil es bei der Anfrage vom Browser gesendet wurde (da war es ja da). Das löschen eines Cookie entfernt es zwar (eigentlich) auf browserseite, aber im $COOKIE[] Array besteht der Eintrag immernoch.

                        however...

                        bitte tu einmal folgendes:
                        lösche deine lokalen cookies.
                        rufe die seite auf, die das cookie eigentlich löschen soll, und im anschluss KEINE weitere seite mehr (die evtl ein neues Cookie schreiben könnte)
                        und dann schaum mal in deinen cookie-ordner, ob dort eines noch vorhanden ist.

                        ich kann mir keinen Reim darauf machen, warum er das nicht löscht..

                        möglicherweise ist es ein ablauffehler irgendwo...

                        greetz, high
                        Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                        When everything else fails, manipulate the data...
                        Beschriftungen / Großformatdruck / Werbemittel

                        Kommentar


                        • #13
                          geh mal bitte auf die seite:
                          http://www.workaholic-records.de/bewertung01.html

                          -hier läuft das besagte php skript

                          -wenn man keine punkte angibt und abschickt, wird man gebeten "zurück zu gehen"

                          -erst wenn man zurück geht und punkte angibt kommt man durch diese if-regel.
                          Doch wenn man zurück gegangen ist und punkte vergibt, dann erneut absendet kommt das echo "Bereits abgestimmt"...

                          ich habe mehrere durchgänge mit cookie manuel löschen etc.p.p.versucht, allerdings ohne erfolg
                          ...

                          ich würde es gerne realisieren das cookie erst nach diesem schritt zu aktivieren, aber wie das genau aussehen sollte, k.p...


                          thx4help

                          Kommentar


                          • #14
                            Original geschrieben von Tyler80
                            -wenn man keine punkte angibt und abschickt, wird man gebeten "zurück zu gehen"

                            -erst wenn man zurück geht und punkte angibt kommt man durch diese if-regel.
                            Doch wenn man zurück gegangen ist und punkte vergibt, dann erneut absendet kommt das echo "Bereits abgestimmt"...
                            Dann solltest du den Cookie vielleicht noch gar nicht setzen, wenn keine "erfolgreiche" Abstimmung (also eine, wo Punkte angegeben wurden) stattgefunden hat.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Genau das wäre, wie ich bereits erwähnt hab, mein eigentliches Ziel. Allerdings kann ich den cookie nur am anfang des skripts setzen, zumindest kenne ich keine gute alternative.

                              es scheint als müsste ich das cookie setzen lassen und dann, wenn der user den abstimmungsfehler gemacht hat, das cookie wieder löschen...

                              (auch wenn er dann nach einer erfolgreichen abstimmung durch diesen "bug" das cookie löschen kann und dann wieder abstimmen könnte )

                              ????

                              Kommentar

                              Lädt...
                              X