Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Skrypt] Licznik tekstowy...
Forum PHP.pl > Forum > Przedszkole
Forgoot
Witam. Mam skrypt prostego licznika, ktory zlicza ilosc odwiedzajacych osob do pliku ilosc.dat.

  1. <?php
  2.  
  3. //licznik tekstowy
  4.  
  5. $licznik_plik = "./ilosc.dat";
  6. if(!($fp = fopen($licznik_plik, "r"))) // Próba otwarcia pliku do odczytu
  7. die ("Nie mogę otworzyć pliku $licznik_plik.");
  8. $licznik = (int) fread($fp, 20);
  9. fclose($fp);
  10.  
  11. $licznik++;
  12.  
  13. echo "Jesteś gościem nr: $licznik."; //Wyświetla stan licznika
  14.  
  15. $fp = fopen($licznik_plik, "w"); //Otwiera plik do zapisu
  16. fwrite($fp, $licznik); //Zapisuje
  17. fclose($fp); //Zamyka plik
  18. ?>


Gdy utworze plik ilosc.dat wszystko jest OK jednak gdy nie ma tego pliku to pokazuje mi błędy:
Kod
Warning: fopen(./ilosc.dat): failed to open stream: No such file or directory in ....\licznik_tekstowy.php on line 6
Nie mogę otworzyć pliku ./ilosc.dat.


Dodam że testowałem ten licznik na lokalnym serwerze jakim jest KRASNAL Serv.

Prosze o jakies wskazowki, rady jak pozbyć się tych błedów. Jestem w php początkujący i dopiero się ucze narazie na prościutkich skryptach jakim są liczniki i jeśli źle zabieram się do tworzenia kodu to też proszę zwrócić mi uwagę :/ Może wyświetlanie stanu licznika dać na koniec?questionmark.gif
ennics
w twoim kodzie nie ma błędu... tzn nie do końca, jest tu błąd przewidziany, który błędem nie jest winksmiley.jpg
  1. <?php
  2.  
  3.     if(!($fp = @fopen($licznik_plik, "r"))) // Próba otwarcia pliku do odczytu (jeśli nie uda się otworzyć, wywołujesz die i komunikat. Wiesz że błąd może 
    wystąpić.
  4.     die ("Nie mogę otworzyć pliku $licznik_plik.");
  5.  
  6. ?>

aby pozbyć się wyświetlania błędu wstawiasz @ przed fopen
gekon
Można tak, a można i ładniej smile.gif

  1. <?php
  2.  
  3. if(file_exists($licznik_plik)){ // jezeli plik istnieje, otwiera go
  4. fopen($licznik_plik, "r");
  5. } else { //jezeli nie, 'umiera'
  6. die ("Nie mogę otworzyć pliku $licznik_plik.");
  7. }
  8.  
  9. ?>
latet
Licznik to z założenia prosty skrypt, ale nie taki prosty jak się na początku wydaje. Są pewne pułapki, np. sytuacja gdy 2 userów w tym samym momencie wywoła licznik - jesli nie zabezpieczysz się przed tym, to ulegnie on wyzerowaniu (cecha trybu "w").

Ja metoda prób i błędów, potu i łez doszedłem w końcu do takiego, mysle, ze bezpiecznego i niezawodnego licznika:

  1. <?php
  2.  
  3. $df="nazwaplikulicznika.txt";
  4. $krolicznika = 1; 
  5.  
  6.  
  7. if (file_exists($df))
  8. {  
  9.  
  10. if ($fp=@fopen($df, "r+")) // niedestrukcyjny tryb r+
  11. {
  12.  
  13. if( flock($fp, LOCK_EX)) // jesli sie uda sie zablokowac do zapisu
  14. {
  15. $count = intval(fgets($fp, 20)) + $krolicznika;  
  16. ftruncate($fp, 0); // wyczeszczenie zawartosci pliku
  17. fseek($fp, 0);  // pointer na poczatek pliku 
  18. fputs($fp, $count);  // zapis nowej liczby do licznika
  19. flock($fp, LOCK_UN);  // zdjecie blokady
  20. fclose($fp);
  21. echo $count;  // Wyswietlenie stanu licznika
  22. }
  23.  
  24.  else {
  25.  fclose($fp); // zamkniecie jesli nie mozna bylo zalozyc locka 
  26. }
  27.  
  28. }
  29.  
  30. else // jesli nie udało sie otworzyc pliku do zapisu (np. z powodu braku odp. uprawnien) 
  31. { echo "ERROR! Nie moge zapisywac do tego pliku!"; }
  32.  
  33. }
  34.  
  35.  
  36. else  // jesli plik $df licznika NIE istnieje - trzeba go stowrzyc
  37.  
  38. {  
  39.  
  40.  echo "Tworze nowy plik licznika. Prosze odwiezyc strone"; 
  41.  touch($df); // folder w ktorym ma powstac plik licznika musi miec atr. 777
  42.  chmod($df, 0666); // na wszelki wypdek
  43.  
  44. } 
  45.  
  46.  
  47. ?>


Pozdrawiam,

latet
Forgoot
Bardzo dziękuję za pomoc, proszę tylko powiedziec jak moge zabezpieczyć mój kod przed wyzerowaniem pliku ilosc.dat (Bede wdzieczny jak powiecie jakich komend/funkcji uzyć...) questionmark.gif?
latet
Cytat(Forgoot @ 2005-10-04 12:02:43)
Bardzo dziękuję za pomoc, proszę tylko powiedziec jak moge zabezpieczyć mój kod przed wyzerowaniem pliku ilosc.dat (Bede wdzieczny jak powiecie jakich komend/funkcji uzyć...) questionmark.gif?

Np. tak jak w przykładzie, który podałem wyżej w pełnym brzmieniu.

latet
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.