Studio projektowe
 



<<< Powrót


 

4.1. Podstawowe operacje na plikach

  

                Podstawowymi funkcjami plikowymi są: fopen(); fread(); fputs(); fgets(); fwrite; fclose(); Funkcja fopen() otwiera wskazany plik i w razie sukcesu zwraca nam liczbę dodatnią, która jest wskaźnikiem otwartego pliku. Będziemy go używać zawsze ilekroć będziemy odczytywać, zapisywać bądź zamykać plik.

 $wskaznik_pliku = fopen ($nazwa_pliku, $tryb_otwarcia);

Jak widać nasza funkcja ma 2 atrybuty. Nazwa pliku to po prostu ścieżka dostępu do pliku a tryb otwarcia to jeden z 6 dostępnych trybów:

'r' - Otwórz tylko do odczytu; ustawia wskaźnik pliku na początku pliku.
'r+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku.

'w' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć.

'w+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć.

'a' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć.

'a+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć. (1)

 

Jeśli zdefiniowany został wskaźnik pliku, wybraliśmy odpowiedni tryb otwarcia to teraz możemy odczytać z pliku to, co nas interesuje. Odczyt pliku realizujemy za pomocą funkcji fread(); lub fgets();

 $text_pliku = fread ($wskaznik_pliku, $dlugosc);

$text_pliku = fgets ($wskaźnik_pliku, $dlugosc);

Obie funkcje są do siebie bardzo podobne w obu możemy ustalić dowolny fragment pliku, który chcemy odczytać. W tym miejscu należy powiedzieć o bardzo przydatnej funkcji, która oblicza nam długość pliku przez co możemy od razu odczytać zawartość całego pliku. Jest to funkcja filesize($nazwa_pliku); Jeśli będziemy chcieli ją zastosować to napiszemy:

  $text_pliku = fread ($wskaznik_pliku, filesize($nazwa_pliku));

 W przypadku funkcji fgets() dopuszczalne jest nie podawanie  parametru $dlugosc, jest on bowiem domyślnie ustalona na 1kB czyli 1024. Jeśli chcielibyśmy odczytywać  plik fragmentami np. w pętli while to zachęcam do skorzystania właśnie z tej funkcji. Będzie ona wykonywana do momentu natrafienie na koniec linii lub koniec pliku.

 No dobrze. Umiemy już otworzyć plik i odczytać jego zawartość, przyszedł czas aby coś zapisać. Do zapisywania łańcucha znaków w pliku służy funkcja fwrite:

 $ile = fwrite ($wskaznik_pliku, $dowolny_tekst);

Funkcja ta zwraca liczbę zapisanych bajtów, lub FALSE w przypadku błędu. Więc jeśli będziemy chcieli mieć pewność że nasz tekst został zapisany prawidłowo w pliku, sprawdzimy czy zmienna $ile ma wartość i ile wynosi. Jeśli zmienna $ile ma wartość zgodną z ilością zapisanych bajtów to nasz tekst został poprawnie zapisany. Prosty przykład:

 <?php

  $nazwa_pliku = 'test.txt';
  $tekst = "Dodaj to do pliku\n";

   if (!$wskaznik_pliku = fopen($nazwa_pliku, 'a+')) {
          echo "Nie mogę otworzyć pliku ($nazwa_pliku)";

           exit;
     }
   if (fwrite($wskaznik_pliku, $tekst) === FALSE) {
        echo "Nie mogę zapisać do pliku ($nazwa_pliku)";

         exit;
     }
  echo "zapisano: \"$tekst\" do pliku ($nazwa_pliku)";

fclose($wskaznik_pliku);

?>

Ten prosty skrypt php ilustruje w jaki sposób otwieramy i zapisujemy tekst do pliku. W razie jakichkolwiek problemów skrypt podpowie w którym Momocie napotkał na błąd.

