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.
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.
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.
Š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. !
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?
Michael: U toho prvního jen smaž zápis IP a u toho druhého kontrolu IP.
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
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"; }
Díky za rychlou odpověď ale teď se na stránce vypíše něco čemu už vůbec nerozumím…
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in /home/free/… on line 11
Oooo děkujuuu funknčí
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