Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt]licznik odwiedzin
Forum PHP.pl > Inne > Oceny
enigma
Witam, php jak narazie tylko liznąłem i będzie to widać po skrypcie biggrin.gif
Ma on służyć do robienia statystyk dla każdej podstrony, oraz zliczać ilość odwiedzin z każdej strony
skrypt musi operować na plikach biggrin.gif
prosze o krytykę, tylko błagam nie śmiać się, wiem że tu wszystko będzie do krytykowania, ale jednoczesnie proszę o uwagi, jak coś można zrobić szybciej lepiej (w sumie już mam pomysł na dużo krótszy i szybszy skrypt), bo napewno pomoze mi to w nauce

  1. <?php
  2.  
  3.  function FunMeter ()
  4. {
  5.  if (!(file_exists('MetersFile/visits/')))//tworzy katalog na pliki ze statystykami
  6. mkdir ('MetersFile/visits/', 0700);
  7.  $file=($_SERVER['PHP_SELF']);//pobieram nazwe strony (pliku php) - plik z liczba odwiedzin nazywa się tak samo
  8.  $begin=strpos($file,'/') + 1;
  9.  $end=strpos($file,'.php');
  10.  $name=substr($file,$begin,$end-$begin);
  11.  if (!(file_exists('MetersFile/visits/'.$name.'.txt')))//tworzenie plików na statytyki
  12.  {
  13.  $file = fopen ('MetersFile/visits/'.$name.'.txt', 'w+');
  14.  fputs ($file,'0');
  15.  fclose ($file);
  16.  }
  17.  $file = fopen ('MetersFile/visits/'.$name.'.txt', 'r+'); 
  18.  if ($file)//odczytywanie i uaktualnianie statystyk
  19.  {
  20.  flock ($file, 2);
  21.  $visits = fgets($file, 20);
  22.  $visits++;
  23.  fseek ($file, 0);
  24.  fputs ($file, $visits);
  25.  flock ($file,3);
  26.  fclose ($file);
  27.  }
  28.  return $visits;//zwraca tablicę w celu późniejszego odczytania na stronie
  29. }
  30.  
  31.  
  32. function CatchIP ()
  33. {
  34.  if (!(file_exists('MetersFile/ip/')))//tworzy katalog na pliki ze statystykami
  35. mkdir ('MetersFile/ip/', 0700);
  36.  $ip = $_SERVER['REMOTE_ADDR']; 
  37.  $file=($_SERVER['PHP_SELF']);//pobieram nazwe strony (pliku php) - plik z liczba odwiedzin nazywa się tak samo
  38.  $begin=strpos($file,'/') + 1;
  39.  $end=strpos($file,'.php');
  40.  $name=substr($file,$begin,$end-$begin);
  41.  if (!(file_exists('MetersFile/ip/'.$name.'IP.txt')))//tworzenie plików na statytyki
  42.  {
  43.  $file = fopen ('MetersFile/ip/'.$name.'IP.txt', 'w+');
  44.  fputs ($file,'');
  45.  fclose ($file);
  46.  }
  47.  $file = fopen ('MetersFile/ip/'.$name.'IP.txt', 'r'); 
  48.  $i = 0;
  49.  if ($file)//odczyt i aktualizacja pliku
  50.  {
  51.  flock ($file, 2);
  52.  while(!feof($file))//zapis z pliku do tablicy, i zwiększenie liczby odwidzin dla konkretnej strony
  53.  {
  54.  $ip_count = fgets($file, 20);
  55.  $data = explode(':',$ip_count);
  56.  $ip_addr[$data[0]] = trim($data[1]);
  57.  }
  58. $ip_addr[$ip]++;
  59. fclose ($file);
  60. $klucze = array_keys($ip_addr);
  61. if(in_array($ip, $klucze))//nadpisanie zaktualizowanych informacji
  62. {
  63. $file = fopen ('MetersFile/ip/'.$name.'IP.txt', 'w+'); 
  64. for($x=0,$n=count($klucze);$x<$n;$x++)
  65. if($klucze[$x])
  66. fputs($file, $klucze[$x].':'.$ip_addr[$klucze[$x]]."rn");
  67. }
  68. else
  69. {$file = fopen ('MetersFile/ip/'.$name.'IP.txt', 'a');
  70. fputs($file, $ip.':1'."rn");}
  71.  fclose ($file);
  72.  }
  73.  return $ip_addr;//zwraca tablicę w celu późniejszego odczytania na stronie
  74. }
  75. ?>


