Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Browser wird geschlossen ein letztes script ausführen

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Browser wird geschlossen ein letztes script ausführen

    Hallo alle zusammen,

    meine Frage ist mit welcher funktion kann ich wenn der user den Browser schliesst nochmal ein kleines php scriptchen starten. Wo dieser in die Datenbank einträgt, das der User den Status 0 bekommt also in meinem fall dann offline ist.

    Ich will es nicht mit einem Timestamp machen das wenn er 20 minuten inaktiv ist, dass er dann den Status 0 bekommt sondern sofort. Alle CMS die ich kenne merken sofort das der user offline gegangen ist auch wenn er die session nicht durch betätigen des Logout buttons bzw des Sessiondestory scripts.

    Machen die das mit Javascript? Ich versteh die ganzen komplexen CMS nicht sogut das ich das aus denen lernen könnte.

    Dann mal zu meiner derzeitigen Vorgehensweise:

    Login session wird gestartet und in der datenbank der status für den User auf 1 gesetzt somit wird er unter User online angezeigt durch eine If schleife.

    Und wenn der User sich ausloggt über den entsprechenden logout button wird die Session zerstört und in der Datenbank steht status=0.

    Nur sind die meisten User dafür zu schnell im netz unterwegs und schließen einfach eilig die seiten ohne sich richtig auszuloggen.

    Ich danke für jede einzelne Hilfe

    PS: Oma Google hat mir leider immer noch keine hilfe in diesem Fall gegeben

    Mit freundlichen Grüßen

    Dant3r


  • #2
    Geht höchstens per JavaScript mit onunload. Das ist aber schlechter Stil, User-Online-Anzeigen arbeiten stets mit Timeouts. Sprich: wenn der User seit x Minuten keine Aktion mehr durchgeführt hat, wird er als offline angezeigt. Meistens sind es 15-30 Minuten.
    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

    Kommentar


    • #3
      Die JavaScript Variante kannst du höchstens noch als Zusatz einbauen.

      Kommentar


      • #4
        Mhhh ok aber kannst du mir vll erklären warum es ein schlechter stil ist?

        Kommentar


        • #5
          Weil die Online-Anzeige Aufgabe der Serverapplikation ist, JavaScript aber eine clientseitige Technologie ist. Somit hängen serverseitige Aufgaben von unzuverlässigen clientseitigen Technologien ab. Das ist eindeutig schlechter Stil.
          Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

          Kommentar


          • #6
            Ok, das stimmt dann lasse ich es auch.

            $sql=UPDATE ... WHERE DATE_SUB(NOW(), INTERVAL 15 MINUTE) > datum";

            So wollte ich es gestern machen nur hat es nicht funktioniert oder kann mir einer eine andere methode sagen?

            Kommentar


            • #7
              PHP-Code:
              $zeit1 time();
              $zeit2 strtotime("+30 minute",$zeit1);

              $datetimedb="UPDATE * FROM user SET status='0' WHERE datetime > '";
                        
              $datetimedb.=$zeit2;
                        
              $datetimedb.="'";
                        
              mysql_query($datetimedb); 
              Hab da noch eine andere Variante aber kann mir einer sagen was ich da falsch mache?

              Kommentar


              • #8
                Du rechnest 30 Minuten in die Zukunft, das kann nicht funktionieren. Du müsstest 30 Minuten in die Vergangenheit rechnen. Im Übrigen kannst du auch gleich time() - 1800 rechnen, oder um es deutlicher zu machen: time() - 60 * 30.
                Und lass mal die Stringdelimiter bei Strings weg.
                PHP-Code:
                $sql 'UPDATE * FROM user SET status=0 WHERE datetime <= ' $time
                reicht völlig.
                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                Kommentar


                • #9
                  Ohne "* FROM" funktioniert es aber dann bekommen alle den status 0 und mit " * FROM" funktioniert gar nix.
                  Woran kann das liegen?

                  Kommentar


                  • #10
                    * FROM gehört da auch gar nicht rein. Das habe ich einfach per C&P von dir übernommen ohne darüber nachzudenken.DELETE und UPDATE besitzen kein * FROM. Und die PHP-Variablen musst du natürlich auch entsprechend anpassen. $time ist in diesem Falle time() - 60 * 30.
                    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                    Kommentar


                    • #11
                      UPDATE user SET datetime = now()

                      So teile ich der Datenbank das Datum und die Uhrzeit mit.

                      Die Spalte ist als Typ datetime gespeichert wo dann der Inhalt der Spalte nach der UPDATE Funktion so aussieht 2010-03-28 11:13:53.
                      Und dann die UPDATE Funktion mit den 30minuten macht egal ob der User jetzt nur 1 sekunde weg ist schon auf status=0

                      Mache ich da irgendwas falsch?

                      Danke schonmal

                      Kommentar


                      • #12
                        Aua, sag das doch. Ein MySQL-Timestamp sieht anders aus als ein UNIX-Timestamp. Dann versuche es entweder so:
                        PHP-Code:
                        $sql 'UPDATE user SET status=0 WHERE `datetime` <= FROM-UNIXTIME(' $time ');'
                        oder so:
                        PHP-Code:
                        $sql 'UPDATE user SET status=0 WHERE `datetime` <= DATE_SUB(`datetime`, INTERVAL 30 MINUTE);'
                        Ich habe datetime übrigens mal in Backticks gesetzt, nicht dass es da noch Probleme mit dem Keyword DATETIME gibt. Bei einigen Keywords erlaubt MySQL aus historischen Gründen zwar die Benutzung, aber guter Stil ist es nicht.
                        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                        Kommentar


                        • #13
                          Funktioniert beides net

                          Hab nochwas ausprobiert:


                          Die Einloggen-zusatzfunktion um status auf 1 zu setzen
                          PHP-Code:
                          $datetimedb="UPDATE user SET datetime = '";
                                  
                          $datetimedb.=time();
                                  
                          $datetimedb.="' WHERE id = '";
                                    
                          $datetimedb.=$_SESSION['id_user'];
                                    
                          $datetimedb.="'";
                                    
                          mysql_query($datetimedb); 



                          Die Funktion um status auf 0 zu setzen nach einer bestimmten zeit
                          PHP-Code:
                          $time=time();
                          $time_check=$time-600;

                          $aktivtime='UPDATE user SET status=0 WHERE time<$time_check'
                                    
                          mysql_query($aktivtime); 
                          Vll geht das besser.
                          Datenbank ist jetzt auf int 11 eingestellt bei datetime

                          Kommentar


                          • #14
                            Und wenn du aus dem Tippfehler FROM-UNIXTIME noch FROM_UNIXTIME machst? Wie wäre das?
                            Dein zweiter Code kann außerdem nicht funktionieren, da du dies nicht beachtet hast: OpenWebBoard / Tutorials / PHP & MySQL / Top10 der PHP-Fragen
                            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                            Kommentar


                            • #15
                              Danke es scheint alles sehr gut zu funktionieren es war wirklich nur wegen des bindestrichs ^^

                              Kommentar

                              Lädt...
                              X