[PHP/MySQL] sicheres Sessionsystem?

Also hier nochmal eine Version. Hier wird jetzt nichtmehr die Sessionid erstmal und dann die Daten geladen, sondern die Daten inkl. Session werden direkt geladen. Denn an die Sessionid komm ich ja auch einfach über $session[sessionid] ran. Hab das bisschen verdrängt, bzw. umständlich gemacht:

PHP:
<?php 
class session{ 

    function sessionload() { //Löscht alle alten Sessions und überprüft auf Session 
        $checksestime = time() - (60 * 60 * 2); //timestamp von jetzt - 2 Stunden erstellen  
        $checklogtime = time() - (60 * 20); //timestamp von jetzt - 20 Minuten erstellen  
        $db->query("delete from ".$dbpraefix."_sessions where lastactivity < '$checksestime' and userid='0'");//Lösche alle Sessions bei denen kein User eingeloggt ist und letzte Aktivität länger als 2 Stunden her ist  
        $db->query("delete from ".$dbpraefix."_sessions where lastactivity < '$checklogtime' and userid!='0' and locked = '0'");//Lösche alle Sessions bei denen ein User eingeloggt ist, letzte Aktivität länger als 20 Minuten her ist und "Eingeloggt bleiben" nicht aktiviert ist  

        if(isset($_COOKIE['sessionid'])){ 
        $_COOKIE['sessionid'] = mysql_real_escape_string($_COOKIE['sessionid']); 
        }else{ 
        $_COOKIE['sessionid'] = ''; 
        } 
        $sessionid = $_COOKIE['sessionid']; 
        if($sessionid != ""){//Daten gefunden  
            $sessionanzahl = $db->anzahl("Select * from ".$dbpraefix."_sessions where sessionid = '$sessionid'");//Anzahl der Datenbankeinträge für $sessionid  
            if($sessionanzahl != 1){ 
                $sessionid = "";//Lösche Session-Variable  
            }  
        }  

        if($sessionid == ""){//Keine Session vorhanden oder Session gelöscht  
            $this->startsession(); 
        } 
        $this->loadsession($sessionid); //wenn Sessionid vorhanden und gültig die Daten abfragen
    } 
     
    function startsession() { //Startet eine neue Session 
        $sessionid = md5(uniq_id('sessions', true));//einzigartige ID erstellen  
        $db->query("insert into ".$dbpraefix."_sessions set sessionid = '$sessionid',lastactivity=".time().",user='0',locked='0'");  
        setCookie("sessionid", $sessionid, time() + 60 * 60 * 24 * 356 * 10);//Cookie für 10 Jahre speichern (sollte ja hoffentlich reichen)  
        $this->loadsession($sessionid);//Lädt die Daten für die neue Session
    }
     
    function loadsession($sessionid) { //Lädt die Date der Session 
        $session = $db->data("Select * from ".$dbpraefix."_sessions where sessionid = '$sessionid'");//Frage Daten der Session ab  
        $db->query("update ".$dbpraefix."_sessions set lastactivity = ".time()." where sessionid = '$sessionid'");//Update lastactivity-time  
        return $session;//Gibt das Array zurück mit den Daten 
    } 
     
    function login($userid, $lock=false){ 
        if($lock != 1){$lock = 0;} 
        $db->query("update ".$dbpraefix."_sessions set userid='$userid',locked='$lock' where sessionid = '$sessionid'");//Setze Userid in die session ein  
    } 
     
    function logout($sessionid){ 
        $db->query("update ".$dbpraefix."_sessions set userid='0',locked='0' where sessionid = '$sessionid'");//Lösche Userid und Locked (egal ob "Eingeloggt bleiben" aktiviert war oder nicht  
    } 
} 
?>

Aufruf dann einfach nurnoch über:
PHP:
include "class.session.php";  
$session = new session(); //Sessionklasse starten 
$sessiondata = $session->sessionload();//Sessionid wird geladen 
$sessionid = $sessiondata['sessionid'];
echo "Sessionid $sessionid wurde geladen...";

Allerdings noch zwei Fragen:

1. Wie schaffe ich es jetzt meine DAtenbankklasse in der Session-Klasse zu nutzen? (wird über $db geladen) Und eben wie die Variable $dbpraefix? (weiß, dass es eigentlich nicht nötig ist, aber hab ich in dem Script so mit eingebaut, weil dann die Datenbank übersichtlicher ist)
2. ZeroCCC meint ja, dass ich mir die zweite Zeile bei aufrufen auch noch spare könnte. Aber dazu müsste ja bei new session() automatisch sessionload() geladen werden.

Danke für die Hilfe
 
Sorry, aber auf die Frage nach der Datenbank hast Du schon Antworten gekriegt und evtl solltest Du Dich langsam mal über die Möglichkeiten, die OOP (und insbesondere in Verbindung mit PHP5) Dir bietet, informieren. Deine Klasse hat keinen Konstruktor, über den sämtliche Initialisierungsfunktionen erledigt werden könnten.

Was bringt Dir eine Klasse, wenn Du die Daten dann eh wieder ausserhalb nur in einem Array verarbeitest? Du kannst das alles wunderbar innerhalb der Klasse kapseln und brauchst kein Array nach draussen - das geht genauso gut bzw. sogar besser über Methoden wie beispielsweise get(), set() und unset(), die die Daten innerhalb der Instanz der Klasse verwalten.

Wenn Du das Ganze dann noch statisch oder über ein Singletonpattern machst, musst Du Dich auch nicht mehr drum kümmern, wo Dein Session-Objekt jetzt liegst und kannst überall damit flexibel und effizient arbeiten.

:arrow: https://www.php.net/manual/language.oop.php (PHP 4)
:arrow: https://www.php.net/manual/language.oop5.php (PHP 5)