![]() |
|
Programowanie:
Artykuły
FAQ
Download
Książki
WWW:
Artykuły
Narzędzia
Kursy
Darmowe
FAQ
Skrypty
Humor
Inne:
Forum
Wiki
Liczniki
Linki
Chat
Grafika
Video
Inne
|
|
Autor: Kacper Cieśla Bez znajomości obsługi plików w PHP ciężko napisać jakiś przyzwoity skrypt. Jest to podstawowa forma przechowywania danych. Oczywiście można skorzystać z MySQLa, ale po pierwsze, MySQLa raczej nie znajdziesz na darmowych serwerach www z obsługą PHP, a po drugie, nawet jeżeli posiadasz już komercyjny serwer, przestrzeń w bazie MySQL jest o wiele droższa od przestrzeni dyskowej. Do rzeczy. Operacje na plikach Na początek opiszę jak dobrać się do pliku, dopiero później przeanalizujemy sposoby przechowywania w nim danych. No to otwieramy Zanim zaczniemy coś zapisywać, bądź też odczytywać z pliku, musimy go najpierw otworzyć, oraz skojarzyć z jakąś zmienną z której będziemy później korzystać przy odwoływaniu się do niego. W podanych tu przykładach będzie to zmienna $plik (ambitna nazwa, no nie ? ;)). Do otwarcia pliku służy funkcja fopen(). Posiada dwa argumenty. Pierwszy to nazwa pliku, natomiast drugi, to tryb w jakim plik ma być otworzony. To co funkcja zwraca przypisujemy do naszej zmiennej $plik. Czyli np.
Teraz troszkę o drugim parametrze, może on przyjmować następujące wartości:
Jeżeli otwieramy plik do odczytu, dopuszczalne jest także podanie adresu HTTP (chyba że jest to zablokowane na serwerze). Czyli możemy np napisać:
Odczytujemy ... Jeżeli mamy już otworzony plik możemy coś odczytać np. dwuargumentową funkcją fread(). Pierwszy argument to nasza zmienna skojarzona z plikiem, natomiast drugi to liczba bajtów które chcemy odczytać. Funkcja zwraca to, co odczytała. Przykład:
Cała zawartość pliku znajdzie się w zmiennej $tresc.
W zmiennej znajdziemy pierwsze 100 znaków pliku. Nie jest to jednak jedyna funkcja do odczytywania zawartości plików możemy jeszcze korzystać z:
Jest jeszce jeden bardzo ładny sposób na odczytywanie plików ale o nim za chwilę. ... i zapisujemy Bo nie będziemy mieli co czytać ;) Przy zapisie należy pamiętać, że skrypt musi mieć odpowiednie prawa do zapisu, ewentualnie utworzenia pliku. Jeżeli zamierzamy edytować pojedyńczy plik najłatwiej nadać mu uprawnienia następującą komendą ftp:
Jeżeli mamy klikalnego klienta ftp komnedę chmod zazwyczaj wywołuje się gdzieś z menu które pokaże się po kliknięciu prawym przyciskiem myszy na pliku. Jeżeli zamierzamy tworzyć nowe pliki, katalogowi w którym zamierzamy je tworzyć nadajemy w ten sam sposób prawa zapisu, jednak zamiast atrybutów 666 przypisujemy 777. Do zapisu korzystamy z funkcji fputs() lub fwrite() (pierwsza jest aliasem tej drugiej). Pierwszy argument to nasza ukochana zmienna do której przypisany jest plik, natomiast drugim jest oczywiście to, co chcemy zapisać:
Dla niewtajemniczonych dodam, że \n jest znakiem przejścia do następnej linii. Zamykamy Jak już się nacieszymy pracą z plikiem możemy go zamknąć:
Przykład Jak widać, mimo że napisałem to w bardzo rozlazły sposób operacje na plikach nie są trudne. Podam może jeszce gotowy przykład zapisu (lub utworzenia w przypadku gdy nie istnieje) do pliku pliczek.txt:
I odczyt:
Tak, nie ma wywyołania funkcji fclose(). A to dlatego, że fpassthru() wywołuje ją automatycznie. Odczyt inaczej A teraz jeszcze jeden sposób na odczyt z pliku. Osobiście korzystam tylko z niego. Jest to bardzo prosta funkcja file(). Jako argument podajemy ścieżkę do pliku, a zwraca nam... tablicę, w której pojedyńcze elementy odpowiadają linijkom pliku.
Myślę, że ze zrozumieniem tego kodu nie powinno być problemu. Przechowywanie danych A teraz praktyczne zastosowania operacji na plikach. Załóżmy, że mamy do przechowania tablicę użytkowników. Dla każdego użytkownika chcielibyśmy zapisać hasło, numer identyfikacyjny i jakiś opis. Jest wiele sposobów na zapisanie takich danych w plikach, ja osobiście zrobiłbym to tak (treść pliku):
Itd. Jak widać struktura pliku bardzo przypomina graficzne odwzorowanie tablicy. W każdej linijce mamy po jednym wierszu tablicy. Funkcja file() błaga wręcz o jej zastosowanie. Po rozbiciu na linijki, każdą linijkę rozbijamy na kolumny, za pomocą funkcji explode. Jako pierwszy argument podajemy jej ciąg znaków którym oddzielone są od siebie kolumny, a jako drugi linijkę. W zamian otrzymujemy tablicę, której pojedyncze elementy są kolumnami z pliku. Przykładowy kod będzie więc wyglądał następująco:
Gotowe. Ale warto zwrócić uwagę na jeszcez jedną rzecz. Jeżeli użtykownik poda nam np. w swoim opisie znak "|" lub znak nowej linii, zepsuje całą strukturę pliku. Możemy więc te znaki po prostu wyciąć, lub zastąpić jakimiś innymi, których prawdopodobieństwo wystąpienia jest znikome. Problem ten znika jeżeli rozmiar każdego pola ograniczymy do jakiejś liczby znaków i tylko tyle będziemy odczytywać. Np. pierwsze 3 znaki to id, 10 znaków to login, kolejne 10 to hasło, następne 40 to opis a znak 41 rozpoczyna już kolejny rekord. A teraz załóżmy że mamy do przechowania w pliku konfigurację skryptu. Oczywiście można stworzyć tablicę jak w powyższym przykładzie i odczytać z niej różne wartości, jednak zazwyczaj o wiele bardziej praktyczne okazuje się zapisanie pliku PHP z wartościami zmiennych. Przykładowy wygląd pliku:
No i jeszcze zapisanie takiego pliku coby była jasność:
Przy założeniu, że w zmiennych o takich nazwach jak te w pliku konfiguracyjnym mamy zapisane dane które chcemy zapisać do pliku. Można również zapisywać konfigurację w plikach o strukturze ini. Więcej info pod adresem http://pl2.php.net/manual/en/function.parse-ini-file.php A gdyby... ? Wyobraźmy sobie, że kilka osób wchodzi jednocześnie na naszą stronę. My natomiast napisaliśmy sobie w PHP skrypt statystyk, który każdą wizytę odnotowuje w pliku user.log. Zostanie odpalonych kilka kopii tego skryptu, i wszystkie będą próbowały zapisać coś do pliku. Co się stanie ? Z moich doświadczeń wynika, że zazwyczaj zostają utracone wszystkie dane które znajdowały się w pliku. A tego chyba byśmy nie chcieli. Z pomocą przychodzi nam blokowanie plików. Obsługuje je funkcja flock(). Powinniśmy ją zastosować we wszystykich skryptach które będą operowały na pliku. Funkcja jako pierwszy argument przyjmuje uchwyt do pliku (czyli nasza zmienna $plik), natomiast z drugiego argumentu dowiaduje się co ma zrobić.
Funkcja zwracając nam wartość typu bool (true/false) oznajmia czy udało jej się zablokować dany plik. Przykład:
Inne operacje na plikach PHP oferuje bardzo wiele funkcji związanych z operacjami na plikach. W tabelce poniżej znajdują się te wg. mnie najbardziej użyteczne.
Inną dość często spotykaną operacją jest wypisanie wszystkich plików z danego katalogu. Funkcja glob() zwraca nam w tablicy wszystkie pliki które pasuja do maski podanej jako argument. Przykładowy kod wypisujący wszystkie pliki .dat z katalogu data:
Bezpieczeństwo Pozostaje jeszcze sprawa bezpieczeństwa. W końcu jeżeli mamy przechowywać w plikach hasła użytkowników to raczej nie chcemy by ktoś mógł je przeglądnąć wpisując w przeglądarce http://www.example.com/data/hasla.txt. Ja zazwyczaj na pliki z danymi tworzę osobny katalog i umieszczam w nim plik o nazwie .htaccess (dokładnie tak się musi nazywać, z kropką na początku) z treścią:
Jeżeli teraz ktoś z zewnątrz będzie próbował się do niego dobrać otrzyma komunikat o błędzie 403 (dostęp zabroniony). No i chyba wystarczy tego skrótu o plikach. Polecam strony manuala PHP dotyczące obsługi plików, między innymi: |
|