BartTheDevil89
Devilution Media
- 2 Mai 2006
- 3.960
- 103
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:
Aufruf dann einfach nurnoch über:
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
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