Podrobné statistiky návštěvnosti v PHP » PHP scripty » Blog » CrazyDog ~ Multi-blog

Podrobné statistiky návštěvnosti v PHP

So, 15. prosinec 2007, 16:44
Podrobné statistiky návštěvnosti v PHP

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.

***** ø 2.9 (882 hlasů) ≈ Návratnost
(Nejmenší a nejlehčí mo...) « Starší článek | Novější článek » (Měsíční statistika v g...)

Š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. !

Zatím 32 komentářů

web - reaguj - #416Pajahv So, 15. prosinec 2007, 16:57
avatar

Mě se ten článek moc líbil. Něco takového jsem hledal. ;-)

Opera 9.24 / Windows XP
reaguj - #417RuMeCv Út, 18. prosinec 2007, 16:13
avatar

No ten

switch (date("n")) {
case 1 : $mes = "leden"; break;
case 2 : $mes = "únor"; break; atd…
}
to teda neni moc dobre reseni *14**14*
nebylo by toto lepši … ???
$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;

???
*12**12**12*

Firefox 2.0.0.8 / Windows XP
web - reaguj - #418CrazyDog mužv Út, 18. prosinec 2007, 16:28
avatar

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.

Firefox 2.0.0.11 / Ubuntu Linux
reaguj - #419RuMeCv Út, 18. prosinec 2007, 16:40
avatar

no maš pravdu že je to stejne …
rozdil je pouze v delce kodu … u switch si vice procvičiš prsty *1**1*

jo sry za to formatovani … *21**21*

Firefox 2.0.0.8 / Windows XP
web - reaguj - #425DJMikyve Čt, 27. prosinec 2007, 13:19
avatar

Celkem šílenost :) Doplnil bych tam poznámku ?vhodné jen pro menší weby? .

Firefox to byste chteli vedet, co? firefox :)
web - reaguj - #426CrazyDog mužve Čt, 27. prosinec 2007, 20:45
avatar

DJMiky: Proč pro menší? To je snad jedno kdo to využije nebo to je něčím dané? *11**10*

Firefox 2.0.0.11 / Windows XP
web - reaguj - #427DJMikyv So, 29. prosinec 2007, 15:55
avatar

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.

Firefox 2.0.0.11 / Windows XP
web - reaguj - #428CrazyDog mužv So, 29. prosinec 2007, 19:28
avatar

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

Firefox 2.0.0.11 / Ubuntu Linux
reaguj - #436havri_XMve St, 9. leden 2008, 21:14
avatar

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

Opera 9.24 / Linux
reaguj - #525Prometheusv Ne, 20. duben 2008, 13:13
avatar

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

Firefox 2.0.0.14 / Windows XP
web - reaguj - #526CrazyDog mužv Ne, 20. duben 2008, 19:55
avatar

Prometheus: A ukládá se ti do databáze IP nebo jen prázdné poličko?

Firefox 2.0.0.13 / Ubuntu Linux
web - reaguj - #530B4nanv Pá, 25. duben 2008, 13:11
avatar

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

Opera 9.27 / Windows XP
web - reaguj - #573czkoudyv Pá, 11. červenec 2008, 15:49
avatar

{1} mě se ukládá jen prázdné políčko

Firefox 3.0 / Windows Vista
reaguj - #578RCv Út, 22. červenec 2008, 20:29
avatar

me se take uklada jen prazdne policko…

Firefox 2.0.0.12 / Windows XP
web - reaguj - #621starenkav Po, 29. prosinec 2008, 23:14
avatar

K cemu to, kdyz existuje Google Analytics a na 99procentech hostingu bezi AWstats?

Opera 9.63 / Linux
web - reaguj - #622CrazyDog mužv Po, 29. prosinec 2008, 23:35
avatar

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.

Firefox 3.0.5 / Ubuntu Linux
web - reaguj - #623starenkav Út, 30. prosinec 2008, 10:44
avatar

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 *16*
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. *15*

Opera 9.63 / Linux
web - reaguj - #625CrazyDog mužv Út, 30. prosinec 2008, 20:45
avatar

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

Firefox 3.0.5 / Ubuntu Linux
reaguj - #794Steneve Čt, 1. říjen 2009, 16:29
avatar

Ahoj, nainstaloval jsem si tenhle script, ale i když i když se na web podívá 10lidí tak statistiky.php vypisují pouze jednoho. :(

Firefox 3.5.3 / Windows 7
web - reaguj - #894lopikve Čt, 22. duben 2010, 17:54
avatar

Hmm pěkně podrobný návod, ale nefunguje.

Opera 9.80 / Windows 7
web - reaguj - #895lopikv Pá, 23. duben 2010, 08:04
avatar

Tak funguje, ale počítá to jen návštěvu s mou IP adresou za den. V čem může být chyba?

Opera 9.80 / Windows 7
reaguj - #896an-121v Pá, 23. duben 2010, 21:05
avatar

Nevšiml jsem si, že by byla definovaná proměnná IP

Firefox 3.5.9 / Ubuntu Linux
web - reaguj - #897lopikv Pá, 23. duben 2010, 21:33
avatar

Super, konečně rada, ale rada se kterou si nevím rady. Poradíš tedy tedy jak udělat proměnu IP?

Opera 9.80 / Windows 7
web - reaguj - #898CrazyDog mužv Pá, 23. duben 2010, 22:06
avatar

an-121: To je fakt. Toho jsem si nevšiml :)

Firefox 3.6.3 / Windows XP
web - reaguj - #899CrazyDog mužv Pá, 23. duben 2010, 22:09
avatar

Chyba byla, že opravdu nebyla definovaná proměnná $ip.
Je to ve scriptu opravené. Stačí připsat:

$ip = $_SERVER['REMOTE_ADDR'];

Firefox 3.6.3 / Windows XP
web - reaguj - #900lopikv Pá, 23. duben 2010, 22:37
avatar

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?

Opera 9.80 / Windows 7
web - reaguj - #901CrazyDog mužv Pá, 23. duben 2010, 23:00
avatar

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

Firefox 3.6.3 / Windows XP
web - reaguj - #902lopikv So, 24. duben 2010, 00:57
avatar

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

Opera 9.80 / Windows 7
web - reaguj - #942lopik mužv Po, 16. srpen 2010, 01:46
avatar

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?

Opera 9.80 / Windows 7
reaguj - #1085j2Cv Út, 18. říjen 2011, 15:32
avatar

Nazdar,
nemuzu najit kde je deklarovana promena $ip?

Opera 9.80 / Windows XP
reaguj - #1602Josef Dvořák mužv So, 12. prosinec 2015, 15:50
avatar

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

Chrome 47.0.2526.80 / Windows 7
reaguj - #1603Josef Dvořák mužv So, 12. prosinec 2015, 15:58
avatar

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

Chrome 47.0.2526.80 / Windows 7
 
0/2000
Jméno*
Web
Email
Gravatar
avatar
  [f] [:)] [L] [XL] [XXL] | [b] [i] [s] [e] [*] [cite] [code] [kod] [h1] [h2] [abbr] [sup] [sub] |
 
nejoblíbenější články:
novinky na webu:
informace: