r07_t.pdf

(302 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:
1
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
Jako filename wpisujemy zatem...
...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".
2
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
3
$file = fopen("data/banned.inf", "a+");
// Open index.html from http://www.phpforflash.com
// MUST be read only
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 {
4
// 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 {
5
Zgłoś jeśli naruszono regulamin