Licznik- problem


(Marcin E Pc) #1

Witam!

Skończyłem naukę php dotyczącą plików txt. Mam problem, napisałem sobie skrypt:

<?php


if (file_exists("licznik.txt"))

{


    $wp = fopen("licznik.txt", 'rw');

     $e = fgets($wp, 999);

      ++$e;

    fwrite($wp, $e);

    fclose($wp);

}

?>

i już to nie działa, tzn nie zapisuje do pliku kolejnej liczby, a w pliku txt wpisałem wartość początkową, 1, a plik też zzostał otworzony w celu odczytu i zapisu. I jeszcze jedno pytanie, gdzieś znalazłem taki oto kod licznika, ale nie wiem jak on dział:

if(file_exists("counter.n")) /* sprawdza, czy plik istnieje */

{ $file=fopen("counter.n", "r"); /* otwiera plik */

flock($file, 1); /* blokuje plik */


$ile=fgets($file, 100); /* odczytuje wartość */


flock($file, 3); /* odblokowuje plik */

fclose($file); /* zamyka plik */


$ile++; /* zwiększa wartość o 1 */

}

else

$ile=1; /* jeśli plik nie istnieje, wyświetli się 1 */


$file=fopen("counter.n", "w"); /* otwiera plik do zapisu */

flock($file, 2); /* blokuje do zapisu */


fwrite($file, $ile); /* zapisuje wartość */


flock($file, 3); /* odblokowuje plik */

fclose($file); /* zamyka plik */


echo($ile); /* wyświetla wartość */

I jeżeli plik istnieje ma go otworzyć , założyć blokade odczytać zawartość i zdjąć blokadę, zamknąć plik i dodać 1, ale gdzie jest coś co zapisuję tą wartość po dodaniu, i dlaczego nie generuje błędu, po instrukcji else nie ma znaków {}.

Już chyba zrozumiałem dlaczego to 2 działa, else odnosi się do jednej lini po.


(Slafur) #2

tutaj:

fwrite($file, $ile);

odpowiedź: jeżeli nie ma znaków { oraz } po if albo else - to w takim wypadku warunek będzie obejmował tylko jedną linię po tym warunku przykład:

<?php

//$code = 1;

if($code)

echo "kod istnieje";


else

echo "kod nie istnieje";


echo "
a ten tekst i tak się wyświetli";

?>

wyjaśnienie:

do otwierania pliku do zapisu i odczytu służą: "r+" i "w+" a nie "rw" - bo to jest błedny zapis..

..swoją drogą polecan najpierw odczytać zawartość pliku, a później wykasować go i zapisać nową (powiększoną) wartość..


(Marcin E Pc) #3

Już wcześnie poradziłem sobie z tym, a potem jeszcze edytowałem post i napisasłem że już wiem dlaczego to 2gie działa. I nie tkwił błąd w tym że napisałem :

$wp = fopen("licznik.txt", 'rw');

zamiast

$wp = fopen("licznik.txt", 'rw');

po wywołaniu

$e = fgets($wp, 999);

wskaźnik pliku przenosił się na koniec, wystarzczyło przewinąć do początku używając

rewind()

Czyli działająca całość wygląda tak:

<?php

if (file_exists("licznik.txt"))

{

     $wp = fopen("licznik.txt", 'r+');

     $e = fgets($wp);

     $stan = ++$e;

     echo $e;

     rewind($wp);

     fwrite($wp, $stan);

     fclose($wp);

}

?>

pozdrawiam