php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.04.2007, 01:23  
Benutzer
 
Registriert seit: 10.01.2007
Beiträge: 34
Matze
Standard Session-Klasse

Guten Abend, Leute!

Ich habe mich heute mal an eine Session-Klasse gesetzt. Davon gibt es ja die verschiedensten Variationen... Nur komme ich noch nicht wirklich damit klar. Wie Sessions funktionieren, klar, das weiß ich. Aber das in eine Klasse umzusetzen, ist wirklich ziemlich kompliziert! Zumindest für mich.

Ich habe mir auch schon einige Klassen im Internet angeguckt. Aber ich bin nunmal dickköpfig und möchte meine eigene Klasse zum Laufen bringen, und ich würde mich freuen, wenn ihr mir da ein paar Tipps geben könntet!

Den ganzen Code schreibe ich dann unten zusammenhängend, damit es leichter zu lesen ist.

Meine Grundüberlegung ist, bei jeder neuen Instanz eine neue Session zu starten. Deshalb wird im Konstruktor irgendein Name für die Session angegeben. Wie schaut es aus, kann ich hier einfach problemlos eine neue Session starten?
Außerdem wird hier überprüft, ob evtl. durch Cookies der User bereits ermittelt werden kann.

Danach kommt eine Login-Methode. Bei dieser werden Username und -passwort auf ihre Gültigkeit überprüft. Ich speichere dann ggf. die Usernamen in einer Session-Variable mit dem Sessionnamen in der 1. und den Userangaben in der 2. Dimension.
Falls $permanent true ist, wird der User dauerhaft eingeloggt, bzw. zwei Cookies gesetzt.

In der Logout-Methode werden die Cookies zerstört und auf die Destroy-Methode zurückgegriffen, welche die Session zertört.

PHP-Code:
<?php
class session {
    var 
$name;

    
// Der Konstruktor gibt der Session einen eindeutigen Namen
    
function session($name '') {
        
session_start();
        
$this->name $name;

        
// Wenn Cookies vorhanden, Inhalte in Session speichern
        
if (isset($_COOKIE['username']) && isset($_COOKIE['userpwd'])) {
            
$_SESSION[$this->name]['name'] = $_COOKIE['username'];
            
$_SESSION[$this->name]['pwd'] = $_COOKIE['userpwd'];
        }
    }

    
// User wird eingeloggt
    
function login($user_name ''$user_pwd ''$permanent 0) {
        global 
$db$cookie_timeout;

        
$result $db->query("SELECT `name`, `pwd` FROM `users` WHERE `name` = '"$user_name ."' AND `pwd` = '"$user_pwd ."'");
        if (!
$db->num_rows($result)) {
            return 
false;
        } else {
            
$array $db->fetch_array($result);
            
$_SESSION[$this->name]['name'] = $array['name'];
            
$_SESSION[$this->name]['pwd'] = $array['pwd'];

            
// Wenn $permanent true, dann Cookies speichern
            
if ($permanent) {
                
setcookie('username'$cookie_timeout$_SESSION['$this->name']);
                
setcookie('userpwd'$cookie_timeout$_SESSION['$this->pwd']);
            }

            return 
true;
        }
    }

    
// Loggt einen User aus
    
function logout() {
        
// Die Cookies werden entfernt
        
if (isset($_COOKIE['username'])) {
            
setcookie('username'0'');
        }

        if (isset(
$_COOKIE['userpwd'])) {
            
setcookie('userpwd'0'');
        }

        
// Die Session wird zerstört
        
$this->destroy();

        
// Wenn alles gelöscht wurde, true zurückgeben. Ansonsten false
        
if (!isset($_COOKIE['uername']) && !isset($_COOKIE['userpwd']) && !isset($_SESSION[$this->name])) {
            return 
true;
} else {
            return 
false;
}
    }

    
// Die Session wird zerstört
    
function destroy() {
        
session_destroy();
    }
}
?>
Was haltet ihr von der Klasse? Wo gibt es Stärken, wo Schwächen? Wo könnte es gar zu Fehlern oder Risiken kommen?
Über konstruktive Antworten würde ich mich freuen!

Liebe Grüße
Matze
Matze ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.04.2007, 04:00  
Erfahrener Benutzer
 
Registriert seit: 03.03.2007
Beiträge: 112
Schnulli
Standard

