php. programowanie

22
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. Programowanie Autor: Leon Atkinson T³umaczenie: Jaros³aw Dobrzañski ISBN: 83-7197-967-3 Tytu³ orygina³u: Core PHP Programming, 2E Format: B5, stron: 674 Ksi¹¿ka „PHP. Programowanie.” to praktyczny przewodnik po PHP4 dla programistów stron internetowych. Jeden z najlepszych programistów PHP — Leon Atkinson, uczy wszystkiego, co potrzebujesz, by stworzyæ dobr¹ i szybk¹ aplikacjê sieciow¹. Dok³adnie opisuje sk³adniê PHP i kluczowe elementy jêzyka. Atkinson przedstawia tak¿e najwa¿niejsze funkcje PHP, w tym funkcje wejcia-wyjcia, przetwarzania danych, matematyczne, daty, czasu, konfiguracji, funkcje umo¿liwiaj¹ce wspó³pracê z bazami danych, funkcje graficzne i sieciowe. Prezentuje on równie¿ dzia³anie PHP na przyk³adach realizuj¹cych sortowanie, przeszukiwanie, analizê ³añcuchów i inne zadania. Opisane zosta³y tak¿e praktyczne metody tworzenia i diagnostyki programów w PHP4. Ksi¹¿ka PHP. Programowanie zawiera: • Jasny i szczegó³owy opis sk³adni i funkcji PHP • Dok³adny opis integracji PHP z bazami danych • Techniki tworzenia i optymalizacji skryptów, pod k¹tem ich wydajnoci i ³atwej rozbudowy • Praktyczne techniki diagnostyczne, u³atwiaj¹ce znalezienie i poprawienie b³êdów

Upload: wydawnictwo-helion

Post on 02-Dec-2014

1.153 views

Category:

Documents


6 download

DESCRIPTION

Książka "PHP. Programowanie." to praktyczny przewodnik po PHP4 dla programistów stron internetowych. Jeden z najlepszych programistów PHP -- Leon Atkinson, uczy wszystkiego, co potrzebujesz, by stworzyć dobrą i szybką aplikację sieciową. Dokładnie opisuje składnię PHP i kluczowe elementy języka. Atkinson przedstawia także najważniejsze funkcje PHP, w tym funkcje wejścia-wyjścia, przetwarzania danych, matematyczne, daty, czasu, konfiguracji, funkcje umożliwiające współpracę z bazami danych, funkcje graficzne i sieciowe. Prezentuje on również działanie PHP na przykładach realizujących sortowanie, przeszukiwanie, analizę łańcuchów i inne zadania. Opisane zostały także praktyczne metody tworzenia i diagnostyki programów w PHP4.Książka PHP. Programowanie zawiera: * Jasny i szczegółowy opis składni i funkcji PHP * Dokładny opis integracji PHP z bazami danych * Techniki tworzenia i optymalizacji skryptów, pod kątem ich wydajności i łatwej rozbudowy * Praktyczne techniki diagnostyczne, ułatwiające znalezienie i poprawienie błędów

TRANSCRIPT

Page 1: PHP. Programowanie

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. Programowanie

Autor: Leon Atkinson

T³umaczenie: Jaros³aw Dobrzañski

ISBN: 83-7197-967-3

Tytu³ orygina³u: Core PHP Programming, 2E

Format: B5, stron: 674

Ksi¹¿ka „PHP. Programowanie.” to praktyczny przewodnik po PHP4 dla programistów

stron internetowych. Jeden z najlepszych programistów PHP — Leon Atkinson, uczy

wszystkiego, co potrzebujesz, by stworzyæ dobr¹ i szybk¹ aplikacjê sieciow¹. Dok³adnie

opisuje sk³adniê PHP i kluczowe elementy jêzyka. Atkinson przedstawia tak¿e

najwa¿niejsze funkcje PHP, w tym funkcje wej�cia-wyj�cia, przetwarzania danych,

matematyczne, daty, czasu, konfiguracji, funkcje umo¿liwiaj¹ce wspó³pracê z bazami

danych, funkcje graficzne i sieciowe. Prezentuje on równie¿ dzia³anie PHP na

przyk³adach realizuj¹cych sortowanie, przeszukiwanie, analizê ³añcuchów i inne

zadania. Opisane zosta³y tak¿e praktyczne metody tworzenia i diagnostyki programów

w PHP4.

Ksi¹¿ka PHP. Programowanie zawiera:

• Jasny i szczegó³owy opis sk³adni i funkcji PHP

• Dok³adny opis integracji PHP z bazami danych

• Techniki tworzenia i optymalizacji skryptów, pod k¹tem ich wydajno�ci i ³atwej

rozbudowy

• Praktyczne techniki diagnostyczne, u³atwiaj¹ce znalezienie i poprawienie b³êdów

Page 2: PHP. Programowanie

Spis treści

Słowo wstępne....................................................................................................................................... 9

Przedmowa ........................................................................................................................................... 11

Część I Programowanie w PHP......................................................................................13

Rozdział 1. Wprowadzenie do PHP .......................................................................................................15

Historia PHP............................................................................................................ 16Co sprawia, że PHP jest lepszy od innych języków? ..................................................... 18Interfejsy do systemów zewnętrznych......................................................................... 19Jak PHP współpracuje z serwerem sieciowym? ........................................................... 20Wymagania sprzętowe i programowe ......................................................................... 20Instalacja na Apache dla Uniksa................................................................................ 21Instalacja na IIS dla Windows 2000 .......................................................................... 23Edycja skryptów ....................................................................................................... 23Algorytmy ................................................................................................................ 24Jak wygląda skrypt PHP? .......................................................................................... 25Przechowywanie danych............................................................................................ 27Odbieranie informacji od użytkownika ........................................................................ 28Wybieranie pomiędzy alternatywami........................................................................... 30Powtarzanie sekwencji kodu...................................................................................... 31Podsumowanie ........................................................................................................ 32

Rozdział 2. Zmienne, operatory i wyrażenia.....................................................................................33

Identyfikatory........................................................................................................... 34Typy danych............................................................................................................. 34Tworzenie zmiennych i ich zakres działania ................................................................ 37Przyporządkowanie zmiennym wartości ...................................................................... 40Odczytywanie wartości zmiennych.............................................................................. 42Uwalnianie pamięci .................................................................................................. 42Stałe....................................................................................................................... 43Operatory ................................................................................................................ 44Operatory logiczne i relacyjne.................................................................................... 45Operatory bitowe...................................................................................................... 46Inne operatory ......................................................................................................... 47Operatory przyporządkowania .................................................................................... 49Wyrażenia ............................................................................................................... 50

Rozdział 3. Instrukcje sterujące ........................................................................................................53

Prawda i fałsz .......................................................................................................... 54Instrukcja if ............................................................................................................. 54Operator ?............................................................................................................... 56

Page 3: PHP. Programowanie

4 PHP. Programowanie

Instrukcja switch...................................................................................................... 57Pętle....................................................................................................................... 59Instrukcja while........................................................................................................ 59Instrukcja break....................................................................................................... 60Instrukcja continue................................................................................................... 61Instrukcja do…while................................................................................................. 62Instrukcja for ........................................................................................................... 63Instrukcja foreach .................................................................................................... 65exit, die i return ....................................................................................................... 65Obliczanie wyrażeń logicznych ................................................................................... 66

Rozdział 4. Funkcje ..............................................................................................................................67

Deklarowanie funkcji ................................................................................................ 67Instrukcja return ...................................................................................................... 68Zakres i instrukcja global.......................................................................................... 69Argumenty ............................................................................................................... 69Rekurencja .............................................................................................................. 72Dynamiczne wywołania funkcji................................................................................... 73

Rozdział 5. Tablice................................................................................................................................75

Tablice jednowymiarowe ........................................................................................... 75Indeksowanie tablic ................................................................................................. 77Inicjalizacja tablic..................................................................................................... 78Tablice wielowymiarowe............................................................................................ 79Formatowanie tablic ................................................................................................. 80Odwołania do tablic z wnętrza łańcucha ..................................................................... 81

Rozdział 6. Klasy i obiekty...................................................................................................................83

Definiowanie klasy ................................................................................................... 84Tworzenie obiektu .................................................................................................... 86Dostęp do metod i właściwości ................................................................................. 87

Rozdział 7. Operacje we/wy i dostęp do dysku ................................................................................89

Połączenia HTTP ...................................................................................................... 90Wysyłanie treści do przeglądarki................................................................................ 91Buforowanie na wyjściu ............................................................................................ 92Zmienne środowiskowe ............................................................................................ 93Pobieranie danych z formularzy ................................................................................. 94Cookies .................................................................................................................. 95Pobieranie plików od użytkownika.............................................................................. 96Wywołania metody PUT............................................................................................. 97Zapis do plików i ich odczytywanie............................................................................. 98Sesje ...................................................................................................................... 99Funkcje include i require......................................................................................... 102

Część II Funkcje PHP .................................................................................................... 105

Rozdział 8. Funkcje wejścia-wyjścia ............................................................................................... 107

Wysyłanie tekstu do przeglądarki............................................................................. 108Buforowanie wyjścia ............................................................................................... 110Pliki ...................................................................................................................... 111

Page 4: PHP. Programowanie

Spis treści 5

Pliki skompresowane ............................................................................................. 145POSIX ................................................................................................................... 151Diagnostyka .......................................................................................................... 157Obsługa sesji ........................................................................................................ 178Polecenia interpretera ............................................................................................ 181Nagłówki HTTP....................................................................................................... 183Sieć...................................................................................................................... 185FTP ....................................................................................................................... 190

Rozdział 9. Funkcje przetwarzania danych..................................................................................... 199

Typy danych, stałe i zmienne .................................................................................. 199Tablice.................................................................................................................. 205Mieszanie ............................................................................................................. 229Łańcuchy............................................................................................................... 232Kodowanie i dekodowanie ...................................................................................... 239Szyfrowanie ........................................................................................................... 260Wyrażenia regularne............................................................................................... 264Wyrażenia regularne zgodne z Perlem ...................................................................... 268

Rozdział 10. Funkcje matematyczne .................................................................................................273

Operacje matematyczne ......................................................................................... 273Liczby losowe ........................................................................................................ 281Liczby dowolnej precyzji .......................................................................................... 284

Rozdział 11. Funkcje daty, czasu i konfiguracji................................................................................287

Data i czas............................................................................................................ 287Niestandardowe kalendarze .................................................................................... 294Konfiguracja .......................................................................................................... 298

Rozdział 12. Funkcje graficzne..........................................................................................................305

Analizowanie obrazków........................................................................................... 306Tworzenie obrazków JPEG, PNG i WBMP................................................................... 307

Rozdział 13. Funkcje współpracujące z bazami danych .................................................................339

dBase................................................................................................................... 340Abstrakcyjna baza danych typu DBM........................................................................ 344filePro ................................................................................................................... 350Informix................................................................................................................. 352InterBase .............................................................................................................. 360mSQL ................................................................................................................... 366MySQL .................................................................................................................. 377ODBC.................................................................................................................... 392Oracle................................................................................................................... 403Postgres ............................................................................................................... 422Sybase ................................................................................................................. 432

Rozdział 14. Inne funkcje ................................................................................................................... 441

Apache ................................................................................................................. 442Aspell ................................................................................................................... 445COM ..................................................................................................................... 446Gettext.................................................................................................................. 448

Page 5: PHP. Programowanie

6 PHP. Programowanie

IMAP..................................................................................................................... 449Java...................................................................................................................... 470LDAP .................................................................................................................... 470Semafory .............................................................................................................. 481Pamięć wspólna..................................................................................................... 483SNMP ................................................................................................................... 486WDDX ................................................................................................................... 489XML...................................................................................................................... 492

Część III Algorytmy......................................................................................................505

Rozdział 15. Sortowanie, wyszukiwanie i liczby losowe ................................................................507

Sortowanie ............................................................................................................ 508Sortowanie bąbelkowe ........................................................................................... 509Algorytm Quicksort ................................................................................................. 511Wbudowane funkcje sortujące................................................................................. 512Sortowanie z funkcją porównującą ........................................................................... 516Wyszukiwanie ........................................................................................................ 519Indeksowanie ........................................................................................................ 519Liczby losowe ........................................................................................................ 523Identyfikatory losowe.............................................................................................. 525Losowanie banera reklamowego.............................................................................. 526

Rozdział 16. Analiza składni i łańcuchów..........................................................................................529

Podział łańcuchów.................................................................................................. 529Wyrażenia regularne............................................................................................... 531Definiowanie wyrażeń regularnych ........................................................................... 532Stosowanie wyrażeń regularnych w skryptach PHP...................................................... 533

Rozdział 17. Integracja z bazami danych ......................................................................................... 541

Tworzenie tabel HTML z zapytań SQL....................................................................... 542Śledzenie odwiedzających za pomocą identyfikatorów sesji ....................................... 546Przechowywanie danych w bazie.............................................................................. 550Warstwy abstrakcyjne baz danych............................................................................ 556

Rozdział 18. Sieć.................................................................................................................................557

Uwierzytelnianie w HTTP ......................................................................................... 557Sterowanie buforem przeglądarki ............................................................................ 559Ustawianie typu dokumentu.................................................................................... 561Poczta elektroniczna z załącznikami......................................................................... 563Weryfikacja adresu skrzynki pocztowej ..................................................................... 565

Rozdział 19. Generowanie grafiki .....................................................................................................569

Przyciski dynamiczne.............................................................................................. 570Generowanie grafiki „w locie” ................................................................................. 574Wykresy słupkowe.................................................................................................. 574Wykresy kołowe ..................................................................................................... 576Rozciąganie pojedynczych pikseli ............................................................................ 581

Page 6: PHP. Programowanie

Spis treści 7

Część IV Inżynieria oprogramowania........................................................................583

Rozdział 20. Integracja z HTML-em ..................................................................................................585

Umieszczanie fragmentów kodu PHP w dokumencie HTML ........................................ 585Używanie PHP do generowania całych dokumentów HTML ......................................... 589Separowanie HTML-u od PHP .................................................................................. 591Tworzenie pól <SELECT> ........................................................................................ 592Przesyłanie tablic w formularzach ............................................................................ 595

Rozdział 21. Projektowanie ...............................................................................................................597