całość razem z funkcjami odczytującymi można pobrać http://www.pawel-ryznar.yoyo.pl/Projekty/php/Visionsave.zip

Pozdrawiam
Adrian Staniszewski
twoja metoda obslugi podstron jest bledna.. PHP_SELF nie zwraca calego linku..dostajesz postac typu.. index.php, news.html.. itp..

a co gdy moje linki maja postac np. index.php?go=news, news.php5?id=12 ?

musisz inaczej pobieraz linki, a nawet wtedy nie bedziesz mial pewnosci czy jestes na innej podstronie czy tez po prostu zmieniles jakas wartosc lub wyslales jakis parametr zmieniajacy jakas drobna czesc www, ale nie zmieniajacej tresci podstrony..
enigma
Cytat(Adrian Staniszewski @ 30.10.2006, 11:33:33 ) *
twoja metoda obslugi podstron jest bledna.. PHP_SELF nie zwraca calego linku..dostajesz postac typu.. index.php, news.html.. itp..

ale o to chodzi, dostaję index.php, obcinam .php, dodaję .txt i mam plik index.txt w którym jest liczba odwiedzin
bim2
I tu jest problem, bo ja np uzywam index.php?podstrona=index index.php?podstrona=kontakt... rozumiesz?
Adrian Staniszewski
Przeczytaj jeszcze raz mojego posta.. podstrona to nie zawsze - a nawet zazwyczaj - samo index.php, news.php itp..
enigma
hmm, a cobyście poradzili questionmark.gif? smile.gif
phpion
Moze jakis parametr w kodzie, ktory bedzie okreslal czy linki sa jako index.php?strona=jakas czy jako jakas.php. Parametrem tym moze byc takie cos:
  1. <?php
  2. $param = 'strona';
  3. // lub
  4. $param = NULL;
  5. ?>

i potem w kodzie sprawdzasz czy $param is_null i jesli tak to przyjmujemy ze linki sa jak do tej pory czyli jakas.php, natomiast jesli ma jakas wartosci to jako nazwe strony podajesz wartosc zmiennej, ktorej nazwa jest wartoscia parametru smile.gif ($$param - juz pomijajac $_GET i te sprawy). Moze wlasnie tak.
Adrian Staniszewski
Ja bym to wrzucil do klasy i w przypadku stron statycznych lub "pojedynczych" normalnie wywolywal klase dodajac parametr "name"

np.
  1. <?
  2.  
  3. $licznik = new Counter('0', 'news#id');
  4.  
  5. ?>

teraz taki kod dajesz w plikach zmieniajacych sie - np. w news czy artach, a gdzie indziej dajesz po prostu $PHP_SELF

parametr $id mozesz oczywiscie zamienic innym, identyfikujacym twoja strone np. page#news, page#arts, go#download itp..
enigma
Cytat(Adrian Staniszewski @ 3.11.2006, 10:58:36 ) *
Ja bym to wrzucil do klasy i w przypadku stron statycznych lub "pojedynczych" normalnie wywolywal klase dodajac parametr "name"

znaczy się, cały licznik do klasy


Cytat(Adrian Staniszewski @ 3.11.2006, 10:58:36 ) *
parametr $id mozesz oczywiscie zamienic innym, identyfikujacym twoja strone np. page#news, page#arts, go#download itp..

czyli jakby strona z newsami miała 5 podstron, numerowanych, to jako id zwracany byłby numer podstrony i taki też plik tworzony np. news#5.txt , tak??
Adrian Staniszewski
Tak, ale niekoniecznie uzywaj # w nazwach plikow.. Polecam uzyc np. "_"
enigma
tak tyczy się też pierwszego pytanie z postu nr 9 questionmark.gif tongue.gif
czy może są jeszcze jakieś uwagi, jeśli nie to wielkie głównie dla Adriana smile.gif
Adrian Staniszewski
Tak do obu pytan smile.gif

Skoro - a raczej jesli - przepiszesz to do klasy to dodaj mozliwosc zablokowania countera ciasteczkiem - bedzie to szybsze i wydajniejsze rozwiazanie.

Osobiscie niezbyt tez widze zastosowanie dla Cach_IP.. niby fajnie bo mam adresy IP odwiedzajacych ale po co to mi ? geolokalizacje moglbym zrobic, ale i tak nie bede wiedzial kiedy mialy wejscia z danych IP, nie wiem tez ile razy mialy miejsce.

Pomysl nad rozbudowaniem systemu to prosciutkich statystyk.

Pozdrawiam

