Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00092 008452 10460885 na godz. na dobę w sumie
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II - książka
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II - książka
Autor: Liczba stron: 688
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0207-0 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> mysql - programowanie
Porównaj ceny (książka, ebook, audiobook).

Błyskawiczny kurs tworzenia
dynamicznych serwisów internetowych

Dynamiczne strony WWW spotykamy codziennie, korzystając z internetu. Portale, sklepy internetowe, gry sieciowe -- wszystkie te witryny korzystają z baz danych i skryptów wykonywanych po stronie serwera. Technologii umożliwiających realizację tego typu witryn WWW jest kilka. Wśród nich zasłużoną popularnością cieszy się 'duet' o ogromnych możliwościach -- język skryptowy PHP i baza danych MySQL. Te dostępne nieodpłatnie narzędzia wykorzystywane są przez tysiące twórców witryn WWW. Dołącz do nich!

Książka 'PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II' to kolejna edycja doskonałego przewodnika po tajnikach tworzenia witryn internetowych za pomocą tych technologii. Znajdziesz w niej wszystkie informacje niezbędne do rozpoczęcia projektowania własnych dynamicznych stron WWW -- od podstaw programowania i korzystania z baz danych, poprzez wykorzystywanie sesji i plików cookie, aż do zaawansowanych technik autoryzowania użytkowników i budowania aplikacji e-commerce. Każde zagadnienie jest przedstawione na praktycznym przykładzie, co doskonale pomoże Ci w przyswojeniu wiedzy.

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 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 Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II Larry Ullman T³umaczenie: Jaromir Senczyk i Grzegorz Werner na podstawie t³umaczenia Micha³a Dadana i Piotra Pilcha ISBN: 83-246-0207-0 Tytu³ orygina³u: PHP and MySQL for Dynamic Web Sites: Visual QuickPro Guide (2nd Edition) Format: B5, stron: 688 B³yskawiczny kurs tworzenia dynamicznych serwisów internetowych Dynamiczne strony WWW spotykamy codziennie, korzystaj¹c z internetu. Portale, sklepy internetowe, gry sieciowe — wszystkie te witryny korzystaj¹ z baz danych i skryptów wykonywanych po stronie serwera. Technologii umo¿liwiaj¹cych realizacjê tego typu witryn WWW jest kilka. Wœród nich zas³u¿on¹ popularnoœci¹ cieszy siê „duet” o ogromnych mo¿liwoœciach — jêzyk skryptowy PHP i baza danych MySQL. Te dostêpne nieodp³atnie narzêdzia wykorzystywane s¹ przez tysi¹ce twórców witryn WWW. Do³¹cz do nich! Ksi¹¿ka „PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II” to kolejna edycja doskona³ego przewodnika po tajnikach tworzenia witryn internetowych za pomoc¹ tych technologii. Znajdziesz w niej wszystkie informacje niezbêdne do rozpoczêcia projektowania w³asnych dynamicznych stron WWW — od podstaw programowania i korzystania z baz danych, poprzez wykorzystywanie sesji i plików cookie, a¿ do zaawansowanych technik autoryzowania u¿ytkowników i budowania aplikacji e-commerce. Ka¿de zagadnienie jest przedstawione na praktycznym przyk³adzie, co doskonale pomo¿e Ci w przyswojeniu wiedzy. (cid:129) Podstawowe elementy skryptów PHP (cid:129) Obs³uga formularzy HTML (cid:129) Tworzenie i stosowanie funkcji (cid:129) Projektowanie baz danych (cid:129) Operacje na danych (cid:129) Wykrywanie i usuwanie b³êdów w skryptach (cid:129) £¹czenie skryptów PHP z baz¹ danych (cid:129) Stosowanie plików cookie i mechanizmów zarz¹dzania sesjami (cid:129) Zabezpieczanie i szyfrowanie danych (cid:129) Zarz¹dzanie treœci¹ strony (cid:129) Autoryzowanie u¿ytkowników (cid:129) Projektowanie sklepów internetowych Spis treści Spis treści Rozdział 1. Wprowadzenie do PHP Wprowadzenie Rozdział 2. Programowanie w PHP 9 19 Podstawy składni ......................................................................................20 Przesyłanie danych do przeglądarki internetowej ....................................24 PHP, HTML i „białe odstępy” .................................................................28 Wstawianie komentarzy ...........................................................................33 Co to są zmienne? ....................................................................................36 Łańcuchy ..................................................................................................39 Liczby .......................................................................................................43 Stałe ..........................................................................................................47 Apostrof kontra cudzysłów ......................................................................50 53 Tworzenie formularza w języku HTML ..................................................54 Obsługa formularza HTML ......................................................................58 Zarządzanie opcją Magic Quotes ...............................................................61 Wyrażenia warunkowe i operatory ...........................................................64 Weryfikacja danych pochodzących z formularza .....................................68 Co to są tablice? .......................................................................................73 Pętle for i while ........................................................................................91 95 Wykorzystywanie plików zewnętrznych ..................................................96 Wyświetlanie i obsługa formularza przez jeden skrypt ............................105 Tworzenie formularzy z pamięcią ..........................................................109 Tworzenie i wywoływanie własnych funkcji .........................................112 Zasięg zmiennej ......................................................................................124 Funkcje daty i czasu ...............................................................................128 Wysyłanie poczty elektronicznej ............................................................132 S p i s t r e ś c i Rozdział 3. Tworzenie dynamicznych stron WWW 5 Rozdział 5. Zaawansowany SQL i MySQL i c ś e r t s i p S 139 Wybór typu kolumny .............................................................................140 Wybór innych właściwości kolumn .......................................................144 Korzystanie z monitora mysqla ..............................................................146 Tworzenie baz danych i tabel .................................................................150 Wprowadzanie rekordów .......................................................................153 Wybieranie danych .................................................................................156 Wyrażenia warunkowe ...........................................................................158 Stosowanie LIKE i NOT LIKE ..............................................................162 Sortowanie wyników zapytania ..............................................................164 Ograniczanie wyników zapytania ..........................................................166 Uaktualnianie danych .............................................................................169 Usuwanie danych ...................................................................................171 Funkcje ...................................................................................................173 183 Projekt bazy danych ...............................................................................184 Złączenia ................................................................................................200 Grupowanie wyników zapytania ............................................................204 Indeksy ...................................................................................................206 Stosowanie różnych typów tabeli ...........................................................209 Wyszukiwanie FULLTEXT ...................................................................212 Optymalizacja bazy danych ....................................................................219 225 Ogólne typy błędów i ich usuwanie .......................................................226 Wyświetlanie błędów PHP .....................................................................232 Sterowanie raportowaniem błędów PHP ................................................233 Tworzenie własnych funkcji obsługi błędów .........................................236 Zapis komunikatów o błędach PHP do dziennika ..................................240 Techniki usuwania błędów z PHP .............................................................243 Techniki usuwania błędów SQL i MySQL ............................................246 249 Modyfikacja szablonu ............................................................................250 Łączenie się z MySQL-em i wybieranie bazy ........................................251 Wykonywanie prostych zapytań ............................................................255 Odczytywanie wyników zapytania .........................................................263 Spis treści Rozdział 4. Wprowadzenie do SQL i MySQL Rozdział 6. Obsługa i usuwanie błędów Rozdział 7. PHP i MySQL 6 Spis treści Rozdział 8. Tworzenie aplikacji internetowych Rozdział 9. Sesje i „ciasteczka” Rozdział 10. Zabezpieczenia Rozdział 11. Zagadnienia dodatkowe Bezpieczeństwo ......................................................................................267 Zliczanie zwróconych rekordów ............................................................273 Uaktualnianie rekordów w PHP ...............................................................279 287 Dopasowanie zachowania aplikacji do konfiguracji serwera .................288 Przekazywanie wartości do skryptu .......................................................291 Stosowanie ukrytych pól formularza ......................................................295 Edycja istniejących rekordów ................................................................301 Stronicowanie wyników zapytań ............................................................308 Wyświetlanie tabel z możliwością sortowania .......................................316 Nagłówki HTTP .....................................................................................323 333 Posługiwanie się ciasteczkami ...............................................................334 Sesje .......................................................................................................351 Sesje a „ciasteczka” ................................................................................367 Zwiększanie bezpieczeństwa sesji ..........................................................375 381 Bezpieczniejsza walidacja formularzy ...................................................382 Obsługa kodu HTML .............................................................................393 Walidacja danych według typu ..............................................................397 Walidacja formularza przy użyciu JavaScriptu .......................................401 Wyrażenia regularne ..............................................................................408 Zabezpieczanie baz danych i szyfrowanie .............................................420 425 Obsługa przesyłania plików ...................................................................426 Skrypty PHP i JavaScript .......................................................................437 Buforowanie wyjścia ..............................................................................445 Korzystanie z funkcji Improved MySQL Extension ..............................453 Nowe funkcje MySQL ...........................................................................457 Zastosowanie pakietu PEAR ..................................................................466 471 Tworzenie szablonu ................................................................................472 Tworzenie zwykłych stron internetowych .............................................476 Zarządzanie adresami URL ....................................................................480 Zarządzanie plikami ...............................................................................508 S p i s t r e ś c i Rozdział 12. Zarządzanie zawartością strony — przykład 7 Rozdział 14. Sklep internetowy — przykład 521 Tworzenie szablonów .............................................................................522 Tworzenie skryptów konfiguracyjnych ..................................................526 Tworzenie strony głównej ......................................................................533 Rejestracja ..............................................................................................535 Aktywacja konta .....................................................................................544 Logowanie i wylogowywanie się .............................................................548 Zarządzanie hasłami ...............................................................................555 565 Tworzenie bazy danych ..........................................................................566 Część administracyjna aplikacji .............................................................571 Tworzenie szablonu części publicznej aplikacji .....................................586 Katalog produktów .................................................................................590 Koszyk ....................................................................................................602 Rejestrowanie zamówień ........................................................................612 Instalacja 617 Instalacja w systemie Windows .............................................................618 Definiowanie uprawnień MySQL ..........................................................624 Testowanie instalacji ..............................................................................630 Konfigurowanie PHP .............................................................................634 Przewodnik 637 Język PHP ..............................................................................................638 Serwer MySQL ......................................................................................643 Zasoby internetowe 651 Język PHP ..............................................................................................652 Serwer MySQL ......................................................................................656 Język SQL ..............................................................................................658 Bezpieczeństwo ......................................................................................659 Inne strony internetowe ..........................................................................660 663 Skorowidz Spis treści Rozdział 13. Rejestrowanie użytkowników — przykład i c ś e r t s i p S Dodatek A Dodatek B Dodatek C 8 Tworzenie dynamicznych Tworzenie dynamicznych stron WWW stron WWW 3 Rozdział 3. Tworzenie dynamicznych stron WWW Teraz, gdy opanowałeś już podstawy PHP, czas rozpocząć tworzenie naprawdę dynamicznych stron WWW. W porównaniu ze stronami statycznymi, które dominowały na początku istnienia internetu, są one łatwiejsze do utrzymania i bardziej interaktywne, a ich wygląd może się zmieniać w zależności od sytuacji. W tym rozdziale omawiam bardzo wiele rozwiązań, które wykorzystuje się do budowy dynamicznych aplikacji internetowych. Piszę między innymi o plikach zewnętrznych, obsłudze formularzy innymi sposobami, pisaniu i wykorzystywaniu własnych funkcji, wysyłaniu poczty elektronicznej i stosowaniu funkcji date(). Wszystkie wymienione elementy są wykorzystywane przez bardziej zaawansowane aplikacje internetowe. T w o r z e n i e d y n a m i c z n y c h s t r o n W W W 95 Rozdział 3. Wykorzystywanie plików zewnętrznych Wszystkie zaprezentowane dotychczas skrypty miały postać pojedynczych plików, w których zapisany był cały kod HTML i PHP. Gdy zaczniesz tworzyć bardziej rozbudowane witryny, zorientujesz się, że takie podejście ma wiele ograniczeń. Na szczęście PHP obsługuje pliki zewnętrzne, co pozwala Ci rozbić kod na kilka części. Dzięki temu będziesz mógł oddzielić kod HTML od kodu PHP i wyodrębnić ze skryptu tę jego część, która odpowiada za najczęściej wykonywane operacje. PHP ma cztery funkcje obsługujące pliki zewnętrzne: include(), include_once(), require() i require_once(). Stosuje się je, umieszczając w skrypcie PHP instrukcje tego typu: include_once( nazwapliku.php ); require( /ścieżka/do/pliku/nazwapliku.html ); Działają one w ten sposób, że biorą całą zawartość pliku o podanej nazwie i wstawiają ją do oryginalnego skryptu w miejscu swego wystąpienia. PHP zakłada, że kod występujący w plikach zewnętrznych jest kodem HTML i że powinien zostać przesłany bezpośrednio do przeglądarki (chyba że jest on otoczony znacznikami oznaczającymi kod PHP). W poprzednich wersjach PHP funkcję include() stosowało się w nieco innych okolicznościach niż require(). Obecnie ich zastosowanie jest takie samo, choć różnią się one swym zachowaniem w sytuacjach awaryjnych. Jeżeli z jakichś względów funkcja include() nie będzie mogła wczytać pliku, w przeglądarce internetowej zostanie wyświetlony komunikat o błędzie (rysunek 3.1), ale skrypt będzie w dalszym ciągu wykonywany. Jeżeli natomiast załadowanie pliku nie uda się funkcji require(), po wyświetleniu informacji o błędzie skrypt zostanie zatrzymany (rysunek 3.2). 96 h c y n z r t ę n w e z w ó k i l p e i n a w y t s y z r o k y W Rysunek 3.1. Dwa wywołania funkcji include() zakończone niepowodzeniem Rysunek 3.2. Przy pierwszym niepowodzeniu funkcji require() skrypt zostanie zatrzymany, a w przeglądarce pojawi się komunikat o błędzie Tworzenie dynamicznych stron WWW Obie funkcje mają też odmianę _once(), która gwarantuje, że dany plik zewnętrzny zostanie dołączony do skryptu tylko jeden raz, nawet jeśli programista popełni błąd i umieści w skrypcie kilka poleceń dołączających. require_once( nazwapliku.html ); Czas na pierwszy przykład. Oddzielę w nim kod HTML odpowiedzialny za formatowanie tekstu od kodu PHP, wykorzystując mechanizm dołączania plików. Dzięki temu wszystkie kolejne przykłady w tym rozdziale będą mogły zwracać wyniki w tej samej postaci, a ja nie będę musiał przepisywać za każdym razem tych samych fragmentów kodu. Powstanie w ten sposób system szablonów zapewniający spójność i łatwe zarządzanie rozbudowanymi aplikacjami. W przykładach skoncentruję się na kodzie PHP. Powinieneś również przeczytać informacje umieszczone w ramce „Struktura witryny”, dzięki którym zrozumiesz schemat organizacji plików. Jeśli będziesz mieć pytania dotyczące CSS (Cascading Style Sheets) lub (X)HTML używanych w przykładach, to skorzystaj z odnośników podanych w dodatku C, „Zasoby internetowe”. Struktura witryny Gdy zaczynasz wykorzystywać w swych aplikacjach internetowych pliki zewnętrzne, całościowa struktura witryny nabiera większego znaczenia. Projektując serwis internetowy, powinieneś brać pod uwagę trzy czynniki: (cid:141) łatwość utrzymywania, (cid:141) bezpieczeństwo, (cid:141) łatwość poruszania się po witrynie. Wykorzystanie plików zewnętrznych do przechowywania standardowych procedur PHP, CSS, JavaScript i HTML bardzo upraszcza utrzymywanie witryny, ponieważ cały wspólny kod jest przechowywany tylko w jednym miejscu. W kolejnych przykładach będę często tworzył specjalne katalogi na pliki zewnętrzne i trzymał je odrębnie od zasadniczych skryptów. W przypadku dokumentów niezawierających poufnych danych, takich jak szablony HTML, zalecam stosowanie rozszerzenia .inc lub .html, natomiast pliki wymagające większego bezpieczeństwa (przechowujące na przykład informacje potrzebne do połączenia się z bazą danych) powinny mieć rozszerzenia .php. Używaj nawet obu rozszerzeń (czyli .inc i .html lub .php), aby wskazać, że dany plik jest plikiem zewnętrznym określonego typu. Powinieneś też projektować swoje witryny w taki sposób, aby użytkownicy mogli się po nich łatwo poruszać i to zarówno posługując się łączami, jak i ręcznie wpisywanymi adresami URL. Staraj się nie tworzyć zbyt wielu poziomów folderów i nie używać trudnych do zapamiętania nazw plików i katalogu. Nie mieszaj też wielkich liter z małymi i nie stosuj w nazwach znaków przestankowych. 97 W y k o r z y s t y w a n i e p l i k ó w z e w n ę t r z n y c h Rozdział 3. Aby wykorzystać pliki zewnętrzne: 1. Stwórz w edytorze tekstów lub programie typu WYSIWYG projekt strony HTML (listing 3.1 i rysunek 3.3). Na początek zaprojektuję wygląd mojej aplikacji HTML (jest on całkowicie niezależny od kodu PHP). Za pomocą komentarzy oznaczę tę część projektu, która będzie inna dla każdej strony. Uwaga: aby zaoszczędzić miejsca, nie zamieściłem pliku CSS, który decyduje o wyglądzie strony. Możesz go ściągnąć razem z kodami przykładów z serwera ftp lub uruchamiać przykład bez tego pliku (szablon będzie działać, ale jego wygląd nie będzie zbyt estetyczny). Rysunek 3.3. Projekt strony HTML oglądany w przeglądarce internetowej (wykorzystujący HTML i CSS, ale jeszcze nie PHP) Listing 3.1. Szablon stron WWW generowanych w tym rozdziale 1 !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN 2 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 3 html xmlns= http://www.w3.org/1999/xhtml xml:lang= en lang= en 4 head 5 meta h1ttp-equiv= content-type content= text/html; charset=iso-8859-2 / 6 title Witamy w naszej witrynie! /title 7 style type= text/css media= all @import ./includes/layout.css ; /style 8 /head 9 body 10 div id= wrapper !-- Zgodnie ze stylem CSS. -- 11 12 div id= content !-- Zgodnie ze stylem CSS. -- 13 14 div id= nav !-- Sekcja łączy -- 15 h3 Menu /h3 16 ul 17 li class= navtop a href= index.php title= Przejdź do strony domowej Strona domowa /a /li 18 li a href= kalkulator.php title= Użyj kalkulatora Kalkulator /a /li 19 li a href= kalendarz.php title= Wypróbuj działanie formularza wyboru daty Kalendarz /a /li 20 li a href= rejestracja.php title= Zarejestruj się Zarejestruj się /a /li 21 /ul 22 /div 23 24 !-- Początek treści specyficznej dla danej strony. -- 25 h1 id= mainhead Nagłówek /h1 26 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 27 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 28 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 98 h c y n z r t ę n w e z w ó k i l p e i n a w y t s y z r o k y W Listing 3.1. Szablon stron WWW generowanych w tym rozdziale — ciąg dalszy 29 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 30 h2 Nagłówek niższego rzędu /h2 31 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 32 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 33 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 34 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 35 !-- Koniec treści specyficznej dla danej strony. -- 36 37 /div !-- Koniec DIV treści . -- 38 39 div id= footer p copy; Copyright 2005 by Larry E. Ullman amp;DMCInsights, Inc. /p /div 40 41 /div !-- Koniec DIV obudowy . -- 42 /body 43 /html Listing 3.2. Początek każdej strony będzie przechowywany w pliku nagłówkowym 1 !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN 2 http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd 3 html xmlns= http://www.w3.org/1999/xhtml xml:lang= en lang= en 4 head 5 meta http-equiv= content-type content= text/html; charset=iso-8859-2 / Tworzenie dynamicznych stron WWW 2. Skopiuj wszystko, począwszy od pierwszego wiersza aż do początku kodu specyficznego dla danej strony i wklej to do nowego dokumentu (listing 3.2). !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd html xmlns= http://www.w3.org/1999/xhtml xml:lang= en lang= en head meta http-equiv= content-type content= text/html; charset=iso-8859-2 / title ?php echo $page_title; ? /title style type= text/css media= all @import ./includes/layout.css ; /style /head body div id= wrapper div id= content div id= nav h3 Menu /h3 ul li class= navtop a href= index.php title= Przejdź do strony domowej Strona domowa /a /li li a href= kalkulator.php title= Użyj kalkulatora Kalkulator /a /li li a href= kalendarz.php title= Wypróbuj działanie formularza wyboru daty Kalendarz /a /li li a href= rejestracja.php title= Zarejestruj się Zarejestruj się /a /li /ul /div !-- Skrypt 3.2 - naglowek.html -- Pierwszy plik będzie zawierał początkowe znaczniki HTML (od DOCTYPE, przez head, aż do początku „ciała” strony). W y k o r z y s t y w a n i e p l i k ó w z e w n ę t r z n y c h 99 Rozdział 3. 3. Zmień wiersz zawierający tytuł strony na: title ?php echo $page_title; ? /title Listing 3.2. Początek każdej strony będzie przechowywany w pliku nagłówkowym — ciąg dalszy Chcę, aby tytuł strony (pojawiający się na górze w przeglądarce internetowej; patrz rysunek 3.3) był na każdej stronie inny. Dlatego też będę przypisywał go do zmiennej, której zawartość będzie wyświetlana przez PHP. 4. Zapisz plik pod nazwą naglowek.html. Nazwy plików zewnętrznych mogą mieć całkowicie dowolne rozszerzenia. Niektórzy programiści preferują rozszerzenie .inc, ponieważ sugeruje ono, że mamy do czynienia z plikiem dołączanym (ang. included file). W tym przypadku mógłbyś również użyć rozszerzenia .inc.html, wskazującego, że dołączany plik zawiera kod HTML (a nie PHP). 6 title ?php echo $page_title; ? /title 7 style type= text/css media= all @import ./includes/layout.css ; /style 8 /head 9 body 10 div id= wrapper !-- Zgodnie ze stylem CSS. -- 11 12 div id= content !-- Zgodnie ze stylem CSS. -- 13 14 div id= nav !-- Sekcja łączy -- 15 h3 Menu /h3 16 ul 17 li class= navtop a href= index.php title= Przejdź do strony domowej Strona domowa /a /li 18 li a href= kalkulator.php title= Użyj kalkulatora Kalkulator /a /li 19 li a href= kalendarz.php title= Wypróbuj działanie formularza wyboru daty Kalendarz /a /li 20 li a href= rejestracja.php title= Zarejestruj się Zarejestruj się /a /li 21 /ul 22 /div 23 !-- Skrypt 3.2 - naglowek.html -- 24 !-- Początek treści specyficznej dla danej strony. -- h c y n z r t ę n w e z w ó k i l p e i n a w y t s y z r o k y W 100 Listing 3.3. Zakończenie każdej strony będzie przechowywane w pliku stopki 1 !-- Koniec treści specyficznej dla danej strony. -- 2 !-- Skrypt 3.3 - stopka.html -- 3 /div !-- Koniec DIV treści . -- 4 5 div id= footer p copy; Copyright 2005 by Larry E. Ullman amp; DMCInsights, Inc. /p /div 6 7 /div !-- Koniec DIV obudowy . -- 8 /body 9 /html Listing 3.4. Ten skrypt tworzy stronę WWW, wykorzystując szablon przechowywany w plikach zewnętrznych 1 ?php # Skrypt 3.4 - index.php 2 $page_title = Witamy w naszej witrynie! ; 3 include ( ./includes/naglowek.html ); 4 ? 5 h1 id= mainhead Nagłówek /h1 6 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 7 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 8 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 9 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 10 h2 Nagłówek niższego rzędu /h2 11 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 12 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 13 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 14 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p 15 ?php 16 include ( ./includes/stopka.html ); 17 ? Tworzenie dynamicznych stron WWW 5. Przejdź do oryginalnego szablonu strony i skopiuj wszystko od końca części specyficznej dla konkretnej strony do końca pliku. Następnie wklej to do nowego pliku (listing 3.3). !-- Skrypt 3.3 - stopka.html -- /div !-- Koniec DIV treści . -- div id= footer p copy; Copyright 2005 by Larry E. Ullman amp; DMCInsights, Inc. /p /div /div !-- Koniec DIV obudowy . -- /body /html Plik stopki zawiera ostatnie znaczniki formatujące i znaczniki zamykające dokument HTML. 6. Zapisz plik pod nazwą stopka.html. 7. Utwórz w edytorze tekstów nowy dokument PHP (listing 3.4). ?php # Skrypt 3.4 - index.php Ponieważ większość znaczników formatujących znajduje się w plikach zewnętrznych, możemy rozpocząć dokument od znaczników PHP, a nie HTML. 8. Nadaj zmiennej $page_title odpowiednią wartość i dołącz nagłówek HTML. $page_title = Witaj! ; include ( ./includes/naglowek.inc ); Dzięki zmiennej $page_title każda strona wygenerowana z wykorzystaniem tego szablonu może mieć inny tytuł. Ponieważ jej wartość jest określana przed dołączeniem pliku nagłówkowego, dostęp do niej ma ten ostatni. Pamiętaj, że efektem wykonania wiersza kodu zawierającego wywołanie funkcji include() jest umieszczenie zamiast niego całej zawartości dołączanego pliku. W y k o r z y s t y w a n i e p l i k ó w z e w n ę t r z n y c h 101 Rysunek 3.4. Tym razem do uzyskania tego samego wyglądu strony (patrz rysunek 3.3) wykorzystałem pliki zewnętrzne PHP Rozdział 3. 9. Pozamykaj znaczniki PHP i skopiuj z szablonu stron kod specyficzny dla danej strony. ? h1 id= mainhead Nagłówek /h1 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p h2 Nagłówek niższego rzędu /h2 p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p p Tutaj umieścisz podstawową treść strony, inną dla każdej strony. /p Te informacje można też przesłać do przeglądarki za pośrednictwem funkcji echo(), ale ponieważ nie występują w nich żadne treści generowane dynamicznie, szybszym i wydajniejszym rozwiązaniem jest chwilowe opuszczenie znaczników PHP. 10. Stwórz w kodzie ostatnią sekcję PHP i dołącz plik stopki. ?php include ( ./includes/stopka.inc ); ? 11. Zapisz dokument pod nazwą index.php, wgraj go na serwer razem z plikiem stopka.html. 12. Utwórz podkatalog includes w tym samym katalogu, w którym znajduje się index.php. Następnie umieść w katalogu includes pliki naglowek.html, stopka.html i layout.css (załadowany z serwera ftp). 13. Przetestuj szablon ładując index.php w przeglądarce internetowej (rysunek 3.4). h c y n z r t ę n w e z w ó k i l p e i n a w y t s y z r o k y W 102 Tworzenie dynamicznych stron WWW Strona index.php stanowi końcowy rezultat zastosowania systemu szablonu. Nie musimy bezpośrednio odwoływać się do dołączanych plików, ponieważ skrypt index.php sam dołączy ich zawartość. 14. Jeśli chcesz, możesz obejrzeć źródło strony HTML (rysunek 3.5). W y k o r z y s t y w a n i e p l i k ó w z e w n ę t r z n y c h Rysunek 3.5. Wygenerowany kod źródłowy w języku HTML powinien być wierną kopią kodu występującego w pierwotnym szablonie stron (patrz listing 3.1) 103 Rysunek 3.6. Wygląd strony HTML bez użycia pliku CSS (porównaj z rysunkiem 3.4) Rozdział 3. Wskazówki (cid:132) W pliku php.ini występuje ustawienie include_path. Dzięki niemu możesz określić, które pliki zewnętrzne mogą być dołączane, a które nie. (cid:132) W rozdziale 7., „PHP i MySQL”, przekonasz się, że wszystkie pliki zawierające poufne dane (takie jak na przykład informacje potrzebne do połączenia się z bazą danych), powinny być przechowywane w innym katalogu niż pozostałe dokumenty witryny. (cid:132) Odwołując się do plików znajdujących się w tym samym katalogu co plik bieżący, powinieneś zawsze stosować składnię ./nazwapliku. Z kolei do plików znajdujących się w katalogu wyższego poziomu odwołuj się, pisząc ../nazwapliku, a do plików z katalogu niższego poziomu — pisząc .katalog/nazwapliku. (cid:132) Dołączając pliki, możesz posługiwać się ścieżkami względnymi (tak jak ja) lub bezwzględnymi: include ( /ścieżka/ do/pliku/nazwapliku ); (cid:132) W przypadku gdy nie uda się dołączyć pliku zewnętrznego, funkcja require() ma większy wpływ na funkcjonowanie skryptu niż funkcja include(). Dlatego też powinno się ją stosować jedynie tam, gdzie dołączenie danego pliku ma kluczowe znaczenie (na przykład wówczas, gdy jest to plik odpowiedzialny za nawiązanie połączenia z bazą danych), a w przypadku dołączania kodu wpływającego jedynie na kosmetykę strony należy posługiwać się funkcją include(). Wersje _once() przydają się w skomplikowanych aplikacjach, ale w przypadku prostej witryny ich stosowanie nie jest konieczne. (cid:132) CSS działa w taki sposób, że jeśli nie użyjesz pliku CSS lub nie wczyta go przeglądarka, to strona będzie nadal działać poprawnie, ale jej wygląd będzie mniej estetyczny (patrz rysunek 3.6). 104 h c y n z r t ę n w e z w ó k i l p e i n a w y t s y z r o k y W Wyświetlanie i obsługa formularza przez jeden skrypt We wszystkich dotychczasowych przykładach do obsługi formularzy HTML wykorzystywałem dwa niezależne skrypty. Jeden wyświetlał formularz, a drugi odbierał wysłane z niego dane. Choć nie ma w tym nic złego, czasem wygodnie jest realizować obie te funkcje za pośrednictwem jednego skryptu. Gdy ta sama strona ma jednocześnie wyświetlać i obsługiwać formularz, trzeba zastosować wyrażenie warunkowe. if (/* wysłano dane z formularza */) { // Obsłuż je. } else { // Wyświetl formularz. } Chcąc dowiedzieć się, czy dane z formularza zostały już wysłane, sprawdzam, czy zmiennej $_POST przypisano jakąś wartość (zakładając, że formularz używa metody POST). Mogę na przykład sprawdzić zmienną $_POST[ wyslany ], gdzie wysłany jest nazwą ukrytego pola formularza. if (isset($_POST[ wyslany ])) { // Obsłuż formularz. } else { // Wyświetl formularz. } Jeśli chcesz, aby skrypt obsłużył formularz, a następnie wyświetlił go ponownie (bo chcesz na przykład dodać kolejny rekord do bazy danych), użyj konstrukcji: if (isset($_POST[ wyslany ])) { // Obsłuż dane. } // Wyświetl formularz. Ta wersja skryptu wyświetla formularz przy każdym załadowaniu strony i obsługuje go, jeżeli zostały z niego wysłane jakieś dane. Aby zademonstrować tę ważną technikę, stworzę teraz kalkulator sprzedaży. W dalszej części tego rozdziału użyję tej samej metody, tworząc stronę rejestracji. Tworzenie dynamicznych stron WWW Aby obsługiwać formularze HTML: 1. Utwórz w edytorze tekstów nowy dokument PHP (listing 3.5). ?php # Skrypt 3.5 - kalkulator.php $page_title = Kalkulator kosztów ; include ( ./includes/naglowek.html ); Ten, i wszystkie pozostałe przykłady w bieżącym rozdziale, będą używać tego samego szablonu co strona index.php. Dlatego też składnia początku każdej strony będzie taka sama, różne będą jedynie tytuły. 2. Napisz wyrażenie warunkowe obsługujące formularz. if (isset($_POST[ submitted ])) { Jak wcześniej wspomniałem, to, że zmienna $_POST[ submitted ] ma jakąś wartość, oznacza, że dane z formularza zostały już przesłane i można je obsłużyć. Zmienna ta będzie tworzona przez ukryte pole formularza służące tylko jako wskaźnik jego wysłania. 3. Zweryfikuj wprowadzone dane. if ( is_numeric($_POST[ quantity ]) is_numeric($_POST[ price ]) is_numeric($_POST[ tax ]) ) { Weryfikacja jest w tym przypadku bardzo prosta i polega na sprawdzeniu, czy wartości trzech zmiennych są numeryczne. Można ją rozbudować na przykład o sprawdzenie, czy pierwsza z nich ma wartość całkowitą (w rozdziale 10., „Zabezpieczenia” pojawi się wersja tego skryptu wykonująca taką kontrolę). Jeśli weryfikacja zakończy się pomyślnie, obliczenia zostaną wykonane. W przeciwnym razie użytkownik zostanie poproszony o ponowne wprowadzenie danych. W y ś w i e t l a n i e i o b s ł u g a f o r m u l a r z a 105 Rozdział 3. Listing 3.5. Ten skrypt zarówno wyświetla, jak i obsługuje formularz rejestracyjny 1 ?php # Skrypt 3.5 - kalkulator.php 2 $page_title = Kalkulator kosztów ; 3 include ( ./includes/naglowek.html ); 4 5 // Sprawdź czy formularz został wysłany. 6 if (isset($_POST[ submitted ])) { 7 8 // Podstawowa weryfikacja danych we formularzu. 9 if ( is_numeric($_POST[ quantity ]) is_numeric($_POST[ price ]) is_numeric($_POST[ tax ]) ) { 10 11 // Wylicz wyniki. 12 $taxrate = $_POST[ tax ] / 100; // Zamień 5 na .05. 13 $total = ($_POST[ quantity ] * $_POST[ price ]) * ($taxrate + 1); 14 15 // Wyświetl wyniki. 16 echo h1 id= mainhead Całkowity koszt /h1 17 p Kupujesz . $_POST[ quantity ] . sztuk w cenie . number_format ($_POST[ price ], 2) . zł za egzemplarz. Po uwzględnieniu podatku . $_POST[ tax ] . , daje to całkowity koszt . number_format ($total, 2) . . /p p br / /p ; 18 19 } else { // Wprowadzono niepoprawne dane. 20 echo h1 id= mainhead Błąd! /h1 21 p class= error Wprowadź poprawną liczbę egzemplarzy, cenę i podatek. /p p br / /p ; 22 } 23 24 } // Koniec głównego IF. 25 26 // Koniec sekcji PHP i początek formularza HTML. 27 ? 28 h2 Kalkulator kosztów /h2 29 form action= calculator.php method= post 30 p Liczba egzemplarzy: input type= text name= quantity size= 5 maxlength= 10 / /p 31 p Cena: input type= text name= price size= 5 maxlength= 10 / /p 32 p Podatek: /b input type= text name= tax size= 5 maxlength= 10 / /p 33 p input type= submit name= submit value= Oblicz! / /p 34 input type= hidden name= submitted value= TRUE / 35 /form 36 ?php 37 include ( ./includes/stopka.html ); 38 ? a z r a l u m r o f a g u ł s b o i e i n a l t e i w ś y W 106 4. Wykonaj obliczenia. $taxrate = $tax / 100; $total = ($_POST[ quantity ] * $_POST[ price ]) * ($taxrate + 1); Pierwszy wiersz zamienia wartość wyrażoną w procentach (np. 5 ) na ułamek dziesiętny (0.05) używany w dalszych obliczeniach. W drugim wierszu liczba egzemplarzy mnożona jest przez cenę jednostkową. Następnie mnoży się ją przez wartość podatku (0.05) powiększoną o 1 (1.05). To najszybszy sposób wyznaczenia wartości powiększonej o podatek. 5. Wyświetl wyniki. echo h1 id= mainhead Całkowity koszt /h1 p Kupujesz . {$_POST [ quantity ] . sztuk w cenie . number_format($_POST[ price ], 2) . zł za egzemplarz. Po uwzględnieniu podatku . $_POST[ price ] . daje to . number_format($total,2) . zł. /p p br / /p ; Wyświetlone są wszystkie wartości, a cena i całkowity koszt zostają dodatkowo sformatowane za pomocą funkcji number_format(). 6. Dokończ główne wyrażenie warunkowe i zamknij znacznik PHP. } else { echo h1 id= mainhead Błąd! /h1 p class= error Wprowadź poprawną liczbę egzemplarzy, cenę i podatek. /p p br / /p ; } } ? Klauzula else zamyka wyrażenie warunkowe weryfikacji, wyświetlając komunikat o błędzie (jeśli wprowadzone wartości nie są numeryczne). Ostatni nawias klamrowy zamyka natomiast wyrażenie warunkowe isset($_POST[ submitted ]). Następnie zamykana jest sekcja PHP, dzięki czemu formularz będzie można utworzyć bez stosowania funkcji print() lub echo(). Tworzenie dynamicznych stron WWW 7. Wyświetl formularz HTML. h2 Kalkulator kosztów /h2 form action= kalkulator.php method= post p Liczba egzemplarzy: input type= text name= quantity size= 5 maxlength= 10 / /p p Cena: input type= text name= price size= 5 maxlength= 10 / /p p Podatek ( ): input type= text name= tax size= 5 maxlength= 10 / /p p input type= submit name= submit value= Oblicz! / /p input type= hidden name= submitted value= TRUE / /form Formularz jest dość prosty, zawiera jedynie dwie nowe sztuczki. Po pierwsze, atrybut action używa nazwy skryptu, dzięki czemu wysłanie formularza powoduje powrót do tej samej strony zamiast przejście do innej. Po drugie, formularz zawiera ukryte pole o nazwie submitted i wartości TRUE. Pole to spełnia rolę znacznika, którego istnienie jest sprawdzane, aby ustalić, czy formularz wymaga obsługi (patrz główne wyrażenie warunkowe). W y ś w i e t l a n i e i o b s ł u g a f o r m u l a r z a 107 Rozdział 3. 8. Dołącz plik stopki. ?php include ( ./includes/stopka.html ); ? 9. Zapisz plik pod nazwą kalkulator.php, wgraj go na serwer i przetestuj w przeglądarce internetowej (rysunek 3.7, 3.8 i 3.9). Wskazówki (cid:132) Aby zbadać, czy dane z formularza zostały już wysłane, możesz to też sprawdzić, określając, czy zmienna przycisku Wyślij dane ($_POST[ submit ]) ma wartość. Metoda ta nie zadziała, jeśli użytkownik wyśle formularz używając klawisza Enter. (cid:132) Jeśli będziesz chciał użyć grafiki jako przycisku wysyłania danych formularza, formularz będzie musiał zawierać ukryte pole umożliwiające sprawdzenie, czy został on wysłany. (cid:132) Powrót do tego samego formularza po jego wysłaniu możliwy jest także za pomocą PHP. Można to zrobić, umieszczając nazwę bieżącego skryptu przechowywaną przez zmienną $_SERVER[ PHP_SELF ] jako wartość atrybutu action: form action= ?php echo $_SERVER[ PHP_SELF ]; ? method= post Zaletą tego rozwiązania jest to, że formularz będzie powracać do tej samej strony nawet wtedy, gdy zmienimy później nazwę skryptu. a z r a l u m r o f a g u ł s b o i e i n a l t e i w ś y W Rysunek 3.7. Pierwsze wyświetlenie formularza HTML Rysunek 3.8. Strona wykonuje obliczenia, prezentuje wyniki i ponownie wyświetla formularz Rysunek 3.9. Jeżeli jedna z wprowadzonych wartości nie jest numeryczna, zostaje wyświetlony komunikat o błędzie 108 Tworzenie formularzy z pamięcią Na pewno zetknąłeś się już z formularzami z pamięcią, nawet jeśli nie wiesz, że właśnie tak się je nazywa. Są to zwykłe formularze HTML, które zapamiętują wszystko, co do nich wpisałeś. Z punktu widzenia użytkownika końcowego jest to bardzo przydatne, zwłaszcza gdy trzeba ponownie wypełnić ten sam formularz. Aby określić początkową wartość widniejącą w tekstowym polu wejściowym, wprowadź atrybut value: input type= text name= city size= 20 value= Innsbruck / Jeśli chcesz, aby to PHP określił tę wartość, użyj po prostu polecenia echo() dla odpowiedniej zmiennej: input type= text name= city size= 20 value= ?php echo $city; ? / Zmodyfikuję teraz skrypt kalkulator.php w taki sposób, aby zapamiętywał on wprowadzane dane. Tworzenie dynamicznych stron WWW Aby utworzyć formularz z pamięcią: 1. Otwórz w edytorze tekstów plik kalkulator.php (patrz listing 3.5). 2. Zmień definicję pola wejściowego quantity (listing 3.6): p Nazwisko: input type= text name= quantity size= 5 maxlength= 10 value= ?php if (isset($_POST[ quantity ])) echo $_POST[ quantity ]; ? / /p Po pierwsze, dodałem do pola wejściowego atrybut value. Następnie przesłałem do przeglądarki wartość zmiennej $_POST[ quantity ]. Muszę jednak najpierw upewnić się, czy ma ona w ogóle jakąś wartość. W tym celu zastosowałem następujący fragment kodu: ?php if (isset($_POST[ quantity ])) { echo $_POST[ quantity ]; } ? Kod ten zapisałem w skrypcie maksymalnie zwięźle (korzystając z tego, że jeśli blok wyrażenia warunkowego zawiera tylko jedną instrukcję, to można pominąć nawiasy klamrowe). 3. Powtórz te operacje dla ceny i podatku. p Cena: input type= text name= price size= 5 maxlength= 10 value= ?php if (isset($_POST[ price ])) echo $_POST[ price ]; ? / /p p Podatek: /b input type= text name= tax size= 5 maxlength= 10 value= ?php if (isset($_POST [ tax ])) echo $_POST[ tax ]; ? / /p T w o r z e n i e f o r m u l a r z y z p a m i ę c i ą 109 Rozdział 3. Listing 3.6. Formularz kalkulatora zapamiętuje teraz informacje wprowadzane przez użytkownika 1 ?php # Script 3.6 - calculator.php 2 $page_title = Kalkulator kosztów ; 3 include ( ./includes/naglowek.html ); 4 5 // Sprawdź czy formularz został wysłany. 6 if (isset($_POST[ submitted ])) { 7 8 // Podstawowa weryfikacja danych we formularzu. 9 if ( is_numeric($_POST[ quantity ]) is_numeric($_POST[ price ]) is_numeric($_POST[ tax ]) ) { 10 11 // Wylicz wyniki. 12 $taxrate = $_POST[ tax ] / 100; // Zamień 5 na .05. 13 $total = ($_POST[ quantity ] * $_POST[ price ]) * ($taxrate + 1); 14 15 // Wyświetl wyniki. 16 echo h1 id= mainhead Całkowity koszt /h1 17 p Kupujesz . $_POST[ quantity ] . sztuk w cenie . number_format ($_POST[ price ], 2) . zł za egzemplarz. Po uwzględnieniu podatku . $_POST[ tax ] . , daje to całkowity koszt . number_format ($total, 2) . . /p p br / /p ; 18 19 } else { // Wprowadzono niepoprawne dane. 20 echo h1 id= mainhead Błąd! /h1 21 p class= error Wprowadź poprawną liczbę egzemplarzy, cenę i podatek. /p p br / /p ; 22 } 23 24 } // Koniec głównego IF. 25 26 // Koniec sekcji PHP i początek formularza HTML. 27 ? 28 h2 Kalkulator kosztów /h2 29 form action= calculator.php method= post 30 p Liczba egzemplarzy: input type= text name= quantity size= 5 maxlength= 10 value= ?php if (isset($_POST[ quantity ])) echo $_POST[ quantity ]; ? / /p 31 p Cena: input type= text name= price size= 5 maxlength= 10 value= ?php if (isset($_POST[ price ])) echo $_POST[ price ]; ? / /p 32 p Podatek: /b input type= text name= tax size= 5 maxlength= 10 value= ?php if (isset($_POST [ tax ])) echo $_POST[ tax ];? / /p 33 p input type= submit name= submit value= Oblicz! / /p 34 input type= hidden name= submitted value= TRUE / 35 /form 36 ?php 37 include ( ./includes/stopka.html ); 38 ? ą i c ę i m a p z y z r a l u m r o f e i n e z r o w T 110 Tworzenie dynamicznych stron WWW 4. Zapisz plik pod nazwą kalkulator.php, wgraj go na serwer i przetestuj w przeglądarce internetowej (rysunek 3.10 i 3.11). Wskazówki (cid:132) Ponieważ w tym przykładzie kod PHP występuje również jako wartość atrybutu HTML o nazwie value, to komunikaty o błędach mogą wydawać się niezrozumiałe. W przypadku takich problemów, sprawdź w kodzie źródłowym HTML, czy błędy PHP są wyświetlane wewnątrz atrybutu value. (cid:132) Wartości atrybutów HTML powinieneś zawsze umieszczać w cudzysłowach. Dotyczy to zwłaszcza atrybutu value. W przeciwnym razie wartość złożona z kilku słów, na przykład Jan Kowalski, pojawi się w przeglądarce jako Jan. (cid:132) Jeśli serwer używa opcji Magic Quotes, to zanim wyświetlisz zmienne łańcuchowe jako wartości pól wejściowych, powinieneś zastosować funkcję stripslashes(): input type= text name= last_name size= 20 value= ?php if (isset ($_POST[ last_name ])) echo stripslashes($_POST[ last_name ]); ? / (cid:132) Ze względu na ograniczenia wynikające ze sposobu działania języka HTML nie można określić początkowej wartości pola wejściowego typu password. (cid:132) Aby wstępnie zaznaczyć wybrane przyciski opcji i pola wyboru, wprowadź do definiujących je znaczników atrybut checked= checked . input type= checkbox name= interests value= Narty checked= checked / input type= radio name= gender value= Kobieta checked= checked / (cid:132) Aby określić początkową zawartość obszaru tekstowego, umieść ją między znacznikami textarea: textarea name= comments rows= 10 cols= 50 ?php echo $_POST[ comments ]; ? /textarea 111 T w o r z e n i e f o r m u l a r z y z p a m i ę c i ą Rysunek 3.10. Ta wersja formularza zapamiętuje informacje wprowadzone poprzednim razem… Rysunek 3.11. … niezależnie od tego czy formularz został wypełniony w całości. (cid:132) Aby wstępnie wybrać pozycję menu, użyj atrybutu selected: select name= year option value= 2005 2005 /option option value= 2006 selected= selected 2006 /option /select Przykład takiego rozwiązania pokażę pod koniec rozdziału. Rozdział 3. Tworzenie i wywoływanie własnych funkcji Jak zdążyłeś się już przekonać, PHP ma bardzo wiele wbudowanych funkcji zdolnych zaspokoić niemal każde potrzeby. Ważniejsze jest jednak to, że możesz tworzyć własne funkcje realizujące określone przez Ciebie zadania. Tworząc funkcje, posługujemy się następującą składnią: function nazwa_funkcji() { // Kod funkcji. } Nazwa Twojej funkcji może być dowolną kombinacją liter, cyfr i znaków podkreślenia, przy czym nie może zaczynać się od cyfry. Nie możesz również używać nazw funkcji, które już istnieją (print, echo, isset itp.). W rozdziale 1. wspominałem już, że PHP nie rozróżnia w nazwach funkcji małych i wielkich liter (zatem inaczej niż w przypadku zmiennych), w związku z czym zdefiniowaną powyżej funkcję można wywołać, pisząc: nazwa_funkcji(), nazwa_Funkcji(), NAZWA_FUNKCJI() itp. Kod występujący w ciele funkcji może wykonywać niemal dowolne operacje, począwszy od generowania kodu HTML, na przeprowadzaniu obliczeń skończywszy. Właśnie takie czynności będą wykonywały funkcje, które zdefiniuję w tym rozdziale. Aby utworzyć własną funkcję: 1. Utwórz w edytorze tekstów nowy dokument PHP (listing 3.7). ?php # Skrypt 3.7 - formularzdaty.php $page_title = Formularz Kalendarza ; include ( ./includes/naglowek.html ); Strona ta będzie wykorzystywała ten sam szablon co dwie poprzednie. 112 i j c k n u f e i n a w y ł o w y w i e i n e z r o w T Listing 3.7. Ta funkcja przydaje się przy tworzeniu większej liczby menu rozwijalnych 1 ?php # Skrypt 3.7 - kalendarz.php 2 $page_title = Kalendarz ; 3 include ( ./includes/naglowek.html ); 4 5 // Funkcja tworząca trzy menu rozwijalne wyboru miesięcy, dni i lat. 6 function make_calendar_pulldowns() { 7 8 // Utwórz tablicę miesięcy. 9 $months = array (1 = Styczeń , Luty , Marzec , Kwiecień , Maj , Czerwiec , Lipiec , Sierpień , Wrzesień , Październik , Listopad , Grudzień ); 10 11 // Utwórz menu miesięcy. 12 echo select name= month ; 13 foreach ($months as $key = $value) { 14 echo option value= $key $value /option ; 15 } 16 echo /select ; 17 18 // Utwórz menu dni. 19 echo select name= day ; 20 for ($day = 1; $day = 31; $day++) { 21 echo option value= $day $day /option ; 22 } 23 echo /select ; 24 25 // Utwórz menu lat. 26 echo select name= year ; 27 for ($year = 2005; $year = 2015; $year++) { 28 echo option value= $year $year /option ; 29 } 30 echo /select ; 31 32 } // Koniec definicji funkcji. 33 34 // Utwórz znaczniki formularza 35 echo h1 id= mainhead Wybierz datę: /h1 36 p br / /p form action= kalendarz.php method= post ; 37 38 // Wywołaj funkcję. 39 make_calendar_pulldowns(); 40 41 echo /form p br / /p ; // Koniec formularza. 42 43 include ( ./includes/stopka.html ); 44 ? Tworzenie dynamicznych stron WWW 2. Zacznij od zdefiniowania nowej funkcji. function make_calendar_pulldowns() { Funkcja, którą napiszę, będzie generowała menu rozwijalne dla dni, miesięcy i lat, podobnie jak skrypt kalendarz.php (patrz listing 2.12). Nazwa, którą nadałem funkcji, jednoznacznie określa jej przeznaczenie1. Chociaż nie jest to wymagane, definicje funkcji umieszcza się zwykle na początku skryptu lub w osobnym pliku. 3. Wygeneruj menu rozwijalne. $months = array (1 = Styczeń , Luty , Marzec , Kwiecień , Maj , Czerwiec , Lipiec , Sierpień , Wrzesień , Październik , Listopad , Grudzień ); echo select name= month ; foreach ($months as $key = $value) { echo option value= $key $value /option ; } echo /select echo select name= day ; for ($day = 1; $day = 31; $day++) { echo option value= $day $day /option ; } echo /select select name= year ; for ($year=2003; $year = 2010; $year++) { echo option value= $year $year /option ; } echo /select ; Jest to dokładnie ten sam kod co w oryginalnym skrypcie, z tym że teraz umieściliśmy go w ciele funkcji. Jedyna drobna zmiana polega na użyciu pętli for do stworzenia menu rozwijalnego lat (poprzednio wykorzystaliśmy w tym celu pętlę while). 4. Zamknij definicję funkcji. } // Koniec definicji funkcji. Gdy kod jest dość skomplikowany, warto wstawiać na końcu definicji funkcji komentarze, ponieważ dzięki nim wiadomo, gdzie definicja się kończy, a gdzie zaczyna. T w o r z e n i e i w y w o ł y w a n i e f u n k c j i 1 make callendar pulldown to po angielsku „utwórz menu rozwijalne kalendarza” — przyp. tłum. 113 Rysunek 3.12. Menu rozwijalne wygenerowane przez funkcję zdefiniowaną przez użytkownika Rozdział 3. 5. Utwórz formularz i wywołaj funkcję. echo h1 id= mainhead Wybierz datę: /h1 p br / /p form action= formularzdaty.php method= post ; make_calendar_pulldowns(); echo /form p br / /p ; Ten fragment kodu tworzy znaczniki definiujące formularz (oraz używa znaczników HTML do stworzenia układu strony) i wywołuje funkcję make_calendar_pulldown(), która generuje kod opisujący trzy menu rozwijalne. 6. Dokończ skrypt PHP, dołączając plik stopki. include ( ./includes/stopka.html ); 7. Zapisz plik pod nazwą formularzdaty.php, wgraj go na serwer (do tego samego katalogu co plik index.php) i przetestuj w przeglądarce internetowej (rysunek 3.12). Wskazówki (cid:132) Jeśli pojawi się komunikat o błędzie call to undefined function nazwa_funkcji, oznacza on, że wywołałeś funkcję, która nie jest zdefiniowana. Może się to zdarzyć na skutek błędnego wpisania nazwy funkcji (podczas jej definiowania lub wywołania) lub gdy zapomnisz dołączyć plik, w którym zdefiniowałeś funkcję. (cid:132) Ponieważ funkcje definiowane przez użytkownika zajmują nieco miejsca w pamięci, powinieneś zawsze zastanowić się, czy w danym przypadku warto je stosować. Zazwyczaj ich użycie opłaca się wówczas, gdy dany fragment kodu wykonywany jest wiele razy w różnych miejscach skryptu lub witryny. i j c k n u f e i n a w y ł o w y w i e i n e z r o w T 114 Rysunek 3.13. Często popełnianym błędem jest pominięcie któregoś z argumentów lub przekazanie do funkcji argumentu niewłaściwego typu Tworzenie dynamicznych stron WWW Tworzenie funkcji pobierających argumenty Funkcje tworzone przez użytkownika, podobnie jak wbudowane funkcje PHP, mogą pobierać argumenty (zwane także parametrami). Na przykład argumentem funkcji print() jest to, co chcesz przesłać do przeglądarki, a argumentem strlen() jest łańcuch znaków, którego długość chcesz poznać. Każda funkcja może pobierać dowolną liczbę argumentów, przy czym niezwykle istotna jest kolejność ich występowania. Definiując funkcję, wprowadź w miejscu występowania argumentów nazwy zmiennych: function print_hello ($first, $last) { // Kod funkcji. } Funkcję tę możesz następnie wywołać jak każdą inną funkcję PHP, przekazując jej zmienne lub literały: print_hello ( Jimmy , Stewart ); $surname = Stewart ; print_hello ( Jimmy , $surname); Tak samo jak w przypadku każdej innej funkcji, podanie nieprawidłowej liczby argumentów, spowoduje wystąpienie błędu (rysunek 3.13). Nazwy zmiennych, które wybierzesz dla argumentów, nie mają znaczenia z punktu widzenia pozostałej części skryptu (dowiesz się o tym w podrozdziale „Zasięg zmiennej”), dlatego postaraj się, aby były one jednoznaczne i jak najbardziej opisowe. Aby zademonstrować omawiane tu zagadnienia, przepiszę teraz przykład z kalkulatorem, tak aby wykorzystywał on funkcję. T w o r z e n i e i w y w o ł y w a n i e f u n k c j i 115 Rozdział 3. Aby zdefiniować funkcje pobierające argumenty: 1. Otwórz w edytorze tekstów skrypt kalkulator.php (listing 3.8). 2. Tuż za wierszem, w którym dołączasz plik nagłówka, zdefiniuj funkcję calculate_total(). function calculate_total ($qty, $cost, $tax) { $taxrate = $tax / 100; $total = ($qty * $cost) * ($taxrate + 1); $total = number_format ($total, 2); echo p Kupujesz . $qty . sztuk w cenie . number_format ($cost, 2) . zł za egzemplarz. Po uwzględnieniu podatku . $tax . daje to . number_format ($total, 2) . zł. /p ; } Funkcja ta przeprowadza te same obliczenia co w przykładzie z rozdziału 2. i zwraca wyniki. Pobiera ona trzy argumenty: liczbę zamówionych sztuk, cenę jednostkową i wysokość podatku. Zwróć uwagę, że zmiennymi używanymi przez funkcję nie są $_POST[ quantity ], $_POST[ price ] ani $_POST[ tax ]. Zmienne argumentów funkcji posiadają swoje własne nazwy ważne w obrębie danej funkcji. i j c k n u f e i n a w y ł o w y w i e i n e z r o w T Listing 3.8. Ta wersja skryptu kalkulatora używa do wykonania obliczeń funkcji z parametrami 1 ?php # Skrypt 3.8 - kalkulator.php (trzecia wersja skryptów 3.5 i 3.6) 2 $page_title = Kalkulator kosztów ; 3 include ( ./includes/naglowek.html ); 4 5 /* Funkcja wyliczająca całkowity koszt 6 i wyświetlająca wynik. */ 7 function calculate_total ($qty, $cost, $tax) { 8 9 $taxrate = $tax / 100; // Zamień 5 na .05. 10 $total = ($qty * $cost) * ($taxrate + 1); 11 echo p Kupujesz . $qty . sztuk w cenie . number_format($cost, 2) . zł za egzemplarz. Po uwzględnieniu podatku . $tax . daje to całkowity koszt . number_ format($total, 2) . zł. /p ; 12 13 } // Koniec funkcji. 14 15 // Sprawdź czy formularz został wysłany. 16 if (isset($_POST[ submitted ])) { 17 18 // Podstawowa weryfikacja danych formularza. 19 if ( is_numeric($_POST[ quantity ]) is_numeric($_POST[ price ]) is_numeric($_POST[ tax ]) ) { 20 21 // Wyświetl nagłówek. 22 echo h1 id= mainhead Całkowity koszt /h1 ; 23 24 // Wywołaj funkcję. 25 calculate_total ($_POST[ quantity ], $_POST[ price ], $_POST[ tax ]); 26 116 Listing 3.8. Ta wersja skryptu kalkulatora używa do wykonania obliczeń funkcji z parametrami — ciąg dalszy 3. Zmień wyrażenie warunkowe strony weryfikujące dane (poprzednio były w nim wykonywane obliczenia). Tworzenie dynamicznych stron WWW 27 // Wyświetl odstępy 28 echo p br / /p ; 29 30 } else { // Wprowadzono niepoprawne wartości. 31 echo h1 id= mainhead Błąd! /h1 32 p class= error Wprowadź poprawną liczbę egzemplarzy, cenę i podatek. /p p br / /p ; 33 } 34 35 } // Koniec głównego IF. 36 37 // Koniec sekcji PHP i początek formularza HTML. 38 ? 39 h2 Kalkulator kosztów /h2 40 form action= kalkulator.php method= post 41 p Liczba egzemplarzy: input type= text name= quantity size= 5 maxlength= 10 value= ?php if (isset($_POST[ quantity ])) echo $_POST[ quantity ]; ? / /p 42 p Cena: input type= text name= price size= 5 maxlength= 10 value= ?php if (isset($_POST[ price ])) echo $_POST[ price ]; ? / /p 43 p Podatek: /b input type= text name= tax size= 5 maxlength= 10 value= ?php if (isset($_POST [ tax ])) echo $_POST[ tax ];? / /p 44 p input type= submit name= submit value= Oblicz! / /p 45 input type= hidden name= submitted value= TRUE / 46 /form 47 ?php 48 include ( ./includes/stopka.html ); 49 ? echo h1 id= mainhead Ogólny koszt /h1 calculate_total ($_POST[ quantity ], $_POST[ price ], $_POST[ tax ]); echo p br / p ; Również i tym razem tylko nieznacznie zmieniłeś sposób działania skryptu. Wyświetlany jest nagłówek, a następnie wywoływana funkcja i dodawane odpowiednie odstępy na stronie. Wywoływanej funkcji zostają przekazane trzy argumenty, z których każdy jest zmienną $_POST. Wartość zmiennej $_POST[ quantity ] zostaje przypisana zmiennej $qty funkcji; wartość zmiennej $_POST[ price ] zostaje przypisana zmiennej $cost funkcji; wartość zmiennej $_POST[ tax ] zostaje przypisana zmiennej $tax funkcji. 4. Zapisz plik pod nazwą kalkulator.php, wgraj go na serwer i przetestuj w przeglądarce internetowej (rysunek 3.14). T w o r z e n i e i w y w o ł y w a n i e f u n k c j i Rysunek 3.14. Obliczenia wykonuje teraz funkcja zdefiniowana przez użytkownika, która wyświetla również wyniki 117 Rozdział 3. Nadawanie argumentom wartości domyślnych Własne funkcje można też definiować w nieco inny sposób, a mianowicie ustalając domyślne wartości argumentów. function greet($name, $greeting = Hello ) { echo $greeting, $name! ; } Na skutek określenia wartości domyślnej dla danego argumentu staje się on argumentem opcjonalnym i nie trzeba umieszczać go w wywołaniu funkcji. Jeżeli to zrobisz, wykorzystana zostanie podana przez Ciebie wartość. Jeśli nie, w funkcji będzie obowiązywała wartość domyślna. Możesz określić wartości domyślne dla dowolnej liczby argumentów, pod warunkiem że są to ostatnie argumenty na liście parametrów funkcji. Innymi słowy, wszystkie te argumenty, których wartość musi być określona przez użytkownika, muszą znaleźć się na początku listy argumentów. W przypadku funkcji zdefiniowanej powyżej wszystkie pokazane tu wywołania są prawidłowe: greet($surname, $message); greet( Roberts ); greet( Grant , Dobry wieczór ); Natomiast wywołanie greet() jest nieprawidłowe, ponieważ nie można nadać wartości argumentowi $greeting bez nadania wartości argumentowi $name. Aby określić domyślne wartości argumentów: 1. Otwórz w edytorze tekstów plik kalkulator.php (patrz listing 3.8). 2. Zmień wiersz zawierający definicję funkcji (wiersz 7.) w taki sposób, aby wymaganymi argumentami były liczba sztuk i cena jednostkowa ($qty i $cost, listing 3.9). function calculate_total ($qty, $cost, $tax = 5) { Wartość zmiennej $tax jest teraz zakodowana na stałe w definicji funkcji a tym samym jest opcjonalna. 118 i j c k n u f e i n a w y ł o w y w i e i n e z r o w T Listing 3.9. Jeżeli w wywołaniu tej wersji funkcji calculate_total() nie zostanie określona wartość podatku, to funkcja wykorzysta wartość domyślną 1 ?php # Skrypt 3.9 - kalkulator.php (czwarta wersja skryptów 3.5, 3.6 i 3.8) 2 $page_title = Kalkulator kosztów ; 3 include ( ./includes/naglowek.html ); 4 5 /* Funkcja wyliczająca całkowity koszt 6 i wyświetlająca wynik. */ 7 function calculate_total ($qty, $cost, $tax = 5) { 8 9 $taxrate = $tax / 100; // Zamień 5 na .05. 10 $total = ($qty * $cost) * ($taxrate + 1); 11 echo p Kupujesz . $qty . sztuk w cenie . number_format($cost, 2) . zł za egzemplarz. Po uwzględnieniu podatku . $tax . daje to całkowity koszt . number_format($total, 2) . zł. /p ; 12 13 } // Koniec funkcji. 14 15 // Sprawdź czy formularz został wysłany. 16 if (isset($_POST[ submitted ])) { 17 18 if (is_numeric($_POST[ quantity ]) is_numeric($_POST[ price ])) { 19 20 // Wyświetl nagłówek. 21 echo h1 id= mainhead Całkowity koszt /h1 ; 22 23 if (is_numeric($_POST[ tax ])) { 24 calculate_total ($_POST[ quantity ], $_POST[ price ], $_POST[ tax ]); 25 } else { 26 calculate_total ($_PO
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
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ą: