php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.08.2007, 16:57  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard 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
Igäl ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.08.2007, 17:56  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline  
Alt 06.08.2007, 18:00  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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.
Igäl ist offline  
Alt 06.08.2007, 18:13  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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*
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
Mark Twain
Igäl ist offline  
Alt 06.08.2007, 18:14  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline  
Alt 06.08.2007, 19:02  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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...
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
Mark Twain
Igäl ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
doppelaufruf, doppelaufruf php, doppelaufruf php durch smarty, function doppelauruf, php seite vordoppelaufruf

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.