Logo - MyWebsolution.de
User gesamt  :  2400216
User online  :  4
KubaSeoTräume, PHP Forum, PHP Community and more ... MyWebsolution.de!
   
   
 
Registrieren Login User F.A.Q Suche Home

eingeloggt bleiben

MyWebsolution.de Foren » Workshops » Autologout

Seite: 1 2  > Posts pro Seite: 5 10 20
Autor Thread
23.03.2009 00:14 Uhr Autologout
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
hallo,

habe mich jetzt mit dem workshop eingehend befasst und ich muß sagen. Hervorragend!
Trotzdem komm ich mit einem, nämlich dem Autologout, nicht so ganz klar.
Ich habe das Script bei mir eingebaut und funktioniert soweit auch wunderbar. Allerdings nur wenn ich die if-Anweisung -->Online Status der User aktualisieren weg lasse. Versteh ich das richtig das bei klick auf irgendwas die DB mit dem Feld "letzet_aktion" akualisert wird und dann gleich anschließend geprüft wird (User ohne Autologin ausloggen) ob der User 20 Minuten nicht aktiv war. Entweder hab ich da einen totalen "Wurm" im Kopf oder aber an dem Script stimmt was nicht, weil ein Script das vor ein paar Sekunden (letzte_aktion in DB) aktualisiert wurde, doch niemals die anschließend folgende 20 Minuten Bedingung erfüllen kann. Meine Denkweise ich muß ja irgendwas anklicken um eine Seite mit dem Script autologout zu starten, weil sich ja sonst das php (wenn es einmal durchlaufen wurde) nicht von selbst noch einmal startet.
Wo hab ich da den Denkfehler oder woran liegt das sonst? Ich poste mal vorsichtig mein Script, weils etwas lang ist hoffe ich das sich niemand drüber auffregt hier:-)

PHP:
    
<?php

       error_reporting
(E_ALL);
    
    
session_start();


                  
// eindeutigen Benutzernamen anhand von Session wählen
                  
$username $_SESSION['username']; 
                   
                  
    
$MYSQL_HOST 'xxxxxx';
    
$MYSQL_USER 'xxxxxx';
    
$MYSQL_PASS 'xxxxxx';
    
$MYSQL_DATA 'xxxxxx';

    
$connid mysql_connect($MYSQL_HOST$MYSQL_USER$MYSQL_PASS) OR die("Error: ".mysql_error());
    
mysql_select_db($MYSQL_DATA) OR die("Error: ".mysql_error());
    
    
//   ##### automatischer Logout  -  ANFANG     - Einbau in JEDE SEITE  !!!!
    
    
        // 1. Prüfen, ob ein Autologin des Users stattfinden muss
            // Dies Prüfung ist für User mit aktiviertem autologin
            // wenn sie sich nicht ausgelogt haben wird ihre Session ja   
                        // zerstörrt,
            // also wird nach einem gesetzten Cookie gesucht und die   
                        // Session (falls Cookie vorhanden)
            // wieder gestartet
            
    
if(isset($_COOKIE['autologin']) AND !isset($_SESSION['UserID'])){
        
$sql "SELECT
                        id
                FROM
                        xxxxx
                WHERE
                        autologin = '"
.mysql_real_escape_string($_COOKIE['autologin'])."'
               "
;
        
$result mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        
$row mysql_fetch_assoc($result);
        if(
mysql_num_rows($result) == 1)
            
doLogin($row['id'], '1');
    } 
    
    
        
// 2. Online Status der User aktualisieren - Prüfung über letzte_aktion 
                //    ob ein User aktiv ist
            
if(isset($_SESSION['UserID'])){
            
                    
$sql "UPDATE
                                xxxxxx
                        SET
                                letzte_aktion = '"
.time()."'
                        WHERE
                                id = '"
.$_SESSION['UserID']."'
               "
;
               
        
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
    }     
    
    
        
// 3. User ohne Autologin ausloggen
                // wird nach 20 Minuten automatisch ausgeloggt, aber 
                                // nur wenn autologin nicht 
                // aktiviert wurde - Im Test sind nur 2 Minuten 
                                // eingestellt!
                
                
$sql "UPDATE
                                    xxxxxxx
                SET
                                    session_id = NULL,
                                    autologin = NULL,
                                    ip = NULL
                                WHERE

                    '"
.(time()-60*2)."' > letzte_aktion AND
                    autologin IS NULL
           "
;
    
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());     
    
    
        
// 4. Kontrollieren, ob ein automatisch ausgeloggter User noch eine 
                //    gültige Session besitzt
                // Sessions besitzen eine Lebensdauer von 24 Minuten, 
                                // kann also sein das trotzdem 
                // noch eine Session besteht. Deswegen erfolgt diese 
                                // Prüfung
                
    
if(isset($_SESSION['UserID'])){
        
$sql "SELECT
                        session_id
                FROM
                        xxxxx
                WHERE
                        id = '"
.$_SESSION['UserID']."'
               "
;
        
$result mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        
$row mysql_fetch_assoc($result);
        if(!
$row['session_id']){
        
$_SESSION = array();
            
session_destroy();
        }
    }     
    
    
//   ##### automatischer Logout  -  Ende     - Einbau in JEDE SEITE  !!!!

?>


Wäre nett wenn mir jemand hier etwas helfen könnte. Evtl. hab ich ja auch nur einen gravierenden Denkfehler, irgendwo.....
Falls ich irgendwie, irgendwas irgendwo falsch gepostet habe oder so. Dann bitte ich um viel SORRY. Bin neu hier:-)

gruessle

strolch_007

Dieser Beitrag wurde am 23.03.2009 um 00:20:59 Uhr von strolch_007 zum 5. Mal editiert.
Profil ansehen
23.03.2009 10:19 Uhr
Flitze
Administrator
registriert 17.10.2006
wohnt in Eschwege
Beiträge 332
Hey Strolch,
diese Methode mit dem "Skript bei jedem Seitenaufruf laden" ersetzt quasi CronJobs, also zeitgesteuerte Skripte, da diese nicht von jedem Hoster angeboten werden.
Das Ganze funktioniert nur, wenn du schon ein paar Besucher auf deiner Seite hast, denn stell dir vor, du bist eingeloggt und machst 25 minuten nichts. In dieser Zeit kommt ein anderer User auf deine Seite ==> Das Skript zum ausloggen wird ausgeführt und wird dich, da du ja bereits seit 25 minuten inaktiv bist, ausloggen.
Wenn du der alleinige Benutzer deiner Seite bist dann funzt das leider nicht.. gibt aber dann ohne Cronjobs auch keine andere Möglichkeit, sowas zu realisieren ;)

Viele Grüße


Profil ansehen Mail senden
23.03.2009 22:41 Uhr Autologout
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
Hallo,

danke für die schnelle Antwort! Also kann ich meine "Denke" und Sorgen über Bord werfen. Bin nämlich dann genau in die "Falle" mit nur einem User (zum Testen) getappt. - Und da funktioniert es dann natürlich nicht. Jetzt wo du das so anschaulich schreibst versteh ich das sogar und erscheint mir auch extrem logisch. Hab mir das (fast) gedacht das das als Ersatz für Cronjobs dient. :-) Ist einer der Gründe warum ich mich da so richtig rein gekniet habe um das zu verstehen, weil ich nicht so ein ganz doller Freund von Cronjobs bin (ohne jetzt hier eine Diskussion über Sinn- oder Unsinn von Cronjobs lostreten zu wollen).
Habe mir da aber noch einen Gedanken drüber gemacht. Wenn nun jemand auf meine Seite klickt und ich werde ausgeloggt. Dann steh ich ja weiter auf dieser Seite rum (irgendwo im Innenbereich). Ich mcöhte aber gerne, wenn ich dann als ausgeloggter User zu dem Entschluss komme, z. B. nachdem ich gemütlich meine Bratkartoffeln gegessen habe, wieder online zu gehen. Funktionert das dann ja nicht mehr. Sprich ich muß mich neu einloggen. Ist es nun machbar wenn ich irgendwo auf der Seite was rumklicke dass ich automatisch auf die Loginseite "verwiesen" werde, sprich die Loginseite erscheint bei klick.
Habe das bis jetzt immer mit

PHP:


<?php
.
.
header('Location: http://..und ab zur Loginseite');
.
.
?>

gelöst. Bin mir aber nicht sicher ob das hier sinnvoll ist und überhaupt klappt. Wie gesagt testen ist sehr eingeschränkt, weil ich nur einen User habe.

Gruss
strolch_007
Profil ansehen
24.03.2009 17:36 Uhr
Flitze
Administrator
registriert 17.10.2006
wohnt in Eschwege
Beiträge 332
Zitat:
Wie gesagt testen ist sehr eingeschränkt, weil ich nur einen User habe.

Benutz 2 Browser. Dann werden nämlich auch 2 Sessions erzeugt und du kannst nen bisschen rumtesten ;)

Generell solltes so funktionieren, wie du schreibst. Sofern sich der User grad in nem Bereich aufhält, in dem ein Login erfoderlich ist. Kanns dann mittels
PHP:
<?php
if (isset($_SESSION['UserID']))
?>

prüfen, ob derjenige noch eingeloggt ist und dann mit dem header() weiterleiten.


Profil ansehen Mail senden
27.03.2009 06:54 Uhr
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
hallo,

also das mit dem

PHP:
<?php
if (isset($_SESSION['UserID']))
?> 


habe ich so gelöst das ich (isset verlangt ja onlne-user!, ich will ja reagieren wenn er eben nicht mehr online ist = automatische Logout) einfach direkt nach session_destroy den header.... eingegeben habe. Hab ja ganz übersehen das der User ja eindeutig identifiziert wurde. Drum meine Eingangsbedenken. Wer lesen kann ist klar im Vorteil. Hätt mir die Frage fast sparen können:-)
So "fliegt" der User automatisch bei überschreiten der voreingestellten Zeitabfrage auf eine Seite "Aus Sicherheitsgründen wurden Sie automatisch ausgeloggt." Ansonsten funktionier alles einwandfrei. Naja ein User bleibt bei mir IMMER online. Warum das so ist weiß ich nicht. Stört aber jetzt auch nicht so unbedingt. Einer muß ja die Stellung halten:-)

Wollte dann noch was einbauen und dachte des geht ja ganz flott weil ich ähnliches schon gemacht habe. Aber "Pustekuchen":-)
Ich habe die Userliste etwas "mibraucht und daraus eine Onlinstatusanzeige für jeden User gebastelt. Ist ja mehr oder weniger nur die echos aus den Diensten zu entlassen:-)
Auch das geht einwandfrei solange ich "nur" onlie oder eben offline verwende. Möchte ich jetzt aber z.B. mittels

Code:
      

<form>
 <select name="user_status" id="user_status">
                        
             <option value="0" selected="selected">online</option>
             <option value="beschäftigt" <?php if(isset($_POST['user_status']) AND $_POST['user_status'] == 'beschäftigt') echo ' selected'; ?>>beschäftigt</option>
             <option value="bin gleich zurück" <?php if(isset($_POST['user_status']) AND $_POST['user_status'] == 'bin gleich zurück') echo ' selected'; ?>>bin gleich zurück</option>
                                            
                       		</select></td> 
                             
       <input name="ok" type="submit" value="ok" style="height:22px; padding: 0px;" />

                </form>


