Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Licznik, Co jakiś czas się zeruje
ziom
post 26.05.2007, 10:53:32
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


--------------------
biuro rachunkowe
Go to the top of the page
+Quote Post
slaug
post 26.05.2007, 22:46:34
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.


--------------------
Never underestimate the power of human stupidity!
Go to the top of the page
+Quote Post
nexis
post 27.05.2007, 00:14:05
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.


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
kwiateusz
post 27.05.2007, 00:27:58
Post #4


Admin Techniczny


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




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
Go to the top of the page
+Quote Post
nexis
post 27.05.2007, 09:32:50
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.


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:42