Pokud si chcete na web umístit počítadlo přístupů, které počítá kolik lidí je právě online, kolik lidí vás navštívilo tento den a kolik lidí vás navštívilo celkem, nabízím vám rychlé a jednoduché řešení. Potřebovat budete PHP a MySQL.
Na všechno nám bude stačit jedna jediná tabulka, do které se vkládají IP adresy, datum návštěvy a čas posledního přístupu.
CREATE TABLE `pocitadlo` ( `ip` varchar(19) NOT NULL DEFAULT '', `datum` date NOT NULL DEFAULT '0000–00–00', `cas` int(10) NOT NULL DEFAULT '0', KEY `datum` (`datum`) ) TYPE=MyISAM;
IP adresy budeme ukládat do tabulky pomocí funkce pocitadlo()
.
Nejprve zjistíme IP adresu, a pak zkontrolujeme, jestli se nachází v databázi. Pokud ne, vložíme ji. Pokud ano, upravíme čas přístupu na aktuální.
Úprava času je důležitá, abychom mohli později zjistili, kolik lidí je právě online.
function pocitadlo() { # funkce zjisti, jestli je dnes v tabulce navstevnik a podle toho ho bud vlozi, nebo mu zmeni cas navstevy na aktualni $ip = getenv("REMOTE_ADDR"); //zjistime IP #zjistime, jestli se IP dnes nachazi v tabulce $dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum=NOW() AND ip='$ip'"); #jestli tam je, tak zmenime cas navstevy (kvuli online uzivatelum) if (mysql_num_rows($dotaz)) $dotaz2 = mysql_query("UPDATE pocitadlo SET cas='".time()."' WHERE datum=NOW() AND ip='$ip'"); else #pokud neni, tak IP vlozime $dotaz2 = mysql_query("INSERT INTO pocitadlo (ip, datum, cas) VALUES('$ip',NOW(),'".time()."');"); }
Nakonec ještě vytvoříme funkci, které nám vrátí pole s počtem lidí online, celkem a dnes.
První MySQL dotaz ve funkci navstevy()
vrátí počet všech uložených IP adres. Druhý dotaz vrací počet IP adres za tento den. Poslední dotaz vybere počet návštěvníků, kteří se na web podívali v uplynulých třech minutách = 180 sekund.
function navstevy() { #funkce vraci pole s poctem navstev $navstevnici = array(); #vybereme pocet vsech ulozenych IP adres $dotaz = mysql_query("SELECT count(*) FROM pocitadlo"); #vlozime hodnotu do pole list($navstevnici['celkem'])=mysql_fetch_array($dotaz); #vybereme pocet unikatnich dennich IP adres pro dnesni den $dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW()"); #vlozime hodnotu do pole list($navstevnici['dnes'])=mysql_fetch_array($dotaz); #vybereme dnesni IP, ktere nejsou starsi nez 180 sekund = 3 minuty $dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW() AND cas>='".(time()-180)."'"); #vlozime hodnotu do pole list($navstevnici['online'])=mysql_fetch_array($dotaz); # vratime pole # $navstevnici['celkem'] = pocet navstev celkem # $navstevnici['dnes'] = pocet navstev za dnesni den # $navstevnici['online'] = pocet navstev, ktere nejsou starsi jak 3 minuty return $navstevnici; }
No a nakonec jen stačí připojit se k databázi, zavolat funkci pocitadlo()
, a potom si můžete nechat vypsat počet návštěvníků, třeba takto:
#pripojime se k databazi #zavolame pocitadlo pocitadlo(); #vytvorime pole s pristupy $navstevnici = navstevy(); #pole $navstevnici vypiseme echo "ONLINE: $navstevnici[online]<br> DNES: $navstevnici[dnes]<br> CELKEM: $navstevnici[celkem]<br>";
Zdrojový soubor si můžete stáhnout [ZDE]
juu Qarku, já tě měl vždycky jenom za experta na ženský teda jako ne že bych od tebe nečekal tento tutorial, ale (i díky tomu proužku vlevo) je dokonale přehledný! super!
akorat se to u monospace nezalamuje a vyleza ze stranky.
jinak u existujicich zaznamu jeste pridavam 'hitcount', abych tusil jak moc si to prohlizel
Reakce na Navi #2Načítám náhled komentáře...: Jaky mas prohlizec? Zkus si dat obnovit, menil jsem css aby se ten zdrojak roloval a ve FF je treba provest obnoveni stranky.
Pridat si hitcount do ukazky je uz malickost .
Na tomto webu mam statistiku samozrejme trosku jinaci a pocitam i prohlizece a podobne veci. Na rozsahlejsi statistiku mam zase na serveru awstats. Tahle ukazka mela byt jen takova zakladni a jednoducha.
docela s vyhodou by se daly pouzit fce dateadd v mysql, strucne nastineni je treba tady http://www.php-weblog.com/archiv/2005/unor/8/jak-pouzivat-datetime-v-mysql.html
Reakce na pif #4Načítám náhled komentáře...: právě tou výhodou si nejsem tak jistý. Sice bych ušetřil sloupec "čas", sloupec "datum" bych změnil na datetime
, ale potom bych se musel v selectech ptát jestli rok, měsíc a den z datumu jsou stejné jako dnešní. Použít dotaz jestli DATE(datum)=CURDATE()
jde totiž až od MySQL 4.1.1.
Potom by sice šlo krásně využít DATE_ADD()
, DATE_SUB()
na online návštěvníky, ale kvůli WHERE YEAR(datum)=YEAR(NOW()) AND MONTH(datum)=MONTH(NOW()) AND DAYOFMONTH(datum)=DAYOFMONTH(NOW())
nebo DATE_FORMAT(datum,'%Y-%m-%d')=CURDATE()
či nějaké substringové metodě, pro zjištění dnešního data z datetime
, jsem raději přidal i sloupec "čas" a "datum" nechal jako date
. Přijde mi to přehlednější a rychlejší.
Reakce na Qark #3Načítám náhled komentáře...: FF4Linux, po vycachovani je to ok
Může mi někdo poradit proč když to hodím na net nak mi to píše – Warning: mysql_query(): Access denied for user: 'root@localhost' (Using password: NO) in …index.php
– Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in …index.php
– Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in… index.php
Reakce na gspy #7Načítám náhled komentáře...: A máš na netu potřebné tabulky a správné připojení k databázi?
jsem úplný začátečník zkouším co a jak. opsal jsem kód do php a uložil jako index.php v mysql jsem vytvořil databazi a to takto CREATE DATABASE POCITADLO; potom USE POCITADLO; potom jsem opsal kód a celé jsem to zkopíroval pomocí ftp na moje www. a píše mi to.. viz Reakce na gspy #7Načítám náhled komentáře...: gspy. Nevíš co s tím dík
tak jsem na to přišel. udělal jsem tu tabulku přímo na servru. dík
Cauko qark. Skopiroval som si cely tvoj skript do kodu a vytvoril tabulku v db ale nejde mi pocitadlo spravne. Online mi pose stale 0 a celkovy pocet sa zvysi len raz denne.. WHY?
mám stejný problém jako qspy#7.. ale nepodařilo se mi ho vyřešit.. poradíte mi ..
když tak na to koukám. Tak bych řekl, že pokud bude uživatel přistupovat stále ze stejné IP celý rok. Tak mi ho to za rok bude brát, jako, že byl na webu jen jednou. Podle mě by to mělo být. takže ho to ten den počítá jednou. ale když přijde další den počítáho to znova. co myslíte?
tiež si myslím, že bude počítať užívateľov z rovnakej IP adresy len raz a vždy im iba zmení dátum (čas) prístupu na aktuálny. alebo nie?
Reakce na Milan #14Načítám náhled komentáře...: Taky mi to tak prijde, ale vyzkousel jsem to a zahadnym zpusobem to funguje spravne
Ahoj do SQL dotazu jse dal:
CREATE TABLE `pocitadlo` (
`ip` varchar(19) NOT NULL DEFAULT '',
`datum` date NOT NULL DEFAULT '0000–00–00',
`cas` int(10) NOT NULL DEFAULT '0',
KEY `datum` (`datum`)
) TYPE=MyISAM;
a hodilo mi to
SQL-dotaz:
CREATE TABLE `pocitadlo` (
`ip` varchar( 19 ) NOT NULL DEFAULT '',
`datum` date NOT NULL DEFAULT '0000–00–00',
`cas` int( 10 ) NOT NULL DEFAULT '0',
KEY `datum` ( `datum` )
) TYPE = MYISAM
MySQL hlásí:
#1067 – Invalid default value for 'datum'
nevíte co s tím jsem uplný začátečník
Reakce na Sifik #16Načítám náhled komentáře...: přepiš hodnotu 0000–00–00 na 00–00–0000 a máš to
Web je nyní kompletně uzavřen. Od této chvíle není možné přidávat žádné komentáře!
Další informace naleznete zde.