Tworzenie specyfikacji wymagań.............................................................................. 598Tworzenie dokumentów projektowych....................................................................... 601Używanie CVS........................................................................................................ 602Modularyzacja za pomocą include ........................................................................... 603FreeEnergy ............................................................................................................ 604FastTemplate ........................................................................................................ 606Midgard ................................................................................................................ 606Ariadne ................................................................................................................. 607Bezpieczeństwo i ochrona danych ........................................................................... 607Ukrywanie ............................................................................................................. 608Adresy przyjazne wyszukiwarkom ............................................................................. 609Skrypty uruchamiane regularnie .............................................................................. 610

Rozdział 22. Efektywność i diagnostyka.......................................................................................... 613

Mierzenie wydajności ............................................................................................. 614Pobieranie wyników zapytania z bazy danych ............................................................ 615Kiedy przechowywać dane w bazie........................................................................... 616Diagnostyka bieżąca .............................................................................................. 617Diagnostyka zdalna ................................................................................................ 617Symulowanie połączeń HTTP................................................................................... 618

Dodatki .......................................................................................................................... 619

Dodatek A Kody z ukośnikiem ........................................................................................................... 621

Dodatek B Kody ASCII .........................................................................................................................623

Dodatek C Operatory .........................................................................................................................629

Dodatek D Znaczniki PHP ................................................................................................................... 631

Dodatek E Konfiguracja PHP w czasie kompilacji............................................................................633

Dodatek F Zasoby internetowe .........................................................................................................637

Dodatek G Przewodnik po stylach PHP.............................................................................................639

Skorowidz ..........................................................................................................................................643

Page 7: PHP. Programowanie

Integracja z bazami danych

W tym rozdziale:

� Tworzenie tabel HTML z zapytań SQL.

� Śledzenie odwiedzających za pomocą identyfikatorów sesji.

� Przechowywanie danych w bazie.

� Warstwy abstrakcyjne baz danych.

PHP ściśle współpracuje z wieloma bazami danych. Jeżeli wewnętrzna współpraca z określonąbazą nie istnieje, zawsze można skorzystać z ODBC, który jest standardem dla zewnętrz-nych sterowników baz danych. Regularnie pojawiają się moduły, umożliwiające współ-pracę z nowymi bazami danych. Programiści PHP twierdzą: „Dajcie nam do testowania swójprodukt, a stworzymy kod obsługujący go w PHP”.

MySQL jest niewątpliwie najbardziej popularną bazą danych wśród programistów PHP.Poza tym, że jest darmowa, nadaje się do zastosowań sieciowych z uwagi na dużą szybkość.W przykładach tu opisanych zakładam posiadanie bazy danych MySQL. Można ją pobraćz witryny MySQL pod adresem <http://www.mysql.com> i zainstalować w swoim systemielub pokusić się o dostosowanie opisanych tu przykładów do współpracy z inną bazą.

Większość relacyjnych baz danych używa strukturalnego języka zapytań (SQL). Jest to językczwartej generacji, co oznacza, że przypomina bardziej tekst w języku angielskim niż kodźródłowy w PHP. Omówienie samego SQL wykracza poza ramy tej książki. W przypadku zni-komej wiedzy na ten temat, radzę przeglądnąć listę materiałów wymienioną w dokumentacji nastronie domowej MySQL: <http://www.mysql.com/doc.html>. Alternatywą może być książka,taka jak Hands-On SQL Roberta Grotha i Davida Gerbera, wydana przez Prentice Hall.

Page 8: PHP. Programowanie

542 Część III � Algorytmy

Tworzenie tabel HTML z zapytań SQLJednym z prostszych zadań, jakie można wykonać za pomocą bazy danych i PHP, jest pobraniedanych z bazy i wyświetlenie ich w tabeli HTML. Tabela taka może zawierać np. listę towarówna sprzedaż, listę projektów, listę serwerów DNS i ich czasy reakcji. Na potrzeby przedstawio-nego tu przykładu wykorzystany zostanie pierwszy z tych przykładów. Załóżmy, że supermar-ket chce zamieścić na stronie internetowej listę towarów na sprzedaż. W tym celu trzeba stwo-rzyć stronę, która wyświetla zawartość bazy danych. Zostanie tu zastosowana baza ����,tworzona podczas instalacji MySQL. Skrypt PHP, przeglądający katalog produktów, będzieznajdował się na tym samym komputerze, na którym zainstalowany jest serwer bazy danych.

Pierwszym krokiem jest utworzenie tabeli. Listing 17.1 pokazuje kod SQL, tworzący prostątabelę, składającą się z trzech kolumn. Tabela nazywa się �������. Zawiera ona kolumnę,zwaną , która zawiera wartości całkowite, maksymalnie jedenastocyfrowe. Kolumna tanie może być pusta i nowym wierszom automatycznie będą przyporządkowywane kolejnewartości. Ostatni wiersz definicji określa jako klucz podstawowy. Powoduje to, że war-tości w tej kolumnie są traktowane jako indeksy i uniemożliwia dublowanie się kluczy. Pozo-stałe dwie kolumny to ���� i ����.

Listing 17.1. Tworzenie tabeli „katalog”

��������������� ����������������������������������������������������������������������������� !"�#�����$������������%�����&�'�&������(

���� to łańcuch znaków o zmiennej długości, maksymalnie do 32 znaków. ���� to liczbazmiennoprzecinkowa z sześcioma cyframi przed i dwoma po przecinku. Format ten nadajesię do zapisu cen.

Kolejnym krokiem jest umieszczenie elementów w tabeli. Jako że jest to tylko demonstracja,wprowadzimy tu parę przykładowych produktów, jakie można nabyć w supermarkecie wrazz wymyślonymi cenami. W tym celu użyta zostanie instrukcja �����. Listing 17.2 jestprzykładem opisanej procedury.

Listing 17.2. Wprowadzanie danych do tabeli „katalog”

��)����������� ���������!"�������)��*)� � �! �*���+,-�(��)����������� ���������!"�������)��*./�!01!"*��2+-3�(��)����������� ���������!"�������)��*%4��5 ��!0 �*��3+�-�(��)����������� ���������!"�������)��*�1 �5!"�64�6 �"*���+32�(��)����������� ���������!"�������)��*)�78 "*���+32�(��)����������� ���������!"�������)��*�5�6�*���+�3�(��)����������� ���������!"�������)��*�!� 5 /"�*���+32�(��)����������� ���������!"�������)��*9!�*��$+�3�(��)����������� ���������!"�������)��*�4�/��5 �� �/1*���+--�(��)����������� ���������!"�������)��*)� � �*���+�3�(

Page 9: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 543

Każda instrukcja SQL kończy się średnikiem, podobnie jak w PHP. Informujemy serwerMySQL, że chcemy wstawić wiersz do tabeli ������� i że podamy tylko nazwę produktu i cenę.Jako że pomijamy tu , MySQL stworzy go sam. Wynika to ze zdefiniowania tej kolumnyjako �������������. Słowo kluczowe ������ informuje serwer, że za chwilę zostaną prze-słane wartości opisane w poprzednim poleceniu. Wartości przesyłane są w apostrofach, zgodnieze standardem przyjętym w SQL.

Aby sprawdzić, czy operacja się powiodła, listing 17.1 wyświetla wartości, jakie otrzymaliby-śmy, wybierając wszystko z tabeli ������� z poziomu klienta MySQL. Realizuje to polecenie:

)������:�#������ �(

po wydaniu którego otrzymujemy:

�������������������������������������!"���������)� � �! ��������������������+,-���������./�!01!"���������������������2+-3���������%4��5 ��!0 ����������������3+�-;���������1 �5!"�64�6 �"��������������+323��������)�78 "�����������������������+32$���������5�6������������������������+�3,���������!� 5 /"���������������������+32<��������9!���������������������������$+�3-���������4�/��5 �� �/1�������������+--�2�������)� � �����������������������+�3�2�������/ �4�1"�4!���2+2��4! �

Ostatnim krokiem jest napisanie skryptu PHP, który pobiera zawartość tabeli i przekształca jąw tabelę HTML. Listing 17.3 przedstawia kod PHP, pobierający nazwy oraz ceny i wyświe-tlający je w tabeli HTML. Na początku należy połączyć się z serwerem bazy danych. Realizujeto funkcja ��������� ���. Pobiera ona nazwę hosta, nazwę użytkownika i hasło. Zwykletworzę w moich bazach MySQL użytkownika o nazwie !���" bez hasła. Ograniczam równieżtego użytkownika tylko do połączeń z lokalnego serwera. Jego nazwa jest taka sama, jaknazwa użytkownika UNIX, który wykonuje skrypty, czyli serwera sieciowego. Jeżeli wynaj-mujemy miejsce na serwerze, możemy mieć przyporządkowane inne nazwy użytkownikai bazy danych, co wymaga zmiany odpowiednich argumentów w przykładzie.

Rysunek 17.1.

Tworzenie tabeliHTML z wynikamizapytania

Page 10: PHP. Programowanie

544 Część III � Algorytmy

Listing 17.3. Tworzenie tabeli HTML z wynikami zapytania

