Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Licznik
Forum PHP.pl > Forum > Przedszkole
ziom
Napisałem sobie dość prosty licznik na plikach, ale jest problem, bo co jakiś czas przeskakuje mi w dół. Nie jestem w stanie powiedzieć, czy do zera, ale raczej nie.

  1. <?
  2. class LICZNIK 
  3. { 
  4.  static private $odw; 
  5.  
  6.  static private $file; 
  7.  
  8.  public function __construct($var) 
  9.  { 
  10. self::$file = $var; 
  11. self::$odw = self::get(); 
  12.  
  13. setcookie('licznik',true,0); 
  14.  
  15. self::add(); 
  16.  } 
  17.  
  18.  public function odw() 
  19.  { 
  20. return self::$odw; 
  21.  } 
  22.  
  23.  private function add() 
  24.  { 
  25. if(!isset($_COOKIE['licznik'])) 
  26. { 
  27.  if(!file_exists(self::$file)) 
  28.  { 
  29. file_put_contents(self::$file, '1'); 
  30.  } 
  31.  else 
  32.  { 
  33. ++self::$odw; 
  34. file_put_contents(self::$file,self::$odw); 
  35.  } 
  36. } 
  37.  } 
  38.  
  39.  private function get() 
  40.  { 
  41. if(!file_exists(self::$file)) 
  42. { 
  43.  return '1'; 
  44.  file_put_contents(self::$file, '1'); 
  45. } 
  46. else 
  47. {
  48.  return file_get_contents(self::$file); 
  49. } 
  50.  } 
  51.  
  52. }
  53. ?>

Gdzie popełniłem błąd?
slaug
Ja bym proponował zmienić Twoją klasę na coś takiego i ew. poniższe dopracować:

  1. <?php
  2. class Licznik
  3. { 
  4.  private $file; 
  5.  
  6.  public function __construct($var) 
  7.  { 
  8. $this->file = $var;
  9. if(!file_exists($this->file)) 
  10. { 
  11. file_put_contents($this->file, '1');
  12. } 
  13. setcookie(md5($_SERVER['HTTP_HOST'] . 'licznik'),true,0); 
  14. $this->add(); 
  15.  } 
  16.  
  17.  public function get() 
  18.  { 
  19. return file_get_contents($this->file); 
  20.  }
  21.  
  22.  private function add() 
  23.  { 
  24. if(!isset($_COOKIE[md5($_SERVER['HTTP_HOST'] . 'licznik')])) 
  25. { 
  26.  file_put_contents($this->file, $this->get() + 1); 
  27. } 
  28.  } 
  29. }
  30.  
  31. $licznik = new Licznik('test');
  32. echo $licznik->get();
  33. ?>


Kilka uwag dot. Twojej klasy:
  • Nazywanie ciacha 'licznik' moze spowodować że nie będą naliczane wejścia użytkownika, który był na stronie gdzie webmaster pomyślał tak jak ty, albo gdzie używana jest twoja klasa
    1. <?php
    2. return '1'; 
    3.  file_put_contents(self::$file, '1');
    4. ?>

    to file_put_contents ci się nie wywoła bo jest po return
  • nie ma potrzeby używania zmiennych statycznych w twojej klasie
  • w metodzie add nie musisz ponownie sprawdzać czy plik istnieje skoro zrobiłeś to przed chwilą w metodzie get, którą wywołałeś wcześniej. Ewentualnie możesz zakończyć działanie jeśli zapisanie do pliku się nie udało.
  • klas raczej nie nazywa się dużymi literami

Niestety nie udało mi się powtórzyć błędu, o którym piszesz, a na pierwszy rzut oka nie widzę co mogłoby spowodować wyczyszczenie licznika. Spróbuj z wersją, którą podałem wyżej. Raczej powinna działać dobrze. W sumie jedyna możliwość kiedy wyzeruje się licznik w tej wersji to brak pliku.
nexis
Cytat(slaug @ 26.05.2007, 23:46:34 ) *
Nazywanie ciacha 'licznik' moze spowodować że nie będą naliczane wejścia użytkownika, który był na stronie gdzie webmaster pomyślał tak jak ty, albo gdzie używana jest twoja klasa


Co za bzdura! Ciasteczko jest ustawiane dla konkretnej strony i tylko ona ma do niego dostęp (prawo do odczytu, zapisu oraz usuwania), więc nie ma takiej możliwości, aby inna strona je nadpisała używając tej samej nazwy.
kwiateusz
nie strony a domeny, o ile w parametrach nie poda się inaczej winksmiley.jpg więc jak nexis napisał ciacha nie da sie nadpisać z poziomu innej witryny
nexis
Cytat(kwiateusz @ 27.05.2007, 01:27:58 ) *
nie strony a domeny


Chciałem to określić jasno, żeby nikt nie pomyślał, że dla domeny wszystkie ciasteczka są wspólne, bo subdomeny są traktowane jak oddzielne domeny.
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.