Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP|MySQL]użytkownicy online
Forum PHP.pl > Forum > PHP
Sergiusz1996
Witam.
Ostatnio stworzyłem na stronie system logowania oraz shoutboxa. Logowanie opiera się na PHP. Baza użytkowników mysql.cba.pl
Moje pytanie (a raczej prośba) dotyczy skryptu, który pozwalałby wyświetlać na stronie shoutboxa użytkowników, którzy są online.
Jeśli taki temat już był, proszę o linka. Wujek Google nie wszystko widzi
Pozdrawiam i czekam na odpowiedź - Sergiusz
flashdev
  1. <?php
  2. class online_counter {
  3. private $sql;
  4. private $table;
  5. private $maxTime;
  6.  
  7. public function __construct($sql, $table, $maxTime){
  8. $this -> sql = $sql;
  9. $this -> table = $table;
  10. $this -> maxTime = $maxTime;
  11. }
  12.  
  13. public function update($ip, $time = false){
  14. $time = $time === false ? 'NOW()' : '\'' . $time . '\'';
  15. $ip = ip2long($ip);
  16. $sql = 'INSERT INTO `' . $this -> table . '` (`ip`, `lastmod`) VALUES (' . $ip . ', ' . $time . ');';
  17. if( !$this -> sql -> query($sql) ){
  18. $sql = 'UPDATE `' . $this -> table . '` SET `lastmod` = ' . $time . ' WHERE `' . $this -> table . '`.`ip` = ' . $ip . ';';
  19. return !!$this -> sql -> query($sql);
  20. }
  21. return true;
  22. }
  23.  
  24. public function get(){
  25. $this -> eraseOld();
  26. $sql = 'SELECT * FROM `' . $this -> table . '`;';
  27. $this -> sql -> query($sql);
  28. return $this -> sql -> numRows();
  29. }
  30.  
  31. private function eraseOld(){
  32. $time = date('Y-m-d H:i:s', time() - $this -> maxTime);
  33. $sql = 'DELETE FROM `' . $this -> table . '` WHERE `' . $this -> table . '`.`lastmod` < \'' . $time . '\';';
  34. $this -> sql -> query($sql);
  35. }
  36. }
  37. ?>


Kiedyś napisałem taką klasę, może się przyda winksmiley.jpg
Sergiusz1996
Bardzo dziękuję za pomoc, jednak mam dalej pewne problemy:

