Portal > Foren > PHP > PHP-Programmierung > Probleme mit OOP -> Object zerstört sich selbst?
Antwort
 
Themen-Optionen
Alt 04.10.2005, 16:19 Nach oben    #1
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard Probleme mit OOP -> Object zerstört sich selbst?

Vorneweg:
Es sind meine ersten Gehversuche mit OOP und PHP5. Also spart nicht an Verbesserungsvorschlägen

Zum Thema:
Ich habe ne einfache Startseite erstellt, wo man sich halt einloggen kann.
Ist man nicht eingeloggt, kommt ein Loginformular, ist man eingeloggt, soll ein Textfeld mit dem Loginnamen, unter dem man eingeloggt ist, angezeigt werden.
Das ist alles kein Problem, funktioniert soweit.
Aber: Login geht, die Session wird korrekt mit Daten gefüllt und sobald ich nun einen weiteren Klick mache, wird bei dem ersten Methodenaufruf der Auth-Klasse gesagt, diese Methode gibt es nicht...

Ok hier mal meine Quellcodes..
auth.class.php:
PHP-Code:
<?php
/**
*    Authklasse zum Sicherstellen, dass auch nur Angemeldete hier reinkommen
*/
class Auth {
    
    private 
$userid;
    private 
$username;
    private 
$sessionid;
    private 
$authed false;
    
    
/**
    *    Überprüfung ob angegebene Logindaten korrekt sind
    *    @author    WarrenFaith
    *    @return    boolean        true    if connected
    *                        false    if not connected
    */
    
public function getAuth($username$password) {
        if (
$username != '') {
            
$result mysql_query("SELECT * FROM adap_users WHERE Username = '".$username."';");
            
// Gibts den Username?
            
if ($ergebnis mysql_fetch_array($result)) {
                
// Password korrekt?
                
if($ergebnis['Password'] == $password) {
                    
$this->userid $ergebnis['ID'];
                    
$this->username $ergebnis['Username'];
                    
mysql_query("UPDATE adap_users SET session_id = '".session_id()."' WHERE ID = '".$this->userid."';");
                    
$this->sessionid session_id();
                    
$this->authed true;
                    return 
'true';
                } else {
                    
$error_msg 'Das angegebene Password ist falsch.';
                    return 
$error_msg;
                }
            } else {
                
$error_msg 'Der angegebene Username existiert nicht.';
                return 
$error_msg;
            }
        } else {
            
$error_msg 'Ohne Username gehts nicht.';
            return 
$error_msg;
        }
        return 
false;
    }

    public function 
initSession() {
        if(
session_id() == '') {
            
session_start();
        }
        return 
true;
    }
    
    public function 
startAuth($username$password) {
        
$result $this->getAuth($username$password);
        return 
$result;
    }
    
    public function 
setUserinfos() {
        
$_SESSION['user'] = Array(
                        
'userid' => $this->userid,
                        
'username' => $this->username,
                        
'sessionid' => $this->sessionid,
                        );
        
$_SESSION['auth']['login'] = $this->authed;
        return 
true;
    }
    
    public function 
getAuthed() {
        return 
$this->authed;
    }
    
    public function 
setAuthed() {
        
$this->authed $_SESSION['auth']['login'];
        return 
true;
    }
}
?>
index.php:
PHP-Code:
<?
error_reporting(E_ALL);

include "./lib/base.php";

$tpl = new Template();

// hier wird eine Instanz erzeugt
$auth = new Auth();
/* Nachfolgend eine Testausgabe, um zu überprüfen, was mit dem Object passiert */
echo get_class($auth);
$auth->initSession();
echo get_class($auth);
/* Nach dem Login wird mit 2 mal "Auth" ausgegeben, nach dem ersten Klick
allerdings nur noch 1 mal, sprich nach $auth->initSesseion(); existiert das Object nicht mehr?! */

$dbase = new Database();
if (!$dbase->getConnection()) {
    echo '<center>Leider konnte auf Grund eines Datenbankfehlers die Seite nicht geladen werden</center>';
    exit();
}
/**
*    Abhandlung des Logouts
*/
if(isset($_GET['logout'])) {
    $_SESSION['auth']['login'] = false;
    $auth->setAuthed(); // Wenn der Logoutlink benutzt wird, meckert er hier rum
}
/**
*    Abhandlung des Logins
*/
if(isset($_POST['loginsubmit'])) {
    $auth->startAuth($_POST['loginname'], md5($_POST['loginpasswd']));
    $auth->setUserinfos();
}
/**
*    Header laden und ausgeben
*/
$tpl->load("../templates/header.tpl");
$langs[] = "de/lang_main.php";
$lang = $tpl->loadLanguage($langs);
$tpl->assign("title", "Willkommen");
$tpl->out();

/**
*    Hier wird das Framework aufgebaut und festgelegt, welche Templates
*    geladen werden müssen.
*/
?>
<center>
<table class="mainframe">
    <tr>
        <td colspan="2" class="banner"> </td>
    </tr><tr>
        <td class="contentframe">
            <?
                include "content.php";
            ?>
        </td>
        <td class="menuframe">
            <?
                $tpl->load("../templates/menu.tpl");
                $tpl->out();
                if($auth->getAuthed) { // Hier meckert er rum, weil nach Login + Klick das Object nicht mehr existiert
                    $tpl->load("../templates/userinfo.tpl");
                    $tpl->assign("name", $_SESSION['user']['username']);
                    $tpl->assign("uid", $_SESSION['user']['userid']);
                    $tpl->out();
                } else {
                    $tpl->load("../templates/login.tpl");
                    $tpl->out();
                }
            ?>
            <a href="index.php?logout=true">Logout</a>
        </td>
    </tr>
</table>
</center>
<?
/**
*    Footer laden und ausgeben
*/
$tpl->load("../templates/header.tpl");
$tpl->out();
?>
Meine Persönliche Vermutung ist, dass er sich an der initSession() stößt, allerdings kann ich beim besten willen keinen fehler finden :/
Vielleicht hilft mir auch ein singleton zu erstellen?
Dafür muss ich aber erstmal tutorials wälzen

Danke für eure Ideen und Hinweise.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 17:31 Nach oben    #2
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

->initSession() ist im Grunde schon ein Designfehler

das willst du

Geändert von Ben (06.03.2007 um 12:30 Uhr). Grund: Link aktualisiert
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 17:38 Nach oben    #3
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Zitat:
Zitat von Tutorial
Warum dies geschieht ist schnell erklärt, der Quellcode der Klassen ist zum
Zeitpunkt des Aufrufs von session_start() nicht verfügbar und PHP ist nicht bekannt, wie das Objekt
zu rekonstruieren ist. Die Lösung des Problems ist eigentlich sehr simpel. Die
Klassen müssen inkludiert werden, bevor session_start() aufgerufen wird.
Verstanden und klappt nun auch.
initSession entfernt, die Session wird nun direkt nach dem includen der Klassen initiert.

Anderes Problem: Da ich eigentlich nach meinem Verständnis keine Objekte sondern nur Werte in meiner Session speichere, verstehe ich nicht ganz, was der wust bei mir in der Session bedeutet:
Code:
Array
(
    [user] => Array
        (
            [userid] => 1
            [username] => WarrenFaith
            [sessionid] => a974f141c804d6e6b0b4565820560a96
        )

    [auth] => Auth Object
        (
            [userid:private] => 
            [username:private] => 
            [sessionid:private] => 
            [authed:private] => 
        )
)
//edit:
$_SESSION['auth']['login'] bzw $_SESSION['auth'] speichert ja scheinbar ein Objekt, allerdings verstehe ich nicht warum. Beim besten willen nicht
__________________
I did it my way - Senseless-Blog

Geändert von WarrenFaith (04.10.2005 um 17:57 Uhr).
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 19:11 Nach oben    #4
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

Das ist schon richtig so. Irgendwo her muss PHP ja auch wissen, dss es ein Objekt ist, das du da in die Session gepumpt hast.
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 19:15 Nach oben    #5
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

ich speicher aber kein objekt, zumindest ist das nicht beabsichtigt. ich will dort lediglich _einen_ wert (boolean) speichern.
dazu weise ich $this->authed = true zu und speicher das in der $_SESSION['auth']['login'] er soll also nur true oder false als wert haben.
direkt nach dem login ist dieser wust in der $_SESSION nicht drin, sondern es ist wie beabsichtigt der true wert gesetzt. erst beim ersten klick _nach_ login entsteht der wust, und ich hab keinen schimmer warum :/
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 19:32 Nach oben    #6
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

register_globals = Off

Dann passiert das vermutlich nicht mehr ... und schon dein initiales Problem wäre nicht aufgetaucht.
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 20:17 Nach oben    #7
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

argh das passiert wenn man mit xampp arbeitet :/

//edit: ich war gestern abend etwas kurz angebunden, da meine freundin keine flatrate hat.
ich wollte mich nur nochmal bedanken.
danke!
__________________
I did it my way - Senseless-Blog

Geändert von WarrenFaith (05.10.2005 um 13:17 Uhr).
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Vokabeltrainer asenodin Allgemeine Java-Programmierung 9 28.05.2006 21:04


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:45 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44