die Abfrage erweitern tun sich gleich mehrere Probleme auf. Wie ist es machbar das z.B. das angecklickte "beschäftigt" über alle Seiten erhalten bleibt und die Schrift sich z.B. in orange ändert. Nur eine Zeile dazu schreiben mit den entsprechenden Änderungen reicht ja hier bei weitem nicht.
Bei "nur" Formular neu laden wäre das ja kein Problem. Wie bringe ich das gesetzte online auch ins select rein und kann aus dem select (sprich mit den da vorgenommenen Änderungen auf den Onlinestatus direkt zugreifen?
Es gibt also mehrere Seiten auf denen man "rumwandern" kann (interner = eingeloggter Bereich, ist ja wohl meisten so:) ) und auf allen Seiten soll dann das (egal in welcher Seite die Änderung vorgenommen wurde) in select angeklickte (z.B "beschäftigt";) angezeigt werden und die Änderung des Status in $olnine ebenfalls auf allen Seiten erhalten bleiben. Seitenaufbau ist bei mir so das ganz oben das PHP steht und dann nach <Doctype....> der XHTMLl Teil kommt.
Die online/ offline Anzeige klappt ja bei mir ausnahmslos gut.

Gruss

strolch_007

Dieser Beitrag wurde am 27.03.2009 um 07:11:13 Uhr von strolch_007 zum 4. Mal editiert.
Profil ansehen
27.03.2009 10:29 Uhr
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
Hab das Problem weitgehend gelöst, nur das mit der "Mitnahme" des eingestellten selects auf andere Seiten bekomme ich nicht hin. Weiß da jemand wie das geht?

Gruss

strolch_007
Profil ansehen
28.03.2009 13:10 Uhr
Flitze
Administrator
registriert 17.10.2006
wohnt in Eschwege
Beiträge 332
naja packs doch einfach mit in die Sessions

$_SESSION['user_status'] = "beschäftigt";


Profil ansehen Mail senden
31.03.2009 04:13 Uhr
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
Hallo,

ich habe da jetzt alles mit php und mehr oder weniger umfangreichen if Anweisungn gelöst. Klappt zu 100% finds aber extrem aufwändig. Mit in eine Session packen funktioniert nur bedingt, wegen der Startseite!
Vielleicht könnte ich da mal ein Ergänzungsscript zu der Seite im Workshop posten. Online-Status der User anzeigen. Is ne recht schicke Sache, wie ich finde. Gibt ja hier so einen Bereich um Scripte zu posten. Allerdings wirds da sicher eine bedeutend kürzere Lösung geben als die Meine.

Mir ist etwas bei dem Script aufgefallen bzw. hat mich stark beschäftigt, weil ich zu keiner Lösung gekommen bin (bis jetzt). Da probier ich schon seit Tagen dran rum.
Irgendwie kann ich nicht nachvollziehen warum z. B. die "letzte_aktion" in einem INT in der DB abgespeichert wurde. Dadurch gehen doch (wenn ich Mysql richtig verstanden habe) sämtliche Vorteile die eine DB so bietet in Beziehung zu Zeitabfragen flöten. Ich habe nämlich eine simple Abfrage sortiert nach Männern oder Frauen unter Berücksichtigung der letzten Aktivität abfragen wollen (ähnlich wie die angebotene Userliste). Konkret sind 3 User bei mir jetzt angemeldet. So jetzt möchte ich raus filtern wer länger als 20 Minuten nicht online war und draus eine Anzeige x Männer online, x Frauen online und Gesamt online. Mysql würde da mit

PHP:
$sql = "SELECT COUNT(anrede) FROM xxxxx WHERE anrede = 'Frau' AND letzte_aktion < DATE_SUB(NOW(), INTERVAL 20 MINUTE


arbeiten. Das auch noch für Männer und Gesamt verpackt und batsch alles wird gut. Nun habe ich aber ein INT Feld in der DB stehen und alles ist auf dieses Feld ausgerichtet.
Somit funktioniert diese Anweisung logischerweise nicht. - Und einfach mal schnell ändern in timestamp oder Datetime is nicht.
Also muß ich das wohl doch wieder über viele PHP Anweisungen basteln, oder gibts da irgend einen Geheimtipp den ich nicht kenne?:-)
Mir schwant das ich da die Liste der User-online umschreiben muss und mit count abfragen, dann Männer und Frauen noch irgendwie raus wurschteln, weil es ja um die Anzahl geht. :-)
Eines muß ich aber trotzdem sagen. Das Script arbeitet (soweit ich das bis jetzt beurteilen kann) sehr zuverlässig. - Und das ist ja wohl das Wichtigste.

