Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja się nie wykonuje
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Dominator
Witam
Dlaczego funkcja setOnline(false); nie chce się wykonać?

  1. window.onbeforeunload = function() {
  2. setOnline(false);
  3. }
com
a jak wygląda magiczna funkcja setOnline(false); questionmark.gif
Dominator
  1. function setOnline(instance)
  2. {
  3. if(instance == true)
  4. {
  5. var jqxhrT = $.post("service.php?action=setTrue");
  6. }
  7. else
  8. if(instance == false)
  9. {
  10. var jqxhrF = $.post("service.php?action=setFalse");
  11. }
  12. }


Chciałbym, aby skrypt po wykryciu zamknięcia przeglądanej strony ustalał w bazie, że ktoś jest offline.
com
[JAVASCRIPT] pobierz, plaintext
  1. function setOnline(instance)
  2. {
  3. if(instance == true)
  4. {
  5. var jqxhrT = $.post("service.php?action=setTrue");
  6. alert('xx');
  7. }
  8. else
  9. if(instance == false)
  10. {
  11. var jqxhrF = $.post("service.php?action=setFalse", function() {
  12. alert( "success" );
  13. })
  14. .done(function() {
  15. alert( "second success" );
  16. })
  17. .fail(function() {
  18. alert( "error" );
  19. })
  20. .always(function() {
  21. alert( "finished" );
  22. });
  23. }
  24. }
  25. window.onbeforeunload = function() {
  26. setOnline(false);
  27. }
[JAVASCRIPT] pobierz, plaintext


to Ci wszytko powie, bo prawdopodobnie problem leży przy przesyłaniu smile.gif
Dominator
Po wyjściu ze strony nadal w bazie mam info, że użytkownik jest online sad.gif

  1. var instance;
  2. $(document).ready(function()
  3. {
  4. setOnline("yes");
  5. checkMode();
  6. });
  7. function setOnline(mode)
  8. {
  9. if(mode == "yes")
  10. {
  11. instance == true;
  12. }
  13. if(mode == "no")
  14. {
  15. instance == false;
  16. }
  17. }
  18.  
  19. function checkMode()
  20. {
  21. if(instance == true)
  22. {
  23. var jqxhrT = $.post("service.php?action=setTrue");
  24. alert('xx');
  25. }
  26. else if(instance == false)
  27. {
  28. var jqxhrF = $.post("service.php?action=setFalse", function()
  29. {
  30. alert( "success" );
  31. })
  32. .done(function()
  33. {
  34. alert( "second success" );
  35. })
  36. .fail(function()
  37. {
  38. alert( "error" );
  39. })
  40. .always(function()
  41. {
  42. alert( "finished" );
  43. });
  44. }
  45. }
  46. window.onbeforeunload = function()
  47. {
  48. setOnline("false");
  49. checkMode();
  50. }
freemp3
Tutaj:
Kod
setOnline("false");

Chyba powinno być:
Kod
setOnline("no");
Dominator
No faktycznie facepalmxd.gif
Ale w dalszym ciągu użytkownik jest online, choć nie powinien...
freemp3
Może funkcja zmieniająca status w bazie nie działa prawidłowo. Spróbuj zasymulować wyłączenie przeglądarki i sprawdź w konsoli co zostanie zwrócone.
Dominator
W dalszym ciągu nie działa...

plik service.php

  1. <?php
  2.  
  3. include 'online.php';
  4.  
  5.  
  6. @$akcja = $_GET["action"];
  7.  
  8. if(isset($akcja) && $akcja == "getOnline")
  9. {
  10. $nowy = new Baza();
  11. $data = $nowy->getData();
  12. echo $data;
  13. }
  14. if(isset($akcja) && $akcja == "setTrue")
  15. {
  16. $nowy = new Baza();
  17. $nowy->setRow("online");
  18. }
  19. if(isset($akcja) && $akcja == "setFalse")
  20. {
  21. $nowy = new Baza();
  22. $nowy->setRow("offline");
  23. }
  24.  
  25.  
  26. ?>


