Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pokazywanie Online MySQL + PHP
Forum PHP.pl > Forum > PHP
Mlodycompany
Witam. Chcę opracowac system, który by pokazywał użytkowników online. Obmyśliłem sobie tak, że w tabeli `users` mam pole `online`. Podstawowa wartośc tego pola to 0. I teraz skrypt:
  1. <?php
  2. $mysq_host = "localhost";
  3. $mysq_user = "root";
  4. $mysq_pass = "root";
  5. $connect = mysql_connect($mysq_host, $mysq_user, $mysq_pass);
  6. $mysq_baza = "baza";
  7. mysql_select_db($mysq_baza);
  8. $post_login = addslashes($_POST['login']);
  9. $post_haslo = addslashes($_POST['haslo']);
  10. $md5 = md5($post_haslo);
  11.  
  12. function f_login($user, $pass){
  13. $result = mysql_query("SELECT * FROM `users` WHERE `login` = '".$user."' AND `haslo` = '".$pass."'");
  14.  while($users = mysql_fetch_array($result)){
  15. if($users[1] == $user && $users[2] == $pass){
  16.  header("Location: index.php");
  17.  $_SESSION['zalogowany'] = true;
  18.  $_SESSION['id'] = $users[0];
  19.  $_SESSION['login'] = $users[1];
  20.  $_SESSION['poziom'] = $users[3];
  21.  $_SESSION['mail'] = $user[4];
  22.  $_SESSION['gg'] = $user[5];
  23.  $_SESSION['tlen'] = $user[6];
  24.  $_SESSION['strona'] = $user[7];
  25.  $_SESSION['wiek'] = $user[8];
  26.  $_SESSION['miasto'] = $user[9];
  27.  $sql = "UPDATE `users` SET `online` = '1' WHERE `ID` = '".$users[0]."' LIMIT 1"; 
  28.  mysql_query($sql);
  29. }
  30.  }
  31. }
  32.  
  33.  
  34. if(isSet($post_login) && isSet($post_haslo)){
  35. f_login($post_login, $md5);
  36. }
  37. if($_GET['action'] == "logout"){
  38. header("Location: index.php");
  39. $sql = "UPDATE `users` SET `zalogowany` = '0' WHERE `ID` = '".$_SESSION['id']."' LIMIT 1"; 
  40.  mysql_query($sql);
  41. }
  42.  
  43. ?>

Mam nadzieje, że kumacie ten skrypcik, ale dla tych co nie kminią go wytłumacze. Skrypt logujący. Po zalogowaniu zmienia wartośc w polu `online` z 0 na 1. Jeżeli user kliknie na wyloguj to zmienia z 1 na 0. I teraz mam problem. Jak user zamknie przeglądarke to ta wartośc sie nie zmienia czyli jest nadal online. Jak zrobic ze po zamknieciu strony wartośc sie zmienia??
Piniek
Nie da się ;] Mozesz zrobic tak ze dodasz jeszcze jedno pole w tabeli user's z datą ostatniej akcji i co jakis okres czasu bedzie odpala skrypt cronem ktory bedzie zmieniaj wartosc online/ofline w zaleznosci czy ostatnia akcja zostala wykonana w przeciagu ostatnich przypuscmy 15minut.

Pozdrawiam
Mlodycompany
A może automatyczne kończenie sesji po np 15 min i wtedy zmiana wartości??
Piniek
a jak wtedy odpalisz skrypt zmieniający wartość ;]
Mlodycompany
no naprzykład
  1. <?php
  2. $zmiana_online = zakonczenie sesji po 15min;
  3. if($zmiana_online){
  4. //zmiana wartości
  5. }
  6. ?>
Piniek
to nic nie da bo jak ktos wyłączy przegladarkę to nie wykona sie ten skrypt ;]
Mlodycompany
kurcze szkoda. A może ktoś ma skrypcik pokazujący userów online??
Kicok
Zamiast pola `online` dodaj sobie pole `ostatnia_akcja`. Przy każdym wyświetleniu strony przez użytkownika aktualizuj datę w tej kolumnie.

Do tego zapytanie pobierze wiersze z tabeli `users` w których `ostatnia_akcja` była max 15 minut temu i masz gotowy skrypt.
Mlodycompany
no tak ale na kazdej stronie bym musial dac skrypt ktory by zmienial dane, ale pomysl jest dobry
marcio
  1. <?php
  2. function online($user) {
  3.  
  4. if($db = mysql_connect($pasy['host'], $pasy['login'], $pasy['haslo'])) {
  5. mysql_select_db($pasy['baza']);
  6.  
  7.  
  8. $remote = $_SERVER['REMOTE_ADDR'];
  9.  $aktualny_czas = time();
  10. $limit = 300; 
  11.  $zostalo = $aktualny_czas - $limit;
  12. $dodaj = ("INSERT INTO online(login,czas,ip) VALUES('$user','$aktualny_czas','$remote')");
  13.  $rezultat = mysql_query($dodaj, $db) or die(mysql_error());
  14. $usun = mysql_query('DELETE FROM online WHERE czas < '.$zostalo.''); 
  15.  $usunieto = mysql_query($usun, $db);
  16. $ile_online = ('SELECT DISTINCT login FROM online');
  17.  $osob = mysql_query($ile_online, $db) or die(mysql_error());
  18. $licz = mysql_num_rows($osob);
  19.  
  20. echo('User'ow online: '.$licz.' <Br>');
  21.  
  22. while($nazwa = mysql_fetch_assoc($osob)) {
  23.  
  24.  if(substr($nazwa['login'], -1, 1) != ',') $nazwa['login'] .= ',';
  25.  
  26. echo('<code><b>'.$nazwa['login'].'</b></code> ');
  27.  
  28. }
  29.  }
  30. }
  31. ?>

Moj skrypt z cms zrob z nim co chcesz smile.gif

P.S pozmieiaj tabele/kolumny i pasy do mysql i w twoim przypadku tak musisz wywolac
  1. <?php
  2. online($_SESSION['login']);
  3. ?>
Mlodycompany
Thx. Wyciągne z tego skryptu wnioski i napisze własny skrypt na własne potrzeby biggrin.gif

Skopiowałem ten skrypt. Ciapke zmodyfikowałem, ale jak sie zastanowiłem to mnie przeraziła jedna rzecz, amianowicie przyjmijmy, że user zamknoł przeglądarke i skrypt ktory usunie dane jest nie aktywny czyli ten user bedzie nadal aktywny. Czy dobrze myśle??
mike
Cytat(Mlodycompany @ 18.04.2008, 21:45:49 ) *
Skopiowałem ten skrypt. Ciapke zmodyfikowałem, ale jak sie zastanowiłem to mnie przeraziła jedna rzecz, amianowicie przyjmijmy, że user zamknoł przeglądarke i skrypt ktory usunie dane jest nie aktywny czyli ten user bedzie nadal aktywny. Czy dobrze myśle??
Dorze myślisz.
Dlatego wszystkie takie skrypty są opatrzone błędem. Jak dużym to zależy od Ciebie.

Zwróć uwagę, że często widzi się napisy jak na tym forum:
82 użytkowników aktywnych przez ostatnie 15 minut

Zwyczajowo użytkownika uznaje się za aktywnego przez pewien czas po jego ostatniej akcji. Jak długi to czas? To zależy od Ciebie i natury serwisu. 5min., 10min., 15min., ...
Mlodycompany
a wpadlem jeszcze na pomysl automatycznego konczenia sesji np po 15min, czy user jest aktywny czy nie. Wtedy by było wiadomo kto jest online i mniej wiecej ile jest online
marcio
Jak widzisz ja z bazy usuwam co 5min user'a jak zamknie przegladarke to juz inny problem
Mlodycompany
to jak sa zbudowane profesionalne skrypty. przeciez jest jakies wyjscie na kasowanie danych po wyjsciu ze strony
Piniek
no to cronem odpalaj skrypt co 15minut, ktory bedzie zmienial wartosc pola na ofline u wszystkich u ktorych ostatnia akcja zostala wykonana pozniej niz 15minut temu
bim2
Ale po co męczyć crona co 15min? snitch.gif Niech w skrypcie pobiera useró o ostatniej aktywnosci mniejszej niz 15min a crona co np. 24h do wyczyszczenia caklej tabeli. Będzie wydajniej. :]
Mlodycompany
yy Panowie może troche jaśniej, a najlepiej skrypty dac biggrin.gif
bim2
~marcio już Ci kod podał ładny. I tam gdzie masz logowanie usera dajesz (po zalogowaniu) <?php online($nickname); ?>
Oczywiście zmienna $nickname zastąp taką jaką masz z nickiem usera smile.gif
Mlodycompany
@bim2 ale zauważ to kwestie, że jeżeli user zamknie strone to nadal bedzie online
Piniek
Cytat(Piniek @ 19.04.2008, 11:24:00 ) *
no to cronem odpalaj skrypt co 15minut, ktory bedzie zmienial wartosc pola na ofline u wszystkich u ktorych ostatnia akcja zostala wykonana pozniej niz 15minut temu



Cytat(bim2 @ 19.04.2008, 11:35:01 ) *
Ale po co męczyć crona co 15min? snitch.gif Niech w skrypcie pobiera useró o ostatniej aktywnosci mniejszej niz 15min a crona co np. 24h do wyczyszczenia caklej tabeli. Będzie wydajniej. :]


no to przeczytaj jeszcze raz to winksmiley.jpg
Mlodycompany
@piniek ja już z tego nic nie kumam. Dajcie mi skrypt bo takie gadanie co lepsze to przerost formy nad treścia biggrin.gif
Piniek
tabela przechowujaca id usera i date ostaniej akcji
Kod
user_id | timestamp


w zapytaniu gdzie pobierasz uzytkownikow zalogwanych dajesz WHERE czas ostatniej akcji nie jest wiekszy niz 15 minut i koniec

P.S : porwonywanie czasów w zapytanich było gdzies ostatnio na forum winksmiley.jpg poszukaj sobie
Mlodycompany
dobra zrobiłem tak:
tabela

login | czas | ip

funkcja
  1. <?php
  2. function online($user) {
  3. $sql = "UPDATE `users` SET `zalogowany` = '1' WHERE `ID` = '".$users[0]."' LIMIT 1"; 
  4. mysql_query($sql);
  5. $user = $_SESSION['login'];
  6. $remote = $_SERVER['REMOTE_ADDR']; 
  7. $aktualny_czas = time();
  8. $limit = 15;
  9. $zostalo = $aktualny_czas - $limit;
  10. $dodaj = ("INSERT INTO online(login,czas,ip) VALUES('$user','$aktualny_czas','$remote')");  
  11. $rezultat = mysql_query($dodaj);
  12.  
  13. }
  14. ?>

i w indexie zamieściłem
  1. <?php
  2. $wynik = mysql_query("SELECT * FROM `online` WHERE `login` = '".$_SESSION['login']."'");
  3. $wynik_suma = mysql_num_rows($wynik);
  4.  
  5. if($_SESSION['zalogowany'] == true && $wynik_suma == 0){
  6. online($_SESSION['login']);
  7. }
  8. else if($_SESSION['zalogowany'] == true && $wynik_suma == 1){
  9. $zmien = mysql_query("UPDATE `online` SET `czas` = '".time()."' WHERE `login` = '".$_SESSION['login']."' LIMIT 1");
  10.  
  11. }
  12. ?>

I działa biggrin.gif

Chciałbym dodać do tabeli komorke `strona` gdzie by pokazywalo na jakiej stronie siedzi user.
Moja IDEA do wyswietlana calego paska URLjest taka:
  1. <?php
  2. $strona = $_SERVER['HTTP_HOST'] + $_SERVER['PHP_SELF'] + $_SERVER['QUERY_STRING'];
  3. ?>

Ale to niezbyt działa bo pokazuje wartosc 0. Czy jest jakas funkcja która pokazuje URL, a moze da sie to w jakis inny sposob zrobic??

Juz znalazlem:D

<?php
$strona = $_SERVER['HTTP_REFERER'];
?>
marcio
NIe zadane http_referef bo to pokazuje strone z jakiej sie weszlo czyli poprzednia smile.gif ogolnie dodajesz do bazy nasteona kolumna strona varchar(60)
POtem zapisujesz do jakies zmiennej strone na ktprej aktualnie sie jest i zapisujesz do bazy razem tak jak to robi ten moj skrypt tylko dodaj te pole potem przy pobieraniu masz ogolnie regulke ktora pokzauje wszystkich user'ow online w servisie i potem robisz drugioe zapytanie dla danej podstrony
  1. <?php
  2. $strona = $_SERVER['PHP_SELF'];
  3. //najpierw zapisujesz
  4. $query('select * from online where strona = "'.$strona.'"');
  5. $result = mysql_query($query, $db);
  6. ?>

Rozumiesz mniej wiecej??
Mlodycompany
kumam kumam, ale czy nie ma funckji ktora pokazuje obecny adres url?questionmark.gif
marcio
Ja o takiej nie slyszalem i watpie ze taka jest smile.gif
Mlodycompany
poradzilem sobie juz
Babcia@Stefa
Drobna uwaga na przyszłość.

  1. <?php
  2. $strona = $_SERVER['HTTP_HOST'] + $_SERVER['PHP_SELF'] + $_SERVER['QUERY_STRING'];
  3. ?>


Znak "+" to operacja matematyczna dodawania, a nie łączenia stringów, od tego jest znak ".".

  1. <?php
  2. $strona = $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
  3. ?>


Pozdrawiam, Babcia@Stefa
MWL
Cytat(Mlodycompany @ 19.04.2008, 23:29:19 ) *
kumam kumam, ale czy nie ma funckji ktora pokazuje obecny adres url? questionmark.gif


echo $_SERVER['REQUEST_URI'];

pozdrawiam.
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.