p.s
co wielkie dla adriana:P
enigma
Cytat(Adrian Staniszewski @ 3.11.2006, 22:48:55 ) *
dodaj mozliwosc zablokowania countera ciasteczkiem - bedzie to szybsze i wydajniejsze rozwiazanie.

to znaczy, co konkretnie mam blokować, albo raczej w jakim celu


Cytat(Adrian Staniszewski @ 3.11.2006, 22:48:55 ) *
Osobiscie niezbyt tez widze zastosowanie dla Cach_IP.. niby fajnie bo mam adresy IP odwiedzajacych ale po co to mi ? geolokalizacje moglbym zrobic, ale i tak nie bede wiedzial kiedy mialy wejscia z danych IP, nie wiem tez ile razy mialy miejsce.

heh w sumie to nie jest bardzo potrzebne, ale nie trzeba odpalać tej funkcji na p[odstronach tongue.gif a co do tego ile razy miały miejsce odwiedziny z danego ip, przeciez liczy dla każdego osobno biggrin.gif


Cytat(Adrian Staniszewski @ 3.11.2006, 22:48:55 ) *
Pomysl nad rozbudowaniem systemu to prosciutkich statystyk.

do tego właśnie chcę zmierzać cool.gif

Cytat(Adrian Staniszewski @ 3.11.2006, 22:48:55 ) *
co wielkie dla adriana:P

hmm tongue.gif wielkie DZIĘKUJE thumbsupsmileyanim.gif
Adrian Staniszewski
dodaj mozliwosc dodania ciastka w zliczaniu odslon oraz moze okreslenia czasu dla ciastka

sprawdzasz wtedy czy jest ciacho jak jest to nie zliczasz a jak nie ma to zliczasz

pozwoli to np. na stworzenie statystyk odslon i odwiedzin(teoretycznie uniq)
enigma
Cytat(Adrian Staniszewski @ 5.11.2006, 16:46:58 ) *
pozwoli to np. na stworzenie statystyk odslon i odwiedzin(teoretycznie uniq)

- odwiedziny - czyli co, zliczanie wejścia danego gościa raz w ciągu dnia np??
- a odsłona (to znaczy ile razy odświeżono stronę + ilość wejść w ciągu dnia)
dobrze te terminy rozumiem tongue.gif questionmark.gif

jako że nie miałem jeszcze z o obiektami wiele do czynienia zapytam o klasę, czy dobrze myślę tongue.gif
  1. <?php
  2. class licznik
  3. {
  4. var $tryb_wyswietlania  //0-tekstowy, 1-graficzny
  5. var $plik_statystyk  //$PHP_SELF dla zwykłych stron, nazwa_id dla kombinowanych tongue.gif
  6. var $tryb_zapisu  //0 -baza danych, 1 -pliki
  7.  
  8. function licznik
  9.  {
  10. //inicjalizacja trybów, rodzaju plików
  11. //i inne ...
  12.  }
  13.  
  14. function odczyt_statystyk {;}
  15. function zapis_statystyk {;}
  16. .
  17. . //itd itp :)
  18. .
  19. }
  20. ?>
Adrian Staniszewski
no mozna powiedziec ze dobrze.. ale napisz cos wiecej - ja bym zrobil to nieco inaczej, moze w wolnej chwili napisze taka klase w PHP5 winksmiley.jpg a narazie napisz cos wiecej na temat swojej

nadaj jakies wartosci zmiennym w var - wartosci domyslne i dodaj na koncu ";"
enigma
Cytat(Adrian Staniszewski @ 5.11.2006, 20:18:23 ) *
no mozna powiedziec ze dobrze.. ale napisz cos wiece
trochę to przemyślałem, i myślę że można zrobić kilka klas (żeby nie wszystko było pod licznik, można powiedzieć: początek frameworka tongue.gif) Przypominam że nie miałem do czynienia z pisaniem programów obiektowych no i narazie nie znam zbyt dokładnie obiektówki w php, znam c++, więc może być trochę błędów składniowych
dobra, a teraz przechodzę do licznika

=================================

klasa do pobierania informacji o pliku php, jego tytuł, nazwę, może się przydać do innych rzeczy, nie tylko do licznika
file_info.php
  1. <?php
  2. class file_info
  3.  {
  4. var $file_name;
  5. var $site_title; // pobierane z <title> </title>
  6. var $name_type; // 0 - $PHP_SELF, 1 - rozszerzona
  7.  
  8. public:
  9. function file_info($param = 0) // konstruktor
  10.  {
  11.  $this -> $name_type = $param;
  12. }
  13. function get_title() {;} // zapis do zmiennej $site_title
  14. function get_file_name() {;} // zapis do zmiennej $file_name
  15.  }
  16. ?>


klasa tworząca "pojemnik" na dane
data_container.php
  1. <?php
  2. class data_container
  3.  {
  4.  // zmienne
  5.  function data_container($param = 0) // konstruktor
  6. {
  7. // 0 - pliki, 1 - baza danych
  8. }
  9.  // inne funkcje odpowiedzialne za łączenie z bazą danych
  10.  // lub tworzenie plików
  11. }
  12. ?>


główna klasa - licznik
counter.php
  1. <?php
  2. class counter
  3.  {
  4. include("file_info.php");
  5. include("data_container.php");
  6. var $name_type; // 0 - $PHP_SELF, 1 - rozszerzona
  7. var $file = new file_info($name_type); // tworzy nowy obiekt, informacji o pliku
  8. var $site_title; // pobierane z <title> </title>
  9. var $file_name = $file -> get_file_name(); // do zmiennej zapisuje nazwę bieżącego pliku php
  10.  
  11. public:
  12. function record_stat() // jeśli nie chce wypisywać statystyki na stronie to używamy tej funkcji w pliku
  13. {
  14.  if(isset($refreshes))
  15.  //jeśli ciacho istnieje no to tylko zwiększamy ilość ODSŁON
  16. else
  17. //zwiększenie liczby ODWIEDZIN, i aktualizacja pliku lub bazy
  18. }
  19.  
  20. public:
  21. function show_stat() // jeśli chce wypisywać statystyki na stronie to używamy tej funkcji w pliku
  22. {
  23.  $this -> record_stat();
  24.  // wypisywanie statystyki na stronę
  25. }
  26. }
  27. ?>


przykładowa strona index.php
  1. <html>
  2. <?php
  3. include("counter.php");
  4. licznik = new counter() // zostawiam parametr domyślny, bo plik nazywa się normalnie
  5. ?>
  6. <body>
  7. <?php
  8. echo $licznik -> show_stat();
  9. ?>
  10. </body>
  11. </html>


Cytat(Adrian Staniszewski @ 5.11.2006, 20:18:23 ) *
ja bym zrobil to nieco inaczej, moze w wolnej chwili napisze taka klase w PHP5 winksmiley.jpg a narazie napisz cos wiecej na temat swojej

to jeszcze nic nie pokazuj tongue.gif chcę sam do tego dojść, oczywiście ze wskazówkami

Pozdrawiam
Adrian Staniszewski
napewno nie framewroka tongue.gif raczej malego systemu, jednak nie rozdrabniaj sie za bardzo

funkcje definiujemy
Kod
public/private function nazwa() {}


a tak wlasciwie to piszesz w php4 czy 5 ? jak 5 to zamien te var na public/private/protected

caly czas czekam na jakis kod.. nie same "Szablony"
enigma
Cytat(Adrian Staniszewski @ 6.11.2006, 22:51:39 ) *
napewno nie framewroka tongue.gif raczej malego systemu
o czegos trzeba zacząć tongue.gif


Cytat(Adrian Staniszewski @ 6.11.2006, 22:51:39 ) *
jednak nie rozdrabniaj sie za bardzo

więcej klas nie będzie, a te 2 pierwsze mogą się przydać do innych celów


Cytat(Adrian Staniszewski @ 6.11.2006, 22:51:39 ) *
a tak wlasciwie to piszesz w php4 czy 5 ?
chcę w 5, jestem w trakcie czytania manuala


Cytat(Adrian Staniszewski @ 6.11.2006, 22:51:39 ) *
caly czas czekam na jakis kod.. nie same "Szablony"
spokojnie tongue.gif pierwsze muszę stworzyć dobry szablon, a późnie zabierać się za konkretne pisanie, także proszę jescze o uwagi do szablony tongue.gif
a kod będzie powstawał bardzo powoli, ponieważ muszę dużo czasu poświęcać na lekturę wspaniałej książki aaevil.gif
bim2
Ja bym rozwiązał to tak jak w rapide. Mam taki system logow i w zmiennej private $oModule zapisuje obiekt systemu zapisu. I moze byc kilka klas. A wywoluje:
$log = new Log;
$log->register('file', new Log_file);
$log->register('base', new Log_base);
$log->setDefault('base');
i uzycie:
$log->make('msq'[, nazwa modulu]); jesli nie ma bierze domyslny
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.