online.php

  1. <?php
  2. Class Baza
  3. {
  4. public function __construct()
  5. {
  6. $this->Connect();
  7. }
  8. public function Connect()
  9. {
  10. try
  11. {
  12. $pdo = new PDO('mysql:host=localhost;port=3306;dbname=test', '', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
  13. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. if($pdo)
  15. {
  16. $this->conn = $pdo;
  17. return true;
  18. }
  19. }
  20. catch(PDOException $e)
  21. {
  22. echo "Błąd " . $e->getMessage();
  23. }
  24. }
  25. public function setRow($text)
  26. {
  27. if($this->conn)
  28. {
  29. $dodaj = $this->conn->prepare("UPDATE `is_online` SET `online`=:online");
  30. $dodaj-> bindValue(":online", $text, PDO::PARAM_STR);
  31. $dodaj->execute();
  32. $dodaj->closeCursor();
  33. }
  34. }
  35. public function getData()
  36. {
  37. if($this->conn)
  38. {
  39. $_check = $this->conn->prepare("SELECT `online` FROM `is_online`");
  40. $_check-> execute();
  41. if($dane = $_check -> fetch())
  42. {
  43. echo $dane["online"];
  44. }
  45. }
  46. }
  47. }



Nie mam pojęcia dlaczego to nie chce działać.
sowiq
Cytat(Dominator @ 14.10.2013, 11:48:09 ) *
Nie mam pojęcia dlaczego to nie chce działać.

A jaką masz pewność, że request jest wysyłany na serwer? Może zapytanie nie zdąży być wysłane przed zamknięciem przeglądarki, hmm?
freemp3
Od sprawdzenia na pewno nie zadziała. Co sie wyświetla w konsoli? Masz pewność, że skrypt jest odpalany? Wyświetl w nim coś i sprawdź konsole.
Dominator
Cytat(sowiq @ 14.10.2013, 11:53:40 ) *
A jaką masz pewność, że request jest wysyłany na serwer? Może zapytanie nie zdąży być wysłane przed zamknięciem przeglądarki, hmm?


Nawet o tym nie pomyślałem...
Także więc ta metoda odpada. W takim razie w jaki inny sposób sprawdzić czy użytkownik jest online/offline?
flashdev
Cytat(Dominator @ 14.10.2013, 11:58:21 ) *
Nawet o tym nie pomyślałem...
Także więc ta metoda odpada. W takim razie w jaki inny sposób sprawdzić czy użytkownik jest online/offline?


Jeśli chcesz mieć tak precyzyjną informacją to nawiąż socket connection z serwerem.

Jesli może być mniej dokąłdnie, załóż, że np. po 5 min. od ostatniej aktywnosci user jest offline.
com
w normalnym przypadku czyli użytkownik zalogował się i wylogował to oczywiście ustawiaj przy logowaniu na online i przy wylogowaniu na offline, a jak zamknie okno to po prostu spr status po czasie życia sesji, jeśli wygasła to ustawiasz automatycznie na offline i wylogowujesz wink.gif
sowiq
@com, autorowi chyba raczej chodziło o zliczanie użytkowników, którzy obecnie są online, a nie o wylogowywanie.

@Dominator, o ile pomysł z nawiązywaniem socketowego połączenia wydaje mi się trochę przerostem formy nad treścią, o tyle możesz wykonywać na serwer zapytania AJAX w określonym interwale, np. co 30 sekund i odświeżać rekord danego użytkownika w bazie. A skrypt wyświetlający ilość userów online zliczałby tylko te rekordy, które są młodsze niż 30 sekund. Proste i w miarę dokładne wink.gif
com
Cytat(Dominator @ 26.09.2013, 20:52:20 ) *
Chciałbym, aby skrypt po wykryciu zamknięcia przeglądanej strony ustalał w bazie, że ktoś jest offline.


sowiq Chyba jednak nie, chyba że od tamtego czasu coś sie zmieniło wink.gif
sowiq
@com, ogólnie rzecz biorąc sprowadza się to do jednego.

Cytat(com @ 14.10.2013, 18:38:51 ) *
a jak zamknie okno to po prostu spr status po czasie życia sesji

Jeśli sesje nie są zaimplementowane np. na bazie danych to nie będzie to takie łatwe. Bo niby jak dobierzesz się do danych sesyjnych innego użytkownika z poziomu PHP? Będziesz iterował po wszystkich możliwych (tzn. istniejących na dysku) ID sesji?
Sephirus
Jeśli robisz coś w taki sposób że wysyłasz po zmianie strony to request ajaxowy może zostać przerwany - przede wszystkim dodaj w service.php na początku:



Po drugie:

Użyj zwykłego .ajax w trybie synchronicznym - powinno to wymusić zakończenie tej operacji przed zamknięciem strony - choć nie należy na tym polegać :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.