Jump to content
Sign in to follow this  
bergbenji

Logintime in Sessionspeichern Nutzen?

Recommended Posts

Hi - habe ein klaeine frage.


Ich bin in der überlegung - die expiretime In die Session zu speichern.

Warum:


Mit der expiretime schaue ich momentan nach - ob der User sich noch auf der Seite befindet:


Die beiden codes verwende ich dafür:

Für das Aktualisieren der Expire Time


 

$sqlbefehl= "Select * from $tab_user where uin='$_SESSION[uIN]' And uin  ''";
$ergebnis_login  = mysql_query($sqlbefehl, $serverid);
if (mysql_num_rows($ergebnis_login) == 1) {
   $user = mysql_fetch_array ($ergebnis_login);
   $expire=$zeit+1800;
   $sqlbefehl= "update $tab_user set expire='$expire',  online='$_GET[site]' where id = $user[id]";
   @mysql_query($sqlbefehl, $serverid);
}

 


Und für die Abfrage:

$momentan=time() - 1500;
$sqlbefehl="SELECT expire,username,id,online,logintime FROM $tab_user where expire >= '$momentan' order by expire";
$result=mysql_query($sqlbefehl,$serverid);
while($useron=mysql_fetch_array($result))
{
$online_seit=date("d.m.Y - H:i",$useron[logintime]);
echo" $useron[username] - $online_seit - $useron[online] ";
}

 

Hat jemand vielleicht eine lösung - wie es schneller - und vielleicht sogar einfacher geht?!

Achja - bevor ich es vergesse - damit ist gleichzeitig die Anzeige - wo der User sich gerade befindet verbunden.

Sollte ich beides zusammen durchführen?!

Weil die expiretime braucht ja noral nicht mit jedem klick erneuert werden... Ist ja "ausbremsend" für DB oder meine ich das nur?!


Kann das - oder meine ich das nur?


Danke im voraus! MFG Benji!

Share this post


Link to post
Share on other sites

Die expiretime würde ich vielleicht alle 3 - 10 Minuten prüfen. Damit drüftest du kaum die DB belastet, weil es ja nur eine Abfrage ist bzw. eine lesende und eine schreibende.


An sich habe ich von dem Thema aber nicht so die Ahnung, weil ich es bisher nicht brauchte. Schaue dir doch aber mal verschiedene Skripts an vom Powie. Ich sehe das du mit der $tab_user arbeitest, daher.



Was mir noch aufgefallen ist

 

Select * from $tab_user where uin='$_SESSION[uIN]' And uin  ''

 

Der Wert der Spalte kann nur eines einnehmen als Wert. Entweder er ist leer oder er hat $_SESSION[uIN] drin. Du sagst aber, er darf nicht leer sein und er muss das $_SESSION[uIN] drin haben. Die erste Bedingung schließt die Zweite mit ein, kann also raus.


Weiterhin solltest du nur das selektieren, was du auch benutzt. Also kein *, sondern hier wäre es beispielsweise id. Macht sich bei sehr vielen Datensätzen (~ 1000) und das vielleicht noch bei 10 Usern gleichzeitig bemerkbar. Nur so als Tip, dürfte aber bei dir nicht so ins Gewicht fallen. Hier könnte man auch statt mysql_fetch_array, lieber mysql_fetch_row nehmen. (Die Doku sagt warum :) )



Grüße

Share this post


Link to post
Share on other sites

Zu dem $tab_user... Habe mit den Script von Powie damals PHP gelernt. Daran könnte das liegen :-o


Danke - das habe ich irgendwie völlig übersehen - das ich die möglichkeit - der nicht vorhandenen Session mit einbegreife...

Das mit dem selektieren habe ich gerade schon geändert - weil ich es jetzt beim posten des Threads sah...



Und zu der Sache - alle 3-10 minuten ändern - das wollte ich ja auch machen - in der Session einfach die letzte Aktualisierung eintragen - und das alles dann mit einer kleinen IF Abfrage abfangen - und erst nach 5-10 minuten einen neuen eintrag in die DB machen lassen - aber ann sehe ich nicht - wo sich der User innerhalb der 10 minuten auf der Seite bewegt...


Danke aber schon mal für die infos!

Share this post


Link to post
Share on other sites
Zu dem $tab_user... Habe mit den Script von Powie damals PHP gelernt. Daran könnte das liegen :-o


Jo, das war auch meine erste Anlaufstelle bei Problemen, direkt in der Anfangszeit bei mir.


aber ann sehe ich nicht - wo sich der User innerhalb der 10 minuten auf der Seite bewegt...


