Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z licznikiem
Morek
post 11.08.2005, 14:23:00
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 28.05.2005

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


Wiem, że tamatów o licznikach było sporo.
Ale mam taki skrypt licznika:

  1. <?
  2. setcookie("odwiedziny", "1", time()+3600*2); 
  3. ?>
  4.  
  5.  
  6. <?
  7.  
  8. if(file_exists("licznik.txt"))  /* sprawdza czy plik istnieje */
  9. { 
  10. $file=fopen("licznik.txt", "r");  /* otwiera plik */
  11. flock($file, 1);  /* blokuje plik */
  12.  
  13. $ile=fgets($file, 100000);  /* odczytuje wartość */
  14.  
  15. flock($file, 3); /* odblokowuje plik */
  16. fclose($file);  /* zamyka plik */
  17.  
  18. if($odwiedziny!="1")  /* sprawdza plik cookie */
  19. {
  20. $ile++; /* zw. wartość o 1 tylko po pierwszym wejściu */
  21. }
  22. }
  23. else
  24. {
  25. $ile=1;  /* jeśli plik nie istnieje wyświetla wartość 1 i tworzy plik */
  26. }
  27.  
  28. $file=fopen("licznik.txt", "w");  /* otwiera plik do zapisu */
  29. flock($file, 2);  /* blokuje plik */
  30.  
  31. fwrite($file, $ile);  /* zapisuje wartość */
  32.  
  33. flock($file, 3);  /* odblokwuje plik */
  34. fclose($file);  /* zamyka plik */
  35.  
  36. ?>



i czasami zdarza się, że gdy stron się wgrywa i ktoś da "odśwież" licznik sie zeruje

W poście Mifczu znalazłem podobny problem i mike_mech poradził by

  1. <?php
  2. if( $visited != "1" ) /* sprawdza, czy użytkownik już odwiedzał stronę */
  3. {
  4. $ile++; /* zwiększa wartość o 1 tylko po pierwszym wejściu */
  5. }
  6. ?>


zmienić na

  1. <?php
  2. if( $_COOKIE[ 'visited' ] != "1" ) /* sprawdza, czy użytkownik już odwiedzał stronę */
  3. {
  4. $ile++; /* zwiększa wartość o 1 tylko po pierwszym wejściu */
  5. }
  6. ?>


ale gdy zamieniam to licznik przestał być odporny na odświeżanie i nie bardzo wiem, gdzie robie błąd?

Jeśli ktoś wie, jak sprawić by licznik był odporny na odswieżanie, nie zerował się tak jak to opisałem i nie potrzebował bazy danych,

lub chociaż gdzie jest błąd w kodzie to PLEASE pomocy!
Będe wdzięczny.

Ten post edytował Morek 11.08.2005, 14:24:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mike
post 11.08.2005, 22:24:50
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Na moje oko to powinno być tak:
  1. <?
  2.  
  3. if( file_exists( 'counter.txt' ) )
  4. {
  5. $resFile = fopen( 'counter.txt', 'r' );
  6. flock( $resFile, 1 );
  7.  
  8. $intCounter = fgets( $resFile, 100000 );
  9.  
  10. flock( $resFile, 3 );
  11. fclose( $resFile );
  12.  
  13. if( $_COOKIE[ 'visited' ] !== '1' )
  14. {
  15. $intCounter++;
  16. setcookie( 'visited', '1', time() + 60 * 60 * 24 ); // ustawiamy "ciacho" na jedną dobę
  17. }
  18. }
  19. else
  20. {
  21. $intCounter = 1;
  22. }
  23.  
  24. $resFile = fopen( 'counter.txt', 'w' );
  25. flock( $resFile, 2 );
  26.  
  27. fwrite( $resFile, $intCounter );
  28.  
  29. flock( $resFile, 3 );
  30. fclose( $resFile );
  31.  
  32. echo 'Liczba odwiedzin: ' . $intCounter;
  33.  
  34. ?>


A jak masz php5 to możesz tak:
  1. <?
  2.  
  3. $intCounter = ( int ) file_get_contents( './counter.txt' );
  4.  
  5. if( $_COOKIE[ 'visited' ] !== '1' )
  6. {
  7. $intCounter++;
  8. file_put_contents( './counter.txt', $intCounter );
  9. setcookie( 'visited', '1', time() + 60 * 60 * 24 ); // ustawiamy "ciacho" na jedną dobę
  10. }
  11.  
  12. echo 'Liczba odwiedzin: ' . $intCounter;
  13.  
  14. ?>


@yavaho Twoje rozwiązanie ma małą wadę. Wyobraź sobie sytuacje kiedy wchodzisz na stronę, licznik pokazuje 100 odwiedzin. Chodzisz po stronce godzinę, dwie, w tym czasie przez strona przewinęło sie kolejne 100 osób. Ale ty widzisz 100 odwiedzin bo masz te dane w sesji.

A poza tym: Ranking.pl : Cookies. 98.2% akceptuje ciasteczka, więc nie ma czym się przejmować.
Go to the top of the page
+Quote Post

Posty w temacie


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 - 17:38