Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Licznik
Forum PHP.pl > Forum > Przedszkole
kamil_lk
Mam pewien problem. Napisałem licznik oparty na pliku tekstowym. Na początku działał jak należy, a po dodaniu komentarzy wartość licznika nie wzrasta. O co chodzi?

  1. <?php
  2. $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  3. $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  4. $wartosc++; // zwieksza wartość odczytanego pliku o 1
  5. echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  6. fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  7. fclose($plik); // zamyka otowrzony plik licznik.txt
  8. ?>


Proszę o pomoc.
nospor
Cytat
a po dodaniu komentarzy wartość licznika nie wzrasta

No to mozna by sie domyslic, ze chodzi ocos z tymi komentarzami... niestety nie byles na tyle domyslny by wkleic kod odpowiedzialny za komentarze i wogole wyjasnic co mają komentarze do licznika wiec.... domysl sie sam co wiec...
kamil_lk
napisałem sobie komentarze, aby wiedzieć krok po kroku co robi skrypt.. po usunięciu tych komentarzy nadal nie działa :/ .. tylko czemu? mógłbyś mnie naprowadzić co jest źle?
nospor
aaaaa, mowisz o komentarzach php smile.gif myslalem ze napisales dodatkowy moduł komentarzy do swego serwisu.... smile.gif
Wyrażaj się jaśniej na przyszlosc winksmiley.jpg

A jak usuniesz teraz komentarze to zacznie dzialac? Niemozliwe. KOmentarze nie mają wplywu na kod. Moze dodając komentarze dodales cos innego przypadkiem?

Kod co tu podales jest ok. Przy zalozeniu ze istnieje plik licznik.txt winksmiley.jpg

edit: wlacz sobie wyswietlanie wszystkich bledow. moze masz jakies:
http://nospor.pl/php-faq-n29.html#faq-2
kamil_lk
plik licznik.txt istnieje, dodałem skrypt od błędów, ale żadnego mi nie wywaliło. a może to wina krasnala?
nospor
  1. <?php
  2. $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  3. var_dump($plik);
  4. $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  5. echo "Przed: $wartosc ";
  6. $wartosc++; // zwieksza wartość odczytanego pliku o 1
  7. echo "Po: $wartosc ";
  8. echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  9. fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  10. fclose($plik); // zamyka otowrzony plik licznik.txt
  11. ?>

Pokaz co wyswietlilo
kamil_lk
resource(2) of type (stream) Przed: 1 Po: 1 Oglądano nas: 1 razy.

po odświezaniu nie wzrasta wartość
nospor
dobre, dobre.... smile.gif
a tak:
  1. <?php
  2. $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  3. var_dump($plik);
  4. $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  5. $wartosc = (int)$wartosc;
  6. echo "Przed: $wartosc ";
  7. $wartosc++; // zwieksza wartość odczytanego pliku o 1
  8. echo "Po: $wartosc ";
  9. $wartosc = $wartosc + 1; // zwieksza wartość odczytanego pliku o 1
  10. echo "Po2: $wartosc ";
  11.  
  12. echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  13. fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  14. fclose($plik); // zamyka otowrzony plik licznik.txt
  15. ?>
kamil_lk
resource(2) of type (stream) Przed: 2 Po: 3 Po2: 4 Oglądano nas: 4 razy.

po jednym odświeżeniu:
resource(2) of type (stream) Przed: 4 Po: 5 Po2: 6 Oglądano nas: 6 razy.
nospor
czyli kluczem jest to:
$wartosc = (int)$wartosc;
smile.gif
kamil_lk
  1. <?php
  2. $plik= fopen(&#092;"licznik.txt\", \"r+\"); //otwiera plik licznik.txt
  3.  
  4. $wartosc= file_get_contents(&#092;"licznik.txt\"); // odczytuje wartość z pliku licznik.txt
  5. $wartosc = (int)$wartosc;
  6. $wartosc = $wartosc + 1; // zwieksza wartość odczytanego pliku o 1
  7. echo &#092;"Oglądano nas: $wartosc razy.\"; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  8. fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  9. fclose($plik); // zamyka otowrzony plik licznik.txt
  10. ?>


działa winksmiley.jpg ) dzięki winksmiley.jpg

bez liniki:
$wartosc = (int)$wartosc;

oraz ze zmienioną linijką:
$wartosc++ na $wartosc= $wartosc+1
też działa winksmiley.jpg
Zyx
Ktoś lub coś musiał dopisać jakieś spacje i tabulacje na koniec pliku licznik.txt i z tego powodu PHP nie potrafił tego zinkrementować po wczytaniu - przetestowałem Twój skrypt i gdy zawartość pliku była poprawna, wszystko działało. Dopisałem na końcu dwa zejścia do nowej linii wraz z tabulacją i przestało. Wczytując dane z plików, musisz pamiętać o sprawdzeniu ich poprawności i odfiltrowaniu syfu, o który naprawdę nietrudno. Inaczej jesteś narażony na takie właśnie kwiatki.

Przy okazji odkryłem ciekawą własność operatora ++. Otóż okazuje się, że potrafi on poprawnie inkrementować również alfabet smile.gif.
nospor
Cytat
Przy okazji odkryłem ciekawą własność operatora ++. Otóż okazuje się, że potrafi on poprawnie inkrementować również alfabet

http://pl.php.net/manual/pl/language.operators.increment.php
Cytat
Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.
winksmiley.jpg

Cytat
oraz ze zmienioną linijką:
$wartosc++ na $wartosc= $wartosc+1
Zachodzi wowczas domyslna konwersja na inta dlatego dziala smile.gif
Mephistofeles
Jako ciekawostkę powiem, że lepiej jest zrobić ++$zmienna (szybsze), no i zamiast fopen, fwrite i fclose używać file_put_contents winksmiley.jpg.
kamil_lk
  1. <?php
  2. $ciastko= setcookie("count","1");
  3. if ($ciastko !="1") {
  4. $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  5. $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  6. $wartosc= $wartosc+1; // zwieksza wartość odczytanego pliku o 1
  7. echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  8. fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  9. fclose($plik); // zamyka otowrzony plik licznik.txt
  10. }
  11. else {
  12. $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  13. $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  14. echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  15. fclose($plik);
  16. }
  17. ?>


moglibyście powiedzieć czy jest to dobrze napisane? chodzi mi o to żeby licznik był odporny na odświeżanie
b4x
Zrób może tak (wydaje mi się, że lepiej będzie na sesjach.):

  1. <?php
  2.  
  3.    if (!isset($_SESSION['zaliczono'])) {
  4.  
  5.        $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  6.        $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  7.        $wartosc= $wartosc+1; // zwieksza wartość odczytanego pliku o 1
  8.        echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  9.        fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  10.        fclose($plik); // zamyka otowrzony plik licznik.txt
  11.        $_SESSION['zaliczono'] = true;
  12.  
  13.    } else {
  14.  
  15.        $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  16.        $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  17.        echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  18.        fclose($plik);
  19.    }
  20. ?>
kamil_lk
a czy tamten kod jest poprawny?
b4x
Co do tamtego kodu:

1. Ustawiasz ciastko przed zapisaniem wartości - czyli nawet nie dodałeś wartości tylko "na start" dałeś że odwiedził stronę (pierw sprawdź, i jeśli nie odwiedził - ustaw cookie).
2. Sprawdzasz ciasteczko czy jego wartość != 1 funkcja setcookie" title="Zobacz w manualu PHP" target="_manual, odwołaj się do $_COOKIE['count'].

Czyli poprawnie powinno wyglądać jakoś tak:

  1. <?php
  2.   if (!isset($_COOKIE['count'])) {
  3.  
  4.       $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  5.       $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  6.       $wartosc= $wartosc+1; // zwieksza wartość odczytanego pliku o 1
  7.       echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  8.       fwrite($plik, $wartosc); // zapisuje zwiększoną wartość do pliku licznik.txt
  9.       fclose($plik); // zamyka otowrzony plik licznik.txt
  10.       setcookie("count","1"); // ustawiasz ciasteczko jak już zwiększysz ilość ;)
  11.  
  12.   } else {
  13.  
  14.       $plik= fopen("licznik.txt", "r+"); //otwiera plik licznik.txt
  15.       $wartosc= file_get_contents("licznik.txt"); // odczytuje wartość z pliku licznik.txt
  16.       echo "Oglądano nas: $wartosc razy."; // wyświetla wartość odczytanego i zwiększonego wcześniej pliku licznik.txt
  17.       fclose($plik);
  18.   }
  19. ?>


A tak poza tym wygląda ok.
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.