Programowanie w języku PHP

Licznik odwiedzin w PHP

  • 2006-02-19 23:29
  • 10 komentarzy
  • 3825 odsłon
  • Oceń ten tekst jako pierwszy
Licznik w PHP (nieco rozbudowany)

Ostatnio postanowiłem ulepszyć mój licznik tekstowy na stronie www o funkcję zliczania dziennego - tzw. licznik dzienny. Szukałem trochę w Internecie, znalazłem parę skryptów, ale niestety wszystkie posiadały jakieś niedoskonałości. Postanowiłem napisać taki licznik samodzielnie, oto jego kod źródłowy. Licznik wyświetla wszystkie odwiedziny strony oraz liczbę odwiedzin dzisiaj i wczoraj. Pierwsza część licznika - czyli ogólny licznik zliczający wszystkie odwiedziny to popularny skrypt, który lekko przerobilem. Druga część - licznik dzienny jest w całości moją pracą. Aby licznik działał dobrze należy umieścić na serwerze w folderze głównym pliki licznik.txt o zawartości 0; oraz dzienny.txt o zawartości np 2006-02-13:0:2006-02-12:0. Oba pliki muszą mieć prawa dostępu (CHMOD) 666. Licznik jest odporny na przeładowania strony, odwiedziny są zliczane raz na dobę.
Proszę o komentarze i oceny :) Jest to mój pierwszy artykuł na 4programmers.

<?php
function polnoc() /* odmierza ile sekund od danej chwili jest do konca dnia*/
{
   $teraz = date("H:i:s");
   $czas = explode(":", $teraz);
   $godziny = 23-$czas[0];
   $minuty  = 59-$czas[1];
   $sekundy = 59-$czas[2];
   $waznosc = $godziny*3600 + $minuty*60 + $sekundy;
   return $waznosc;
}
 
        if((!isset($_COOKIE['licznik'])) && (!strstr($_SERVER['HTTP_REFERER'], "www.nazwa-strony.pl"))) 
        {
 
                $plik = fopen("licznik.txt", "r");
                $tekst = fread($plik, filesize("licznik.txt"));
                $dane = explode(";", $tekst);
                fclose($plik);
                $plik = fopen("licznik.txt", "w");
                flock($plik, 2);
                $dane[0]++;
                fwrite($plik, "$dane[0];", 15);
                flock($plik, 3);
                fclose($plik);
 
         /*LICZNIK DZIENNY - MADE BY WOWO */
        $data = date("Y-m-d"); /*zmienna przechowująca dzisiejszą datę*/
        $dzienny=fopen("dzienny.txt","r"); /*otwieramy plik, plik jest formatu yyyy-mm-dd:liczba:yyyy-mm-dd:liczba, gdzie pierwsza data jest data dzisiejsza, pierwsza liczba liczbą odwiedzin dzisiaj, druga data, to data wczorajsza, druga liczba to liczba odwiedzin wczoraj*/
        $dzienny_tekst =fread($dzienny, filesize("dzienny.txt")); /*czytamy caly plik do zmiennej dzienny_tekst*/
        $dane2 = explode(":", $dzienny_tekst); /*rozbijamy wczytany tekst z pliku, na daty i liczby klikniec - calosc bedzie w tabeli*/
        fclose($dzienny); /*zamykamy plik, ktory otwarlismy tylko do odczytu*/
 
        if($dane2[0]==$data) /*jesli w pierwsza data w pliku jest data dzisiejsza to dzialamy jak nizej*/
      { $dane2[1]++; /*zwiekszamy liczbe klikniec dzisiaj*/
                $dzienny=fopen("dzienny.txt","w"); /*otwieramy plik do zapisu*/
                flock($dzienny, 2); /* blokujemy plik przed zapisem*/
                fwrite($dzienny, "$dane2[0]:$dane2[1]:$dane2[2]:$dane2[3]", 30); /*zapisujemy calość do pliku */
          flock($dzienny, 3); /* odblokowujemy plik */
          fclose($dzienny);   /* zamykamy plik */
        }
        else/* jeśli pierwsza data w pliku nie jest dzisiejszą datą */
        { $dane2[2]=$dane2[0]; /* druga date w pliku ustawiamy, ta ktora byla do tej pory pierwsza*/
          $dane2[3]=$dane2[1]; /* druga liczbe odwiedzin ustawiamy, ta ktora byla do tej pory pierwsza*/
          $dane2[0]=$data; /* ustawiamy pierwsza date w pliku na date dzisiejsza*/
          $dane2[1]=1; /* liczbe klikniec ustawiamy na 1 bo sa to pierwsze odwiedziny tego dnia*/
          $dzienny=fopen("dzienny.txt","w"); /*otwieramy plik do zapisu*/
          flock($dzienny, 2); /*blokada zapisu*/
          fwrite($dzienny, "$dane2[0]:$dane2[1]:$dane2[2]:$dane2[3]", 30); /*zapisujemy calość do pliku */
          flock($dzienny, 3);/* odblokowujemy plik */
          fclose($dzienny);/* zamykamy plik */
        }
 
 
         setcookie("licznik", "zliczono", time()+polnoc()+1 ); /* cookie blokuje licznik do konca doby */
        }else{
 
                $plik = fopen("licznik.txt", "r"); /* obsluga licznika stalego*/
                $tekst = fread($plik, filesize("licznik.txt"));
                $dane = explode(";", $tekst);
                fclose($plik);
 
                $dzienny=fopen("dzienny.txt","r"); /* obsluga licznika dziennego*/ 
                $dzienny_tekst =fread($dzienny, filesize("dzienny.txt")); 
                $dane2 = explode(":", $dzienny_tekst); 
                fclose($dzienny); 
        }
?>


Przykład użycia licznika:

Stronę odwiedziło:<?php echo($dane[0]); ?> gości.
Dzisiaj (<?php echo($dane2[0]); ?>) stronę odwiedziło: <?php echo($dane2[1]); ?> gości.
Wczoraj (<?php echo($dane2[2]); ?>) stronę odwiedziło: <?php echo($dane2[3]); ?> gości.


10 komentarzy

kaczor6661 2008-11-06 23:51

Witam, jestem w tym laik, czy ktoś może wyjaśnić mi krok po kroku aby to działało na stronie?? :)

bordeux 2007-09-26 19:15

Musicie buforowac dane wysciowe. Posłużcie sie ob_start(); i zakonczcie ob_end_flush();

malum 2007-07-22 10:13

Zauważyłem, że ze skryptem dzieje się coś dziwnego.
Wszystko było OK.
Zmieniłem jednak datę w swoim komputerze o 2 dni do przodu i ... licznik oszalał.
Przy każdym odświeżeniu doliczał wizytę oraz wizytę dzisiejszą.
Daty w pliku dzienym nie zmienił.
Teoretycznie można ząłożyć, że coś takiego zrobi inny użytkownim strony i dojdzie wówczas do solidnego przekłamania.
Co wy na to?

m_kacper 2007-05-09 18:04

Taki błąd mi się pojawił i nie wiem gdzie jest błąd.
Warning: Cannot modify header information - headers already sent by (output started at /home/intelal/public_html/ple22/index.php:10) in /home/intelal/public_html/ple22/index.php on line 173

shogunpl 2007-05-28 14:30

>Taki błąd mi się pojawił i nie wiem gdzie jest błąd.
>Warning: Cannot modify header information - headers already sent by (output started at >/home/intelal/public_html/ple22/index.php:10) in /home/intelal/public_html/ple22/index.php on line 173

Miałem to samo. Zakładając, że kod licznika masz w pliku licznik.php, to <?php include "licznik.php";?> musisz umieścić w pierwszej linii kodu strony. U mnie zadziałało. Dowód: www.nervovoohozy.roszcza.pl

wowo 2006-06-19 15:59

@infal: za pomocą funkcji php chmod, lub przy użyciu jakiegoś menadżera plików ze strony www, ale z tego co piszesz to takiego chyba tam nie ma.

infal 2006-06-19 15:34

korzystam z www.za.pl i www.friko.pl (łącznie www.8.pl). Przesyła sie tam informacje za pomocą serwera ftp. W jaki sposób nadać plikowi prawa dostępu (ów atrybut CHMOD)??

wowo 2006-02-14 00:01

@Coldpeer - już myślę o zliczaniu odwiedzin tygodniowych i miesięcznych :) Jak znajdę chwilę czasu to taką opcję dodam :-)

Coldpeer 2006-02-13 23:58

@SebaZ: albo FAQ :)
@wowo: A może dodasz jeszcze np. miesiąc, tydzień itp?

A swoją drogą, dzięki temu "artykułowi", naszła mnie myśl, żeby stworzyć sobie taki licznik na bazie (z uwzglednieniem dni, tygodni) :)

SebaZ 2006-02-13 21:35

to raczej gotowiec niż artykuł