Ankündigung

Einklappen
Keine Ankündigung bisher.

Unerklärlicher Doppelaufruf

Einklappen

Neue Werbung 2019

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

  • Unerklärlicher Doppelaufruf

    Hi Leute

    Ich glaub ich seh vor lauter Bäumen den Wald nicht mehr. Aber jetzt nach ner Stunde herumdoktorieren hab ich mich entschlossen, euch mit meinem Trivialproblem zu belästigen. Vermutlich werde ich ein *Kopf@Tisch*-Erlebnis haben, aber irgendwie blick ich grad nicht durch.

    Mein Script (simples Login-Script):
    PHP-Code:
    <?
    class Login    {
        var $notice_output = "";
    /******************************************************************************************************/
    /******************************************************************************************************/
        function show_login($smarty)    {
            $smarty->assign("form_action", "index.php?mid=3");

            $this->login_handler(&$smarty);

            return ("login.tmpl.html");
        }
    /******************************************************************************************************/
    /******************************************************************************************************/
        function login_handler($smarty)    {
            if($_SESSION['UserID'] != 0)    {
                $this->logout();
            }else{
                echo "Ich bin in der Funktion login_handler überhalb von \$this->login()
    ";
                $this->login();
            }
            $smarty->assign("notice_output", $this->notice_output);
        }
    /******************************************************************************************************/
    /******************************************************************************************************/
    /**# Es folgen die Unterfunktionen von login_handler                    #**/
    /******************************************************************************************************/
    /******************************************************************************************************/
        function login()    {
            echo "Ich bin in der Funktion login()
    ";
            if(isset($_POST['form_login_submit']))    {
                    $log_name = utf8_decode($_POST['form_login_nickname']);

                    $verify_login = Mysql::db_num_data("UsrID, UsrPrename, UsrEMail, UsrOpenMail", "users", "UsrNickname='".$_POST['form_login_nickname']."' AND UsrPw='".md5($_POST['form_login_pass'])."'");

                    if($verify_login > 0)    {
                        $userdata = $this->get_userdata($_POST['form_login_nickname'], $_POST['form_login_pass']);

                        $_SESSION['UserID'] = $userdata['UsrID'];
                        $_SESSION['UserPrename'] = $userdata['UsrPrename'];
                        $_SESSION['UserNickname'] = $_POST['form_login_nickname'];
                        $_SESSION['UserPass'] = md5($_POST['form_login_pass']);
                        $_SESSION['UserEMail'] = $userdata['UsrEMail'];
                        $_SESSION['UserOpenMail'] = $userdata['UsrOpenMail'];
                        if($_POST['form_login_autologin'])    {
                            //Cookies setzen
                            $value = $userdata['UsrID']."|".$userdata['UsrPrename']."|";
                            $value .= $_POST['form_login_nickname']."|".md5($_POST['form_login_pass'])."|";
                            $value .= $userdata['UsrEMail']."|".$userdata['UsrOpenMail'];
                            $expire = 3600*24*30+time();
                            setcookie("AutoLogin", $value, $expire);
                        }

                        $this->notice_output .= "Login erfolgriich - <a href=\"index.php?mid=1\">[b]wiiter[/b]</a>
    ";
                    }else{
                        $this->notice_output .= "Loginname oder Passwort falsch
    <a href=\"index.php?mid=3\">[b]Namal probiere[/b]</a>
    ";
                    }
            }
        }
    /******************************************************************************************************/
    /******************************************************************************************************/
        function logout()    {
            session_destroy();
            setcookie("AutoLogin", "", time() - 3600);
            $this->notice_output .= "Erfolgriich uusgloggt - <a href=\"index.php?mid=1\">[b]wiiter[/b]</a>
    ";
        }
    /******************************************************************************************************/
    /******************************************************************************************************/
        function get_userdata($name, $pass)    {
            $userdata_ = Mysql::db_select_data("UsrID, UsrPrename, UsrEMail, UsrOpenMail", "users", "UsrNickname='".$name."' AND UsrPw='".md5($pass)."'");
            $userdata = Mysql::db_fetch_data($userdata_);

            return $userdata;
        }
    /******************************************************************************************************/
    /******************************************************************************************************/
    }
    Die Ausgabe der Echos von Zeile 19 und Zeile 30
    Code:
    Ich bin in der Funktion login()
    Ich bin in der Funktion login_handler überhalb von $this->login()
    Ich bin in der Funktion login()
    Ich verstehe nicht, warum das "Ich bin in der Funktion login()" noch vor dem eigentlichen Funktionsaufruf kommt.

    Hier noch der Klassenaufruf:
    PHP-Code:
        case 3:        include_once("modules/login/Login.class.php");
                    
    $login = new Login;
                    
    $show_login $login->show_login(&$smarty);
                    
    $show_login $path_prefix."modules/login/templates/".$show_login;
                    
    $smarty->assign("show_site"$show_login);
                    break; 
    Was übersehe ich? Ich blicks grad echt nicht -.-"

    Bin für jeden Hinweis auf meine Kurzsichtigkeit dankbar.

    Gruss Igäl

    Edit:
    Achja... das Eigentliche Problem beim einloggen ist, dass wenn ich auf den Submit-Button drücke und mich einloggen will, loggt es mich ein und gleich wieder aus. Ich hab keine Ahnung was hier abgeht

  • #2
    Deine Methode "login" wird von PHP 4 als Konstruktor (der Klasse "Login") und von PHP 5 als alternativer Konstruktor (falls __construct nicht existiert) interpretiert. Somit rufst du einmal automatisch und implizit "login" beim Instanzieren der Klasse Login auf und einmal explizit über die Methode "login_handler".

    Falls du die Funktion debug_backtrace() noch nicht kanntest, sie ist sehr hilfreich. Oder schau dir meine Debug-Klasse im Tutorial an.

    Kommentar


    • #3
      Hab das Problem mal soweit eingegrenzt, dass ich herausgefunden habe, dass die Funktion login() nochmals aufgerufen wird und das anscheinend bevor die Klasse instanziert wird.

      Sobald ich die Funktion in der Klasse hier in loginblabla() umbenenne und sie in der Klasse auch so aufrufe, funktioniert alles wie es soll. Allerdings sollte der Funktionsaufruf auf login() nun doch irgendwo einen Fehler verursachen. Hab error_reporting(E_ALL) an...

      Habt ihr eine Idee was da los sein könnte? Kann man über Fremdzugriff eine Funktion starten?

      Edit: Ups entschuldige... ich war gerade beim Schreiben. Das merkwürdige ist nur, dass die ganze Sache so lief. Ich habs ja nicht umsonst im Live-Betrieb Werd aber deinen Rat beherzigen und mal darauf testen. Dankeschön.

      Kommentar


      • #4
        Ok das wars wohl. Vielen Dank Zergling.

        Und ich hab wieder begonnen Java zu programmieren. Wenn ich solche elementare Dinge aus OOP übersehe wird das wohl nix *g*

        Kommentar


        • #5
          Eine Methode, die den selben Namen wie ihre Klasse hatte, war aber schon seit jeher der Konstruktor, auch zu PHP 5 Zeiten, wenn eben wie gesagt __construct() nicht definiert war.
          Versuch übrigens mal, HTML aus PHP rauszuhalten, dafür hast du ja deine Smarty-Template Engine. Wenn du trotz Smarty immernoch HTML in dein PHP reinbaust, kannst du Smarty auch gleich ganz weglassen. Aber das hat mit der Frage nichts zu tun.

          Kommentar


          • #6
            Naja einige triviale Sachen geb ich gleich mit der Variable mit. Das wäre sonst viel zu umständlich wenn ich das in den templates machen würde. Aber jo... Wollte ich es sauber trennen, müsste ichs wohl auslagern...

            Kommentar

            Lädt...
            X