Počitadlo navštívení jednotlivých stránek » PHP scripty » Blog » CrazyDog ~ Multi-blog

Počitadlo navštívení jednotlivých stránek

So, 27. prosinec 2008, 18:06
Počitadlo navštívení jednotlivých stránek

Máte dynamické stránky kde se obsah zobrazuje pomoci PHP funkce include();? V tom případě by se vám jistě hodilo tohle jednoduché počitadlo návštěv dané stránky, která je zrovna includovana.

Jako první si však vytvořte dvě tabulky v MySQL databázi kde jedna bude pro počitadlo a druhá pro kontrolu IP (pokud jste si již IP tabulku pomoci tohoto webu vytvořili, tak dále již není potřeba ji vytvářet znova. Je shodná ve všech příkladech zde uvedených PHP scriptů)

CREATE TABLE navstiveno (
  id int(11) NOT NULL AUTO_INCREMENT,
  adresa varchar(300) NOT NULL,
  pocet varchar(20) NOT NULL,
  PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS ip (
  id int(11) NOT NULL,
  co varchar(4) NOT NULL,
  ip varchar(20) NOT NULL
);

Princip počitadla spočívá v URL názvu stránky, která se zjisti funkci $_SERVER['REQUEST_URI']. Ta se ověří jestli existuje v databázi, pokud ne, tak se vytvoří s tím, že zapíše jednu návštěvu a hned i zapíše IP adresu návštěvníka, aby dále návštěvník nebyl na teto stránce započítán.

include("./db.php"); /* přístup k databázi*/
$ip = $_SERVER['REMOTE_ADDR'];
$kontrola_pocitadlo = mysql_query("SELECT COUNT(*) AS pocet FROM navstiveno WHERE adresa='".addslashes($_SERVER['REQUEST_URI'])."';");
$kontrola_pocitadlo = mysql_fetch_assoc($kontrola_pocitadlo);
if($kontrola_pocitadlo['pocet'] == 0) {
  mysql_query("INSERT INTO navstiveno VALUES(NULL, '".addslashes($_SERVER['REQUEST_URI'])."', '1');");
  mysql_query("INSERT INTO ip VALUES('".mysql_insert_id()."', 'nav', '".$ip."');");
  header("location: ".$_SERVER['REQUEST_URI']);
  ob_end_flush();
}

Jak vytvořit přístup k databázi naleznete například v článku Podrobné statistiky návštěvnosti v PHP.

Pokud již daná stránka v databázi je a návštěvníkova IP adresa ještě ne, tak se provede jen přičtení návštěvy a následný zápis IP adresy jako v předešlém případě. Pokud je vše ověřeno a návštěva započítaná, tak se zobrazí počet navštívení dané stránky.

else {
$pocitadlo = mysql_fetch_assoc(mysql_query("SELECT * FROM navstiveno WHERE adresa = '".addslashes($_SERVER['REQUEST_URI'])."'"));
$kontrola_ip = mysql_query("SELECT COUNT(*) AS pocet FROM ip WHERE id='".$pocitadlo['id']."' AND co='nav' AND ip='".$ip."';");
$kontrola_ip = mysql_fetch_assoc($kontrola_ip);
if($kontrola_ip['pocet'] == 0) {
  mysql_query("UPDATE navstiveno SET pocet=pocet+1 WHERE adresa = '".addslashes($_SERVER['REQUEST_URI'])."';");
  mysql_query("INSERT INTO ip VALUES('".$pocitadlo['id']."', 'nav', '".$ip."');");
  header("location: ".$_SERVER['REQUEST_URI']);
  ob_end_flush();
} else {
  echo "Navštíveno ".$pocitadlo['pocet']."x";
}
}

Doporučuji celý script vložit například do souboru navstiveno.php který budete includovat include('./navstiveno.php'); někde do patičky stránky. A nezapomeňte vložit na začátek stránky index.php pokud to tam už nemáte <?php session_start(); ?>, kvůli header přesměrováni.

Na závěr:

Jelikož je zapiš do ip tabulky celkem masivní, tak je dobré vytvořit CRON, který bude například týdně vyprazdňovat tuto tabulku. Script pro vyprazdňováni by vypadal následovně:

<?php
include("./db.php");
mysql_query("TRUNCATE ip;");
?>

A za druhé: Pokud máte počítadlo i u článků blogu, tak doporučují toto počítadlo zrušit, protože se vám návštěvy budou zbytečně započítávat dvakrát.

Upozornění:

Bylo zjištěno, že ve Firefoxu se náhodně zapisuji do databáze i prvky stránky, které by tam správně být neměli, jako je například style.css nebo obrazek.jpg ap. Ale není to tak hrozné, že by se to mělo nějak ošetřit. Jen se nedivte, když něco takového ve výpisu naleznete.

***** ø 3 (1346 hlasů) ≈ Návratnost
(Jak si vydělat snadné ...) « Starší článek | Novější článek » (GEOrss - objevte bloge...)

Š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 7 komentářů

reaguj - #802Michaelv Ne, 8. listopad 2009, 13:38
avatar

Ahoj a jak udělám, aby se mi započítávalo zobrazení každe načtení stránky? Takhle to je unikátní počítání dokud nevyprázdním tabulku IP. Když jsem umazal zápisy o zapsání IP tak mi to nefunguje co je potřeba přesně udělat?

Firefox 3.0.13 / Windows 7
web - reaguj - #803CrazyDog mužv Ne, 8. listopad 2009, 18:39
avatar

Michael: U toho prvního jen smaž zápis IP a u toho druhého kontrolu IP.

Firefox 3.5.5 / Windows XP
reaguj - #804Michaelv Ne, 8. listopad 2009, 19:33
avatar

No právě umazávám pokusně různě u prvního zápis IP ale když něco umažu v tom druhém tak to vypíše chybu nebo firefox vypíše jenom chybu „Firefox has detected that the server is redirecting the request for this address in a way that will never complete.“ Můžeš prosímtě napsat přesně jak to má vypadat? Díky

Firefox 3.0.13 / Windows 7
web - reaguj - #805CrazyDog mužv Ne, 8. listopad 2009, 20:00
avatar

Michael: Netestoval jsem to, ale asi takhle:

include("./db.php"); /* přístup k databázi*/
$kontrola_pocitadlo = mysql_query("SELECT COUNT(*) AS pocet FROM navstiveno WHERE adresa='".addslashes($_SERVER['REQUEST_URI'])."';");
$kontrola_pocitadlo = mysql_fetch_assoc($kontrola_pocitadlo);
if($kontrola_pocitadlo['pocet'] == 0) {
mysql_query("INSERT INTO navstiveno VALUES(NULL, '".addslashes($_SERVER['REQUEST_URI'])."', '1');");
echo "Navštíveno 1x"; 
} else {
$pocitadlo = mysql_fetch_assoc(mysql_query("SELECT * FROM navstiveno WHERE adresa = '".addslashes($_SERVER['REQUEST_URI'])."'"));
mysql_query("UPDATE navstiveno SET pocet=pocet+1 WHERE adresa = '".addslashes($_SERVER['REQUEST_URI'])."';");
echo "Navštíveno ".($pocitadlo['pocet']+1)."x";
}

Firefox 3.5.5 / Windows XP
reaguj - #806Michaelv Ne, 8. listopad 2009, 20:19
avatar

Díky za rychlou odpověď *1* ale teď se na stránce vypíše něco čemu už vůbec nerozumím…*6* Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in /home/free/… on line 11

Firefox 3.0.13 / Windows 7
reaguj - #807Michaelv Ne, 8. listopad 2009, 20:27
avatar

Oooo děkujuuu *3* funknčí *3* tu chybu jsme si vygooglil znamená zapomenutý znak uvozovky nebo tečka tak jsem doplnil tečku echo „Navštíveno “.($pocitadlo['pocet'].+1)„x“; takže vše funguje děkujiii

Firefox 3.0.13 / Windows 7
web - reaguj - #808CrazyDog mužv Ne, 8. listopad 2009, 22:40
avatar

Michael: Máš pravdu. Už jsem to v příspěvku opravil a ta tečka nepatři před +1 ale před „x“ tak jak jsem to změnil v příspěvku.

Firefox 3.5.5 / Windows XP
 
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: