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 guest_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 guest_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 guest_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 guest_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

Answer

Recently commented

  1. Mysql - FAQ Paweł
  2. Pager 2.5.1 oraz EPa... Na szybko2
  3. Pager 2.5.1 oraz EPa... Sławek
  4. Mysql - FAQ Piotr
  5. Liczba dni roboczych Na szybko2
  6. Liczba dni roboczych Naszybko
  7. Klasa widoku nospor

Categories

  1. wszystkie wszystkie komentarze all (1)