Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Podzikowania.....................................................................................................17
O Autorze ............................................................................................................18
Wprowadzenie .....................................................................................................19
Rozdzia 1. Wprowadzenie do PHP ........................................................................21
Szczegowe omwienie......................................................................................................... 21
Dzieje programowania .........................................................................................................................22
Nieco historii ...................................................................................................................................22
Diagnostyka.....................................................................................................................................24
Zalety PHP ...........................................................................................................................................24
Interpretacja a kompilacja ...............................................................................................................25
Czci a programowanie .................................................................................................................25
Kontrolowanie wyjcia....................................................................................................................26
PHP4.....................................................................................................................................................26
Nowe funkcje ..................................................................................................................................26
Nowa nazwa ....................................................................................................................................27
Szybko..........................................................................................................................................27
Debugger PHP.................................................................................................................................28
COM dla Windows..........................................................................................................................28
Funkcje wyrae regularnych .........................................................................................................28
PHP i Apache .......................................................................................................................................29
Apache na dowolnej platformie ......................................................................................................29
Modu lub CGI ................................................................................................................................30
Podstawy PHP ......................................................................................................................................30
Skadnia ...........................................................................................................................................31
If, then, else .....................................................................................................................................32
Korzystanie z odpowiednich typw danych....................................................................................33
Ogranicz wejcie, rozszerz wyjcie.................................................................................................34
Dzienniki ..............................................................................................................................................39
Sterowanie wyjciem............................................................................................................................40
Bezpieczestwo ....................................................................................................................................40
Wyraenia regularne.............................................................................................................................41
ereg() ...............................................................................................................................................41
ereg_replace()..................................................................................................................................41
eregi() ..............................................................................................................................................42
eregi_replace().................................................................................................................................42
split() ...............................................................................................................................................42
spliti() ..............................................................................................................................................42
Rozdzia 3. Tablice...............................................................................................83
Szczegowe omwienie......................................................................................................... 83
Proste tablice ........................................................................................................................................84
Najprostsza tablica wiata ...............................................................................................................84
Elementy tablic s liczone od zera ..................................................................................................84
Elementy tablic mog mie dowolne nazwy...................................................................................85
Funkcje tworzce tablice .................................................................................................................86
Potencjalne problemy ...........................................................................................................................86
Wicej wymiarw.................................................................................................................................87
Wskanik tablicy ..................................................................................................................................88
Spis treci
Sortowanie tablic..................................................................................................................................89
Odkadanie, zdejmowanie, uzupenianie i czenie..............................................................................91
Odkadanie i zdejmowanie ..............................................................................................................91
Uzupenianie....................................................................................................................................92
czenie ..........................................................................................................................................92
Haszowanie danych............................................................................................................................134
mhash()..........................................................................................................................................134
mhash_get_hash_name() ...............................................................................................................136
mhash_get_block_size()................................................................................................................136
mhash_count() ...............................................................................................................................137
mhash_keygen_s2k().....................................................................................................................137
Spis treci
InterBase........................................................................................................................................192
Microsoft Access...........................................................................................................................193
Microsoft SQL Server ...................................................................................................................194
mSQL ............................................................................................................................................194
Oracle ............................................................................................................................................195
Ovirimos SQL Server....................................................................................................................196
SESAM/SQL-Server .....................................................................................................................196
Solid ..............................................................................................................................................197
Sybase............................................................................................................................................197
Warstwy abstrakcji baz danych..........................................................................................................197
Funkcje DBA.................................................................................................................................198
Funkcje DBM................................................................................................................................199
Funkcje DBX.................................................................................................................................200
Spis treci
Tworzenie funkcji...............................................................................................................................340
Deklarowanie zmiennej globalnej ......................................................................................................341
Deklarowanie zmiennej statycznej.....................................................................................................342
Przechowywanie nazwy funkcji w zmiennej .....................................................................................343
Uycie domylnych parametrw funkcji............................................................................................344
Sprawdzanie, czy funkcja istnieje ......................................................................................................345
Korzystanie z funkcji call_user_func() ..............................................................................................346
10
Spis treci
11
GNU recode........................................................................................................................................398
GNU gettext .......................................................................................................................................399
Pisownia .............................................................................................................................................400
Dopasowywanie sw....................................................................................................................401
Aspell ............................................................................................................................................402
Pspell .............................................................................................................................................403
Znaki wielobajtowe ............................................................................................................................405
12
Spis treci
13
Wysyanie wiadomoci.......................................................................................................................508
Wysyanie pojedynczej wiadomoci .............................................................................................508
Wysyanie nagwka From............................................................................................................510
Wysyanie wielu nagwkw ........................................................................................................511
Wysyanie pojedynczej wiadomoci do wielu odbiorcw ............................................................512
Wysyanie wiadomoci z zacznikami..............................................................................................514
Wybr danych testowych ..............................................................................................................515
Gromadzenie informacji o pliku ...................................................................................................515
Budowanie nagwkw MIME .....................................................................................................517
Budowanie czci wiadomoci MIME..........................................................................................518
Budowanie zwykych nagwkw ................................................................................................519
Wysyanie wiadomoci .................................................................................................................520
Weryfikowanie adresw email...........................................................................................................520
14
Kompresja ..........................................................................................................................................538
bzip2 ..............................................................................................................................................539
gzip ................................................................................................................................................541
Spis treci
15
get_class_methods() ......................................................................................................................575
get_class_vars() .............................................................................................................................576
get_declared_classes()...................................................................................................................576
get_object_vars() ...........................................................................................................................577
get_parent_class()..........................................................................................................................577
is_subclass_of().............................................................................................................................578
method_exists() .............................................................................................................................578
Dostosowywanie strony WWW za pomoc obiektu..........................................................................578
Odczytywanie wiadomoci grup dyskusyjnych .................................................................................582
16
Rozdzia 9.
Formularze
Szczegowe omwienie
Formularze tworzy si w PHP do atwo, a dziki tablicom mona w nich bez trudu
umieszcza nawet dugie listy pozycji. atwo prezentacji zmiennych z cookies, kwerend URL oraz formularzy z metodami i oznacza, e moesz szybko przej do
wielostronicowych formularzy oraz specjalnych mechanizmw, na przykad wysyania
plikw do serwera. Kontrolki formularzy mog by uywane take z czym, co nie jest
powizane z tradycyjnymi formularzami, na przykad z alternatywn nawigacj, opisywan w nastpnym podrozdziale. Moesz uywa przyciskw Wylij w formularzach
jako alternatywy dla obrazkw i czy podczas nawigacji.
W tym rozdziale poo nacisk na sposoby tworzenia pyta w formularzach, tak, aby
mg atwo i szybko tworzy formularze bez koniecznoci ponownego pisania kodu.
Wzorcowa funkcja formularza i pyta, budowana w podrozdziale Natychmiastowe
rozwizania, pozwoli na dodawanie pyta i formatowanie formularza bez modyfikacji
kodu. Jeli przeczytae rozdziay 5. i 20., moesz zechcie skierowa dane otrzymane
od funkcji formularza do bazy danych lub pliku XML. Korzystanie z bazy danych bdzie odpowiednie dla stron, ktre ulegaj gwatownym przemianom.
Alternatywna nawigacja
Powszechnym sposobem czenia stron jest uycie znacznika zakotwiczenia, .
Znacznik ten przekazuje zmienne poprzez acuch URL, ale takie acuchy szybko staj
si bardzo zoone, gdy aduje si je ze zmiennymi. Formularze mog przekazywa
wartoci za pomoc bardziej przejrzystej metody , ktra dziaa zarwno z bardzo
obszernymi wartociami, jak i z bardzo dugimi listami wartoci (zdarzyo mi si, e za
pomoc metody przekazywaem z jednego formularza do drugiego czterdzieci
dziewi tysicy nazw plikw).
W przypadku formularzy znacznik
odpowiada znacznikowi , znaczniki
odpowiadaj poszczeglnym pozycjom acucha kwerendy, za przycisk wysyania
formularza odpowiada tekstowi, jaki umieszczasz pomidzy pocztkowym a kocowym
znacznikiem zakotwiczenia. Przedstawiony dalej przykad pokazuje standardowe cze
z przygotowan kwerend URL; tu po nim zostao pokazane to samo cze, uzyskane
292
dziki uyciu formularza. Kwerenda oferuje mechanizm wyczenia ju przegldanych dokumentw; w pierwszym przykadzie kady wyczony dokument jest nazywany z uyciem
pola o nazwie . W przykadzie z formularzem wykorzystywane jest w tym celu
pole
, powodujce utworzenie prostej tablicy w PHP. Z czasem, gdy przegldarka
odwiedzi ju tuziny dokumentw, pierwsza wersja cza zacznie powodowa w wikszoci
przegldarek bdy, podczas gdy w drugiej wersji moe zosta obsuonych wielokrotnie
wicej nazw plikw, ni jestem w stanie odwiedzi podczas jednej sesji.
!""##""$$
!$%!"!%!&
'
'
'
(
)* +
),
)
(
)
(
)
(
)
(
)
(
)
-.(
"##""$$)
-.(
%!"!%!&)
(
(
)
(
*)
+),
Rozdzia 9.
Formularze
293
pocztkowego znacznika,
,
294
Znaczniki te mona umieszcza wewntrz struktur ukadu strony (na przykad jako komrki tabeli) lub uj ca tabel w znacznik
i umieci poszczeglne znaczniki
w osobnych komrkach, tak jak w nastpujcym przykadzie:
)
/
)
)
+)
Dzwonki i gwizdki
HTML nie posiada znacznika #$% , za PHP nie zawiera funkcji &$#%'(. Musisz dokadnie rozway poziom zoonoci, jaki chcesz umieci w formularzu, aby
speni wygrowane wymagania wydziau marketingu. PHP pozwala na tworzenie formularza za pomoc prostych funkcji, tablic i zoonych obiektw. To, czego potrzebujesz, to jak najprostszy sposb zmiany wygldu formularza, gdy osoby testujce zgosz
wszystkie problemy, jakie w nim odkryli.
Rozdzia 9.
Formularze
295
Dobrym sposobem jest oddzielenie formatowania, kolejnoci i danych, aby mona byo
zmienia kolejno pyta bez zmiany formatowania oraz by kto inny mg zmieni
tre pytania bez wymagania od Ciebie modyfikacji kodu strony. Tre pyta moesz
przechowywa w tablicy przetwarzanej w ptli, jak pokazano w nastpnym przykadzie
(szczegy korzystania z tablic przedstawia rozdzia 3.). Kolejno pyta moe zosta
zmieniona przez zwyk zamian kolejnoci pozycji tablicy.
-.0,
-.
,
-.
1/23,
-.
1,
/
445(6
4
667
4 )8
19(6,
:
Jeli masz bardziej zoone nazwy, atwiejsze moe okaza si identyfikowanie pozycji
wedug ich indeksu w tablicy. Gdy przetwarzasz list, moesz uy indeksu elementu,
aby ponownie znale go w tablicy. Rozwamy nastpujc list elementw trafiajcych
do formularza:
-.;
,
-.<
,
-.=
,
-.>
?,
-.@
>
,
Guran jest wanym rdem kofeiny; w jej nazwie zawiera si akcentowane , ktre
sprawia kopot osobom prbujcym wpisa je w polu tekstowym lub w kodzie. Nazwy tego rodzaju powinny znale si na licie wyboru, aby nie musia przetwarza znakw.
Gdy zamieniasz list na pozycj wyboru, jako identyfikatora uyj indeksu elementu listy.
Przy przetwarzaniu tablic korzystaj z technik przetwarzania tablic i list. Najpierw wyzeruj wskanik tablicy, przechodzc na jej pocztek, po czym przetwrz kad pozycj za
pomoc ptli $)'( oraz instrukcji '( i )'(. W podrozdziale Natychmiastowe
rozwizania znajdziesz mnstwo przykadw kodu. Gwnym celem jest uniknicie
uycia konkretnej nazwy jako identyfikatora przez przetwarzanie listy jako caoci, oraz
uniknicie kodu, wymagajcego identyfikowania konkretnego elementu.
Tak si skada, e tablice w PHP uwzgldniaj wielko liter, dlatego pozycja *
+
, rni si od pozycji *
. Bd uwany przy czeniu nazw
wywietlanych z nazwami uywanymi do identyfikacji elementw. Osobicie korzystam w celu usunicia spacji z wywietlanej nazwy i zmiany wszystkiego na mae
litery z nastpujcej sztuczki:
A
B
,
/
4A
455
A
66,
Techniki zmiany tekstu strony na podstawie jzyka znajdziesz w rozdziaach 12. i 20.;
dowiesz si w nich, jak wprowadza tekst w formacie o okrelonej strukturze. Oba rozdziay pokazuj sposoby, jakimi moesz si posuy, by przetwarza obszerne listy
296
tekstu tworzonego przez inne osoby; s to techniki, ktrych moesz uy do formatowania swoich formularzy. Oddzielajc kolejno i formatowanie od treci pyta, moesz skoncentrowa si na tworzeniu strony i innych zagadnieniach, na przykad na rodzaju pyta, jakie zadajesz.
Pytania formularza
HTML oferuje rne sposoby zadawania pyta i otrzymywania odpowiedzi, od prostych
przyciskw opcji i przyciskw radiowych po rozbudowane listy wyboru. Chcesz, by pytanie byo zrozumiae dla klienta i by ograniczao jego odpowiedzi do poprawnych moliwoci. Moesz czy rodzaje pyta; moesz na przykad da do wyboru trzy przyciski
radiowe oraz pole tekstowe, w ktrym uytkownik moe wpisa ewentualny komentarz.
Oto przykadowe pomyki, ktre czsto zdarzaj si na amerykaskich witrynach, prbujcych prowadzi sprzeda w Azji i w krajach Pacyfiku. Witryny te:
zawieraj listy wyboru stanu, ktre pozwalaj wybra wycznie stany USA;
daj podania stanu, bez brania pod uwag faktu, i wiele krajw nie posiada
odpowiednika amerykaskiego stanu;
Pytania Tak/Nie
Przedstawione tu pytania pasuj do przyciskw radiowych w formularzach HTML:
Przyciski radiowe s najbardziej przydatne wtedy, gdy chcesz uzyska tylko jedn odpowied z listy kilku moliwych. W przegldarce pytanie wyglda tak, jak pokazano na
rysunku 9.1. Odpowied powinna wyglda tak, jak pokazano na rysunku 9.2.
Rysunek 9.1.
Pytanie Tak/Nie
z zastosowaniem
przyciskw radiowych
Rysunek 9.2.
Odpowied
na pytanie Tak/Nie
Rozdzia 9.
Formularze
297
(
)
,,,F
(
)
,,,
(
E
)
+)
W pytaniu moesz umieci dowoln ilo odpowiedzi do wyboru, o ile maj te same
nazwy. Gdy pominiesz pole
, niektre przegldarki przyjm nazw poprzedniego
przycisku radiowego, ale nie sdz, e dziaaj tak wszystkie przegldarki.
Gdy pominiesz pole -, PHP zwrci warto . Moesz nada kadej moliwoci
inn nazw i poszuka zmiennej o wartoci , ale w gruncie rzeczy jest to do zoony
sposb kodowania pytania z kilkoma odpowiedziami. Aby zilustrowa t trudno, nastpny fragment kodu zawiera bdzie dwie linie z przykadu z pytaniem o ryby; pierwszy znacznik ma nazw
) , za drugi nazwano
), dziki czemu moesz sprawdzi istnienie dowolnego z pl. To podejcie wydaje si by najprostsze, gdy
kade pytanie zawiera niewielk ilo odpowiedzi, ale staje si trudne do opanowania,
gdy ilo moliwych odpowiedzi wzrasta.
(
)
,,,F
(
)
Upewnij si, e kade pytanie ma inne pole
i e nazwa tego pola nie koliduje z adn
inn zmienn PHP. Najlepsz technik moe si okaza uycie numeru kolejnoci pytania, *% i budowanie nazwy z zastosowaniem wsplnego przedrostka (na przykad
. ), jak pokazano w kolejnym przykadzie kodu. Zmienne zwrcone z formularza bd miay wtedy nazwy . , . , . / i tak dalej.
(
),
298
Rysunek 9.3.
Wybierz swoje
ulubione piwo,
uywajc znacznika
<select>
Wyobra sobie sytuacj, w ktrej klient nie moe odpowiedzie na pytanie. Podobaj
mi si firmy, ktre wymagaj zarejestrowania produktu przed jego uyciem i w samym
rodku strony rejestracyjnej prosz o wpisanie komentarza na jego temat. W takich przypadkach najuczciwsz odpowiedzi bdzie z pewnoci:
F
D
D1
1
D
1
DD
KD
L
D
M
Z t sam sytuacj masz do czynienia, gdy kupujesz wzek dla dziecka i musisz odpowiedzie na pytanie, ile masz dzieci. Przecie moesz dopiero je planowa lub masz po
prostu zamiar rozpieszcza swojego psa.
Take brak odpowiedzi moe by poprawn odpowiedzi. Pozwl klientom pomija pytania, na ktre nie potrafi odpowiedzie, gromad inne odpowiedzi na dysku, a nastpnie zastanw si, jak zada trudne pytanie nastpnym razem, gdy klient odwiedzi Twoj witryn.
Gdy pobierasz wyniki z formularza, otrzymasz pewn ilo zmiennych ustawionych na
odpowiedzi tak/nie lub otrzymasz tablic zawierajc list wybranych pozycji. Do Ciebie naley wybranie dokadnie tego, czego potrzebujesz dla swojego stylu programowania. Ja zwykle uywam listy, aby mc atwo dodawa nowe elementy.
Wyobra sobie formularz z pytaniami:
Lista pyta szybko staje si nuca, dlatego powiniene zmieni jej format tak, by pytanie
Czy lubisz wystpio raczej jako nagwek, a nie jako prosta lista owocw. W swoim
kodzie PHP moesz mie formularz zwracajcy zmienn *! , zawierajc warto
Rozdzia 9.
Formularze
299
lub
, zmienn *& i tak dalej. Osobicie wol stosowa przechowywan
w tablicy list zawierajc owoce, ktre zostan umieszczone na licie wyboru, ni stosowa prost list z wybranymi owocami, zawart w innej tablicy. Kolejna pozycja lub
kolejny owoc mog zosta dodane przez kogokolwiek i nie musz w tym celu zmienia
nawet linijki kodu.
W podrozdziale Natychmiastowe rozwizania w dalszej czci tego rozdziau znajdziesz kod pozwalajcy Twoim klientom na wybr jednej lub wicej pozycji listy. Przejrzyj przykad, aby pozna rodzaj pytania, ktrego potrzebujesz, a nastpnie wyprbuj
dziaanie kodu.
Kilka akcji
Formularz koczy si przyciskiem wysyania oraz przyciskiem zerowania lub anulowania, dziki czemu klient moe wybra: Dalej, kupuj to lub Rezygnuj z zamwienia. Nie jeste ograniczony wycznie do dwch moliwoci; moesz przygotowa ich
wicej, jak pokazano na rysunku 9.4.
Rysunek 9.4.
Wicej przyciskw
akcji w formularzu
W swoim kodzie PHP moesz atwo obsuy wicej przyciskw akcji, poniewa z kadego z nich otrzymujesz inn zmienn. Jeli przycisk Przelicz cen miaby nazw ,
a pozostae odpowiednio !% i -, skrypt otrzymaby zmienne *, *!% oraz * -
i do podjcia odpowiednich dziaa mgby uy kodu w rodzaju
' '*((.
Pierwszym znacznikiem HTML w formularzu jest znacznik
, ktry zawiera
parametr 0#$0 0, gdzie 0#$0 0 jest nazw strony, ktrej danie zostanie wysane przez przegldark w momencie, gdy uytkownik kliknie na
przycisku wysyania lub zerowania. Przegldarka decyduje, czego zada, po czym
wysya to danie do serwera. Umieszczajc nazw strony w parametrze akcji decydujesz, ktrej strony (czyli ktrego skryptu) zada przegldarka.
Czy chcesz odesa uytkownika na t sam stron, czy na inn? Gdy wylesz go na t
sam stron i przeprowadzisz przetwarzanie w jej nagwku, moesz z atwoci wywietli ponownie t sam stron i ten sam formularz, na przykad wraz z komunikatami o bdach i daniami uzupenienia informacji. Gdy skierujesz uytkownika na inn
stron, masz inne moliwoci, jak przetworzenie wszystkich danych z formularza na
ukrytej stronie, ktra niczego nie wywietla, a nastpnie wysanie nagwkw przekierowania, odsyajcych przegldark uytkownika do waciwej strony.
Czasem moesz chcie odsya klientw do wicej ni jednej strony; moesz to zrobi,
umieszczajc na pojedynczej stronie wicej ni jeden formularz. Wyobra sobie stron
zawierajc wycznie trzy przyciski z rysunku 9.4; kady z nich mgby by przyciskiem wysyania zupenie innego formularza, z zupenie innym zestawem pyta i akcji.
Przycisk Zarezerwuj miejsca mgby wskazywa stron na bezpiecznym serwerze w banku,
przycisk Zachowaj na pniej mgby wskazywa stron aktualizujc profil uytkownika, za przycisk Przelicz cen mgby po prostu powodowa skok do biecej strony
z przeliczeniem nowej ceny.
300
Jedyny problem z uyciem kilku formularzy wie si z brakiem koordynacji danych. Gdy
uytkownik kliknie na przycisku pierwszego formularza na stronie, nie bdziesz mg
zebra danych z drugiego formularza. Aby uy kilku formularzy, musisz najpierw zebra wszystkie dane, a nastpnie uy osobnych formularzy wyboru na innej stronie.
JavaScript
Czsto zdarza si, e niedowiadczeni programici, uywajcy JavaScriptu po raz pierwszy,
tworz w nim rozwijane listy wyboru i przeprowadzaj skomplikowan weryfikacj danych.
Z drugiej strony, waciciele witryn pac mi due pienidze za usunicie podobnego kodu
JavaScript. Dlaczego? Musz poprawia formularze, poniewa nie dziaaj w niektrych
przegldarkach, a jeli nawet wydaj si dziaa, okazuje si, e baza danych witryny pena
jest niepoprawnych danych. Do moich zada naley zarwno sprawienie, by formularze
dziaay w wikszej iloci przegldarek, jak i powstrzymanie bezuytecznych informacji
przed trafieniem do bazy danych. Aby to osign, wykonuj pewne kroki.
Rozdzia 9.
Formularze
301
uniemoliwisz potencjalnym klientom wysanie formularza, mog opuci Twoj witryn i nigdy ju do niej nie wrci. Przesyajc formularz do serwera i sprawdzajc go
tam, moesz zarejestrowa pola, na ktre nie otrzymujesz odpowiedzi i przekaza te informacje projektantom formularza.
Dugie formularze
Gdy klient nie ma potrzeby wypeniania wszystkich pl, wielostronicowe formularze
mog go irytowa. W papierowych formularzach mona trafi na sekcj opisan jako
przeznaczona wycznie dla diabetykw, ktr mona pomin lub wypeni, zalenie od
potrzeb. Internetowym odpowiednikiem bdzie zadanie na pierwszej stronie oglnego pytania (Czy jeste diabetykiem?), a nastpnie wywietlenie lub pominicie strony z pytaniami przeznaczonymi dla diabetykw.
Problem wyborw prezydenckich na Florydzie w 2000 roku pokaza, jak atwo wprowadzi w zakopotanie uytkownikw formularzy. W komputerze problem jest jeszcze
wikszy, gdy ludziom trudno jest przewraca strony w przd i w ty i porwnywa
sekcje formularza. W zwizku z tym musisz stosowa jednolity ukad stron, zapewniajcy wizualne wskazwki dotyczce kadego pytania i rodzaju wymaganej odpowiedzi.
W nastpnych podrozdziaach poznasz zasady tworzenia poprawnych wielostronicowych formularzy.
Dobrym rozwizaniem dla dugich formularzy jest stosowanie jednej funkcji formatujcej dla wszystkich pyta kadego formularza znajdujcego si na witrynie. Gdy nowy
klient wypeni jedn stron formularza, bdzie gotw do wypeniania wszystkich innych
formularzy. Oddzielajc formatowanie od pyta, moesz atwej zmienia kolejno pyta i przerwy pomidzy stronami.
302
Zamiast bezporednio pyta o wiek osoby, odelij j na stron wywietlajc oferty uzalenione od wieku klienta i dopiero wtedy zadaj pytanie o wiek oraz inne osobiste pytania.
Moesz na przykad umieci zdjcia umiechnitych dzieci na stronie dotyczcej ywnoci dla dzieci, a obok umieci zapis: Aby pomc nam w dobraniu produktw dla Twojego dziecka, podaj prosz... i zapyta w nim o wiek wszystkich czonkw rodziny.
Na kadej stronie sprbuj przedstawia temat, krtk zacht do odpowiedzi na pytanie,
samo pytanie oraz dodatkowy materia (nie ma znaczenia, czy w dodatkowy materia
wykracza poza doln krawd strony). Lepiej jest uzyska poprawn odpowied na jedno pytanie, ni otrzyma niepoprawne odpowiedzi na wiele pyta.
Uycie ukrytych pl
Ukryte pola, ) s atwe do uycia dla takich obiektw, jak dugie
listy; nie dziaaj jednak wtedy, gdy osoba wypeniajca formularz zdecyduje si na
przerwanie tego zajcia, po czym sprbuje dokoczy wypenianie pniej. W takich
przypadkach mog pomc cookies, ale take one posiadaj ograniczenia.
Rozdzia 9.
Formularze
303
musisz ponownie przemyle cay swj projekt. Kada przegldarka nakada inne ograniczenia na cookie, dlatego jedynymi wytycznymi bd podane tutaj informacje. Specyfikacja cookie okrela, e moesz mie tylko dwadziecia pikw cookie na domen, co
uniemoliwia stworzenie 21-stronicowego formularza z jednym cookie na kad ze
stron. Maksymalny rozmiar cookie wynosi 4 kB, dlatego nie mona gromadzi informacji z dugiego formularza w jednym pliku.
Problemy pojawi si take, gdy klienci maj wyczon obsug cookie, maj tak
ustawion przegldark, by usuwaa cookie na kocu sesji lub gdy korzystaj z oprogramowania, ktre kadego dnia usuwa cookie z dysku. Nie zadziaaj one take wtedy,
gdy klient rozpocznie wypenianie formularza przy komputerze w pracy, po czym sprbuje dokoczy je przy komputerze domowym. Z powodu tych ogranicze pliki cookie
powinny by uywane wycznie do przechowywania identyfikatorw sesji, tak, aby
mona byo utrzyma aktywne sesje.
Sesje zostan omwione w rozdziale 19., tu za pokaemy jedynie opcje konfiguracji,
jakie powiniene wczy (dla PHP 4.0.5). W pliku php.ini wcz opcj 0% , aby
korzysta z cookie (o ile s dostpne), wcz take opcj 0 0 , aby automatycznie umieszczaa identyfikator sesji w acuchach URL, gdy cookie nie s dostpne, na koniec za ustaw opcj 0$1& , wskazujc list parametrw znacznikw HTML,
ktre mog przenosi acuchy URL. To wystarczy do uruchomienia testowej strony:
A
"
A
A"
A
/
5
5
55
304
uytkownika i nastpnego dnia stworzy now sesj, wypenion wszystkimi szczegami profilu. Teoretycznie mgby uy ponownie tego samego identyfikatora sesji, ale
w ten sposb umoliwiby mi wamanie si do sesji.
Oto jak wama si do sesji na sabo zaprojektowanych witrynach: gdy Twj
wsppracownik pjdzie do domu, przejrzyj jego plik cookie (cookies.txt w Netscape),
aby znale nazw witryny oraz powizany z ni identyfikator sesji. Wycz cookie
w jego przegldarce, aby wymusi uycie URL, zaloguj si do tej samej witryny,
uywajc dowolnej innej nazwy logowania, po czym wytnij identyfikator sesji swojego
wsppracownika i wklej go do swojego acucha URL. Rekord sesji pozostaje w pliku
w serwerze od 20 minut do kilku godzin, zatem zwykle masz do dyspozycji
mnstwo czasu.
Rozdzia 9.
Formularze
305
Mog przetwarza elementy tablicy tworzc formularz, ustawi limit dziesiciu pyta
na stron i zaznacza kade pytanie jako wykonane, gdy uzyskam na nie odpowied.
Gdy w polu wystpi bd, mog doda element bdu do danej pozycji tablicy. Na stronie obsugujcej formularz mog jeden raz zarejestrowa tablic jako zmienn sesji, po
czym, na kocu przetwarzania, mog zapisa ca tablic do bazy danych. Do innych
ulepsze, jakie mona zastosowa, nale stale pokazywane elementy, jak choby wywietlana na kadej ze stron nazwa uytkownika.
306
)
B;QA*OJRAOSR(
$!!!!!)
Bdziesz potrzebowa pola tekstowego dla nazwy pliku; HTML oferuje specjalne pole
nazwy pliku z przyciskiem umoliwiajcym przegldanie plikw pole typu
. W tym
znaczniku parametr # jest rozmiarem pola nazwy pliku, a nie wielkoci pliku. Sam
znacznik wyglda nastpujco:
D
N!)
PHP posiada plik konfiguracyjny o nazwie php.ini, zawierajcy kilka parametrw ograniczajcych pliki, ktre mona wysya za pomoc formularzy. Musisz wczy opcj
0 , ustawi opcj 0
0 na odpowiedni katalog, za w opcji +
0
0
# ustawi co najmniej tak warto, jak wyraony jest rozmiar najwikszego pliku, ktry chcesz wysya. Niektre operacje na plikach s ograniczone
przez ilo pamici przydzielonej PHP, dlatego ustaw warto
0
na warto
wiksz ni 0
0
#. W tym celu moesz wpisa:
A
@
AAE9
A
A
D
TB
A%!B
Opcja
0 pozwala PHP na obsug wysyanych plikw. Niektrzy uwaaj,
e stanowi to obnienie poziomu zabezpiecze, za inni za nieakceptowalne zajmowanie zasobw. Gdy si na to zdecydujesz, powiniene ograniczy moliwo wysyania
plikw do osb, ktre si w jaki sposb zaloguj, aby mc si z nimi skontaktowa
w przypadku niewaciwego zachowania. Wyobra sobie, e Twj serwer WWW zostaje
zalany plikami zawierajcymi zdjcia pornograficzne lub pirackimi piosenkami Nirvany.
Gdy kto wysya plik, trafia on do tymczasowego katalogu wskazanego w opcji 0
0, dziki czemu moesz sprawdzi jego zawarto przed przesaniem go do
Rozdzia 9.
Formularze
307
katalogu docelowego. Upewnij si, e w tymczasowym katalogu jest duo miejsca dla
rwnolegle otrzymywanych plikw i e jest on okresowo porzdkowany, aby serwer nie
zaton w starych plikach.
Warto 0
0
# jest prb ograniczenia wysyanych plikw przez ograniczenie maksymalnego rozmiaru pojedynczego pliku; zdarza si jednak, e uytkownik
moe przesa wiele gigabajtw pirackich filmw w czciach po kilka tysicy bajtw
kada, po czym zoy je automatycznie w cao za pomoc oglnodostpnego oprogramowania. Ograniczenie rozmiaru pliku nie zabezpieczy Ci przed niepowoanym
wykorzystaniem Twojego serwera.
Warto
0
odnosi si do PHP i ogranicza dostpn dla niego pami. Gdy
zwikszysz limit pamici PHP, moesz ograniczy moliwo dziaania serwera WWW
lub systemu operacyjnego, dlatego sprawd ich wymagania co do iloci pamici. Jeli
Twj skrypt generuje obszerne zmienne lub tablice, zwiksz warto
0
do
co najmniej dwukrotnej iloci miejsca, jakiej potrzebujesz. Najwikszym obrazkiem
w mojej stacji roboczej jest 95-megabajtowe zdjcie krajobrazu. Oprcz tego posiadam
napisane w PHP oprogramowanie do zarzdzania obrazkami, odczytujce pary obrazkw w celu ich porwnania. Ten zajmujcy 0,15 MB skrypt wymaga 191 MB do porwnania dwch z moich krajobrazw.
Gdy plik trafia do serwera WWW, jego nazwa jest zawarta w zmiennej o nazwie odpowiadajcej parametrowi
w znaczniku
. W pokazanym tu przykadzie parametr
zawiera nazw
, dlatego nazwa otrzymanego pliku bdzie zawarta w zmiennej *
. Zmienna ta zawiera pen ciek i nazw pliku,
potrzebne funkcji '( i innym funkcjom przetwarzajcym pliki. Zmienna *
0
bdzie zawiera nazw pliku dostarczonego przegldarce, zmienna *
0
# rozmiar pliku, za zmienna *
0 typ MIME pliku (o ile przegldarka dostarczy takich informacji).
Plik trafia na serwerze do tymczasowego katalogu, dlatego, jeli chcesz go zachowa,
musisz skopiowa go w bezpieczne miejsce. PHP w wersji 4.0.4 i nowszych oferuje
w tym celu specjaln funkcj
-'(. W starszych wersjach PHP moesz przeprowadzi
kopiowanie, a nastpnie usuwanie pierwotnego pliku.
Gdy dojdziesz do tego miejsca i wci masz kopoty z wysyaniem plikw, zwykle s
one zwizane z uprawnieniami systemu operacyjnego lub przegldarki albo z problemami z typem pliku. Jeli masz problemy z typem pliku, wypisz warto zmiennej
0 aby sprawdzi, co przegldarka uwaa za typ pliku.
Bdy dostpu wystpuj wtedy, gdy system operacyjny serwera WWW ogranicza
Twj dostp do katalogu otrzymujcego wysane pliki, co zmusza Ci do bagania
i przekupywania administratora systemu, aby zmieni uprawnienia. Spjrz na opcj
0
0, a nastpnie poeksperymentuj z rcznym kopiowaniem z katalogu
do katalogu docelowego.
Jeli wszystko inne zawiedzie i nie moesz okreli, co PHP robi z plikiem, uruchom stron
zawierajc przedstawiony tu kod PHP, aby pozna kady parametr serwera Apache
z punktu widzenia tego serwera oraz kad opcj PHP z punktu widzenia PHP:
46,)
308
Natychmiastowe rozwizania
Tworzenie formularza
Oto podstawowy formularz w HTML, pytajcy o imi, po czym wracajcy do strony o nazwie createaform.html:
)
8
1D0/1
09
)
(
G21)
+)
Rozdzia 9.
Formularze
309
Funkcja
'( przyjmuje jako pierwszy parametr docelow stron, za jako drugi
wszystkie pytania, jakie maj znale si w formularzu. Domylnie zastosowano
metod formularza, poniewa jest ona najlepszym sposobem wysyania danych
formularza. Kady formularz wymaga przycisku wysyania, czyli znacznika
z rodzajem akcji, dlatego do funkcji
'( wstawiem trwale taki znacznik. Moesz do
niego doda take przycisk zerowania.
Nastpny kod tworzy pytanie na podstawie otrzymanych danych tekstowych. Funkcja
wymaga podania nazwy pytania, jego treci oraz opcjonalnej domylnej odpowiedzi:
A
4
5
5
6
7
4
4
66
7
(
,
:
4
,,
)6,
:
Znaczniki mog zawiera wartoci domylne, zachcajce uytkownika do wypenienia formularza. W funkcji
0'( linia
' '*
(( sprawdza, czy
parametr zawiera tekst, zanim umieci go w parametrze - znacznika HTML.
Instrukcja '( w funkcji
0'( zwraca pytanie, kilka spacji oraz znacznik
z odpowiednimi parametrami. Wymagany jest parametr *. , poniewa
jest on jedynym sposobem poinformowania klienta o tym, czego chcesz si dowiedzie.
Obowizkowe jest take podanie parametru *
, poniewa nie ma innego sposobu zidentyfikowania odpowiedzi zwracanej do skryptu.
W tym momencie moesz tworzy formularze za pomoc atwego do rozbudowy kodu,
ktry moe by tak uoony, by w kadej linii zawiera jedno pytanie. Nasz kolejny kod
tworzy za pomoc funkcji
0'( jedno pytanie, ktre stanowi parametr wywoania funkcji
'(, tworzcej cay formularz:
445
A
4
58
1D0/1
096
66,
310
-
.
4
)
5
)8
1D0/1
096,
-
.
4
)
5
);
96,
-.
4
)
5
)B
96,
-
.
4
)
5
)
96,
-.
4
)
5
)U
196,
Ta funkcja przyjmuje nazw pola jako parametr *
, za pozostae parametry przyjmuje w tablicy *
. Jeli w tablicy *
nie istnieje element *
, funkcja tworzy go. Kod sprawdza dugo elementu *
,
aby stwierdzi, czy istnieje domylna odpowied na pytanie; jeli jej nie ma, pomija generowanie parametru - znacznika . Instrukcja '( zwraca niezmodyfikowany element *
. (dziki czemu mona w nim umieci
znaczniki formatujce), kilka spacji oraz znacznik , dziki ktremu uytkownik
moe wpisa odpowied na pytanie.
Zamiast zwykych spacji, , zastosowane zostay niepodzielne spacje HTML, 2! 3,
poniewa standardowe spacje mog zosta pominite (standard HTML traktuje kilka
spacji jak jedn; zdarza si take, e ignoruje si pojedyncze spacje).
Wemy teraz podstawow funkcj formularza z podrozdziau Tworzenie formularza i rozszerzmy j tak, by pobieraa pytania z tablicy. Zmodyfikowany kod korzysta
Rozdzia 9.
Formularze
311
z funkcji '( oraz )'(, pobierajc kolejne pytania do tablicy o nazwie *- (wicej
informacji na temat funkcji '( oraz )'( znajdziesz w rozdziale 3.). Nowy kod
dodaje zawarto pola pytania do przedrostka
0 (tworzc w ten sposb nazw
funkcji), umieszcza cao w zmiennej *
, po czym wywouje t zmienn jako
funkcj (za kadym razem, gdy dodamy nowy typ pytania, musimy stworzy take funkcj
z odpowiadajc mu nazw). Cao wyglda nastpujco:
4
5
6
7
,
/
44
5(6
4
66
7
4
4
667
),:
A(-
.,
4
5(6,
:
4
)
(
G21)
+)6,
:
W tej funkcji ptla $)'( przetwarza list pyta (zawart w tablicy *. ) i umieszcza
sformatowane pytania w zmiennej *. Poniewa tablica moe by pusta, funkcja zaczyna dziaanie od stworzenia pustego acucha *.
Wewntrz ptli $)'( kod sprawdza, czy w zmiennej * znajduje si jaki tekst;
jeli tak, wstawia znacznik podziau ! , aby kade pytanie pojawio si w osobnej linii. Nastpnie (ze staej
0 i elementu z tablicy) tworzona jest nazwa funkcji, po
czym wszystko razem zostaje dopisane do zawartoci zmiennej *.
Jeli nie czytae rozdziau 10., moesz zastanawia si nad wywoaniem *
'(.
Gdy PHP natrafia na zmienn uyt tam, gdzie powinna wystpi funkcja, uywa zawartoci tej zmiennej jako nazwy funkcji, ktr ma wywoa. Dziki temu mechanizmowi mona dynamicznie budowa nazwy funkcji.
Instrukcja '( umieszcza na kocu pytania przycisk wysyania,
!
, po czym cao ujmuje w znaczniki formularza. Pytania nie s wyrwnane,
ale zajmiemy si tym w nastpnym rozwizaniu. Przedstawiony tu kod tworzy formularz pokazany na rysunku 9.7.
Rysunek 9.7.
Formularz
z wieloma pytaniami
Wyrwnywanie kolumn
To rozwizanie uzupenia kod stworzony w poprzednim rozwizaniu, wyrwnujc kolumny formularza i stanowi punkt wyjcia dla centralnego sterowania ukadem formularza.
312
Funkcja
0'( sprawdza, czy element *
zawiera jaki
tekst; jeli tak, dodaje go do parametru - znacznika . Jeli ten element jest
pusty, nie ma sensu generowa domylnej wartoci pytania.
Instrukcja '( umieszcza cao w tekstowym znaczniku .
Skopiuj funkcj
'( z podrozdziau Tworzenie dugiej listy w formularzu i przenie element *-. na pocztek funkcji formatujcej pytanie. Funkcja
'(
przyjmuje list pyta w tablicy *. , przetwarza j za pomoc ptli $)'( i zawarto kadego pytania przekazuje do funkcji o nazwie
01*- (gdzie
jest elementem z tablicy pytania).
4
5
6
7
,
/
44
5(6
4
66
7
4
4
667
),:
A(-
.,
(-
.,,
Rozdzia 9.
Formularze
313
4
5(6,
:
4
)
(
G21) +)6,
:
314
Rysunek 9.8.
Formularz
z kilkoma pytaniami,
wyrwnanymi
w kolumnach
Nie podoba mi si miejsce, w ktrym znajduje si przycisk Wylij. Uwaam, e powinien znale si on bezporednio poniej pl odpowiedzi, dlatego dokonam rcznie
jeszcze jednej zmiany. Aby wyrwna przycisk Wylij, zastpi lini ! 1*1
! oraz lini znacznika !
nastpujcym kodem:
)
) ) +) ) +)
)
(
G21) +) +) +
)
Nowy kod umieszcza przycisk Wylij w nowym wierszu, w trzeciej komrce tabeli,
dziki czemu zostaje on wywietlony tu pod ostatnim znacznikiem . Gdy przesuwasz wzrok i myszk w d strony, trafiasz bezporednio na przycisk Wylij. W tym
momencie nasz formularz wyglda tak, jak pokazano na rysunku 9.9.
Rysunek 9.9.
Formularz z polami
i przyciskiem Wylij
uoonymi w rwn
kolumn
Rozdzia 9.
Formularze
315
:
7
)( +),
:
:
4
)
+
)6,
:
Funkcja
0 '( jest podobna do funkcji formatujcych pytanie, stworzonych
w innych rozwizaniach w tym rozdziale, gdy przyjmuje nazw odpowiedzi oraz domyln warto, przedstawiajc najbardziej prawdopodobny wybr. Caa reszta jest
inna, gdy w tym przypadku tworzymy znacznik .
Znacznik pozwala na przedstawienie uytkownikowi listy pozycji, spord
ktrych moe dokona wyboru bez koniecznoci wpisywania odpowiedzi. W niektrych
przegldarkach i systemach operacyjnych mona wybiera wicej ni jedn pozycj, ale
tylko wtedy, gdy w znaczniku zostanie umieszczony parametr
.
W funkcji
0 '( lista odpowiedzi jest zawarta w tablicy * . Ptla $)'(
przetwarza tablic * i generuje poszczeglne znaczniki , z ktrych kady zawiera jedn pozycj wyboru. Domylna pozycja jest zaznaczana przez dodanie sowa kluczowego do znacznika . Znaczniki s dodawane do acucha
*, ktry na wszelki wypadek jest tworzony jeszcze przed wejciem do ptli $)'(.
Instrukcja '( umieszcza nazw pytania i acuch * wewntrz znacznika
.
Jak mona wywietli nowe pytanie? Zmodyfikuj tablic pyta, uywan w poprzednich przykadach formularzy, tak, aby tablica krajw staa si parametrem dla pytania typu . Gdy to zrobisz, po to, by atwo obsuy ten rodzaj pytania, wystarczy niewielka modyfikacja funkcji
'( z poprzednich rozwiza.
-
.
4
)
5
)UV
1
D/
D35
)6,
Kady element tablicy *. jest tablic zawierajc nazw pytania, jego typ oraz
tre. W przypadku pyta typu element ten zawiera take list pozycji do wyboru, ktre zostan wywietlone w znaczniku .
Warto klucza tablicy *. odpowiada nazwie zmiennej, jak otrzyma skrypt pobierajcy odpowiedzi z formularza. Pole okrela funkcj, suc do sformatowania pytania, za pole . zawiera wywietlany tekst pytania.
Moesz doda opcjonalny element o nazwie
, wstawiajcy domyln odpowied
na pytanie. W listach domylna odpowied musi pasowa do pozycji na licie
wyboru, z uwzgldnieniem wielkoci liter. Bezpieczny sposb dodawania domylnej
odpowiedzi zosta pokazany w kolejnym fragmencie kodu. Gdy do listy krajw w tablicy
* dodajesz pozycj Anguilla, najpierw umie j w zmiennej *0
,
a dopiero potem dodaj t zmienn do tablicy *:
316
A
;
,
-.A
,
Znajdziesz na stronie:
344
Przedstawiony dalej kod rozszerza tabel o dodatkowy wiersz i przenosi do tego wiersza przycisk Wylij, aby mona go byo wyrwna do pl odpowiedzi. Uruchom stron,
po czym przegldarka powinna wywietli formularz pokazany na rysunku 9.10.
Rysunek 9.10.
Formularz
z rozwijan
list wyboru
4
5
6
7
,
/
44
5(6
4
66
7
4
4
667
),:
A(-
.,
) )(-
. +)
),, +)
)4
5(6 +),
:
4
)
)
) ) +) ) +)
)
(
G21) +) +) +
)
+)6,
:
Rozdzia 9.
Formularze
317
Potrzebujemy teraz kodu do wywietlenia wybranej pozycji. Przedstawiony poniej fragment kodu sprawdza, czy istnieje zmienna o nazwie * (gdy
jest nazw pytania w tablicy *. ), po czym wywietla jej warto:
4
4
66
7
4 )G
K
2
19
6,
:
Gdy formularz przekazuje warto do docelowej strony za pomoc acucha URL albo
metody lub , skrypt PHP w docelowej stronie otrzymuje t warto w zmiennej
o nazwie zgodnej z nazw w parametrze
tego znacznika HTML, ktry stworzy t
warto. Jeli zdefiniujesz znacznik
i kto w tym polu wpisze warto pies, skrypt otrzyma zmienn * zawierajc acuch .
318
:
)(,
:
46,
:
Funkcja
0'( jest podobna do funkcji
0 '(, gdy przyjmuje nazw
pytania i jego parametry, a take obsuguje wybr opcji domylnej. Rnice wynikaj
z tego, e w tym przypadku tworzymy znacznik . Podobny kod zosta zastosowany w nastpnym rozdziale do wygenerowania listy dostpnych moliwoci.
Aby wywietli nowy rodzaj pytania, skopiuj tablic pytania z poprzedniego przykadu
(jak to pokazano w kolejnym kodzie) i przeka j do funkcji
'(, take skopiowanej
z poprzedniego przykadu.
-
.
4
)
5
)UV
1
K2/
D35
)6,
Warto klucza tablicy *. odpowiada nazwie zmiennej, jak otrzyma skrypt pobierajcy odpowiedzi z formularza. Pole okrela funkcj, suc do sformatowania pytania, za pole . zawiera wywietlany tekst pytania. Moesz doda opcjonalny element o nazwie
, wstawiajcy domyln odpowied na pytanie.
Rozdzia 9.
Formularze
319
jego parametrw, do ktrych naley lista opcji przeznaczonych do wyboru oraz pole +
Znacznik zawiera take parametr -. W HTML moesz go pomin; przegldarka uyje wtedy acucha zawartego pomidzy znacznikami a " .
W PHP i niektrych przegldarkach pominicie parametru - da w rezultacie pozycj tablicy zawierajc warto . Mona tego unikn, stosujc jawnie parametr -.
W przypadku zastosowania przyciskw opcji wybrane pozycje s oznaczane sowem
kluczowym )%, a nie , dlatego pamitaj o zmodyfikowaniu odpowiedniej
linii kodu. W porwnaniu z poprzednim przedstawionym w tym rozdziale rozwizaniem, ta funkcja uywa liniowej metody budowania acucha wyjciowego, ktra lepiej
nadaje si do tworzenia dugich acuchw na podstawie wielu opcji. Znaczniki s budowane cz po czci, dziki czemu mona w przyszoci doda kod bez modyfikacji
istniejcego kodu. Ponadto na kocu acuchw umieszczono znaki 5, dziki czemu
duo atwiejsze jest przegldanie rda HTML w przegldarce. Gdy piszesz w PHP inne funkcje konstruujce acuchy, moesz porwna to rozwizanie z tym, ktre zastosowano w funkcji
0 '(.
A
4
5
6
7
,
/
445(6
4
-.66
7
4
466
7
),
:
-.
(
(,
4A
4
-
.6
A
4(5
-
.66
7
,
:
)( +),
:
46,
:
Funkcja
0)%!'( przyjmuje nazw pytania oraz tablic z jego parametrami (do
ktrych nale lista opcji oraz ich warto domylna).
Ptla $)'( konstruuje list w zmiennej *, dlatego zostaje ona wczeniej zainicjalizowana. Ptla ta przetwarza list i tworzy po jednym znaczniku dla kadej
320
opcji. W celu uoenia listy w pionow tabel, przed kadym znacznikiem zostaje
wstawiony znacznik przerwy, ! . Aby zabezpieczy si przed stworzeniem pustej linii
przed pierwsz opcj, znacznik ! jest wstawiany tylko wtedy, gdy w zmiennej *
znajduje si jaki tekst (std obecno w kodzie testu
' '*(().
Znacznik otrzymuje typ )%! oraz nazw identyfikujc go na docelowej
stronie. Znacznik typu )%! powoduje stworzenie przycisku opcji, pokazanego na
rysunku 9.11. Kady przycisk opcji jest osobn jednostk, dziki czemu uytkownicy
mog do woli wcza i wycza opcje.
Rysunek 9.11.
Formularz z kilkoma
przyciskami opcji
Jak mona wywietli nowe pytanie? Zmodyfikuj tablic pyta, uywan w poprzednich przykadach formularzy, tak, aby tablica krajw staa si parametrem dla pytania typu )%!:
-
.
4
)
5
)UV
1
K2/
D35
)6,
Funkcja
'( przyjmuje nazw strony, do ktrej trafi odpowiedzi oraz list pyta.
Ptla $)'( przetwarza pytania, budujc odpowiedni kod HTML. Instrukcja '(
dodaje przycisk Wylij oraz umieszcza cao w znacznikach formularza i tabeli.
Cho wikszoci osb spodoba si formularz w takiej postaci, jak pokazana na rysunku 9.11,
jednak kto mgby poprosi o formularz z treci pytania wyrwnan do grnej krawdzi, jak na rysunku 9.12. Aby dokona tej niewielkiej zmiany, a jednoczenie uczyni j
standardow dla wszystkich formularzy, zachowujc przy tym atwo modyfikacji bez
potrzeby zmiany kodu, w zmiennej * umiecimy wsplne opcje formatowania:
-.-(
.,
Rozdzia 9.
Formularze
321
Rysunek 9.12.
Formularz z pytaniem
wyrwnanym
do najwyszej opcji
Gdy dokonujemy zmian, moemy take doda lini sterujc odstpem pomidzy kolumnami, aby mc atwo dodawa i usuwa odstp w miar rozwoju formularzy na stronie. Tablica * moe by zaadowana ze wsplnego pliku nagwkowego, administracyjnej bazy danych lub z pliku XML, generowanego przez administracyjn stron
witryny. Aby wprowadzi t zmian, moesz napisa:
-.-
.,,,
322
)
) ) +) ) +)
)
(
G21) +) +) +
)
+)6,
:
Funkcja
'( definiuje symbol * jako zmienn globaln, dziki czemu moe odwoywa si do zmiennej * zdefiniowanej poza funkcj
'(.
Kod zaczynajcy si od * tworzy definicj komrki tabeli. Znacznik jest tworzony z parametrami pochodzcymi z tablicy *, dlatego moemy uy tej tablicy
do precyzyjnej kontroli nad formatowaniem komrki tabeli HTML. W tym przykadzie
obsuguj jedynie parametr -& znacznika , sterujcy wyrwnaniem uoenia
tekstu w komrce tabeli w pionie. Moesz to rozszerzy na kolory i wszystkie inne parametry znacznika .
Dlaczego generujemy formatowanie w ten sposb, a nie za pomoc kaskadowych arkuszy
stylw (CSS)? Poniewa niektre przegldarki nie obsuguj kaskadowych arkuszy stylw,
a inne obsuguj je bdnie. Nawet najnowsze przegldarki nie zgadzaj si co do
szczegw interpretacji CSS.
Kod zaczynajcy si od * przygotowuje po prostu komrk tabeli, ktra bdzie oddziela od siebie kolumny tekstu i opcji. Uyem kolumny, poniewa ekrany s szerokie
i do wizualnego rozdzielenia danych potrzeba wicej miejsca w poziomie, ni w pionie.
Linia kodu zaczynajca si od * jest istniejc wczeniej lini, w ktrej ustalony znacznik zosta zamieniony na acuch *, za acuch 2! 32! 3"
zosta zastpiony przez * .
Dodatkowa praca w funkcji
'( owocuje lepszym, bardziej elastycznym formularzem. Do przetworzenia wynikw z tego formularza bdziesz potrzebowa przedstawionego dalej kodu. Dane znajduj si w zmiennej * , dlatego najpierw sprawdzamy, czy taka zmienna istnieje, potem sprawdzamy, czy jest tablic, a dopiero potem
przetwarzamy j w ptli, wywietlajc wartoci. Kada zaznaczona pozycja formularza
bdzie posiadaa swoj warto (z parametru - formularza) w tablicy. Gdy dane
trafi do skryptu, moesz je przetwarza w dowolny sposb. A oto przykad takiego kodu:
,
4
4
66
7
,
4A
4
66
7
,
/
445(6
4
66
7
) )( +) +),
:
) +
),
:
:
Kod inicjalizuje acuch w zmiennej *, w ktrej umiecimy kod HTML i tekst. Instrukcja
' '(( sprawdza, czy zmienna * istnieje (przy pierwszym wejciu na
stron zmienna ta moe nie istnie), po czym kopiujemy jej zawarto do zmiennej *
Rozdzia 9.
Formularze
323
(poniewa zmienna * moe zawiera sformatowany acuch). Jeli * +
okae si tablic, zmienna * jest zerowana, a * zostaje przetworzona w ptli. Wewntrz ptli tworzone s wiersze tabeli, ktre s dopisywane do zmiennej
*, a na koniec zmienna ta zostaje ujta pomidzy znaczniki ! i "! .
W celu dopasowania odpowiedzi do pyta kade pytanie jest indeksowane nazw. Dziki
temu, gdy przetwarzasz zmienn odpowiedzi (na przykad * ), moesz odwoywa si do pyta jako do zmiennych *. i z atwoci wstawia odpowiedzi i komunikaty o bdach jako dodatkowe pozycje.
Gdy w odpowiedzi wystpi bd i zechcesz wywietli komunikat zwracajcy na to
uwag uytkownika, jedyne, czego potrzebujesz w kodzie, to linia dodajca komunikat
o bdzie do tablicy *. . W przedstawionym tu przykadzie zobaczymy, jak to
dziaa w przypadku, gdy klient zaznaczy wicej ni dwa kraje. Oczywicie, gdy strona
bdzie ju poprawnie wypisywa komunikaty o bdach, moesz opracowa swoje wasne komunikaty. W celu dodania komunikatu o bdzie do tablicy *. uyjemy kodu:
44
6)$6
7
-
.-
.
S
D
DK
2/0
1L/
1
)
)4G
DV/
9=/
D
/0D
L1
6 +
),
:
Zarwno lista domylnych odpowiedzi, jak i lista * mog by zaadowane z bazy
danych. Jeli posiadasz wspln tabel bazy danych dla danych pochodzcych z tablicy
324
* oraz z listy domylnych odpowiedzi, moesz poczy obie listy w jedn tablic
i zaadowa j za pomoc kwerendy SQL. Oznacza to, e w funkcji
0)%!'(
zniknie warto *
, za zmienna *- stanie si tablic zawierajc
zarwno warto do wywietlenia, jak i jak inn warto, wskazujc, e pozycja powinna zosta domylnie zaznaczona. W takiej sytuacji za pomoc niewielkiej zmiany
w funkcji
'( na pocztku pytania umiecilibymy komunikat o bdzie:
4
5
6
7
,
,
4
4-.-(
.66
7
(
-.-(
.,
:
),
,
4
4-.-
.66
7
-.-
. +),
:
,
/
44
5(6
4
66
7
4
4(-
.66
7
(-
. W
)(-
.
+) )(-
.,
:
A(-
.,
)(-
. +)
,
4
5(6
+),
:
4
)
)
) ) +) ) +)
)
(
G21) +) +) +
)
+)6,
: