Autor: CEZI

W pierwszym przykładzie opiszę licznik który nie jest odporny na odświeżanie i zlicza każdą odsłonę witryny. Drugim przykładem będzie licznik którego budowa pozwala blokować „sztuczne” nabijanie. Trzecim będzie licznik który zlicza odsłony dzienne – pokazuje ile gości w danym dniu odwiedziło naszą witrynę.

No więc do roboty

Przykład 1.

Do prawidłowego działania licznika będzie nam potrzebne utworzenie pliku w którym będą przechowywane wartości. Może to być plik z rozszerzeniem tekstowym (.txt) lub .dat lub też inny np. .cez W tym przykładzie będzie to plik ‚licznik.txt’.

Na samym początku okręślamy gdzie ten plik ma się znajdować. Jeśli chcemy umieścić go w katalogu piszemy odpowiednia ścieżkę a jeśli nie to możemy pominąć ten kawałek kodu. W tym przykładzie umieszczony plik będzie znajdował się w katalogu ‚odslony’

<? 
$path="odslony/"; 

// Utworzona została ścieżka do katalogu (ze sleszem na koncu /) Możemy również określić ścieżke nie  przypisując zmiennej lecz "normalnie" np. $zliczaj=file("odslony/licznik.txt"); Sposób pierwszy jest bardziej 'poreczny' kiedy musimy w skrypcie otwierać kilkakrotnie plik/pliki - wtedy wystarczy operować tylko tą zmienną. 

$zliczaj=file($path."licznik.txt"); 

// Zmiennej $zliczaj przypisujemy tablice pliku 'licznik.txt' (zostaje on załadowany do pamięci) 

$stan_licznika=$zliczaj[0]+1; 

// Zwiększamy stan pierwszej linii pliku o 1 i przypisujemy to zmiennej $stan_licznika 

$zliczaj=fopen($path."licznik.txt","w"); 

// Otwieramy plik do zapisu z jednoczesnym skasowaniem jego zawartości (pamiętamy że wartość zwiększona jest o 1 od poprzednej wartości). 

flock($zliczaj, 2); 

// Blokujemy plik z dostępem do zapisu 

fwrite($zliczaj,$stan_licznika); 

// Zapisujemy w pliku stan zwiększony o 1 

flock($zliczaj, 3); 

// Zwolnienie blokady 

fclose($zliczaj); 

// Zamykamy plik 

echo"$stan_licznika"; 

// Wyświetlamy wynik (zmienna $stan_licznika zawiera wartość CAŁEJ pierwszej linii) 
// Może to się wydawać dziwne że pierwsza linia nie ma wartości 1 a 0 ale tak już jest - 0 to pierwsza linia, 1 to druga linia a np. linia 100 będzie miała wartość 101. 

?> 

Gotowy skrypt licznika wygląda tak:

<? 
$path="odslony/"; 

$zliczaj=file($path."licznik.txt"); 
$stan_licznika=$zliczaj[0]+1; 
$zliczaj=fopen($path."licznik.txt","w"); 
flock($zliczaj, 2); 
fwrite($zliczaj,$stan_licznika); 
flock($zliczaj, 3); 
fclose($zliczaj); 
echo"$stan_licznika"; 
?> 

Wynik możemy odpowiednio sformatować używając styli CSS.

Przykład 2.

Drugim przykładem jest licznik odporny na odświerzanie. W pierwszym skrypcie można naciskać klawisz F5 i za każdym razem wartość będzie zwiększana – w tym zastosujemy blokadę. Przykład samego licznika nie będzie się niczym różnił od pierwszego lecz same jego wywołanie jest całkowicie inne. Zastosowałem tutaj dwie funkcje – pierwsza z nich (Cookie_OK()) będzie wykonana gdy już odwiedzono witryne (kiedy skrypt już zadziałał dl tego usera nie puźniej niż 24 godziny) natomiast druga zostanie wywołana kiedy odwiedzający wejdzie pierwszy raz lub ostatnie odwiedziny zostały zaliczone ponad dobę wcześniej.

<? 
$ile="time()+3600*24"; 

// Czas przechowywania cookies // ustawione na 24 godziny 

setcookie("odwiedziny","tak",$ile); 

// ustawiamy cookies z wartością 'tak' 

if($odwiedziny==$tak) 
{ 
   $licz=0; 
} 
else 
{ 
   $licz=1; 
} 
?> 

Ta część kodu sprawdza czy zmienne $odwiedziny i $tak są rowne (znak == ) sobie czyli czy zmienna $odwiedziny posiada wartość $tak i jeśi jest to prawdą to w pierwszym przypadku zmienna $licz przyjmie wartość 0 a jeśli są różne to wartość 1.

<? 
$l="licznik.txt"; 
$path="odslony/"; 

// Wartość zmiennej $l to plik.txt w którym będą przechowywane odsłony. Zmienna $path (tak jak w pierwszym przykładzie licznika) określa ścieżke do katalogu w którym znajduje się plik 'licznik.txt'. 

function Cookie_OK() 

// Tworzymy funkcję (nie będziemy podawali argumentów i zostawiamy nawiasy puste) 

{ 

// Otwieramy nawias klamrowy funkcji 

 global $l,$path; 

// Aby zmienne były widoczne w funkcji określamy zmienne globalne 

$pokaz=fopen($path."$l","r"); 

// Otwieramy plik do odczytu z parametrem "r" 

flock($pokaz, 1); 

// Blokujemy do odczytu 

$linia=chop(fgets($pokaz, 100)); 

// Pobieramy linie (100 znaków) 

flock($pokaz, 3); 

// Zwalniamy blokade 

fclose($pokaz); 

// Zamykamy plik 

echo $linia; 

// Wyświetlamy 

} 

// Zamykamy funkcję klamrą 

function Cookie_NO() 

{ global $l,$path;            
              
             $zliczaj=file($path."$l"); 
             $stan_licznika=$zliczaj[0]+1; 
             $zliczaj=fopen($path."$l","w"); 
             flock($zliczaj, 2); 
             fwrite($zliczaj,$stan_licznika); 
             flock($zliczaj, 3); 
             fclose($zliczaj); 
             echo $stan_licznika; 
          
} 

// Tworzymy nową funkcję która będzie odpowiedzialna za uruchomienie licznika i piszemy znany już kod. 

if ($licz == "1") 
{              
   Cookie_OK();          
} 
else 
{ 
    Cookie_NO(); 
} 

// Na samym końcu (taka jest reguła) wywołujemy funkcję Cookie_OK lub Cookie_NO zależnie od tego czy cookies istnieje czy też nie (w zależności jaką wartość przyjmie zmienna $licz). 

// UWAGA: Nie wolno przed ustawieniem cookies wysyłać nic do przeglądarki ! - żadnych tagów html a pierwszy znacznik <? musi być ustawiony na samym początku ( nie może poprzedzać go enter) Jeżeli zobaczysz taki lub podobny komunikat: Warning: Cannot add header information - headers already sent by (output started ...[] to znaczy że wysyłasz coś przed ustawieniem cookies. 

?> 

Cały skrypt wygląda następująco:

<? 
$ile="time()+3600*24"; 
setcookie("odwiedziny","tak",$ile); 
if($odwiedziny==$tak) 
{ 
   $licz=0; 
} 
else 
{ 
   $licz=1; 
} 
?>  

<? 
$l="licznik.txt"; 
$path="odslony/"; 
function Cookie_OK() { 

 global $l,$path; 

$pokaz=fopen($path."$l","r"); 
flock($pokaz, 1); 
$linia=chop(fgets($pokaz, 100)); 
flock($pokaz, 3); 
fclose($pokaz); 
echo $linia; 
} 

function Cookie_NO() { 
 global $l,$path; 
             $zliczaj=file($path."$l"); 
             $stan_licznika=$zliczaj[0]+1; 
             $zliczaj=fopen($path."$l","w"); 
             flock($zliczaj, 2); 
             fwrite($zliczaj,$stan_licznika); 
             flock($zliczaj, 3); 
             fclose($zliczaj); 
             echo $stan_licznika;          
} 
if ($licz == "1") 
{              
   Cookie_OK();          
} 
else 
{ 
    Cookie_NO(); 
} 
?> 

Przykład 3.

Trzecim przykładem jest licznik który zlicza odsłony na każdy dzień osobno.
Zapewne spotkałeś się z czymś takim widząć na stronach coś takiego „Dzisiaj odwiedzin: 123” i właśnie taki skrypt teraz zbudujemy.