Was passiert, wenn ich meinen Browser einen Keks mit username=admin;userpwd=xyz senden lasse? Ich sehe da keine Kontrolle. Wird einfach nach $_SESSION übernommen.

Zitat:
if (isset($_COOKIE['username'])) {
setcookie('username', 0, '');
}
danach ist $_COOKIE['username'] im aktuellen Skript immer noch gesetzt. Deshalb gibt logout() immmer false zurück.

Der bisherigen Funktionalität nach ist das keine Klasse session sondern eher user+session
Schnulli ist offline  
Alt 04.04.2007, 04:17  
Benutzer
 
Registriert seit: 10.01.2007
Beiträge: 34
Matze
Standard

Zitat:
Zitat von Schnulli
Der bisherigen Funktionalität nach ist das keine Klasse session sondern eher user+session
Hmm, und was würdest du da verbessern?
Matze ist offline  
Alt 04.04.2007, 05:43  
Erfahrener Benutzer
 
Registriert seit: 03.03.2007
Beiträge: 112
Schnulli
Standard

user wäre bei mir ein Objekt innerhalb der Session.
Als Beispiel (ohne weitere Klasse um $_SESSION herum)
PHP-Code:
<?php
$_SESSION
['currentUser'] = new User;
?>
Schnulli ist offline  
Alt 04.04.2007, 09:01  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Matze,

Klassen dienen häufig der Abstraktion eines "Problems" oder einer Aufgaben-Stellung. Was du hier machst ist zwei Dinge gewaltig vermischen. Session haben erst mal nichts mit Cookies zu tun. Programmatisch gesehen kann man diese sicher für ähnliche Dinge nutzen, aber das wars auch schon. Was ich erwarte wäre folgendes:

- Man kann die Session-Klasse mit einem Namespace instanziieren. So können verschiedene Programme mit der Session-Klasse arbeiten, ohne sich zu blockieren.
- Es gibt Methoden wie getDataFromSession(), writeDataToSession() um Daten zu manipulieren.
- Eine Methode clearSession() löscht die Session eines Namespaces.

Damit hast du das Handling abstrahiert und kannst mit Sessions, wie auch mit anderen Services (MySQL-Klasse, ...) arbeiten. Für Cookies würde ich eine eigene nach dem genannten Interface erstellen. Wenn du ein Beispiel von mir haben möchtest, dann schau mal in den Threat http://www.phpfriend.de/forum/ftopic61760.html. Das Package beinhaltet eine solche Klasse.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 04.04.2007, 13:59  
Benutzer
 
Registriert seit: 10.01.2007
Beiträge: 34
Matze
Standard

Zitat:
Zitat von dr.e.
Hallo Matze,

Klassen dienen häufig der Abstraktion eines "Problems" oder einer Aufgaben-Stellung. Was du hier machst ist zwei Dinge gewaltig vermischen. Session haben erst mal nichts mit Cookies zu tun. Programmatisch gesehen kann man diese sicher für ähnliche Dinge nutzen, aber das wars auch schon. Was ich erwarte wäre folgendes:

- Man kann die Session-Klasse mit einem Namespace instanziieren. So können verschiedene Programme mit der Session-Klasse arbeiten, ohne sich zu blockieren.
- Es gibt Methoden wie getDataFromSession(), writeDataToSession() um Daten zu manipulieren.
- Eine Methode clearSession() löscht die Session eines Namespaces.

Damit hast du das Handling abstrahiert und kannst mit Sessions, wie auch mit anderen Services (MySQL-Klasse, ...) arbeiten. Für Cookies würde ich eine eigene nach dem genannten Interface erstellen. Wenn du ein Beispiel von mir haben möchtest, dann schau mal in den Threat http://www.phpfriend.de/forum/ftopic61760.html. Das Package beinhaltet eine solche Klasse.
Danke, die Klasse hat mir auf die Sprünge geholfen!
Matze ist offline  
Alt 04.04.2007, 14:04  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Danke, die Klasse hat mir auf die Sprünge geholfen!
Gerne. Solltest du noch Anwendungsbeispiele brauchen (Login), sag Bescheid, ich hab da auch was auf Basis dieser Klasse...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 04.04.2007, 15:09  
Benutzer
 
Registriert seit: 10.01.2007
Beiträge: 34
Matze
Standard

Hmm, also ich hab das ganze jetzt letztendlich in 3 Klassen aufgeteilt: Session, Cookie und UserLogin.

