Frage zum Session Login System

@Flex: hmm also ich glaube du hast mich nicht ganz verstanden: Ich spreche von einer Sessioverwaltung, die nicht mehr auf Textdateien sondern nur noch auf mysql basiert. Das elegante daran ist, dass man die user und sessiondatenbank dann sehr einfach verküpfen kann und mit einigen Aktionen sehr einfach auf alles zugreifen kann und wenn halt interesse besteht dann poste ich meine lösung und gehe darauf ein, ok?
 
also ich bin für alle Vorschläge offen, poste deinen Vorschlag ruhig mal. Je mehr Quelltext ich les, desto mehr versteh ich hoffentlich :)
 
gut, vielleicht ist mein code etwas verwirrend:
PHP:
function getFromGlobs($varname, $default=false, $allowed=false) {
  if (isset($GLOBALS[$varname])) $out=$GLOBALS[$varname];
  elseif (isset($_POST[$varname])) $out=$_POST[$varname];
  elseif (isset($_GET[$varname])) $out=$_GET[$varname];
  else $out=$default;
  if (is_array($allowed)) {
    foreach($allowed as $item) if($out==$item) return $out;
    return $default;
  }
  return $out;
}

function initSession() {
  global $db,$sess,$session_alivetime;
  if (getSid()!='') {
    $sql='DELETE FROM session WHERE lastalive<'.(time()-$session_alivetime);
    $db->query($sql);
    // Versuche Session wieder aufzunehmen
    $sql='SELECT s.screenWidth,s.screenHeight,s.style,u.username,u.mail,u.rights FROM session s LEFT JOIN registered_users u ON (s.uid=u.id) WHERE sid="'.getSid().'"';
    $db->query($sql);
    if ($db->nextrow()) {
      // wenn funktioniert dann erzeuge $sess-Variable
      $sess=array(
        'user'=>$db->r('username'),
        'style'=>$db->r('style'),
        'rights'=>$db->r('rights'),
        'mail'=>$db->r('mail')
        );
    }
    else {
      // wenn nicht dann füge neuen Gastuser ein
      // die $sess-Variable musst nicht erzeugt werde, da die Zugriffsfunktionen auf die Session leere Felder abfangen und default-Werte ausgeben
      $sql='INSERT INTO session (sid,lastalive,style) VALUES("'.getSid().'",'.time().',"b")';
      $db->query($sql);
    }
  }
}

function createSid() {
  srand((double)microtime()*1000000);
  return substr('hhg'.uniqid(rand()),0,20);
}

function getSid() {
  global $abs_path;
  $sid=getFromGlobs('sid');
  if (empty($sid)) header('location: '.$abs_path.'index.php?sid='.createSid());
  else return $sid;
}

function url() {
  return '&sid='.getSid();
}

function form() {
  return '<input type="hidden" name="sid" value="'.getSid().'" />';
}

function is($needed) {
  $rights=getRights();
  if ($needed==$rights) return true;
  elseif ($needed=='guest') return true;
  elseif (($needed=='admin') and ($rights=='root')) return true;
  elseif (($needed=='user') and ($rights=='root')) return true;
  elseif (($needed=='user') and ($rights=='admin')) return true;
  else return false;
}

/******
/* Funktionen um Daten aus der Session zu holen */
function getUser() {
  global $sess;
  if ((isset($sess['user'])) and (isValidUser($sess['user']))) return $sess['user'];
  else return 'gast';
}
function getRights() {
  global $sess;
  if (isset($sess['rights'])) return $sess['rights'];
  else return 'guest';
}
function getStyle() {
  global $sess;
  if (isset($sess['style'])) return $sess['style'];
  else return 'b';
}

/*****
/* infos */

function getOnUsers() {
  global $db, $online_alivetime;
  $sql='SELECT COUNT(sid) FROM session s WHERE uid=0';
  $db->query($sql);
  $GLOBALS['OnGuests']=$db->nextrow()?$db->r('0'):0;
  $sql='SELECT COUNT(sid) FROM session s WHERE uid!=0';
  $db->query($sql);
  $GLOBALS['OnLoggedIn']=$db->nextrow()?$db->r('0'):0;
  return $GLOBALS['OnLoggedIn']+$GLOBALS['OnGuests'];
}

function getOnGuests() {
  global $db, $online_alivetime;
  if (!isset($GLOBALS['OnGuests'])) {
    getOnUsers();
  }
  return $GLOBALS['OnGuests'];
}

