Stránko moje, jakou návštěvnost dnes máš – pokročilé sledování

5. prosince 2000

V předchozím článku jsme si povídali o měření přístupů a naprogramovali jednoduché počítadlo v PHP s využitím MySQL a cookies. Dnes si za použití těch samých prostředků naprogramujeme počítadlo, které bude umět měřit přístup ne jenom na jednu stránku, ale bude i vytvářet jednoduchý log.

Počítadlo z minulého příkladu bylo "hloupoučké". Neumělo nic jiného než počítat přístup na jednu jedinou stránku. Naše dnešní počítadlo kromě počítání přístupů na více stránek bude schopno počítat přístupy na více stránek, na stránky sdružené pod jedno počítadlo a vytvářet jednoduchý log. Sdruženým přístupem myslím to, že máte např. na webu článek rozdělený do několika částí (kapitol). Můžete měřit jenom jeho první stránku, počítat všechny přístupy na jeho jednotlivé části a nebo měřit jenom první návštěvu na některou z jeho kapitol a vše ostatní brát jako reload. Tento poslední způsob je asi nejkorektnější.

Pro měření návštěvnosti si vytvoříme jednoduchou tabulku, která bude obsahovat jméno počítadla, počet návštěv a datum poslední návštěvy:

CREATE TABLE Tcounter(
CounterName VARCHAR(20),
Visits INT,
Last_visit DATETIME
);

Pro logovací systém si vytvoříme tabulku, která bude obsahovat jméno počítadla, ip návštěvníka,  datum a čas návštěvy a aktuální stav počítadla. 

CREATE TABLE Tcounter_log(
CounterName VARCHAR(20),
Visits INT,
Visited DATETIME,
ip_addr VARCHAR(20)
);

V každém scriptu, kde budeme chtít použít toto počítadlo, budeme muset nastavit proměnnou $CounterName, ve které bude uloženo jméno počítadla. Při práci s touto proměnnou využijeme jednu z velkých vymožeností – dynamické definice jmen proměnných. V $CounterName máme sice uloženo jméno počítadla(např. "test"), ale jak zjistit zda existuje proměnná stejného jména jako je toto jméno? Právě pomocí této definice. Její syntaxe je např. ${$CounterName}=10. Tento zápis je ekvivalentní k $test=10. Další proměnná je $CookieDeath, která obsahuje délku životnosti cookie v minutách.

Tak a teď k vlastnímu programování. Nejdříve si zjistíme, zda je nastaveno jméno počítadla, které budeme měřit. Pokud není, script nic nedělá. Pokud ano, sejmeme si do proměnné $Last_visit datum a čas naformátovaný pro datový typ DATETIME. Dále vytvoříme spojení na databázi a zjistíme zda již dané počítadlo existuje. Pokud ne, zaregistrujeme jej do databáze, nastavíme jej na hodnotu 1 a uděláme první zápis k tomuto počítadlu do logovací tabulky:

<?
$CookieDeath=20;
$ip_addr=$REMOTE_ADDR;
if  (isset($CounterName)){
    $Last_visit=date("Y-m-d H:i:s“);
    $Conn=mysql_connect(„adresa_srv“,“uzivatel","heslo");
    mysql_select_db("jmeno_db");
    $SQLText="SELECT * FROM Tcounter WHERE CounterName=’$CounterName'“;
    $result=mysql_query($SQLText);
    if (mysql_num_rows($result)==0){
        $Visits=1;
        $SQLText="INSERT INTO Tcounter (CounterName,Visits,Last_visit) VALUES (‚$CounterName‘,$Visits,’$Last_visit‘)“;
        mysql_query($SQLText);
        $SQLText="INSERT INTO Tcounter_log (CounterName,Visits,Visited,ip_addr) VALUES (‚$CounterName‘,$Visits,’$Last_visit‘,’$ip_addr ‚)";
        mysql_query($SQLText);
    }

Pokud je již počítadlo zavedeno, zjistíme zda existuje proměnná, která se jmenuje stejně jako naše počítadlo. Pokud ne, tak:

  1. cookie vypršela – návštěvník zde nebyl déle než limit nastavený v  $CookieDeath
  2. je to první návštěva této stránky
  3. nejsou povoleny cookies.

Takže provedeme výběr potřebných dosavadního počtu návštěv stránky z tabulky a přičteme k němu jedničku. Také provedeme záznam do logu:

    else{
        $row=mysql_fetch_array($result);
        if (empty(${$CounterName})){
            $Visits=++$row["Visits"];
            $SQLText="UPDATE Tcounter SET Visits=$Visits,Last_visit=’$Last_visit‘ WHERE CounterName=’$CounterName'“;
            mysql_query($SQLText);
            $SQLText="INSERT INTO Tcounter_log (CounterName,Visits,Visited,ip_addr ) VALUES (‚$CounterName‘,$Visits,’$Last_visit‘,’$ip_addr‘)";
            mysql_query($SQLText);
        }

Pokud ovšem je tato proměnná se jménem našeho počítadla nastavena, vybereme si pouze z databáze počet návštěv a datum/čas poslední návštěvy:

     else{
            $SQLText="SELECT Visits,Last_visit FROM Tcounter WHERE CounterName=’$CounterName'“;
            $result=mysql_query($SQLText);
            $row=mysql_fetch_array($result);
            $Visits=$row["Visits"];
            $Last_visit=$row["Last_visit"];
        }
    }

Nyní máme v proměnné $Visits aktuální počet návštěv a v $Last_visit datum poslední návštěvy. Takže zavřeme spojení s databází (já vím že to PHP udělá samo, ale jsou jisté návyky, kterých je lepší se nezbavovat) . Potom provedeme zápis do cookie, kde si uložíme jméno počítadla, které právě používáme, nastavíme k němu nějakou hodnotu, v našem případě aktuální stav počítadla. Je v zásadě jedno jakou hodnotu přiřadíme. Nastavíme dobu vypršení platnosti cookie. Doba = time()+$CookieDeath*60. To násobení 60 je tam proto, že time vrací čas v sec.

Nakonec si přeformátujeme datum poslední návštěvy z formátu DATETIME do českého formátování. To si uložíme do proměnné $CSLast_visit. A můžeme si připravit text pro vypsání stavu počítadla. Např. "11 návštěva 21.11.2000 v 23:34:18". tento řetězec uložíme do proměnné $HTMLCounter:

    mysql_close($Conn);
    setcookie("$CounterName",$Visits,time()+$CookieDeath*60);
    $CSLast_visit=substr($Last_visit,8,2).".".substr($Last_visit,5,2).".".substr($Last_visit,0,4)." v ".substr($Last_visit,11,8);
    $HTMLCounter="$Visits návštěva $CSLast_visit";
}
?>

Vlastní práce s počítadlem pak vypadá třeba takto:

<?
$CounterName="black_page";
include("counter2.php")
?>
<html>
<head><title>Black page</title></head>
<body bgcolor=“#FFFFFF“>
Na této úplně černé stránce byla <?echo $HTMLCounter;?>
</body>
</html>

A to je pro dnešní den vše, přátelé. Zdrojové kódy ke článku si můžete stáhnout zde.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *