QARK.net — Počítadlo přístupů v PHP - 1. část
Počítadlo přístupů v PHP - 1. část

Počítadlo přístupů v PHP – 1. část

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.


Vytvoření tabulky

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;
 

Počítadlo přístupů

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()."');");
}
 

Výpis návštěvníků

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

Použití

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

Soubor ke stažení

Zdrojový soubor si můžete stáhnout [ZDE]



Související články:
Qark | 13. 07. 2005 21:39 | Komentáře: 18 | ::Programování


Přidat článek do: [ linkuj.cz], [ jagg.cz], [ asdf.sk], [ del.icio.us]

Stáhnout článek jako [ PDF]
[ RSS komentářů] k článku

[ Napsat] komentář

Články a fotografie z tohoto webu je zakázáno kopírovat a přidávat si je na svoje blogy, či kamkoliv jinam, bez mého písemného souhlasu!

Komentáře


1
kajinek32 13. 07. 2005 22:22

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!


2
Navi 13. 07. 2005 22:54

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 komentář: Qark #3Načítám náhled komentáře...

3
Qark url 13. 07. 2005 23:05

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.

Reakce na komentář: Navi #6Načítám náhled komentáře...

4
pif 14. 07. 2005 09:18

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 komentář: Qark #5Načítám náhled komentáře...

5
Qark url 14. 07. 2005 10:30

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ší.


6
Navi 15. 07. 2005 20:58

Reakce na Qark #3Načítám náhled komentáře...: FF4Linux, po vycachovani je to ok


7
gspy 28. 11. 2005 20:10

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 komentář: Qark #8Načítám náhled komentáře..., gspy #9Načítám náhled komentáře...

8
Qark url 28. 11. 2005 20:15

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?


9
gspy 28. 11. 2005 20:38

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


10
gspy 02. 12. 2005 20:03

tak jsem na to přišel. udělal jsem tu tabulku přímo na servru. dík


11
dalaman 02. 07. 2006 16:34

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?


12
očko 26. 02. 2007 19:25

mám stejný problém jako qspy#7.. ale nepodařilo se mi ho vyřešit.. poradíte mi ..


13
Pavel 21. 03. 2008 14:55

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?


14
Milan 12. 04. 2008 07:33

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 komentář: Punx #15Načítám náhled komentáře...

15
Punx 28. 04. 2008 23:09

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


16
Sifik 02. 05. 2008 21:47

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 komentář: spichy #17Načítám náhled komentáře...

17
spichy 16. 07. 2008 01:50

Reakce na Sifik #16Načítám náhled komentáře...: přepiš hodnotu 0000–00–00 na 00–00–0000 a máš to ;-)


18
radicz 10. 08. 2008 17:09

To nefachčí musíš tam dát 00.00.0000 pak to jde

Přidej komentář

Web je nyní kompletně uzavřen. Od této chvíle není možné přidávat žádné komentáře!

Další informace naleznete zde.