Lista osób online


(leszczu8023) #1

Witam

Chcę zrobić listę użytkowników online dokładnie żeby to działało wg schematu:

(sorka w pierwszym powinno być Użytkownik 1 :D)

Moja strona używa metody _GET i url po wysłaniu formularza wygląda tak:

/game.php?player= Użytkownik+1

Jak to zrobić bo szukałem i nie mogłem znaleźć?

Ps. Mam dostęp do SQL


(eranet) #2

edytuj zapytanie w ten sposób, że będzie sprawdzało, czy użytkownik jest online i będzie zliczało odpowiedzi pozytywne.


(GioWDS) #3

Zapisujesz sobie w bazie danych pole lastSeen z timestampem i sprawdzasz kto był pare sekund temu.


(leszczu8023) #4

A można jakoś jaśniej bo już tyle kombinuje i nic : :-? ? Ja nie zbyt ogarniam PHP i SQL.


(Pablo_Wawa) #5

Był podobny wątek: http://forum.dobreprogramy.pl/jak-zrobic-ktos-byl-widoczny-stronie-online-offline-t516891.html

Myślę, że warto byś go przejrzał, to się zorientujesz, jak to można zrobić.

P.S. I jak użyjesz pisowni "formularz" (a nie "formulaż"), to znajdziesz więcej wyników. :stuck_out_tongue:


(leszczu8023) #6

Pomyślałem, żeby sobie darować z SQL i zrobić na podstawie operacji na plikach. Na razie mam taki skrypt:

<?php

$player = $_GET['player'];

$currentTime = time();


$nazwa_pliku = "users_online.txt";

