V tomto PHP scriptu zjistíte denní, průměrnou za den, týdenní, měsíční, celkovou a unikátní návštěvnost. Pokud vám to bude stačit, tak se na to můžeme s chutí vrhnout a nenechte se odradit délkou scriptu, stačí umět zmáčknout Ctrl+C a Ctrl+V.
Nejprve si vytvořte v MySQL tabulky:
CREATE TABLE poc_celkem ( pocet int(11) NOT NULL default '0' ); CREATE TABLE poc_dnes ( datum date NOT NULL default '0000-00-00', pocet int(11) NOT NULL, PRIMARY KEY (datum) ); CREATE TABLE poc_host ( ip varchar(20) NOT NULL, datum date NOT NULL, PRIMARY KEY (ip) ); CREATE TABLE poc_mesic ( mesic date NOT NULL default '0000-00-00', pocet int(11) default NULL, PRIMARY KEY (mesic) );
Nyní si vytvořte vstup do databáze v souboru db.php
<?php $server_name = "localhost"; /* adresa serveru MySQL */ $db_name = "crazydog"; /* Jméno databáze MySQL */ $db_user = "root"; /* Uživatelské jméno pro MySQL */ $db_password = ""; /* Heslo k MySQL */@$spojeni = mysql_connect($server_name, $db_user, $db_password) or die ("Omlouvám se, ale databáze je dočasně nedostupná."); mysql_select_db($db_name, $spojeni) or die (mysql_error()); ?>
V souboru index.php nyní vložte úplně nahoru:
<?php session_start(); include("./db.php"); include("./navstevnost.php"); ?>
A nyní vytvořte soubor navstevnost.php do kterého vložte:
<?php /* Jednodenní kontrola pro menší zátěž serveru */ if($_SESSION['navstevnost'] != date("d-n-y")) { /* Byl dnes už započítán? */ $zadnes = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host WHERE ip='$ip' AND datum='".date("Y-m-d")."';")); if($zadnes['pocet'] == 0) { /* Ne? Tak ho započítáme */ $byluz = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host WHERE ip='$ip';")); if($byluz['pocet'] == 0) { $pocitat = true; mysql_query("INSERT INTO poc_host VALUES('".$ip."', '".date("Y-m-d")."')"); } else { $pocitat = true; mysql_query("UPDATE poc_host SET datum='".date("Y-m-d")."' WHERE ip='".$ip."'"); } if($pocitat) { /* Návštěvnost celkem */ if(mysql_num_rows(mysql_query("SELECT * FROM poc_celkem")) != 0) { $celkem = mysql_result(mysql_query("SELECT * FROM poc_celkem"), 0) + 1; mysql_query("UPDATE poc_celkem SET pocet=pocet+1"); } else { $celkem = 1; mysql_query("INSERT INTO poc_celkem VALUES(1)"); } /* Měsíční návštěvnost */ $aktmesic = mysql_fetch_object(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".date("Y-m-00")."'")); $mesic = $aktmesic->pocet+1; if($mesic == 1) { mysql_query("INSERT INTO poc_mesic VALUES('".date("Y-m-00")."', 1)"); } else { mysql_query("UPDATE poc_mesic SET pocet=pocet+1 WHERE mesic='".date("Y-m-00")."'"); } /* Denní návštěvnost */ $zaznam = mysql_fetch_object(mysql_query("SELECT * FROM poc_dnes WHERE datum='".date("Y-m-d")."'")); $dnes = $zaznam->pocet+1; if($dnes == 1) { mysql_query("INSERT INTO poc_dnes VALUES('".date("Y-m-d")."', 1)"); } else { mysql_query("UPDATE poc_dnes SET pocet=pocet+1 WHERE datum='".date("Y-m-d")."'"); } } $_SESSION['navstevnost'] = date("d-n-y"); } else { $_SESSION['navstevnost'] = date("d-n-y"); } } ?>
V poslední fázi už jen stačí zobrazit naměřená data, které si zobrazíme v souboru statistiky.php. Pokud soubor nebude includovan do index.php, tak za <?php přidejte ještě include(„./db.php“); a script bude vypadat následovně:
<?php /* Celkem */ $celkem = mysql_fetch_array(mysql_query("SELECT * FROM poc_celkem;")); $poc_celkem = $celkem['pocet']; /* Unikátní IP */ $celkem_unikat = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host")); $celkem_unikat = $celkem_unikat['pocet']; /* Za měsíc */ $mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE DATE_FORMAT(mesic,'%Y-%m')= DATE_FORMAT(NOW(),'%Y-%m');")); $poc_mesic = $mesic['pocet']; switch (date("n")) { case 1 : $mes = "leden"; break; case 2 : $mes = "únor"; break; case 3 : $mes = "březen"; break; case 4 : $mes = "duben"; break; case 5 : $mes = "květen"; break; case 6 : $mes = "červen"; break; case 7 : $mes = "červenec"; break; case 8 : $mes = "srpen"; break; case 9 : $mes = "září"; break; case 10 : $mes = "říjen"; break; case 11 : $mes = "listopad"; break; case 12 : $mes = "prosinec"; break; } /* Minulý měsíc */ $minuly_mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE DATE_FORMAT(mesic,'%Y-%m')= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 MONTH),'%Y-%m');")); $minuly_mesic = $minuly_mesic['pocet']; /* Tento týden */ if(date("l") == "Monday") {$denvtydnu = -1; $tydodecist = -7;} if(date("l") == "Tuesday") {$denvtydnu = -2; $tydodecist = -8;} if(date("l") == "Wednesday"){$denvtydnu = -3; $tydodecist = -9;} if(date("l") == "Thursday") {$denvtydnu = -4; $tydodecist = -10;} if(date("l") == "Friday") {$denvtydnu = -5; $tydodecist = -11;} if(date("l") == "Saturday") {$denvtydnu = -6; $tydodecist = -12;} if(date("l") == "Sunday") {$denvtydnu = -7; $tydodecist = -13;} $tyden = mysql_fetch_array(mysql_query("SELECT SUM(pocet) AS pocet FROM poc_dnes WHERE datum > ADDDATE(now(), '".$denvtydnu."')")); $poc_tyden = $tyden['pocet']; /* Minulý týden */ $minulytyden = mysql_fetch_array(mysql_query("SELECT SUM(pocet) AS pocet FROM poc_dnes WHERE datum BETWEEN ADDDATE(now(), '".$tydodecist."') and ADDDATE(now(), '".$denvtydnu."')")); $minulytyden = $minulytyden['pocet']; /* Dnes */ $dnes = mysql_fetch_array(mysql_query("SELECT * FROM poc_dnes WHERE DATE_FORMAT(datum,'%Y-%m-%d')= DATE_FORMAT(NOW(),'%Y-%m-%d');")); $poc_dnes = $dnes['pocet']; /* Průměrně za den */ $prumer_den = mysql_fetch_array(mysql_query("SELECT avg(pocet) AS prumer FROM poc_dnes;")); $denni_prumer = @round($prumer_den['prumer']); ?>Celkem: <strong><?=$poc_celkem?></strong><br /> Unikátní IP: <strong><?=$celkem_unikat?></strong><br /> Za <?=$mes?>: <strong><?=$poc_mesic?></strong><br /> Minulý měsic: <strong><?=$minuly_mesic?></strong><br /> Tento týden: <strong><?=$poc_tyden?></strong><br /> Minulý týden: <strong><?=$minulytyden?></strong><br /> Dnes: <strong><?=$poc_dnes?></strong><br /> Průměrně za den: <strong><?=$denni_prumer?></strong>
A v příštím článku si ukážeme jak z tohohle počitadla udělat do grafu měsíční statistiku.
Štítky:
PHP,
tutoriál,
zobrazit všechny štítky
! Našli jste v článku gramatické či pravopisné chyby? Je to z důvodu autorovy nemoci zvané dysgrafie. Tudíž všem děkuji za pochopení a každý článek pokud možno nechávám projít korekturou. !
Mě se ten článek moc líbil. Něco takového jsem hledal. ;-)
No ten
switch (date("n")) { case 1 : $mes = "leden"; break; case 2 : $mes = "únor"; break; atd… }to teda neni moc dobre reseni
$datum = date("n") - 1; $mesice = array("leden", "únor", "březen","duben", "květen", "červen","červenec", "srpen", "září","říjen", "listopad", "prosinec");???$ted = $mesice[$datum]; echo $ted;
RuMeC: array nebo switch, není to jedno? Je sice pravda, že array pracuje rychlejší (aspoň myslím), ale účel to má stejný, jen jsem se více upsal. Nějak jsem nad tím nepřemýšlel, ale jinak máš pravdu. Je to lepší. A příště formátuj.
no maš pravdu že je to stejne …
rozdil je pouze v delce kodu … u switch si vice procvičiš prsty
jo sry za to formatovani …
Celkem šílenost :) Doplnil bych tam poznámku ?vhodné jen pro menší weby? .
DJMiky: Proč pro menší? To je snad jedno kdo to využije nebo to je něčím dané?
Celkem jo, zátěží… Spouštět na každé stránce několik SQL dotazů jenom kvůli statistice při větší návštěvnosti spolehlivě zabíjí databázi, zvlášť když jseš na sdíleném hostingu.
DJMiky: A kdo říkal, že se bude spouštět na každé stránce? Kdyby jsi si to prostudoval, tak zjistíš, že script provede zápis jen jednou za den pro jednoho člověka (tedy ip) a potom už nic. Jen čtení z databáze je kapánek náročnější a proto je ve zvláštním souboru, kde se zas tolik lidí nedivá.
peknej zdrojak, supa ze si to sepsal takle vsechno (pouzil sem to na nekomercnim webu)… co se tyce tech pristupu do DB, je to lepsi, nez do souboru ;) jak to jinak resit..
Zdravim, mam mensi problem, nefunguje mi ta statistika, nepricitaji se mi tam navstevy, teda pricitaji ale jen jedna za den CELKOVE, ne jako jedna z jedne IP adresy, ale z vice ruznych IP a nepricita se to, kdybys me mhl napriklad kontaktovat na ICQ(279069824) a nebo na meilu, byl bych ti zaazany
Prometheus: A ukládá se ti do databáze IP nebo jen prázdné poličko?
no ten kod na zjisteni dve v tydnu to je taky docela spatnej vtip nemyslis? xD
$denvtydnu = date("N")*-1;
ti hodi uplne to samy…
a v navstevnost.php mas hafo zbytecnejch sql query a nektery podminkovy konstrukce taky …zkus si ten kod trosku zrevidovat, urcite na to prijdes i sam ;)
{1} mě se ukládá jen prázdné políčko
me se take uklada jen prazdne policko…
K cemu to, kdyz existuje Google Analytics a na 99procentech hostingu bezi AWstats?
starenka: Třeba to, že ti to vyplivne reálná čísla. Což GAnalitics, AWstats, TopList ti vyplivnou úplně jiná čísla (menší) a ani mezi sebou se neshoduji.
Rekl bych, ze problem je v tom, za jak dlouho se znova zapocita stejna ip. AWstats jsou generovany primo z servrovejch logu, takze nevidim duvod, proc by meli bej mimo. Ale mozna se pletu
Btw rekl bych, ze tvuj skript musi taky pocitat min. Nejde preci jen o ip - spousta lidi ma treba ve firme internet pres jednu proxy. Rozhodne bych porovnaval i User-Agent, nebo poslal kolacek.
starenka: A jaké jsou šance, že v nějaké firmě se zrovna kouknou dva lidé ve stejný den na „tento web“? A i kdyby se stala taková neuvěřitelná náhoda, tak každý tu 1 návštěvu oželí…
Ahoj, nainstaloval jsem si tenhle script, ale i když i když se na web podívá 10lidí tak statistiky.php vypisují pouze jednoho. :(
Hmm pěkně podrobný návod, ale nefunguje.
Tak funguje, ale počítá to jen návštěvu s mou IP adresou za den. V čem může být chyba?
Nevšiml jsem si, že by byla definovaná proměnná IP
Super, konečně rada, ale rada se kterou si nevím rady. Poradíš tedy tedy jak udělat proměnu IP?
an-121: To je fakt. Toho jsem si nevšiml :)
Chyba byla, že opravdu nebyla definovaná proměnná $ip.
Je to ve scriptu opravené. Stačí připsat:
$ip = $_SERVER['REMOTE_ADDR'];
Super, ale nevím kam tento řádek připsat, připsal jsem ho pod
/* Dnes */ $dnes = mysql_fetch_array(mysql_query("SELECT * FROM poc_dnes WHERE DATE_FORMAT(datum,'%Y-%m-%d')= DATE_FORMAT(NOW(),'%Y-%m-%d');")); $poc_dnes = $dnes['pocet'];
Takže to vypadá nějak takto:
/* Dnes */ $dnes = mysql_fetch_array(mysql_query("SELECT * FROM poc_dnes WHERE DATE_FORMAT(datum,'%Y-%m-%d')= DATE_FORMAT(NOW(),'%Y-%m-%d');")); $poc_dnes = $dnes['pocet']; $ip = $_SERVER['REMOTE_ADDR'];
A ještě bych měl jednu otázečku, a to: Nevěděl by si náhodou jak napsat funkci která by nepočítala mou ip adresu?
{91} Podívej se do článku, je to tam opravené. Hned ve třetím kódu. A s tou IP to je dost těžko, protože se občas mění… To by muselo jet např přes cookies, které by neslo hodnotu, kterou by script před zápisem kontroloval.
{1} Upraveno, ale stále nejde, nevím proč. Kde může být ještě chyba? V databázi se do tabulek taky zapisuje jen to co vidím v napsaném scriptu. Až se tento problém vyřeší, tak bych měl hned další návrh pro zdokonalení scriptu, a to vynulování statistiky.
To jsem opět já. Problém ze scriptem mám jen jeden započítává pouze mou návštěvu jednou za den. V čem může být chyba?
Nazdar,
nemuzu najit kde je deklarovana promena $ip?
No omlouvám se že odpovídám až nyní :D lidi zkuste se podívat do souboru navstevnost.php kde máte první [code]$ip[/code] a musíte to dát před ni, jelikož pochopitelně když se script zpracovává tak určitě nejede od spoda nahoru ale od shora dolů. Pokud definujete [code]$ip[/code] uprostřed tak všechny nad ním budou nefunkční.
Také bych rád poprosil, použijte kód ale určitě je dobré nějaké zabezpečení, podmínky které zajistí že pokud nemám návštěvnost tak se ukáže 0, já jsem si ještě vložil sloupce které je úplně jednoduché vytvořit, určitě bych také poprosil autora aby svůj script pokud ho chce publikovat trošku upravil. Je již zastaralí a to hodně.