Die Session Klasse erstellt eine Session, löscht sie und verwaltet die Attribute.
Die Cookie Klasse erstelle mit einer neuen Instanz einen neuen Cookie, der gelöscht oder geändert werden kann.

Nur beim User-Login hack ich momentan etwas. Ich hab eine Methode "saveUserData()", mit der die Daten in eine Session und ggf. in zwei Cookies gespeichert werden.

PHP-Code:
<?php
    
function SaveUserData() {
        global 
$cfg;

        
// Sessions
        
$loginSession = new Session('login');
        
$loginSession->saveSessionData('username'$this->Username);
        
$loginSession->saveSessionData('pwd'$this->Pwd);

        
// Cookies
        
if ($this->Permanent) {
            
$cookieUsername = new Cookie('login_Username'
                
$this->Username$cfg['cookieTimeout']);
            
$cookiePwd = new Cookie('login_Pwd',
                
$this->Pwd$cfg['cookieTimeout']);
        }
    }
?>
Soweit, so gut. Eigentlich kein Problem (hoffe ich... ).
Aber nun habe ich auch eine Methode "logout()", in welcher ich die Session löschen will. Dafür muss ich aber eigentlich eine neue Instanz aufrufen, mit welcher die Session ja ohnehin überschrieben wird.

PHP-Code:
<?php
            
// $loginSession = new Session('login'); mit Informationen über Login


    
function logout() {
                
// Hier wird die eigentliche Session doch ohnehin überschrieben, der zweite Schritt ist eigentlich unnötig
                
$logoutSession = new Session('login');
                
$logoutSession->destroySession('login');

                
// Oder einfach so? Also ohne eine Instanz zu erstellen.
                
Session::destroySession('login');
    }
?>
Oder ganz anders?
Matze ist offline  
Alt 04.04.2007, 17:10  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Matze,

dein Ansatz war schon richtig. Solltest du dich an meinem Code orientiert und die Implementierung übernommen haben (verwend' die Klasse doch einfach ohne umbenennen :wink: ), so muss es

PHP-Code:
<?php
   $logoutSession 
= new Session('login');
   
$logoutSession->destroySession('login');
?>
heißen. Intern bewirkt das das löschen des assoziativen Arrays $_SESSION['login'] und beim nächsten prüfen eines Wertes wirst du "null" zurückbekommen.

Ob ein

PHP-Code:
<?php
Session
::destroySession('login'); 
?>
funktioniert, kann ich dir nur beantworten, wenn ich weiß, wie deine (oder meine :wink: ) Implementierung der Klasse lautet.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 04.04.2007, 17:56  
Benutzer
 
Registriert seit: 10.01.2007
Beiträge: 34
Matze
Standard

Welche Implementierung meinst du jetzt genau?

Die Klassen habe ich erstmal einfach so geschrieben, zum Testen bin ich noch nicht gekommen.
Ich wollte die Klassen lediglich per Include einfügen und dann beim Login eine neue Instanz der UserLogin-Klasse erstellen, falls du das meinst...

Ansonsten habe ich dir die 3 Klassen einfach mal hochgeladen... http://www.speedshare.org/g5SQEWszvX
Matze 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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Session Problem karina_02 PHP Tipps 2008 6 18.05.2008 22:37
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
klasse mit session übergeben ;) fragnicht PHP-Fortgeschrittene 7 22.08.2007 11:57
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
session nach seitenwechsel leer... GELight PHP Tipps 2006 8 17.09.2006 15:17
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] php session problem :( PHP Tipps 2005-2 5 21.10.2005 16:37
Klassenobjekt in ner Session speichern?! Finkman PHP Tipps 2005-2 5 09.08.2005 00:38
Session wird nicht angelegt PHP Tipps 2005-2 7 24.07.2005 13:35
Kreieren einer Session PHP Tipps 2005 11 28.05.2005 15:16
[Erledigt] Formulardaten in einer Session speichern, per Link übergeben PHP Tipps 2004-2 2 29.12.2004 15:47
[Erledigt] Hilfe...PhpBB Session Problem!! PHP Tipps 2004-2 2 15.12.2004 18:28
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php session klasse permanent, session mit klassen verwalten in php, session klasse, php session klasse, einfache login session klasse, php class session, $_cookie, writedatatosession

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:45 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.