Działania na plikach

W poprzedniej części umożliwiliśmy użytkownikowi wrzucenie pliku na serwer. W tej części dowiemy się jak można samemu stworzyć plik oraz na nim podziałać. Główne czynności jakie poznamy to tworzenie pliku, edycja, zapis, usuwanie.

Tworzenie pliku

Pliki tworzy się tak samo jak otwiera. Aby otworzyć lub utworzyć plik należy wykorzystać funkcję fopen, funkcja ta przyjmuje cztery argumenty: ścieżkę pliku, tryb pracy oraz „include_path” i „context”. Ostatnie dwa parametry są nieobowiąskowe i je omówimy zapewne w bardziej zaawansowanym kursie PHP przy okazji strumieni zaś teraz najbardziej nas interesują ścieżka i tryb.

Czym jest ścieżka wiemy z poprzedniej cześci, trybów pracy do których otwieramy pliki jest kilka, a między innymi:

  • „r” – otwarty tylko do odczytu, wskaźnik zostaje umieszczony na początku pliku.
  • „r+” – do odczytu i zapisu z kursorem na początku pliku.
  • „w” – otwarty tylko do zapisu z kursorem na początku i jeśli są tam jakieś dane to wycina je że przy próbie nadpisania zapisane są tylko nowe dane. Jeśli plik nie istnieje to jest tworzony (no chyba że ścieżka nie istnieje – w sensie katalog).
  • „w+” – jak wyżej, tylko możemy przeczytać to co zapisujemy.
  • „a” – jak w przypadku „w” z tym że kursor jest na końcu i jak coś zapisujemy to dopisujemy do tego co jest.
  • „a+” – jak wyżej tylko że można jeszcze czytać.
  • „x” – to samo co przy „w” z tym że jeśli plik istnieje to zwraca FALSE i generuje ostrzeżenie.
  • „x+” – jak wyżej z tym że można czytać.
  • „c” – otwiera do zapisu, jeśli nie ma to tworzy, nie ucina.
  • „c+” – jak wyżej tylko jeszcze można czytać
  • „e” – ustawia flagę zamknięty do wykoania dla innych programów.

Czyli jak widać trybów w jakich możemy otwierać pliki jest całkiem sporo ale podejrzewam że i tak najczęściej wykorzystywane będą „w+” lub „r+”. A teraz podejmijmy próbę utworzenia naszego pierwszego pliku, wczesniej przygotowawszy folder images określamy ścieżkę podobnie jak w poprzedniej lekcji:

<?php
    $path = $_SERVER['DOCUMENT_ROOT']. '/kurs_php/images';
    $handle = fopen($path . "/test.txt", "w+");
?>

Powyższy kod powinien utworzyć nam plik tekstowy „test.txt” w folderze images, a następnie przypisać jego uchwyt do zmiennej $handle. Wykorzystaliśmy tutaj tryb w+ co oznacza że plik powinien się utworzyć i być możliwy zarówno zapis jak i odczyt. Gdyby plik istniał czyli na przykład przy odświeżeniu strony otworzył by się do nadpisania.

Często bardzo przydatną funkcją jest listowanie plików w katalogu do czego wykorzystujemy funkcję scandir($path). Jako argument przekazujemy ścieżkę do katalogu, w którym pliki chcemy wylistować.

<?php
    $files = scandir($path);
    var_dump($files);
?>

W powyższym przykładzie wykorzystujemy wcześniej zdefiniowaną ścieżkę do katalogu „images”, skanujemy ten folder a następnie wyświetlamy zawartość zmiennej $files za pomoca funkcji var_dump().

Funkcja „var_dump()” jest bardzo często używana przy poszukiwaniu błędów. Jest tak bardzo przydatna ponieważ możemy za jej pomocą wyświetlić dokładne informacje o tym co przechowuje zmienna o czym napiszę w lekcji o poszukiwaniu błędów szerzej. Tera powinniśmy uzyskać mniej więcej taki wynik:

array(4) { [0]=> string(1) „.” [1]=> string(2) „..” [2]=> string(8) „test.txt” [3]=> string(9) „test2.txt” }

W tym przykładzie widzimy dziwny ciąg znaków dla poczatkującego, jednak da się go stosunkowo łatwo rozszyfrować. Pierwsze hasło array(4) oznacza że otrzymaliśmy tablicę czterech elementów (przeważnie są co najmniej dwa elementy). Otwierająca klamra oznacza otwarcie obiektu czyli tablicy w tym momencie. Dalej w nawiaszach kwadratowych mamy zero i strzałkę [0]=> oznacza to że pierwszy element tablic zawiera, dalej analogicznie widzimy [1] , [2], [3], czyli odniesienia do kolejnych lementów tablicy. Po strzałce mamy string(1) co oznacza że ten element tablicy zawiera tylko jeden znak. Po określieniu typu i długości wartości jest ta wartość „.”, czyli kropka w cudzywłowach oznaczająca katalog bieżący. Dalej mamy dwie kropki czyli katalog nadrzędny i kolejno test.txt oraz test2.txt co oznacza że w bieżącym katalogu znajdują się dwa pliki. (do naszego przykładu dodałem jeszcze plik „test2.txt”).

I tym sposobem możemy na przykład wyświetlić wgrane przez użytkownika zdjęcia tworząc galerię lub linki do pobrania plików jakie wrzuca bez konieczności uzycia bazy danych.

Ok, teraz spróbujemy coś zapisać do naszego pliku testowego. Do zapisu wykorzystamy funkcję fputs($uchwyt, $dane), która pobiera jako argumenty nasz uchwyt pliku oraz dane jakie chcemy zapisać.

<?php
    $path = $_SERVER['DOCUMENT_ROOT']. '/kurs_php/images';
    $handle = fopen($path . "/test.txt", "w+");
    $data_to_save = "Jakies tam dane";
    fputs($handle, $data_to_save);
    fclose($handle);
?>

Ważna jest także funkcja fclose($handle), która jako argument pobiera uchwyt pliku, który chcemy zamknąć. Po wykonaniu zadania zawsze należy pliki zamykać bo mogą się zadziać różne dziwne rzeczy typu brak pamięci albo jakieś konflikty. W tym przykładzie nadpisaliśmy dane zawarte w pliku (jeśli jakieś tam były). Zachęcam do wypróbowania różnych trybów otwarcia plików przedstawionych wcześniej tak jak „a”, „a+”,”x”, „c” itd. oraz obserwacji co się dzieje, to najlepszy sposób na zdobycie doświadczenia.

Z podstawowych działań na plikach został nam jeszcze odczyt tego co zapisaliśmy. Do odczytu wykorzystujemy funkcję fread($handle, $length), która pobiera uchwyt pliku i długość odczytu.

<?php
    $handle = fopen($path . "/test.txt", "r+");
$data_to_read = fread($handle, 5);
echo $data_to_read;
fclose($handle);
?>

W ten sposób możemy odczytać zawartość pliku test.txt ale tylko 5 pierwszych znaków. Warto tutaj zauważyć że otworzyliśmy plik w trybie r+ bo gdybyśmy to zrobili np z w+ to plik by został wyczyszczony.

Zadania

Zadanie 1

Napisz najprostszy edytor tekstowy, czyli przy uruchomieniu programu tworzysz jeśli nie ma plik, wczytujesz jego treść do formularza HTML a następnie po wysłaniu formularze treść pola jest z powrotem zapisywana do pliku. Jeśli użytkownik coś zmienił to oczywiście zmiany są zapisywane.

Zadanie 2

Jeśli jesteś ambitny? to zrób listę plików w katalogu z odnośnikami gdzie można przesłać metodą get nazwę dowolnego pliku do otwarcia. Umożliw także użytkownikowi tworzenie własnych plików dodając pole tekstowe do formularza na nazwę pliku.

Zadanie 3

Jeśli dalej ci mało to napisz program bazę użytkowników, gdzie dane każdego z użytkowników będą przechowywane w oddzielnym pliku zaś edycja danego pliku będzie w co najmniej czterech polach formularza, imię i nazwisko, adres, telefon, email. Pewnie najprościej będzie nazwać pliki tak jak użytkowników a każdą informację przechowywać w oddzielnym wierszu pliku.