Jak zrobić, by ktoś był widoczny na stronie online/offline


(Darom82) #1

Chciałem się Was zapytać, czy na mojej stronce dałoby by się zrobić wyświetlanie ikonki online kiedy dany użytkownik jest zalogowany na mojej stronie - a kiedy jest wylogowany to żeby była ikonka offline ? Takie coś chciałem zamieścić w liście użytkowników: http://www.history.is.net.pl/uzytkownicy

Moja strona posiada swoją baze danych. Czy ktoś mógłby mi takie coś pomóc zrobić na mojej stronce ? Bardzo byłbym wdzięczny.


(ziggurad) #2

Można to zrobić w np w taki sposób że do tabeli w bazie danych gdzie przechowujesz dane o użytkownikach dodajesz nowe pole online. Podczas logowania wrzucasz do tego pola aktualny czas+ np 10 minut, podczas generowania listy użytkowników sprawdzasz czy aktualny czas jest < niż wartość w bazie, jeśli tak to można przyjąć że użytkownik jest online (albo był w ciągu ostatnich 10 minut).

Do tego podczas przeglądania strony przez zalogowanego użytkownika czas trzeba uaktualniać wartość w bazie a o podczas wylogowania można go usunąć.


(Darom82) #3

Rozumie, że chodzi Ci o to że w pliku użytkownicy.php w tabeli dodam sobie nowe pole cos podobnego do tego ponizej tak ?

<?php if ($uzytkownik['gg']) {

        ?><?php

    }

    ?>[/code]


Musiałbym pewnie modyfikowac plik logowanie.php ale nie wiem jakby wygladal kod dodający tutaj do pola atualny czas:

[code]
-

» Logowanie

<?php if (zalogowany()) { ?> Jesteś zalogowany jako <?php echo _e($_SESSION['username']); ?>. Kliknij tutaj aby edytować swój profil.<?php } else { ?> <?php if (isset($flash['komunikat'])) { ?> <?php echo $flash['komunikat']; ?><?php } ?>
Nazwa użytkownika

Hasło

Zapamiętaj mnie

<?php } ?>

Nie wiem zabardzo jak to zrobić :frowning:

Czy dałoby by się to zrobić bez ciągłej aktualności wartości tylko żeby to jakoś samo działało ?

Chcę, że w tabeli użytkownicy jak ktoś będzie online to żeby była ikonka taka: onlinea.gif

A jak ktoś będzie na stronie offline, to żeby ikonka była taka: offlineby.gif

Czy możesz mi pomóc to zrobić ?


(Pablo_Wawa) #4
  1. W bazie danych, tam gdzie masz dane użytkowników, musisz dodać nowe pole o (dowolnej) nazwie np. czas , które to pole będzie zawierało czas (pełną datę i czas) ostatniej wizyty danego użytkownika na Twojej stronie. Jak zrobić taką modyfikację tabeli w SQLite musisz sobie poszukać np. w necie (chyba że wiesz jak to się robi): http://phpedia.pl/wiki/SQLite

    ALTER TABLE uzytkownicy ADD czas INT NOT NULL DEFAULT 0;

Uwaga: SQLite nie posiada zaawansowanych typów danych takich jak data i czas, dlatego należy przyjąć jakąś swoją reprezentację tego czasu w bazie i potem napisać obsługę jego przetwarzania w PHP. Można datę i czas trzymać np. jako tekst albo jako liczbę (np. minut od określonej daty początkowej lub mikrosekund od początku ery uniksowej - takiej, jaką zwraca funkcja microtime() w PHP, ewentualnie zredukowana dla wygody do sekund lub minut), tylko potem trzeba odpowiednio rozwiązać porównywanie bieżącej daty i czasu w PHP.

2.

Zastanów się, skąd Twój skrypt ma wiedzieć, czy dany użytkownik jest (jeszcze) na Twojej stronie? Jak sobie wejdzie na daną stronę www i pozostanie na niej kilka godzin nic na niej nie robiąc, to Ty nie rozpoznasz/nie rozróżnisz tego od sytuacji, w której po wejściu na tę stronę on zamknie po prostu przeglądarkę (nie będziesz miał informacji o wylogowaniu, bo nie kliknie na wyloguj).

  1. Aby powyższe (z pkt. 2) móc kontrolować na bieżąco, musisz napisać dodatkowy kod, tzw. czujkę, która np. jako ukryta ramka (IFRAME) na Twojej stronie będzie co jakiś czas (np. co 1 minutę) wywoływała jakiś Twój specjalny skrypt zapisujący aktywność danego użytkownika w bazie (dane o użytkowniku weźmie z zapamiętanej w PHP sesji). Nie jest to trudne, a całkowicie rozwiązuje problem śledzenia na bieżąco użytkownika. Niestety taką ramkę (wstawkę) musisz umieszczać na każdej swojej stronie www - najlepiej jest to zakodować w osobnym pliku .php i wczytywać (funkcją include lub require) do każdego swojego skryptu (oczywiście we właściwym miejscu, bo to będzie dodatkowy kod HTML).

  2. Mając w bazie powyższe, tj. datę i czas ostatniej wizyty danego użytkownika na stronie, w skrypcie wypisującym wszystkich użytkowników Twojego serwisu musisz sprawdzić, czy w ogóle jakaś data jest wpisana i porównywać ją z bieżącą - dodatkowo zakładając jakiś margines czasowy (1-10 minut) i wstawiać w wybranej kolumnie tabeli na stronie odpowiednią ikonkę aktywności użytkownika.

Jak widzisz, sprawa nie jest banalna i wymaga trochę dodatkowego pisania.

Poniżej masz przykłady realizacji Twojego problemu, zorientujesz się jak to inni zrobili:

http://www.it.wortale.net/122-Jak-wyswietlic-ilosc-zalogowanych-uzytkownikow-w-PHP.html

http://forum.4programmers.net/PHP/188558-lista_zalogowanych_uzytkownikow


(Darom82) #5

Moją jedyną bazą danych jest plik darom.sqlite

W którym miejscu lub gdzie w tym pliku moge sobie dodać takie nowe pole i jak to zrobić ? Chciałbym żebyś mi pomógł to zrobić bo troche kiepsko się w tym orientuje.

Prosze Cię Bardzo byś mi pomógł.

Tutaj na forum jak zapewne zauważyłeś też jest taka opcja kiedy jest dany użytkownik online a kiedy offline. Chciałbym by podobnie działało to u mnie na stronce.

Troche nie zabardzo wiem jak to wszystko zrobić, czy miałbyś czas mi pomóc to zrobić prawidłowo tak żeby działało u mnie na stronie ?


(Drobok) #6

Jak byś nie zauważył, druga z kolei tabela w pliku przechowuje użytkowników. Tam właśnie masz dodać to pole. Czy ty w ogóle rozumiesz co masz dotychczas zrobione ?

Czas aktualizujesz podczas wczytywania witryny, oraz za pomocą ajax'a wysyłając do serwera informację o korzystaniu z witryny co np minutę.

W phpbb aktywność zrobiona jest tak samo (po przeładowaniu zmieniany jest czas). Weź też pod uwagę sens twojego działania, ile można sprawdzać coś na stronie. O ile nie piszesz czatu / komunikatora / forum takie coś jest zupełnie zbędne. Nie zapomnij też że pomóc != zrobić.


(Pablo_Wawa) #7

Gwoli informacji: baza danych zawiera kilka tabel, w których są trzymane poszczególne dane. U Ciebie są to tabele newsy oraz uzytkownicy. W tej drugiej tabeli musisz dodać nową kolumnę przechowującą datę i czas ostatniej wizyty danego użytkownika.

-- Dodane 09.01.2013 (Śr) 18:33 --

Jeśli zaś chodzi o skrypt, który będzie uaktualniał czas w tabeli uzytkownicy dla bieżącego (zalogowanego) użytkownika, to przetestuj ten skrypt:

<?php

  session_start();

  date_default_timezone_set('Europe/Warsaw');

  $db = new PDO('sqlite:darom.sqlite');

  if (isset($_SESSION['login'], $_SESSION['id']))

  {

    $q = $db->prepare('UPDATE uzytkownicy SET czas = DATETIME(\'NOW\') WHERE id = :id');

    $q->bindValue(':id', $_SESSION['id'], PDO::PARAM_STR);

    $q->execute();

  }

?>

I sprawdź na zalogowanym użytkowniku (np. w drugiej zakładce tej samej przeglądarki), czy uruchomienie tego skryptu w przeglądarce będzie odświeżało pole czas w tabeli. Zakładam że dodałeś już pole o nazwie czas do tabeli uzytkownicy.


(Darom82) #8

Czy ten skrypt mam dodać do bazy danych czy do pliku uzytkownicy.php ?


(Pablo_Wawa) #9

Ani tu, ani tu. Zapisz go w osobnym plik, np. status.php i w osobnej zakładce wejdź na stronę z nim i sprawdź, czy w bazie SQLite stosowne pole się uaktualniło (nie używałem bazy SQLite i nie mam pewności, czy co napisałem to zadziała).


(Darom82) #10

Sprawdziłem i według mnie nadal jest godzina 17:32:17 tak jak było na początku. Czyli nic się nie zmieniło w polu status_uzytkownika.

Żeby to sprawdzić to przegrałem z powrotem z serwera na dysk plik darom.sqlite bo na serwerze sie nie da chyba tego sprawdzić.

Skrypy wyrzuca błąd: http://www.history.is.net.pl/templates/status.php

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /home/users/history/public_html/templates/status.php:4 Stack trace: #0 /home/users/history/public_html/templates/status.php(4): PDO->__construct('sqlite:darom.sq...') #1 {main} thrown in /home/users/history/public_html/templates/status.php on line 4

(Pablo_Wawa) #11

Prawdopodobnie jest błąd w linii

$db = new PDO('sqlite:darom.sqlite');

Zobacz u siebie w skryptach, jak wygląda podobna linia i popraw tę w tym skrypcie (pewnie inaczej wygląda ścieżka do bazy). EDIT: jak się zorientowałem szukając w necie, błąd jest spowodowany brakiem biblioteki związanej z sqlite, Ty masz w kodzie swoich skryptów (m.in. uzytkownicy.php) zapewne taką linię

include('db.php');

lub

include('sqlite.php');

Ewentualnie zamiast include masz require (z _once lub bez). Musisz to też dodać w powyższym skrypcie.


(Darom82) #12

Nie wiem jak to poprawić, bo nic takiego o czym piszesz nie mam :frowning: :frowning: :frowning:

W pliku uzytkownicy.php nie ma żadnego include ani też require więc niewiem jak to zrobić :frowning:

Jak wrzuce plik ze skryptem gdzie indziej, np tak: http://www.history.is.net.pl/status.php

Wtedy jest biała pusta strona, ale i tak żadnych zmian nie ma w zapisie .


(Pablo_Wawa) #13

Ale w tym poście http://forum.dobreprogramy.pl/kolor-nicka-liscie-uzytkownikow-t516427.html#p3237898(Kolor nicka na liście użytkowników) wspomniałeś coś o plikach db.php i sqlite.php


(Darom82) #14

Myślałem wtedy że może oba te pliki mają coś wspólnego z moją bazą danych ale jak się okazało jednak nie do końca. Więc chyba nie tutaj jest przyczyna :frowning:

Nie wiem gdzie.


(Pablo_Wawa) #15

Ale one istnieją w tym samym folderze, co plik uzytkownicy.php? Jeśli tak, to dodaj w kodzie skryptu status.php

<?php

  session_start();

dodatkowy wiersz

<?php

  session_start();

  require_once('sqlite.php');

I sprawdź jak to zadziała.

-- Dodane 09.01.2013 (Śr) 23:03 --

EDIT: ewentualnie nic nie zmieniaj i wywołaj skrypt z takiego linka http://www.history.is.net.pl/status, tylko skrypt status.php musi byś w tym samym folderze, co np. uzytkownicy.php.


(Darom82) #16

Tamte pliki db.php i sqlite.php są w katalogu głownym strony

Natomiast plik uzytkownicy.php znajduje się w: katalogo_glowny/templates/uzytkownicy.php

Poprawilem i dokonały się pewne zmiany: http://www.history.is.net.pl/status.php

Teraz w pliku darom.sqlite zmieniła sie jego waga, ale czast w polu status_uzytkownicy nadal pokazuje 17:32:17


(Pablo_Wawa) #17

To wrzuć oryginalny skrypt status.php (bez zmian) tam gdzie masz plik uzytkownicy.php (katalogo_glowny/templates/) i wywołaj skrypt z takiego linka http://www.history.is.net.pl/status

Teraz (mam nadzieję) zmiany czasu powinny się pojawić (tylko bądź zalogowany w swoim serwisie). Ewentualnie zamknij i otwórz ponownie SQLite Administratora i zobacz.

-- Dodane 09.01.2013 (Śr) 23:14 --

Pamiętaj tylko, że w tym kodzie, co Ci podałem, zmienić czas na status_uzytkownika :

$q = $db->prepare('UPDATE uzytkownicy SET status_uzytkownika = DATETIME(\'NOW\') WHERE id = :id');

(Darom82) #18

Zrobilem tak i nadal jest bez zmian: 17:32:17


(Pablo_Wawa) #19

A sprawdź jeszcze ten kod (plik status.php):

<?php

  $db = new PDO('sqlite:darom.sqlite');

  $db->exec('UPDATE uzytkownicy SET status_uzytkownika = DATETIME(\'NOW\') WHERE id = 2');

  echo 'exec done.
';

?>

Powinien on zmienić czas dla pierwszego użytkownika w bazie (id=2).

Wywołaj go raz przez ścieżkę z http://www.history.is.net.pl/status.php a jak to nic nie da, to jako http://www.history.is.net.pl/status


(Darom82) #20

Sprawdziłem: http://www.history.is.net.pl/templates/status.php

Wyskakuje błąd:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /home/users/history/public_html/templates/status.php:2 Stack trace: #0 /home/users/history/public_html/templates/status.php(2): PDO->__construct('sqlite:darom.sq...') #1 {main} thrown in /home/users/history/public_html/templates/status.php on line 2