Willst du ne Sicherheitssoftware schreiben? Wenn das denn so wichtig ist, dann setze einfach den Interval auf 5 Minuten. Jeder normale User ist länger als 5 Minuten auf einer Seite. Und wenn einer nur 2 Minuten auf A ist und den Rest auf B, das ist doch nun völlig egal oder? :)


Weißt du schon, wie du die aktuelle Position abfragst?

Share this post


Link to post
Share on other sites

Die Aktuelle Position des Benutzers speicher ich in der DB ab - und zu den jewiligen Seiten gibt es später noch ein array worin dann die seiten kürzel mit dem richtigen Seitentext ist...


(Auch um dem Benutzer anzuzeigen - wo er sich gerade befindet.)


Das der User in der regel länger wie 5 minuten auf einer seite ist - stimmt schon - nur bei der Seite kann es sein - das die benutzer viel hin und her switchen...


Es ist keine Sicherheitssoftware :-) Aber trotzdem möchte ich als Admin so einen ungefähren überblick darüber haben - wo sich die User meiner Seite momentan befinden... (Unter umständen soll es auch der fehleranalyse und sicherheitsproblemen dienen. Aber da muss ich noch schauen - das ich momentan nicht so akut...


Als ich damals meine erste Seite erstellt habe - habe ich alle scripts von Powie genutzt gehabt - (Matchmaker- news-forum-gb etc...)

Und da es da mit den erweiterungen noch nicht so war wie jetzt - und meiner meinung nach noch einige funktionen fehlten - habe ich mich selber ran gesetzt - und alles gebastelt was ich haben musste - und bin dann so zu PHP gekommen...

Dadurch das die script so übersichtlich waren - war es ein leichtes - den Grundsatz zu verstehen! THX @ Powie!!!

Share this post


Link to post
Share on other sites

Was du auch machen könntest, wäre das ständige Speichern der expiretime und des Standortes in der Session. Nach jedem Aufruf der Seite wird dies darin abgelegt. Dann könntest du ein sehr detailiertes Bild (Wann war wer wo?) bekommen, aber deine DB nicht belassten. Nach dem Intervalende von bspw. 5 Minuten, schreibst dus dann in die Datenbank. Wenn es eher dir als Admin dienen soll, dann schreibst du die Schritte deiner User nur dorthin, wos nur du siehst. Den aktuellen Standord gibst dann halt in einem öffentlichen Bereich aus.



Dadurch das die script so übersichtlich waren - war es ein leichtes - den Grundsatz zu verstehen!


Dem kann ich nicht zustimmen. Ich habe gerade mit der Galerie und vorher mit dem pUser (Usermanagement) zu tun gehabt und es war streckenweise bockschwer, da durchzusehen. Verdrehung von HTML, PHP, JS, SQL. Wir kennen ja die Anschuldigungen ... :-D . Aber hat man sich erstmal durch den Code gebissen, kann man so gut wie alles verstehen, was mit PHP zu tun hat. :-o

Share this post


Link to post
Share on other sites
Original von k00ni Was mir noch aufgefallen ist

 

Select * from $tab_user where uin='$_SESSION[uIN]' And uin  ''

 

Der Wert der Spalte kann nur eines einnehmen als Wert. Entweder er ist leer oder er hat $_SESSION[uIN] drin. Du sagst aber, er darf nicht leer sein und er muss das $_SESSION[uIN] drin haben. Die erste Bedingung schließt die Zweite mit ein, kann also raus.

Und was machst du wenn $_SESSION['UIN'] nicht gesetzt ist?

Für genau den Fall ist das uin '' gedacht ;-)


Powies Code ist (auch wenn tlw. von der Struktur unübersichtlich) für Anfänger meiner Meinung nach sehr einfach zu verstehn.

Der Großteil passiert der Reihe nach, es wird was aus der DB geholt und auch gleich angezeigt.

Für jemand der sich noch nicht mit PHP&Co beschäftigt hat ist das wesentlich einfacher zu verstehn als anders.

Share this post


Link to post
Share on other sites
Und was machst du wenn $_SESSION['UIN'] nicht gesetzt ist?

Für genau den Fall ist das uin '' gedacht



Dann wirkt die Bedingung aber nicht, das heißt sie wird falsch. Denn es ist eine UND-Verknüpfung. Entweder alles oder nichts. Oder übersehe ich da was?


[edit]Noch was. Da es hier ja um eine Art Authentifizierung geht, ist es wichtig, dass man nur einen eindeutigen Wert hat. (Wird ja später auch nur von einem ausgegangen bei dem mysql_num_rows) Deshalb würde ich nur die UIN abfragen, auch wenn sie leer ist ( '' ), dann wäre die Abfrage trotzdem richtig, wenn man das uin '' rausnimmt.[/edit]

Share this post


Link to post
Share on other sites