function getOnLoggedIn() {
  global $db, $online_alivetime;
  if (!isset($GLOBALS['OnLoggedIn'])) {
    getOnUsers();
  }
  return $GLOBALS['OnLoggedIn'];
}

function getRegisteredUsers() {
  global $db;
  if (!isset($GLOBALS["ReggedUsers"])) {
    $db->query('SELECT COUNT(id) FROM registered_users');
    $GLOBALS["ReggedUsers"]=$db->nextrow()?$db->r("0"):0;
  }
  return $GLOBALS["ReggedUsers"];
}
für den Datenbankzugriff verwende ich eine modifizierte Varianter der Klasse aus der PHPLib. $online_alivetime und $session_alivetime sind die "Lebenszeiten" also online wie lange ein benutzer noch als "online" gezählt wird und "session" wie lange ein Benutzer eingeloggt bleibt.
Meine Datenstrukut sieht vereinfacht so aus:
#
# Table structure for table registered_users
#
CREATE TABLE registered_users (
id int(11) DEFAULT '0' NOT NULL auto_increment,
username varchar(32) NOT NULL,
password varchar(255) NOT NULL,
mail varchar(255) NOT NULL,
status varchar(10) NOT NULL, // nicht wichtig
rights varchar(10) NOT NULL, // Rechtetyp (root, admin, student, teacher user)
pid int(11) DEFAULT '0' NOT NULL, // nicht wichtig
PRIMARY KEY (id)
);
# --------------------------------------------------------
#
# Table structure for table session
#
CREATE TABLE session (
sid varchar(32) DEFAULT '0' NOT NULL, // session id
uid int(11) DEFAULT '0' NOT NULL, // verweis auf einen eintrag in registered_users
lastalive int(11) unsigned DEFAULT '0' NOT NULL,
screenWidth varchar(4) NOT NULL, // Bildschirmbreite (nicht wirklich wichtig aber manchmal nützlich, wird per js eingetragen)
screenHeight varchar(4) NOT NULL,
style char(1) NOT NULL, // style der seite (in Planung sind r für rot, b für blau etc.)
PRIMARY KEY (sid)
)
noch fragen ? :)
 
Die Fragen kommen dann wohl erst am DI oder MI. Solange fehlt mir die Zeit mich intensiver damit zu befassen --> Schulstress :rolleyes:
 
@Digleu

könntest du deine funktionen etwas erklären was die einzelnen machen und wie man sie verwendet
 
Also ich glaube das script vom digleu ist schon in der art das was ich suche, nur wie baue ich das ein? ich benutze auch das login script, das der divx benutzt.
Muss das dann in die login.php geschrieben werden? nur dann habe ich da ja gar keine db infos mehr drin. Und wie baue ich dann die ausgabe auf meiner index.php ein, in der das dann ja ngezeit werden soll, wer grade online ist.

Bin für jeden Tip dankbar, weil ich such jetzt seit 5 Tagen nach der online user anzeige und finde einfach nix brauchbares.

danke
 
sry natürlich:
getFromGlobs holt eine Variablen aus den Super-GlobalArrays kann genutzt werden wenn man nicht weiß auf welche weise eine Variable von der vorherigen Site übergeben wurde
initSession: beginnt die session, d.h. guckt ob die aktuelle sessionid in der db existiert wenn nicht dann wird eine entsprechende Zeile erstellt wenn doch dann wird diese Zeile upgedated
createSid: erstellt die Sessionid
getSid: holt die sessionId, sollte noch keine existieren erzeugt das script einen "fallback" auf sich selbst und ruft sich selbst mit einer session id dran nochmal auf
url: muss an jede url drangehangen werden bsp: $link='index.php?'.url(); sollte man keine variablen übergeben wollen dann muss man trotzdem das ? machen wenn doch dann url() einfach dranhängen
form: das gleiche wie url nur für forms einfach in den formtag schreiben
$form='
<form ...>
'.form().'
</form>';
form() und url() sind nötig, damit die session erhalten bleibt
is: prüft opb der aktuelle user eine bestimmte rechteklasse ist
getUser, getRights, getStyle: holen Daten aus der Session
die letzten Zeile müssten selbsterklärend sein

deine Aufgabe wäre es jetzt z.B. eine login-funktion zu schreiben ;)
 
Zurück