Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Licznik, Co jakiś czas się zeruje
ziom
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 13.02.2005

Ostrzeżenie: (0%)
-----


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?

Ten post edytował ziom 26.05.2007, 11:11:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
slaug
post
Post #2





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 2.05.2003
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nexis
post
Post #3





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kwiateusz
post
Post #4


Admin Techniczny


Grupa: Administratorzy
Postów: 2 072
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




nie strony a domeny, o ile w parametrach nie poda się inaczej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) więc jak nexis napisał ciacha nie da sie nadpisać z poziomu innej witryny
Go to the top of the page
+Quote Post
nexis
post
Post #5





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.09.2025 - 08:07