Ankündigung

Einklappen
Keine Ankündigung bisher.

Session-Daten werden nicht gespeichert

Einklappen

Neue Werbung 2019

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

  • Session-Daten werden nicht gespeichert

    Hi,
    also ich hab "eigentlich" schon ein bissl mehr Ahnung, aber ich schreib es erstmal in dieses Forum, da es denk ich mal ein Anfänger Fehler ist.


    Also, mein Problem ist, das wenn ich mich einlogge er manchmal die Sachen in die Session speichert und manchmal nicht. Es liegt wahrscheinlich an der Zeit bis die nächste Aktivität kommt, aber ist auch nur eine Vermutung.

    Hier mal der wahrscheinlich interessante Code:

    Für die Ausgabe der Seite, das ganze läuft über Templates:
    PHP-Code:
    <?php
    function doOutput($template) {
      global 
    $ses;
        
    $ses->saveSession();
        
        ...
          
        
    ob_start();
           
          echo 
    $template;
            
        
    ob_end_flush(); 
        exit;



    Für den Zugriff auf die Sessions
    PHP-Code:
    <?php
    class session {
      var 
    $content = array();

      function 
    session() {
        
    $this->content = array();
        
    $this->content $_SESSION['__session'];
        }
      
      function 
    saveSession() {
        
    $_SESSION['__session'] = array();
        
    $_SESSION['__session'] = $this->content;
        
        
    session_write_close();
        
    session_start();
        }    
        

      function 
    writeSession($key$val) {
        
    $this->content[$key] = $val;
        }
        
      function 
    readSession($key) {
        return 
    $this->content[$key];
        }
        
        
      function 
    unsetSession($key) {
        
    $this->content[$key] = NULL;
        unset(
    $this->content[$key]);
        }
        
      ...
      
      }

    $ses = new session();
    ?>
    /(bb|[^b]{2})/


  • #2
    Ich seh kein session_start()...

    Falls dich meine session-Klasse interessiert, die funktioniert (denke aber willst deine eigene behalten). Dafür ist das aber für mich zu wenig Info die du lieferst. Wann tritt der Fehler auf, was liefert $_SESSION nach dem Speichern durch deine Klasse und was direkt nach session_start()?

    class.Session.php (ich hoff das is die aktuelle)
    http://nopaste.php-q.net/170683

    Als Anmerkung: global ist nicht so schön, im Zusammenhang mit einer Session- oder Datenbank-Klasse könnte das Schlagwort singleton für dich interessant sein. Das erzeugt nur eine einzige Instanz einer Klasse. Für mich sauberer und ein nächster Schritt hin zum perfekten Programmieren

    Kommentar


    • #3
      Ja, das session_start ist auch noch am Anfang der Datei, hatte ich vergessen, aber ich guck mir mal deine Klasse an, vielleicht find ich dann ja auch den Fehler bei mir.


      Der Fehler tritt dann "manchmal" auf wenn man auf die nächste Seite nach dem Login weitergeleitet wird. Ich hab das eben nochmal getestet auf der Loginseite zeigt er die Daten in der Session richtig an, auf der nächste Seite ist die Session leer :-/

      Das mit dem singleton werd ich später mal machen, oder könnte es damit zusammenhängen? Die Klasse wird soweit ich sehe eh nur einmal instanziert.
      /(bb|[^b]{2})/

      Kommentar


      • #4
        Hm das Problem hatte ich auch mal. Woran lag das nochmal *grübel* Mischt du session_register() und $_SESSION Aufrufe/Abfragen? Oder hast du Cookies mal abgelehnt für localhost?

        Notfalls musst du eben extrem debuggen. Ich habe es glaub ich gelöst, in dem ich a.php und b.php erstellt habe. a.php hat ausschließlich geschrieben

        PHP-Code:
        <?php
        // a.php
        include 'class.Session.php';
        $session = new Session();
        // $session->start() falls nicth schon im Konstruktor
        $session->set('alpha','beta');
        print_r($_SESSION);
        print_r($session);
        ?>
        [url="b.php"]lesen[/url]
        PHP-Code:
        <?php
        // b.php
        include 'class.Session.php';
        $session = new Session();
        print 
        $session->get('alpha');
        print_r($_SESSION);
        print_r($session);
        ?>
        [url="a.php"]schreiben[/url]
        Wenns so mit deiner Klasse nicht geht, obwohl print_r($_SESSION) das richtige liefert (in a.php), liegts wohl eher nicht an deiner Klasse, sondern an komischen PHP-Einstellungen zu Sessions, Problemen mit der Sessionspeicherung im Session-Pfad oder Browser-Einstellungen.


        Edit: Irgendwie finde ich gerade, ist meine $_SESSION-Klasse eigentlich recht sinnlos geworden. Verkompliziert eigentlich nur alles, denn so komplex sind Sessions nicht. Der Vorteil früher lag darin, dass wir mit älteren PHP-Versionen, die nur mit session_register() funktionierten gearbeitet hatten. Das hat sich mittlerweile aber auch erledigt, deshalb ist der Teil rausgeflogen und nun ist die Klasse eigentlich sinnlos finde ich. Hm.

        An singleton kanns nur liegen, wenn du versehentlich mehrere Session-Instanzen anlegst. Versehentlich geht das aber eigentlich auch nicht.

        Kommentar


        • #5
          Das Problem tritt ja nicht nur lokal auf, sondern auch im Internet und session_register u.ä. habe ich nicht verwendet, nur $_SESSION zum lesen und schreiben in eine Session.

          Könnte es sonst mit register_globals zu tun haben? Bei mir ist es deaktiviert.
          /(bb|[^b]{2})/

          Kommentar


          • #6
            Simulier halt die gleichen PHP Einstellungen.
            Von welchen PHP-Versionen lokal und online reden wir?
            Kannst du eventuell phpinfo()s der relevanten Bereiche mal zeigen?

            Kommentar


            • #7
              LOKAL: PHP Version 5.0.4

              Directive Local Value Master Value
              session.auto_start Off Off
              session.bug_compat_42 Off Off
              session.bug_compat_warn On On
              session.cache_expire 180 180
              session.cache_limiter nocache nocache
              session.cookie_domain no value no value
              session.cookie_lifetime 0 0
              session.cookie_path / /
              session.cookie_secure Off Off
              session.entropy_file no value no value
              session.entropy_length 0 0
              session.gc_divisor 100 100
              session.gc_maxlifetime 1440 1440
              session.gc_probability 1 1
              session.hash_bits_per_character 4 4
              session.hash_function 0 0
              session.name PHPSESSID PHPSESSID
              session.referer_check no value no value
              session.save_handler files files
              session.save_path .;D:\Server\xampp\tmp .;D:\Server\xampp\tmp
              session.serialize_handler php php
              session.use_cookies On On
              session.use_only_cookies Off Off
              session.use_trans_sid 0 0




              Online: PHP Version 4.4.1

              Directive Local Value Master Value
              session.auto_start Off Off
              session.bug_compat_42 On On
              session.bug_compat_warn On On
              session.cache_expire 180 180
              session.cache_limiter nocache nocache
              session.cookie_domain no value no value
              session.cookie_lifetime 0 0
              session.cookie_path / /
              session.cookie_secure Off Off
              session.entropy_file no value no value
              session.entropy_length 0 0
              session.gc_divisor 100 100
              session.gc_maxlifetime 1440 1440
              session.gc_probability 1 1
              session.name PHPSESSID PHPSESSID
              session.referer_check no value no value
              session.save_handler files files
              session.save_path /tmp /tmp
              session.serialize_handler php php
              session.use_cookies On On
              session.use_only_cookies Off Off
              session.use_trans_sid On On




              EDIT:
              Könnte es evtl. vorkommen das er eine MySQL Abfrage nicht rechtzeitig durchführt und die Abfrage nach dem Sessionaufruf durchgeführt wird.
              Also: Wenn ich mich einlogge generiert er eine uin und speichert sie in der Benutzertabelle mit der sich der Benutzer identifiert. Wenn ich dann eine Seite aufrufe guckt er in der Benutzertabelle nach ob es einen Benutzer mit der uin gibt, falls nicht löscht er die Session.
              /(bb|[^b]{2})/

              Kommentar


              • #8
                Ich tippe auf das hier:
                (Online)
                session.save_path .;D:\Server\xampp\tmp .;D:\Server\xampp\tmp

                Läuft das "online" auf einer Windows-Maschine mit XAMPP oder hast du gerade versehentlich das gleiche (für offline und online) gepostet? Ansonsten hättest du gleich sagen können, dass alle Settings gleich sind, dann hätt ich nich alles vergleichen müssen

                Kommentar


                • #9
                  Oh stimmt, hab das falsche gepostet. Ich hab das eben behoben.
                  /(bb|[^b]{2})/

                  Kommentar


                  • #10
                    Hmm offenbar nur der Pfad.
                    Ruf doch mal eine Seite auf, die in die Session schreibt und schau dann auf dem Server ins /tmp-Verzeichnis. Ob da überhaupt nen Session-File liegt.

                    Kommentar


                    • #11
                      Ich glaub ich bin den Problem gerade näher gekommen. Mit den Sessions hat es scheinbar doch nix zu tun... weil...

                      Vor dem überprüfen der uin auf der Seite nach dem Login sind noch Daten in der Session, nach dem durchlauf des Logins sind sie weg. Ich guck da erstmal nach, ich melde mich dann nochmal falls ich die Lösung hab oder nicht weiter komm.

                      Vielen Dank auf jeden Fall
                      /(bb|[^b]{2})/

                      Kommentar


                      • #12
                        LOL np

                        Kommentar


                        • #13
                          Also, ich hab eben nochmal rumprobiert... und es ist definitiv doch ein Sesssionproblem. Aus irgendwelchen kommt er manchmal mit dem füllen der Session nicht hinterher, so wie es aussieht.
                          /(bb|[^b]{2})/

                          Kommentar


                          • #14
                            Ich glaube/hoffe, dass das Problem jetzt behoben ist. Wie vermutet war es wohl wirklich ein Anfängerfehler und zwar:

                            Hatte ich in der Login-Klasse einen If-Abfrage

                            PHP-Code:
                            <?php
                            if ($userid!=&& $uin!=0)
                            ?>
                            Da allerdings $userid und $uin beides die Werte einer Session sind, handelt es sich hierbei um Strings und die Abfrage muste so lauten:

                            PHP-Code:
                            <?php
                            if ($userid!='0' && $uin!='0')
                            ?>
                            Was ich allerdings für merkwürdige finde das es mal funktioniert und mal nit :-/
                            /(bb|[^b]{2})/

                            Kommentar


                            • #15
                              Hm das dürfte eigentlich nicht das Problem gewesen sein...
                              Ich kanns grad nicht testen, aber ich bin mir sicher, dass

                              PHP-Code:
                              <?php
                              '0' == 0
                              ?>
                              ein TRUE ergibt und somit deine beiden Abfragen oben auch identisch wären (sprich daran kanns nicht gelegen haben).

                              Kommentar

                              Lädt...
                              X