Wenn ich es jetzt so richtig verstehe ist das

Select * from $tab_user where uin='$_SESSION[uIN]' And uin  '' 

damit dnur was aus der DB ausgelesen wird - wenn auch wirklich was in der session drinne steht...


Fuer den fall, das sich ein benutzer registriert hat - und jemand sich genau in diesem moment einlogt - und diese abfrage ausgeführt werden wuerde (in diesem Moment sind die SessionUIN und die UIN in der DB leer) nicht zu verwechslungen kommt...


Sonst würde er unter umständen bei dem User der sich gerade eingelogt hat - während des logins eines anderen benutzers den Frisch regsitrierten eine Expire time zuordnen... Verstehe ich das richtig...


Habs vielleicht bissle verkorkst geschrieben... sry... :-o

Share this post


Link to post
Share on other sites

Diese Chance ist zwar sehr gering, aber möglich. Dies könntest du mit einer zusätzlichen Angabe, wie beispielsweise der User-ID umgehen. Dann hast du nämlich eine Eindeutigkeit.


Anbei, ist das deine User-Authentifikation? Fragst du nur die UIN ab? Schon etwas dünn oder? (Je nachdem, wie du voher den User identifizierst.)



Grüße

Share this post


Link to post
Share on other sites

Wenn der User noch nie eingeloggt war dann ist die Spalte uin leer ...

Denk mal drüber nach was ohne dem 2ten Teil passieren kann ... gibt auch min. einen Thread zu dem Problem was du dann hast ;-)

Share this post


Link to post
Share on other sites
Wenn der User noch nie eingeloggt war dann ist die Spalte uin leer ...


Aber wenn die Spalte leer ist, dann geht doch auch die Abfrage mit der Und-Verknüpfung nicht. Schon der erste Teil uin='$_SESSION[uIN]' führt doch zu einem Abbruch. Und der zweite Teil uin'' wird ebenfalls nicht erfüllt, denn er sagt ja aus, dass er nicht leer sein darf.


Denk mal drüber nach was ohne dem 2ten Teil passieren kann ... gibt auch min. einen Thread zu dem Problem was du dann hast


Das hatte der BergBenji glaub ich schon angesprochen, wenn es das ist, was du meinst. Ich würde dies, wie gesagt, mit einem weiteren Feld kombinieren, beispielsweise der User-ID.

Share this post


Link to post
Share on other sites

Die Authentifizierung läuft wie folgt:

if ($_POST['action'] == "Einlogen" or $ptloginuin != "") {
$username =addslashes($_POST['username']);
$pwd      =addslashes($_POST['pwd']);
   if($_POST['action'] != "Einlogen") {
       $sqlbefehl= "Select * from $tab_user Where uin='$ptloginuin'";
   } else {
       $sqlbefehl= "Select * from $tab_user where username='$username' and pwd=password('$pwd')";
      // $sqlbefehl= "Select * from $tab_user where username = '$username' and pwd = '$pwd'";
   }
   $ergebnis  = mysql_query($sqlbefehl, $serverid);
   if ( mysql_num_rows($ergebnis) == 1 ) {
       $user = mysql_fetch_array ($ergebnis);
       if ( $user['uin'] == "" ) {
           srand((double)microtime()*1000000);
           $UIN = md5(uniqid(rand()));
           $_SESSION['UIN'] = $UIN;
           $_SESSION['acclvl'] = $user[policylvl];
           $_SESSION['userid'] = $user[id];
           $_SESSION['nickname']=$user[username];
           $sqlbefehl= "update $tab_user set uin='$UIN',logintime='$zeit', online='$site' where id = $user[id]";
           mysql_query($sqlbefehl, $serverid);
       } else {
           $sqlbefehl= "update $tab_user set logintime='$zeit',online='$site' where id = $user[id]";
           mysql_query($sqlbefehl, $serverid);
           $UIN = $user['uin'];
           $_SESSION['UIN'] = $UIN;
           $_SESSION['acclvl'] = $user[policylvl];
           $_SESSION['userid'] = $user[id];
           $_SESSION['nickname']=$user[username];

 

Eigentlich nichts unbekanntes :-)

Habe es insoweit an meine bedürfnisse angepasst...


Warum soll man das Rad neu erfinden - wenn es schon Rund läuft?!


Muss es aber noch ein bisschen im bezug auf Datenuebergabe Sicherheit anpassen (Thema POST / GET)


Also das mit der Session... Habe es nun einfach mal Mit dieser abfrage laufen lassen und mal ohne - wirklich einbusen sind nicht spürbar... Vielleicht ja erst bei grosser anzahl von Benutzern... Mal sehen...


Danke aber fuer die Rege beteiligung!!!

Share this post


Link to post
Share on other sites
Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...