kostenloser Webspace werbefrei: lima-city


Offline setzen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    n********r

    Hi,

    ich bin gerade dabei ein eigenes Forum zuprogrammieren was wauch sehr gut klappt. Ich habe nur jetzt ein Problem. Ich habe eine Tabelle, o jeder User eingeschrieben wird, der sich einloggt und dann ausgeben wird, wenn er online ist. Wenn er sich ausloggt dann wird sein Eintrag gel?scht. Es gibt ja aber auch User, die es nicht machen, die einfach das Browser Fenster schlie?en und dann weg sind.
    Jetzt will ich einen Script schreiben, der nach 20 Minuten alle User die seit 20 Minuten nichts mehr geschrieben haben oder ebsser gesagt inaktiv waren aus der DB gel?scht werden.

    Jetzt ist nur meine Frage, wie mein Script dazu aussehen muss, damit er die jeweiliegn User l?scht?

    Danke f?r Hilfe...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. k**********e

    ganz einfach, du speichert in der tabele den namen und den timestemp von der letzten action.

    beim aufruf jeder seite ?berpr?fst du die timestamps in der tabele
    alle die l?nger als xy minuten inativ waren/sind werden gel?scht.

    kleines beispiel:
    //das ist die tabelle
    username,lastact
    doro,1132566224
    lilly,1132565650
    kitty,1132565070


    //als erstes wird der timestemp vom activen user upgedatet:
    $user = $_SESSION['user'];
    $time = time() + (20*60); //jetzt plus 20 minuten
    
    $sql = sprintf("UPDATE tabelle SET lastact = %d 
    WHERE username = '%s' LIMIT 1", $time, $user);
    mysql_query($sql);
    
    // danach werden die inactiven gel?scht:
    $sql = sprintf("DELETE FROM tabelle WHERE lastact < %d", time());
    //l?schen wenn lastact kleiner als time, da wir bei lastact 20 min dazugerechnet haben.
    mysql_query($sql);
  4. bei jeder Aktion eines Users schreibst du einfach einen Timesstamp in die Tabelle.
    Und jedesmal, wenn jemand sich die User-online Tabelle anschaut, dann werden alle Datens?tze gel?scht, die einen Veralteteten Timesstamp haben.

    Also, login
    -->INSERT INTO onlinelist(user,zeit,aktion)VALUES($user_id,date(U),"loggt sich ein");

    Irgendeine Aktion im Forum
    -->Update onlinelist SET zeit=date(U), SET aktion=" schaut sich gerade $threadid an"

    ausloggen
    -->Delete FROM onlinelist WHERE user=$user_id
    -->Update users SET session=0 //oder wie du das auch immer machen magst mit Sessions

    inaktiv-ausloggen
    -->SELECT user FROM onlinelist WHERE zeit+(3600*20)>date(U)
    mit den Ergebnissen der Queries-->DELETE FROM onlinelist WHERE user_id=$user_kick[0] OR user_id=$user_kick[1] ...
    -->UPDATE users SET session=0 WHERE user_id=$user_kick[0] OR user_id=$user_kick[1] ...

    Ich hoffe das ist in etwa so klar. Habe es nicht ausprobiert, sollte dir aber einen Ansatz geben, wie sowas funzt.
  5. k**********e

    @bladehunter..
    du h?ttest es testen sollen, denn da sind einige fehler drin:

    irgendeine Aktion im Forum
    -->Update onlinelist SET zeit=date(U), SET aktion=" schaut sich gerade $threadid an"

    cool... hiernach schuen sich ALLE user grade thread xy an da fehlt das WHERE user = $user_id

    Update users SET session=0
    hier werden wieder alle user auf offline gesetzt^^ wieder fehlt das WHERE user = $user_id
    au?erdem eine schlechte idee, da ich vllt 20 min nichts mache, aber trotzdem mich nicht wieder einloggen m?chte (als benutzer)
    eingeloggt sein und activ sein sind imo 2 verschiedene paar schuhe.

    SELECT user FROM onlinelist WHERE zeit+(3600*20)>date(U)
    wow 20 stunden??? ?hm ich w?rd sagen dir ist da ein denkfehler unterlaufen 60 secunden * 60 minuten sind 1 stunde(3600 sec) mal 20 sind 20 stunden... und dann noch wenn zeit + 20 stunden gr??er als jetzt das trifft dann auf alle zu, au?er es war l?nger als 20 stunden keiner auf der seite, und dann beiben die inactiven als active da, und die activen werden gel?scht^^
    also SELECT user FROM onlinelist WHERE zeit+(60*20) < date(U)
  6. Autor dieses Themas

    n********r


    [b]$sql = sprintf("UPDATE tabelle SET lastact = %d 
    WHERE username = '%s' LIMIT 1", $time, $user);
    mysql_query($sql);[/b]



    Wof?r benutzt du hier genau das LIMIT 1
  7. k**********e

    n tick von mir. eigentlich sollten die namen nur einmal in der tabelle vor kommen... da ich aber nur eine spalte updaten will gebe ich automatisch ein LIMIT 1 mit...
    psyhologisch habe ich das gef?hl es ist schneller^^
  8. Autor dieses Themas

    n********r

    Achso alles klar.

    Dann noch eine Frage, wie kann ich es machen mit G?sten?

    Kann ich dann auch sagen jeder der die Seite Aufruft wird als Gast gespeichert.
    Wenn er sich einloggt wird er aus der DB gel?scht wo er als Gast eingetragen ist.
    Und sonst wird er auch nach 20 minuten gel?scht wenn er nichts gemacht hat?

    Geht es sowas?
  9. k**********e

    du machst eine zweite tabelle f?r g?ste
    und benutzt session.

    am anfang eine session starten werte vergeben (das wei?t du alles bestimmt)
    du vergibst jeden gast eine unique_id

    gespeichert wird der time stamp + unique_id in eine gast-tabelle

    wenn der user sich einlogt wird er in die 'richtige' online anzeige gesetzt + timestamp anhand der unique_id wir der gast-eintrag gel?scht.

    da g?ste keinen namen haben reicht ja eine anzeige a la es sind xy G?ste online aus.

    braucht du da ein genaues beispiel?
  10. Autor dieses Themas

    n********r

    Nein danke das reicht vollkommen
  11. Autor dieses Themas

    n********r

    Sio das habe ich benutzt f?r die G?ste:

    <?php
        $sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    online
                WHERE
                    IP = '".$_SERVER['REMOTE_ADDR']."'";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
        if($row['Anzahl']) {
            // Nur Datum Updaten
            $sql = "UPDATE
                        online
                    SET
                        Datum = NOW()
                    WHERE
                        IP = '".$_SERVER['REMOTE_ADDR']."'";
            mysql_query($sql) OR die(mysql_error());
        } else {
            // Neuer eintra
            $sql = "INSERT INTO online
                        (IP, Datum)
                    VALUES
                        ('".$_SERVER['REMOTE_ADDR']."', NOW())";
            mysql_query($sql) OR die(mysql_error());
        }
    
        // alte Datens?tze l?schen
        $sql = "DELETE FROM
                    online
                WHERE
                    DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum";
        mysql_query($sql) OR die(mysql_error());
    
        // Anzahl Ausgeben
        $sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    online";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
    
        echo "User Online: ".$row['Anzahl']."<br />";
    ?>


    Nur wie kann ich da jetzt noch das einbauen, das f?r die Use, ich meine auch so das die Usernamen dann auch ausgeben werden?

    Beitrag ge?ndert am 21.11.2005 16:32 von newwarrior
  12. k**********e

    // Anzahl Ausgeben
    $sql = "SELECT  name FROM online";
    
    $result = mysql_query($sql) OR die(mysql_error());
    $gesamt = mysql_num_rows($result);
    $gaeste = 0;
    $namen = array();
     while( $row = mysql_fetch_assoc($result))
    {
         if($row['name'] == 'Gast')
         {
               $gaeste++;
               continue;
         } else {
                $namen[] = $row['name'];
         }
    }
    $name = implode("&nbsp;", $namen);
    echo "<p>User Online: $gesamt davon $gaeste G&auml;ste
    <br />$name</p>"


    in der annahme, dass g?ste und angemeldete in der selben tabelle stehen und geste Gast hei?en^^

  13. Autor dieses Themas

    n********r

    So ok ?berarbeitet:

    <?php
      if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"];
      else $name = "Gast";
    
        $sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    online
                WHERE
                    IP = '".$_SERVER['REMOTE_ADDR']."'";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
        if($row['Anzahl']) {
            // Nur Datum Updaten
            $sql = "UPDATE
                        online
                    SET
                        Datum = NOW()
                    WHERE
                        IP = '".$_SERVER['REMOTE_ADDR']."'";
            mysql_query($sql) OR die(mysql_error());
        } else {
            // Neuer eintra
            $sql = "INSERT INTO online
                        (IP, Datum, name)
                    VALUES
                        ('".$_SERVER['REMOTE_ADDR']."', NOW()), '".$name."'";
            mysql_query($sql) OR die(mysql_error());
        }
    
        // alte Datens?tze l?schen
        $sql = "DELETE FROM
                    online
                WHERE
                    DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum";
        mysql_query($sql) OR die(mysql_error());
    // Anzahl Ausgeben
    
    $sql = "SELECT  name FROM online";
    $result = mysql_query($sql) OR die(mysql_error());
    $gesamt = mysql_num_rows($result);
    $gaeste = 0;
    $namen = array();
    
     while( $row = mysql_fetch_assoc($result))
    {
         if($row['name'] == 'Gast')
         {
               $gaeste++;
               continue;
         } else {
               $namen[] = $row['name'];
         }
    }
    $name = implode(" ", $namen);
    echo "<p>User Online: $gesamt davon $gaeste G?ste
    <br />$name</p>"
    ?>


    Ok und das wurde ausgeben, nur leider wird es falsch ausgeben. Ich habe mich nicht eingelogt, Also m?sste 1 Gast uasgeben w?rden. W?rd es aber nicht.

    User Online: 1 davon 0 G?ste
  14. k**********e

    } else {
     // Neuer eintra
    $sql = "INSERT INTO online 
    (IP, Datum, name) 
    VALUES 
    ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')";
    
    mysql_query($sql) OR die(mysql_error());
     }


    hier h?tte er ja meckern m?ssen, da du hinter now() die ) gelassen hast anstatt sie hinter $name zu schreiben) ... gib mal bitte den link, damit ich mir die ausgabe mal angucken kann
  15. Autor dieses Themas

    n********r

    habt das ge?ndert klappt immer noch nicht hier mal duie Seite:

    http://newwarrior.milten.lima-city.de/forum/forum.php
  16. Autor dieses Themas

    n********r

    danke klappt doch
  17. Autor dieses Themas

    n********r

    Naja zu F?rh gefreut. Ich habe jetzt meine Login fertig.

    hier k?nnt ihr es testen: Password und Login sind test

    http://newwarrior.milten.lima-city.de/forum/forum.php

    Und jetzt kommen die Fehler:

    http://newwarrior.milten.lima-city.de/Unbenannt.JPG

    1. Obwohl ich als User angemeldet bin, werde ich auch als Gast gez?hlt.

    2. Selbst wenn ich ausgelogt bin, steht der bei den Namen immer noch Gast, obwohl er da nichts zusuchen hat.

    3. Wenn ein User sich einlogt wird eir zweimal ausgeben, einmal ?ber dem Div Bereich und einmal im Div Bereich.

    Hier mein Code:

    <?php
      if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"];
      else $name = 'Gast';
    
        $sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    online
                WHERE
                    IP = '".$_SERVER['REMOTE_ADDR']."'";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
        if($row['Anzahl']) {
            // Nur Datum Updaten
            $sql = "UPDATE
                        online
                    SET
                        Datum = NOW()
                    WHERE
                        IP = '".$_SERVER['REMOTE_ADDR']."'";
            mysql_query($sql) OR die(mysql_error());
    
            } else {
    
            $sql = "INSERT INTO online
                    (IP, Datum, name)
                    VALUES
                    ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')";
            mysql_query($sql) OR die(mysql_error());
                    }
    
        // alte Datens?tze l?schen
        $sql = "DELETE FROM
                    online
                WHERE
                    DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum";
        mysql_query($sql) OR die(mysql_error());
    // Anzahl Ausgeben
    
    $sql = "SELECT  name FROM online";
    $result = mysql_query($sql) OR die(mysql_error());
    $gesamt = mysql_num_rows($result);
    $gaeste = 0;
    $namen = array();
    
     while( $row = mysql_fetch_assoc($result))
    {
         if($row['name'] == 'Gast')
         {
               $gaeste++;
               continue;
         } else {
               $namen[] = $row['name'];
         }
    }
    echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b> Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b><br>Registrierte User : <b>$name</b></div>"
    ?>


    Beitrag ge?ndert am 22.11.2005 16:26 von newwarrior
  18. k**********e

    if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"];

    hier gibst du dan namenb auch aus, also brauchst du dich nicht wundern, wenn er auch ?berm div ausgegeben wird.

    wie du die l?schung des gastes vornimmst k?nnen wir nicht sehen... dazu m?sstest du dein login script zeigen. vo du den user anmeldest und den gast eintrag l?scht.


    das, wenn kein registrierter user angemeldet ist dort Gast steht, ist meine schuld. ich habe nicht dran gedacht, das die varable name ja schon f?r den namen verwendet wird...
    nimm da einfach users:
    $users = implode(" ",$namen);
    und im echo (unten bei der namens ausgabe) auch $users schreiben..

    Beitrag ge?ndert am 22.11.2005 23:21 von kirschbluete
  19. Autor dieses Themas

    n********r

    So ich habe das jetzt ge?ndert. Mir wird jetzt der Name nicht mehr ?ber dem Div Bereich angezeigt. Aber wenn ich mich einlogge steht danach auch nichts bei registriete User.
    Au?erdem ist mir aufgefallen kann mein Script wenn ?berhaupt nur 1 Namen anzeigen.
    Habe mich einmal ?ber den IE als test und ?ber den Firefox als Admin eingeloggt und es wird beim IE nur der test und beim Firefos nur der Admin angezeigt.
  20. k**********e

    // Anzahl Ausgeben
    $sql = "SELECT  name FROM online";
    $result = mysql_query($sql) OR die(mysql_error());
    $gesamt = mysql_num_rows($result);
    $gaeste = 0;
    $namen = array();
    
     while( $row = mysql_fetch_assoc($result))
    
    {
         if($row['name'] == 'Gast')
         {
               $gaeste++;
                continue;
         } else {
               $namen[] = $row['name'];
         }
    }
    $namen = implode(" ", $namen);//wichtig!!
    
    echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b>
    Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b>
    <br>Registrierte User : <b>$namen</b></div>"


    das, wenn kein registrierter user angemeldet ist dort Gast steht, ist meine schuld. ich habe nicht dran gedacht, das die varable name ja schon f?r den namen verwendet wird...
    nimm da einfach users:
    $users = implode(" ",$namen);
    und im echo (unten bei der namens ausgabe) auch $users schreiben..
    hab da jetzt implode wieder mit ins spiel gebracht. das ist wichtig! denn die namen die nicht gleich Gast sind werden im array $namen gespeichert und dann durch implode zum string gemacht.
  21. Autor dieses Themas

    n********r

    also ich habe es ge?ndert:

    <?php
      if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "")$name = $_SESSION["user_username"];
      else $name = 'Gast';
    
        $sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    online
                WHERE
                    IP = '".$_SERVER['REMOTE_ADDR']."'";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
        if($row['Anzahl']) {
            // Nur Datum Updaten
            $sql = "UPDATE
                        online
                    SET
                        Datum = NOW()
                    WHERE
                        IP = '".$_SERVER['REMOTE_ADDR']."'";
            mysql_query($sql) OR die(mysql_error());
    
            } else {
    
            $sql = "INSERT INTO online
                    (IP, Datum, name)
                    VALUES
                    ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')";
            mysql_query($sql) OR die(mysql_error());
                    }
    
        // alte Datens?tze l?schen
        $sql = "DELETE FROM
                    online
                WHERE
                    DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum";
        mysql_query($sql) OR die(mysql_error());
    // Anzahl Ausgeben
    
    $sql = "SELECT  name FROM online";
    $result = mysql_query($sql) OR die(mysql_error());
    $gesamt = mysql_num_rows($result);
    $gaeste = 0;
    $namen = array();
    
     while( $row = mysql_fetch_assoc($result))
    {
         if($row['name'] == 'Gast')
         {
               $gaeste++;
                continue;
         } else {
               $namen[] = $row['name'];
         }
    }
    $namen = implode(" ", $namen);//wichtig!!
    
    echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b>
    Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b>
    <br>Registrierte User : <b>$namen</b></div>"
    ?>


    Aber jetzt werden die Registrierten User nicht mehr angezeigt wenn sie sich eingeloggt haben.

    Achja hier meine Login Datei, was muss ich da jetzt ?ndern, das aus dem gast der User wird, wenn er sich einloggt:

    <?php
    session_start ();
    error_reporting(E_ALL);
    include ("../function/verbindung.php");
    
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    
    $sql ="SELECT id, username, password, admin FROM user WHERE username = '". $username ."' AND password = '". $password ."'";
    
    $result = mysql_query ($sql) or die(mysql_error());
    
    if (mysql_num_rows ($result) > 0)
    {
      $data = mysql_fetch_array ($result);
    
      $_SESSION["user_id"] = $data["id"];
      $_SESSION["user_username"] = $data["username"];
      $_SESSION["user_password"] = $data["password"];
      $_SESSION["user_admin"] = $data["admin"];
    
      header ("Location: ../../forum.php?login=yes");
     }
    
    else
    {
    header ("Location: ../../forum.php?login=no");
    }
    ?>

    Danke
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!