<? 

$dzien=date("l"); 

// Pobieramy funkcją date() aktualny dzien (zwraca nazwy w postaci: monday, tuesday itd.) 

$dzien=strtolower($dzien); 

// Ze wzgledu na występowanie dużej litery w nazwie dni - zamieniamy na małą litere. 

$path="dni/"; 

// Określamy katalog dla pliku i ustawiamy pełne prawa (chmod 777). 

$confirm=$HTTP_COOKIE_VARS["licz"]; 

// Zmienna $confirm przechowuje wartość cookies pobrana przez tablice (będzie nam potrzebna do sprawdzenia) 

$_temp=Array( 
           "monday" => "sunday", 
     "thuesday" => "monday", 
     "wednesday" => "thuesday", 
     "thursday"  => "wednesday", 
     "friday" => "thursday", 
     "saturday" => "friday", 
     "sunday" => "saturday" 
); 

// Tworzymy pomocniczą tablice która wykorzystamy do zamiany. 

for($i=0;$i<=$dzien;$i++){ 

// Pętlą for() sprawdzamy jaki dzisiaj dzien liczony od 0 

if(($dzien)&&(!@file_exists($path."$dzien.txt"))&&(!isset($confirm))) 
{ 

// Pierwszy warunek: 
// Jesli zmienna $dzien zwraca nam TRUE i (znak &&) plik $dzien.txt (automatycznie dla zmiennej dzień zostaje przypisana wartość z pętli for() czyli dla lepszego zrozumienia: Jeśli mamy dzisiaj poniedziałek i zmienna $dzien będzie miała wartość 'monday' warunek sprawdzi czy istnieje plik o nazwie 'monday.txt' i jeśli go nie ma - skrypt ustawi go automatycznie (ale to za chwile w dalszym kodzie) 

!isset($confirm); //  - isset() jest funkcją sprawdzającą czy zmienna czyli czy istnieje i posiada wartosc a w tym przypadku sprawdza czy zmienna $confirm (czyli cookies) nie istnieje (znak ! - negacji) i jeśli nie istnieje warunek wykona się (wykona się wszystko co znajduje się pomiędzy nawiasami klamrowymi). 

// Teraz podaje kod dla tego warunku: 

$ustaw=fopen($path."$dzien.txt","w"); 

// Skrypt otwiera (w tym przypadku tworzy plik poniewaz wykrył że go nie ma) plik 

chmod($path."$dzien.txt",0666); 

// Ustawia chmod czyli prawa plikowi 

fclose($ustaw); 

// Zamyka plik 

// Tak na prawde to ten kod potrzebny jest aby ustawic tylko plik (w tym momencie nic sie z nim "nie dzieje") 

$poniedzialek=file($path."$dzien.txt"); 
       $stan=$poniedzialek[0]+1; 
       $poniedzialek=fopen($path."$dzien.txt","w"); 
      flock($poniedzialek,2); 
       fwrite($poniedzialek,$stan); 
      flock($poniedzialek,3); 
       fclose($poniedzialek); 

// Ten kod już znamy (kod licznika) 

@unlink($path."$_temp[$dzien].txt"); 

// Unlink() - funkcja usuwająca plik o danej nazwie - w tym przypadku tworzymy tablice asocjacyjna $_temp[$dzien].txt - czyli: $_temp[tutaj jest wstawiana wartość zmiennej $dzien czyli przykładowo  monday (dla poniedziałku)] ALE! w tablicy $_temp wartość zmieni się i dla 'monday' będzie 'sunday' monday => sunday (za każdym razem dzień do tyłu). Dodajemy rozszerzenie .txt ażeby serwer usunoł plik i w tym przypadku będzie to plik 'sunday.txt' 

// Znak @ oznacza że nie będzie pokazany żaden błąd serwera (jesli nie byloby takiego pliku to nie wyświetli się błąd) 

setcookie("licz","odslona",time()+3600*24); 

// Ustawiamy cookie 

 echo "$stan"; 

// Pokazujemy wynik 

} 

// Zamykamy pierwszy warunek. 

// Jeśli z jakiegoś względu pierwszy warunek się nie wykona (np.istnieje już plik) to przechodzi "dalej" do drugiego warunku 

elseif(($dzien)&&(@file_exists($path."$dzien.txt"))&&(!isset($confirm))) 
{ 

// elseif oznacza że jesli nie to co w 'if' to sprawdz 'to co jest w elseif' (to tak na chłopski rozum:-)) 

// Jeśli zmienne $dzien zwraca TRUE i plik juz istnieje (ten w którym zostaja zapisane odsłony) ale dalej ne istnieje cookies (!isset($confirm)) to wykonuje się ta część warunku zawarta pomiędzy klamrami. 

$poniedzialek=file($path."$dzien.txt"); 
       $stan=$poniedzialek[0]+1; 
       $poniedzialek=fopen($path."$dzien.txt","w"); 
      flock($poniedzialek,2); 
       fwrite($poniedzialek,$stan); 
      flock($poniedzialek,3); 
       fclose($poniedzialek); 
      setcookie("licz","odslona",time()+3600*24); 
  echo $stan; 

// Ten kod wykona się dla osoby która pierwszy raz wejdzie na stronę ale wcześniej już ktoś ją odwiedził ponieważ plik już istnieje. 

} 

// Zamykamy klamrę 

elseif(($dzien)&&(@file_exists($path."$dzien.txt"))&& isset($confirm)) 
{ 
// Ten warunek jest ostatnim i możnaby dać zamiast elseif() samo else() - ta funkcja wykona się wtedy i tylko wtedy kiedy nie wykonały się poprzednie. Czyli: 

// Zmienna $plik zwraca TRUE, plik istnieje i cookies również. Tutaj wystarczy zastosować sam odczyt z pliku, pobrać jego wartość i wyświetlić 

$plik=fopen($path."$dzien.txt","r"); 
flock($plik, 1); 
$line=chop(trim(fgets($plik,15))); // pobieramy 15 zanków 
flock($plik, 3); 
fclose($plik); 
echo $line; 
} 

// Zamykamy klamrę warunku trzeciego 

} 

// Zamykamy pętlę 

?> 

Cały przykład:

<? 
$dzien=date("l"); 
$dzien=strtolower($dzien); 
$path="dni/"; 
$confirm=$HTTP_COOKIE_VARS["licz"]; 

$_temp=Array( 
      "monday" => "sunday", 
     "thuesday" => "monday", 
     "wednesday" => "thuesday", 
     "thursday"  => "wednesday", 
     "friday" => "thursday", 
     "saturday" => "friday", 
     "sunday" => "saturday" 
); 


for($i=0;$i<=$dzien;$i++){ 
if(($dzien)&&(!@file_exists($path."$dzien.txt"))&&(!isset($confirm))) 
{ 

$ustaw=fopen($path."$dzien.txt","w"); 
chmod($path."$dzien.txt",0666); 
fclose($ustaw); 

$poniedzialek=file($path."$dzien.txt"); 
       $stan=$poniedzialek[0]+1; 
       $poniedzialek=fopen($path."$dzien.txt","w"); 
      flock($poniedzialek,2); 
       fwrite($poniedzialek,$stan); 
      flock($poniedzialek,3); 
       fclose($poniedzialek); 

@unlink($path."$_temp[$dzien].txt"); 
setcookie("licz","odslona",time()+3600*24); 
echo "$stan"; 

} 

elseif(($dzien)&&(@file_exists($path."$dzien.txt"))&&(!isset($confirm))) 
{ 

$poniedzialek=file($path."$dzien.txt"); 
       $stan=$poniedzialek[0]+1; 
       $poniedzialek=fopen($path."$dzien.txt","w"); 
      flock($poniedzialek,2); 
       fwrite($poniedzialek,$stan); 
      flock($poniedzialek,3); 
       fclose($poniedzialek); 
      setcookie("licz","odslona",time()+3600*24); 
  echo $stan; 

} 

elseif(($dzien)&&(@file_exists($path."$dzien.txt"))&& isset($confirm)) 
{ 

$plik=fopen($path."$dzien.txt","r"); 
flock($plik, 1); 
$line=chop(trim(fgets($plik,15))); 
flock($plik, 3); 
fclose($plik); 
echo $line; 

} 
} 
?> 

Były to proste przykłady które możecie zastosować na swoich www. Myśle że zrozumiałe.

Skasowane dane to nie zawsze tragedia - ściągnij program i odzyskaj dane