Upload
wydawnictwo-helion
View
1.367
Download
0
Embed Size (px)
DESCRIPTION
Coraz więcej serwisów internetowych składa się nie tylko z atrakcyjnego interfejsu użytkownika, ale także z rozbudowanych aplikacji działających na serwerze. Są one najczęściej oparte o bazy danych, które przechowują dane i zapewniają szybki do nich dostęp. Jeśli chcesz w krótkim czasie nauczyć się tworzyć takie aplikacje, znalazłeś właściwą książkę."PHP i MySQL. Dynamiczne strony WWW" nauczy Cię tworzenia dynamicznych serwisów internetowych z wykorzystaniem PHP i MySQL-a. Książka przekaże Ci wiedzę niezbędną dla projektantów rozwiązań internetowych. Wszystkie zagadnienia opisane są "krok po kroku", każdemu z nich towarzyszy też odpowiedni rysunek. Przykłady odzwierciedlają problemy, z którymi projektanci stron internetowych spotykają się na co dzień.Książka opisuje:* Podstawy programowania w PHP* Tworzenie dynamicznych stron internetowych z użyciem PHP* Zasady projektowanie baz danych* Język SQL* Korzystanie z systemu zarządzania bazami danych MySQL* Łączenie PHP z systemem MySQL* Użycie sesji* Zabezpieczanie stron internetowych przed dostępem nieuprawnionych osób* Przykładowe aplikacje: rejestracja użytkowników i sklep internetowyTreść książki uzupełniają dodatki opisujące sposób instalacji omawianych w niej narzędzi oraz dodatkowe, przydatne aplikacje.Jeśli chcesz w szybko nauczyć się programowania dynamicznych serwisów internetowych, ta książka będzie Twoim intensywnym kursem. Już po przeczytaniu kilku rozdziałów będziesz w stanie pisać pierwsze programy w PHP korzystające z bazy MySQL, a po przeczytaniu całej książki poradzisz sobie również z tworzeniem bardziej rozbudowanych aplikacji.
Citation preview
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: [email protected]
PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£
IDZ DOIDZ DO
ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG
KATALOG KSI¥¯EKKATALOG KSI¥¯EK
TWÓJ KOSZYKTWÓJ KOSZYK
CENNIK I INFORMACJECENNIK I INFORMACJE
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW CENNIKZAMÓW CENNIK
CZYTELNIACZYTELNIA
FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE
SPIS TRE�CISPIS TRE�CI
DODAJ DO KOSZYKADODAJ DO KOSZYKA
KATALOG ONLINEKATALOG ONLINE
PHP i MySQL.Dynamiczne stronyWWW. Szybki startAutor: Larry Ullman
T³umaczenie: Micha³ Dadan (rozdz. 1 – 7),
Piotr Pilch (rozdz. 8 – 13, dod. A – D)
ISBN: 83-7361-157-6
Tytu³ orygina³u: PHP and MySQL for Dynamic Web Sites VQPG
Format: B5, stron: 580
Przyk³ady na ftp: 352 kB
Coraz wiêcej serwisów internetowych sk³ada siê nie tylko z atrakcyjnego interfejsu
u¿ytkownika, ale tak¿e z rozbudowanych aplikacji dzia³aj¹cych na serwerze. S¹ one
najczê�ciej oparte o bazy danych, które przechowuj¹ dane i zapewniaj¹ szybki do nich
dostêp. Je�li chcesz w krótkim czasie nauczyæ siê tworzyæ takie aplikacje, znalaz³e�
w³a�ciw¹ ksi¹¿kê.
„PHP i MySQL. Dynamiczne strony WWW” nauczy Ciê tworzenia dynamicznych
serwisów internetowych z wykorzystaniem PHP i MySQL-a. Ksi¹¿ka przeka¿e Ci wiedzê
niezbêdn¹ dla projektantów rozwi¹zañ internetowych. Wszystkie zagadnienia opisane
s¹ „krok po kroku”, ka¿demu z nich towarzyszy te¿ odpowiedni rysunek. Przyk³ady
odzwierciedlaj¹ problemy, z którymi projektanci stron internetowych spotykaj¹ siê
na co dzieñ.
Ksi¹¿ka opisuje:
• Podstawy programowania w PHP
• Tworzenie dynamicznych stron internetowych z u¿yciem PHP
• Zasady projektowanie baz danych
• Jêzyk SQL
• Korzystanie z systemu zarz¹dzania bazami danych MySQL
• £¹czenie PHP z systemem MySQL
• U¿ycie sesji
• Zabezpieczanie stron internetowych przed dostêpem nieuprawnionych osób
• Przyk³adowe aplikacje: rejestracja u¿ytkowników i sklep internetowy
Tre�æ ksi¹¿ki uzupe³niaj¹ dodatki opisuj¹ce sposób instalacji omawianych w niej
narzêdzi oraz dodatkowe, przydatne aplikacje.
Je�li chcesz w szybko nauczyæ siê programowania dynamicznych serwisów
internetowych, ta ksi¹¿ka bêdzie Twoim intensywnym kursem. Ju¿ po przeczytaniu
kilku rozdzia³ów bêdziesz w stanie pisaæ pierwsze programy w PHP korzystaj¹ce z bazy
MySQL, a po przeczytaniu ca³ej ksi¹¿ki poradzisz sobie równie¿ z tworzeniem bardziej
rozbudowanych aplikacji.
Spis treści
5
Spis tre
ści
Wprowadzenie 9
Czym są dynamiczne strony WWW?........................................................10
Czym jest PHP?.........................................................................................11
Co to jest MySQL?....................................................................................14
Co będzie Ci potrzebne .............................................................................16
O tej książce ..............................................................................................16
Rozdział 1. Wprowadzenie do PHP 19
Podstawy składni.......................................................................................20
Przesyłanie danych do przeglądarki internetowej .....................................23
PHP, HTML i „białe odstępy” ..................................................................26
Wstawianie komentarzy ............................................................................31
Co to są zmienne? .....................................................................................34
Łańcuchy ...................................................................................................37
Liczby........................................................................................................41
Stałe...........................................................................................................45
Apostrof kontra cudzysłów .......................................................................48
Rozdział 2. Programowanie w PHP 51
Tworzenie formularza w języku HTML ..................................................52
Obsługa formularza HTML.......................................................................56
Zarządzanie opcją Magic Quotes ................................................................59
Wyrażenia warunkowe i operatory............................................................61
Weryfikacja danych pochodzących z formularza......................................65
Ręczne przesyłanie wartości do skryptu ...................................................69
Co to są tablice? ........................................................................................74
Pętle for i while .........................................................................................92
Spis treści
Spis treści
6
Spis treści
Rozdział 3. Tworzenie dynamicznych stron WWW 95
Wykorzystywanie plików zewnętrznych...................................................96
Tworzenie i wywoływanie własnych funkcji ..........................................105
Zasięg zmiennej.......................................................................................115
Wyświetlanie i obsługa formularza przez jeden skrypt.............................118
Wysyłanie poczty elektronicznej...............................................................122
Nagłówki HTTP ......................................................................................125
Tworzenie formularzy z pamięcią ...........................................................130
Funkcje daty i czasu ................................................................................133
Rozdział 4. Wprowadzenie do SQL i MySQL 137
Projektowanie tabel .................................................................................138
Korzystanie z monitora mysqla...............................................................142
Tworzenie baz danych i tabel..................................................................146
Wprowadzanie rekordów ........................................................................149
Wybieranie danych..................................................................................152
Wyrażenia warunkowe............................................................................154
Stosowanie LIKE i NOT LIKE ..............................................................158
Sortowanie wyników zapytania .................................................................160
Ograniczanie wyników zapytania ...........................................................163
Uaktualnianie danych..............................................................................165
Usuwanie danych ....................................................................................167
Rozdział 5. Zaawansowany SQL i MySQL 169
Projekt bazy danych ................................................................................170
Złączenia .................................................................................................185
Funkcje ....................................................................................................189
Indeksy ....................................................................................................201
Rozdział 6. PHP i MySQL 205
Tworzenie szablonu.................................................................................206
Łączenie się z MySQL-em i wybieranie bazy.........................................211
Obsługa błędów.......................................................................................215
Wykonywanie prostych zapytań................................................................218
Odczytywanie wyników zapytania..........................................................228
Bezpieczeństwo.......................................................................................232
Korzystanie z funkcji mysql_num_rows() ..............................................238
Uaktualnianie rekordów w PHP................................................................244
Spis treści
7
Spis tre
ści
Rozdział 7. Sesje i „ciasteczka” 251
Posługiwanie się ciasteczkami ................................................................252
Sesje ........................................................................................................271
Sesje a „ciasteczka”.................................................................................287
Rozdział 8. Zabezpieczenia 295
Autoryzacja HTTP ..................................................................................296
Walidacja formularza przy użyciu skryptu JavaScript .............................302
Wyrażenia regularne ...............................................................................309
Zabezpieczenia bazy danych ...................................................................321
Rozdział 9. Tworzenie aplikacji internetowych 325
Metody debugowania kodu źródłowego skryptu PHP ............................326
Metody debugowania zapytań SQL i serwera MySQL...........................329
Obsługa błędów w języku PHP.................................................................335
Obsługa błędów serwera MySQL..............................................................339
Zwiększanie wydajności aplikacji internetowych ...................................342
Rozdział 10. Zagadnienia dodatkowe 347
Buforowanie wyjścia...............................................................................348
Buforowanie stron HTML.......................................................................355
Określanie typu przeglądarki internetowej.............................................357
Skrypty PHP i JavaScript ........................................................................361
Zastosowanie pakietu PEAR...................................................................369
Rozdział 11. Zarządzanie zawartością strony — przykład 377
Tworzenie szablonu.................................................................................378
Tworzenie zwykłych stron internetowych ..............................................383
Zarządzanie adresami URL.....................................................................385
Zarządzanie plikami ................................................................................402
Rozdział 12. Rejestrowanie użytkowników — przykład 417
Tworzenie szablonów..............................................................................418
Tworzenie skryptów konfiguracyjnych...................................................422
Tworzenie strony głównej .......................................................................428
Rejestracja ...............................................................................................430
Logowanie i wylogowywanie się ..............................................................440
Zarządzanie hasłami ................................................................................446
Część administracyjna aplikacji ..............................................................457
Spis treści
8
Spis treści
Rozdział 13. Sklep internetowy — przykład 473
Tworzenie bazy danych...........................................................................474
Część administracyjna aplikacji ..............................................................478
Tworzenie szablonu części publicznej aplikacji......................................491
Katalog produktów..................................................................................495
Koszyk zakupów .....................................................................................504
Dodatek A Instalacja 515
Instalacja pod systemem Windows............................................................516
Definiowanie uprawnień serwera MySQL..............................................522
Sprawdzanie poprawności instalacji ......................................................528
Dodatek B Aplikacje dodatkowe 531
Narzędzie phpMyAdmin .........................................................................532
Systemy szablonów.................................................................................533
Oprogramowanie obsługujące fora dyskusyjne.......................................534
Zarządzanie zawartością..........................................................................535
Handel elektroniczny...............................................................................536
Wyszukiwarki..........................................................................................537
Biblioteki kodów źródłowych .................................................................538
Dodatek C Odsyłacz 539
Język PHP ...............................................................................................540
Serwer MySQL .......................................................................................547
Dodatek D Zasoby internetowe 553
Język PHP ...............................................................................................554
Serwer MySQL .......................................................................................557
Język SQL ...............................................................................................559
Zabezpieczenia ........................................................................................560
Inne strony internetowe...........................................................................561
Skorowidz 565
Zarządzanie zawartością strony — przykład
377
Rozdział 11. Zarządzanie zawartością strony — przykład
Pierwszy przykład aplikacji zamieszczony w niniejszej
książce będzie dotyczył zarządzania zawartością strony.
Aplikacja będzie zarządzała zarówno adresami URL,
jak i plikami, które użytkownicy będą mogli dodawać,
wyświetlać i przetwarzać. Co prawda w tym przypadku
nie zostanie uwzględniona administracyjna część aplikacji,
ale zostaną dołączone informacje pozwalające na jej
wykonanie.
Chociaż w tym rozdziale skupimy się na konkretnym
przykładzie, to jednak wspomnimy również o kilku
nowych funkcjach i metodach. Do funkcji tych należy
zaliczyć ������������� � i ���� �. Wspomnimy także,
w jaki sposób zrealizować operację umieszczania plików
na serwerze.
Zarządzanie zawartościąstrony — przykład
Zarzą
dza
nie za
warto
ścią stro
ny
Rozdział 11.
378
Tworzenie szablonu
W pierwszym etapie projektowania aplikacji
zostanie utworzony systemowy szablon,
którego zadaniem będzie wspomaganie procesu
przygotowywania strony HTML. Strona
w ostatecznej postaci (rysunek 11.1)
będzie korzystała z tabel i kilku arkuszy
stylów CSS (ang. Cascading Style Sheets).
Aby utworzyć plik naglowek.html,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nową stronę
HTML (listing 11.1).
���������� ������������������������������� !"�"# ����$�����%&��'''�'��#�(��)�*�����)��+�� ���*�����*,������+�� ������ !"�"# ���-�-�.��� �+ � !/����%&��'''�'��#�(��000�+�� ���+ �&�� (/�1 ��� (/�1 �.��1�-.� 1�����%�123"4/�5# �1 ���6%1�5# �1 �/���1+���� �75���!1�/"!#�8890�*��.��"��1.�:%�%15�#;%�(1<�"��17:.���"��1.
1. Napisać kod arkusza stylów CSS.
�!�6�1�6%1/��1+��5!!� 1-"�/�!5�11 �.=#-6>=�5?(�#3 -�5#�#�&@AAAAAA7B
�5# �1 �>=�5?(�#3 -�5#�#�&@A9A9A97%�--" (��#%&��%+7%�--" (��"(��&��%+7�%�--" (�=#��# &��%+7%�--" (��1A�&��%+7� ��(" ��#%&��%+7 ��(" ��"(��&��%+7� ��(" �=#��# &��%+7 ��(" ��1A�&��%+7B
Rysunek 11.1. Domyślny wygląd strony
aplikacji omawianej w tym rozdziale
Tworzenie sza
blonu
Zarządzanie zawartością strony — przykład
379
Listing 11.1. Plik naglowek.html rozpoczyna się od kodu formatującego stronę HTML i zawiera wymagany
kod arkusza stylów CSS
����������� ������������������������������ !"�"# ����$�*����%&��'''�'��#�(��)�*����)��+�� ���*�����*,�����+�� ������ !"�"# ���-�-�.���� �+ � !/����%&��'''�'��#�(��000�+�� ��+ �&�� (/�1 ��� (/�1 �.C��1�-.9� 1�����%�123"4/�5# �1 ���6%1�5# �1 �/��1+���� �75���!1�/"!#�8890�*��.,��"��1.�:%�%15�#;%�(1<�"��17:.���"��1.D�!�6�1�6%1/��1+��5!!� 1-"�/�!5�11 �.8=#-6>=�5?(�#3 -�5#�#�&@AAAAAA7B0�5# �1 �>��=�5?(�#3 -�5#�#�&@A9A9A97��%�--" (��#%&��%+7%�--" (��"(��&��%+7%�--" (�=#��# &��%+7%�--" (��1A�&��%+7�* ��(" ��#%&��%+7 ��(" ��"(��&��%+7 ��(" �=#��# &��%+7 ��(" ��1A�&��%+7��B�C�� �4�" ?&�" ?>5#�#�&@����,,7�1+��-15#���"# & # 17B�9�� �4�" ?&4"!"�1->5#�#�&@����,,7�1+��-15#���"# & # 17B�,�� �4�" ?&�#41�>5#�#�&@5555557�1+��-15#���"# & # 17B�D�->�8A# ��A� "�6&E1�-� �FG�"��F�1�41�"5�F!� !�!1�"A7A# ��!"H1&��%+7�041��"5�����"( &�#%7*�B*���"��1>**A# ��!"H1&*C%+7A# ��'1"(��& #� ��75#�#�&@AAAAAA7*� ��(" ��#%&9%+7 ��(" �=#��# &9%+7 ��(" ��1A�&*�%+7*C%�--" (��#%&9%+7%�--" (�=#��# &9%+7%�--" (��1A�&*�%+7*9B*,��!�6�1.*D���1�-.*8�=#-6.*0�����=�1'"-��/�0�I�=#�-1�/���51��!%�5" (/����51��%�--" (/�����"( /�51 �1��.�����.�*��-5#�!%� /�*�=(5#�#�/�@����,,�.�%5��!!/��"��1�.J��HK-H� "1H�'���#L5"K!��# ��%.���-.������.�C���.�9��-4��"( /��#%� #'��%/� #'��%�.�,�=.����1A/�" -1+�%�%�5��!!/� �4�" ?�.M��# �(NO' ����.�=��.�D����1A/�4"1'<3��!�%�%�5��!!/� �4�" ?�.��H1(�K-�P�-�1!6�)����.�=��.�8����1A/��--<3���%�%�5��!!/� �4�" ?�.�#-�P�-�1!�)����.�=��.�0����1A/�4"1'<A"�1!�%�%�5��!!/� �4�" ?�.��H1(�K-�P%�"?"���.�=��.C�����1A/��--<A"�1�%�%�5��!!/� �4�" ?�.�#-�P%�"?���.��=.C����-.C*C���-4��"( /��#%�5��!!/�5# �1 ��.CC�����"!�" (����� �(�#'1?��� ���.
Tworze
nie sza
blonu
Rozdział 11.
380
�� �4�" ?&�" ?>5#�#�&@����,,7��1+��-15#���"# & # 17B�� �4�" ?&4"!"�1->5#�#�&@����,,7��1+��-15#���"# & # 17B�� �4�" ?&�#41�>5#�#�&@5555557��1+��-15#���"# & # 17B�->A# ��A� "�6&E1�-� �FG�"��F�1�41�"5�F�!� !�!1�"A7A# ��!"H1&��%+741��"5�����"( &�#%7B��"��1>A# ��!"H1&*C%+7A# ��'1"(��&� #� ��75#�#�&@AAAAAA7 ��(" ��#%&9%+7 ��(" �=#��# &9%+7� ��(" ��1A�&*�%+7%�--" (��#%&9%+7%�--" (�=#��# &9%+7�%�--" (��1A�&*�%+7B��!�6�1.
W przypadku omawianej aplikacji zostanie
wykorzystany arkusz stylów CSS, który
posłuży do sformatowania tekstu. Ze względu
na niewielką objętość kodu arkusza stylów
CSS, zamiast w oddzielnym pliku zostanie
on umieszczony bezpośrednio w sekcji ����
strony HTML.
3. Zakończyć pisanie kodu nagłówka stronyHTML i utworzyć pierwszy wiersz tytułu.
���1�-.�=#-6.���=�1'"-��/�0�I�=#�-1�/����51��!%�5" (/����51��%�--" (/������"( /�51 �1��.���.��-5#�!%� /�*�=(5#�#�/�@����,,�.��%5��!!/��"��1�.J��HK-H� "1�H�'���#L5"K!��# ��%.���-.����.���.
Podstawowa strona HTML będzie zawierała
tabelę złożoną z trzech wierszy — tytułu,
wiersza przechowującego odnośniki
i zawartość strony oraz wiersza, w którym
będą umieszczone informacje o prawach
autorskich (rysunek 11.2).
Rysunek 11.2. Wygląd strony, na której w celu
wyróżnienia wierszy i kolumn tabeli zastosowano
obwódki
Tworzenie sza
blonu
Zarządzanie zawartością strony — przykład
381
Rysunek 11.3. Struktura aplikacji internetowej,
której katalogiem głównym jest katalog html
4. Utworzyć sekcję powiązaną z odnośnikamii rozpocząć definiowanie komórek
przechowujących zawartość strony.
��-4��"( /��#%� #'��%/� #'��%�.�=.����1A/�" -1+�%�%�5��!!/�� �4�" ?�.M��# �(NO' ����.�=��.����1A/�4"1'<3��!�%�%��5��!!/� �4�" ?�.��H1(�K-�P�-�1!6��)����.�=��.����1A/��--<3���%�%�5��!!/�� �4�" ?�.��#-�P�-�1!�)����.�=��.����1A/�4"1'<A"�1!�%�%�5��!!/�� �4�" ?�.��H1(�K-�P%�"?"���.�=��.����1A/��--<A"�1�%�%��5��!!/� �4�" ?�.�#-�P%�"?���.��=.���-.��-4��"( /��#%�5��!!/�5# �1 ��.�����"!�" (����� �(�#'1?��� ���.
5. Zapisać plik pod nazwą naglowek.html
i umieścić go na serwerze WWW
(w katalogu includes).
Na rysunku 11.3 przedstawiono strukturę
katalogów zawierających pliki aplikacji.
Wskazówka
� W przykładzie zamieszczonym w następnym
przykładzie zostanie zastosowany bardziej
złożony arkusz stylów CSS, który będzie
zapisany w oddzielnym pliku dołączonym
do pliku naglowek.html.
Tworze
nie sza
blonu
Rozdział 11.
382
Aby utworzyć plik stopka.html,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nową stronę
HTML (listing 11.2).
�����"!�" (���*�!�#%?���� ���.
2. Zakończyć kod środkowego wiersza tabeli.
���-.����.
Cała zawartość strony będzie przechowywana
w środkowym wierszu tabeli, którego
definicja zaczyna się w pliku naglowek.html.
Powyższy kod kończy definicję wiersza,
po którym zostanie umieszczony trzeci
i ostatni wiersz.
3. Zdefiniować ostatni wiersz i zakończyćtworzenie strony HTML.
���.��-.Q =!%7���-.��-��"( /�51 �1��.Q5#%67*�������6����� � � -���� !"(��!F� 5����-.����.����=�1.��=#-6.���� �.
4. Zapisać plik pod nazwą stopka.html
i umieścić go na serwerze WWW
(w katalogu includes).
Listing 11.2. Plik stopka.html zawiera pozostałe
definicje wyglądu strony HTML
������"!�" (���*�!�#%?���� ���.*����R# "15H�'���#L5"!��# 6��.����-.C����.9,���.D��-.Q =!%7���-.8��-��"( /�51 �1��.Q5#%67*�������6���� � � -���� !"(��!F� 5����-.0����.��������=�1.�*��=#-6.������ �.
Tworzenie sza
blonu
Zarządzanie zawartością strony — przykład
383
Listing 11.3. Główna strona aplikacji
(w razie potrzeby należy umieścić na niej
bardziej wartościowe informacje)
��:%�%@�"!�" (�����" -1+�%�%*��SNO' �!��# �!1�'1����������!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?������C;%�(1<�"��1/TJ��HK-H� "1H�'���#L5"K!��# T79" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7,:.D�%.M%� !%� !%� !%� !%� !%� !%� !%� !%� !%� ���%.8�%.M%� !%� !%� !%� !%� !%� !%� !%� !%� !%� ���%.0�:%�%���#NK5H1 "1!�#%?"�������" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7��:.
Rysunek 11.4. Główna strona
Tworzenie zwykłychstron internetowych
Zanim zajmiemy się najważniejszą częścią
aplikacji internetowej (samym mechanizmem
zarządzania zawartością stron) konieczne będzie
stworzenie jeszcze dwóch stron HTML. Jedna
z nich o nazwie index.php będzie spełniała rolę
głównej strony aplikacji. Z kolei druga o nazwie
mysql_connect.php jest skryptem, którego
zadaniem jest połączenie z serwerem MySQL
i wybranie wymaganej bazy danych (w celu
uzyskania dodatkowych informacji na jej temat
należy zapoznać się z zawartością ramki Schemat
bazy danych zawartej w następnym podrozdziale).
Aby utworzyć główną stronę,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.3).
�:%�%@�"!�" (�����" -1+�%�%
2. Określić tytuł strony i dołączyć pliknagłówka HTML.
;%�(1<�"��1/TJ��HK-H� "1H�'���#L5"K�!��# T7" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7:.
3. Wypełnić stronę tekstem.
�%.M%� !%� !%� !%� !%� !%� !%� �!%� !%� !%� ���%.�%.M%� !%� !%� !%� !%� !%� !%� �!%� !%� !%� ���%.
Co prawda posłużyłem się tego typu treścią
(słowo ����), ale oczywiście na stronie
głównej można umieścić bardziej wartościowe
informacje.
4. Dołączyć stopkę HTML.
�:%�%" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7:.
5. Zapisać plik pod nazwą index.php, umieścić gona serwerze WWW i przetestować przy użyciu
przeglądarki internetowej (rysunek 11.4).
Tworze
nie zw
ykłych stro
n in
ternetowych
Rozdział 11.
384
Listing 11.4. Skrypt łączy z serwerem MySQL
i wybiera bazę danych content
��:%�%@�"!�" (���C� 6!2�<5# 15��%�%*���%�"?3H�'���#%��� 1��6'6 �(� 1-#3H6!?� "�-#!�W%3-#=�H6-� 65����"?P1!�3X6'� 6��?X1%�H6NK5H1 "3!"WH!1�'1�1 �6MY�"'6="1�� "1 =�H6-� 65��C���!��'"1 "1P�?#!��N65�%��� 1��O'3-H"1��PK565�-#!�W%3-#=�H6-� 65��9-1A" 1UT��<�M)TFT3!1� � 1TV7,-1A" 1UT��<�GMM��)�TFT%�!!'#�-TV7D-1A" 1UT��<��M�TFT�#5���#!�TV78-1A" 1UT��<$G�TFT5# �1 �TV70��$�'"KH� "1%#NK5H1 "�H!1�'1�1 "'6=�� "1=�H6-� 65����;-=5/Z 6!2�<5# 15�U��<��M�F��<�M)F��<�GMM��)�V�)-"1UT$"1=6N# #X�"'1%#NK5H1 "1H!1�'1�1 �6MY�&T� 6!2�<1��#�UVV7�� 6!2�<!1�15�<-=U��<$G�V�)-"1UT$"1=6N# #X�"'1'6=�� "1=�H6-� 65�&T� 6!2�<1��#�UVV7�*:.
Aby utworzyć skryptmysql_connect.php,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.4).
�:%�%@�"!�" (���C� 6!2�<5# 15��%�%
Skrypt jest taki sam jak jego poprzednie wersje
wykorzystane w poprzednich rozdziałach
(z wyjątkiem nazwy użytkownika i jego hasła
oraz konfiguracji bazy danych). Skrypt może
zostać stworzony od podstaw lub poprzez
odpowiednią modyfikację poprzedniej wersji.
2. Określić konfigurację bazy danych w postacistałych.
-1A" 1UT��<�M)TFT3!1� � 1TV7-1A" 1UT��<�GMM��)�TFT%�!!'#�-TV7-1A" 1UT��<��M�TFT�#5���#!�TV7-1A" 1UT��<$G�TFT5# �1 �TV7
Mając na względzie kwestię zabezpieczeń
użytkownik łączący się z serwerem MySQL
powinien na potrzeby omawianej aplikacji
dysponować możliwością wykonywania tylko
takich poleceń jak ������, ������, ������
i dodatkowo wyłącznie dla bazy danych
content.
3. Połączyć się z serwerem MySQL i wybraćbazę danych.
;-=5/Z 6!2�<5# 15�U��<��M�F��<�M)F���<�GMM��)�V�)-"1UT$"1=6N# #X�"'1�%#NK5H1 "1H!1�'1�1 �6MY�&T�� 6!2�<1��#�UVV7 6!2�<!1�15�<-=U��<$G�V�)-"1�UT$"1=6N# #X�"'1'6=�� "1=�H6-� 65�&T��� 6!2�<1��#�UVV7
Aplikacja dysponuje podstawowymmechanizmem obsługi błędów realizowanymprzez funkcję ������� �. Więcejinformacji na ten temat zawarto w rozdziale 6.
4. Zakończyć skrypt PHP.
:.
5. Zapisać plik pod nazwą mysql_connect.php
i umieścić go na serwerze WWW poza
katalogiem głównym (rysunek 11.3).
Wskazówki
� W następnym rozdziale zostanie omówiony
przykład, w którym zostaną wykorzystane
bardziej zaawansowane metody obsługi
błędów. Poza tym zamieszczono w nim
zmodyfikowaną wersję skryptu
mysql_connect.php.
� W celu uzyskania dodatkowych informacji
na temat praw dostępu do serwera MySQL
należy zapoznać się z zawartością dodatku A.
Tworzenie zwykłych stron internetowych
Zarządzanie zawartością strony — przykład
385
Zarządzanie adresami URL
Kolejne dwie strony HTML, które zostaną
stworzone, umożliwią użytkownikom dodawanie
adresów URL i przeglądanie już dołączonych.
Ta część aplikacji bazuje na trzech tabelach
bazy danych — ���, ������� i ��������.
Aby uzyskać dodatkowe informacje, należy
zapoznać się z zawartością ramki Schemat
bazy danych.
Dodawanie adresów URL
Skrypt add_url.php prawdopodobnie jest
najbardziej złożonym wśród wszystkich
wchodzących w skład aplikacji. Wynika to
z zastosowania znormalizowanej struktury
bazy danych. Formularz zawarty w skrypcie
pobiera adres URL, jego tytuł (lub nazwę), opis
i maksymalnie trzy kategorie. Po wypełnieniu
formularza (adres URL, jego tytuł, opis) dane
zostaną umieszczone w tabeli ��������.
Następnie w celu dodania do tabeli ���
od jednego do trzech rekordów (w zależności
od ilości kategorii wybranych przez użytkownika)
zostanie zastosowany klucz główny tabeli
������� wraz z wartościami pola ������.
W celu określenia wartości pola ������� dla
dodanego adresu URL zostanie wykorzystana
funkcja ������������� �, która do tej pory
nie była omawiana. Każdorazowo, gdy na tabeli
zawierającej pole o automatycznie zwiększanej
wartości (zazwyczaj jest nim klucz główny)
zostanie wykonane zapytanie, wtedy dla pola
serwer MySQL użyje następnej wartości.
Funkcja ������������� � zwróci tę wartość.
W przeciwnym razie nie byłoby możliwe jej
uzyskanie.
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
386
Schemat bazy danych
W niniejszym rozdziale zastosowano bazę danych o nazwie content, którą utworzonow rozdziale 5. W tamtym rozdziale zdefiniowano trzy znormalizowane tabele na potrzebyobsługi adresów URL (złożona struktura pozwala na zaklasyfikowanie adresów URL
do wielu typów). W tym rozdziale zostanie stworzona tabela ������� wykorzystywanaprzy zarządzaniu plikami. Całkowita struktura bazy danych może zostać ponowniezdefiniowana z wykorzystaniem poniższych poleceń:
�)G��G��3%�#�-!U3%�#�-<"-" �U��V�$M�S$�$��$���G���<�$�)�$�F�A"�1< � 1EG)��G)U��V$��$���FA"�1<!"H1�$�U,V�$M�S$�$��$���FA"�1<�6%1�EG)��G)U��V$��$���F-1!5�"%�"# EG)��G)U���V�[G���$���F3%�#�-<-��1��G����$��$���F�)��G)�R�U3%�#�-<"-VFR�A"�1< � 1UA"�1< � 1VV7�)G��G��3��<�"��1!U�"��1<"-M�G���$�UCV�$M�S$�$��$���G���<�$�)�$�F�3��EG)��G)U,�V$��$���F�"��1EG)��G)U,�V$��$���F-1!5�"%�"# ��$����$���$���F�)��G)�R�U�"��1<"-VF�$�Y�R�3��U3��VV7�)G��G��3��<�6%1!U�6%1<"-��$��$�U�V�$M�S$�$��$���G���<�$�)�$�F��6%1EG)��G)U*�V$��$���F�)��G)�R�U�6%1<"-VF�$�Y�R��6%1U�6%1VV7�)G��G��3��!U3��<"-M�G���$�UCV�$M�S$�$��$���G���<�$�)�$�F��"��1<"-M�G���$�UCV�$M�S$�$��$���F�6%1<"-��$��$�U�V�$M�S$�$��$���F��%%�#41-��G)U�V�[G���T$TF-��1<!3= "��1-���M�G��U�CV$��$���F�)��G)��R�U3��<"-VFR��"��1<"-U�"��1<"-VFR��6%1<"-U�6%1<"-VFR��-��1<!3= "��1-U-��1<!3= "��1-VV7
W celu sprawdzenia struktury bazy danych zawsze można użyć poniższych poleceń języka SQL(rysunek 11.5).
M����G��M7�M�)��nazwa_tabeli7
Rysunek 11.5. Sprawdzenie struktury bazy danych
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
387
Aby utworzyć skrypt add_url.php,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt
PHP (listing 11.5).
�:%�%@�"!�" (���9��--<3���%�%;%�(1<�"��1/T�#-�'� "1�-�1!O'�)�T7" 5�3-1UT" 5�3-1!� �(�#'1?��� �TV7�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7
2. Sprawdzić, czy formularz został wypełnionyi zastosować funkcję ��������� �.
"AU"!!1�U;<��M�\T!3= "�T]VV>����=!N3(�A#� 3���H��A3 5�"# 1!5�%1<-���U;-���V>(�#=��;-=57"AU" "<(1�UT �("5<23#�1!<(%5TVV>;-���/!��"%!��!�1!U;-���V7B�1�3� 6!2�<�1��<1!5�%1<!��" (�U��" U;-���VF;-=5V7B
Podobnie jak w poprzednich rozdziałach,
funkcja ��������� � gwarantuje poprawność
przesyłanych danych niezależnie od tego, czy
uaktywniono funkcję Magic Quotes, czy nie.
3. Przeprowadzić walidację wprowadzonegoadresu URL i jego tytułu.
"AU�1 %�6U;<��M�\T3��T]VV>;3/1!5�%1<-���U;<��M�\T3��T]V7B1�!1>;3/[G�M715�#T�%.�A# �5#�#�/��1-�.��#!HW%#-�^��-�1!�)����A# �.��%.T7B"AU�1 %�6U;<��M�\T�"��1T]VV>;�/1!5�%1<-���U;<��M�\T�"��1T]V7B1�!1>;�/[G�M715�#T�%.�A# �5#�#�/��1-�.���#!HW%#-�^ �H'W�-�1!3��)���"��1���A# �.��%.T7B
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych
��:%�%@�"!�" (���9��--<3���%�%*��M��# �%#H'���3X6�?#' "?# -#-�^�-�1!6�)�-#=�H6-� 65������!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?������C;%�(1<�"��1/T�#-�'� "1�-�1!O'�)�T79" 5�3-1UT" 5�3-1!� �(�#'1?��� �TV7,�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7���#NK5H1 "1H=�HK-� 65��D"AU"!!1�U;<��M�\T!3= "�T]VV>���=!N3(�A#� 3���H��8��[3 ?5P�3!3'�PK5�H �?T�T"#=5" �PK5�-� 1'%�#'�-H# 1'A#� 3���H3�0A3 5�"# 1!5�%1<-���U;-���V>��(�#=��;-=57��"AU" "<(1�UT �("5<23#�1!<(%5TVV>�*;-���/!��"%!��!�1!U;-���V7��B�C�1�3� 6!2�<�1��<1!5�%1<!��" (U��" U;-���VF;-=5V7�9B��R# "15!1?5P"A3 ?5P"1!5�%1<-���UV�
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
388
W tym przykładzie zostanie dokonane
sprawdzenie, czy wprowadzono wartości.
W celu zwiększenia dokładności można
oczywiście zastosować wyrażenia proste
(tak naprawdę w rozdziale 8. zawarto skrypt
przeprowadzający walidację adresów URL).
Jeśli jakieś pole nie zostanie wypełnione,
pojawi się komunikat błędu widoczny
na rysunku 11.6.
4. Sprawdzić, czy w polu ���������podano wartość.
"AU�1 %�6U;<��M�\T-1!5�"%�"# T]VV>;-/1!5�%1<-����U;<��M�\T-1!5�"%�"# T]V7B1�!1>;-/TT7B
Ze względu na to, że w polu ���������
tabeli �������� nie trzeba wstawiać wartości,
będzie ona przetwarzana, ale tylko wtedy,
gdy zostanie wprowadzona w formularzu.
Jeśli w polu ��������� nie zostanie
wstawiona żadna wartość, zmiennej ��
stosowanej w zapytaniu będzie przypisywany
pusty łańcuch.
Rysunek 11.6. Jeśli użytkownik nie poda adresu
URL lub jego tytułu, zostanie wyświetlony
komunikat błędu
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
�,��M%��'-H1 "1�-�1!3�)���D"AU�1 %�6U;<��M�\T3��T]VV>�8;3/1!5�%1<-���U;<��M�\T3��T]V7�0B1�!1>*�;3/[G�M7*�15�#T�%.�A# �5#�#�/��1-�.��#!HW%#-�^�-�1!�)����A# �.��%.T7B**��M%��'-H1 "1 �H'6�-�1!3�)��*�"AU�1 %�6U;<��M�\T�"��1T]VV>*C;�/1!5�%1<-���U;<��M�\T�"��1T]V7*9B1�!1>*,;�/[G�M7*D15�#T�%.�A# �5#�#�/��1-�.��#!HW%#-�^ �H'W�-�1!3�)���"��1���A# �.��%.T7B*8��M%��'-H1 "1'���#L5"%#��-1!5�"%�"# U "1P1!�'6 �(� 1V�*0"AU�1 %�6U;<��M�\T-1!5�"%�"# T]VV>��;-/1!5�%1<-���U;<��M�\T-1!5�"%�"# T]V7��B1�!1>
;-/TT7B
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
389
Rysunek 11.7. Użytkownik musi wybrać co najmniej
jedną kategorię dla wprowadzonego adresu URL
5. Sprawdzić wybraną kategorię.
"AUU;<��M�\T�6%1�T].�V�)�U;<��M�\T�6%1*T].�V�)�U;<��M�\T�6%1�T]V.�V>;�6%1/�)�7B1�!1>;�6%1/[G�M715�#T�%.�A# �5#�#�/��1-�.���#!HW%#-�^5# �P "1PP1- K�?��1(#�"W���A# �.��%.T7B
Użytkownik, mając do dyspozycji zbiór
typów zawartych w tabeli �������, może
przypisać wprowadzanemu adresowi URL
maksymalnie trzy kategorie. Zakłada się,
że użytkownik wybierze kategorię przy
użyciu pierwszego menu rozwijanego
(��� ). Niezależnie od tego instrukcja
warunkowa sprawdzi, czy skorzystano
z przynajmniej jednego menu rozwijanego.
Jeśli tak nie będzie, zostanie wyświetlony
komunikat błędu (rysunek 11.7).
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
�*��M%��'-H1 "1?��1(#�""���"AUU;<��M�\T�6%1�T].�V�)U;<��M�\T�6%1*T].�V�)U;<��M�\T�6%1�T]V.�V>�C;�6%1/�)�7�9B1�!1>�,;�6%1/[G�M7�D15�#T�%.�A# �5#�#�/��1-�.��#!HW%#-�^5# �P "1PP1- K?��1(#�"W���A# �.��%.T7B�8"AU;3QQ;�QQ;�6%1V>��_1L�"'!H6!�?#P1!�'%#�HK-?3��0���#-�'� "1�-�1!3�)�-#��=1�"3��<�"��1!�C�;231�6/��$M)��$��3��<�"��1!U3��F�"��1F-1!5�"%�"# VEG��MUT;3TFT;�TFT;-TV�7C�;�1!3��/Z 6!2�<231�6U;231�6V7���6?# � "1H�%6�� "��C*;�"-/Z 6!2�<" !1��<"-UV7���#=�� "1"-1 �6A"?��#���6�3N3�C�CC"AU;�"-.�V>��_1L�"H#!��N#'6?# � 1%��'"-N#'#�C9���'#�H1 "1H�%6�� "��C,;231�6/T�$M)��$��3��!U�"��1<"-F�6%1<"-F�%%�#41-F-��1<!3= "��1-VEG��MT7CD"AU;<��M�\T�6%1�T].�V>C8;231�6�/�U;�"-F>;<��M�\T�6%1�T]BFT�TF$��UVVF�7B
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
390
6. Dodać adres URL do tabeli ��������.
"AU;3QQ;�QQ;�6%1V>���#-�'� "1�-�1!3�)�-#��=1�"�3��<�"��1!�;231�6/��$M)��$��3��<�"��1!U3��F��"��1F-1!5�"%�"# VEG��MUT;3TF�T;�TFT;-TV�7;�1!3��/Z 6!2�<231�6U;231�6V7;�"-/Z 6!2�<" !1��<"-UV7
Ze względu na strukturę bazy danych, adres
URL musi zostać dodany do tabeli ��������
zanim będzie możliwa modyfikacja tabeli
���. Powyższe zapytanie doda adres URL,
a następnie przy użyciu funkcji �����
�������� � zwróci wartość pola �������
(klucz główny tabeli o automatycznie
zwiększanej wartości). Uzyskana wartość
może następnie zostać wykorzystana
w drugim zapytaniu (krok 7.).
7. Utworzyć główne zapytanie.
"AU;�"-.�V>
;231�6/T�$M)��$��3��!�U�"��1<"-F�6%1<"-F�%%�#41-F�-��1<!3= "��1-VEG��MT7"AU;<��M�\T�6%1�T].�V>;231�6�/�U;�"-F�>;<��M�\T�6%1�T]BFT�TF�$��UVVF�7B"AU;<��M�\T�6%1*T].�V>;231�6�/�U;�"-F>;<��M��\T�6%1*T]BFT�TF$��UVVF�7B"AU;<��M�\T�6%1�T].�V>;231�6�/�U;�"-F�>;<��M�\T�6%1�T]BFT�TF�$��UVVF�7B;231�6/!3=!��U;231�6F�F�*V7
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
C0"AU;<��M�\T�6%1*T].�V>9�;231�6�/�U;�"-F>;<��M�\T�6%1*T]BFT�TF$��UVVF�7B9�"AU;<��M�\T�6%1�T].�V>9*;231�6�/�U;�"-F>;<��M�\T�6%1�T]BFT�TF$��UVVF�79�B9C;231�6/!3=!��U;231�6F�F�*V7���!3 "W5"1#!��� "1(#%�H15" ?�"!%�5P"�99���6?# � "1H�%6�� "��9,;�1!3��/Z 6!2�<231�6U;231�6V79D"AU;�1!3��V>9815�#T�%.�=.�H"W?3P1 6H�%�H1!N� "1-� 65����=.��%.T790;<��M�/����6UV7,�B1�!1>��_1L�"'6!�K%"K%�#=�1 6�,�15�#T�%.�A# �5#�#�/��1-�.$�!?3�1?=NW-3!6!�1 #'1(#'6!N� 1H�%6�� "1 "1 #(N#H#!��^%�H1�'#�H# 1���H1%��!H� 6H�H�"!� "�NK "1-#(#- #L^���A# �.��%.T7,*B,�B1�!1>��_1L�"'6!�K%"K%�#=�1 6�,C15�#T�%.�A# �5#�#�/��1-�.$�!?3�1?=NW-3!6!�1 #'1(#'6!N� 1H�%6�� "1 "1 #(N#H#!��^%�H1�'#�H# 1���H1%��!H� 6H�H�"!� "�NK "1-#(#- #L^���A# �.��%.T7,9B
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
391
Jeśli zostanie pobrana wartość zmiennej ����,
bez obaw można przejść do wykonywania
głównego zapytania (dodanie rekordu do
tabeli ���). Aby tak postąpić, na początku
należy zdefiniować zapytanie i przypisać
jego początkową część zmiennej ����.
Po sprawdzeniu, czy wybrano kategorie
(przy użyciu menu rozwijanych), dla każdej
z nich dodano rekord przy użyciu zapytania.
Na końcu w celu usunięcia z zapytania
ostatnich dwóch znaków (przecinek i znak
spacji) zostanie użyta funkcja ��!�� �.
Jeśli wystąpią problemy ze składnią zapytania
należy nakazać interpreterowi języka PHP
wyświetlenie wartości zmiennej ����,
dzięki czemu można stwierdzić, co będzie
przetwarzane przez serwer MySQL.
8. Wykonać zapytanie, wprowadzić komunikaty
informujące o jego wyniku i uzupełnić
instrukcje warunkowe.
;�1!3��/Z 6!2�<231�6U;231�6V7"AU;�1!3��V>15�#T�%.�=.�H"W?3P1 6H��%�H1!N� "1-� 65����=.��%.T7B1�!1>��_1L�"'6!�K%"K%�#=�1 6�15�#T�%.�A# �5#�#�/��1-�.�$�!?3�1?=NW-3!6!�1 #'1(#�'6!N� 1H�%6�� "1 "1 #(N#�H#!��^%�H1�'#�H# 1����H1%��!H� 6H�H�"!� "�NK� "1-#(#- #L^���A# �.��%.T7B
Powyższe instrukcje warunkowe
wyświetlą odpowiednie komunikaty
związane z przesyłanymi danymi.
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
,,B1�!1>��_1L�"P1- �H#%1��5P"!%��'-H1 "�-� 65�!"W "1%#'"1-H"1�,D15�#T�%.�A# �5#�#�/��1-�.��#!HW!%�O=#'�^%# #' "1���A# �.��%.T7,8B,0B��R# "15" !��3?5P"'��3 ?#'1P#=!N3(3PK51P-� 1'%�#'�-H� 1'A#� 3���H3�D������������[#� 3���H'6L'"1���PK56-� 1���������D����'#�H1 "1 1 3�#H'"P� 1(#�D*;231�6/�M���`[)��3��<�6%1!�)�)���6%1GM��7D�;�1!3��/Z 6!2�<231�6U;231�6V7DC;%3��-#' /T�#%�"# .�6="1�HP1- K%#H65PW��#%�"# .T7D9'�"�1U;�#'/ 6!2�<A1�5�<����6U;�1!3��F��MY�<GMM��VV>D,;%3��-#' �/��#%�"# 4��31/a�>;�#'\T�6%1<"-T]Ba�.>;�#'\T�6%1T]B��#%�"# .a �7DDBD8:.D0�A#� �5�"# /��:%�%15�#;<M)E)\T���<M�[T]7:.� 1��#-/�%#!��.8��A"1�-!1�.��1(1 -.�51�3%�H1!N� "��-�1!3�)� ��1X6'6%1N "^A#� 3���HU #X �'6=��^ �?!6 �� "1�?��1(#�"1V&���1(1 -.8��%.�=.G-�1!�)�&��=.�" %3��6%1/��1+�� � 1/�3���!"H1/�,�� �+�1 (��/�,��4��31/��:%�%"AU"!!1�U;<��M�\T3��T]VV15�#;<��M�\T3��T]7:.��.�=�8*�.�! ���.$"1-#NK5H�P"-1 �6A"?��#���".���%&����".��! ���.��%.8�B1�!1>8C15�#T�%.�A# �5#�#�/��1-�.$�!?3�1?=NW-3!6!�1 #'1(#'6!N� 1H�%6�� "1 "1 #(N#H#!��^%�H1�'#�H# 1���H1%��!H� 6H�H�"!� "�NK "1-#(#- #L^���A# �.��%.T789B
8,B1�!1>8D15�#T�%.�A# �5#�#�/��1-�.��#!HW!%�O=#'�^%# #' "1���A# �.��%.T788B80B
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
392
9. Utworzyć stronę HTML, na której zostanąumieszczone menu rozwijane umożliwiające
wybranie typu adresów URL.
;231�6/�M���`[)��3��<�6%1!�)�)����6%1GM��7;�1!3��/Z 6!2�<231�6U;231�6V7;%3��-#' /T�#%�"# .�6="1�HP1- K�%#H65PW��#%�"# .T7'�"�1U;�#'/ 6!2�<A1�5�<����6U;�1!3��F���MY�<GMM��VV>;%3��-#' �/��#%�"# �4��31/a�>;�#'\T�6%1<"-T]Ba�.>;�#'�\T�6%1T]B��#%�"# .a �7B
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
0��%.�=.$�H'���6�3N�-�1!3�)�&��=.�" %3��6%1/��1+�� � 1/��"��1�!"H1/�,�� �+�1 (��/�,��4��31/��:%�%"AU"!!1�U;<��M�\T�"��1T]VV15�#;<��M�\T�"��1T]7:.��.��%.0�0*�%.�=.�%"!&��=.��1+���1� � 1/�-1!5�"%�"# �5#�!/�C���#'!/�9�.�:%�%"AU"!!1�U;<��M�\T-1!5�"%�"# T]VV15�#;<��M�\T-1!5�"%�"# T]7:.���1+���1�.��%.0�0C�%.�=.R��1(#�"��&��=.�!1�15� � 1/��6%1��.09�:%�%15�#;%3��-#' 7:.0,��!1�15�.��%.0D08�%.�=.R��1(#�"�*&��=.�!1�15� � 1/��6%1*�.00�:%�%15�#;%3��-#' 7:.�����!1�15�.��%.�����*�%.�=.R��1(#�"��&��=.�!1�15� � 1/��6%1��.����:%�%15�#;%3��-#' 7:.��C��!1�15�.��%.��9��,��A"1�-!1�.��D��8�-"4��"( /�51 �1��.�" %3��6%1/�!3= "�� � 1/�!3= "��4��31/��6L�"P��.��-"4.��0�����A#� .����R# "15A#� 3���H���.����:%�%��* 6!2�<5�#!1UV7��J� ? "W5"1%#NK5H1 "�H=�HK-� 65�����" 5�3-1UT" 5�3-1!�!�#%?���� �TV7���#NK5H1 "1!�#%?"�������C:.
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
393
Rysunek 11.8. Kod źródłowy strony HTML
dynamicznie generujący menu rozwijane
Formularz będzie zawierał trzy menu rozwijane,
z których każde będzie dysponowało listą
dostępnych typów adresów URL pobranych
z bazy danych. Ze względu na to, że zależy
mi na wyświetleniu trzech kopii tego typu
informacji, bardziej efektywnym będzie
przypisanie wyników zmiennej niż wielokrotne
wysyłanie zapytania do bazy danych.
Na rysunku 11.8 pokazano kod źródłowy
strony zawierającej menu rozwijane.
10. Utworzyć formularz na stronie HTML.
�A#� �5�"# /��:%�%15�#;<M)E)\T���<M�[T]7:.� 1��#-/�%#!��.�A"1�-!1�.��1(1 -.�51�3%�H1!N� "��-�1!3��)� ��1X6'6%1N "^A#� 3���HU #X ��'6=��^ �?!6 �� "1�?��1(#�"1V&���1(1 -.
�%.�=.G-�1!�)�&��=.�" %3��6%1/��1+��� � 1/�3���!"H1/�,�� �+�1 (��/�,���4��31/��:%�%"AU"!!1�U;<��M�\T3��T]VV�15�#;<��M�\T3��T]7:.��.�=���.�! ���.�$"1-#NK5H�P"-1 �6A"?��#����".���%&����".��! ���.��%.
�%.�=.$�H'���6�3N�-�1!3�)�&��=.�" %3���6%1/��1+�� � 1/��"��1�!"H1/�,��� �+�1 (��/�,��4��31/��:%�%"A�U"!!1�U;<��M�\T�"��1T]VV15�#�;<��M�\T�"��1T]7:.��.��%.
�%.�=.�%"!&��=.��1+���1� � 1/�-1!5�"%�"# ��5#�!/�C���#'!/�9�.�:%�%"A�U"!!1�U;<��M�\T-1!5�"%�"# T]VV15�#�;<��M�\T-1!5�"%�"# T]7:.���1+���1�.��%.
�%.�=.R��1(#�"��&��=.�!1�15� � 1/��6%1��.�:%�%15�#;%3��-#' 7:.��!1�15�.��%.�%.�=.R��1(#�"�*&��=.�!1�15� � 1/��6%1*�.�:%�%15�#;%3��-#' 7:.��!1�15�.��%.�%.�=.R��1(#�"��&��=.�!1�15� � 1/��6%1��.�:%�%15�#;%3��-#' 7:.��!1�15�.��%.��A"1�-!1�.�-"4��"( /�51 �1��.�" %3��6%1/�!3= "��� � 1/�!3= "��4��31/��6L�"P��.��-"4.��A#� .
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
394
Formularz (rysunek 11.9) pozwala wprowadzić
do pól tekstowych kilka wartości i zapamiętać je.
11. Zakończyć skrypt PHP.
�:%�% 6!2�<5�#!1UV7" 5�3-1UT" 5�3-1!�!�#%?���� �TV7:.
12. Zapisać plik pod nazwą add_url.php, umieścićgo na serwerze WWW i przetestować przy użyciu
przeglądarki internetowej (rysunek 11.10).
Rysunek 11.9. Formularz służący do dodawania
adresów URL
Rysunek 11.10. Po przesłaniu wprowadzonych
danych zostanie wyświetlony komunikat
i formularz będzie widoczny ponownie
(z poprzednio wstawionymi wartościami)
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
395
Wskazówki
� W celu zablokowania możliwości
stosowania znaczników języka HTML
we wprowadzanych wartościach należy
posłużyć się funkcją �������"� �.
Funkcja ta usuwa wszystkie znaczniki
nie tylko języka HTML, ale też PHP.
� Aby wyświetlić znaczniki języka HTML
(w postaci, w jakiej występują w kodzie
źródłowym) bez ich uaktywniania należy
skorzystać z funkcji #����������#�� �
i #��������� �.
� Funkcja ������������� � jest powiązana
z każdą pojedynczą sesją (interakcja z bazą
danych). Z tego też powodu nie należy
się przejmować tym, że zwrócono
nieprawidłową wartość nawet wtedy,
gdy skrypt jednocześnie został wykonany
przez kilku różnych użytkowników.
� W przypadku korzystania ze skryptów
PHP i stron HTML można stosować
rozwiązanie zapamiętujące, jakie pozycje
zostały wybrane z menu rozwijanego,
ale jest to związane z większą ilością kodu
źródłowego, a ponadto w przytoczonym
przykładzie niezbyt dobrze współpracuje
ze zmienną �������$�.
� W zastosowanym przykładzie można było
też stworzyć kontrolki, które posłużyłyby
do wybierania maksymalnie trzech kategorii.
� Po uaktywnieniu funkcji Magic Quotes,
wartości wprowadzone do formularza przed
przesłaniem do przeglądarki muszą zostać
przetworzone przez funkcję ��������#� �.
� W przytoczonym przykładzie po poprawnym
przesłaniu wstawionych wartości formularz
zostanie ponownie wyświetlony wraz
z poprzednio wprowadzonymi danymi.
Aby to zmienić, należy zrezygnować
z wyświetlania formularza lub wyczyścić
zawartość zmiennej tablicowej ��%&��
po udanym wykonaniu zapytania na bazie
danych.
� Funkcja języka PHP o nazwie ���������� �
jest odpowiednikiem funkcji �������������� �
oferowanej przez serwer MySQL.
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
396
Przeglądanie wysłanych adresów URL
Skrypt umożliwiający przeglądanie adresów URL
będzie się składał z dwóch części — górnej
i dolnej. W pierwszej z nich zostanie wyświetlone
menu rozwijane z dostępnymi typami adresów,
natomiast w drugiej wszystkie odnośniki dla
wybranego typu. Gdy użytkownik wyświetli
stronę po raz pierwszy, wtedy nie zostanie
wyświetlony żaden adres URL. Po wybraniu
przez niego typu i przesłaniu danych
wprowadzonych do formularza, strona zostanie
wyświetlona ponownie wraz z listą adresów
URL dla wybranego typu (niezależnie
od tego menu rozwijane w dalszym ciągu
będzie widoczne).
Nowe funkcje i metody
Skrypt view_urls.php wprowadza dwa nowe rozwiązania. Jednym z nich jest rzutowanie,czyli narzucanie zmiennej konkretnego typu (całkowitoliczbowy, łańcuchowy itp.).Aby zrzutować zmienną, należy przed jej nazwą w nawiasach określić ostateczny jej typ.Oto przykład:
;4��/����7���6%N�b535�#'6;4��/U" �V;4��7���6%5�N?#'"�#�"5H=#'6
Do dostępnych typów zmiennych (w niektórych przypadkach wiele określeń dotyczy tego
samego typu) należy zaliczyć takie typy jak ��� i ���", !��� i !�����, '����, ���!�,��, ����", ��� i �!(��. Interpreter języka PHP w oparciu o początkową wartośćrzutowanej zmiennej zmieni jej typ i przypisze jej odpowiadającą mu wartość logiczną(w celu uzyskania szczegółowych informacji z tym związanych należy zajrzeć do
dokumentacji języka PHP). Przy użyciu funkcji ���)�� � można też zmienić typ zmiennejna typ całkowitoliczbowy (co zostanie pokazane w kolejnym skrypcie). Z kolei poprzezumieszczenie wartości w znakach cudzysłowu można zamienić typ zmiennej na łańcuchowy.
Drugim nowym rozwiązaniem zastosowanym w skrypcie jest funkcja ���� �. Funkcjapobiera wartości zmiennej tablicowej i przypisuje je oddzielnym zmiennym. Oto przykład:
;4��/����6U�_� �F�$#'�?�V7�"!�U;A"�!�F;��!�V/;4��7
Powyższym zmiennym �'��� i ����� zostaną przypisane odpowiednio wartości Jan i Nowak.Podobna funkcjonalność może być również uzyskana przy użyciu funkcji *���� � podobnejdo funkcji ���� �.
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
397
Rysunek 11.11. Menu rozwijane
Aby utworzyć skrypt view_urls.php,należy wykonać poniższe kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.6).
�:%�%@�"!�" (���,�4"1'<3��!�%�%;%�(1<�"��1/T��H1(�K-� "1�-�1!O'�)�T7" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7
2. Rozpocząć definiowanie formularzazawartego na stronie HTML.
15�#T�-"4��"( /�51 �1��.�A#� 1��#-/�(1���5�"# /�4"1'<3��!�%�%�.�!1�15� � 1/��6%1�.�#%�"# 4��31/�$����.�6="1�H�?��1(#�"W&��#%�"# .T7
Po pierwszym wyświetleniu strony HTML
będzie na niej widoczny formularz składający
się z menu rozwijanego i przycisku Wyślij
(rysunek 11.11). W tym miejscu zawarto
początek definicji formularza umieszczonego
na stronie HTML.
Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii
��:%�%@�"!�" (���,�4"1'<3��!�%�%*��M��# �%#H'���'6L'"1��"^�-�1!6�)�H�%"!� 1'=�H"1-� 65������!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?������C;%�(1<�"��1/T��H1(�K-� "1�-�1!O'�)�T79" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7,�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7���#NK5H1 "1H=�HK-� 65��D���'#�H1 "1A#� 3���H�%#H'���PK51(#3X6�?#' "?#'"'6=�� "1�-�1!3�)�F?�O�6H#!�� "1'6L'"1��# 6�8��������������� �����������0������������������ ������������������������������������������������������������������������� �!��"�#��� ��$%�&�������*����'
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
398
3. Pobrać wszystkie dostępne typy adresów URLi dołączyć je do menu rozwijanego.
;231�6/TM���`[)��3��<�6%1!��)�)���6%1GM�T7;�1!3��/ 6!2�<231�6U;231�6V7'�"�1U;�#'/ 6!2�<A1�5�<����6�U;�1!3��F��MY�<$��VV>15�#T�#%�"# 4��31/�TF;�#'\�]FT�.TF�!��"%!��!�1!U;�#'\�]VFT��#%�"# .T7B
Powyższy kod pobiera z tabeli �������
każdy typ adresu URL i na podstawie
zwróconych rekordów generuje kod źródłowy
menu rozwijanego umieszczonego na stronie
HTML (rysunek 11.12).
Rysunek 11.12. Dynamicznie wygenerowany kod
źródłowy formularza zawartego na stronie HTML
Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy
�����&&�(�!��������)������������$���������*���C���+,��������-.�./0�1�2345�����������436.3�78������9-/�'�9���+������������,��,�����:+,����;'�,��������:+���������,��������������:+������<�58-=����5;;�>�D�������������������������<�+���?@A<�����<������������:+���?BA;<���&�������8����'�0���C*�*����&&�D�#�E�"������������"��**����������&�������*������������������!������������!���������� �)�FG��*C����&�����*9����&��*,����'*D*8���#=�� "1�-�1!O'�)�#?�1L�# 1(#�6%3UP1L�"(#%#-� #V�*0"AU"!!1�U;<S�\T�6%1T]VV>����;�/" �4��U;<S�\T�6%1T]V7��M%��'-H1 "1F5H6�6%P1!�5�N?#'"�#�"5H=#'6��*�����#=�� "1 �H'6�?�3�� "1'6=�� 1(#�6%3��C;231�6/�M����6%1[)��3��<�6%1!��)�6%1<"-/;��7�9;�1!3��/ 6!2�<231�6U;231�6V7�,�"!�U;�6%1V/ 6!2�<A1�5�<����6U;�1!3��F��MY�<$��V7�D�815�#�����.�-"4��"( /a�51 �1�a�.�=.;�6%1#- #L "?O'��=.�=��.�0�! ���.U�!H6!�?"1#- #L "?"=W-K?#�H6!��N6H'N�! 1(##? ��$�P%"1�'H#!�� K'6L'"1��# 1#!��� "#-#-� 1#- #L "?"�V��! ���.��-"4.a �7
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
399
4. Zakończyć definicję formularzaumieszczonego na stronie HTML.
15�#T��!1�15�.�" %3��6%1/�!3= "�� � 1/�!3= "���4��31/��6L�"P��.��A#� .��-"4.T7
5. Sprawdzić, czy został wybrany typ adresuURL i czy pobrano informacje na jego temat.
"AU"!!1�U;<S�\T�6%1T]VV>
;�/" �4��U;<S�\T�6%1T]V7
;231�6/�M����6%1[)��3��<�6%1!���)�6%1<"-/;��7;�1!3��/ 6!2�<231�6U;231�6V7�"!�U;�6%1V/ 6!2�<A1�5�<����6�U;�1!3��F��MY�<$��V7
15�#�����.�-"4���"( /a�51 �1�a�.�=.;�6%1�#- #L "?O'��=.�=��.�! ���.U�!H6!�?"1#- #L "?"=W-K�?#�H6!��N6H'N�! 1(##? ��$�P%"1�'�H#!�� K'6L'"1��# 1#!��� "#-#-� 1�#- #L "?"�V��! ���.��-"4.a �7
Jeśli typ został już wybrany (w takim
przypadku zostanie dołączony do adresu
URL i udostępniony przy użyciu zmiennej
tablicowej ��+��), powiązane z nim adresy
URL powinny być pobrane.
Pierwsza operacja będzie polegała
na zastosowaniu funkcji ���)�� � w celu
sprawdzenia, czy wybrany typ, który zostanie
zastosowany w zapytaniu jest typem
całkowitoliczbowym. W dalszej kolejności
przy użyciu funkcji ���� � zostanie pobrana
nazwa typu i wyświetlona na stronie w roli
nagłówka. Więcej informacji na temat funkcji
���)�� � i ���� � można znaleźć w ramce
Nowe funkcje i metody lub w dokumentacji
języka PHP.
6. Zainicjalizować zmienną �'��� i wysłaćzapytanie do bazy danych.
;A"�!�/�)�7;231�6/�M���3��F�"��1F-1!5�"%�"# �[)��3��!GM3F3��<�"��1!GM3���)�3���"��1<"-/3��"��1<"-G$�3��6%1<"-/;��G$�3��%%�#41-/T�T�)�)���-��1<!3= "��1--1!5�7;�1!3��/ 6!2�<231�6U;231�6V7
Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy
C�;A"�!�/�)�7��� "5P��"H�5P�H "1 1P�C����6?# � "1H�%6�� "� �=�H"1-� 65��C*;231�6/�M���3��F�"��1F-1!5�"%�"# [)��3��!GM3F3��<�"��1!GM3���)3���"��1<"-/3��"��1<"-G$�3��6%1<"-/;�G$�3��%%�#41-/T�T�)�)��-��1<!3= "��1--1!5�7C�;�1!3��/ 6!2�<231�6U;231�6V7CC�����&&� �)����������"���#��������*���3��C9����������:+���������,��������������:+������<�58-=��9--4/;;�>C,�������&&�H�)��F������������"����#���<�������"������������"������!�����������CD�������:+����;�>C8����������������!���!�������@��������B@@I����������� ��J����������� ��J���� �����������C0���������9�������������� ���� ����������K@I���������"���LB��4���)�#�&������&���9�������������� ���������������K@I���������"���LB��4���&������&���9*������&����'9��������C�&&�M������$��������#���F�"��"����N�+�����
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
400
Zmienna �'��� zostanie wykorzystana
na dwa sposoby. Pierwszy z nich będzie
polegał na tym, że zmienna wskaże, że przed
wyświetleniem pierwszego rekordu na stronie
HTML powinna zostać utworzona tabela.
W drugim przypadku zmienna posłuży
do sprawdzenia, czy w wyniku wykonanego
zapytania zostały zwrócone jakiekolwiek
adresy URL.
7. Wyświetlić wszystkie zwrócone rekordy.
'�"�1U;�#'/ 6!2�<A1�5�<����6�U;�1!3��F��MY�<GMM��VV>
"AU;A"�!�V>15�#T���=�1=#�-1�/���'"-��/����I��51��!%�5" (/���51��%�--" (/������"( /�51 �1��.���.��-��"( /��"(���'"-��/�9�I�.�A# ��!"H1/�c��.�- #L "?��A# �.���-.��-��"( /��1A��'"-��/�9�I�.�A# ��!"H1/�c��.�%"!��A# �.���-.����.T7
B15�#����.��-��"( /a��"(��a�.�����1A/a����%&��>;�#'\T3��T]Ba�����(1�/a�< 1'a�.��!��"%!��!�1!�U;�#'\T�"��1T]V�����.���-.��-��"( /a��1A�a�.>;�#'�\T-1!5�"%�"# T]B���-.����.a �7
;A"�!�/[G�M7
B
Pętla $#�� zwróci wszystkie rekordy
pobrane w wyniku wykonanego zapytania.
Przed wyświetleniem pierwszego rekordu
do przeglądarki internetowej zostanie
wysłana tabela i jej nagłówek
(rysunek11.13).
Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy
9C�������&&� �)��������"���#����#�����99�������������������9,��������������� ��O�� ��O����������O�����%&&>+���?�����ACO����� ���O�����O�����9D��������������������:+���?������A;�����&���&���98��������������� ��O�����O��>+���?�����������AC�&���90��������&���O��',��������+�������29�-.'�&&�D��*�����F�������#����,�����C�&&�M������$��������,*��_1L�" "1'6L'"1��# #X�- 1(#�1?#�-3���,�"AU;A"�!�V>,C15�#T�-"4��"( /�51 �1��.G?�3�� "1-��'6=�� 1P?��1(#�"" "1"!� "1P1X�-1 #- #L "?���-"4.T7,9B1�!1>,,15�#T����=�1.T7��J� ? "W5"1��=1�"�,DB,8B��R# "15" �!��3?5P"'��3 ?#'1P;<S�\T�6%1T]�,0 6!2�<5�#!1UV7��J� ? "W5"1%#NK5H1 "�H=�HK-� 65��D�" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7���#NK5H1 "1!�#%?"�����D�:.
Zarządza
nie adresa
mi URL
Zarządzanie zawartością strony — przykład
401
Rysunek 11.13. Lista adresów URL
dla wybranego typu
Rysunek 11.14. Wygląd strony w przypadku,
gdy z wybranym typem nie powiązano jeszcze
żadnych adresów URL
8. Wyświetlić komunikat, jeśli nie został
zwrócony żaden adres URL i zakończyć
kod głównej instrukcji warunkowej.
"AU;A"�!�V>15�#T�-"4��"( /�51 �1��.G?�3�� "1-���'6=�� 1P?��1(#�"" "1"!� "1P1X�-1 �#- #L "?���-"4.T7B1�!1>15�#T����=�1.T7BB
Jeśli zostaną zwrócone jakiekolwiek wiersze,
zmienna �'��� znajdująca się wewnątrz
pętli $#�� przyjmie wartość ,����. A zatem,
jeśli wartością zmiennej �'��� nadal będzie
��-�, oznacza to, że nie zwrócono żadnych
rekordów i powinien zostać wyświetlony
komunikat podobny do pokazanego na
rysunku 11.14. W przeciwnym razie powinna
zostać wygenerowana kompletna tabela.
9. Zakończyć kod źródłowy strony HTML.
6!2�<5�#!1UV7" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7:.
10. Zapisać plik pod nazwą view_urls.php, umieścić
go na serwerze WWW i przetestować przy
użyciu przeglądarki internetowej.
Wskazówki
� W rozdziale 12. zamieszczono skrypt
demonstrujący, w jaki sposób wyświetlać
rekordy na wielu stronach (zapoznaj się
z zawartością ostatniego skryptu tego
rozdziału o nazwie view_users.php).
� Przykłady zawarte w następnym rozdziale
dotyczą również operacji rejestracji
i autoryzacji użytkownika. Jeśli zależy Ci
na ochronie zarządzanych informacji,
obie operacje powinny zostać zastosowane
w aplikacji omawianej w niniejszym rozdziale.
� W razie potrzeby w stosunku do pola
��������� można zastosować funkcję
��.! � (skrót od słów newline to break).
Funkcja zamieni każdy znak nowego wiersza
— tworzony poprzez wciśnięcie klawisza
Return lub Enter — na znacznik języka
(X)HTML postaci /!01.
Zarzą
dza
nie adresa
mi U
RL
Rozdział 11.
402
Zarządzanie plikami
Ostatnia część omawianej aplikacji internetowej
służy do zarządzania plikami dowolnego typu.
Odpowiednie skrypty pozwolą użytkownikom
przy użyciu przeglądarki internetowej umieścić
na serwerze pliki przechowywane na ich
komputerach (rysunek 11.15). Dodatkowo
do bazy danych zostanie dodany rekord
powiązany z wykonaną operacją.
Umieszczanie plików na serwerze
Podobnie jak w przypadku przetwarzania
przy użyciu skryptu PHP dowolnego formularza
zawartego na stronie HTML, również operacja
umieszczania plików na serwerze składa się
z dwóch etapów. Najpierw musi zostać
wyświetlony formularz zawarty na stronie HTML
umożliwiający umieszczanie plików na serwerze.
Po przesłaniu danych wprowadzonych
do formularza skrypt PHP musi skopiować
plik w odpowiednie miejsce na serwerze.
Wymagana składnia kodu źródłowego
definiującego formularz umożliwiający
umieszczenie pliku na serwerze składa się
z trzech części:
�A#� 1 5�6%1/� 3��"%����A#� �-������5�"# /�!5�"%��%�%� 1��#-/�%#!��.�" %3��6%1/��"--1 � � 1/��G�<[��<M�J��4��31/�������.["�1�" %3��6%1/�A"�1� � 1/�3%�#�-��.
Atrybut ����� zawarty w pierwszej parze
znaczników kodu formularza oznacza,
że powinien być w stanie obsłużyć wiele typów
danych, włączając w to pliki. Należy również
zauważyć, że formularz musi korzystać z metody
%&��. Wartość ukrytego pola 2�3�,������4�
spełnia w formularzu rolę ograniczenia wielkości
przetwarzanego pliku (wyrażonej w bajtach)
i musi znajdować się przed definicją pola '��,
które służy do utworzenia na formularzu
odpowiedniego przycisku (rysunek 11.16).
Rysunek 11.15. Użytkownicy będą mogli wybrać
plik, który zostanie umieszczony na serwerze
Rysunek 11.16. Definicja typu file tworzy
na formularzu zawartym na stronie HTML
przycisk podobny do pokazanego powyżej
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
403
Począwszy od wersji 4.1 języka PHP, dostęp
do pliku umieszczonego na serwerze może być
uzyskany przy użyciu zmiennej superglobalnej
��,����. W przypadku wcześniejszych wersji
(jeśli uaktywniono parametr "����"��!���)
należało skorzystać ze zmiennej tablicowej
����%�%&���,���� lub po prostu ze zmiennej
�������, powiązanej z nazwą pola '��.
Zmiennej plikowej zostaną przypisane wartości
tablicy wymienione w tabeli 11.1.
Po pobraniu pliku przez skrypt PHP funkcja
��)���������'�� � może go przenieść
z katalogu tymczasowego w jego docelowe
położenie.
#41<3%�#�-1-<A"�1U������������� ����������F�����������������������V7
Po wywołaniu funkcji zakończonym powodzeniem
tymczasowa wersja pliku zostanie usunięta
z serwera. Aby jednak tak było, serwer WWW
musi dysponować prawem zapisu do katalogu,
w którym zostanie umieszczony plik.
Mając to na uwadze, na początku dokonam
modyfikacji pliku konfiguracyjnego języka
PHP o nazwie php.ini tak, aby możliwe było
umieszczanie plików na serwerze, a następnie
zostanie stworzony sam skrypt realizujący
to zadanie.
Zarzą
dza
nie plik
ami
Tabela 11.1. Dane dotyczące pliku umieszczanego
na serwerze mogą zostać uzyskane przy użyciu
powyższych elementów tablicy
Zmienna tablicowa $_FILES
Indeks Znaczenie
� 1 Oryginalna nazwa pliku (przechowywanego
na komputerze użytkownika).
�6%1 Typ MIME pliku określony
przez przeglądarkę.
!"H1 Wielkość pliku umieszczanego na serwerze
(wyrażona w bajtach).
� %< � 1 Tymczasowa nazwa pliku po umieszczeniu
na serwerze.
Rozdział 11.
404
Aby przygotować serwer,należy wykonać następujące kroki:
1. W edytorze tekstu otworzyć plik php.ini.
2. W File Uploads zmodyfikować poniższeparametry (rysunek 11.17):
A"�1<3%�#�-!/� 3%�#�-<� %<-"�/�� %3%�#�-< �+<A"�1!"H1/*�
Pierwszy parametr pozwala na umieszczanieplików na serwerze lub blokuje taką możliwość.Drugi parametr pozwala określić miejsce,w którym tymczasowo będą przechowywanepliki umieszczane na serwerze. W przypadkuwiększości systemów operacyjnych przedparametrem tym można bez większych obawumieścić znak komentarza (znak średnika).Użytkownicy systemów Mac OS X i UNIXzazwyczaj dla parametru ustawiają katalog/tmp, natomiast w przypadku systemuWindows powinni korzystać z kataloguokreślonego ścieżką C:\PHP\uploadtemp.
Ostatni z wymienionych parametrów służydo określenia maksymalnej wielkości plików(wyrażonej w megabajtach) umieszczanychna serwerze.
3. Zapisać plik i ponownie uruchomićserwer WWW (rysunek 11.18).
�%�5�15��(��51A3�
Powyższe polecenie służy do ponownego
uruchomienia serwera Apache działającego
pod systemem operacyjnym UNIX.
Użytkownicy systemu Mac OS X
w celu ponownego uruchomienia serwera
mogą użyć panelu Sharing, natomiast
w przypadku systemu Windows należy
posłużyć się apletem Usługi znajdującym
się w Panelu sterowania lub innym
narzędziem współpracującym
z serwerem WWW.
4. Utworzyć nowy katalog o nazwie uploadsznajdujący się poza strukturą katalogową
serwera WWW. Katalog ten będzie spełniał
rolę docelowego miejsca, w którym będą
umieszczane pliki na serwerze. Ze względu
na zabezpieczenia katalog nie powinien
być częścią struktury katalogowej
serwera WWW.
Rysunek 11.18. Aby zmiany dokonane w pliku konfiguracyjnym języka PHP
zostały uwzględnione, konieczne jest ponowne uruchomienie serwera WWW
Zarządza
nie plikami
Rysunek 11.17. Sekcja File Uploads pliku
php.ini odpowiedzialna za obsługę plików
umieszczanych na serwerze
Zarządzanie zawartością strony — przykład
405
Rysunek 11.19. Karta Udostępnianie
w systemie Windows pozwala na określenie,
kto będzie dysponował dostępem do katalogu
Rysunek 11.20. Jeśli uprawnienia nie
zostaną poprawnie zdefiniowane, pojawią się
komunikaty błędów podobne do pokazanego
� Ze względu na czas wymagany
do umieszczenia dużego pliku
na serwerze może być konieczna
modyfikacja wartości parametru
��*�*���������� zawartego
w pliku php.ini lub tymczasowe
przekazanie jej do skryptu przy
użyciu funkcji ������������ �.
5. Ustawić dla katalogu uploads takie uprawnienia,aby serwer WWW mógł w nim umieszczać pliki.
Pewna, ale mniej bezpieczna metoda polega na
wykonaniu polecenia �#���567775�������
(systemy UNIX i Mac OS X). W przypadku
systemu Windows należy kliknąć katalog
prawym przyciskiem myszy, a następnie wybrać
pozycję Udostępnianie. Spowoduje to
wyświetlenie okna zawierającego kartę
Udostępnianie (rysunek 11.19).
W zależności od stosowanego systemu
operacyjnego może się okazać, że będzie
możliwe umieszczanie plików na serwerze bez
konieczności wykonywania tego kroku. Aby się
o tym przekonać, przed modyfikacją uprawnień
należy wykonać poniższy skrypt. Jeśli zostaną
wyświetlone komunikaty podobne do pokazanego
na rysunku 11.20, należy dokonać zmiany
w uprawnieniach.
Wskazówki
� Wartość pola 2�3�,������4� ograniczaw przeglądarce wielkość pliku. Plik konfiguracyjnyjęzyka PHP dysponuje własnymi ograniczeniami.Można również przeprowadzić walidację wielkościpliku umieszczonego na serwerze przy użyciuskryptu PHP.
� Parametr �������*���8 zawarty w pliku php.inisłuży do określenia maksymalnej ilości danych(wyrażonej w megabajtach), które mogą zostaćumieszczone na serwerze przy użyciu jednegoskryptu. Domyślnie jest to 8 MB.
� W języku PHP w wersji 4.2 nowością jest indeksbłędów zmiennej tablicowej ��,����. Jegozadaniem jest przechowywanie dowolnychinformacji dotyczących błędów powiązanychz plikiem umieszczanym na serwerze.
� Jeśli mamy na uwadze kwestię zabezpieczeń,
przechowywanie plików umieszczanych
na serwerze poza strukturą katalogów serwera
WWW jest bardziej wskazane. Dzięki temu
uniemożliwi się użytkownikom uzyskanie
bezpośredniego dostępu do plików i uniknie się
zagrożenia związanego z umieszczaniem katalogu
dysponującego mało restrykcyjnymi uprawnieniami
w miejscu publicznie dostępnym.
Zarzą
dza
nie plik
ami
Rozdział 11.
406
Aby utworzyć skrypt add_file.php,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.7).
�:%�%@�"!�" (���D��--<A"�1�%�%;%�(1<�"��1/T� "1!H5H� "1%�"?3� �!1�'1�H1T7" 5�3-1UT" 5�3-1!� �(�#'1?��� �TV7
2. Sprawdzić, czy wypełniono formularzi przeprowadzić walidację wartości pola
���������.
"AU"!!1�U;<��M�\T!3= "�T]VV>�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7A3 5�"# 1!5�%1<-���U;-���V>(�#=��;-=57"AU" "<(1�UT �("5<23#�1!<(%5TVV>;-���/!��"%!��!�1!U;-���V7B�1�3� 6!2�<�1��<1!5�%1<!��" (�U��" U;-���VF;-=5V7B
"AU�1 %�6U;<��M�\T-1!5�"%�"# T]VV>;-/1!5�%1<-����U;<��M�\T-1!5�"%�"# T]V7B1�!1>;-/TT7B
Podobnie jak w przypadku omawianego
wcześniej skryptu add_url.php, dla pola
��������� zostanie przeprowadzana
najprostsza walidacja. Ze względu na to,
że pozostałe pola formularza nie wymagają
sprawdzenia, zastosowano tylko jedną
instrukcję warunkową.
W celu określenia, czy rozmiar pliku
umieszczanego na serwerze zawiera się
w założonym przedziale można również
sprawdzić jego wielkość.
Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze
��:%�%@�"!�" (���D��--<A"�1�%�%*��M��# �%#H'���3X6�?#' "?# 3 "1L5"^%�"?" �!1�'1�H1�����!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?������C;%�(1<�"��1/T� "1!H5H� "1%�"?3 �!1�'1�H1T79" 5�3-1UT" 5�3-1!� �(�#'1?��� �TV7,"AU"!!1�U;<��M�\T!3= "�T]VV>���=!N3(�A#� 3���H��D�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7���#NK5H1 "1H=�HK-� 65��8��[3 ?5P�3!3'�PK5�H �?T�T"#=5" �PK5�-� 1'%�#'�-H# 1'A#� 3���H3�0A3 5�"# 1!5�%1<-���U;-���V>��(�#=��;-=57��"AU" "<(1�UT �("5<23#�1!<(%5TVV>�*;-���/!��"%!��!�1!U;-���V7��B�C�1�3� 6!2�<�1��<1!5�%1<!��" (U��" U;-���VF;-=5V7�9B��R# "15!1?5P"A3 ?5P"1!5�%1<-���UV�
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
407
3. Wstawić do bazy danych rekord powiązany
z plikiem umieszczanym na serwerze.
;231�6/��$M)��$��3%�#�-!UA"�1< � 1F�A"�1<!"H1FA"�1<�6%1F-1!5�"%�"# F�3%�#�-<-��1VEG��M�UT>;<[��M\T3%�#�-T]\T � 1T]BTF�>;<[��M\T3%�#�-T]\T!"H1T]BF�T>;<[��M\T3%�#�-T]\T�6%1T]BTF�T;-TF$��UVV�7;�1!3��/Z 6!2�<231�6U;231�6V7
Informacja o każdym pliku umieszczonym
na serwerze zostanie zapisana w bazie
danych. W tym celu zostanie zastosowana
wielowymiarowa zmienna tablicowa
��,����, która będzie przechowywała
oryginalną nazwę pliku, jego wielkość
i typ MIME. Wszystkie te dane zostaną
pobrane z przeglądarki internetowej.
Dodatkowo zostanie zapisany opis
oraz aktualna data i godzina.
4. Utworzyć nowy plik.
"AU;�1!3��V>;1+�1 !"# /1+%�#-1UT�TF�;<[��M\T3%�#�-T]\T � 1T]V7;3"-/ 6!2�<" !1��<"-UV7;A"�1 � 1/;3"-�T�T�;1+�1 !"# \�]7
Plik zostanie zapisany na serwerze pod nową
nazwą. Takie rozwiązanie jest o wiele bardziej
bezpieczne niż w przypadku posługiwania się
oryginalną nazwą nadaną przez użytkownika.
Nazwa pliku będzie złożona z wartości
bazodanowego pola ��������� (pobranej
przy użyciu funkcji ������������� �),
za którą zostanie wstawiona kropka
i rozszerzenie oryginalnego pliku (uzyskanego
poprzez rozkład jego nazwy). Przykładowo,
dokument o nazwie chapter.doc może przyjąć
nazwę 231.doc, natomiast plik imagename.jpg
zostanie zapisany jako 49.jpg.
Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy
�,��M%��'-H1 "1#=15 #L5"#%"!3U "1P1!�'6 �(� 1V��D"AU�1 %�6U;<��M�\T-1!5�"%�"# T]VV>�8;-/1!5�%1<-���U;<��M�\T-1!5�"%�"# T]V7�0B1�!1>*�;-/TT7*�B***�����&&�6��������#��������!�"���������*C����+,��������P�-.30�P�04���������:��������<������"�<���������<���������������<������������;�Q9��.-�:�>+�2P�.-?��������A?������AC�<������>+�2P�.-?��������A?��"��AC<��>+�2P�.-?��������A?������AC�<��+��<��4 :;;�'*9����+���������R���,��,�����:+,����;'*,*D������:+������;�>*8*0������&&������"������"�����#����������+�S����������S������:���<�+�2P�.-?��������A?������A;'��������+��������,���������:;'�&&�P������#�������#������"�"��� ������������������"��*������+����������+�����������+�S������?BA'���C������&&�(�"����"������#���9��������:����������������:+�2P�.-?��������A?����������A<�����������&�������&+��������;;�>�,15�#T�%.��"?H#!��N3 "1!H5H# 6 �!1�'1�H1���%.T7
Zarzą
dza
nie plik
ami
Rozdział 11.
408
5. Skopiować plik w docelowe miejscena serwerze.
"AU #41<3%�#�-1-<A"�1U;<[��M�\T3%�#�-T]\T� %< � 1T]F����3%�#�-!��;A"�1 � 1�VV>15�#T�%.��"?H#!��N3 "1!H5H# 6� �!1�'1�H1���%.T7B1�!1>15�#T�%.�A# �5#�#�/��1-�.���H1 "1!"1 "1%�"?3 "1=6N#� #X�"'1���A# �.��%.T7;231�6/����[)��3%�#�-!��)�3%�#�-<"-/;3"-�7;�1!3��/Z 6!2�<231�6U;231�6V7B
W celu przeniesienia pliku tymczasowego
w docelowe miejsce (katalog uploads,
gdzie plik uzyska nową nazwę) należy
użyć funkcji ��)���������'�� �.
Jeśli przeniesienie pliku nie będzie
możliwe (rysunek 11.20), z bazy danych
zostanie usunięty rekord i pojawi się
komunikat błędu.
6. Dokończyć tworzenie instrukcjiwarunkowej i skryptu PHP.
B1�!1>15�#T�%.�A# �5#�#�/��1-�.$�!?3�1?�=NW-3!6!�1 #'1(#'6!N� 1H�%6�� "1� "1 #(N#H#!��^%�H1�'#�H# 1����H1%��!H� 6H�H�"!� "�NK� "1-#(#- #L^���A# �.��%.T7B 6!2�<5�#!1UV7B:.
Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy
�DB1�!1>�815�#T�%.�A# �5#�#�/��1-�.��H1 "1!"1 "1%�"?3 "1=6N# #X�"'1���A# �.��%.T7�0C����!3 "W5"1�1?#�-3H=�H6-� 65��C�;231�6/����[)��3%�#�-!��)3%�#�-<"-/;3"-�7C*;�1!3��/Z 6!2�<231�6U;231�6V7C�BCCC9B1�!1>��_1L�"H�%6�� "1 �=�H"1-� 65� "1H#!�� "1'6?# � 1%��'"-N#'#�C,15�#T�%.�A# �5#�#�/��1-�.$�!?3�1?=NW-3!6!�1 #'1(#'6!N� 1H�%6�� "1 "1 #(N#H#!��^%�H1�'#�H# 1���H1%��!H� 6H�H�"!� "�NK "1-#(#- #L^���A# �.��%.T7CDBC8C0 6!2�<5�#!1UV7��J� ? "W5"1%#NK5H1 "�H=�HK-� 65��9�9�B��R# "15" !��3?5P"'��3 ?#'1P#=!N3(3PK51P-� 1'%�#'�-H� 1'A#� 3���H3�9*:.9�9C�������������������������&����T��������������U���������+�-.3Q.3?�(V(�-.�2�A'�U��������������������999,���������������������������59W�2P�.�-PD.��������KXYXZZ��
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
409
7. Zdefiniować formularz zawartyna stronie HTML.
�A#� 1 5�6%1/� 3��"%����A#� �-������5�"# /��:%�%15�#;<M)E)\T���<M�[T]7�:.� 1��#-/�%#!��.
�" %3��6%1/��"--1 � � 1/��G�<[��<M�J��4��31/�9*C*88�.
�A"1�-!1�.��1(1 -.�51�33 "1!H5H1 "��%�"?3 �!1�'1�H1 ��1X6'6%1N "^�A#� 3���H&���1(1 -.
�%.�=.��"?&��=.�" %3��6%1/�A"�1�� � 1/�3%�#�-��.��%.
�%.�=.�%"!&��=.��1+���1�� � 1/�-1!5�"%�"# �5#�!/�C����#'!/�9�.���1+���1�.��%.
��A"1�-!1�.
�-"4��"( /�51 �1��.�" %3��6%1/�!3= "��� � 1/�!3= "��4��31/��6L�"P��.��-"4.
��A#� .
Co prawda formularz jest bardzo prosty,
ale zawiera trzy niezbędne elementy
związane z umieszczaniem plików
na serwerze — atrybut �����,
ukryte pole 2�3�,������4� i pole '��.
8. Zakończyć tworzenie skryptu PHP.
�:%�%" 5�3-1UT" 5�3-1!�!�#%?���� �TV7:.
Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy
9D�A"1�-!1�.��1(1 -.�51�33 "1!H5H1 "�%�"?3 �!1�'1�H1 ��1X6'6%1N "^A#� 3���H&���1(1 -.9890������!�(�#%�&!���������������������������������&��&��,�,��%.�=.�%"!&��=.��1+���1� � 1/�-1!5�"%�"# �5#�!/�C���#'!/�9�.���1+���1�.��%.,*,���A"1�-!1�.,C,9�-"4��"( /�51 �1��.�" %3��6%1/�!3= "�� � 1/�!3= "��4��31/��6L�"P��.��-"4.,,,D��A#� .����R# "15A#� 3���H���.,8,0�:%�%D�" 5�3-1UT" 5�3-1!�!�#%?���� �TV7���#NK5H1 "1!�#%?"�����D�:.
Zarzą
dza
nie plik
ami
Rozdział 11.
410
9. Zapisać plik pod nazwą add_file.php,umieścić go na serwerze WWW
i przetestować przy użyciu przeglądarki
internetowej (rysunki 11.21 i 11.22).
Wskazówki
� Obecność pliku umieszczonego na serwerze
może również zostać sprawdzona przy użyciu
funkcji �����������'�� �.
� W celu odwołania się do katalogów
użytkownicy systemu Windows muszą
skorzystać ze znaku 0 lub 99, a zatem
zamiast ścieżki C:\ należy użyć C:/
lub C:\\. Wynika to stąd, że w języku
PHP znak 95jest wykorzystywany
przez funkcję ��������� �.
� Jeśli jest wykorzystywana starsza wersja
języka PHP, może nie być możliwe
zastosowanie zmiennej tablicowej
��,����. Na skutek tego zamiast funkcji
��)���������'�� � konieczne będzie
użycie funkcji ���� �.
� Jeśli oba pliki mają taką samą nazwę,
funkcja ��)���������'�� � nadpisze
istniejący plik bez wcześniejszego ostrzeżenia.
� Po przygotowaniu ostatecznej wersji
produkcyjnej skryptu w celu wyeliminowania
w przyszłości wszelkich komunikatów
błędów należy przed wywołaniami funkcji
��)���������'�� � wstawić znak :.
Rysunek 11.21. Formularz służący
do umieszczania plików na serwerze
Rysunek 11.22. Wygląd strony po udanym
umieszczeniu pliku na serwerze
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
411
Moduł administracyjnyaplikacji
Chociaż w przypadku omawianejaplikacji nie stworzono jej częściadministracyjnej, to jednak nie jestto zadanie trudne do zrealizowania.
Na początku należy do tabeli �������dodać pole ����)�. Następnienależy tak zmodyfikować zarównoplik add_url.php, jak i add_file.php,aby domyślnie wartość pola
����)� wynosiła N. Z myślą o częściadministracyjnej aplikacji należystworzyć stronę, na której zostanąwyświetlone wszystkie elementy, którejeszcze nie zatwierdzono. W celuzaakceptowania dowolnego elementunależy dla odpowiedniego rekordu
tabeli wykonać polecenie -%����i zmienić wartość pola ����)� na Y.
Jedną z zalet systemu służącegodo umieszczania plików na serwerzejest łatwość kojarzenia plików z danymina ich temat przechowywanymi w baziedanych (gdy do tworzenia nazw plikówjest wykorzystywana wartość pola
���������). Jeśli zostanie utworzonyskrypt administracyjny służący dousuwania plików z serwera (z kataloguuploads), można również usunąć z tabelipowiązany z nim rekord.
Przeglądanie i pobieranie plików
Ostatnie dwa skrypty omawianej aplikacji pozwolą
użytkownikom przeglądnąć pliki umieszczone
na serwerze, a następnie je pobrać (w danej
chwili tylko jeden). Skrypt służący do przeglądania
plików jest dość prosty, natomiast skrypt
umożliwiający ich pobieranie wymaga częstego
stosowania funkcji języka PHP o nazwie #�� �.
W celu stworzenia skryptu view_files.php
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.8).
�:%�%@�"!�" (���8�4"1'<A"�1!�%�%;%�(1<�"��1/T��H1(�K-� "1%�"?O'T7" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7
�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7
;A"�!�/�)�7
Zmienna �'��� spełnia taką samą rolę jak
w skrypcie view_urls.php. Zmienna zostanie
wykorzystana przy tworzeniu nagłówka
i w celu określenia, czy będzie możliwe
przeglądanie niektórych plików.
2. Pobrać z bazy danych informacjeo wszystkich plikach.
;231�6/�M���3%�#�-<"-FA"�1< � 1F�)��$�UA"�1<!"H1���*CVGMA!F-1!5�"%�"# F��G�<[�)�G�U3%�#�-<-��1FTI�I1FI�TVGM-�[)��3%�#�-!�)�)��3%�#�-<-��1�M��7;�1!3��/ 6!2�<231�6U;231�6V7
Powyższe zapytanie zwróci dla każdego
pliku umieszczonego na serwerze wartości
przechowywane w polach ���������,
'������, ���������, a ponadto
sformatowaną datę. Na początku zostaną
wyświetlone informacje dotyczące
najnowszych plików. Jednocześnie
zapytanie pozwoli na uzyskanie
wielkości plików (wyrażonej w kilobajtach),
co będzie możliwe poprzez podzielenie
przechowywanej wartości przez 1024,
a następnie zaokrąglenie otrzymanej liczby.
Zarzą
dza
nie plik
ami
Rozdział 11.
412
Listing 11.8. Skrypt view_files.php wyświetla pliki umieszczone na serwerze wraz z ich opisem,
wielkością i datą wykonania operacji
��:%�%@�"!�" (���8�4"1'<A"�1!�%�%*��M��# �%#H'���3X6�?#' "?# %�H1(�K-�^%�"?"3 "1!H5H# 1 �!1�'1�H1�����!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?������C;%�(1<�"��1/T��H1(�K-� "1%�"?O'T79" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7,D�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7���#NK5H1 "1H=�HK-� 65��80;A"�!�/�)�7��� "5P��"H�5P�H "1 1P������6!N� "1H�%6�� "�-#=�H6-� 65������+,��������-.�./0���������<���������<�34��6:�����"�&B@XY;�9-���<�������������<�690.�243590:�����������<��I5�I�<�I8�;�9-���2345���������436.3�78�������������6.-/�'�*��+������������,��,�����:+,����;'����&&� �)����������"���#��������*���3���C�������:+���������,��������������:+������<�58-=��9--4/;;�>�9����&&�H�)��F������������"����#���<�"������������"������!������������,������:+����;�>�D���������������!���!�������@��������B@@I����������� ��J����������� ��J���� ������������8���������0������������ ���������������X@I���������"���LB����"�����#��&������&���*������������� ���������������Y@I���������"���LB��4���&������&���*������������� �����������������X@I���������"���LB��3�"������#��&������&���**������������ ���������������X@I���������"���LB��6��������"�"������#������������������"��&������&���*������&����'*C����C�&&�M������$��������#���F�"��"����N�+�����*9����&&� �)��������"���#����#�����*,����������������*D������������ ��O�����O�����������O�����������������U���>+���?����������AC��������O��>+����?����������AC�&���&���*8������������ ��O�����O�����������������:+���?�����������A;�����&���*0������������ ��O�������O��>+���?����AC#!�&����������������� ��O�����O��>+���?���AC�&����������&���O��'�*����+�������29�-.'�&&�D��*�����F�������#��������C�&&�M������$���������C��_1L�" "1'6L'"1��# #X�- 1(#�1?#�-3����9"AU;A"�!�V>�,15�#T�-"4��"( /�51 �1��.G?�3�� "1 "1 �X�- 1(#%�"?3���-"4.T7�DB1�!1>�815�#T����=�1.T7��J� ? "W5"1��=1�"��0BC� 6!2�<5�#!1UV7��J� ? "W5"1%#NK5H1 "�H=�HK-� 65��C�" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7���#NK5H1 "1!�#%?"�����C*:.
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
413
Każda nazwa pliku spełnia rolę odnośnika
do skryptu download_file.php, przy czym
do adresu URL jest dołączana wartość pola
���������. Wartość ta zostanie wykorzystana
przez skrypt służący do pobierania plików
w celu określenia, który z nich ma być
przesłany do przeglądarki internetowej.
4. Jeśli nie znaleziono żadnych plikówlub zamknięto tabelę, należy wyświetlić
komunikat.
"AU;A"�!�V>15�#T�-"4��"( /�51 �1��.G?�3�� "1� "1 �X�- 1(#%�"?3���-"4.T7B1�!1>15�#T����=�1.T7B
5. Zakończyć tworzenie skryptu PHP.
6!2�<5�#!1UV7" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7:.
6. Zapisać plik pod nazwą view_files.php,
umieścić go na serwerze WWW i przetestować
przy użyciu przeglądarki internetowej.
3. Wyświetlić wszystkie rekordy.
'�"�1U;�#'/ 6!2�<A1�5�<����6U;�1!3��F���MY�<GMM��VV>"AU;A"�!�V>15�#T���=�1=#�-1�/���'"-��/����I��51��!%�5" (/���51��%�--" (/������"( /�51 �1��.���.��-��"( /��1A��'"-��/�*�I�.�A# ��!"H1/�c��.$�H'�%�"?3��A# �.���-.��-��"( /��1A��'"-��/�C�I�.�A# ��!"H1/�c��.�%"!��A# �.���-.��-��"( /�51 �1��'"-��/�*�I�.�A# ��!"H1/�c��.)#H "��%�"?3��A# �.���-.��-��"( /��1A��'"-��/�*�I�.�A# ��!"H1/�c��.����3 "1!H5H1 "�%�"?3� �!1�'1�H1��A# �.���-.����.T7B15�#����.��-��"( /a��1A�a�.����1A/�a�-#' �#�-<A"�1�%�%:3"-/�>;�#'\T3%�#�-<"-T]Ba�.>;�#'�\TA"�1< � 1T]B���.���-.��-��"( /a��1A�a�.���!��"%!��!�1!U;�#'\T-1!5�"%�"# T]V������-.��-��"( /a�51 �1�a�.�>;�#'\TA!T]B?=���-.��-��"( /a��1A�a�.>;�#'\T-T]B���-.����.a �7;A"�!�/[G�M7B
Również w tym przypadku powyższy
kod działa podobnie jak w poprzednim
skrypcie view_urls.php. Zmienna �'���
jest używana raz przy tworzeniu nagłówka
(rysunek 11.23), po czym są wyświetlane
wszystkie rekordy. Przy odwoływaniu
się do funkcji ������'��#���� �
jest stosowana stała 2;�<�����&�,
np. w celu wyświetlenia wartości
należy użyć instrukcji ��$=>'�>?.
Rysunek 11.23. Strona wyświetlona po uruchomieniu
skryptu view_files.php
Zarzą
dza
nie plik
ami
Rozdział 11.
414
Aby utworzyć skrypt download_file.php,należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP
(listing 11.9).
�:%�%@�"!�" (���0�-#' �#�-<A"�1�%�%
2. Sprawdzić wartość pola ���������.
"AU"!< 3 1�"5U;<S�\T3"-T]VV>
Przed kontynuacją należy upewnić się,
czy skrypt pobrał poprawną wartość pola
���������, która powinna być liczbą.
3. Pobrać informacje na temat pliku.
�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7
;231�6/�M���A"�1< � 1FA"�1<�6%1F�A"�1<!"H1[)��3%�#�-!��)3%�#�-<"-�/>;<S�\T3"-T]B�7;�1!3��/ 6!2�<231�6U;231�6V7�"!�U;A F;A�F;A!V/ 6!2�<A1�5�<����6�U;�1!3��F��MY�<$��V7 6!2�<5�#!1UV7
W celu pobrania pliku konieczna jest
znajomość jego nazwy, typu, wielkości.
Wszystkie te dane zostaną pobrane z bazy
danych poprzez wykonanie zapytania,
w którym umieszczono instrukcje
��+��=>���>?, a następnie wywołanie
funkcji ���� �.
4. Określić nazwę pliku.
;1+�1 !"# /1+%�#-1UT�TF;A V7;��1<A"�1/T���3%�#�-!�T�;<S�\T3"-T]��T�T�;1+�1 !"# \�]7
Działanie powyższego kodu jest
podobne do funkcjonowania mechanizmu
nazewniczego zastosowanego w skrypcie
add_file.php, z tą różnicą, że w tym
przypadku dodano ścieżkę postaci
../uploads/. Przypisanie takiego łańcucha
zmiennej ułatwi odwoływanie się do pliku
w dalszej części skryptu.
Listing 11.9. Poprzez przesłanie do przeglądarki internetowej odpowiednich nagłówków skrypt
wymusza wykonanie operacji pobrania pliku
��:%�%@�"!�" (���0�-#' �#�-<A"�1�%�%*��M��# �%#H'��� �%#=�� "1%�"?3H!1�'1��%�H63X65"3A3 ?5P"�1�-1�UV��C"AU"!< 3 1�"5U;<S�\T3"-T]VV>���-1 �6A"?��#�%�"?33 "1!H5H# 1(# �!1�'1�H1�9,�123"�1<# 51UT��� 6!2�<5# 15��%�%TV7���#NK5H1 "1H=�HK-� 65��D8���#=�� "1" A#� �5P" ��1 ��%�"?3�0;231�6/�M���A"�1< � 1FA"�1<�6%1FA"�1<!"H1[)��3%�#�-!��)3%�#�-<"-/>;<S�\T3"-T]B�7��;�1!3��/ 6!2�<231�6U;231�6V7���"!�U;A F;A�F;A!V/ 6!2�<A1�5�<����6U;�1!3��F��MY�<$��V7�* 6!2�<5�#!1UV7��J� ? "W5"1%#NK5H1 "�H=�HK-� 65�������?�1L�1 "1 �H'6%�"?33 "1!H5H# 1(# �!1�'1�H1��C;1+�1 !"# /1+%�#-1UT�TF;A V7�9;��1<A"�1/T���3%�#�-!�T�;<S�\T3"-T]�T�T�;1+�1 !"# \�]7�,�D��M%��'-H1 "1F5H6%�"?"!� "1P1��8"AUA"�1<1+"!�!U;��1<A"�1VV>
Zarządza
nie plikami
Zarządzanie zawartością strony — przykład
415
5. Sprawdzić, czy plik istnieje na serwerze.
"AUA"�1<1+"!�!U;��1<A"�1VV>
Przed wysłaniem pliku do przeglądarki
internetowej należy upewnić się, czy istnieje.
Jeśli plik istnieje na serwerze, funkcja
'���*���� � zwróci wartość TRUE.
6. Wysłać plik.
�1�-1�U��# �1 ���6%1&�%%�"5��"# �;A��V7�1�-1�U��# �1 ��-"!%#!"�"# &����5� 1 �7�A"�1 � 1/;A �V7�1�-1�U��# �1 ���1 (��&;A!�V7�1�-A"�1U;��1<A"�1V7; 1!!�(1/T�%.��"?H#!��N'6!N� 6���%.T7
Wywołania funkcji #�� � powodują
przesłanie do przeglądarki pliku i utworzenie
okna dialogowego (rysunek 11.24). W oparciu
o typ MIME (zapisany w bazie danych po
umieszczeniu pliku na serwerze) pierwszy wiersz
ma za zadanie przygotowanie przeglądarki
do odebrania pliku. Drugi wiersz przy użyciu
oryginalnej nazwy pliku przechowywanego
na komputerze użytkownika określa nazwę
pobieranego pliku. Ostatnia funkcja #�� �
informuje o ilości przesyłanych danych.
Również ta informacja została ustalona
po umieszczeniu pliku na serwerze. Zawartość
pliku jest przesyłana przy użyciu funkcji
��'�� �, która po jego odczytaniu natychmiast
przekazuje zawartość strony do przeglądarki
internetowej.
Listing 11.9. Poprzez przesłanie do przeglądarki internetowej odpowiednich nagłówków skrypt
wymusza wykonanie operacji pobrania pliku — ciąg dalszy
�0���6!N� "1%�"?3�*��1�-1�U��# �1 ���6%1&�%%�"5��"# �;A��V7*��1�-1�U��# �1 ��-"!%#!"�"# &����5� 1 �7A"�1 � 1/;A �V7**�1�-1�U��# �1 ���1 (��&;A!�V7*��1�-A"�1U;��1<A"�1V7*C*9; 1!!�(1/T�%.��"?H#!��N'6!N� 6���%.T7*,*DB1�!1>����"? "1"!� "1P1�*8; 1!!�(1/T�%.�A# �5#�#�/��1-�.�- ��1H"1 "1%�"?3 �!1�'1�H1 "1=6N# #X�"'1���H1%��!H� 6H�H�"!� "�NK "1-#(#- #L^���A# �.��%.T7*0B����B1�!1>��$"1%��'"-N#'6"-1 �6A"?��#�%�"?33 "1!H5H# 1(# �!1�'1�H1��*��; 1!!�(1/T�%.�A# �5#�#�/��1-�.��#!HW'6=��^%#%��' 6%�"?H �P-3PK56!"W �!1�'1�H1���A# �.��%.T7�C�9B�,�D���!��'"1 "1�6�3N3!��# 6"-#NK5H1 "1 �(NO'?�������8;%�(1<�"��1/T�#="1�� "1%�"?3T7�0" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV7C�C�15�#; 1!!�(17C*C�" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7CC:.
Zarzą
dza
nie plik
ami
Rozdział 11.
416
7. Zakończyć instrukcje warunkowe.
B1�!1>; 1!!�(1/T�%.�A# �5#�#�/���1-�.�- ��1H"1 "1%�"?3 �!1�'1�H1� "1=6N# #X�"'1���H1%��!H� 6H��H�"!� "�NK "1-#(#- #L^���A# �.��%.T7BB1�!1>; 1!!�(1/T�%.�A# �5#�#�/��1-�.��#!HW�'6=��^%#%��' 6%�"?H �P-3PK56!"W� �!1�'1�H1���A# �.��%.T7B
8. Wprowadzić zawartość strony internetowej.
;%�(1<�"��1/T�#="1�� "1%�"?3T7" 5�3-1<# 51UT" 5�3-1!� �(�#'1?��� �TV715�#; 1!!�(17" 5�3-1<# 51UT" 5�3-1!�!�#%?���� �TV7:.
Tak naprawdę większość przeglądarek
internetowych nigdy nie wyświetli tych
informacji. Większość użytkowników
po kliknięciu odnośnika wywołującego
skrypt view_files.php zobaczy jedynie okno
dialogowe umożliwiające pobranie pliku.
Wykorzystanie powyższego kodu źródłowego
nie spowoduje obniżenia stopnia zabezpieczeń.
Dodatkowo kod zostanie zastosowany
w przypadku wystąpienia jakiegokolwiek
problemu.
9. Zapisać plik pod nazwą download_file.php,
umieścić go na serwerze WWW i przetestować
przy użyciu przeglądarki internetowej.
Wskazówki
� W języku PHP w wersji 4.3 nowością jest
funkcja �������������� � zwracająca typ
MIME dla pliku znajdującego się na serwerze.
� Przeglądarki internetowe w różny sposób
obsługują operację pobierania plików.
Z tego też powodu w celu sprawdzenia
zgodności uzyskiwanych wyników skrypt
podobny do powyższego powinien zostać
przetestowany w miarę możliwości na jak
największej liczbie przeglądarek i platform.
Rysunek 11.24. Kliknięcie odnośnika wywołującego
skrypt view_files.php powinno spowodować
wyświetlenie pokazanego okna dialogowego
Zarządza
nie plikami