1) dane sql itd mam powstawiać w miejsca zielonych czy niebieskich?
2)Jak się domyślam w sql muszę utworzyć tabelę. Jak ma wyglądać, a najlepiej coś w tym stylu
  1. CREATE TABLE `uzytkownicy` (
  2. `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
  3. `nick` VARCHAR( 32 ) NOT NULL ,
  4. `haslo` VARCHAR( 40 ) NOT NULL ,
  5. `email` VARCHAR( 40 ) NOT NULL ,
  6. `ip` VARCHAR( 20 ) NOT NULL ,
  7. PRIMARY KEY ( `id` )
  8. );


3)Jak zadecydować w którym miejscu będą się wyświetlały aktywne osoby (która część kodu odpowiada za samo wyświetlanie?
flashdev
ad. 1
Nie wiem co u Ciebie jest zielone a co niebieskie smile.gif

ad. 2
oczywiście tak

ad. 3
To tylko klasa operująca na bazie danych, nic tu się nie wyświetla. Dla jasności poniżej zamieszczam krótki opis:

__construct
Konstruktor - jako parametry wymaga podania:
- $sql - prosta klasa do obsługi MySQL
- $table (string) - nazwa tabeli w sql
- $maxTime - czas w sekundach od ostatniego wejścia na stronę osoby, przez który osoba ta ma być uznana jako online

update
Funkcje wywołujesz wszędzie gdzie ma być zliczany dany gość. Parametry:
- $ip - adres ip osoby odwiedzającej, nie musi to być ip, jeśli masz jakiś inny skuteczny sposób rozróżnienia użytkowników
- $time - czas odwiedzin - domyśnie aktualny

get
Funkcja pobiera aktualną ilość gości.
Zwraca ilość gości (int).

eraseOld
Usuwa z bazy nieaktywnych użytkowników.
Sergiusz1996
1) brakuje mi miejsca na wstawienie hasła do bazy (coś w rodzaju configu)
2) Czy mógłbyś mi pomóc ze skryptem wyświetlana. Nie umiem takiego zrobić
3) Ta klasa będzie się podłączała pod tabelę z użytkownikami, jeśli nie proszę o wygląd tabeli, jaka mam utworzyć.
Mephistofeles
Lepiej zabierz się od nowa za podstawy. Tutaj nie ma łączenia z bazą, więc nie ma też konfiguracji. Po drugie to tylko przykład, do pracy wymaga z tego co widzę zapisywania ostatniej akcji użytkownika w polu lastmod, to musisz dopisać. Ja bym przy każdym odświeżeniu strony zapisywał (albo zamieniał, jeżeli istnieje) po prostu id usera z czasem do jakiejś tablicy, kasował od razu stare wpisy (starsze niż np. pół godziny) i wyświetlał aktualne.

Edit: Mój błąd, nie doczytałem. Zapisywanie jest, więc teraz tylko (próbuj sam) dopasuj sobie do własnych potrzeb.
Sergiusz1996
Wiem,że powinienem zabrać się za podstawy. ale ta funkcja jest mi potrzebna na wczoraj. Mówisz "napisz", ale dla mnie nie jest to takie proste. to nie jest html. proszę więc o w miarę gotowe skrypty.

Dałoby się to zrobić na zasadzie, że gdy ktoś się zaloguje w tabeli z danymi pojawia się 1, a gdy wylogowuje - 0. w miejscu, gdzie zalogowani mają być wyświetleni pojawiłaby się tabela z 0 i 1 (oczywiście można to zamienić na online i offline) teraz tylko problem, jak zmodyfikować login.php
  1. <?php include("config.php"); ?>
  2. <?php
  3. $login = $_POST['login'];
  4. $haslo = $_POST['haslo'];
  5. $haslo = addslashes($haslo);
  6. $login = addslashes($login);
  7. $login = htmlspecialchars($login);
  8. if ($_GET['login'] != '') { //jezeli ktos przez adres probuje kombinowac
  9. }
  10. if ($_GET['haslo'] != '') { //jezeli ktos przez adres probuje kombinowac
  11. }
  12. $haslo = md5($haslo); //szyfrowanie hasla
  13. if (!$login OR empty($login)) {
  14. include("head2.php");
  15. echo '<p class="alert">Wypełnij pole z loginem!</p>';
  16. include("foot.php");
  17. }
  18. if (!$haslo OR empty($haslo)) {
  19. include("head2.php");
  20. echo '<p class="alert">Wypełnij pole z hasłem!</p>';
  21. include("foot.php");
  22. }
  23. $istnick = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM `uzytkownicy` WHERE `nick` = '$login' AND `haslo` = '$haslo'")); // sprawdzenie czy istnieje uzytkownik o takim nicku i hasle
  24. if ($istnick[0] == 0) {
  25. echo 'Logowanie nieudane. Sprawdź pisownię nicku oraz hasła.';
  26. } else {
  27. $_SESSION['nick'] = $login;
  28. $_SESSION['haslo'] = $haslo;
  29. header("Location: sb.php");
  30. }
  31. ?>


aby podczas zalogowanie w tabeli pojawiało się 1, a wyloguj.php
  1. <?php
  2. echo 'Wylogowano';
  3. ?>

aby zmieniało się na 0
dg2001
Źle doczytałem, w momencie gdzie przypisujesz dane do zmiennych sesji, daj sobie update do bazy aby zapisał ci kto jest on-line a kto nie. Jednak to wymaga w bazie odpowiedniego pola. A przy wylogowywaniu znów zmieni ci tą wartość na 0.

Lecz to ma wadę smile.gif Jak ktoś zamknie przeglądarkę bez wylogowania się to niestety będzie dalej widniał jako zalogowany smile.gif
Sergiusz1996
przydałoby się, by przeglądarka co 5 minut wysyłała na nowo potwierdzenie (0/1) szukałem takiego skryptu, ale nie znalazłem. może ktoś ma taki?
dg2001
Może jakoś przy wykorzystaniu JavaScript, aby podczas zamknięcia przeglądarki się pytał czy faktycznie chcesz zakończyć pracę np, i jeżeli ktoś kliknie na tak, to w tym momencie wywołuje funkcje wyloguj.

Ale nie znam na tyle JavaScript aby ci pomóc.

Co do sprawdzania co 5 min, też ci to nic nie da jak się zamknie przeglądarkę, chyba że wrzucisz taki skrypt do crona, ale jak by miał to sprawdzać to ci nie powiem
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.