Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Loginklasse

Einklappen

Neue Werbung 2019

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

  • Problem mit Loginklasse

    Hallöchen, ich hab lange rumprobiert und auch schon einige Haare ausgerissen, aber ich glaub ich bin einfach zu "doof" dazu :S

    Ich hab mir eine login klasse geschrieben, die mir einerseits die userdaten überprüft und anderseits jedesmal prüft, ob der User eingeloggt ist.

    Irgendwie komm ich aber nicht wirklich dahinter, wieso ich NIE den status true bekomme... kann es sein das ich es übertieben habe mit den abfragen?

    bin noch ein ziemlicher anfänger was oo angeht und ehm ja...

    hier mal meine klasse:

    PHP-Code:
    <?php

    /**
     * @author Marco Schär
     * @copyright 2008
     * @version 0.2
     * @title login_handler v0.2  
     */
     
     
    class login_handler {
        
        private 
    $db;
        private 
    $username$password;
        private 
    $login NULL;
        
        private 
    $debug 0;
        
        
        public function 
    __construct(db_handler $db) {
            
    $this->login 0;
            
    $this->db $db;
        }
        
        public function 
    check_userdata($username$password) {
            
            
    /*
            SQL-Abfrage der Userdaten. 
            */
            
    $this->db->db_query('
                SELECT
                    password
                FROM
                    user
                WHERE
                    username = "' 
    $this->db->escape($username) . '"
                LIMIT 1        
            '
    );
            
            
    /*
            holen der userdaten als fetch_object. zugriff durch $db->result('rückgabetyp')
            */
            
    $userdata $this->db->result('fetch');
            
            
    /*
            Setze das password aus der db in $this->password
            */
            
    $this->password $userdata->password;        
            
            
    /*
            Setze den Usernamen aus dem Formular in $this->username und escape ihn mit der escape methode aus dem db-handler
            */
            
    $this->username $this->db->escape($username);
            
            
    /*
            Prüfe, ob $this->password gleich ist wie das passwort das aus dem formular kommt
            */
            
    if($this->password == md5($password)) {
                
    //debugfunktion, wird nur angezeigt wenn debugged wird!
                
    if($this->debug == 1) echo "Passwort ist korrekt! liefere nun true zurück...";
                
                
    $this->login 1;
                
    $this->set_session_data();
                
    $this->is_loggedin();
                return 
    true;
            
            } else {
                
    //debugmode
                
    if($this->debug == 1) echo "Passwort ist falsch! liefere nun false zurück...";
                
                
    $this->login 0;
                return 
    false;            
            }    
        }
        
        
        public function 
    set_session_data() {
            
            if(
    $this->login == 1) {
                
    $_SESSION['login'] = 1;
                
    $_SESSION['username'] = $this->username;
                
    $_SESSION['password'] = $this->password;
                
    $_SESSION['date'] = date("c");    
                
    $_SESSION['session_id'] = session_id();    
            
                
    //debugmode
                
    if($this->debug == 1) {
                     echo 
    "login ist 1, sessiondaten wurden geschrieben";
                     echo 
    $_SESSION['login'];
                     echo 
    $_SESSION['username'];
                     echo 
    $_SESSION['password'];
                     echo 
    $_SESSION['date'];
                     echo 
    $_SESSION['session_id'];
                }
                
                
    /*
                Setze die Session ID in die usertabelle
                */
                
    $sessid session_id();
                
                
    /*
                Update die Usertabelle mit der aktuellen session id 
                */
                
    $this->db->db_query('
                    UPDATE
                        user
                    SET
                        session_id = "{$sessid}"
                    WHERE
                        username = "{$this->db->escape($this->username)}"
                    LIMIT 1;
                '
    );
                
                return 
    true;
            
            } else {
                
    //debugmode
                
    if($this->debug == 1) echo "login ist nicht auf 1 gesetzt, daher werden keine session daten geschrieben und bisherige sessioninhalte gelöscht!";
                
                
    session_destroy();
                            
                return 
    false;
            }
                    
        }
        
        
        public function 
    is_loggedin() {
            
            if(
    $this->debug == 1) echo "bin in der funktion...";
            
            
            if(isset(
    $_SESSION['login'])) {
                
                if(
    $this->debug == 1) echo "komm ich bis hierhinsf?";
                
                
    $this->db->db_query('
                    SELECT
                        password, username, session_id
                    FROM
                        user
                    WHERE
                        username = "' 
    $_SESSION['username'] . '"
                    LIMIT 1;
                '
    );
                
                
    $userdata $this->db->result('fetch');
                
                
                if(
    $this->debug == 1) echo "komm ich bis hierhin?";
                
                
                        
                if(
    $userdata->session_id == $_SESSION['session_id'] && $userdata->password == $_SESSION['password'] && $userdata->username == $_SESSION['username']) {
                    
                    if(
    $this->debug == 1) {
                        echo 
    "Ist eingeloggt! Sessiondaten stimmen mit der db überein.";
                    
                        echo 
    $userdata->session_id;
                        echo 
    $userdata->password;
                        echo 
    $userdata->username;
                    }
                    
                    
                    
    $this->login 1;
                    
                    return 
    true;

                } else {
                    
                    if(
    $this->debug == 1) echo "Sessiondaten stimmen nicht mit den daten aus der db überein -> nicht eingeloggt!";
                    
                    
    $this->login 0;
                    
                    return 
    false;
                    
                }
                
            } else {
                
                if(
    $this->debug == 1) echo "was ist schiefgelaufen, komme nicht in die abfrage :(";
                
                
    $this->login 0;
                return 
    false;
                
            }
            
            
        }
        
        public function 
    set_debugmode($status) {
            
            
    $this->debug $status;
            
        }
        
        
        
        
    }

    ?>
    Ich weis, man kann es bestimmt besser machen und genau das möchte ich hier nun auch erreichen mit dem Thread. Was soll ich daran verbessern? Datenbankverbindung wird mit der Klasse db_handler aufgebaut und die Sessions werden in eine DB gespeichert, dafür hab ich auch ne Klasse.

    Mein Prob is aber das Login :S


    aufgerufen wird das ganze dann in einer logintest.php seite

    PHP-Code:
    <?php

    /**
     * @author Marco Schär
     * @copyright 2008
     */
     
     
    include_once('config.php');
     include_once(
    'classes/db_handler.php');
     include_once(
    'classes/login_handler_v2.php');
     include_once(
    'classes/session_handler.php');
     
     
     
    /*
     Verbinde mit der Datenbank...
     */
     
    $db = new db_handler($cfg['db_host'], $cfg['db_user'], $cfg['db_pw'], $cfg['db_name']);
     
    $db->connect();
     
     
    /*
     Neues Objekt vom session handler erstellen...
     */
     
    $session = new session_handler($db);
     
     
     
    /*
     Erstelle neues Objekt von login_handler
     */
     
    $login = new login_handler($db);
     
    $login->set_debugmode(1);
     
     if(
    $login->is_loggedin() == true) {
        
    $login->set_session_data();
        echo 
    "erfolgreich eingeloggt!";
            
     } else {
            
        include 
    'pages/login.php';
     }

    ?>

    So, würde mich über Hilfe und Anregungen freuen.


    Gruss, Marco S.

  • #2
    Hallo, nonN !

    Wieso überprüfst du die Daten aus $_SESSION und aus $userdata (oder generell) nicht mit einem var_dump() ?
    Vielleicht vor jeder IF-Abfrage ?

    Grüße,
    GelaMu

    Kommentar


    • #3
      Hay, danke ich hab das Problem gefunden. Und zwar ist es die Reihenfolge in der logintest.php

      Ich prüfe ob jemand eingeloggt ist und erst danach melde ich ihn an. Hab das ganze nun umgedreht und jetzt klappts :S Hab auch sämtlichen PHP Code aus der includeten login Datei herausgenommen und direkt in die logintest.php geschrieben...

      Wieso es jetzt funktioniert, weis ich aber ehrlich gesagt nicht wirklich

      Werde dann morgen oder so mal meine neuste Version online stellen.

      Gruss

      Kommentar


      • #4
        Wieso es jetzt funktioniert, weis ich aber ehrlich gesagt nicht wirklich
        ... dann denke mal über deinen letzten Satz nach, dann wirst du verstehen, warum! Die Antwort hast du dir eigentlich schon selbst gegeben.

        Kommentar


        • #5
          Ja, aber ich check ned wieso das immer so ist. Eigentlich wollte ich ja, dass man beim 1. mal durch die Abfrage fällt und in der else Anweisung landet. Dann loggt man sich ein, die Session wird gesetzt und danach durchläuft man die Abfrage erneut und müsste durchkommen...

          Komische Sache

          Kommentar


          • #6
            Irgendwie kommt mir das ganze etwas kompliziert vor.
            Klappts jetzt?

            Kommentar


            • #7
              Zitat von Zergling
              Irgendwie kommt mir das ganze etwas kompliziert vor.
              Klappts jetzt?
              Hey,

              ja klappt nun wunderbar. Hab die Klasse nochmals überarbeitet, nein sogar komplett neu geschrieben und etwas Ordnung reingebracht. Nun ist sie deutlich übersichtlicher und besser aufgebaut. Funzt einwandfrei

              Kommentar

              Lädt...
              X