Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit session_start - headers already sent

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem mit session_start - headers already sent

    Hallo,

    ich weiss, dass session_start(); ausgeführt werden muss, bevor irgendein anderer Code ausgeführt wird. Habe nun jedoch, in Anlehnung an ein Script aus einem Buch ein Grundsystem gebaut und verstehe die Fehlermeldung in diesem Zusammenhang nicht.

    Hier sind meine bisherigen Daten:

    index.php


    PHP-Code:
    <?php
    # Einbinden der Konfigurationsdatei
    require_once 'common.php';
    # Aufbau der Seite
    System\HTML::printHead();
    System\HTML::printBody();
    System\HTML::printFooter();
    ?>
    common.php
    PHP-Code:
    <?php
    # Pfade (Web und lokal)
    include(__DIR__.'/paths.php');

    # Datenbank- und weitere Systemeinstellungen
    require_once PROJECT_DOCUMENT_ROOT.'/settings.php'

    # Alle Basis Klassen einbinden 
    require_once PROJECT_DOCUMENT_ROOT."/inc/includeAllClasses.php";

    # Datenbanbobjekt erstellen, falls nicht bereits erstellt
     
    if (!isset($GLOBALS['DB'])) {
     
    $DB = new System\Database\MySQL(DB_SERVER,DB_USER,DB_PASSWORD,DB_NAME,DB_PORT);
     }

    # Global verfügbares Session Objekt
    new System\SessionHandler();

    ?>
    settings.php

    PHP-Code:
    <?php   
    # Verbindungsdaten für Datenbank
    define('DB_SERVER',"localhost");
    define('DB_PORT',"3306");
    define('DB_NAME',"database");
    define('DB_USER',"user");
    define('DB_PASSWORD',"password");

    # HTML Seiten Titel
    define('HTML_TITLE'"Testseite");

    # Setzen der Zeitzone
    date_default_timezone_set('Europe/Berlin'); 
    ?>
    includeAllClasses:

    PHP-Code:
    <?php
    # Sitzungsklasse
    require_once PROJECT_DOCUMENT_ROOT."/inc/classes/class.SESSION.php";
    # Datenbankklasse
    require_once PROJECT_DOCUMENT_ROOT."/inc/classes/class.MySQL.php";
    # HTML-Klasse
    require_once PROJECT_DOCUMENT_ROOT."/inc/classes/class.HTML.php";
    # LOGIN-Klasse
    require_once PROJECT_DOCUMENT_ROOT."/inc/classes/class.LOGIN.php";
    ?>
    Und zuletzt die Session Klasse class.SESSION.php:
    PHP-Code:

    <?php
    # Namespace festlegen
    namespace System;

    class 
    SessionHandler {

        private 
    $DB null;

        public function 
    __construct()
        {   
            
    $this->DB $GLOBALS['DB'];

            
    # Den SessionHandler auf die Methoden dieser Klasse setzen
            
    session_set_save_handler(array ($this'_open'), 
                                     array (
    $this'_close'),
                                     array (
    $this'_read'),
                                     array (
    $this'_write'), 
                                     array (
    $this'_destroy'), 
                                     array (
    $this'_gc'));

            
    # Session starten 
            
    session_start();
            
    # session_write_close();
            
    register_shutdown_function('session_write_close');
        }

      
    # Öffnen der Session
         
    public function _open($path$name) {    
            
        return 
    true;
        }
    ...
    Die genaue Fehlermeldung lautet:

    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at D:\web\test\settings.php:20) in D:\web\test\inc\classes\class.SESSION.php on line 22

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\web\test\settings.php:20) in D:\web\test\inc\classes\class.SESSION.php on line 22
    Wenn ich die DEFINE Befehle ausklammere, funktioniert es zwar, jedoch bekomme ich dann keine Verbindung mehr zur mysql Datenbank. Weiss jemand einen Rat für dieses Problem?


  • #2
    Guten Morgen!
    Vielleicht hilft dir das hier weiter.
    Schau dir das mal an vielleicht findest du deinen Fehler.
    Tipp session_start();

    Kommentar


    • #3
      bei class.session.php ist ein zeilenumbruch vor dem <?php
      kann sein dass das nur ein kopier fehler ist, aber falls nicht mach den mal weg ^^
      Signatur:
      PHP-Code:
      $s '0048656c6c6f20576f726c64';
      while(
      $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

      Kommentar


      • #4
        Danke für die Antworten. Der Zeilenumbruch in class.SESSION.php ist nur ein Kopierfehler.

        Der Link zum PHP Manual hat mir leider nicht weitergeholfen.

        Kommentar


        • #5
          Versuch mal in class.SESSION.php das session_start() ganz nach oben zu verschieben.
          PHP-Code:
          <?php 
           
          # Session starten  
                  
          session_start(); 

          # Namespace festlegen 
          namespace System

          class 
          SessionHandler 

              private 
          $DB null

              public function 
          __construct() 
              {    
                  
          $this->DB $GLOBALS['DB']; 

                  
          # Den SessionHandler auf die Methoden dieser Klasse setzen 
                  
          session_set_save_handler(array ($this'_open'),  
                                           array (
          $this'_close'), 
                                           array (
          $this'_read'), 
                                           array (
          $this'_write'),  
                                           array (
          $this'_destroy'),  
                                           array (
          $this'_gc')); 

                 
                  
          # session_write_close(); 
                  
          register_shutdown_function('session_write_close'); 
              } 

            
          # Öffnen der Session 
               
          public function _open($path$name) {     
                   
              return 
          true
              } 
          ...

          Kommentar


          • #6
            Ok nochmal ne Idee:
            Guck ob vor den ganzen <?php keine Leerzeichen, Zeilenumbrüche, usw sind...
            PHP-Code:
            # Global verfügbares Session Objekt
            new SystemSessionHandler(); 
            Muss da nicht eigentlich ein \ zwischen System und SessionHandler ?
            Signatur:
            PHP-Code:
            $s '0048656c6c6f20576f726c64';
            while(
            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

            Kommentar


            • #7
              Also session_start() ganz nach oben zu verschieben ist nicht möglich. 1. muss der Namespace als erstes vergeben werden und zweitens wäre das dann nicht mehr Teil der Funktion bzw. der Klasse.

              Aus irgendeinem Grund wurden die \ hier entfernt, in meinem Code sind diese jedoch vorhanden, also System\SessionHandler.

              Kommentar


              • #8
                Formatiere dein Dokument mal als UTF without Bom!

                Hatte das problem auch mal. der Bom ist noch ein Steuerzeichen, welches am Anfang ist aber im Editor nicht sichtbar.
                PS: Notepad++ kann den Dateitypen ändern.
                Look at This!
                Digital-Duty.DE
                Für Syntax-Fehler übernehme ich keine Haftung!

                Kommentar


                • #9
                  Fehlermeldungen bitte nicht in [quote]-Tags posten, das erschwert das Zitieren!

                  Code:
                  Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by
                  (output started at D:\web\test\settings.php:20)
                  in D:\web\test\inc\classes\class.SESSION.php on line 22
                  Die settings.php, die du uns gezeigt hast, hat gar keine 20 Zeilen - also entweder belügst du uns, oder du findest dich in deinen Scripten selber nicht zurecht ...

                  Jedenfalls solltest du mit der expliziten Angabe der Zeilennummer jetzt wohl wissen, wo du zu suchen hast.

                  Und btw., dass Leerzeichen/-zeilen am Ende von include-Dateien diesen Fehler auslösen kann man leicht verhindern, in dem man das schliessende ?> einfach weglässt. (Was bspw. von den Coding-Guidelines diverser Frameworks sogar explizit gefordert wird.)

                  Kommentar


                  • #10
                    Ich habe mit Notepad ++ nun alle betroffenen Dateien in UTF-8 without Bom konvertiert, leider hat dies nicht geholfen.

                    Die ?> Tags habe ich in den Dateien, die ich per require einbinde entfernt, leider auch ohne Lösung des Problems.

                    Bei der settings.php hatte ich noch ein paar Zeilen für Kommentare und Error Handling, habe ich aber rausgelöscht, auch um hier den Code zu kürzen...aber daran liegt es leider auch nicht. Ich suche nun seit 2 Tagen nach dem Problem und es fällt mir einfach nicht auf....

                    Welche Ausgabe wird denn vor Ausführen der Funktion vorgenommen?
                    In dieser Datei erfolgt ja keine Ausgabe, auch nicht in den dort eingebundenen Dateien:
                    require_once 'common.php';

                    Und hier wird doch direkt die Funktion aufgerufen:
                    # Global verfügbares Session Objekt
                    new SystemSessionHandler();

                    Ich verstehe das nicht ...vielleicht hat noch jemand eine Idee?

                    Kommentar


                    • #11
                      also ich starte meine session immer von der index.php aus. die session ist ja dann in allen klassen trotzdem vorhanden. mach das mal auch in deiner index.php
                      apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                      Kommentar


                      • #12
                        Zitat von ChrisB
                        Die settings.php, die du uns gezeigt hast, hat gar keine 20 Zeilen - also entweder belügst du uns, oder du findest dich in deinen Scripten selber nicht zurecht ...
                        Die Fehlermeldung bezieht sich auf die class.SESSION.php in Zeile 22!
                        Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by
                        (output started at D:\web\test\settings.php:20)
                        in D:\web\test\inc\classes\class.SESSION.php on line 22
                        Und da hat er in seinem Original-Script das session_start() stehen.
                        Er lügt also nicht...

                        Ich mach es i.d.R. wie BlackScorp...
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by
                          (output started at D:\web\test\settings.php:20)
                          in D:\web\test\inc\classes\class.SESSION.php on line 22
                          In der class.SESSION.php, Zeile 22 wird versucht, den header zu senden (dort steht das session_start()), aber die Ursache des Fehlers ist in der settings.php - und die hat im Post keine 20 Zeilen.

                          Durch Umstellung kann man das natürlich umgehen (sprich: wird session_start VOR dem include der settings.php aufgerufen, ist warscheinlich alles gut). Ändert aber nichts an der Tatsache, das settings.php eine Ausgabe startet, die wir nicht zu sehen bekommen.
                          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                          Kommentar


                          • #14
                            Jawoll... Hab ich überlesen! Sorry...
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Habs hinbekommen. woran es genau lag kann ich gerad nichtmal sagen, die Fehlermeldung hatte sich inzwischen verändert und es gab Probleme mit der HTML Klasse, diese hab ich dann direkt in die index.php eingebunden, ohne Umwege über die includeAllClasses.php...dann gab es keine Probleme mehr...ich markiere den Thread als erledigt.

                              Danke für die Antworten!

                              Kommentar

                              Lädt...
                              X