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 okreś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 slash na koncu /). Możemy również określić ścieżkę, nie przypisując zmiennej, lecz "normalnie" np. $zliczaj=file("odslony/licznik.txt"); Sposób pierwszy jest bardziej 'poręczny' 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 poprzedniej 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 formatować, używając styli CSS.
Przykład 2.
Drugim przykładem jest licznik odporny na odświeżanie. 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 witrynę (kiedy skrypt już zadziałał dla tego użytkownika, nie póź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ą równe (znak == ), czyli czy zmienna $odwiedziny posiada wartość $tak i jeśli 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żkę 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 blokadę 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ąc na stronach coś takiego „Dzisiaj odwiedzin: 123” i właśnie taki skrypt teraz zbudujemy.
<? $dzien=date("l"); // Pobieramy funkcją date() aktualny dzień (zwraca nazwy w postaci: monday, tuesday itd.) $dzien=strtolower($dzien); // Ze względu na występowanie dużej litery w nazwie dni - zamieniamy na małą literę. $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 dzień liczony od 0 if(($dzien)&&(!@file_exists($path."$dzien.txt"))&&(!isset($confirm))) { // Pierwszy warunek: // Jeśli 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 chwilę w dalszym kodzie) !isset($confirm); // - isset() jest funkcją sprawdzającą czy zmienna czyli czy istnieje i posiada wartość 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 ponieważ wykrył że go nie ma) plik chmod($path."$dzien.txt",0666); // Ustawia chmod czyli prawa plikowi fclose($ustaw); // Zamyka plik // Tak na prawdę to ten kod potrzebny jest, aby ustawić tylko plik (w tym momencie nic się 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, aby serwer usunął plik i w tym przypadku będzie to plik 'sunday.txt'. // Znak @ oznacza, że nie będzie pokazany żaden błąd serwera (jeśli nie byłoby 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 jeśli nie to co w 'if', to sprawdź 'to co jest w elseif' (to tak na chłopski rozum:-)) // Jeśli zmienne $dzien zwraca TRUE i plik już istnieje (ten w którym zostają zapisane odsłony), ale dalej nie 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żna by 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ślę, że zrozumiałe.
no takie se …