Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00213 007795 10476797 na godz. na dobę w sumie
PHP. Programowanie - książka
PHP. Programowanie - książka
Autor: Liczba stron: 680
Wydawca: Helion Język publikacji: polski
ISBN: 83-7197-967-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).
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:

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI PHP. Programowanie KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE 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 Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Spis treści Słowo wstępne...................................................n...................................................n............ ..................... 9 Przedmowa ...................................................n...................................................n................ ..................... 11 Część I Programowanie w PHP........................o...................................................o...........13 Rozdział 1. Wprowadzenie do PHP ...................................................n....................................................15 Historia PHP .............................................................................................................. 16 Co sprawia, że PHP jest lepszy od innych języków? ...................................................... 18 Interfejsy do systemów zewnętrznych.......................................................................... 19 Jak PHP współpracuje z serwerem sieciowym? ............................................................ 20 Wymagania sprzętowe i programowe .......................................................................... 20 Instalacja na Apache dla Uniksa................................................................................. 21 Instalacja na IIS dla Windows 2000 ........................................................................... 23 Edycja skryptów ......................................................................................................... 23 Algorytmy .................................................................................................................. 24 Jak wygląda skrypt PHP? ........................................................................................... 25 Przechowywanie danych............................................................................................. 27 Odbieranie informacji od użytkownika ......................................................................... 28 Wybieranie pomiędzy alternatywami............................................................................ 30 Powtarzanie sekwencji kodu....................................................................................... 31 Podsumowanie .......................................................................................................... 32 Rozdział 2. Zmienne, operatory i wyrażenia...................................................n..................................33 Identyfikatory............................................................................................................. 34 Typy danych............................................................................................................... 34 Tworzenie zmiennych i ich zakres działania ................................................................. 37 Przyporządkowanie zmiennym wartości ....................................................................... 40 Odczytywanie wartości zmiennych............................................................................... 42 Uwalnianie pamięci ................................................................................................... 42 Stałe......................................................................................................................... 43 Operatory .................................................................................................................. 44 Operatory logiczne i relacyjne..................................................................................... 45 Operatory bitowe........................................................................................................ 46 Inne operatory ........................................................................................................... 47 Operatory przyporządkowania ..................................................................................... 49 Wyrażenia ................................................................................................................. 50 Rozdział 3. Instrukcje sterujące ...................................................n.....................................................53 Prawda i fałsz ............................................................................................................ 54 Instrukcja if ............................................................................................................... 54 Operator ?................................................................................................................. 56 4 PHP. Programowanie Instrukcja switch........................................................................................................ 57 Pętle......................................................................................................................... 59 Instrukcja while.......................................................................................................... 59 Instrukcja break......................................................................................................... 60 Instrukcja continue.................................................................................................... 61 Instrukcja do…while.................................................................................................. 62 Instrukcja for ............................................................................................................. 63 Instrukcja foreach ..................................................................................................... 65 exit, die i return ......................................................................................................... 65 Obliczanie wyrażeń logicznych .................................................................................... 66 Rozdział 4. Funkcje ...................................................n...................................................n........................67 Deklarowanie funkcji ................................................................................................. 67 Instrukcja return ........................................................................................................ 68 Zakres i instrukcja global........................................................................................... 69 Argumenty ................................................................................................................. 69 Rekurencja ................................................................................................................ 72 Dynamiczne wywołania funkcji.................................................................................... 73 Rozdział 5. Tablice...................................n...................................................n..........................................75 Tablice jednowymiarowe ............................................................................................ 75 Indeksowanie tablic .................................................................................................. 77 Inicjalizacja tablic...................................................................................................... 78 Tablice wielowymiarowe............................................................................................. 79 Formatowanie tablic .................................................................................................. 80 Odwołania do tablic z wnętrza łańcucha ...................................................................... 81 Rozdział 6. Klasy i obiekty...................................................n................................................................83 Definiowanie klasy .................................................................................................... 84 Tworzenie obiektu ..................................................................................................... 86 Dostęp do metod i właściwości .................................................................................. 87 Rozdział 7. Operacje we/wy i dostęp do dysku ...................................................n.............................89 Połączenia HTTP ........................................................................................................ 90 Wysyłanie treści do przeglądarki................................................................................. 91 Buforowanie na wyjściu ............................................................................................. 92 Zmienne środowiskowe ............................................................................................. 93 Pobieranie danych z formularzy .................................................................................. 94 Cookies .................................................................................................................... 95 Pobieranie plików od użytkownika............................................................................... 96 Wywołania metody PUT.............................................................................................. 97 Zapis do plików i ich odczytywanie.............................................................................. 98 Sesje ........................................................................................................................ 99 Funkcje include i require.......................................................................................... 102 Część II Funkcje PHP ...................................................o................................................. 105 Rozdział 8. Funkcje wejścia-wyjścia ...................................................n............................................ 107 Wysyłanie tekstu do przeglądarki.............................................................................. 108 Buforowanie wyjścia ................................................................................................ 110 Pliki ........................................................................................................................ 111 Spis treści 5 Pliki skompresowane .............................................................................................. 145 POSIX ..................................................................................................................... 151 Diagnostyka ............................................................................................................ 157 Obsługa sesji .......................................................................................................... 178 Polecenia interpretera ............................................................................................. 181 Nagłówki HTTP......................................................................................................... 183 Sieć........................................................................................................................ 185 FTP ......................................................................................................................... 190 Rozdział 9. Funkcje przetwarzania danych...................................................n.................................. 199 Typy danych, stałe i zmienne ................................................................................... 199 Tablice.................................................................................................................... 205 Mieszanie ............................................................................................................... 229 Łańcuchy................................................................................................................. 232 Kodowanie i dekodowanie ....................................................................................... 239 Szyfrowanie ............................................................................................................. 260 Wyrażenia regularne ................................................................................................ 264 Wyrażenia regularne zgodne z Perlem ....................................................................... 268 Rozdział 10. Funkcje matematyczne...................................................n..............................................273 Operacje matematyczne .......................................................................................... 273 Liczby losowe .......................................................................................................... 281 Liczby dowolnej precyzji ........................................................................................... 284 Rozdział 11. Funkcje daty, czasu i konfiguracji...................................................n.............................287 Data i czas .............................................................................................................. 287 Niestandardowe kalendarze ..................................................................................... 294 Konfiguracja ............................................................................................................ 298 Rozdział 12. Funkcje graficzne..........................n...................................................n.............................305 Analizowanie obrazków ............................................................................................ 306 Tworzenie obrazków JPEG, PNG i WBMP.................................................................... 307 Rozdział 13. Funkcje współpracujące z bazami danych ...................................................n..............339 dBase ..................................................................................................................... 340 Abstrakcyjna baza danych typu DBM......................................................................... 344 filePro ..................................................................................................................... 350 Informix................................................................................................................... 352 InterBase ................................................................................................................ 360 mSQL ..................................................................................................................... 366 MySQL .................................................................................................................... 377 ODBC...................................................................................................................... 392 Oracle..................................................................................................................... 403 Postgres ................................................................................................................. 422 Sybase ................................................................................................................... 432 Rozdział 14. Inne funkcje ...................................................n...................................................n............. 441 Apache ................................................................................................................... 442 Aspell ..................................................................................................................... 445 COM ....................................................................................................................... 446 Gettext.................................................................................................................... 448 6 PHP. Programowanie IMAP....................................................................................................................... 449 Java........................................................................................................................ 470 LDAP ...................................................................................................................... 470 Semafory ................................................................................................................ 481 Pamięć wspólna...................................................................................................... 483 SNMP ..................................................................................................................... 486 WDDX ..................................................................................................................... 489 XML ........................................................................................................................ 492 Część III Algorytmy...................................................o...................................................o505 Rozdział 15. Sortowanie, wyszukiwanie i liczby losowe ...................................................n.............507 Sortowanie .............................................................................................................. 508 Sortowanie bąbelkowe ............................................................................................ 509 Algorytm Quicksort .................................................................................................. 511 Wbudowane funkcje sortujące.................................................................................. 512 Sortowanie z funkcją porównującą ............................................................................ 516 Wyszukiwanie .......................................................................................................... 519 Indeksowanie .......................................................................................................... 519 Liczby losowe .......................................................................................................... 523 Identyfikatory losowe............................................................................................... 525 Losowanie banera reklamowego............................................................................... 526 Rozdział 16. Analiza składni i łańcuchów..................n...................................................n.....................529 Podział łańcuchów................................................................................................... 529 Wyrażenia regularne ................................................................................................ 531 Definiowanie wyrażeń regularnych ............................................................................ 532 Stosowanie wyrażeń regularnych w skryptach PHP....................................................... 533 Rozdział 17. Integracja z bazami danych ...................................................n...................................... 541 Tworzenie tabel HTML z zapytań SQL........................................................................ 542 Śledzenie odwiedzających za pomocą identyfikatorów sesji ....................................... 546 Przechowywanie danych w bazie............................................................................... 550 Warstwy abstrakcyjne baz danych............................................................................. 556 Rozdział 18. Sieć...................................................n...................................................n........ ...................557 Uwierzytelnianie w HTTP .......................................................................................... 557 Sterowanie buforem przeglądarki ............................................................................. 559 Ustawianie typu dokumentu..................................................................................... 561 Poczta elektroniczna z załącznikami.......................................................................... 563 Weryfikacja adresu skrzynki pocztowej ...................................................................... 565 Rozdział 19. Generowanie grafiki ...................................................n..................................................569 Przyciski dynamiczne............................................................................................... 570 Generowanie grafiki „w locie” .................................................................................. 574 Wykresy słupkowe................................................................................................... 574 Wykresy kołowe ...................................................................................................... 576 Rozciąganie pojedynczych pikseli ............................................................................. 581 Spis treści 7 Część IV Inżynieria oprogramowania...................................................o.....................583 Rozdział 20. Integracja z HTML-em ...................................................n...............................................585 Umieszczanie fragmentów kodu PHP w dokumencie HTML ........................................ 585 Używanie PHP do generowania całych dokumentów HTML ......................................... 589 Separowanie HTML-u od PHP ................................................................................... 591 Tworzenie pól SELECT ......................................................................................... 592 Przesyłanie tablic w formularzach ............................................................................. 595 Rozdział 21. Projektowanie ...................................................n............................................................597 Tworzenie specyfikacji wymagań............................................................................... 598 Tworzenie dokumentów projektowych........................................................................ 601 Używanie CVS.......................................................................................................... 602 Modularyzacja za pomocą include ............................................................................ 603 FreeEnergy .............................................................................................................. 604 FastTemplate .......................................................................................................... 606 Midgard .................................................................................................................. 606 Ariadne ................................................................................................................... 607 Bezpieczeństwo i ochrona danych ............................................................................ 607 Ukrywanie ............................................................................................................... 608 Adresy przyjazne wyszukiwarkom .............................................................................. 609 Skrypty uruchamiane regularnie ............................................................................... 610 Rozdział 22. Efektywność i diagnostyka...................................................n....................................... 613 Mierzenie wydajności .............................................................................................. 614 Pobieranie wyników zapytania z bazy danych ............................................................. 615 Kiedy przechowywać dane w bazie............................................................................ 616 Diagnostyka bieżąca ............................................................................................... 617 Diagnostyka zdalna ................................................................................................. 617 Symulowanie połączeń HTTP .................................................................................... 618 Dodatki...................................................o...................................................o.................... 619 Dodatek A Kody z ukośnikiem ...................................................n........................................................ 621 Dodatek B Kody ASCII...................................................n...................................................n...................623 Dodatek C Operatory ...................................................n...................................................n...... .............629 Dodatek D Znaczniki PHP ...................................................n...................................................n.. ........... 631 Dodatek E Konfiguracja PHP w czasie kompilacji...................................................n.........................633 Dodatek F Zasoby internetowe ...................................................n......................................................637 Dodatek G Przewodnik po stylach PHP...................................................n..........................................639 Skorowidz ...................................................n...................................................n................ ....................643 Integracja z bazami danych W tym rozdziale: n Tworzenie tabel HTML z zapytań SQL. n Śledzenie odwiedzających za pomocą identyfikatorów sesiji. n Przechowywanie danych w bazie. n 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ój produkt, 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 systemie lub pokusić się o dostosowanie opisanych tu przykładów do współipracy z inną bazą. Większość relacyjnych baz danych używa strukturalnego języka zapytań (SQL). Jest to język czwartej 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 na stronie 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 iHall. 542 Część III n Algorytmy Tworzenie tabel HTML z zapytań SQL Jednym z prostszych zadań, jakie można wykonać za pomocą bazy danych i PHP, jest pobranie danych z bazy i wyświetlenie ich w tabeli HTML. Tabela taka może zawierać np. listę towarów na 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 VGUV, tworzona podczas instalacji MySQL. Skrypt PHP, przeglądający katalog produktów, będzie znajdował się na tym samym komputerze, na którym zainstaloiwany 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ę MCVCNQI. Zawiera ona kolumnę, zwaną + , która zawiera wartości całkowite, maksymalnie jedenastocyfrowe. Kolumna ta nie może być pusta i nowym wierszom automatycznie będą przyporządkowywane kolejne wartoś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 0COG i 2TKEG. Listing 17.1. Tworzenie tabeli „katalog” 4 #6 6#$. MCVCNQI + +06  01607..#761A+0 4 / 06 0CYC8#4 *#4   EGPC(.1#6   24+/#4;- ; +  0COG to łańcuch znaków o zmiennej długości, maksymalnie do 32 znaków. 2TKEG to liczba zmiennoprzecinkowa z sześcioma cyframi przed i dwoma po przecinku. Format ten nadaje się 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 wraz z wymyślonymi cenami. W tym celu użyta zostanie instrukcja +05 46. Listing 17.2 jest przykładem opisanej procedury. Listing 17.2. Wprowadzanie danych do tabeli „katalog” +05 46+061MCVCNQI 0CYC GPC 8#.7 5 5EQVGEMC C  +05 46+061MCVCNQI 0CYC GPC 8#.7 5 )TGDKGP   +05 46+061MCVCNQI 0CYC GPC 8#.7 5 2CUVCFQGDQY C  +05 46+061MCVCNQI 0CYC GPC 8#.7 5 0KEFGPV[UV[EPC C  +05 46+061MCVCNQI 0CYC GPC 8#.7 5 5CORQP   +05 46+061MCVCNQI 0CYC GPC 8#.7 5 1F[YMC  C +05 46+061MCVCNQI 0CYC GPC 8#.7 5 GQFQTCPV C  +05 46+061MCVCNQI 0CYC GPC 8#.7 5 GN   +05 46+061MCVCNQI 0CYC GPC 8#.7 5 1UVTCFQIQNCCTMK   +05 46+061MCVCNQI 0CYC GPC 8#.7 5 5EQVMC C  Rozdział 17. n Integracja z bazami danych 543 Każda instrukcja SQL kończy się średnikiem, podobnie jak w PHP. Informujemy serwer MySQL, że chcemy wstawić wiersz do tabeli MCVCNQI i że podamy tylko nazwę produktu i cenę. Jako że pomijamy tu + , MySQL stworzy go sam. Wynika to ze zdefiniowania tej kolumny jako #761A+0 4 / 06. Słowo kluczowe 8#.7 5 informuje serwer, że za chwilę zostaną prze- słane wartości opisane w poprzednim poleceniu. Wartości przesyłane są w apostrofach, zgodnie ze 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 MCVCNQI z poziomu klienta MySQL. Realizuje to polecenie: 5 . 6 (41/MCVCNQI po wydaniu którego otrzymujemy: + 0CYC GPC 5EQVGEMC )TGDKGP 2CUVCFQGDQY 0KEFGPV[UV[EPC 5CORQP 1F[YMC  GQFQTCPV  GN 1UVTCFQIQNCTMK 5EQVMC TQYUKPUGV UGE 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. Realizuje to funkcja O[USNAREQPPGEV. Pobiera ona nazwę hosta, nazwę użytkownika i hasło. Zwykle tworzę w moich bazach MySQL użytkownika o nazwie JVVRF bez hasła. Ograniczam również tego użytkownika tylko do połączeń z lokalnego serwera. Jego nazwa jest taka sama, jak nazwa 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żytkownika i bazy danych, co wymaga zmiany odpowiednich argumentóiw w przykładzie. Rysunek 17.1. Tworzenie tabeli HTML z wynikami zapytania 544 Część III n Algorytmy Listing 17.3. Tworzenie tabeli HTML z wynikami zapytania ! RQđæEGPKGUGTYGTGOKURTCYFGPKGE[UKúRQYKQFđQ KH  FD.KPMO[USNAREQPPGEV NQECNJQUVJVVRF ] RTKPV 0KGOQľPCRQđæE[èUKúDCæ$4 P  RTKPV  CMQēEGPKGUMT[RVW$4 P  GZKV  _ Y[DÎTDC[FCP[EJKURTCYFGPKGTGWNVCVÎYQRGTCELK KH O[USNAUGNGEVAFD VGUVFD.KPM ] RTKPV 0KGOQľPCY[DTCèDC[VGUV$4 P  RTKPV  CMQēEGPKGUMT[RVW$4 P  GZKV  _ RQDTCPKGECđGLCYCTVQħEKVCDGNK 3WGT[5 . 60CYC GPC 3WGT[(41/-CVCNQI KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] RTKPV 0KGOQľPCY[MQPCèCR[VCPKC$4 P  RTKPV MQOWPKMCV/[53.O[USNAGTTQT $4 P  RTKPV  CR[VCPKG3WGT[$4 P  GZKV  _ RQEæVGMVCDGNK RTKPV 6#$. $14 4   P  WVYQTGPKGYKGTUCPCIđÎYMÎY RTKPV 64 P  RTKPV 6 $) 1.14   $ #TV[MWđ$ 6 P  RTKPV 6 $) 1.14   $ GPC$ 6 P  RTKPV 64 P  RQDTCPKGMCľFGIQYKGTU[ YJKNG FD4QYO[USNAHGVEJAQDLGEV FD4GUWNV ] RTKPV 64 P  RTKPV 6 FD4QY 0CYC6 P  RTKPV 6 #.+)0 TKIJV  FD4QY GPC6 P  RTKPV 64 P  _ MQPKGEVCDGNK RTKPV 6#$. P  ! Jeżeli połączenie się powiodło, zwracany jest identyfikator łącza z MySQL. Jak widać, w tym samym wierszu następuje nawiązanie połączenia i testowanie, czy operacja się powiodła. Rozdział 17. n Integracja z bazami danych 545 Identyfikatory łączy są zawsze większe od zera, a zero zwracane jest wtedy, gdy nie można nawiązać połączenia. Dlatego też testowanie wystąpienia wartości (#.5 umożliwia wykrycie nieudanego połączenia. W takim przypadku następuje po proistu opuszczenie skryptu. Funkcja, za pomocą której łączymy się z bazą, to O[USNAREQPPGEV. Przeglądając opisy funkcji MySQL w rozdziale 13., „Funkcje współpracujące z bazami danych”, można znaleźć również inną funkcję: O[USNAEQPPGEV. Funkcje te działają identycznie w ramach skryptu, ale O[USNA REQPPGEV nawiązuje trwałe połączenie z serwerem. Większość funkcji współpracujących z bazami danych udostępnia możliwość tworzenia trwałych połączeń — czyli takich, które nie zamykają się zi chwilą zakończenia skryptu. Jeżeli ten sam proces sieciowy uruchomi później inny skrypt, który łączy się z tym samym serwerem bazy 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 serwer Apache 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ę dopiero przy dużych obciążeniach — w takich chwilach mogą one okazać się bardzo pomocne. Dlatego też domyślnie stosuję O[USNAREQPPGEV. W chwili pisania tej książki zbliża się moment pojawienia się Apache 2.0. Zapowiadane jest tam stosowanie wielowątkowego podejścia, co pozwoli zapewne w pełni wykorzystać zalety trwałychi połączeń. Następnym krokiem jest wybór bazy danych. Tutaj została wybrana baza UVQTG. Po poinformo- waniu PHP, z której bazy należy korzystać, otrzymamy wszystkie wiersze z tabeli MCVCNQI. Realizuje to funkcja O[USNASWGT[. Wykonuje ona zapytanie na określonym łączu i zwraca identyfikator wyniku. Identyfikator ten zostanie użyty do ipobrania wyników zapytania. Zanim rozpoczniemy pobieranie danych ze zbioru wyników, należy rozpocząć budowanie tabeli 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ła domyś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 O[USNAHGVEJAQDLGEV. Każda z kolumn wyniku staje się właściwością zwróconego obiektu. Nazwy kolumn stają się nazwami właściwości. Można również zastosować funkcje O[USNAHGVEJATQY lub O[USNAHGVEJACTTC[, które są równie efektywne. W większości przypadków stosowanie obiektów jest dla mnie bardziej czytelne. Należy unikać stosowania O[USNATGUWNV, ponieważ funkcja ta wykonuje czasochłonną pro- cedurę przeszukiwania tablicy dwuwymiarowej. Gdy nie ma już więcej wierszy do pobrania, funkcja zwraca (#.5 . Aby wykorzystać to zacho- wanie, pobieranie pojedynczego wiersza jest realizowane w pętli YJKNG. Wiersz w tabeli HTML jest 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ących współpracy z bazami danych. Ponieważ każdy z wierszy jest wyświetlany w pętli, wszystkie 546 Część III n 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ć zaiwartość 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ących za pomocą identyfikatorów sesji Witryny sieciowe powoli przekształcają się w aplikacje sieciowe. Pojawia się tu problem zachowywania 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ą, proces się 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ów rozwią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 wielokrotnie częś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ą jest przekazywanie 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 identyfikator sesji jest przechowywany w zmiennej UGUUKQP, jego przesłanie na następną stronę mogłoby mieć następującą formę: RTKPV ő#*4 ( ŒRCIGRJR!UGUUKQPUGUUKQP Œ PGZV# Œ  Metoda ta działa z wszystkim przeglądarkami, również z Lyinx. Drugim sposobem jest użycie cookies. Podobnie jak zmienne formularzy GET i POST, cookies są zamieniane przez PHP na zmienne. Można więc utworzyć cookie o nazwie UGUUKQP. Rozdział 17. n Integracja z bazami danych 547 Różnica polegać będzie na tym, że cookies muszą być przesyłane w nagłówkach i należy wysłać je, zanim przeglądarka otrzyma jakąkolwiek treść HTML. Warto w tym miejscu zaj- rzeć do opisu funkcji UGVEQQMKG w rozdziale 8., „Funkcje wejścia-wyjścia”. Bardziej złożona strategia polega na próbie zastosowania cookies i w przypadku niepowodzenia oparciu się na zmiennych GET. Obydwie metody są szeroko stosowane w Internecie. Wystarcizy wejść w jakąkolwiek witrynę sklepu internetowego. Na potrzeby przykładu opisana tu zostanie strategia polegająca na zastosowaniu zmiennych GET. Pierwszym krokiem jest stworzenie tabeli przechowującej identyfikatory sesji. Listing 17.4 przedstawia kod SQL, tworzący prostą tabelę UGULC w bazie danych MySQL. Listing 17.4. Tworzenie tabeli przechowującej sesje 4 #6 6#$. UGULC + 8#4 *#4  01607.. 1UVCVPKC1RGTCELC #6 6+/  24+/#4;- ; +  Kluczami w tabeli są 8-znakowe łańcuchy. Po każdym przejściu użytkownika na inną stronę odświeżana jest zawartość kolumny 1UVCVPKC1RGTCELC. W ten sposób możemy pozbyć się wszelkich sesji, które wyglądają na nieużywane. Każda wizyta na stronie spowoduje usuwanie sesji bezczynnych przez 30 minut. Następnym krokiem jest sprawdzanie, czy użytkownik posiada identyfikator sesji. Jeżeli nie posiada, zostaje on utworzony. Jeżeli posiada, należy sprawdzić, czy jest on prawidłowy. Po pierwszym załadowaniu skryptu z listingu 17.5 tworzy on identyfikator sesji. Każde kliknięcie przycisku Odśwież w przeglądarce spowoduje sprawdzenie sesji przez skrypt. Jeżeli identyfikator sesji nie znajduje się w tabeli UGULC, wówczas zostanie odrzucony i utworzony będzie nowy. Można spróbować przesłać nieprawidłowy identyfikator, usuwając jakiś znak w pasku adresu przeglądarki. Rysunek 17.2. Sprawdzanie identyfikatora sesji Listing 17.5. Sprawdzanie identyfikatora sesji !    GOQPUVTCELCCUVQUQYCPKCKFGPV[HKMCVQTÎYUGULK   HWPEVKQP5GUUKQP+ NGPIVJ 548 Część III n Algorytmy ] 7UVCPQYKGPKGCMTGUWFQRWUECNP[EJPCMÎY 2QQN#$ ()*+,-./0123456789:;  2QQNCDEFGHIJKLMNOPQRSTUVWXYZ[ NCUV JCTUVTNGP 2QQN  HQT KKNGPIVJK ] UKF2QQN=OVATCPF NCUV JCT ? _ TGVWTP UKF  _ +PKELCNKCELCIGPGTCVQTCNKEDNQUQY[EJ OVAUTCPF VKOG  RQđæEGPKGUGTYGTGOKMQPVTQNCRQYQFGPKCQRGTCELK KH  FD.KPMO[USNAREQPPGEV NQECNJQUVHTGGVTCFG ] RTKPV 0KGOQľPCRQđæE[èUKúDCæFCP[EJ$4 P  RTKPV  CMQēEGPKGUMT[RVW$4 P  GZKV  _ Y[DÎTDC[FCP[EJKMQPVTQNCRQYQFGPKCQRGTCELK KH O[USNAUGNGEVAFD VGUVFD.KPM ] RTKPV 0KGOQľPCY[DTCèDC[VGUV$4 P  RTKPV  CMQēEGPKGUMT[RVW$4 P  GZKV  _ WUWPKúEKGYU[UVMKEJUVCT[EJUGULK 3WGT[ . 6 (41/UGULC 3WGT[9* 4 1UVCVPKC1RGTCELC  3WGT[FCVG ;OF*KU VKOG   3WGT[  KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCWUWPæèUVCT[EJUGULK$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ URTCYFGPKGUGULK KH KUUGV UGUUKQP ] LGľGNKOCO[UGULúPCUVúRWLGLGLURTCYFGPKG 3WGT[5 . 6  3WGT[(41/UGULC 3WGT[9* 4 +  CFFUNCUJGU UGUUKQP   KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM Rozdział 17. n Integracja z bazami danych 549 ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV PKGOQľPCY[MQPCèCR[VCPKCFQVCDGCNKUGULC$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ LGľGNKYTÎEQP[QUVCđLCMKħYKGTUWFCđQUKúQFPCNGļèUCGULú KH O[USNAPWOTQYU FD4GUWNV ] UGULCKUVPKGLGQFħYKGľGPKGECUWQUVCVPKGLQRGTCELK 3WGT[72 #6 UGULC 3WGT[5 61UVCVPKC1RGTCELCPQY  3WGT[9* 4 +  UGUUKQP  KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCQFħYKGľ[èVCDGNKCUGULC$4 P  RTKPV MQOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ _ GNUG ] đ[KFGPV[HKMCVQT RTKPV 0KGPCP[KFGPV[HKMCVQTUGULK UGUUKQP $4 P  UGUUKQP _ _ LGľGNKPKGD[đQUGULKPCNGľ[LæWVYQT[è KH UGUUKQP ] PKGD[đQUGULKVYQTQPCLGUVPQYC UGUUKQP5GUUKQP+   WOKGUEGPKGUGULKYDCKGFCP[EJ 3WGT[+05 46+061UGULC 3WGT[8#.7 5 UGUUKQP PQY  KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCYUVCYKèGNGOGPVWFQVCDGNKCUGULC$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ _ RTKPV 6YÎLKFGPV[HKMCVQTUGULKVQUGUUKQP$4 P  RTKPV #*4 ( 2*2A5 .(!UGUUKQPUGUUKQP    RTKPV 1FħYKGľUVTQPú  RTKPV # $4 P  ! 550 Część III n Algorytmy Kolejnym logicznym krokiem jest dodanie kolejnej tabeli, przechowującej informacje o osobie przeglądającej witrynę. Jedna z kolumn powinna przechowywać identyfikator sesji z tabeli UGULC. Dopisanie tego kodu może być dobrym ćwiczeniem. Przechowywanie danych w bazie Informacja przechowywana w bazie danych nie ogranicza się do krótkich łańcuchów, jak 32-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ącej w bazie danych do swojego ulubionego edytora. Należy tu rozważyć zyski i straty — dla większości stron nie ma potrzeby przechowywania każdego iich elementu w bazie danych. Przykładem sytuacji, kiedy umieszczenie zawartości strony w bazie danych jest zasadne, jest forum 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 formie drzewa 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żna wyświetlać w hierarchii wątków, co ułatwia ich przeglądaniie. 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 iza pomocą własnych przeglądarek. Listing 17.6. Tworzenie tabeli przechowującej wiadomości 4 #6 6#$. 9KCFQOQUE + +0601607..#761A+0 4 / 06 6GOCV8#4 *#4   0CFCYEC8#4 *#4   5VYQTQPQ #6 6+/  2TQFGM+06 6TGUE$.1$ 24+/#4;- ; +  Skrypt z listingu 17.7 ma dwa tryby pracy: listowanie tytułów wiadomości i przeglądanie pojedynczej wiadomości. Jeżeli zmienna OGUUCIG+ jest pusta, wówczas ukazana zostaje lista wszystkich wiadomości w systemie, zorganizowanych według wątków. Realizuje to funkcja UJQY/GUUCIGU. W tym miejscu warto powrócić do fragmentu rozdziału 4., „Funkcje”, gdzie opisana jest rekurencja. Funkcja UJQY/GUUCIG korzysta z rekurencji przy przeglądaniu każdej Rozdział 17. n Integracja z bazami danych 551 z gałęzi drzewa wiadomości. Na początku pobiera listę wszystkich wiadomości, które nie mają wiadomości nadrzędnych. Są to początki wątków. Po ukazaniu wszystkich wiadomo- ści inicjujących wątki UJQY/GUUCIG jest wywoływana dla danego wątku. Proces powtarza się do momentu odnalezienia wiadomości, która nie posiada wiadomości potomnych. Do wyświetlenia tytułów wiadomości wykorzystano znaczniki 7.. Wcięcia pomagają odwzo- rować na ekranie hierarchię wiadomości. Rysunek 17.3. Lista wiadomości forum Listing 17.7. Proste forum ! RTKPV * (QTWO.GQPC* P  RQđæEGPKGUGTYGTGOKURTCYFGPKGE[UKúRQYKQFđQ KH  FD.KPMO[USNAREQPPGEV NQECNJQUVJVVRF ] RTKPV 0KGOQľPCRQđæE[èUKúDCæFCP[EJ$4 P  RTKPV  CMQēEGPKGUMT[RVW$4 P  GZKV  _ Y[DÎTDC[FCP[EJKURTCYFCPKGRQYQFGPKCQRGTCELK KH O[USNAUGNGEVAFD VGUVFD.KPM ] RTKPV 0KGOQľPCY[DTCèDC[VGUV$4 P  RTKPV #DQTVKPI$4 P  GZKV  _   TGMWTGPE[LPCHWPMELCY[ħYKGVNCLæEC  YU[UVMKGYKCFQOQħEKFCPGIQCMTGUW   552 Część III n Algorytmy Rysunek 17.4. Wiadomość z forum HWPEVKQPUJQY/GUUCIGU RCTGPV+ ] INQDCNFD.KPM FCVG6Q7UG CVG 7  RTKPV 7. P  3WGT[5 . 6+ 6GOCV5VYQTQPQ 3WGT[(41/9KCFQOQUE 3WGT[9* 4 2CTGPVRCTGPV+  3WGT[14 4$;5VYQTQPQ KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCY[MQPCèCR[VCPKCFQVCCDGNK9KCFQOQħè$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ YJKNG TQYO[USNAHGVEJAQDLGEV FD4GUWNV ] WMCCPKGVGOCVWYKCFQOQħEKYHQTOKGQFPQħPKCMCFQLGLVTGħEK RTKPV .+ TQY 5VYQTQPQ #*4 (   RTKPV 2*2A5 .(!OGUUCIG+ TQY +    RTKPV TQY 6GOCV# $4 P  Rozdział 17. n Integracja z bazami danych 553 WMCCPKGYKCFQOQħEKRQVQOP[EJ UJQY/GUUCIGU TQY +  _ RTKPV 7. P  _   Y[ħYKGVNGPKGHQTOWNCTCFQFQFCYCPKCYKCFQOQħEK  FCP[OKFGPV[HKMCVQTGORTQFMC   HWPEVKQPRQUV(QTO RCTGPV+ WUG6KVNG ] RTKPV (14/# 6+10 2*2A5 .( / 6*1  RQUV  P  RTKPV +02766;2  JKFFGP 0#/  KPRWV2CTGPV   RTKPV 8#.7  RCTGPV+  P  RTKPV +02766;2  JKFFGP 0#/  # 6+10   RTKPV 8#.7  2156  P  RTKPV 6#$. $14 4   ..52# +0)    RTKPV  ..2# +0)  9+ 6*   P  RTKPV 64 P  RTKPV 6 9+ 6*   $ 6GOCV$ 6 P  RTKPV 6 9+ 6*     RTKPV +02766;2  VGZV 0#/  KPRWV6KVNG   RTKPV 5+   /#:. 0)6*  8#.7  WUG6KVNG    RTKPV 6 P  RTKPV 64 P  RTKPV 64 P  RTKPV 6 9+ 6*   $ 0CFCYEC$ 6 P  RTKPV 6 9+ 6*     RTKPV +02766;2  VGZV 0#/  KPRWV2QUVGT   RTKPV 5+   /#:. 0)6*     RTKPV 6 P  RTKPV 64 P  RTKPV 64 P  RTKPV 6  1.52#0  9+ 6*     RTKPV 6 :6#4 #0#/  KPRWV$QF[   RTKPV  1.5  4195   6 :6#4 #   RTKPV 6 P  RTKPV 64 P  RTKPV 64 P  554 Część III n Algorytmy RTKPV 6  1.52#0  9+ 6*  #.+)0 OKFFNG    RTKPV +02766;2  UWDOKV 8#.7  9[ħNKL    RTKPV 6 P  RTKPV 64 P  RTKPV 6#$. P  RTKPV (14/ P  _   Y[MQPWLGQRGTCELG   KH # 6+10 ] KH # 6+102156 ] 3WGT[+05 46+0619KCFQOQUE 3WGT[8#.7 5  3WGT[ CFFUNCUJGU KPRWV6KVNG   3WGT[ CFFUNCUJGU KPRWV2QUVGT   3WGT[PQY KPRWV2CTGPV 3WGT[ CFFUNCUJGU KPRWV$QF[   KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCYUVCYKèGNGOGPVCWFQVCDGNK 9KCFQOQħè$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ _ _   9[ħYKGVNGPKGYKCFQOQħEKNWDNKUV[YKCFQOQħEK   KH OGUUCIG+   ] 3WGT[5 . 6+ 6GOCV0CFCYEC5VYQTQPQC2TQFGM6TGUE 3WGT[(41/9KCFQOQUE 3WGT[9* 4 + OGUUCIG+  KH  FD4GUWNVO[USNASWGT[ 3WGT[FD.KPM ] PKGOQľPCY[MQPCèCR[VCPKC RTKPV 0KGOQľPCY[MQPCèCR[VCPKCFQVCCDGNK9KCFQOQħè$4 P  RTKPV -QOWPKMCV/[53.O[USNAGTTQT $4 P  GZKV  _ KH TQYO[USNAHGVEJAQDLGEV FD4GUWNV ] RTKPV 6#$. $14 4   ..52# +C0)    RTKPV  ..2# +0)  9+ 6*   P  Rozdział 17. n Integracja z bazami danych 555 RTKPV 64   RTKPV 6 9+ 6*   $ 6GOCV$ 6   RTKPV 6 9+ 6*   TQY 6KVNG6   RTKPV 64 P  RTKPV 64   RTKPV 6 9+ 6*   $ 0CFCYEC$ 6  C RTKPV 6 9+ 6*   TQY 2QUVGT6   RTKPV 64 P  RTKPV 64   RTKPV 6 9+ 6*   $ 9[UNCPQ$ 6   RTKPV 6 9+ 6*   TQY 5VYQTQPQ6   RTKPV 64 P  RTKPV 64   RTKPV 6  1.52#0  9+ 6*     RTKPV TQY 6TGUE  RTKPV 6   RTKPV 64 P  RTKPV 6#$. P  RQUV(QTO TQY + 4 TQY 6GOCV  _ RTKPV #*4 ( 2*2A5 .(  .KUVCYKCFQOQħEK# $4 P  _ GNUG ] RTKPV * .KUVCYKCFQOQħEK* P  RQDTCPKGECđGLNKUV[ UJQY/GUUCIGU   RQUV(QTO   _ ! Z punktu widzenia efektywności, zastosowanie rekurencji nie jest optymalne. Każdy wątek powoduje kolejne wywołanie UJQY/GUUCIG, 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 OGUUCIG+ . Powoduje to, że skrypt przełącza się na tryb wyświetlania pojedynczych wiadomoś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ępuje tu żadna filtracja znaczników. Ograniczenie to znajduje zastosowanie w kodzie dodającym nowe wiadomości. 556 Część III n Algorytmy W każdym z dwóch trybów pracy ukazywany jest formularz do dodawania wiadomości. Jeżeli wiadomość została dodana w chwili wyświetlania listy, zostanie uznana za początek nowego wątku. Jeżeli zaś wiadomość dodana została podczas przeglądania innej wiadomości, uznana zostanie za odpowiedź na tę wiadomość i nowa wiadomość będzie potomkiem przeglądanej wiadomości. Przedstawione tu forum jest proste, ale zawiera podstawowe elementy funkcjonalne takiego systemu. Bardziej wyrafinowanym rozwiązaniem byłoby umożliwienie dodawania wiadomości tylko przez uwierzytelnionych użytkowników lub nieudostępnianie wiadomości na forum do 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 danych Wyobraź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 tych dwó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 oddzielenie sposobu 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 biazy, z jaką się komunikujemy. Jedną z najbardziej popularnych warstw abstrakcyjnych baz danych stanowi fragment biblioteki PHP Base Library http://phplib.netuse.de . Biblioteka ta zawiera również kod do 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 #761A+0 4 / 06. Powoduje on automatyczne wypełnianie kolumn liczbami całkowitymi w 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 a Robust 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 roizdział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. Warstwa abstrakcyjna udostępnia zwykle podstawowy zestaw funkcji bazy danych. Zysk polega tu na uniezależnieniu się od jednego typu bazy.
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP. Programowanie
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: