Announcement

Collapse
No announcement yet.

Probleme mit session_start()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit session_start()

    Moin,

    Hab das mal bei "PHP für Anfänger" gepostet, weil es wahrscheinlich nur ein Flüchtigkeitsfehler ist...

    Ich hab ne kleine Klasse Session.
    In dieser Session werden alle Einstellungen (Variablen setzen und registrieren) erledigt.

    Probehalber habe ich mir alles mal ausgeben lassen (Session-ID, registrierte Variablen, etc.). Klappt einwandfrei.

    Nun verzweige ich auf ein anderes Dokument (*.php), wobei ich die SessionID im GET übergebe (...*.php?s=<die-session-id>).

    Nun kenne ich das so, daß ich mit
    PHP Code:
    session_start($_GET["s"]); 
    diese Session weiterführen kann!

    Rufe ich nun die index.php aus dem root-Verzeichnis der Domain erneut auf, wird keine neue session gestartet, sondern auch die alte behalten!
    Da ich mit einer DB arbeite, in der permanent Daten zu einer gespeicherten Session abgefragt werden müssen, ist das ärgerlich!
    Denn die Sessions lege ich mit den SessionIDs in der DB ab.

    Kann es damit zu tun haben, daß die Session über Cookies gehandelt werden? Wenn ja, wie schalte ich das ab?

    Weiß einer, wo mein Gedankenfehler liegt?

    PS: Auf dem Server läuft PHP 5.1.0!
    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    http://de2.php.net/function.session-destroy
    Christian

    Comment


    • #3
      Danke Christian.

      Die Variante setcookie() zum löschen hatte ich nicht verwendet.
      Bringt jedoch auch nichts.

      Beim Neuaufruf kennt er immer noch die alte ID, sprich: Session existiert immer noch!
      Habe es 1:1 aus dem Beispiel übernommen:
      PHP Code:
      if(isset($_COOKIE[session_name()])) setcookie(session_name(),"",time()-4200);
      session_destroy(); 
      PHP rocks!
      Eine Initiative der PHP Community

      Comment


      • #4
        Auch mal den Browser komplett geschlossen?
        Christian

        Comment


        • #5
          Damit funktionierts natürlich!
          Es muß ja aber auch klappen, wenn jemand einmal auf der Seite drauf war, dann ne Zeit lang einige andere Seiten durchstöbert und später die URL erneut eingibt. Bringt ja nix, wenn dann alle Session-Daten noch da sind. Kann ja auch jemand anders sein, der denselben Rechner verwendet. Wenn Browser nicht geschlossen wurde, darf die zweite Person, die die URL eingibt ja trotzdem nicht auf die alten Daten zugreifen dürfen...
          PHP rocks!
          Eine Initiative der PHP Community

          Comment


          • #6
            Bringt ja nix, wenn dann alle Session-Daten noch da sind.
            Üblicherweise sind diese dann noch da. Auch ein u.U. gewollter Effekt. Ggf. die Sessiondaten überschreiben. Oder alles in einem eigenen Fenster laufen lassen und das dann schließen

            Auch kann man

            session.gc_maxlifetime

            setzen für die Länge wie lange eine Session lebt
            Christian

            Comment


            • #7
              Hmmm... Ärgerlich. Paßt mir gar nicht, läßt sich aber wohl nicht ändern.
              Vielen Dank für Deine Hilfe!
              PHP rocks!
              Eine Initiative der PHP Community

              Comment


              • #8
                Ich muß das wohl erstmal so hinnehmen

                falls jemand noch ne Idee hat, hier die Klasse:
                PHP Code:
                class Session {

                    
                #
                    # PROTECTED VALUES
                    # ----------------------------------------------------------------------------
                    
                protected $ID;
                    protected 
                $Name;
                    protected 
                $Start;
                    protected 
                $LifeTime;
                    protected 
                $End;
                    
                    
                #
                    # PUBLIC FUNCTIONS
                    # ----------------------------------------------------------------------------
                    
                    # Constructor (compatibility for PHP4)
                    
                public function Session() { $this->__construct(); }
                    
                    
                # Constructor PHP5
                    
                public function __construct() {
                        
                $this->SetID();
                        
                $this->SetLifeTime(_SESSION_LIFETIME_);
                        
                $this->SetStart();
                        
                $this->SetName("GAST");
                        
                $this->Init();
                    }
                    
                    public function 
                GetID() { return $this->ID; }
                    public function 
                GetName() { return $this->Name; }
                    public function 
                GetStart() { return $this->Start; }
                    public function 
                GetLifeTime() { return $this->LifeTime; }
                    public function 
                GetEnd() { return $this->End; }
                    public function 
                RegisterUser($userID) {
                        
                $this->SetName($userID);
                        if(isset(
                $_SESSION["Name"])) $_SESSION["Name"] = $this->Name;
                    }

                    
                #
                    # PROTECTED FUNCTIONS
                    # ----------------------------------------------------------------------------
                    
                protected function SetID() { $this->ID md5(mktime()); }
                    protected function 
                SetName($sessionname) { $this->Name $sessionname; }
                    protected function 
                SetStart() { $this->Start mktime(); $this->SetEnd(); }
                    protected function 
                SetLifeTime($min) { $this->LifeTime 60*$min; }
                    protected function 
                SetEnd() { $this->End $this->Start+$this->LifeTime; }
                    
                    
                # initialize session
                    
                protected function Init() { 
                        if(isset(
                $_COOKIE["PHPSESSID"]))
                            
                setcookie($_COOKIE["PHPSESSID"],"",time()-4200);
                        
                session_destroy($_COOKIE["PHPSESSID"]);
                        
                session_start();
                        
                session_id($this->ID);

                        if(!isset(
                $_SESSION["Name"])) $_SESSION["Name"] = $this->Name;
                        if(!isset(
                $_SESSION["Start"])) $_SESSION["Start"] = $this->Start;
                        if(!isset(
                $_SESSION["Lifetime"])) $_SESSION["LifeTime"] = $this->LifeTime;
                        if(!isset(
                $_SESSION["End"])) $_SESSION["End"] = $this->End;
                    }
                    
                }

                $Session = new Session();
                header("location: ./processing.php?s=".$Session->GetID()); 
                In der processing.php sind zwar nach einem session_start() alle Daten vorhanden, aber sobald ich erneut von "/" aufrufe, möchte ich, daß eine neue Session gestarten wird.
                Weil eigentlich sollte ja auch ein neues Objekt von Session erstellt werden.
                Dann müßte doch eigentlich auch eine neue Session erstellt werden?

                Naja, wer Lust hat, kann ja mal schauen...
                Danke

                ps: und bitte keine antworten á la "wozu das ganze"...
                das ganze projekt zu erklären würde hier den rahmen sprengen.
                es hat seinen sinn, daß ich das auf diese weise lösen möchte...
                PHP rocks!
                Eine Initiative der PHP Community

                Comment


                • #9
                  Originally posted by Arne Drews View Post
                  Danke Christian.

                  Die Variante setcookie() zum löschen hatte ich nicht verwendet.
                  Bringt jedoch auch nichts.

                  Beim Neuaufruf kennt er immer noch die alte ID, sprich: Session existiert immer noch!
                  Habe es 1:1 aus dem Beispiel übernommen:
                  PHP Code:
                  if(isset($_COOKIE[session_name()])) setcookie(session_name(),"",time()-4200);
                  session_destroy(); 
                  Das Cookie heißt 'PHPSESSID'.
                  sprich das mal direkt an und versuch es zu löschen, sollte eigenlich gehen ...

                  gruß
                  „Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.“
                  (Lucius Annaeus Seneca)

                  Comment


                  • #10
                    Hallo,

                    Danke für die Antwort, habe gerade meine Klasse gepostet.
                    Darin habe ich das auch schon nach Deiner Variante versucht:
                    PHP Code:
                    ...

                    if(isset(
                    $_COOKIE["PHPSESSID"]))
                      
                    setcookie($_COOKIE["PHPSESSID"],"",time()-4200);
                    ... 
                    Derselbe (Miß)erfolg...
                    PHP rocks!
                    Eine Initiative der PHP Community

                    Comment


                    • #11
                      Originally posted by Arne Drews View Post
                      Hallo,

                      Danke für die Antwort, habe gerade meine Klasse gepostet.
                      Darin habe ich das auch schon nach Deiner Variante versucht:
                      PHP Code:
                      ...

                      if(isset(
                      $_COOKIE["PHPSESSID"]))
                        
                      setcookie($_COOKIE["PHPSESSID"],"",time()-4200);
                      ... 
                      Derselbe (Miß)erfolg...
                      Ähm .. also eigenlich sollte das funktionieren ..
                      zumindest sollte das cookie weg sein ..
                      halst du mal einem sochen aufruf im browser geschaut ob das cookie noch da ist .. und mir was für werten ??
                      „Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.“
                      (Lucius Annaeus Seneca)

                      Comment


                      • #12
                        Also nachgeschaut in dem Sinne, daß ich mir alle Daten der Session anzeigen lasse, ja!

                        Was ich nicht verstehe:
                        Erster Aufruf erstellt neues Objekt von Session und legt auch alle Daten darin ab! Lasse ich mir in der process.php testweise ausgeben.
                        Jeder weitere Aufruf bewirkt zwar, daß eine neue session_id() generiert wird, aber die Daten der alten Session bleiben alle erhalten!
                        Die Get-Variable hat auch die neue Session-ID übergeben, dennoch werden alle Daten der alten session verwendet, inkl. der ID!?
                        PHP rocks!
                        Eine Initiative der PHP Community

                        Comment


                        • #13
                          Originally posted by Arne Drews View Post
                          Also nachgeschaut in dem Sinne, daß ich mir alle Daten der Session anzeigen lasse, ja!
                          nein, ich meinte im browser - dir die aktuellen cookies auflisten lassen -
                          dein problem ist schon sehr komisch ...
                          „Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.“
                          (Lucius Annaeus Seneca)

                          Comment


                          • #14
                            BTW:

                            das hier kann so oder so nicht funktionieren:
                            PHP Code:
                             protected function Init() { 
                                    if(isset(
                            $_COOKIE["PHPSESSID"]))
                                        
                            setcookie($_COOKIE["PHPSESSID"],"",time()-4200);
                                    
                            session_destroy($_COOKIE["PHPSESSID"]);
                                    
                            session_start();
                                    
                            session_id($this->ID); 
                            du "zerstörst" zwar das cookie - allerdings ist der wert bereits an den server übertragen -> er steht in der $_COOKIE: folglich musst du den wert im $_COOKIE - Array entfernen
                            cookies werden beim aufruf einer seite an den server übertragen und stehen danach im $_COOKIE - Array, das löschen an dieser stelle bringt dir nichts.

                            und dann bitte nicht:
                            PHP Code:
                             setcookie($_COOKIE["PHPSESSID"],"",time()-4200); 
                            sondern:
                            PHP Code:
                             setcookie("PHPSESSID","",time()-4200); 
                            du dichst ansonsten nach nem cookie mit dem namen der SessionID.

                            also ich würde das cookie direkt nach dem erzeigen der session löschen:
                            dann solltest du keine probleme haben:


                            PHP Code:
                            session_start();
                            setcookie("PHPSESSID","",time()-4200); 
                            gruß
                            „Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.“
                            (Lucius Annaeus Seneca)

                            Comment


                            • #15
                              Also ich hab's jetzt direkt nach dem session_start() gemacht:
                              PHP Code:
                              session_start();
                              setcookie("PHPSESSID","",time()-4200); 
                              Immer noch vorhanden (im Browser nachgeschaut).

                              Selbst, wenn ich in der processing.php das cookie lösche ist es lt. Browser immer noch da?

                              Was mir nun noch aufgefallen ist, daß das Cookie PHPSESSID einen komplett anderen Wert hat, wie die von mir übermittelte SessionID.

                              Beispiel:
                              PHP Code:
                              # Datei: session.php
                              session_start();
                              session_id(md5(mktime()));

                              header("location: ./processing.php?s=".session_id());


                              # Datei: processing.php
                              session_start($_GET["s"]);
                              print 
                              session_id();  // ist gleich $_COOKIE["PHPSESSID"]
                              // Ausgabe ist ungleich $_GET["s"]. Warum? 
                              Müßte ich nicht eigentlich mit dem Aufruf session_start($_GET["s"]); die Session weiterführen können, die die ID von s aus GET hat???
                              Dann sollte diese doch aber auch die passende session_id() haben, oder?

                              Naja, und das ursprüngliche Problem bleibt:
                              Egal, wo ich das Cookie versuche zu löschen, es ist lt. Browser immer noch da!

                              Bin grad wirklich'n bischen verwirrt...
                              PHP rocks!
                              Eine Initiative der PHP Community

                              Comment

                              Working...
                              X