Licznik odwiedzin

Ostatania modyfikacja: 28 września 2017, kategoria: Php

Licznik odwiedzin prezentuje się fajnie na wszystkich stronach, niezależnie od jej popularności i wielkości. Duże serwisy potrzebują statystyk aby analizować ruch w danych miesiącach i popularność odpowiednich podstron. Małe strony używają ich raczej do ozdoby, jako fajny bajer i funkcjonalność. Liczniki odwiedzin obrazują także użytkownikom serwisu o jego popularności, jeżeli odwiedzin jest mało nie świadczy to zbyt dobrze o stronie (przynajmniej patrząc z perspektywy użytkownika).

Liczniki odwiedzin

Liczniki odwiedzin mogą być zaawansowane i proste. Mogą być zbudowane na plikach tekstowych oraz na bazie danych MySQL. Mogą być odporne na odświeżanie lub zwiększać się co każde kliknięcie. Można także zliczać ilość kliknięć w dany link (np. w dziale download).

Pełnią one funkcje statystyczną. Doskonale obrazują popularność strony. Pamiętaj, że umieszczanie na stronie licznika odwiedzin w pewnych wypadkach może mieć skutki negatywne, szczególnie w przypadku młodych stron, które na początku będą miały po 5 odwiedzin dziennie.

Licznik odwiedzin na plikach

Zaprezentowany niżej licznik jest odporny na odświeżenia strony. Zapisuje ciastko o nazwie nasza-strona.pl. Możemy przedłużyć żywotność ciastka np. do 24h. Jeżeli użytkownik odwiedza stronę pierwszy raz, pobierana jest aktualna wartość licznika, zwiększana o 1 a następnie nadpisywana. Skrypt licznika musi znajdować się na samej górze strony (jeszcze przed tekstem) ponieważ wymaga tego funkcja SetCookie.

Funkcja flock zabezpiecza plik licznika na czas kiedy prowadzone są operacje odczytu i zapisu. Gdyby funkcja nie została użyta wtedy wartość pliku została by utracona gdy stronę otworzą dwie osoby w tej samej chwili.

<?php
//ob_start();

if(!$_COOKIE['naszastrona']=="1")
{
	$plik="licz.txt";

	//odczytujemy aktualną wartość z pliku
	$file=fopen($plik, "r");
	flock($file, 1);
	$liczba=fgets($file, 16);
	flock($file, 3);
	fclose($file);
	$liczba++; //zwiększamy o 1

	//zapisujemy nową wartość licznika
	$file=fopen($plik, "w");
	flock($file, 2);
	fwrite($file, $liczba++);
	flock($file, 3);
	fclose($file); 

	setcookie("naszastrona","1");
	//ob_end_flush();
}
?>

Aby skrypt działał poprawnie, należy utworzyć plik licznika licz.txt i nadać mu prawa do odczytu i zapisu. Aby wyświetlić stan licznika wystarczy w dowolnym miejscu na stronie zaincludować plik licz.txt. Co prawda ładniej i bezpieczniej było by wczytać tą wartość za pomocą fgets, tak jak w kodzie wyżej. Wybór pozostawiam Tobie.

<?php include ('licz.txt'); ?>

Licznik odwiedzin na bazie MySQL

Licznik oparty o bazę danych daje nam większe możliwości. Zaprezentuję w jaki sposób napisałem licznik na tej stronie. Pokazuje on liczbę unikalnych odwiedzin oraz dodatkowo możemy wyświetlić liczbę odwiedzin z dzisiejszego dnia. Skrypt musi zostać umieszczony na samej górze dokumentu, z powodu ustawienia ciasteczka.

Do poprawnego działania skryptu potrzebujemy tabeli o nazwie counter z dwoma polami. Pierwsze pole nosi nazwę data i jest typu date. Drugie pole nosi nazwę licznik i jest typu int. Ponieważ pole przechowujące datę nie będzie się powtarzać możemy ustawić indeksy, przyśpieszy to przeszukiwanie tabeli. Poniżej znajduje się przykładowa komenda do utworzenia tabeli:

CREATE TABLE IF NOT EXISTS `counter` (
  `data` date NOT NULL DEFAULT '0000-00-00',
  `licznik` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`data`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Przyjmuję, że połączenie z bazą MySQL zaimplementujesz na własną rękę, gdzieś na początku dokumentu (jeszcze przed skryptem licznika).

<?php
//ob_start();
function licznik_dzis()
{
	$sql = "SELECT `licznik` FROM `counter` ORDER BY `data` DESC LIMIT 0,1";
	$licznik = mysql_result(mysql_query($sql), 0, 0);
	return $licznik;
}

function licznik_all()
{
	$sql = "SELECT sum(`licznik`) FROM `counter`";
	$licznik = mysql_result(mysql_query($sql), 0, 0);
	return $licznik;
}

function licznik_last()
{
	$sql = mysql_query("SELECT `data` FROM `counter` ORDER BY `data` DESC LIMIT 0,1");
	$data = mysql_result($sql, 0, 0);
	return $data;
}

if(!$_COOKIE['naszastrona']=="1")
{
	$data = date('Y-m-d');
	if (licznik_last()==$data)
		$sql = mysql_query("UPDATE `counter` SET `licznik`=`licznik`+1 WHERE `data` = '$data';");
	else
		$sql = mysql_query("INSERT INTO `counter` (`data`, `licznik`) VALUES ('$data',1)");

setcookie("naszastrona","1");
//ob_end_flush();
}
?>

Kod jest długi, ponieważ dołączyłem do niego 3 funkcje. Ułatwią nam one pracę i kod jest dzięki temu bardziej przejrzysty. Ja osobiście funkcje trzymam w osobnych plikach aby nie robić bałaganu, Ty zrobisz jak uważasz.

Skrypt za pomocą ciastka sprawdza czy odwiedzamy stronę pierwszy raz. Jeżeli odwiedzamy stronę pierwszy raz, wartość pola licznik przy dzisiejszej dacie w tabeli zwiększa się o jeden. Jeżeli funkcja sprawdzająca najnowszą datę w tabeli (licznik_last()), wykryje że w tabeli nie ma jeszcze dzisiejszej daty, wtedy zostanie ona dodana i ma przypisaną wartość 1. Każda następna osoba w tym dniu zwiększy wartość licznika przy dzisiejszej dacie. Tak wygląda tabela po kilku dniach pracy licznika:

2010-01-01 42
2010-01-02 24
2010-01-03 12
2010-01-04 251
2010-01-05 61

Obok dni mamy ilość odwiedzin w danym dniu. Jeżeli jakiś dzień nie pojawi się w tabeli, oznacza to że nie było wtedy żadnych odwiedzin

Aby wyświetlić skrypt w dowolnym miejscu na stronie skorzystamy z dołączonych wcześniej funkcji:

<?php
Odwiedzin dziś: <?php echo licznik_dzis(); ?><br>
Odwiedzin wszystkich: <?php echo licznik_all(); ?><br>
?>

Efektem działania powyższego skryptu będzie:

Odwiedzin dziś: 42
Odwiedzin wszystkich: 812

Błędy w działaniu licznika

Ten akapit dopisałem, ponieważ wiele osób skarży na źle działający licznik. Objawia się to brakiem odporności na odświeżanie strony.

Jeżeli licznik nie jest odporny na odświeżanie to prawdopodobnie pliki Cookies nie zostają ustawione. Ważna informacja: Pliki cookies muszą zostać ustawione od razu po wczytaniu strony jeszcze w chwili gdy nic nie zostało wyświetlone.

Jeżeli zechcesz ustawić plik cookies gdzieś w środku strony to prawdopodobnie zobaczysz komunikat: „Warning: Cannot modify header information – headers already sent by (output started at..)„.

Komunikat nie musi zostać wyświetlony, ponieważ można go wyłączyć w configu serwera, a więc wszystko zależy od hostingu. Mimo wszystko jeżeli jesteś pewny, że pliki cookies zostają ustawiane w poprawnym miejscu (czyli na samej górze dokumentu), problem może tkwić w kodowaniu znaków. Większość kodowań wstawia różne niewidzialne znaki-śmiecie, które lubią generować powyższe błędy z buforem. Polecam użyć kodowania „UTF-8 bez BOOM”.

Jeżeli posiadasz dokument w innym kodowaniu, możesz go przekonwertować do UTF-8 bez BOM np. za pomocą programu Notepad++.

Ostatnim wyjściem na naprawienie licznika jest użycie funkcji ob_start(), która czyści bufor w tym miejscu, w którym chcemy go wyczyścić. W kodzie źródłowym liczników umieściłem wywołania funkcji ob_start() oraz ob_end_flush(). Są one aktualnie objęte komentarzami. Jeżeli spotkasz błąd opisany wyżej, lub licznik nie działa – po prostu usuń komentarze lub zmień kodowanie dokumentu.

Podsumowanie

Obecnie, pisanie własnych liczników jest rzadkością. Wszystko za sprawą różnych systemów zarządzania treścią, które liczniki odwiedzin mają wbudowane. Pisanie własnego licznika ma sens tylko w przypadku pisania własnej strony od zera, bez korzystania z żadnego gotowego silnika.

Użytkownik TeHaCe napisał:

06 stycznia 2013


Dzięki !!!!!! Bardzo mi pomogłeś! ;]

Użytkownik Paweł napisał:

15 stycznia 2013


Witaj.
Użyłem Twojego skryptu php. Działa świetnie, lecz jest mały problem. Do momentu zaimplementowania skryptu pogody ze strony: 24meteo.pl/weather-widgets/ – wszystko działało świetnie. Teraz po zaimplementowaniu na stronę tego skryptu licznik przy każdym odświeżeniu dodaje wartość +2; Help.

Użytkownik Karol napisał:

15 stycznia 2013


Witaj. Ciężko stwierdzić co jest przyczyną takiego zachowania. Używasz wersji na plikach tekstowych czy MySQL? Być może użyty przez Ciebie skrypt pogody przeładowuje odświeża stronę kiedy jest wywoływany. Powinieneś dopisać także Cookie aby licznik był odporny na odświeżanie :)

Użytkownik Robert napisał:

07 maja 2013


Fajny licznik, a jeszce fajniejszy by był taki, który zlicza, dni, tygodnie i miesiące. Myślę nad rozbudowaniem o coś takiego

Użytkownik marek napisał:

18 września 2013


niestety po zastosowaniu Twojego pomysłu na licznik (localhost)
wyskakuje błąd: „Notice: Undefined index: p-programowanie in…”
w miejscu ustawionego warunku: if(!$_COOKIE[‚p-programowanie’]==”1″)
przy probie sprawdzenia czy ‚p-programowanie’ istnieje za pomocą:if (isset($_COOKIE[‚p-programowanie’]) && ($_COOKIE[‚p-programowanie’] == „1”)) licznik nie działa.

Oczywiście błąd „Notice” występuje tylko za p-szym razem wywołania strony ale jest nie do zaakceptowania. Masz pomysł jak to wyeliminować?

pozdrawiam

Użytkownik Marek napisał:

18 września 2013


rozwiązaniem jest zastosowanie poniższego warunku:

if (!isset($_COOKIE[‚program’]))
zamiast
if(!$_COOKIE[‚p-programowanie’]==”1″)

pozdrawiam

Użytkownik Karol napisał:

18 września 2013


Witaj. Nie jest to błąd tylko informacja. Na normalnych hostingach informacja się nie wyświetli. Xampp, WAMP, Krasnal, Apache itp. są tak skonfigurowane domyślnie, aby pokazywać informacje o nieistniejących zmiennych. Można także użyć „isset”, tak jak napisałeś. :)

Użytkownik Damian napisał:

24 września 2013


Siemka,
dodalem twoj skrypt i nie jest on odporny na odswiezanie strony. I jak moge ustawic aby byly to unikalne wejscia na strone a nie np ze po 24h naliczy kolejne wejscie.

Użytkownik Karol napisał:

29 września 2013


Zepsułeś coś z plikami cookie.

Użytkownik tetrus napisał:

08 grudnia 2013


U mnie niestety też licznik nie jest odporny na odświeżanie za wyjątkiem Mozilli

Użytkownik Karol napisał:

08 grudnia 2013


Witam. Czy nie występują u państwa błędy w stylu „Cannot send header information headers already sent”? Jedynie w tym wypadku pliki cookies mogły by nie być ustawiane, a jeżeli licznik się nie zatrzymuje to problem muszą stanowić właśnie Cookies.

Proponuję dwa rozwiązania, pierwsze to używanie kodowaniem plików „UTF8 bez Boom”, ponieważ w innych kodowaniach mogą pojawić się niewidzialne niechciane znaki.

Drugim rozwiązaniem jest manualne wyczyszczenie bufora opcją ob_flush(). Przykładowy kod został umieszczony w artykule.

Użytkownik dero napisał:

24 lutego 2014


Mała uwaga. Nie ‚UTF8 bez Boom’ a ‚UTF8 bez BOM’.

Użytkownik Karol napisał:

24 lutego 2014


Haha racja!

Użytkownik Sulumar napisał:

28 kwietnia 2014


Przejrzałem kilka liczników. Jak na razie na stronę prowadzoną przeze mnie ten wydaje się najbardziej optymalny. Wcześniej korzystałem z gotowca, który spowalniał wczytywanie strony (Czekanie na liczniki.org).
Dzięki

Użytkownik Zdz napisał:

05 lutego 2015


Jak? przerobić licznik na pliku tekstowym aby było możliwe używanie cyfr na obrazkach.

Użytkownik Levi napisał:

01 marca 2015


@Zdz możesz utworzyć nowy div
.licznik {
width: 140px;
height: 60px;
background: url(obrazek.png);
position: fixed;
bottom: 10px;
right: 10px;
A w
.licznik p {
color: #2ecc71;
margin-top: 4px;
margin-left: 2px;
font-family: Tahoma, Arial;

I utworzyć jak normalny div :)

Użytkownik Mariusz napisał:

15 listopada 2015


Wrzucilem Twoj pomysl na stronke silenthillkoral.prv.pl ;) ta na plikach tekstowych. na local host wyszystko dziala idealnie ;)licznik sie zwieksza ;) tworzy sie ciasteczko cookies z terminem 24 h blokuje licznik wszsytko oki ;) Ale jak juz wrzuce na serwer ftp na hostingu na prv.pl to licznik stoi w miejscu i klapa ;) a plik cookie sie nawet nie cche utworzyc ;)

Użytkownik Karol napisał:

15 listopada 2015


@Mariusz
Nadaj uprawnienia do zapisu plikowi tekstowemu

Użytkownik Mariusz napisał:

16 listopada 2015


Witam a mozesz mi podpowiedziec w jaki sposob to zrobic ;)?? w kodzie umiescilem „w” do zapisu i „r” do odczytu ;) co jeszcze powieniem zrobic ;)?

Użytkownik Karol napisał:

17 listopada 2015


Każdy plik i katalog może miec ustawione prawa tzw chmod. Mozesz je ustawic np. klientem ftp FileZillą klikając prawym myszy na interesujący Cię element na serwerze.

Użytkownik Mariusz napisał:

18 listopada 2015


Dzieki za pomoc wszsytko dziala teraz jak powinno. Mam pytanko czy masz jakies informacje na swoim blogu jak zrobic podstawowe komentarze na stronie internetowej?? Bo wlasnie chce zrobuc na swojej stronce a jak widze u Ciebie sa informacje napisane wprzystepny sposob; Pozdrawiam

Użytkownik Zool napisał:

16 lutego 2016


Witam

Zrobiłem licznik na bazie MySql w Joomli 2.5 super działa, ale na Joomla 1.5 nie chce to znaczy, że dodaję za każdym razem licznik dziś jak od świeżym, co to może być.

Dziękuję i pozdrawiam

Użytkownik Moon napisał:

09 września 2016


Właśnie takiego prostego rozwiązania szukałem.
Licznik na ciasteczkach działa rewelacyjnie + SQL.

Mam pytanie odnośnie statystyk.
Jak pokazać odwiedziny z dnia poprzedniego ?

Czyli: dzisiaj : wczoraj : ogółem.
Będę wdzięczny za wskazówkę.

Użytkownik Quick napisał:

16 października 2017


A co w przypadku, gdy ktoś wyczyści cookies…. ;)

Użytkownik Michał napisał:

23 października 2017


Jeśli chodzi o pisanie stron, to właśnie wszystkie moje strony piszę notatniku tekstu i jestem samoukiem. W artykule piszesz o ustawianiu czasu odświeżania licznika. Nie jestem biegły w php, ani innych bardziej skomplikowanych językach programowania, gdzie ustawia się ten czas i w jakich jednostkach

Użytkownik paweł napisał:

21 grudnia 2017


witam, po każdym odświeżeniu wzrasta mi licznik, stworzyłem krótki .php tylko z tym kodem do notatnika, więc jest na samym początku, zapisałem z bom i bez bom. Cały czas nic, jaka może być przyczyna.
Do bazy danych jest to samo?

Zachęcam Cię do zostawienia komentarza!

Ilość znaków: 0