=>��������??8 @A �!"1!���4!/�!/!7�1�48/�5�!"1!�� �6�41B�8 �1 5@ ��������1C�D�E50�1"�F�764G��8 ""! ��H� �I 4�H��HI��85H��HH�����������J����������������8/1"��H�1!�7 K"�8 @A �6L�41B���0�AD=��MN"H�(����������������8/1"��H9 O �!"1!�4/68�PD=��MN"H�(����������������!Q1���(��������R

��������??�60S/�0�6�5"6 I�1�48/�5�!"1!�/!�P���S�� 8!/ T1��������1C�D764G��4!�! ��50�H�!4�H��E50�1"����������J����������������8/1"��H�1!�7 K"��60/L�0�6��!4�D=��MN"H�(����������������8/1"��H9 O �!"1!�4/68�PD=��MN"H�(����������������!Q1���(��������R

��������??�8 0/"1!� @!T���/� U 1��0!�1��������EVP!/6�F�H)������������!"�H(��������EVP!/6�+F�H#����'�� ��H(��������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"�����������J����������������8/1"��H�1!�7 K"��6 "L��86�"1D=��MN"H�(����������������8/1"��H 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(����������������8/1"��H986�"1!W�EVP!/6=��MN"H�(����������������!Q1���(��������R

��������??8 �A�!��0!�1��������8/1"��H=������������FNH2NHMN"H�(

��������??P�� /�!"1!��1!/4��"�@S�S���������8/1"��H=��MN"H�(��������8/1"��H=����.�����FNHX������NHM=�M�/�6P@=?�M=?��MN"H�(��������8/1"��H=����.�����FNHX������NHM=�M�!"=?�M=?��MN"H�(��������8/1"��H=?��MN"H�(

��������??�8 0/"1!�K5!� ����1!/4�6���������I1�!�E50� ��F�764G��C!� I� 0T! ��E50�!4P������������J����������������8/1"��H=��MN"H�(

����������������8/1"��H=��ME50� �YM���=?��MN"H�(����������������8/1"��H=������.�FNH/1�I�NHME50� �YM�!"=?��MN"H�(

����������������8/1"��H=?��MN"H�(��������R

��������?? "1! ��0!�1��������8/1"��H=?�����MN"H�(>M

Jeżeli połączenie się powiodło, zwracany jest identyfikator łącza z MySQL. Jak widać, w tymsamym wierszu następuje nawiązanie połączenia i testowanie, czy operacja się powiodła.

Page 11: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 545

Identyfikatory łączy są zawsze większe od zera, a zero zwracane jest wtedy, gdy nie możnanawiązać połączenia. Dlatego też testowanie wystąpienia wartości #���� umożliwia wykrycienieudanego połączenia. W takim przypadku następuje po prostu opuszczenie skryptu.

Funkcja, za pomocą której łączymy się z bazą, to ��������� ���. Przeglądając opisy funkcjiMySQL w rozdziale 13., „Funkcje współpracujące z bazami danych”, można znaleźć równieżinną funkcję: �������� ���. Funkcje te działają identycznie w ramach skryptu, ale ��������� ��� nawiązuje trwałe połączenie z serwerem.

Większość funkcji współpracujących z bazami danych udostępnia możliwość tworzeniatrwałych połączeń — czyli takich, które nie zamykają się z chwilą zakończenia skryptu. Jeżeliten sam proces sieciowy uruchomi później inny skrypt, który łączy się z tym samym serwerembazy danych, wykorzystane będzie istniejące już połączenie. Dzięki temu można oszczędzićtrochę czasu. W praktyce oszczędności te nie są duże i wynikają ze sposobu, w jaki serwerApache 1.3x używa procesów potomnych, zamiast wątków. Procesy te obsługują pewnąliczbę wywołań, po czym są zastępowane przez nowe procesy. Po zakończeniu procesu zakoń-czone zostaje również trwałe połączenie.

Rzeczywisty zysk czasu, wynikający ze stosowania trwałych połączeń, pojawia się dopieroprzy dużych obciążeniach — w takich chwilach mogą one okazać się bardzo pomocne.Dlatego też domyślnie stosuję ��������� ���. W chwili pisania tej książki zbliża się momentpojawienia się Apache 2.0. Zapowiadane jest tam stosowanie wielowątkowego podejścia,co pozwoli zapewne w pełni wykorzystać zalety trwałych połączeń.

Następnym krokiem jest wybór bazy danych. Tutaj została wybrana baza �����. Po poinformo-waniu PHP, z której bazy należy korzystać, otrzymamy wszystkie wiersze z tabeli �������.Realizuje to funkcja �������$���. Wykonuje ona zapytanie na określonym łączu i zwracaidentyfikator wyniku. Identyfikator ten zostanie użyty do pobrania wyników zapytania.

Zanim rozpoczniemy pobieranie danych ze zbioru wyników, należy rozpocząć budowanietabeli HTML. Jak można się domyślić, w tym celu użyty został znacznik otwierający tabelę.Stworzony został wiersz nagłówków, z szarym tłem, a reszta właściwości tablicy pozostaładomyślna.

Po wyświetleniu wiersza nagłówków można pobrać każdy z wierszy ze zbioru wyników.Najszybciej działającą funkcją jest ������%���!��&'���. Każda z kolumn wyniku staje sięwłaściwością zwróconego obiektu. Nazwy kolumn stają się nazwami właściwości. Możnarównież zastosować funkcje ������%���!���( lub ������%���!������, które są równieefektywne. W większości przypadków stosowanie obiektów jest dla mnie bardziej czytelne.Należy unikać stosowania ���������$��, ponieważ funkcja ta wykonuje czasochłonną pro-cedurę przeszukiwania tablicy dwuwymiarowej.

Gdy nie ma już więcej wierszy do pobrania, funkcja zwraca #����. Aby wykorzystać to zacho-wanie, pobieranie pojedynczego wiersza jest realizowane w pętli (!���. Wiersz w tabeli HTMLjest tworzony poprzez wyświetlenie właściwości obiektu w odpowiednich jej polach. Po wy-świetleniu wszystkich wierszy tabela jest zamykana. Nie trzeba w tym miejscu zamykać połą-czenia z bazą danych, ponieważ PHP robi to automatycznie w chwili zakończenia skryptu.

Opisany przykład jest niezwykle prosty, ale dotyka większości istotnych kwestii dotyczącychwspółpracy z bazami danych. Ponieważ każdy z wierszy jest wyświetlany w pętli, wszystkie

Page 12: PHP. Programowanie

546 Część III � Algorytmy

wyglądają tak samo. Jeżeli dane ulegną zmianie, nie trzeba wprowadzać zmian w kodzie,który przekształca je w HTML. Można dowolnie zmieniać zawartość bazy danych.

Dobrym przykładem zastosowania tej techniki jest losowy generator nazw marek handlowych:<http://www.leonatkinson.com/random/>, który tworzy losowe nazwy z tabeli wyrazów prze-chowywanej w bazie MySQL, do której każdy może dodawać nowe słowa. Każde odświe-żenie strony generuje kolejne dziesięć nazw.

Śledzenie odwiedzającychza pomocą identyfikatorów sesji

Witryny sieciowe powoli przekształcają się w aplikacje sieciowe. Pojawia się tu problemzachowywania stanu. Podczas przechodzenia ze strony na stronę aplikacja musi pamiętać,kim jest użytkownik. Sieć jest anonimowa: przeglądarka łączy się z serwerem, pobiera paręplików i zamyka połączenie. Pięć minut później, gdy ponownie połączymy się ze stroną, processię powtarza. Mimo że informacje o logowaniu są przechowywane, serwer nas nie pamięta.Wszelkie dane, jakie podaliśmy o sobie trzy strony wcześniej, nawet jeżeli zostały zapisane,nie będą z nami kojarzone.

Wyobraźmy sobie kreator zamówień pizzy: pierwszy ekran pyta się, ile pizz chcemy zamówić;następnie przechodzimy do ekranów odpowiadających każdej z zamawianych pizz i wybie-ramy jej zawartość i rodzaj ciasta; na koniec kolejna strona pyta o nasze nazwisko i telefon,aby przesłać nasze zamówienie do najbliższej pizzerii realizującej dowóz. Jednym ze sposobówrozwiązania tego problemu jest stopniowe przekazywanie dotychczas gromadzonych infor-macji z każdym następnym przesłaniem danych z formularza użytkownika. W miarę przecho-dzenia ze strony na stronę liczba danych będzie rosła. Przekazujemy serwerowi wielokrotnieczęściowe dane o zamówieniu — metoda ta działa, ale wiąże się z przesyłaniem wielu nie-potrzebnych informacji.

Stosując bazę danych i identyfikator sesji, można gromadzić informacje w miarę ich przeka-zywania. Identyfikator staje się kluczem do informacji. Z chwilą gdy skrypt pobiera identy-fikator, przypomina sobie, co działo się wcześniej.

Inną kwestią jest sposób pobrania identyfikatora. Istnieją tu dwie możliwości. Pierwszą jestprzekazywanie identyfikatora jako zmiennej w każdym łączu i w każdym formularzu. W przy-padku formularza można to łatwo zrealizować za pomocą zmiennej ukrytej. W przypadkułącza należy wstawić znak zapytania i definicję zmiennej. Jeżeli założymy, że identyfikatorsesji jest przechowywany w zmiennej ������ , jego przesłanie na następną stronę mogłobymieć następującą formę:

8/1"��Z�����#FN[8�!�+8I8�>4!441 "FE4!441 "N[M"!Q�=?�M[�(

Metoda ta działa z wszystkim przeglądarkami, również z Lynx.

Drugim sposobem jest użycie cookies. Podobnie jak zmienne formularzy GET i POST, cookiessą zamieniane przez PHP na zmienne. Można więc utworzyć cookie o nazwie ������ .

Page 13: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 547

Różnica polegać będzie na tym, że cookies muszą być przesyłane w nagłówkach i należywysłać je, zanim przeglądarka otrzyma jakąkolwiek treść HTML. Warto w tym miejscu zaj-rzeć do opisu funkcji ��������� w rozdziale 8., „Funkcje wejścia-wyjścia”. Bardziej złożonastrategia polega na próbie zastosowania cookies i w przypadku niepowodzenia oparciu sięna zmiennych GET.

Obydwie metody są szeroko stosowane w Internecie. Wystarczy wejść w jakąkolwiek witrynęsklepu internetowego. Na potrzeby przykładu opisana tu zostanie strategia polegająca nazastosowaniu zmiennych GET. Pierwszym krokiem jest stworzenie tabeli przechowującejidentyfikatory sesji. Listing 17.4 przedstawia kod SQL, tworzący prostą tabelę ���'� w baziedanych MySQL.

Listing 17.4. Tworzenie tabeli przechowującej sesje

�������������4!4T��������������������<��������������������4��"1�8!/ T������������������%�����&�'�&������(

Kluczami w tabeli są 8-znakowe łańcuchy. Po każdym przejściu użytkownika na inną stronęodświeżana jest zawartość kolumny ����� ��������'�. W ten sposób możemy pozbyć sięwszelkich sesji, które wyglądają na nieużywane. Każda wizyta na stronie spowoduje usuwaniesesji bezczynnych przez 30 minut. Następnym krokiem jest sprawdzanie, czy użytkownikposiada identyfikator sesji. Jeżeli nie posiada, zostaje on utworzony. Jeżeli posiada, należysprawdzić, czy jest on prawidłowy.

Po pierwszym załadowaniu skryptu z listingu 17.5 tworzy on identyfikator sesji. Każdekliknięcie przycisku Odśwież w przeglądarce spowoduje sprawdzenie sesji przez skrypt. Jeżeliidentyfikator sesji nie znajduje się w tabeli ���'�, wówczas zostanie odrzucony i utworzonybędzie nowy. Można spróbować przesłać nieprawidłowy identyfikator, usuwając jakiś znakw pasku adresu przeglądarki.

Rysunek 17.2.

Sprawdzanieidentyfikatorasesji

Listing 17.5. Sprawdzanie identyfikatora sesji

=>��������?:��������::��!7 "4�/ T��4� 4 �"1�15!"�6C1� /S��4!4T1��������:?

��������CP" �1 "�)!441 "���E�!"��IF<�

Page 14: PHP. Programowanie

548 Część III � Algorytmy

��������J����������������??��4�" �1!"1!��/!4P�5 8P4� ��"6 I��"S�����������������E% ��F�H�����#.��\'����%V�)���]^&9H(����������������E% ��+F�H0 5!C�I1T�7" 8G/4�P_�Q6�H(����������������E�4��I/�F�4�/�!"�E% ���Y��(

����������������C /�E1�F�2(�E1�=�E�!"��I(�E1``�����������������J������������������������E415�+F�E% �a7��/"5�2��E�4��I/�b(����������������R

����������������/!�P/"�E415�(��������R

��������??�"1 T�1� T��!"!/� /��1 �0�� 4 �6 I��������7��4/"5��17!���(

��������??8 @A �!"1!���4!/�!/!7�1� "�/ ��8 � 5�!"1� 8!/ T1��������1C�D�E50�1"�F�764G��8 ""! ��H� �I 4�H��HC/!!�/5!H��HH�����������J����������������8/1"��H�1!�7 K"�8 @A �6L�41B���0�A�5"6 ID=��MN"H�(����������������8/1"��H9 O �!"1!�4/68�PD=��MN"H�(����������������!Q1���(��������R

��������??�60S/�0�6�5"6 I�1� "�/ ��8 � 5�!"1� 8!/ T1��������1C�D764G��4!�! ��50�H�!4�H��E50�1"����������J����������������8/1"��H�1!�7 K"��60/L�0�6��!4�D=��MN"H�(����������������8/1"��H9 O �!"1!�4/68�PD=��MN"H�(����������������!Q1���(��������R

��������??P4P"1B 1!��4�64�1 I�4�/6 I�4!4T1��������EVP!/6�F�H�������#����4!4T�H(��������EVP!/6�+F�H]������4��"1�8!/ T�=�*H(��������EVP!/6�+F�5�!�H&Y7Y5��W1W4H����17!��Y�2<22��(��������EVP!/6�+F�H*H(��������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"�����������J����������������??"1!�7 K"��6 "L��86�"1����������������8/1"��H�1!�7 K"�P4P"AL�4�/6 I�4!4T1D=��MN"H�(����������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(����������������!Q1���(��������R

��������??48/�5�!"1!�4!4T1��������1C�144!��E4!441 "����������J����������������??T!K!�1�776�4!4TB��"4�B8PT!�T!T�48/�5�!"1!����������������EVP!/6�F�H)������:�H(����������������EVP!/6�+F�H#����4!4T�H(����������������EVP!/6�+F�H]�������F*H�+�554�4I!4�E4!441 "��+�H*�H(

����������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"���

Page 15: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 549

����������������J������������������������??"1!�7 K"��6 "L��86�"1������������������������8/1"��H"1!�7 K"��6 "L��86�"1�5 ��0!�1�4!4TD=��MN"H�(������������������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(������������������������!Q1���(����������������R

����������������??T!K!�1���/S "6�� 4�@�T1U��1!/4���P5@ �41B� 5"�!cL�4!4TB����������������1C�764G��"P7/ �4�E50�!4P��������������������J������������������������??4!4T�14�"1!T!�� 5U�1!K!"1!� �4P� 4��"1!T� 8!/ T1������������������������EVP!/6�F�H�%�����4!4T�H(������������������������EVP!/6�+F�H)����4��"1�8!/ T�F�" ����H(������������������������EVP!/6�+F�H]�������F*E4!441 "*�H(������������������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"���������������������������J��������������������������������??"1!�7 K"��6 "L��86�"1��������������������������������8/1"��H�1!�7 K"� 5U�1!K6L��0!�1�4!4TD=��MN"H�(��������������������������������8/1"��H 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(��������������������������������!Q1���(������������������������R����������������R����������������!�4!����������������J������������������������??�@6�15!"�6C1� /������������������������8/1"��H�1!�""6�15!"�6C1� /�4!4T1��E4!441 "�D=��MN"H�(������������������������E4!441 "�F�HH(����������������R��������R

��������??T!K!�1�"1!�06@ �4!4T1��"�!K6�TA�P�� /�6L��������1C�E4!441 "�FF�HH���������J����������������??"1!�06@ �4!4T1�Y��� /� "�T!4��" �����������������E4!441 "�F�)!441 "���<�(

����������������??P71!4� �!"1!�4!4T1���0�1!�5"6 I����������������EVP!/6�F�H��)���������4!4T�H(����������������EVP!/6�+F�H�����)��*E4!441 "*��" �����H(����������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"�������������������J������������������������??"1!�7 K"��6 "L��86�"1������������������������8/1"��H�1!�7 K"��4��1L�!�!7!"�P�5 ��0!�1�4!4TD=��MN"H�(������������������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(������������������������!Q1���(����������������R��������R

��������8/1"��H��ST�15!"�6C1� /�4!4T1�� W�E4!441 "=��MN"H�(��������8/1"��H=�����#FNHE%�%�)��#>4!441 "FE4!441 "NHMH�(��������8/1"��H�5U�1!K�4�/ "BH�(��������8/1"��H=?�M=��MN"H�(>M

Page 16: PHP. Programowanie

550 Część III � Algorytmy

Kolejnym logicznym krokiem jest dodanie kolejnej tabeli, przechowującej informacje o osobieprzeglądającej witrynę. Jedna z kolumn powinna przechowywać identyfikator sesji z tabeli���'�. Dopisanie tego kodu może być dobrym ćwiczeniem.

Przechowywanie danych w bazieInformacja przechowywana w bazie danych nie ogranicza się do krótkich łańcuchów, jak32-znakowa nazwa towaru z listingu 17.3. Można też tworzyć duże, 64-kilobajtowe obiekty,które pomieszczą nawet kompletną stronę internetową. Zaletą jest fakt, że strony zawsze istniejąw bardzo uporządkowanym otoczeniu. Można je określić numerem, który wystarcza do ustale-nia zależności między stronami. Minusem jest niemożność załadowania strony istniejącejw bazie danych do swojego ulubionego edytora. Należy tu rozważyć zyski i straty — dlawiększości stron nie ma potrzeby przechowywania każdego ich elementu w bazie danych.

Przykładem sytuacji, kiedy umieszczenie zawartości strony w bazie danych jest zasadne, jestforum internetowe. System taki przechowuje wiadomości, które, oprócz tego, że są stronami,posiadają charakterystyki, takie jak: tytuł, data utworzenia i autor. Taka struktura może byćw prosty sposób odwzorowana w tabeli bazy danych. Co więcej, ponieważ każdej wiado-mości można nadać jednoznaczny identyfikator, można organizować wiadomości w formiedrzewa zależności. Użytkownik zostawia wiadomość, która rozpocznie wątek w dyskusji i spo-woduje pojawienie się nowych wiadomości do niego nawiązujących. Wiadomości możnawyświetlać w hierarchii wątków, co ułatwia ich przeglądanie.

Jak w każdym systemie opartym na bazie danych, pierwszy krok polega na stworzeniu tabeli.W listingu 17.6 utworzona zostaje tabela do przechowywania wiadomości. Każda wiadomośćma tytuł, nazwę nadawcy, czas wysłania, wiadomość nadrzędną i treść. Identyfikator wia-domości nadrzędnej może wynosić zero, co oznacza, że wiadomość inicjuje nowy wątek.Treścią wiadomości nie musi być zwykły tekst, może nią być również kod HTML. Tym sposo-bem użytkownicy mają możliwość tworzenia w bazie stron za pomocą własnych przeglądarek.

Listing 17.6. Tworzenie tabeli przechowującej wiadomości

�������������]15 7 4 �������������������������������������������������!7����������$;�����������5� ���������$;����������)�� /� " ������������������%/� 5!��������������/!4 ��������������%�����&�'�&�����(

Skrypt z listingu 17.7 ma dwa tryby pracy: listowanie tytułów wiadomości i przeglądaniepojedynczej wiadomości. Jeżeli zmienna ������� jest pusta, wówczas ukazana zostaje listawszystkich wiadomości w systemie, zorganizowanych według wątków. Realizuje to funkcja�!�(��������. W tym miejscu warto powrócić do fragmentu rozdziału 4., „Funkcje”, gdzieopisana jest rekurencja. Funkcja �!�(������� korzysta z rekurencji przy przeglądaniu każdej

Page 17: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 551

z gałęzi drzewa wiadomości. Na początku pobiera listę wszystkich wiadomości, które niemają wiadomości nadrzędnych. Są to początki wątków. Po ukazaniu wszystkich wiadomo-ści inicjujących wątki �!�(������� jest wywoływana dla danego wątku. Proces powtarzasię do momentu odnalezienia wiadomości, która nie posiada wiadomości potomnych. Dowyświetlenia tytułów wiadomości wykorzystano znaczniki ��. Wcięcia pomagają odwzo-rować na ekranie hierarchię wiadomości.

Rysunek 17.3.

Lista wiadomościforum

Listing 17.7. Proste forum

=>��������8/1"��H=��M# /P7��! "=?��MN"H�(

��������??8 @A �!"1!���4!/�!/!7�1�48/�5�!"1!�� �6�41B�8 �1 5@ ��������1C�D�E50�1"�F�764G��8 ""! ��H� �I 4�H��HI��85H��HH�����������J����������������8/1"��H�1!�7 K"�8 @A �6L�41B���0�A�5"6 ID=��MN"H�(����������������8/1"��H9 O �!"1!�4/68�PD=��MN"H�(����������������!Q1���(��������R

��������??�60S/�0�6�5"6 I�1�48/�5�"1!�8 � 5�!"1� 8!/ T1��������1C�D764G��4!�! ��50�H�!4�H��E50�1"����������J����������������8/1"��H�1!�7 K"��60/L�0�6��!4�D=��MN"H�(����������������8/1"��H�0 /�1"�D=��MN"H�(����������������!Q1���(��������R

��������?:��������::�/!P/!" 6T"�CP" T��6U�1!��TA ��������::��4�64�1!��15 7 U 1���5"!� ��/!4P��������:?

Page 18: PHP. Programowanie

552 Część III � Algorytmy

Rysunek 17.4.

Wiadomośćz forum

��������CP" �1 "�4I ��!44�!4�E8/!"������������J������������������ 0��E50�1"(

����������������E5�!� �4!�F���!�H�H�(

����������������8/1"��H=��MN"H�(

����������������EVP!/6�F�H)�����������!7���)�� /� " �H(����������������EVP!/6�+F�H#����]15 7 4 �H(����������������EVP!/6�+F�H]�����%/!"�FE8/!"����H(����������������EVP!/6�+F�H�������&�)�� /� " �H(

����������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"�������������������J������������������������??"1!�7 K"��6 "L��86�"1������������������������8/1"��H�1!�7 K"��6 "L��86�"1�5 ��0!�1�]15 7 ULD=��MN"H�(������������������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(������������������������!Q1���(����������������R

�����������������I1�!�E/ ��F�764G��C!� I� 0T! ��E50�!4P��������������������J������������������������??P�"1!��!7�P��15 7 U 1���C /71!� 5" U"1�5 �T!T��/!U 1������������������������8/1"��H=��M�E/ �YM)�� /� " ��=�����#FNHH�(������������������������8/1"��HE%�%�)��#>7!44�!��FE/ �YM��NHMH�(������������������������8/1"��HE/ �YM�!7�=?�M=��MN"H�(

Page 19: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 553

������������������������??P�"1!��15 7 U 1�8 � 7"6 I������������������������4I ��!44�!4�E/ �YM���(����������������R

����������������8/1"��H=?��MN"H�(��������R

��������?:��������::��6U�1!��!"1!�C /7P�/��5 �5 5�"1��15 7 U 1��������::���5"67�15!"�6C1� /!7�8/� 5��������:?��������CP" �1 "�8 4�# /7�E8/!"�����EP4!�1��!���������J����������������8/1"��H=#����������FNHE%�%�)��#NH�������FNH8 4�NHMN"H�(

����������������8/1"��H=��%����&%�FNHI155!"NH�����FNH1"8P�%/!"�NH�H�(����������������8/1"��H�����FNHE8/!"���NHMN"H�(

����������������8/1"��H=��%����&%�FNHI155!"NH�����FNH������NH�H�(����������������8/1"��H�����FNH%�)�NHMN"H�(

����������������8/1"��H=������������FNH�NH�����)%����.FNH2NH�H�(����������������8/1"��H����%�����.FNH3NH�]����FNH;22NHMN"H�(

����������������8/1"��H=��MN"H�(

����������������8/1"��H=���]����FNH�22NHM=�M�!7�=?�M=?��MN"H�(

����������������8/1"��H=���]����FNH�22NHMH�(����������������8/1"��H=��%����&%�FNH�!Q�NH�����FNH1"8P��1��!NH�H�(����������������8/1"��H)�9�FNH�3NH���^���.��FNH$;NH������FNHEP4!�1��!NHMH�(����������������8/1"��H=?��MN"H�(

����������������8/1"��H=?��MN"H�(

����������������8/1"��H=��MN"H�(

����������������8/1"��H=���]����FNH�22NHM=�M�5� =?�M=?��MN"H�(

����������������8/1"��H=���]����FNH�22NHMH�(����������������8/1"��H=��%����&%�FNH�!Q�NH�����FNH1"8P�% 4�!/NH�H�(����������������8/1"��H)�9�FNH�3NH���^���.��FNH$;NHMH�(����������������8/1"��H=?��MN"H�(

����������������8/1"��H=?��MN"H�(

����������������8/1"��H=��MN"H�(

����������������8/1"��H=������)%��FNH�NH�]����FNH;22NHMH�(����������������8/1"��H=��^����������FNH1"8P�� 56NH�H�(����������������8/1"��H���)FNH;3NH���])FNH3NHM=?��^�����MH�(����������������8/1"��H=?��MN"H�(

����������������8/1"��H=?��MN"H�(

����������������8/1"��H=��MN"H�(

Page 20: PHP. Programowanie

554 Część III � Algorytmy

����������������8/1"��H=������)%��FNH�NH�]����FNH;22NH����.�FNH7155�!NHMH�(����������������8/1"��H=��%����&%�FNH4P071�NH������FNH]6U�1TNHMH�(����������������8/1"��H=?��MN"H�(

����������������8/1"��H=?��MN"H�(

����������������8/1"��H=?�����MN"H�(����������������8/1"��H=?#���MN"H�(��������R

��������?:��������::��6 "PT!� 8!/ T!��������:?��������1C�E�������DF�HH���������J����������������1C�E�������FF�H%�)�H�����������������J������������������������EVP!/6�F�H��)���������]15 7 4 �H(������������������������EVP!/6�+F�H�����)�2�H(������������������������EVP!/6�+F�H*H�+�554�4I!4�E1"8P��1��!��+�H*��H(������������������������EVP!/6�+F�H*H�+�554�4I!4�E1"8P�% 4�!/��+�H*��H(������������������������EVP!/6�+F�H" �����E1"8P�%/!"���H(������������������������EVP!/6�+F�H*H�+�554�4I!4�E1"8P�� 56��+�H*�H(

������������������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"���������������������������J��������������������������������??"1!�7 K"��6 "L��86�"1��������������������������������8/1"��H�1!�7 K"��4��1L�!�!7!"�P�5 ��0!�1���������������������������������]15 7 ULD=��MN"H�(��������������������������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(��������������������������������!Q1���(������������������������R����������������R

��������R

��������?:��������::�]6U�1!��!"1!��15 7 U 1��P0��14�6��15 7 U 1��������:?��������1C�E7!44�!���M�2���������J����������������EVP!/6�F�H)�����������!7����5� ��)�� /� " ��%/� 5!���/!4 �H(����������������EVP!/6�+F�H#����]15 7 4 �H(����������������EVP!/6�+F�H]�������FE7!44�!���H(

����������������1C�D�E50�!4P���F�764G��GP!/6�EVP!/6��E50�1"�������������������J������������������������??"1!�7 K"��6 "L��86�"1������������������������8/1"��H�1!�7 K"��6 "L��86�"1�5 ��0!�1�]15 7 ULD=��MN"H�(������������������������8/1"��H' 7P"1���6)V�W�H�+�764G��!// /���+�H=��MN"H�(������������������������!Q1���(����������������R

����������������1C�E/ ��F�764G��C!� I� 0T! ��E50�!4P��������������������J������������������������8/1"��H=������������FNH�NH�����)%����.FNH2NH�H�(������������������������8/1"��H����%�����.FNH3NH�]����FNH;22NHMN"H�(

Page 21: PHP. Programowanie

Rozdział 17. � Integracja z bazami danych 555

������������������������8/1"��H=��MH�(������������������������8/1"��H=���]����FNH�22NHM=�M�!7�=?�M=?��MH�(������������������������8/1"��H=���]����FNH�22NHME/ �YM�1��!=?��MH�(������������������������8/1"��H=?��MN"H�(

������������������������8/1"��H=��MH�(������������������������8/1"��H=���]����FNH�22NHM=�M�5� =?�M=?��MH�(������������������������8/1"��H=���]����FNH�22NHME/ �YM% 4�!/=?��MH�(������������������������8/1"��H=?��MN"H�(

������������������������8/1"��H=��MH�(������������������������8/1"��H=���]����FNH�22NHM=�M]64�" =?�M=?��MH�(������������������������8/1"��H=���]����FNH�22NHME/ �YM)�� /� " =?��MH�(������������������������8/1"��H=?��MN"H�(

������������������������8/1"��H=��MH�(������������������������8/1"��H=������)%��FNH�NH�]����FNH;22NHMH�(������������������������8/1"��HE/ �YM�/!4 H�(������������������������8/1"��H=?��MH�(������������������������8/1"��H=?��MN"H�(

������������������������8/1"��H=?�����MN"H�(

������������������������8 4�# /7�E/ �YM����H��W�E/ �YM�!7�H�(

����������������R

����������������8/1"��H=�����#FNHE%�%�)��#NHM�14���15 7 U 1=?�M=��MN"H�(

��������R��������!�4!��������J����������������8/1"��H=��M�14���15 7 U 1=?��MN"H�(

����������������??�8 0/"1!� @!T��14�6����������������4I ��!44�!4�2�(

����������������8 4�# /7�2��HH�(

��������R>M

Z punktu widzenia efektywności, zastosowanie rekurencji nie jest optymalne. Każdy wątekpowoduje kolejne wywołanie �!�(�������, z czym wiąże się następne zapytanie do bazy da-nych. Istnieje sposób na jednokrotne przesłanie zapytania i przeglądanie drzewa przechowy-wanego w pamięci — realizację tego pomysłu pozostawiam jako ćwiczenie dla Czytelnika.

Gdy użytkownik kliknie tytuł wiadomości, strona zostaje ponownie załadowana z ustawio-nym �������. Powoduje to, że skrypt przełącza się na tryb wyświetlania pojedynczychwiadomości. Pola wiadomości zostają wyświetlone w tabeli. Jeżeli wiadomość zawiera jaki-kolwiek kod HTML, zostanie on zinterpretowany przez przeglądarkę, ponieważ nie następujetu żadna filtracja znaczników. Ograniczenie to znajduje zastosowanie w kodzie dodającymnowe wiadomości.

Page 22: PHP. Programowanie

556 Część III � Algorytmy

W każdym z dwóch trybów pracy ukazywany jest formularz do dodawania wiadomości. Jeżeliwiadomość została dodana w chwili wyświetlania listy, zostanie uznana za początek nowegowątku. Jeżeli zaś wiadomość dodana została podczas przeglądania innej wiadomości, uznanazostanie za odpowiedź na tę wiadomość i nowa wiadomość będzie potomkiem przeglądanejwiadomości.

Przedstawione tu forum jest proste, ale zawiera podstawowe elementy funkcjonalne takiegosystemu. Bardziej wyrafinowanym rozwiązaniem byłoby umożliwienie dodawania wiadomościtylko przez uwierzytelnionych użytkowników lub nieudostępnianie wiadomości na forumdo momentu ich akceptacji przez moderatora. Struktury tej można użyć do budowy dowol-nej aplikacji, która zarządza danymi przesłanymi przez użytkownika, chociażby księgi gości.Jeżeli szukamy bardziej wyrafinowanej implementacji forum internetowego, można zajrzećdo witryny projektu Phorum Briana Moona pod adresem <http://www.phorum.org>.

Warstwy abstrakcyjne baz danychWyobraźmy sobie, że podczas tworzenia aplikacji sieciowej, wykorzystującej MySQL, zostali-śmy poproszeni o zmianę bazy danych na Oracle. Każda z funkcji PHP jest inna dla tychdwóch baz i musielibyśmy zmienić każdą z nich. Dodatkowo Oracle i MySQL używająnieco odmiennego SQL, co wymagałoby zapewne zmiany większości zapytań. Rozwiąza-niem tego problemu jest zastosowanie warstwy abstrakcyjnej. Pozwala to na oddzieleniesposobu działania aplikacji od kodu komunikującego się z bazą danych. Pojedyncza funk-cja wywołuje tu odpowiednią funkcję w zależności od typu bazy, z jaką się komunikujemy.

Jedną z najbardziej popularnych warstw abstrakcyjnych baz danych stanowi fragmentbiblioteki PHP Base Library <http://phplib.netuse.de>. Biblioteka ta zawiera również koddo zarządzania sesjami. Inną warstwą abstrakcyjną jest Metabase, dostępna pod adresem:<http://phpclasses.upperdesign.com>.

Niezależnie od warstw abstrakcyjnych, niezgodności między bazami powodują stałe powsta-wanie nowych rozwiązań. MySQL używa specjalnego kwalifikatora do opisu kolumn, zwanego�������������. Powoduje on automatyczne wypełnianie kolumn liczbami całkowitymiw kolejności rosnącej. W Oracle można to w przybliżeniu z realizować za pomocą sekwencji(SEQUENCE) i wyzwalacza (TRIGGER). Wszystkie te różnice trudno systematycznie godzić.W 1999 r. Scott Ambler zaproponował rozwiązanie w swojej publikacji The Design of aRobust Persistence Layer for Relational Databases, <http://www.ambysoft.com/persistenceLa-yer.html>. Zawarł tam dogłębną analizę problemu, wraz ze szczegółowymi rozwiązaniami,jednak nie oddaję im sprawiedliwości w kontekście tego rozdziału.

Warstwy abstrakcyjne udostępniają pewność kosztem pewnej utraty efektywności. Część roz-wiązań poprawiających efektywność w danej bazie danych musi zostać pominięta. Warstwaabstrakcyjna udostępnia zwykle podstawowy zestaw funkcji bazy danych. Zysk polega tuna uniezależnieniu się od jednego typu bazy.