Počítání kliků na odkaz v PHP

Nedávno se na mě obrátil kamarád, že má na webu reklamní banner a potřebuje počítat počet prokliků na ten banner. Chtěl po mě, jestli bych mu nenapsal nějaký jednoduchý skript.

Tak jsem se rozhodl, že Vám ho sem na MůjSkript.cz napíšu taky. Skript, který budeme společně tvořit by měl umět toto:

  • Vzít si parametr v URL adrese a pomocí $_GET ho zpracovat do proměnné
  • Uložit do nějakého souboru nějaký počet aktuálních prokliků
  • Případně ten soubor i vytvořit
  • Přesměrovat na URL adresu zadanou v proměnné $_GET pomocí PHP hlavičky location

Co by mohl umět dále:

  • Ochránit se před XSS útoky pomocí PHP funkce htmlspecialchars
  • Sčítat do jednoho souboru všechny prokliky
  • Pro každou URL adresu vytvořit vlastní soubor a počítat si prokliky zvlášť
  • Dynamicky měnit vytvářet a ukládat soubory podle URL adresy v $_GET

Kapitoly:

Způsob odkazování v HTML

Nejprve si musíme říct, jak budeme odkazovat na skript a jak mu budeme předávat hodnotu webové stránky (domény). Klasický odkaz na doménu bychom mohli zapsat takto:

<a href="http://domena.cz">Reklama na doménu</a>

Jenže díky tomuhle způsobu bychom se vzdali určité moci, jako monitorovat, jesli někdo na ten odkaz klikl. Určitě by to šlo i v JavaScriptu, ale o tom tenhle článek není. Abychom mohli počet kliknutí na odkaz počítat, přičítat a ukládat do souboru je zapotřebí, abychom tuto reakci uživatele (že klikl na odkaz) zachytili. Použijeme k tomu PHP a parametr GET v URL adrese, který míří na skript. Takže odkaz na doménu bude vypadat takto:

<a href="nejaky-soubor-ktery-pocita-pocet-kliknuti.php?url=domena.cz">Reklama na doménu.cz</a>

Tímhle skriptem dokážeme odchytit uživatelu reakci, že klikl na odkaz, zapsat ji do souboru a následně uživatele poslat na stránky domena.cz.

Základní stavba skriptu

Nejprve si vytvořme nějaký PHP soubor. Já si vytvořím například soubor pocitat.php. Na tento soubor budeme odkazovat způsobem, který jsme si ukázali v předchozí kapitole, tedy pomocí parametru GET:

<a href="pocitat.php?url=domena.cz>

A tento skript by nás (z pohledu uživatele) klasicky přesměroval na URL adresu domena.cz. Mezitím si ale server udělá všechno potřebné k zapsaní.

Nejdříve logicky vložíme otevírací tagy pro PHP. Jako první krok si musíme z URL adresy vycucnout název domény, na kterou chceme později přesměrovat. Protože ji posíláme přes parametr url (pocitat.php?url=domena.cz), musíme si ho taky v PHP zadat jako parametr… Tuto doménu z parametru url uložíme do proměnné $domena. Takže asi nějak takhle:

<?php
  $domena = $_GET['url'];

Nezapomeneme na konec přidat středník. Ve druhém kroku již zadáme podmínku: pokud

  • existuje proměnná $domena
  • ošetři vstup proměnné $domena pomocí htmlspecialchars (více v článku)
  • vytvoř novou proměnnou $jmenosouboru s obsahem pocet.txt
  • a pokřačuj dále…

Takže jak už jsme si řekli v bodech, proměnnou $domena ošetříme pomocí funkce htmlspecialchars, abychom se mohli chránit před XSS útoky. Protože parametr v URL si může jednoduše změnit i uživatel a napsat nám do něj nebezpečný JavaScriptový kód. Výsledkem této funkce htmlspecialchars bude opět proměnná $domena.

Taky si vytvoříme novou proměnnou $jmenosouboru, jejíž obsah bude název souboru, do kterého budeme ukládat počet prokliků – soubor pocet.txt:

if(isset($domena)){ /* toto je podmínka */
  $domena=htmlspecialchars($domena, ENT_QUOTES); /* zde si ošetřujeme vstup proti XSS útokům */
  $jmenosouboru = "pocet.txt";  /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */
  }

Načtení obsahu souboru v proměnné $jmenosouboru

