Počítadlo na webu, první díl
02.04.2008Komentáře (2) Kategorie: Tvorba webu » PHP

Vítejte u miniseriálu počítadel na Webu. Každý kdo má web, by měl sledovat jeho návštěvnost. Počítadel existuje celá řada. Počítadla celkových přístupů, ty co dělají týdenní průměry, ty co ukazují počet návštěvníků za dnešní den, nebo ty, co třeba jen ukazují počet online uživatelů. Můžou být textová i grafická, pracují s databází i bez ní. A právě ne každý uživatel má přístup k databázi, nebo s ní umí pracovat. Proto si nyní ukážeme jedno jednoduché textové počítadlo, které nám bude vypisovat celkový počet návštěvníků a potom vypíše seznam s počtem uživatelů pro každý den, kdy na webu někdo byl.

Nejdříve si vysvětlíme princip počítadla, a potom se vrhneme na psaní kódu. Aby to bylo počítadlo co k čemu, mělo by uživatele započítávat jen jednou denně. To zajistíme pomocí IP adresy, kterou má každý jinou. Protože nemáme přistup k databázi, musíme údaje o přístupech uchovávat někde jinde. Nám k tomu nyní postačí soubor, který si pojmenujeme pocitadlo.txt. Do toho se budou postupně ukládat údaje o jednotlivých přístupech. Každý přístup se uloží na nový řádek a musí v něm být uchovány informace o datu a IP adrese. V našem příkladu budeme data ukládat v tomhle formátu: [RRRR-MM-DD][IP-ADRESA], takže soubor s přístupy může nakonec vypadat nějak takhle:

[2008–04–01][100.34.200.1] [2008–03–31][10.200.206.18] [2008–03–31][88.160.14.100]

Teorii máme za sebou a pustíme se do programování. Vytvoříme si soubor index.php, který bude vypadat takto:


<?php

       
    $file = "./pocitadlo.txt"; // soubor se záznamy
    $user = $_SERVER["REMOTE_ADDR"]; // IP adresa uživatele
    $today = date("Y-m-d"); // aktuální datum ve formátu RRRR-MM-DD
   
    /* Nyní otevřeme soubor pro čtení a zápis, a ukazatel nastavíme na konec souboru */
   
    $fp = fopen($file,"a+"); // otevře soubor
    $cteme = fread($fp,filesize($file)); /* přečte všechny data ze souboru a uloží je do proměnné */
    $ex = explode("\n",$cteme); // rozdělí řetezec na řádky a uloží je do pole
   
    /* Teď si vytvoříme proměnné, do kterých budeme postupně přičítat */
   
    $s_date = false;
    $celkem = 0;
   
    /* Vytvoříme cyklus, který postupně projde celé pole s jednotlivými přístupy (1 řádek = 1 přístup) */
   
    foreach($ex as $index => $value)
    {  
        // zkontrolujeme, jestli řádek není prázdný
        if(trim($value) != "")
        {
            $re = explode("][",$value); /* nejdříve rozdělíme záznam na část s datumem a část s IP adresou */
            $date = substr($re[0],1); /* odřízneme závorku ze začátku řetězce, proměnná $date nyní obsahuje datum zpracovávaného přístupu */
            $ip = substr($re[1],0,-1); /* odříznem závorku z konce řetězce, proměnná $ip nyní obsahuje IP zpracovávaného přístupu */
           
            $s_date[$date][] = $ip; /* vytvoříme další záznam v novém poli $s_date, které je dvojrozměrné. První index je datum a druhý index je pořadí přístupu v daný den. Hodnota je IP adresa */
            $celkem++;  // přičteme do celkových přístupů jedničku
        }
    }

?>
 

Protože vytváříme dvojrozměrné pole, ne každému to musí být jasné. Jen stručně ukážu jak vypadá toto pole pro průchodu tímto cyklem. Dejme tomu že máme pět různých záznamů. Potom pole bude vypadat takto:

$s_date[„2008–04–01“][0] = 100.34.200.1 // první přístup pro den 1. 4. 2008 $s_date[„2008–03–31“][0] = 10.200.206.18 // první přístup pro den 31. 3. 2008 $s_date[„2008–03–31“][1] = 88.160.14.100 // druhý přístup pro den 31. 3. 2008 $s_date[„2008–03–31“][2] = 84.156.15.144 // třetí přístup pro den 31. 3. 2008 $s_date[„2008–02–13“][0] = 100.34.44.215 // první přístup pro den 13. 2. 2008

Toto samozřejmě do scriptu nepiště, to bylo jen na ukázku, jaké pole budeme nyní zpracovávat. index.php pokračuje:


<?php

/* Když máme vytvořené pole s přístupy, zkontrolueje, zda tento uživatel už dnes na této stránce byl nebo ne */
/* V případě že je zde dnes poprvé, připíšeme o něm záznam do souboru */

    if(!in_array($user,$s_date[$today]))
    {
        fwrite($fp,"[$today][$user]\n"); /* zapíše do souboru pocitadlo.txt údaje ve formátu [RRRR-MM-DD][IP-ADRESA] a odřádkuje */
    }
   
/* Nyní vypíšeme na obrazovku celkový počet přístupů */
   
    echo "<h3>Celkem $celkem uživatelů</h3>";

/* Už zbývá jen projít pole $s_date a vypsat počet přístupů pro jednotlivé dny */

    foreach($s_date as $index => $value)
    {  
        $pocet = count($value); // uloží do proměnné $pocet počet přístupů pro zpracovávaný den
        echo "$index celkem $pocet uživatelů<br>"; // vypíše větu na obrazovku
    }
   
/* Nakonec uzavřeme soubor */

    $fc = fclose($fp);
   
?>
 

Samozřejmě, že nemusíme vypisovat přístupy pro všechny dny. Pomocí jednoduché podmínky lze vypsat přístupy jen pro jeden den, který si zvolíme. Na závěr ještě dodám jednu důležitou věc. Pokud budete script spouštět poprvé a soubor pocitadlo.txt bude prázdný, hodí to na vás chybu ve stylu že jste dodali špatný parametr. Nelekejte se a zkuste zmáčknout F5. Script už odteď bude navždy fungovat tak, jak má. Tato chyba je způsobena tím, že když je soubor pocitadlo.txt prázdný, script nemá co zpracovat, a tudíž nemá jaké parametry dodat do funkcí. Tuto chybu lze samozřejmě též odstranit jednoduchou podmínkou, které nebyla pro jednoduchost příkladu uvedena. Ta bude vypadat na způsob když je soubor prázdný, nezpracovávej informace a jen do souboru zapiš informace o prvním přístupu.

Doufám, že jste byli s dnešním tutoriálem spokojeni. Příště si ukážeme poněkud elegantnější řešení počítadla, a to s využitím databáze.



Hodnocení: 7.4/10 (15 hlasováno)

Komentáře (2)
od: lopan 23-05-2008 00:38:45
Dlouho jsem hledal pořádné počítadlo a konečně se jsem se dočkal. Veškerá počítadla mi zapisovali vstupy na každý odkaz, ale vaše je super ještě jednou díky a umístěno je na stránce http://lopanweb.kvalitně.cz

od: wayet 31-05-2008 20:15:19
Není zač :-D jsem rád že vše funguje jak má...

  Neregistrovaní uživatelé nemohou přidávat komentáře k článkům.