Jeżeli chcielibyśmy zaprojektować licznik do naszej strony to w takim wypadku nie wystarczy otworzyć pliku i zapisać w nim wartość. Przykładowo załóżmy że nasz plik licznika, w którym będziemy zbierać informacje o liczbie odwiedzających nazwiemy licznik.txt. Gdy pierwszy raz wchodzimy na stronę to jest zapisywana wartość 1. Moglibyśmy to zrobić podobnie jak w powyższym przykładzie. Jeśli chcielibyśmy liczyć następnych internautów to musielibyśmy dodać fragment kodu który odczytywałby zapisaną w pliku wartość a następnie zwiększałby o 1 i znowu zapisywał. Mogłoby to wyglądać tak:

<?php   

  $nazwa_pliku = 'licznik.txt';

   if (!$wskaznik_pliku = fopen($nazwa_pliku, 'a+')) {

           echo "Nie mogę otworzyć pliku ($nazwa_pliku)";
           exit;

     }

$tekst = fread($wskaznik_pliku, filesize($nazwa_pliku));

$tekst++;

if (fwrite($wskaznik_pliku, $tekst) === FALSE)
   {
       echo "Nie mogę zapisać do pliku ($nazwa_pliku)";
       exit;
    }

echo "zapisano: \"$tekst\" do pliku ($nazwa_pliku)";

fclose($wskaznik_pliku);

?>

 

Prześledźmy działanie takiego licznika: 

Rzeczywista liczba odwiedzin:

Dopisywane wartości

1

1

2

2

3

13

4

1214

5

12131215

6

1.2131214121312E+015

 Licznik nie działa jak trzeba, to na pewno! Ale co się stało? Otworzyliśmy plik, odczytaliśmy jego zawartość i dopisaliśmy na koniec pliku wartość pliku zwiększoną o 1. Czyli na początku nie było pliku czyli 0++, 1 zapisaliśmy do pliku. Następnym razem odczytaliśmy wartość 1 zwiększyliśmy ja o 1 czyli 2 dopisaliśmy na koniec pliku. Nasz licznik.txt ma w rzeczywistości wartość 12. Kolejny raz odczytujemy plik i zwiększamy jego wartość czyli 12 + 1 i kolejny raz dopisujemy wartość na koniec pliku czyli 13 i teraz licznik.txt wygląda tak: 1213 itd.. Jak widać nic nam z takiego licznika... Gdybyśmy zmienili atrybut tak aby nasz zapis zaczynał się od początku pliku czyli na ‘w+’ to nic nie odczytalibyśmy z naszego pliku bo takie otwarcie automatycznie kasuje jego zawartość. Jak zatem zaprojektować licznik który byłby funkcjonalny w 100%? Należy dwukrotnie otworzyć plik licznik.txt, najpierw do odczytu (odczytujemy wartość licznika), zamknąć plik a następnie ponownie otworzyć do zapisu. Zwiększyć wartość i zapisać. Prześledźmy przykład:

 <?php  

  $nazwa_pliku = 'licznik.txt';

 if (!$wskaznik_pliku = fopen($nazwa_pliku, 'a+')) {

           echo "Nie mogę otworzyć pliku ($nazwa_pliku)";

           exit;

     }

$tekst = fread($wskaznik_pliku, filesize($nazwa_pliku));
fclose($wskaznik_pliku);

if (!$wskaznik_pliku = fopen($nazwa_pliku, 'w+')) {

           echo "Nie mogę otworzyć pliku ($nazwa_pliku)";
           exit;

     }
$tekst++;

if (fwrite($wskaznik_pliku, $tekst) === FALSE) {
echo "Nie mogę zapisać do pliku ($nazwa_pliku)";

exit;

}

echo "zapisano: \"$tekst\" do pliku ($nazwa_pliku)";

fclose($wskaznik_pliku);  

?>

 

Wygląda na to że wszystko działa jak trzeba.

Uwaga: Przed uruchomieniem skryptu należy skasować plik licznik.txt z pamięci lub ustawić inną ścieżkę dostępu do pliku np.: $nazwa_pliku = licznik2.txt