Gruss
strolch_007

Dieser Beitrag wurde am 31.03.2009 um 04:26:33 Uhr von strolch_007 zum 4. Mal editiert.
Profil ansehen
31.03.2009 09:06 Uhr
Flitze
Administrator
registriert 17.10.2006
wohnt in Eschwege
Beiträge 332
Ja, man könnte genausogut mit DATETIME als Felddeklakration und NOW() als Wert arbeiten, wäre egal ;)
Ich hab beide Varianten gesehen und ausprobiert, ich seh weder Vor- noch Nachteile und würdes als persönliche Präferenz bezeichnen :D


PHP:
<?php
$sql 
"SELECT COUNT(anrede) 
FROM xxxxx 
WHERE anrede = 'Frau' 
AND letzte_aktion > "
.time()-20*60."
"
;
?>

also für mich ist das genau eine PHP Anweisung :rolleyes:


Profil ansehen Mail senden
01.04.2009 06:51 Uhr
strolch_007
Forenuser
 
registriert 16.03.2009
wohnt in
Beiträge 40
hallo,

ist ein schöner SELECT Befehl (kannte ich so gar nicht), nur leider zeigt er bei mir nach wie vor 2 Frauen 1 Mann und gesamt 3 an. Irgendwie will er die Zeit bei mir nicht berücksichtigen, obwohl ich jetzt alles mögliche getestet habe (INT in der DB wurde nicht verändert, Ist als INT(11) drin, viel. auf 14 ändern?). Die Ausgabe aus dem SELECT heraus ist und bleibt ohne Berücksichtigung der Zeit. Komisch das ich das mit der Zeit jetzt einfach nicht hin bekomme. Hab sogar das Feld letzte_aktion ausgelesen und getestet. Alles ok mit der Zeit die da drin steht!

PHP:
    // Abfrage wieviel Frauen in den letzten 20 Minuten aktiv waren und somit als online gewertet 
    // werden    
        $sql = "SELECT COUNT(anrede) FROM user_daten WHERE anrede = 'Frau' AND letzte_aktion > '.time() -20*60.'" ;

           $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        $row = mysql_fetch_row($result);
           $wife_online = $row[0];


Er liefert mir immer die Zahl 2 (bei Frauen, nämlich die registrierten). Bei num_rows...immer eine 1 bei allen dreien...array, assoc, und object gehen hier ja nicht, weil als Ausgabe Array angezeigt wird. Eine if Anweisung oder while Schleife wäre ja überflüssig, wenn ich das richitg sehe. Der SELECT sollte ja bereits den richtigen Wert liefern. Will er aber nicht:-)
Ach und bzgl Datetime oder INT - na gut dann schließ ich mich einfach mal der persönlichen Präferenz an. Ehrlich gesagt mag ich auch gar nicht an einem Script rumfingern, das wunderbar funktioniert.
Ich seh jetzt auch immer mehr die Vorteile alles mit echo zu machen gegenüber meinem...Muss aufpassen wie ein Schießhund, weil sonst hauts mir die undefinierten Variablen nur so um die Ohren. Das Problem gibts bei deinem Script schon mal nicht.
Wenn man aber so im Internet liest raten die meisten davon ab alles in PHP zu schreiben. Naja ich habe gelernt und sehe es mittlerweile etwas anders. So jetzt ist die Nacht auch wieder rum.
Einen guten morgen wünsch ich mal

Gruss
strolch_007
Profil ansehen
Seite: 1 2  > no reply
Powered by Pascal Landau © 2006 MyWebsolution.de
Designed by Pascal Landau © 2006 MyWebsolution.de
 
 
 
 
Home Email Impressum Disclaimer Statistik