Po tomto kuse kódu následuje další podmínka, a ta zní: pokud

  • existuje soubor s názvem, který je uložený v proměnné $jmenosouboru (pocet.txt)
  • pokud tento soubor neexistuje, vytvoř ho
  • načti obsah tohoto souboru (pocet.txt) pomocí file_get_contents
  • a ulož tento obsah do proměnné $pocet

K tomu už asi není nic víc, co psát a z bodů je vše jasné. Kód by měl vypadat takhle:

if(file_exists($jmenosouboru)){ /* podmínka, jestli existuje soubor s názvem uloženým v $jmenosouboru */
  $pocet=file_get_contents($jmenosouboru); 
  }

Přičtení kliku (jedničky) k dosavadnímu číslu

V dalším kroku si napíšeme, že pokud je soubor pocet.txt bez obsahu, tak bude jeho obsah 0. Takže obsahem proměnné $pocet bude nula (0), ale pouze v případě, že v souboru není žádné jiné číslo!

Následně si přidáme trošku matematiky, k číslu uloženém v proměnné $pocet přičteme jedničku (1). To pomocí dvou plusek ++.

else{$pocet=0;} /* Jestliže je obsah souboru prázdný, nebo v něm nejsou číslice, vlož nulu (0) */
$pocet++; /* K aktuálnímu číslu v proměnné $pocet přičti jedničku (1) */

Zapsaní počtu kliků do souboru v proměnné $jmenosouboru

Dále si vytvoříme novou proměnnou $soubor, ve které otevřeme pomocí funkce fopen soubour v proměnné $jmenosouboru s oprávněním zapisování – write (w).

Nyní zavoláme další funkci fwrite, pomocí které zapíšeme do souboru v proměnné $soubor (pocet.txt) obsah proměnné $pocet (počet kliknutí). Do proměnné $pocet jsme také v předchozím kroku přičítali pomocí dvou plusek.

Následně soubor v proměnné $soubor zavřeme pomocí funkce fclose. Celý tento krok je vidět v tomto kódu:

$soubor=fopen($jmenosouboru,'w');
fwrite($soubor,$pocet); /* zapíše počet kliků */
fclose($soubor);

Přesměrování uživatele na požadovanou stránky v GET

Jako poslední krok uživatele přesměrujeme uživatele na původní požadovanou stránku v $_GET parametru url. Tu jsme zadali jako proměnnou, takže $domena. Před začátek proměnné zadáme ještě http:// a konečné přesměrování provedeme to pomocí PHP hlavičky location. A pak ukončíme PHP skript:

header("location: http://$domena"); /* přesměruje se na požadovanou URL v proměnné */
}
?>

Nyní máme skript připraven a můžeme ho začít používat.

 

TIP: Pro každou stránku vlastní soubor $jmenosouboru

Všechny prokliky se nám aktuálně sčítají do jednoho jediného soubor – pocet.txt. Co když ale chceme počítat prokliky pro každou adresu/doménu/soubor zvlášť?

Je to velmi jednoduché: stačí si změnit poslední řádek v naší kapitole Základní stavba skriptu. Myslím tím tento řádek:

$jmenosouboru = "pocet.txt";  /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */

Pomocí tohoto řádku definujeme, do jakého souboru chceme zapisovat, jelikož ale chceme zapisovat do dynamického souboru (chceme, abychom měli tolik souborů, na kolik různých domén odkazujeme), musíme jeho název upravit.

Příponu .txt necháme, ale jeho název se bude měnit podle aktuálního obsahu proměnné $domena. Takže platí pravidlo: kolik různých adres do $_GET url zadáme, tolik se nám automaticky vytvoří souborů s názvy jednotlivých adres. Změňme tento řádek na:

$jmenosouboru = $domena.".txt"; /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */

Jak jste si jistě mohli povšimnout, název proměnné není v uvozovkách – až samotná koncovka .txt. Je to proto, že koncovka .txt je volný text, zatímco proměnná $domena je již předem definvoaná. Také jste si mohli všimnout toho, že mezi $domena a „.txt“ je tečka. To z toho důvodu, že chceme tyto dva řetězce (proměnná a text) spojit v jeden.

Ke stažení

Počet kliků s jedním .txt souborem (všechny kliky se sčítají) – .ZIP

Počet kliků s více dynamickými .txt soubory (1 url = 1 soubor) – .ZIP

 

Pokud se Vám článek líbil, nebo se na něco chcete zeptat, využijte komentářů níže. Udělá mi to radost. Tomáš 🙂

 

Pokud se Vám skript líbí, nebo se chcete na něco zeptat, budu rád, když využijete komentářů níže. Udělá mi to radost 🙂

Napište komentář!