Boolace: Cookie setzten

Hallo,

habe mir ein Tutorial besorgt zum Thema Cookies setzten. Funktioniert auf meinem localhost auch wunderbar, nur sobald ich es auf meinen Webserver schmeisse, krieg ich folgende Fehlermeldung:

Warning: Cannot modify header information - headers already sent by (output started at /is/htdocs/wp4305_90ZQZB9IOK/index.php:7) in /is/htdocs/wp4305_90ZQZB9IOK//index.php on line 57

So sieht mein Code aus:
if(isset($_COOKIE['letzter_besuch'])) {
  echo "<br>Dein letzter Besuch ist weniger als 60 min. her,",
       " dein letzter Besuch wurde bereits gezählt.";
} else {
  $last_visit=time()+1200;
  setcookie("letzter_besuch",$last_visit,time()+1200);
  echo "<br>Du wirst als Benutzer gezählt. Es wurde ein Cookie    gesetzt.";
  $browser=$_SERVER['HTTP_USER_AGENT'];
  $ip = getenv("REMOTE_ADDR");
  $db=mysql_connect("","","");
  mysql_select_db("", $db);
  mysql_query(" INSERT INTO visitors (id, ip, zeit, browser)
              VALUES ('', '$ip', NOW(''), '$browser')", $db);

Hat jemand eine Idee, warum das auf meinem Server nicht läuft? Gibt es ne Möglichkeit das anders (besser?) zu machen?

Danke!
Boolace

  1. hi, die fehlermeldung kriegst du normal nur, wenn du schon die ersten outputs ausschreibst, dann kannst du nicht nachträglich noch ein cookie setzen, eventuell baust du die abfrage um, sodass du zuallererst alle abfragen + schreiberein bei den cookies durchführst und erst im nächsten schritt diverse ausgaben an den browser schickst.

    MfG
      karl

    1. hi, die fehlermeldung kriegst du normal nur, wenn du schon die ersten outputs ausschreibst, dann kannst du nicht nachträglich noch ein cookie setzen, eventuell baust du die abfrage um, sodass du zuallererst alle abfragen + schreiberein bei den cookies durchführst und erst im nächsten schritt diverse ausgaben an den browser schickst.

      MfG
        karl

      Hi!
      Danke, Karl. Hab das jetzt mal umgebastelt, bringt aber nichts. Der hängt sich ziemlich exakt am Befehl

      setcookie("letzter_besuch",$last_visit,time()+1200);

      auf. Kann das sein, dass das mein Server nicht verarbeiten kann?

      Oder hab ich den falsch geschrieben? Die Anweisungen für Path, Domain und Secure kann ich doch weglassen?! Oder so:

      setcookie("letzter_besuch",$last_visit,time()+1200,"","",0);

      ?

      Irgendwer ne Idee?
      Gruß,
      Boolace

      1. n'abend,

        Danke, Karl. Hab das jetzt mal umgebastelt, bringt aber nichts. Der hängt sich ziemlich exakt am Befehl

        setcookie("letzter_besuch",$last_visit,time()+1200);

        auf. Kann das sein, dass das mein Server nicht verarbeiten kann?

        nein

        Irgendwer ne Idee?

        ja...

        stelle sicher, dass du vor dem setcookie() keinen output machst... also kein echo, print, usw... es darf absolut nichts an den browser gesendet werden, bevor deine cookies nicht gesetzt wurden... schau also, dass du in allen scripts die leerzeichen/-zeilen vor <?php und nach ?> wegbekommst...

        solltest du so arbeiten:

        // php code
        ?>

        <!-- hier steht dein html zeuchs -->

        <?php
        // php code

        stelle sicher, dass deine header und cookie anweisungen am script anfang _vor_ diesen blöcken ausgeführt werden

        weiterhin schönen abend...

        --
        wer braucht schon großbuchstaben?
        sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
        1. solltest du so arbeiten:

          // php code
          ?>

          <!-- hier steht dein html zeuchs -->

          <?php
          // php code

          ay caramba!

          Ja, jetzt ergibt das alles naürlich einen Sinn... Hab das so gemacht und es funktioniert. Muss mir das angewöhnen meine PHP-Anweisungen an den Anfang zu schreiben. Hab bis jetzt nur mit SQL-Anweisungen und so gearbeitet, wos nicht so wichtig ist, wo sie stehen (denke ich ;-)).
          Wie gut das ich niemandem verrate angehender Dipl.-Inf. zu sein, das wär peinlich ;-)

          Vielen Dank an alle!

          Beste Grüße, vom nun zufriedenen,
          Boolace

          1. Hallo Boolace,

            Muss mir das angewöhnen meine PHP-Anweisungen an den Anfang zu schreiben. Hab bis jetzt nur mit SQL-Anweisungen und so gearbeitet, wos nicht so wichtig ist, wo sie stehen (denke ich ;-)).

            Wenn Du Dich sowieso umgewöhnen möchtest, bekommst Du noch einen Tipp: versuche, Anwendungs- und Darstellungslogik zu trennen, dass kannst Du z.B. mit Templatesystemen erreichen. Mein derzeitiger Favorit ist phpsavant. Damit wird der gesamte Code übersichtlicher, weil PHP-Programm und HTML nicht mehr wild durcheinander gemixt werden.

            Wie gut das ich niemandem verrate angehender Dipl.-Inf. zu sein, das wär peinlich ;-)

            Zu lernen ist nie peinlich. Niemand in diesem Forum ist als Meister vom Himmel gefallen, und wenn ich mir mal meine ersten PHP-Skripte durchlese, muss ich lachen.

            schönen Gruß, David

            1. n'abend,

              [...] noch einen Tipp: versuche, Anwendungs- und Darstellungslogik zu trennen, dass kannst Du z.B. mit Templatesystemen erreichen. Mein derzeitiger Favorit ist phpsavant. Damit wird der gesamte Code übersichtlicher, weil PHP-Programm und HTML nicht mehr wild durcheinander gemixt werden.

              ich würde an dieser stelle ja Smarty empfehlen...

              [...] und wenn ich mir mal meine ersten PHP-Skripte durchlese, muss ich lachen.

              bei meinen ersten scripts muss ich eher weinen...

              weiterhin schönen abend...

              --
              wer braucht schon großbuchstaben?
              sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
  2. Das schöne an PHP-Fehlermeldungen ist ja, dass sehr deutlich gesagt wird, was nicht funtioniert. Oft scheint es aber schon so zu sein, dass allein die ersten beiden Wörter "Warning: Cannot" das Denken lähmen.

    Warning: Cannot modify header information - headers already sent by (output started at /is/htdocs/wp4305_90ZQZB9IOK/index.php:7) in /is/htdocs/wp4305_90ZQZB9IOK//index.php on line 57

    Da steht doch ziemlich deutlich, was schief läuft: In Zeile 57 rufst Du den "setcookie"-Befehl auf. Dazu müsste ein HTTP-Header gesendet werden, was nur möglich ist, solange der Output noch nicht gestartet wurde, was aber seit Zeile 7 der Fall ist, selbst wenn es sich nur um Whitespace handeln sollte, das ist ein beliebter Fehler.
    Schaue Dir also Zeile 7 Deiner index.php an und sieh nach, was dort ausgegeben wird.
    Wenn Du nicht weiter kommst, poste Zeile 7(tm) und die nachfolgenden Zeilen auch mal (allerdings nicht alle 40!), weil da vermutlich noch weiterer Output stattfindet, dann kann Dir geholfen werden.

    Gruß, David

  3. Hallo!

    Wo der Fehler liegt, haben andere ja schon gesagt. Nämlich dass irgendwo ein Output generiert wird, bevor das Cookie gesetzt wird.
    Wenn es lokal aber funktioniert hat, dann tippe ich eher darauf, dass beim Uploaden der PHP Seite etwas "schief gelaufen" ist.
    Spielst du die PHP Seite mit einem FTP Client auf den Server?

    Hier im Forum wurde ein soein Fall vor einigen Wochen mal diskutiert. Da wurde an den Anfang der Datei vom FTP Client irgendein Zeichen gesetzt, dass ein Editor auch nicht anzeigen konnte.

    mfg
      frafu