if (is_writeable($nazwa_pliku))

  {

   if ($plik = fopen($nazwa_pliku, "a"))

     {

      if (fwrite($plik, "$player"."$currentTime"." "."

"."") !== FALSE) echo "Zapis do pliku zakończył się powodzeniem...";

        else echo "Zapis do pliku się nie powiódł...";

      fclose($plik);

     } else echo "Nie mogę nawiązać połączenia z plikiem...";

  } else echo "Do pliku nie można dopisać informacji lub on nie istnieje...";

?>

Ten skrypt na razie potrafi zapisać użytkowników w następującej postaci: Plik users_online.txt:

Użytkownik 1

Użytkownik 2

Użytkownik 3

I tak dalej.

Tylko jak zrobić, aby to nie robił się spis gości tylko lista osób aktualnie przebywających na stronie.

Dodam, że ja wcześniej nie miałem styczności z SQL i słabo znam php (w php niewięcej ogarniam o co chodzi).


(B.Andy) #7

Na bazie danych będzie dużo łatwiej. Tutaj wyszukiwanie zajmowałoby ci dużo czasu. Dużo problemów - nie warto. Nie porywaj się z motyką na słońce. Jeśli nie znasz SQL, to zacznij się uczyć - to jest podstawa w programowaniu, szczególnie aplikacjach webowych. Książki, które mogę polecić to Rusz Głową! PHP + MySQL albo samo Rusz Głową! SQL. Książka napisana bardzo przystępnym językiem.


(Pablo_Wawa) #8

Według mnie zabierasz się za rozwiązanie tego problemu "od dupy strony". Zamiast pisać kod pomyśl najpierw nad algorytmem - czyli jak chcesz to rozwiązać? Jak już będziesz miał algorytm, zajmiesz się jego zakodowaniem. I wtedy zadecydujesz, czy używać bazy SQL, czy wystarczy do tego jeden plik tekstowy.

Ale najpierw określ jak będziesz rozpoznawał najistotniejszą rzecz, a mianowicie fakt, że dany użytkownik jest obecnie online (i co to u Ciebie znaczy), bo sam fakt wypełnienia jakiegoś formularza jeszcze nic nie daje (raz go wypełni, ale co potem?).


(leszczu8023) #9

@up

To ma działać w następujący sposób:

  1. Użytkownik chodzi na stronę główną (index.php)

  2. Wpisuje w pole swoją nazwę użytkownika i go przenosi na następną stronę (game.php?player=Wpisana+nazwa+użytkownika)

  3. Pobieram zmienną z paska adresu

<?

$player = $_GET['player'];

?>

  1. I teraz dalej nie wiem co. Chodzi o to, aby wyświetlałna była lista użytkowników aktywnych w ciągu np: 15 min.

Zastanawiam się czy nie wykorzystać skryptu który napisałem w parę postów wyżej. Skrypt ten by zapisywał nazwę użytkownika i obok datę i godzinę, a drugi skrypt by odczytywałby tylko dane wg poniższego wzoru:

18:00:00 - 00:15:00

18:00:00 to bierząca godzina

00:15:00 to czas aktywności użytkownika

Dane użytkowników byłyby zapisywane w pliku tekstowym w następującej postaci:

User1 17:37:40

User2 17:47:24

Itd...

Drugi skrypt podawałby tylko User2 bo:

17:47:24 < 18:00:00 - 00:15:00


(Pablo_Wawa) #10

No dobrze, czyli chcesz zastosować prostą, statyczną metodę logowania czasu aktywności użytkownika.

Będziesz potrzebował napisać dwie procedury:

  1. będzie zapisywała identyfikator użytkownika + czas bieżący do pliku z danymi, ale musi ona uwzględniać istnienie w pliku tego samego identyfikatora użytkownika (z wcześniejszym czasem) - i co wtedy? Ja sugeruję po prostu zastępowanie tego czasu bieżącym - wtedy w takim pliku identyfikator danego użytkownika wystąpi tylko raz - bo inaczej to będzie Ci się ten plik rozrastał w czasie, powodując coraz wolniejsze wpisywanie i odczyt danych.

  2. będzie odczytywała wszystkie pozycje (pary: identyfikator użytkownika i czas) i porównywała bieżący czas z tym odczytanym z pliku i wyświetlała tylko te id, których czas jest nie starszy niż ustalone np. 15 minut.

Co do pliku z danymi, to masz dwa wyjścia:

a) zwykły plik tekstowy, składający się z kolejnych wierszy - tylko w tym przypadku trudno jest na nim wygodnie operować (musisz "wyłuskiwać id oraz czas, kopiować plik jeśli musisz coś w nim zmienić);

b) plik binarny zawierający poszczególne rekordy (z dwoma polami, rozmiaru ustalonego na sztywno - co do czasu jest to normalne, ale musisz ograniczyć tu maksymalną długość identyfikatora użytkownika, który będziesz trzymał) - tutaj jest łatwość, wygoda i szybkość w operowaniu na danych i ich modyfikacji (to taka namiastka bazy danych).

-- Dodane 26.04.2013 (Pt) 14:38 --

Na początek proponuję napisać procedurę/funkcję zapisującą do pliku tekstowego identyfikator użytkownika i bieżący czas - do tego wystarczy przerobić trochę ten kod, który już wcześniej napisałeś. Zwróć jednak uwagę, jak zapisujesz dane do pliku - po pierwsze warto jakoś rozdzielić czas od nazwy użytkownika (np. znakiem tabulacji "\t") by móc to potem prosto rozdzielić (funkcją explode), a czas zapisywać jako liczbę sekund (tak jak to zwraca funkcja time()). Później będzie prościej operować na różnicy bieżącego czasu i tego zapisanego w pliku (zwykłe odejmowanie).

Następnie sugeruję napisać drugą procedurę/funkcję odczytującą dane z pliku i sprawdzającą czy zapisany czas jest mniejszy od bieżącego o mniej niż 15 minut (15*60 sekund) i wypisującą identyfikatory spełniające to kryterium.

Na samym końcu - jeśli to powyższe będzie Ci poprawnie działać - dodałbym (w pierwszej funkcji) dbanie o to, by dany identyfikator się nie powtarzał - ale to wymaga przypisywania całego pliku (wiersz po wierszu) do drugiego pliku tekstowego, bo dla jednego wiersza (tego w którym powtórzy się ten sam identyfikator) musisz dokonać zmiany (a nie jesteś w stanie tego zrobić w pliku tekstowym jako takim). Czyli reasumując: kopiujesz wiersze dopóki nie występuje ten identyfikator, jak na niego trafisz, to zapisujesz go z bieżącym czasem, a potem kopiujesz dalszą resztę pliku - kopiowanie niestety z jednego pliku do drugiego (tymczasowego), potem pierwszy kasujesz a drugiemu zmieniasz nazwę na właściwa (tego pierwszego). No chyba, że u Ciebie nie nastąpi dwukrotne wysłanie formularza z tym samym identyfikatorem użytkownika.

P.S. A wiesz jak to byłoby proste jakbyś dane trzymał w bazie danych SQL? :stuck_out_tongue: