Licznik Gości online

2011-02-18 14:42:21 Post #1 korey

 
[size=16]Witam ponownie![/size]
Dziś chciałem zaprezentować prosty licznik pokazujący aktualna ilość gości online na stronie.
Licznik działa na PHP/MySQL i jest zaprezentowany w funkcji.

Dodajemy tabelkę do naszej bazy danych:
CREATE TABLE `goscie_online` (
`ip` varchar(15) NOT NULL default '',
`datetime` time NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`ip`)
) TYPE=MyISAM;
Kod php:
<?php
function goscieOnline(){

/*
tutaj jakieś połączenie z Twoja baza danych
mysql_connect();
mysql_select_db();

Gdy juz połączenie mamy ustawione deklarujemy zmienne:
*/

// byly czas
$bylo = date('Y-m-d H:i:s', time()-5*60); // 5 min
// Aktualny czas
$teraz = date('Y-m-d H:i:s', time()); // 5 min
// adres ip
$ip = $_SERVER['REMOTE_ADDR'];

// Usuwamy wszystkie wpisy starsze niz 5 minut
$sql = "DELETE FROM `goscie_online` WHERE `date`<'$bylo'";
mysql_query($sql) or die('<br /><br />ZAPYTANIE: '.$sql.'BŁĄD: '.mysql_error());


// Dodajemy nowe ip i godzine wejscia na strone
$sql = "INSERT INTO `goscie_online` (ip,date) VALUES('$ip','$teraz') ON DUPLICATE KEY UPDATE ip=VALUES(ip), date='$teraz'"; // Pomoc Nospora
mysql_query($sql) or die('<br /><br />ZAPYTANIE: '.$sql.'BŁĄD: '.mysql_error());


// liczba online w ciagu 5 minut
$sql = "SELECT COUNT(*) FROM `goscie_online` WHERE `date`>'$bylo'";
$odp = mysql_query($sql) or die('<br /><br />ZAPYTANIE: '.$sql.'BŁĄD: '.mysql_error());
$row = mysql_fetch_array($odp);
$goscieOnline = $row[0];//pobranie liczby rekordów

//echo $goscieOnline;
return $goscieOnline;
}
?>
Wyświetlanie licznika:
<?php echo goscieOnline(); ?>

Mam nadzieje że może kiedyś komuś to się przyda.
Pozdrawiam Korey

2011-02-18 14:54:04 Post #2 nospor

 
1) Przy aktualizacji IP powinno się wstawiac data aktualna.
2) By pobrać liczbę uzytkowników pobierasz wszystkie rekordy? Oj.... strasznie nieoptymalne. Liczbę należy obliczyć już w bazie poprzez count()

2011-02-18 14:57:54 Post #3 nospor

 
No i funkcja nie powinna robić echo a return. Złe wykomentowałeś

2011-02-18 15:29:24 Post #4 korey

 
robiłem na początku count(); ale zmieniłem bo wydawało mi się ze mysql_num_rows() będzie lepsze
[quote]Korey napisał:
echo $goscieOnline;
//albo
//return $goscieOnline; [/quote]
Z założenia ta funkcja miała odrazu po wywołaniu wyświetlać wynik.
przy return do wywołania potrzebne by było echo/ print. dlatego by nie robic echo goscieOnline(); dalem echo w funkcji.
[quote]Nospor napisał:
Przy aktualizacji IP powinno się wstawiac data aktualna.[/quote]Pewnie chodzi o ten kawałek: KEY UPDATE ip=VALUES(ip), date=(date)"; masz racje zamiast date=(date) powinno być date='$teraz'.

No ale skoro sam mietrz mnie poucza to coś w tym musi być. Wszystko poprawione. teraz możecie cieszyć się dobrym i przyjaznym skryptem.

2011-02-19 17:14:56 Post #5 Comandeer

 
Dawno nikogo nie wkurzałem, to trza szpileczkę wbić
Wyobraźmy sobie osiedle, na którym mieszkają 1852 osoby. Wszyscy korzystają z jednego światłowodu, toteż mają jedno IP (tak, wiem, przypadek ekstremalny ). Twój skrypt wyświetli 1 osobę, podczas gdy serw padnie od nadmiaru jednoczesnych połączeń!
A tak na serio skrypt sprawdza się świetnie. A już w ogóle time w bazie danych mnie połechtał - wszyscy walą to do INT, a tu jeden poprawny
BTW nospor, przez przypadek nacisnąłem 'Subskrybuj temat' zamiast 'Odpowiedz' i jakoś nie widzę buttona z napisem 'Odsubskrybuj'

2011-02-19 17:33:39 Post #6 korey

 
To rozumiem ze wszystko jest jak trzeba
tu sie usuwa http://forum.nospor.pl/subscribedtopic/ albo tu http://forum.nospor.pl/subscribed/

2011-02-19 17:36:23 Post #7 Comandeer

 
Tak, wszystko jest jak trzeba. Podziękował

2011-03-22 08:23:22 Post #8 gość_gosc

 
ON DUPLICATE KEY UPDATE ip=VALUES(ip), date='$teraz'"; // Pomoc Nospora

moze mi to ktos wytlumaczyc? nie rozumiem po co to DUPLICATE w zapytaniu ;/

poza tym nie lepiej uzywac time() zamiast date() ?

2011-03-22 08:34:49 Post #9 nospor

 
moze mi to ktos wytlumaczyc? nie rozumiem po co to DUPLICATE w zapytaniu ;/
Może się okazać, że dane IP jest już w tabeli. A na IP mamy założony klucz główny więc IP nie może się powtarzać. Więc w przypadku, gdy to IP już będzie to sam INSERT się wyłoży. Dodając do niego formułkę z DUPLICATE spowodujemy, że gdy IP będzie to insert się nie wyłoży a zostanie wykonane to co jest po DUPLICATE czyli w tym przypadku zostanie zakutalizowana data.

poza tym nie lepiej uzywac time() zamiast date() ?
zauważyłem dopiero teraz, że pole tam jest typu TIME - no źle. powinno być datetime i powinno się wkładać pełną datę z czasem.
Co do time() date() - tutaj date służyło do sformatowania czasu.

2011-03-22 14:00:54 Post #10 korey

 
Dlaczego powinno byc datetime.? licznik liczy gości odwiedzających stronę bodajże w ciągu ostatnich 5 minut.. datetime nie jest tu w/g mnie konieczne

2011-03-22 14:06:05 Post #11 nospor

 
No a jak będziesz miał minutę przed północą? Dawaj datę i nie marudź

2011-06-01 16:21:27 Post #12 gość_xxdrago

 
nospor, czy mógłbyś napisać ten skrypt poprawnie

2011-06-02 12:19:37 Post #13 nospor

 
No to masz tu wszystko podane. Jedynie trzeba uwzględnić poprawki, które zgłaszałem

2011-06-12 17:49:01 Post #14 korey

 
Na szybko wprowadziłem te upragnione zmiany, ale jeszcze nie sprawdzałem czy to działa bo na tym kompie nie mam serwera

2012-01-14 18:48:54 Post #15 gość_Miłek

 
Jest pomieszane w nazwach.

Tworzymy tkolumne "datetime" a odwołujemy się do "date". Trzeba poprawić bo inaczej skrypt nie działa.

2014-06-15 22:09:26 Post #16 gość_piotrek

 
poprawki są w kodzie na górze?
czy trzeba poprawiać z komentarzami użytkowników?

2014-06-16 08:23:06 Post #17 nospor

 
W pierwszym kodzie raczej już są poprawki

Odpowiedz

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer