Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z licznikiem
Forum PHP.pl > Forum > PHP
Morek
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.
crash
A nie masz przypadkiem:
  1. <?php
  2. setcookie("odwiedziny", "1", time()+3600*2);
  3. ?>

I odwołanie przez:
  1. <?php
  2. $_COOKIE[ 'visited' ]
  3. ?>
yavaho
Tez mialem kiedys problem z licznikiem. I zauwazylem ze w tego typu skryptach jak w Twoim gdzie plik zostaje dwa razy otwarty podczas jednego uzycia skryptu istnieje takie niebezpieczenstwo ze cos sie pokreci.
Moim zdaniem rozwiazanie jest takie ze: nalezy otworzyc plik tylko jeden raz, zrobic obiczenia i zapisac.

Teraz uzywam juz tylko takich licznikow - dzialajacych na sesjach, bo na ciasteczkach nie mozna polegac w 100% a zwlaszcza gdy na strone wpadnie robot generujacy duzy ruch w krotkim czasie, ktory z pewnoscia nie przyjmuje ciasteczek.
  1. <?php
  2. if(!isset($_SESSION['licznik'])){
  3.  $nazwa = "licznik.txt";
  4.  $licz='';
  5.  if($plik=fopen($nazwa, 'r+b')){
  6.  flock($plik, LOCK_EX);
  7.  $licz = fgets($plik,100);
  8.  $licz=$licz+1;
  9.  fseek($plik, 0, SEEK_SET);
  10.  fputs($plik, $licz);
  11.  flock($plik, LOCK_UN);
  12.  fclose($plik);
  13.  }
  14.  $_SESSION['licznik'] = $licz;
  15. }
  16. echo $_SESSION['licznik'];
  17. ?>
Podczas pierwszego uruchomienia skrypt moze nie utworzyc pliku (nie jestem pewien) wiec utworz sobie plik na serwerze oczywiscie z odpowiednim chmod'em.
Morek
crash - no właśnie nie, zmieniałem nazwe, i dla tego byłem zdziwiony... Ale i tak dzięki za pomoc.


yavaho - Wielkie dzięki za informacje! Nie wiedziałem o tym, i faktycznie licznik się nie zeruje ale mam jeszcze pytanie... Wiem, że może dziwnie to zabrzmi ale czy on jest odporny na odswieżanie? Bo jak odświeżam stronę to dodaje mi kolejne oczko winksmiley.jpg

Nie bardzo jestem w stanie sam go rozgryźć bo jeszcze niegdy nic na sesjach nie robiłem worriedsmiley.gif
mike
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ć.
NuLL
Skrypty php -> php
Morek
mike_mech Wszystko działa bez problemu, nie zlicza odświeżeń i się nie zeruje! Wielkie dzięki.
smile.gif
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.