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