45
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE PHP i MySQL. Dynamiczne strony WWW. Szybki start Autor: 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. Jeli chcesz w krótkim czasie nauczyæ siê tworzyæ takie aplikacje, znalaz³e w³aciw¹ 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. Jeli 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.

PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 1: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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.

Page 2: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 3: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 4: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 5: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 6: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 7: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 8: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 9: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 10: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 11: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 12: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 13: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 14: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 15: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 16: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 17: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 18: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 19: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 20: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 21: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 22: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 23: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 24: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 25: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 26: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 27: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 28: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 29: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 30: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 31: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 32: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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.

Page 33: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 34: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 35: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 36: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 37: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 38: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 39: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 40: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 41: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 42: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 43: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 44: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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

Page 45: PHP i MySQL. Dynamiczne strony WWW. Szybki start

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