Sassi: Session-Start()-Fehlermeldung bei Cookie

Hallo Forengemeinde,

bei einem Umfrage-Skript muss man VOR dem eigentlichen HTML-Code einen kleinen Php-Schnipsel zwecks Cookie-Speicherung setzen.

Wenn ich das NACH dem Doctype mache, ist alles okay. Dachte ich, nur leider kann ich nach kurzer Zeit wieder an der Umfrasge teilnehmen. Wenn ich den Code vor den Doctype setze, kommt der Befehl

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at...)

Ich habe nach dem Befehl per Suchfunktion gesucht und es gibt auch einige Artikel. Allerdings werde ich aus diesen nicht schlau. Könnt Ihr mir helfen? Ist das z.B. egal, ob der Schnipsel VOR oder NACH dem Doctype gesetzt wird?

Vielen Dank und netten Gruß

  1. Hi Sassi, Cookies werden im Header übertragen. Also VOR Doctype!

    1. Vielen Dank, habe ich gemacht.

      Aber dann kommt die Fehlermeldung, mit der ich nicht weiter komme. Man findet recht viel darüber, aber ich werde nicht schlauer aus dem was ich da lese. Kann mir noch mal bitte jemand helfen?

      Danke!

      1. Moin!

        Vielen Dank, habe ich gemacht.

        Aber dann kommt die Fehlermeldung, mit der ich nicht weiter komme. Man findet recht viel darüber, aber ich werde nicht schlauer aus dem was ich da lese. Kann mir noch mal bitte jemand helfen?

        Die Fehlermeldung lautet:
        "Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at...)"

        Übersetzt:
        Warnung: Befehl "session_start": Kann das Session-Cookie nicht senden, weil die HTTP-Header schon gesendet wurden (der Grund liegt in HTML-Output, erzeugt in Skript ... Zeile ...).

        Jeglicher Textoutput, egal ob mit ECHO, oder durch Zeichen außerhalb von <?php ?>, sorgt dafür, dass die HTTP-Header abgeschickt werden, was verhindert, dass Funktionen wie header(), setcookie() oder eben session_start(), die alle HTTP-Header verändern/neu setzen, noch arbeiten können.

        Lösung: Eliminiere den Output an der von der Fehlermeldung genannten Stelle. Wenn dort unabsichtliche Leerzeichen, Leerzeilen, eine UTF-8-BOM, oder HTML-Ausgabe vor dem allerersten PHP-Quelltext stehen, entferne dies bzw. setze es hinter den Funktionsaufruf session_start().

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Vielen Dank für diese ausführliche Antwort! Jetzt habe ich zumindest eine verhältnismäßig vernüftige Ahnung davon, was die Ursache ist.

          Den Fehler habe ich jedoch noch nicht behoben bekommen.

          Am Anfang habe ich

          <?
          ini_set('arg_separator.output','&amp;');
          session_start();
          ?>

          stehen. Wo ist denn dabei der Fehler zu suchen?

          Vielen Dank noch einmal,

          Gruß

          1. n'abend,

            <?
            ini_set('arg_separator.output','&amp;');
            session_start();
            ?>

            stehen. Wo ist denn dabei der Fehler zu suchen?

            vergewissere dich, dass vor dem <? keine Leerzeichen oder Leerzeilen stehen, oder gar irgendwelches HTML ausgegeben wird. Die ersten Zeichen der Datei müssen "<?" sein. (gilt ebenso für inkludierte Dateien, in denen evtl. noch ein Header gesetzt werden soll...)

            Zudem solltest du auf short-open-tags verzichten, also statt <? immer <?php schreiben.

            weiterhin schönen abend...

            --
            Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
            sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
            1. Wiederum vielen Dank für die Hilfen. Ich denke, dass mit diesem Posting auch noch "spätere Genereationen" etwas anfangen können, weil es so gute Erklärungen gibt.

              Schön ist, dass ich keine Fehlermeldungen mehr bekomme. Blöderweise hat die Abstimmungnoch immer den Haken, dass man beliebig oft abstimmen kann.

              Das hier ist der "Cookie-Setzer". Ist das Ding korrekt so?

              <?php
              /**
               * ----------------------------------------------
               * this code is optional
               * Important! You have to include it
               * before your html code
               * ----------------------------------------------
               */
              if (!headers_sent()) {
               $cookie_expire = 96; // hours

              $action = (isset($HTTP_GET_VARS['action'])) ? $HTTP_GET_VARS['action'] : '';
               $action = (isset($HTTP_POST_VARS['action'])) ? $HTTP_POST_VARS['action'] : $action;
               $poll_ident = (isset($HTTP_GET_VARS['poll_ident'])) ? $HTTP_GET_VARS['poll_ident'] : '';
               $poll_ident = (isset($HTTP_POST_VARS['poll_ident'])) ? $HTTP_POST_VARS['poll_ident'] : $poll_ident;

              if ($action=="vote" && (isset($HTTP_POST_VARS['option_id']) || isset($HTTP_GET_VARS['option_id']))) {
                   $cookie_name = "AdvancedPoll".$poll_ident;
                   if (!isset($HTTP_COOKIE_VARS[$cookie_name])) {
                       $endtime = time()+3600*$cookie_expire;
                       setcookie($cookie_name, "1", $endtime);
                   }
               }
              }
              ?>

              Vielen Dank, Gruß

              1. n'abend,

                Ich denke, dass mit diesem Posting auch noch "spätere Genereationen" etwas anfangen können, weil es so gute Erklärungen gibt.

                ich hoffe ich trete dir nicht zu nahe, wenn ich dir sage, dass diese (für "Anfänger") typische Problem schon min. 12463434123 Mal beantwortet wurde. Und weil es in der Natur von nicht-selfforum-einwohnern liegt, sich nicht schön, einfach und zielgerichtet in der Forumssuche herumzutreiben, wird diese Frage auch noch min. weitere 123463454 Mal gestellt werden :)

                Das hier ist der "Cookie-Setzer". Ist das Ding korrekt so?

                wie du einen Cookie setzen kannst, erklärt die das Handbuch recht einleuchtend auf der Seite zu setcookie().

                Die alten $HTTP_Variablen (z.B. $HTTP_GET_VARS) möchte man heute nicht mehr benutzen, das Handbuch schlägt stattdessen die Superglobals (z.b. $_GET) vor.

                Beim Überfliegen deines Codes habe ich keine Fehler ausmachen können. Wenn du sagst, dass man immernoch beliebig oft abstimmen kann:

                (a) prüfst du denn überhaupt bei der Abstimmung, ob der Cookie schon gesetzt ist? => if( isset( $_COOKIE['abstimmung'] ) ) { /* fehlerbehandlung */ }
                (b) hast du mal nachgeschaut, ob bei dir lokal überhaupt ein Cookie gesetzt wurde? Hast du mittels deines Scripts nachgeprüft, ob der Cookie denn auch wieder an den Server geschickt wurde?
                (c) akzeptiert dein Browser überhaupt Cookies?
                (d) bist du dir darüber im Klaren, dass jeder seine Cookies löschen kann und somit ebenfalls beliebig oft abstimmen kann? Vorausgesetzt man akzeptiert deine Cookies überhaupt, sonst ist das nämlich von vornherein fürn Ar**h.

                weiterhin schönen abend...

                --
                Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
                sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|