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.
Hlavní menu
Kategorie
Přihlásit
Anketa
Podporujeme