r07-t.doc

(204 KB) Pobierz
Oto przykłady stylów nagłówków:

Rozdział 7

 

Zaglądanie do plików zewnętrznych

 

W niniejszym rozdziale omówimy następujące tematy:

 

·         Odczytywanie plików zewnętrznych.

·         Zapisywanie nowych informacji w plikach i przechowywanie ich do przyszłego wykorzystania.

·         Wykorzystanie powyższych elementów w tworzeniu i zarządzaniu listą wysyłkową, działającą w oparciu o Flasha..

 

W poprzednim rozdziale przyjrzeliśmy się cookies i temu, jak możemy je wykorzystać w PHP do przechowywania informacji o odwiedzających witrynę, pomiędzy wizytami. Praktyka ta sprawdza się w stosunku do niewielkich ilości informacji, o małej ważności, ale w pewnych sytuacjach odznacza się pewnymi wadami...

 

·         Objętość danych

Ciasteczka doskonale nadają się do przechowywania niewielkich ilości informacji, a ich pojemność nie może przekraczać 4 kilobajtów. Oznacza to, że przechowywanie dużych porcji danych przy użyciu cookies jest całkowicie niepraktyczne.

 

·         Dostępność

Ciasteczka, z racji swej budowy, są osiągalne dla witryny jedynie wówczas, gdy użytkownik ją wizytuje. Użycie ciasteczek do przechowywania informacji takich, jak personalizowane wiadomości do wyświetlenia na witrynie podczas wizyty użytkownika, byłoby w związku z tym wirtualnie niemożliwe. Każdy użytkownik powinien bowiem dysponować własną kopią każdej wiadomości, a to wiąże się z problemem ograniczenia pojemności cookies.

 

·         Wstrzymywanie informacji

Kolejnym problemem związanym z ciasteczkami jest to, że nigdy nie możemy zagwarantować ich osiągalności dla witryny, gdy odwiedzający na nią powraca. Jeżeli w międzyczasie odwiedzi on wiele innych witryn, a liczba ciasteczek przekroczy 300, starsze ciasteczka zostaną usunięte, zwalniając miejsce dla nowych. Podobnie rzecz się ma, gdy użytkownik usunie cookies ręcznie lub w związku z reinstalacją oprogramowania. Dotychczasowe ciasteczka staną się nieosiągalne.

To oznacza, że nie powinniśmy przechowywać żadnych istotnych informacji w ciasteczkach, gdyż nie możemy mieć pewności, że będą one dostępne w chwili ponownej wizyty odwiedzającego.

 

·         Preferencje użytkownika

Ponadto, użytkownik może w każdej chwili wyłączyć obsługę cookies w przeglądarce.

 

Powyższe rozważania świadczą o tym, że mimo dużej przydatności ciasteczek, nie możemy na nich polegać w zupełności, jeśli chodzi o przechowywanie i zwracanie ważnych informacji.

Stwierdziwszy, że cookies obłożone są pewnymi, poważnymi ograniczeniami, musimy znaleźć dogodniejszy sposób magazynowania informacji otrzymywanych ze skryptów. W ciągu najbliższych rozdziałów omówimy wiele takich metod, ale na jednej, starej i sprawdzonej, skupimy się najbardziej — na użyciu plików tekstowych.

PHP oferuje szeroki wachlarz funkcji przeznaczonych do obsługi plików. Obecnie obejmuje on 65 różnorodnych funkcji odnoszących się zarówno do plików, jak i katalogów, co powinno być dla nas liczbą wystarczającą.

Nie ma tu miejsca na omówienie wszystkich tych funkcji, a ponadto byłoby to działanie wątpliwej wartości, gdyż jedynie niektórych z nich będziemy używać na stałe. Dlatego też skoncentrujemy się na tych funkcjach, które ułatwiają nam wykonywanie najczęstszych operacji:

 

·         Otwieranie

Otwieranie plików w celu odczytania informacji bądź ich zapisu.

 

·         Zamykanie

Zamykanie pliku po zakończeniu zadania.

 

·         Odczytywanie

Właściwa operacja odczytywania danych z pliku.

 

·         Zapisywanie

Zapis danych w pliku.

 

...oraz kilku innych, przeznaczonych do obsługi katalogów, dopełniając w ten sposób obraz całości. Czy ktoś zgłasza sprzeciw?

Rozdział ten zakończymy kolejnym, użytecznym przykładem. Tym razem będzie to utworzona we Flashu aplikacja obsługującą listę wysyłkową, którą można wbudować w każdą witrynę. Do aplikacji tej włączymy ponadto blok administratorski, który umożliwi zarządzanie listą i wysyłanie listów elektronicznych.

Z działaniem listy wysyłkowej możemy zapoznać się na witrynie www.phpforflash.com, skąd również można pobrać pliki źródłowe przykładów omawianych w niniejszym rozdziale.

Aby zaostrzyć swój apetyt, spójrzmy na poniższą ilustrację, przedstawiającą działającą aplikację — nie zastanawiajmy się jednak na razie jak ona działa!

 

Otwieranie plików

 

Najprostszą czynnością, spośród wykonywanych, jest otwieranie zewnętrznych plików. Do tego celu służy pojedyncza funkcja PHP: fopen().

Składnia funkcji fopen przedstawia się następująco:

 

fopen (filename, mode [, use_include_path]);

 

Zanim zajmiemy się parametrami tej funkcji, musimy pomówić o wartościach przez nią zwracanych.

Jeśli otwarcie wskazanego pliku powiedzie się, funkcja zwraca wartość w postaci uchwytu pliku. Mówiąc najogólniej, jest to liczba typu integer, stanowiąca unikalny identyfikator pliku, co pozwala użyć go w wywołaniach innych funkcji związanych z plikami. W przypadku niepowodzenia operacji otwarcia pliku, funkcja zwraca wartość false.

Teraz przyjrzyjmy się poszczególnym składnikom wywołania.

 

filename

Jeśli dokładnie zbadamy składnię fopen, zauważymy, że filename jest łańcuchem wskazującym nazwę otwieranego pliku. Funkcja fopen może posłużyć do otwarcia dowolnego pliku znajdującego się w systemie plików serwera, ale również poprzez Internet, za pomocą protokołów HTTP oraz FTP. Użyta metoda zależy od części otwierającej łańcuch filename.

 

http://

Jeśli filename rozpoczyna się przedrostkiem "http://", połączenie do wskazanego serwera ulega otwarciu, a zwrócony zostaje uchwyt pliku.

PHP nie obsługuje przekierowań HTTP i dlatego nazwa pliku, który chcemy otworzyć, musi być określona bardzo ściśle. Dla przykładu, przypuśćmy, że zamierzamy otworzyć plik o nazwie index.html, znajdujący się na witrynie http://www.phpforflash.com.

Jako filename wpisujemy zatem...

 

http://www.phpforflash.com/index.html

 

...aby otworzyć plik, mimo iż wskazanie adresu http://www.phpforflash.com w przeglądarce spowodowałoby automatyczne otwarcie pliku index.html.

Nie musimy się przy tym obawiać, że ktoś otworzy nasze pliki i je zmodyfikuje. Z oczywistych względów, protokół HTTP zezwala na otwieranie plików wyłącznie w trybie "tylko do odczytu".

 

ftp://

Jeżeli na początku filename znajdzie się przedrostek ftp://, spowoduje on otwarcie połączenia FTP z serwerem, a następnie zwrócenie uchwytu pliku. Jeśli serwer nie obsługuje trybu pasywnego ftp, wówczas operacja zakończy się niepowodzeniem.

Pliki można otwierać poprzez FTP zarówno w celu odczytania, jak i dokonania zapisu, ale nigdy jednocześnie. Jest to szczególne ograniczenie protokołu FTP.

Gdy filename rozpoczyna się w jakikolwiek inny sposób, plik zostaje otwarty z systemu plików, a zwrócony zostaje wskaźnik do pliku.

 

Warto zauważyć, że wielkość liter w przedrostku http:// lub ftp:// nie ma znaczenia.

Jeśli zaś chodzi o samo wskazanie pliku, to tutaj wielkość liter może, choć nie musi, być istotna, co zależy od systemu operacyjnego, który zarządza danym plikiem. Na przykład, serwery Windows traktują nazwy file.ext, File.ext i FILE.EXT dokładnie tak samo, podczas gdy serwery zarządzane przez system Unix czy Linux uznają je jako nazwy trzech, zupełnie różnych plików.

 

Powracając do składni funkcji fopen, zwróćmy uwagę, że po filename widnieje parametr mode.

 

mode

Mówiąc najprościej, wskazanie trybu służy do poinformowania skryptu PHP, jaką operację na pliku zamierzamy wykonać. Do dyspozycji mamy kilka różnych wartości, które wymienione są poniżej, wraz z określeniem reprezentowanych operacji:

 

Wartość

Znaczenie

r

Otwarcie pliku tylko do odczytu. Wskaźnik umieszczany jest na początku pliku.

r+

Otwarcie pliku do odczytu i zapisu. Wskaźnik umieszczany jest na końcu pliku.

W

Otwarcie pliku tylko do zapisu. Jeśli plik istnieje, jego zawartość ulega skasowaniu. Jeżeli plik nie istnieje, funkcja przystępuje do jego tworzenia.

w+

Otwarcie pliku do odczytu i zapisu. Jeżeli plik istnieje, jego treść ulega usunięciu. W przeciwnym razie funkcja tworzy nowy plik.

A

Otwarcie pliku w celu uzupełnienia – tylko do zapisu. Funkcja umieszcza wskaźnik na końcu pliku. Jeżeli plik nie istnieje, funkcja go tworzy.

a+

Otwarcie pliku w celu uzupełnienia – do odczytu i zapisu. Wskaźnik umieszczony zostaje na jego końcu. Jeśli plik nie istnieje, zostaje utworzony przez funkcję.

 

Parametr trybu może także używać litery "b" — oznacza ona, że plik powinien zostać otwarty w trybie binarnym. Jest to jednak opcja użyteczna tylko dla tych systemów, które odróżniają pliki binarne od tekstowych (czyli w Unixie nie znajdzie zastosowania). Jeśli parametr ten okaże się zbędny, jest ignorowany. Kiedy więc zajmujemy się plikami binarnymi, lepiej jest używać flagi "b", mimo iż Unix traktuje pliki ASCII i binarne w taki sam sposób, gdyż w ten sposób zapewnimy kodowi kompatybilność międzysystemową.

 

include_path

 

Przyglądając się skladni funkcji fopen po raz kolejny, zauważymy trzeci, opcjonalny parametr. Można ustawić jego wartość na "1", co oznacza, że zamierzmy poszukać pliku także w ścieżce include_path. include_path jest pozycją pliku konfiguracyjnego PHP, a więcej informacji na ten temat znajdziemy na witrynie www.php.net.

 

Niektóre akcje funkcji

 

Spójrzmy na kilka przykładów działania funkcji fopen().

 

// Open news.dat from file system for reading only

$file = fopen("news.dat", "r");

 

// Create a new file for writing on the file system

$file = fopen("output.txt", "w");

 

// Open file for appending: read and write in data dir

$file = fopen("data/banned.inf", "a+");

 

// Open index.html from http://www.phpforflash.com

// MUST be read only

$file = fopen(http://www.phpforflash.com/index.html, "r");

 

Jeśli serwer jest zarządzany przez system operacyjny Windows, wtedy szczególną ostrożność należy zachować wskazując ścieżkę dostępu do pliku i używając do tego celu ukośników odwrotnych. Wynika to stąd, że nazwa pliku jest ma postać łańcucha, a ukośnik odwrotny w łańcuchach ma znaczenie specjalne (o czym już wiemy). Alternatywą jest znak łamania, który nie ma znaczenia specjalnego i nie wymaga użycia znaku unikowego.

 

Ostrzeżenia

 

Zanim pójdziemy dalej, warto pomówić o komunikatach o błędach generowanych automatycznie podczas wykonywania takich operacji jak otwieranie pliku. W zależności od konfiguracji PHP, w razie wystąpienia błędu wykonania operacji, możemy otrzymać komunikat o tym fakcie, wraz ze wskazaniem miejsca w skrypcie.

Jako przykład weźmy taki oto komunikat:

 

Warning: file("test.txt") – No such file or directory in

path/to/www.codejunkie.co.uk/public_html/file.php on line 3

 

Oczywiście, komunikat tego rodzaju może spowodować spustoszenia w najpiękniej zaprojektowanym w HTML interfejsie użytkownika, a także, jak w naszym przypadku, wśród informacji odsyłanych do Flasha.

Aby zawiesić generowanie komunikatów o błędach, możemy użyć operatora zawieszania błędów — @ — przed wywołaniem funkcji. Na przykład, w celu uniknięcia generowania tych komunikatów przez funkcję fopen, jej wywołaniu moglibyśmy nadać postać:

 

$file = @fopen("test.txt", "r");

 

To nam pozwoli na samodzielne sprawdzenie wartości $file i, jeśli sobie tego zażyczymy, wygenerowanie znacznie przyjemniejszego w formie komunikatu o błędzie.

 

Zamykanie plików

 

Skoro wiemy już, jak otwierać pliki, musimy pomówić na temat ich zamykania! Każdy plik, który pozostanie otwarty w chwili zakończenia skryptu, ulega automatycznemu zamknięciu przez PHP, ale poprawną praktyką programistyczną jest zamykanie plików po ich użyciu. Zamknięcie jest konieczne także wówczas, gdy zechcemy zmienić tryb na inny, niż obowiązywał w chwili otwierania pliku.

PHP oferuje funkcję fclose(), która zajmuje się zadaniami zamykania plików.

 

fclose(file_handle);

 

fclose pobiera tylko jeden argument, którym jest uchwyt zamykanego pliku. W tym charakterze zaś wykorzystujemy wartość uprzednio zwróconą przez fopen. Funkcja zwraca true, jeśli operacja zostanie zakończona pomyślnie lub false, w przypadku niepowodzenia.

Ponieważ potrafimy już otwierać i zamykać pliki, możemy zająć się rzeczywistym przykładem:

 

<?

    // Attempt to open file for reading

    $file = @fopen("test.txt", "r");

 

    // If the file was opened successfully...

    if ($file) {

 

        // Output success message

        print "File opened successfully!\n";

 

        // Close file

        fclose($file);

    } else {

 

        // Otherwise output failure message

        print "File not opened!\n";

    }

?>

 

Powyższy kod służy jedynie do otwarcia pliku test.txt, znajdującego się w tym samym katalogu, w którym zapisany został skrypt PHP. Jeśli operacja powiedzie się, nastąpi wyświetlenie mówiącego o tym komunikatu, a następnie zamknięcie pliku. W przeciwnym razie, wygenerowany zostanie jedynie komunikat o niepowodzeniu. Może się to wydać oczywiste, ale nie zaszkodzi wspomnieć, że nie ma potrzeby zamykania pliku, którego otwarcie nie powiodło się!

 

Wyświetlanie pliku

 

Otwieranie i zamykanie plików to ważne zagadnienia, ale w zasadzie nie ma w tym nic interesującego, nieprawdaż? Musimy zatem mieć do dyspozycji sposób wyświetlania zawartości plików, co pozwoli nam wykorzystywać je zgodnie z przeznaczeniem!

Przyjrzyjmy się więc funkcji PHP, o nazwie fpassthru(). Jej działanie polega na przesyłaniu zawartości pliku do klienta.

 

fpassthru(file_handle);

 

Także i w tym przypadku funkcja wykorzystuje uchwyt wyświetlanego pliku, prezentowany jako pojedynczy argument. Powodzenie operacji powoduje zwrócenie wartości true, niepowodzenie zaś, false.

Funkcja zwraca zawartość pliku, począwszy od miejsca bieżącego (więcej na ten temat dowiemy się później), do końca. Jako dodatek premiowy, fpassthru zamyka plik po zakończeniu działania. Aby odebrać treść pliku, o ile jego otwarcie powiodłoby się, moglibyśmy zmodyfikować poprzedni przykład w następujący sposób:

 

<?

    // Attempt to open file for reading

    $file = @fopen("test.txt", "r");

 

    // If the file was opened successfully...

    if ($file) {

 

        // Output success message

        print "File opened successfully! <br>\n";

 

        // Output file contents

        fpassthru($file);

    } else {

 

        // Otherwise output failure message

        print "File not opened!\n";

    }

?>

 

Warto zwrócić uwagę, że wywołanie fclose zostało usunięte z tego kodu, gdyż funkcja fpassthru zamyka plik samodzielnie.

 

W omawianym kontekście, funkcja fpassthru najlepiej radzi sobie z plikami tekstowymi. Jednakże, za pomocą tej samej funkcji można otwierać także pliki graficzne:

 

<?

    // Attempt to open file for reading

    $file = @fopen("steve.jpg", "r");

 

    // If the file was opened successfully...

    if ($file) {

 

        // Output image

        fpassthru($file);

    } else {

 

        // Otherwise output failure message

        print "File not opened!\n";

    }

?>

 

Jeżeli w przeglądarce wprowadzimy adres powyższego skryptu, a wskazany plik graficzny istnieje, efekt będzie taki sam, jak byśmy wpisali jego nazwę bezpośrednio. Jednak w przypadku braku pliku otrzymamy odpowiedni, informujący o tym fakcie, komunikat.

Tę samą technikę można wykorzystać w innym wywołaniu funkcji fpassthru, generując za jej pomocą komunikat informujący o niemożności odnalezienia pliku, nadający się do współpracy ze znacznikiem HTML <IMG>, zastępując nim te przerażające okna z czerwonymi krzyżykami!

 

Kod PHP:

 

<?

    // Attempt to open file for reading

    $file = @fopen($filename, "r");

 

    // If the file was opened successfully…

    if ($file) {

 

        // Output image

        fpassthru($file);

    } else {

 

...

Zgłoś jeśli naruszono regulamin