You are on page 1of 49

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

PHP. Czarna ksiga


Autor: Peter Moulding
Tumaczenie: Marcin Pancewicz
ISBN: 83-7197-695-X
Tytu oryginau: PHP Black Book
Format: B5, stron: 738

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

Skrypty PHP s osadzone w dokumentach HTML, dziki czemu powstaj aktywne


strony WWW. W tej ksice znajdziesz opis metod i funkcji potrzebnych, by nauczy si
budowania dynamicznych witryn WWW. Peter Moulding, od ponad 25 lat zajmujcy si
programowaniem, pomoe Ci w zdobyciu wiedzy niezbdnej do zastosowania PHP
w rodowisku Unix lub Windows. Dowiesz si wszystkiego, co jest potrzebne do
tworzenia stabilnych i efektywnie dziaajcych witryn WWW. W ksice zostay opisane
wszystkie funkcje PHP, wcznie z funkcjami obsugi baz danych. Dziki tej ksice
bdziesz mg dopisa do listy posiadanych umiejtnoci dogbn znajomo PHP.
Programowanie witryn WWW za pomoc PHP
Tworzenie stabilnego, wydajnego kodu, dziaajcego w systemach Windows
i Unix
Wysyanie i odbieranie poczty za pomoc stron WWW
Korzystanie z baz danych MySQL oraz PostgreSQL
Pobieranie informacji z dowolnej bazy lub serwera
Stosowanie cookies, sesji, zabezpiecze oraz profilw uytkownikw
Automatyzowanie administrowania systemem, dostarczanie danych oraz
wykonywanie innych codziennych zada
Zastosowanie formularzy, tablic, klas i obiektw
Konfiguracja i wykorzystywanie wanych technologii sieciowych: XML, LDAP,
IMAP, MIME, WDDX, Z39.50, YAZ, XSLT oraz XSL
Generowanie obrazkw JPEG i PNG oraz plikw Flash

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

Natychmiastowe rozwizania ................................................................................................. 34

Konfiguracja serwera Apache ..............................................................................................................34


Specyficzne funkcje serwera Apache...................................................................................................35
apache_lookup_uri()........................................................................................................................35
apache_note() ..................................................................................................................................35
ascii2ebcdic() oraz abcdic2ascii() ...................................................................................................36
getallheaders() .................................................................................................................................36
Konfiguracja PHP.................................................................................................................................36
dl() ...................................................................................................................................................37
extension_loaded() ..........................................................................................................................37
Diagnostyka..........................................................................................................................................37
assert() .............................................................................................................................................37
assert_options() ...............................................................................................................................38
die() .................................................................................................................................................38
Bdy ....................................................................................................................................................39

PHP. Czarna ksiga

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 2. Dane ..................................................................................................43


Szczegowe omwienie......................................................................................................... 43
Typy danych .........................................................................................................................................43
Zmienne...........................................................................................................................................44
Automatyczne tworzenie.................................................................................................................44
Stae .................................................................................................................................................45
Zakres ..............................................................................................................................................45
Praca z danymi .....................................................................................................................................46
Wyraenia........................................................................................................................................46
Operatory.........................................................................................................................................47
Sterowanie i struktura......................................................................................................................55
Funkcje ............................................................................................................................................62
Klasy i obiekty ................................................................................................................................62
Dane dla baz danych .......................................................................................................................62
Dane dla HTML ..............................................................................................................................62
Data i czas ............................................................................................................................................62
Data juliaska ..................................................................................................................................63
Czas .................................................................................................................................................63
Kalendarz ........................................................................................................................................64
Matematyka ..........................................................................................................................................66
Matematyka liczb cakowitych........................................................................................................66
Matematyka zmiennopozycyjna......................................................................................................67
Matematyka o ustalonej precyzji.....................................................................................................67

Natychmiastowe rozwizania ................................................................................................. 68

Tworzenie danych ................................................................................................................................68


acuchy .........................................................................................................................................68
Dane cakowite i zmiennopozycyjne...............................................................................................69
Sprawdzanie danych.............................................................................................................................70
Konwertowanie danych........................................................................................................................72
Funkcje operujce na acuchach.........................................................................................................73
rand(), srand() oraz microtime()...........................................................................................................79
Obliczanie daty i czasu.........................................................................................................................80
wita wielkanocne..............................................................................................................................82

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

Natychmiastowe rozwizania ................................................................................................. 93

Tworzenie tablic na podstawie list (za pomoc funkcji array()) ..........................................................93


Tworzenie tablic z acuchw (za pomoc funkcji explode()) ............................................................93
Tworzenie acuchw z tablic (za pomoc funkcji implode())............................................................94
Proste SQL ......................................................................................................................................94
select................................................................................................................................................95
where ...............................................................................................................................................95
order by ...........................................................................................................................................95
group by...........................................................................................................................................95
Budowanie kwerendy SQL .............................................................................................................95
Okrelanie zakresu elementw (za pomoc funkcji range()) ...............................................................98
Okrelanie zakresu kluczy (za pomoc funkcji range() i array_flip()) ................................................99
Usuwanie powtarzajcych si wartoci (za pomoc funkcji array_flip()) ...........................................99
Losowa zmiana kolejnoci elementw tablicy (za pomoc funkcji shuffle())...................................100
Losowy wybr banerw reklamowych (za pomoc funkcji array_rand()) ........................................101
Wczytywanie zawartoci pliku do tablicy (za pomoc funkcji file())................................................103
Sortowanie tablicy wedug wartoci elementw (za pomoc funkcji sort()) .....................................104
Sortowanie tablicy asocjacyjnej wedug wartoci (za pomoc funkcji asort()) .................................104
Sortowanie tablicy wedug wartoci, w kolejnoci odwrotnej (za pomoc funkcji rsort())...............105
Sortowanie tablicy asocjacyjnej wedug wartoci, w kolejnoci odwrotnej
(za pomoc funkcji arsort()) ............................................................................................................106
Sortowanie tablicy asocjacyjnej wedug klucza (za pomoc funkcji ksort()) ....................................106
Sortowanie tablicy w sposb naturalny wedug wartoci (za pomoc funkcji natsort())...................107
Sortowanie tablicy w zadany sposb (za pomoc funkcji usort()).....................................................109
Przetwarzanie tablic w odwrotnej kolejnoci.....................................................................................113
Przetwarzanie tablic wielowymiarowych...........................................................................................114

Rozdzia 4. Karty kredytowe ...............................................................................117


Szczegowe omwienie....................................................................................................... 117
Konto sprzedawcy ..............................................................................................................................118
Dzieci ............................................................................................................................................119
Nazwa sprzedawcy ........................................................................................................................119
Bezpieczestwo ..................................................................................................................................120
Serwer.................................................................................................................................................120
Haszowanie ........................................................................................................................................120
Szyfrowanie........................................................................................................................................122
Instalowanie pakietu mcrypt .........................................................................................................122
Funkcje pakietu mcrypt .................................................................................................................123
Oprogramowanie do transakcji finansowych .....................................................................................130
CyberCash .....................................................................................................................................130
Payflow..........................................................................................................................................132

Natychmiastowe rozwizania ............................................................................................... 134

Haszowanie danych............................................................................................................................134
mhash()..........................................................................................................................................134
mhash_get_hash_name() ...............................................................................................................136
mhash_get_block_size()................................................................................................................136
mhash_count() ...............................................................................................................................137
mhash_keygen_s2k().....................................................................................................................137

PHP. Czarna ksiga

Rozdzia 5. Bazy danych: MySQL i PostgreSQL ....................................................139


Szczegowe omwienie....................................................................................................... 139
Historia ...............................................................................................................................................140
MySQL..........................................................................................................................................140
PostgreSQL ...................................................................................................................................140
Niektre rnice .................................................................................................................................141
Daty ...............................................................................................................................................142
Uwzgldnianie wielkoci liter .......................................................................................................142
Transakcje .....................................................................................................................................142
Procedury przechowywane ...........................................................................................................143
Przeczniki ...................................................................................................................................143
Widoki ...........................................................................................................................................144
Typy danych .......................................................................................................................................144
Bity ................................................................................................................................................144
Liczby cakowite ...........................................................................................................................145
Liczby zmiennopozycyjne.............................................................................................................146
acuchy .......................................................................................................................................146
Bloby .............................................................................................................................................148
Daty i czas .....................................................................................................................................148
Specjalne typy danych PostgreSQL ..............................................................................................149
Wstawianie identyfikatorw .........................................................................................................150
Niezaleno od platformy.................................................................................................................151
Zamiana surowych danych w baz danych ........................................................................................151
Bazy danych a tablice.........................................................................................................................152
Indeksowa czy nie indeksowa.........................................................................................................152
Relacje ................................................................................................................................................152
ODBC.................................................................................................................................................152

Natychmiastowe rozwizania ............................................................................................... 153

czenie si z baz danych ................................................................................................................153


Wywietlanie baz danych...................................................................................................................155
Wywietlanie tabel bazy danych ........................................................................................................157
Wywietlanie pl tabeli ......................................................................................................................159
Wywietlanie danych z tabeli.............................................................................................................163
Wstawianie wiersza danych ...............................................................................................................167
Tworzenie baz danych........................................................................................................................170
Tworzenie tabel ..................................................................................................................................170
Uycie baz danych dla utrzymania sesji.............................................................................................171
Porzdkowanie kodu ..........................................................................................................................179

Rozdzia 6. Bazy danych: komercyjne i niecodzienne ...........................................183


Szczegowe omwienie....................................................................................................... 183
SQL ....................................................................................................................................................183
Indeksowa czy nie indeksowa.........................................................................................................184
Relacje ................................................................................................................................................184
Trwae poczenia...............................................................................................................................184
ODBC.................................................................................................................................................185
DB2 ....................................................................................................................................................187
SAP DB ..............................................................................................................................................188
Inne bazy danych................................................................................................................................188
Adabas...........................................................................................................................................188
Odczyt bazy danych filePro ..........................................................................................................189
Dostp do FrontBase .....................................................................................................................190
Hyperwave ....................................................................................................................................191
Informix.........................................................................................................................................192
Ingres II .........................................................................................................................................192

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

Natychmiastowe rozwizania ............................................................................................... 201

Dostp do baz danych poprzez ODBC...............................................................................................201


Wyniki ...........................................................................................................................................204
Bdy .............................................................................................................................................208
Informacje o polach.......................................................................................................................208
Inne funkcje...................................................................................................................................209
Nowe funkcje ................................................................................................................................213
Dostp do baz danych za pomoc funkcji DBA.................................................................................213
Dostp do baz danych za pomoc funkcji DBM................................................................................214
Dostp do baz danych za pomoc funkcji DBX.................................................................................215
Dostp do bazy danych Ingres II........................................................................................................215
Odczyt czasu: droga ku wydajnoci ...................................................................................................217

Rozdzia 7. rodowisko dziaania skryptu ............................................................221


Szczegowe omwienie....................................................................................................... 221
Apache................................................................................................................................................221
Konfiguracja PHP...............................................................................................................................223
Rozszerzenia..................................................................................................................................223
Ustawienia w pliku php.ini............................................................................................................224
Limit czasu ....................................................................................................................................224
Zmienne rodowiskowe.................................................................................................................225
Bezpieczestwo ..................................................................................................................................225
Autoryzacja HTTP ........................................................................................................................225
CHMOD ........................................................................................................................................226
PHP w trybie wsadowym ...................................................................................................................226
Harmonogram uruchamiania PHP......................................................................................................227
COM...................................................................................................................................................227
Nazwy plikw i katalogw.................................................................................................................228
Linux i Unix ..................................................................................................................................229
Windows NT .................................................................................................................................229
Macintosh ......................................................................................................................................229
POSIX ................................................................................................................................................229
Pomoc we wzajemnym komunikowaniu si programw...................................................................231
Wsplna pami ............................................................................................................................231
Semafory .......................................................................................................................................232
Programy zewntrzne .........................................................................................................................233
Dodatkowe informacje .......................................................................................................................233
Funkcje mnoGoSearch .......................................................................................................................234

Natychmiastowe rozwizania ............................................................................................... 235

Porzdkowanie starych plikw...........................................................................................................235


Wykonywanie programu zewntrznego.............................................................................................239

PHP. Czarna ksiga

Konwertowanie dokumentw Worda na RTF za pomoc COM .......................................................241


Przykad autoryzacji HTTP ................................................................................................................244
Modyfikowanie kodu w celu dostosowania do rodowiska...............................................................246
Rejestrowanie bdw ...................................................................................................................246
Przerwanie dziaania przez uytkownika ......................................................................................248
Okrelanie czasu dziaania skryptu ...............................................................................................248
Wybr bazy danych.......................................................................................................................249
Kod zaleny od przegldarki.........................................................................................................250
Sprawdzanie dostpnoci funkcji ..................................................................................................251
Sprawdzanie nagwkw HTTP przed wysaniem .......................................................................251
Sprawdzanie PHP ..........................................................................................................................251
Sprawdzanie pamici..........................................................................................................................252
Wysyanie niezwykych formatw.....................................................................................................252
Zabezpieczanie obrazkw ..................................................................................................................253

Rozdzia 8. Pliki .................................................................................................255


Szczegowe omwienie....................................................................................................... 255
Katalogi ..............................................................................................................................................255
Punkt widzenia serwera Apache ...................................................................................................255
Punkt widzenia PHP......................................................................................................................256
Zmiana katalogu ............................................................................................................................256
Typy plikw .......................................................................................................................................256
Wywietlanie plikw.....................................................................................................................257
Tworzenie i modyfikowanie plikw .............................................................................................257
Kopiowanie plikw .......................................................................................................................257
Pliki tymczasowe...........................................................................................................................257
Wysyanie plikw do serwera ............................................................................................................258
Bufor listy plikw...............................................................................................................................258
Uprawnienia .......................................................................................................................................258

Natychmiastowe rozwizania ............................................................................................... 259

Wywietlanie zawartoci katalogw ..................................................................................................259


Wsplny kod .................................................................................................................................259
Zastosowanie funkcji sprawdzajcych typ pliku...........................................................................259
Zastosowanie funkcji filetype().....................................................................................................260
Zastosowanie funkcji get_directory_file() ....................................................................................261
Sformatowana lista plikw............................................................................................................262
Inne funkcje katalogw .................................................................................................................263
Tworzenie i usuwanie kartotek...........................................................................................................265
Wypisywanie atrybutw plikw.........................................................................................................266
Wsplny kod .................................................................................................................................266
Rozszerzona funkcja get_directory_file() .....................................................................................266
Sformatowana lista plikw............................................................................................................267
Dodatkowe atrybuty ......................................................................................................................269
Sprawdzanie iloci miejsca na dysku .................................................................................................269
Wsplny kod .................................................................................................................................270
Rozszerzenie funkcji get_directory_file() .....................................................................................270
Wyszukiwanie wolnego miejsca na dysku....................................................................................270
Formatowanie listy plikw z podaniem iloci zajtego miejsca ...................................................272
Wypisywanie iloci miejsca zajtego przez katalogi ....................................................................274
Wypisywanie iloci miejsca zajtego przez najbardziej obszerne katalogi ..................................275
Wypisywanie miejsca zajmowanego przez najwiksze pliki........................................................276
Wypisywanie atrybutw obrazkw ....................................................................................................277
Gromadzenie informacji o obrazie ................................................................................................278
Wywietlanie informacji o obrazku ..............................................................................................279

Spis treci

Wywietlanie dowolnych danych.......................................................................................................280


Wsplny kod .................................................................................................................................280
Wywietlanie pliku tekstowego ....................................................................................................280
Wywietlanie pliku HTML ...........................................................................................................282
Wywietlanie dowolnego pliku .....................................................................................................283
Tworzenie pustych plikw .................................................................................................................284
Wysyanie plikw do serwera ............................................................................................................285
Obliczanie kodw CRC dla plikw....................................................................................................288

Rozdzia 9. Formularze .......................................................................................291


Szczegowe omwienie....................................................................................................... 291
Alternatywna nawigacja .....................................................................................................................291
HTML czy czyste PHP? .....................................................................................................................292
Minimalny kod HTML.......................................................................................................................293
Dzwonki i gwizdki .............................................................................................................................294
Pytania formularza ........................................................................................................................296
Kilka akcji ..........................................................................................................................................299
JavaScript ...........................................................................................................................................300
Usuwanie wymylnych rozwijanych menu...................................................................................300
Sprawdzanie poprawnoci pl na serwerze...................................................................................300
Dugie formularze...............................................................................................................................301
Podzia dugich formularzy ...........................................................................................................301
Przenoszenie informacji ze strony do strony.................................................................................302
Projektowanie dobrych dugich formularzy ..................................................................................304
Wysyanie plikw do serwera ............................................................................................................306

Natychmiastowe rozwizania ............................................................................................... 308

Tworzenie formularza ........................................................................................................................308


Tworzenie formularza za pomoc funkcji..........................................................................................308
Tworzenie dugiej listy w formularzu ................................................................................................309
Wyrwnywanie kolumn .....................................................................................................................311
Wybr jednej z kilku moliwoci.......................................................................................................314
Wybr jednej z kilku moliwoci za pomoc przyciskw radiowych ...............................................317
Wybr kilku z wielu moliwoci........................................................................................................318
Zachowywanie odpowiedzi i podwietlanie bdw..........................................................................323

Rozdzia 10. Funkcje..........................................................................................325


Szczegowe omwienie....................................................................................................... 325
Najkrtsza funkcja wiata ..................................................................................................................326
Zwracanie wartoci.............................................................................................................................327
Przekazywanie wartoci do funkcji....................................................................................................329
Parametry opcjonalne .........................................................................................................................330
Zmienna ilo parametrw funkcji.....................................................................................................332
Zakres .................................................................................................................................................333
Zmienne statyczne..............................................................................................................................336
Rekurencja..........................................................................................................................................338
Nazwy funkcji przechowywane w zmiennych...................................................................................338
Kolejno funkcji ...............................................................................................................................339

Natychmiastowe rozwizania ............................................................................................... 340

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

PHP. Czarna ksiga

Korzystanie z funkcji create_function() .............................................................................................347


Korzystanie z funkcji func_get_arg() oraz func_num_args() ............................................................348
Korzystanie z funkcji func_get_args() ...............................................................................................349
Rejestrowanie funkcji kocowej ........................................................................................................349

Rozdzia 11. Obrazki ..........................................................................................351


Szczegowe omwienie....................................................................................................... 351
GIF .....................................................................................................................................................351
PNG ....................................................................................................................................................352
JPEG...................................................................................................................................................352
PDF.....................................................................................................................................................353
ClibPDF.........................................................................................................................................354
FDF................................................................................................................................................359
PDFlib ...........................................................................................................................................361
Flash i Shockwave..............................................................................................................................362
Plik ................................................................................................................................................362
Klatka ............................................................................................................................................363
Kolor..............................................................................................................................................363
Obiekty ..........................................................................................................................................364
Tekst ..............................................................................................................................................366
Bitmapy i symbole ........................................................................................................................367
Akcje .............................................................................................................................................367
Przyciski ........................................................................................................................................368
Bazy danych obrazkw ......................................................................................................................370
MySQL..........................................................................................................................................370
Inne bazy danych SQL ..................................................................................................................370
Hyperwave ....................................................................................................................................370
Instalowanie moduu obrazkw..........................................................................................................371
Wywietlanie obrazkw .....................................................................................................................371
Zawsze uywaj tekstu alternatywnego dla obrazka ......................................................................372
W znaczniku obrazka wykorzystuj informacje o jego rozmiarach ...............................................372
Twrz miniatury obrazkw ...........................................................................................................372
Tworzenie obrazkw ..........................................................................................................................372
Modyfikowanie obrazkw..................................................................................................................377
Zmiana kolorw ............................................................................................................................377
Zmiana rozmiaru i rozdzielczoci .................................................................................................378
Programy zewntrzne .........................................................................................................................379
Wybr odpowiedniego formatu..........................................................................................................379

Natychmiastowe rozwizania ............................................................................................... 380

Wywietlanie obrazkw .....................................................................................................................380


Zbieranie informacji o obrazie ......................................................................................................380
Wywietlanie informacji o obrazku ..............................................................................................381
Tworzenie tekstu w dokumencie PDF za pomoc biblioteki ClibPDF..............................................386
Tworzenie tekstu w dokumencie PDF za pomoc biblioteki PDFlib ................................................388
Tworzenie tekstu w obrazku GIF, JPEG lub PNG.............................................................................388
Tworzenie rysunkw w obrazkach GIF, JPEG lub PNG ...................................................................390

Rozdzia 12. Tworzenie witryn midzynarodowych ...............................................393


Szczegowe omwienie....................................................................................................... 393
Wykrywanie jzyka i kraju.................................................................................................................394
Wykrywanie ustawie midzynarodowych ..................................................................................394
Wykrywanie jzyka i kraju przez serwer Apache .........................................................................395
Obowizkowy wybr za pomoc PHP..........................................................................................396
Wymagania jzyka .............................................................................................................................397
Specyfika aplikacji i specyfika witryny .............................................................................................398

Spis treci

11

GNU recode........................................................................................................................................398
GNU gettext .......................................................................................................................................399
Pisownia .............................................................................................................................................400
Dopasowywanie sw....................................................................................................................401
Aspell ............................................................................................................................................402
Pspell .............................................................................................................................................403
Znaki wielobajtowe ............................................................................................................................405

Natychmiastowe rozwizania ............................................................................................... 406

Tworzenie informacji o kraju .............................................................................................................406


Przechowywanie informacji o kraju...................................................................................................409
Pobieranie informacji o kraju .............................................................................................................411
Wykorzystanie rekordw sesji dla informacji o kraju........................................................................414
Tumaczenie komunikatu z innego jzyka za pomoc GNU gettext .................................................415
Tumaczenie tekstu z innego jzyka za pomoc SQL........................................................................417
Sprawdzanie typw znakw...............................................................................................................420
Dopasowywanie fraz i nazw miejsc za pomoc funkcji levenshtein()...............................................422

Rozdzia 13. Internet..........................................................................................425


Szczegowe omwienie....................................................................................................... 425
URL ....................................................................................................................................................426
Schemat, czyli protok.................................................................................................................426
Host ...............................................................................................................................................426
cieka ..........................................................................................................................................427
Strona ............................................................................................................................................427
Fragment........................................................................................................................................427
Kwerenda ......................................................................................................................................428
Znaki specjalne..............................................................................................................................428
acuchy tekstu kodowane jako base64 .......................................................................................428
Przegldanie innych serwerw...........................................................................................................429
Funkcje gniazd ...................................................................................................................................430
SNMP .................................................................................................................................................433
Curl.....................................................................................................................................................436
FTP .....................................................................................................................................................436

Natychmiastowe rozwizania ............................................................................................... 437

Kodowanie base64 .............................................................................................................................437


Przegldanie Internetu za pomoc PHP .............................................................................................438
Sprawdzanie czy..............................................................................................................................441
Korzystanie z funkcji FTP..................................................................................................................442
Korzystanie z Curl..............................................................................................................................449
Opcje biblioteki Curl .....................................................................................................................450

Rozdzia 14. LDAP .............................................................................................457


Szczegowe omwienie....................................................................................................... 457
Instalacja.............................................................................................................................................458
Terminologia ......................................................................................................................................458
DN .................................................................................................................................................459
RDN ..............................................................................................................................................460
Poziomy.........................................................................................................................................460
Pozycje ..........................................................................................................................................460
Atrybuty ........................................................................................................................................460
Obiekty ..........................................................................................................................................461
DIT ................................................................................................................................................461
Schemat .........................................................................................................................................461
LDIF ..............................................................................................................................................462

12

PHP. Czarna ksiga

Waciwoci serwera ..........................................................................................................................462


Powoywanie si............................................................................................................................462
Replikacja......................................................................................................................................463
Bezpieczestwo .............................................................................................................................463
Funkcje LDAP....................................................................................................................................463

Natychmiastowe rozwizania ............................................................................................... 467

Instalowanie LDAP w Windows NT..................................................................................................467


Rozszerzenie PHP .........................................................................................................................467
Serwer OpenLDAP .......................................................................................................................467
Testowanie serwera .......................................................................................................................468
czenie si z LDAP..........................................................................................................................469
Dodawanie kodw krajw..................................................................................................................473
Poczenie......................................................................................................................................473
Pobieranie kodw krajw..............................................................................................................473
Formatowanie kodw krajw........................................................................................................474
Dodawanie pierwszego kodu kraju ...............................................................................................475
Dodawanie kolejnych kodw krajw ............................................................................................476
Dodawanie uytkownika ....................................................................................................................477
Dodawanie poziomw porednich ................................................................................................477
Dodawanie kocowego poziomu ..................................................................................................478
Obsuga bdw..................................................................................................................................478
Wypisywanie wszystkich pozycji ......................................................................................................481
Wypisywanie wszystkich pozycji na pojedynczym poziomie ......................................................481
Wypisywanie wszystkich pozycji na wszystkich poziomach .......................................................484
Interpretowanie pozycji w listingu ................................................................................................486

Rozdzia 15. Poczta ...........................................................................................489


Szczegowe omwienie....................................................................................................... 489
IMAP ..................................................................................................................................................490
Funkcje skrzynki pocztowej..........................................................................................................490
Funkcje wiadomoci......................................................................................................................492
Funkcje subskrypcji.......................................................................................................................493
Funkcje konwertujce acuchy ....................................................................................................494
Inne funkcje...................................................................................................................................499
Nagwki wiadomoci........................................................................................................................502
Minimalne nagwki .....................................................................................................................502
Dodatkowe nagwki.....................................................................................................................502
MIME .................................................................................................................................................503
MIME-Version ..............................................................................................................................503
Content-Type.................................................................................................................................503
Content-Transfer-Encoding...........................................................................................................504
Content-ID.....................................................................................................................................504
Content-Description ......................................................................................................................504
Content-Disposition ......................................................................................................................504
Tryby dziaania...................................................................................................................................505
Tryb offline ...................................................................................................................................505
Tryb online ....................................................................................................................................506
Praca bez poczenia .....................................................................................................................506
Poczta tymczasowa .......................................................................................................................506

Natychmiastowe rozwizania ............................................................................................... 507

Instalowanie funkcji poczty PHP .......................................................................................................507


Windows NT .................................................................................................................................507
Unix ...............................................................................................................................................507

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

Rozdzia 16. Sieci ..............................................................................................525


Szczegowe omwienie....................................................................................................... 525
Debugger ............................................................................................................................................525
DNS i rekordy MX .............................................................................................................................526
Nazwy hosta .......................................................................................................................................526
Adresy IP............................................................................................................................................526
ip2long() ........................................................................................................................................527
long2ip() ........................................................................................................................................528
Numery i nazwy protokow..............................................................................................................528
Nazwy usug i numery portw ......................................................................................................528
getservbyname() ............................................................................................................................528
getservbyport() ..............................................................................................................................529
Gniazda...............................................................................................................................................529
pfsockopen()..................................................................................................................................529
socket_get_status() ........................................................................................................................529
socket_set_blocking()....................................................................................................................530
socket_set_timeout() .....................................................................................................................531
Dziennik systemowy ..........................................................................................................................531
define_syslog_variables()..............................................................................................................531
openlog() .......................................................................................................................................531
syslog() ..........................................................................................................................................532
closelog() .......................................................................................................................................532
NFS.....................................................................................................................................................532
NIS .....................................................................................................................................................533
Mapa..............................................................................................................................................533
yp_get_default_domain() ..............................................................................................................533
yp_master()....................................................................................................................................534
yp_order()......................................................................................................................................534
yp_match() ....................................................................................................................................534
yp_first()........................................................................................................................................534
yp_next() .......................................................................................................................................535
WDDX ...............................................................................................................................................535
Pakiet WDDX ...............................................................................................................................536
CORBA ..............................................................................................................................................536
orbitobject() ...................................................................................................................................537
orbitenum()....................................................................................................................................537
orbitstruct()....................................................................................................................................538
satellite_caught_exception()..........................................................................................................538
satellite_exception_id() .................................................................................................................538
satellite_exception_value()............................................................................................................538

14

PHP. Czarna ksiga

Kompresja ..........................................................................................................................................538
bzip2 ..............................................................................................................................................539
gzip ................................................................................................................................................541

Natychmiastowe rozwizania ............................................................................................... 541

Sprawdzanie rekordw DNS ..............................................................................................................541


Odczytywanie rekordw MX .............................................................................................................543
Uzyskiwanie nazwy hosta ..................................................................................................................544
Uzyskiwanie nazwy hosta na podstawie adresu............................................................................544
Uzyskiwanie adresu hosta na podstawie nazwy............................................................................545
Uzyskiwanie listy adresw hosta na podstawie nazwy .................................................................546
Wypisywanie numerw protokow ..................................................................................................547
Serializowanie danych za pomoc WDDX ........................................................................................548
wddx_serialize_value() .................................................................................................................548
wddx_deserialize() ........................................................................................................................549
serialize() .......................................................................................................................................549
wddx_serialize_vars() ...................................................................................................................550
wddx_deserialize() ze zmiennymi.................................................................................................550
wddx_packet_start() ......................................................................................................................551
wddx_add_vars()...........................................................................................................................551
wddx_packet_end() .......................................................................................................................551
Kompresowanie danych za pomoc biblioteki zlib............................................................................552
Tworzenie prywatnego dziennika ......................................................................................................554

Rozdzia 17. Obiekty ..........................................................................................555


Szczegowe omwienie....................................................................................................... 555
Klasy...................................................................................................................................................555
new ................................................................................................................................................556
Jak zmienna ...................................................................................................................................556
stdClass..........................................................................................................................................557
__ ...................................................................................................................................................557
Waciwoci........................................................................................................................................559
var..................................................................................................................................................559
Konstruktor....................................................................................................................................560
$this ...............................................................................................................................................560
Metody................................................................................................................................................561
Destruktor......................................................................................................................................562
Rozszerzanie klas ...............................................................................................................................563
Dodawanie funkcji ........................................................................................................................564
Konstruktory w klasach rozszerzonych.........................................................................................564
Zastpowanie funkcji ....................................................................................................................565
Usuwanie funkcji...........................................................................................................................566
Wielokrotne rozszerzanie ..............................................................................................................566
:: ....................................................................................................................................................567
parent .............................................................................................................................................567
Dystrybucja i dokumentacja oprogramowania...................................................................................567
Zoone zalenoci pomidzy danymi ..........................................................................................568
Wiele wynikw .............................................................................................................................568

Natychmiastowe rozwizania ............................................................................................... 569

Zapisywanie obiektw w sesji i uycie funkcji __sleep()..................................................................569


Korzystanie z funkcji obiektw..........................................................................................................573
call_user_method()........................................................................................................................574
call_user_method_array()..............................................................................................................574
class_exists() .................................................................................................................................575
get_class()......................................................................................................................................575

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

Rozdzia 18. Wyszukiwanie.................................................................................589


Szczegowe omwienie....................................................................................................... 589
Przeszukiwanie witryn wyszukiwania................................................................................................589
LDAP ............................................................................................................................................590
Z39.50.................................................................................................................................................590
YAZ....................................................................................................................................................591
Instalowanie YAZ .........................................................................................................................591
rda danych................................................................................................................................591
Testowanie ....................................................................................................................................592
RPN ...............................................................................................................................................593
Wyszukiwanie za pomoc YAZ.........................................................................................................593
Nieobsugiwane wyszukiwanie .....................................................................................................593
Funkcje YAZ.................................................................................................................................593
Wyszukiwanie oparte na bazie danych ..............................................................................................598
Przechowuj oryginalne dane .........................................................................................................599
Utrzymuj elastyczno danych......................................................................................................599
Pozwl na elastyczne wyszukiwanie.............................................................................................600
Klasyfikuj dane .............................................................................................................................600
Redukuj, ale nie usuwaj ................................................................................................................601
Uywaj tekstowych opisw...........................................................................................................601
Stwrz obszerny indeks.................................................................................................................601

Natychmiastowe rozwizania ............................................................................................... 602

Przeszukiwanie jednego serwera........................................................................................................602


search() ..........................................................................................................................................602
array_display() ..............................................................................................................................605
Biblioteka Stanowa Poudniowej Australii ...................................................................................605
Bell Labs .......................................................................................................................................606
Przeszukiwanie kilku serwerw .........................................................................................................608
rdo danych ...............................................................................................................................608
Parametry wyszukiwania...............................................................................................................608
Funkcja search() ............................................................................................................................608
Funkcja array_display().................................................................................................................612
Testowanie wyszukiwania.............................................................................................................612
Wyniki ...........................................................................................................................................612
Przeszukiwanie google.com ...............................................................................................................613
Formularz ......................................................................................................................................613
Surowe wyniki...............................................................................................................................615
Wyniki po edycji ...........................................................................................................................615
Wywietlanie wynikw .................................................................................................................616
Indeksowanie danych .........................................................................................................................617

Rozdzia 19. Sesje .............................................................................................621


Szczegowe omwienie....................................................................................................... 621
Korzyci dla waciciela.....................................................................................................................622
Korzyci dla uytkownika ..................................................................................................................622

16

PHP. Czarna ksiga

Identyfikator sesji ...............................................................................................................................622


Cookie ................................................................................................................................................623
HTTPS...........................................................................................................................................624
Cookie kontra URL .......................................................................................................................624
Pliki kontra bazy danych ....................................................................................................................624
Mechanizmy sesji w PHP...................................................................................................................625
php.ini............................................................................................................................................625
Funkcje sesji w PHP......................................................................................................................627
Obsuga klientw................................................................................................................................635

Natychmiastowe rozwizania ............................................................................................... 635

Rozpoczynanie sesji z wykorzystaniem cookie i plikw ...................................................................635


Rozpoczynanie sesji z wykorzystaniem MySQL...............................................................................640
Wywietlanie listy biecych uytkownikw ....................................................................................649
Uycie funkcji session_end() .............................................................................................................651
Pliki ...............................................................................................................................................651
Bazy danych ..................................................................................................................................651

Rozdzia 20. XML...............................................................................................655


Szczegowe omwienie....................................................................................................... 655
Co to jest XML? .................................................................................................................................655
Na czym polega magia XML? ......................................................................................................655
Co potrafi XML? ...........................................................................................................................656
Czego XML nie potrafi? ...............................................................................................................656
XML nie zastpuje HTML ............................................................................................................657
Dane....................................................................................................................................................657
Jednostki zewntrzne.....................................................................................................................659
Jednostki nieprzetwarzane.............................................................................................................659
Pisanie zoonych definicji DTD ..................................................................................................660
Struktura .............................................................................................................................................660
Nazwy............................................................................................................................................660
Atrybuty ........................................................................................................................................660
CDATA .........................................................................................................................................661
DTD...............................................................................................................................................661
Przestrze nazw.............................................................................................................................663
XLink oraz XPointer .....................................................................................................................663
Funkcje XML .....................................................................................................................................663
Instalowanie XML.........................................................................................................................663
Funkcje ..........................................................................................................................................664
XSLT ..................................................................................................................................................671
HTML, DHTML czy XSLT? ........................................................................................................671
Instalowanie XSLT .......................................................................................................................672
Funkcje XSLT ...............................................................................................................................672
WDDX ...............................................................................................................................................675
DOM...................................................................................................................................................676
Instalowanie DOM XML ..............................................................................................................676
Funkcje DOM XML......................................................................................................................677

Natychmiastowe rozwizania ............................................................................................... 682

Wywietlanie plikw XML ................................................................................................................682


Wywietlanie danych XML................................................................................................................683
Przetwarzanie danych XML...............................................................................................................686
Dopasowanie znacznikw pocztkowych i kocowych ....................................................................690

Dodatek A Zawarto pyty CD-ROM ..................................................................695


Skorowidz..........................................................................................................697

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

PHP. Czarna ksiga

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.

   
 
        
 
  
  

  !""##""$$  !$%!"!%!&
 
'
' ' (
)* +
),
  
    )
    
  (
 
 )
    
    (
   )
    
  (
  
 )
    
  (
  )
    
 
  (
 
)
    
   -.(
 "##""$$)
    
   -.(
 %!"!%!&)
    
 (
 
 

  (
)
  (
 *)
 + ),

HTML czy czyste PHP?


PHP dobrze czy si z kodem HTML, ale taki kod trudno odczyta, a przy tym, przy
kadym przejciu do HTML, traci si zalety skryptu PHP. Potg i elastyczno zyskuje
si budujc cay formularz, cznie z kadym znacznikiem i kadym parametrem, w czystym kodzie PHP. Skrypty przedstawione w tym rozdziale generuj kady element znacznikw HTML, dziki czemu mamy absolutn kontrol nad zawartoci i formatem.
W miar, jak przegldarki bd coraz lepiej obsugiwa arkusze CSS (Cascading Style
Sheets), bdziesz mg redukowa bezporednie formatowanie zawartoci strony, ale
pamitaj, by dokadnie przeanalizowa rynek, zanim zastpisz stare znaczniki 

czym nowym. Swojego czasu pomagaem agencji marketingowej w przygotowaniu prezentacji dla szefa pewnej bardzo duej firmy. Szef obejrza prezentacj, skopiowa list
referencyjn z witrynami stworzonymi przez agencj, po czym pojecha do domu. Pn
noc uy starego komputera i wolnego modemu swojego syna, aby sprawdzi otrzymane
witryny i okazao si, e cz z nich bya nieczytelna. Agencja stracia to zlecenie.
Rozwizanie problemw szybkoci i zgodnoci ma zasadnicze znaczenie w formularzach rejestracyjnych witryny, gdy wanie te formularze s wywietlane uytkownikom jako pierwsze. Niektre witryny trac tysice klientw, gdy ich formularze rejestracyjne nie dziaaj we wszystkich przegldarkach. Dodajc do tego sabe dzienniki,
raporty i analiz prowadzone przez wiele witryn, firmy nawet nie wiedz, dlaczego i ilu
klientw trac. Tworzc pocztkowy formularz rejestracyjny, formularz zapytania, formularz z informacjami zwrotnymi czy formularz zgaszania problemu, dokadnie upewnij si, e jest on atwy w uyciu i doskonale stabilny w kadej z przegldarek.

Rozdzia 9.

Formularze

293

Najwikszym problemem moe okaza si walka z wydziaem marketingu o pozbycie


si ze strony formularza natarczywych pyta, rozpraszajcej grafiki i rozbudowanego
tekstu. Z jakich powodw niektrzy ludzie nie krpuj si zadawa na stronie pyta, na
ktre klienci rzadko odpowiadaj w drukowanych formularzach. Co wicej, niektrzy
projektanci czyni takie pytania obowizkowymi i dziwi si, e klienci nie wypeniaj
formularzy.
Na nawigowanie za pomoc formularzy wpywa take szybko, z jak moesz zmienia strony; jeli nie moesz szybko ich zmieni, staj si bezuyteczne i mylce. Okae
si, e kierownicy i pracownicy marketingu zadaj natychmiastowej zmiany strony
dziesi minut po zakoczeniu pracy przez zesp testujcy; zmiany te mog obejmowa zarwno co tak prostego, jak usunicie oferty ze specjaln cen, jak i co tak wanego, jak usunicie nielegalnej strony, przynoszcej kary w wysokoci tysicy dolarw
dziennie. Kilka lat temu, gdy czekaem na wind, by pojecha do domu, usyszaem
krzyk i poszedem sprawdzi, co si dzieje. Byskotliwy, mody kierownik marketingu
gwatownie rozrastajcej si witryny handlowej wyglda tak, jakby mia za chwil dosta ataku serca, poniewa na stronach ich cakiem nowej linii produktw, a mianowicie
papierosw, zabrako wymaganych ostrzee o zachorowaniach. Na szczcie zaprojektowaem t witryn w taki sposb, by mc szybko dokonywa zmian, dlatego mogem
rozwiza ten problem zanim jeszcze winda przybya na pitro.
Jedn z cech, jak daje Ci kod przedstawiony w tym rozdziale, jest spjno. Im bardziej spjnym uczynisz format i ukad swoich pyta i formularzy, tym atwiej bdzie
klientom wypenia kolejne formularze w witrynie. Spjno bdzie Ci take pomocna
na dusz met; jest to kolejnym powodem, by generowa wszystko za pomoc kodu
PHP i nie korzysta ze wstawek w HTML.
Cz kodu w tym rozdziale obsuguje listy wyboru z wieloma pozycjami. Jeli korzystasz z list wyboru, we pod uwag moliwo wpisania dowolnego, alternatywnego tekstu.
Na przykad, gdy na pewnych amerykaskich witrynach rozpoczynano sprzeda poza
granicami kraju, formularze zamwie wymagay podania adresu, ale listy wyboru stanu
przyjmoway wycznie stany amerykaskie, przez co 5,6 miliarda z 5,9 miliarda osb
na tej planecie nie mogo poda poprawnego adresu. Obecnie wikszo stron dziaa ju
lepiej i oferuje moliwo wybrania innego stanu (lub pominicia wyboru stanu), podania kodu pocztowego innego, ni skadajcy si z piciu cyfr (lub pominicia i tego wyboru) oraz podania numeru telefonu z dugim prefiksem. Na szczcie, w cudownej dobie poczty elektronicznej, numery faksw zwykle nie s ju wymagan odpowiedzi.

Minimalny kod HTML


Formularz HTML wymaga:


pocztkowego znacznika, 
,

ktrego ze znacznikw danych, na przykad znacznika  ,

znacznika akcji, jak  !  ,

znacznika kocowego, "


.

294

PHP. Czarna ksiga

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:
 

    )
  
 / )
 
 )
+ )

W wielu przegldarkach znacznik 


powoduje irytujcy efekt wstawienia odstpu.
W niektrych pocztek formularza wstawia podzia linii, podobny do podziau wystpujcego w tabelach. Take znacznik koca formularza moe wstawia podzia linii lub spacj.
Formularze mog zawiera inne elementy formatowania, na przykad tabele sterujce
ukadem poszczeglnych elementw w formularzu. Mona take stosowa akapity i szeroki zakres elementw formatowania HTML. Istniej reguy okrelajce, co moe trafi do
wntrza formularza oraz co moe otacza formularz. Wikszo przegldarek amie te
reguy niektre dziel linie tam, gdzie nie powinny, inne ignoruj bardziej skomplikowane opcje formatowania, jeszcze inne akceptuj le sformuowany kod HTML dlatego bd raczej konserwatywny i uyj minimum kodu HTML, wymaganego do stworzenia logicznego i czytelnego formularza. Testuj go, korzystajc z rnych przegldarek,
gdy Twoja ulubiona przegldarka moe akceptowa takie pomyki, ktre w innych
przegldarkach mog zniszczy ca stron.
Gdy zakoczysz formularz na innym poziomie znacznika HTML, ni go zacze, spowodujesz problemy. Na przykad, jeli zaczniesz formularz poza tabel, a nastpnie zakoczysz go wewntrz komrki tabeli, niektre przegldarki nie bd wiedziay, co z tym
zrobi. Twoje struktury powinny by jednolite i symetryczne. Ja zwykle tworz znacznik  , nastpnie ujmuj go pomidzy znaczniki  i " , cao ujmuj znacznikami  i " , potem umieszczam wszystko w znacznikach tabeli, a nastpnie
w znacznikach formularza. Gdy chc okreli pooenie formularza na stronie, cay formularz wstawiam do komrki tabeli.
Moesz skorzysta z zagniedania i symetrii znacznikw formularzy i tabel, tworzc
z kadej z warstw funkcj, a nastpnie zagniedajc te funkcje. Testowaem witryny za
pomoc tuzinw przegldarek w rnych wersjach; kada z listy moich 30 ulubionych
przegldarek dobrze radzia sobie z elementami formularza, uoonymi na poziomach
pasujcych do innych znacznikw HTML. Tworzenie formularzy za pomoc zagniedonych funkcji PHP jest duo bardziej stabilne ni tworzenie ich za pomoc Dreamweavera i innych drogich programw do tworzenia ukadu strony.

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,
:

W przedstawionym tu kodzie mgby uy ptli


'(, ale konstrukcja $)')'((
ma pewne zalety, do ktrych naley zwrcenie waciwej nastpnej pozycji tablicy nawet
wtedy, gdy wewntrz ptli wstawiasz lub usuwasz pozycje tej tablicy.

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



,
 / 4 A 
 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

PHP. Czarna ksiga

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;

zakadaj, e kady kraj korzysta z kodw pocztowych;

zakadaj, e kod pocztowy ma zawsze pi cyfr.

Kady kraj posiada wasn specyfik, co sprawia, e projektowanie midzynarodowych


formularzy jest interesujcym zagadnieniem.

Pytania Tak/Nie
Przedstawione tu pytania pasuj do przyciskw radiowych w formularzach HTML:


Czy jadasz ryby? Tak/Nie

Czy jadasz przetwory mleczne? Tak/Nie

Czy yczysz sobie miejsce przy oknie? Tak/Nie

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

A jak wyglda to w kodzie HTML i w PHP? Kod HTML ma posta:


 

   )
CD1

D ,,,E


Rozdzia 9.

Formularze

297

 

  (
 
  )
,,,F  

  (
  )
,,,  (
 E )
+ )

Zwr uwag, e oba przyciski radiowe maj nazw


 ), oraz oba maj przypisane
wartoci. Warto domylna (w tym przypadku %), jest oznaczona jako )%. PHP
zwraca wybran warto w zmiennej o nazwie *
 ); w tym przykadzie wywietlimy
j za pomoc kolejnego kodu. Zwr uwag na zastosowane w nim sprawdzenie, czy
zmienna *
 ) istnieje (za pomoc instrukcji 
' '*
 )((); warto o tym pamita,
tworzc strony z formularzami, ktre w celu wywietlenia wynikw lub bdw wskazuj na siebie same. Na grze strony dopisz komentarz opisujcy, co jest wywietlane
przy pierwszym wejciu, co w przypadku wystpienia bdu oraz gdzie trafi odwiedzajcy po klikniciu na przycisku Wylij.
4 4 66
7
 4G
2H 1  6,
:

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.
   


  
(
 
  ),

Jedna lub wicej odpowiedzi z wielu


Niektre pytania mog mie jedn lub kilka odpowiedzi; mog take nie mie adnych
odpowiedzi. Do ich zadawania suy znacznik HTML   . Znacznik ten pozwala
na wskazanie jednej pozycji, ale ma take opcj zaznaczania kilku pozycji naraz (cho
nie dziaa to w kadej przegldarce ani w kadym systemie operacyjnym). Oto kilka
przykadowych pyta oraz kod, rezultatem ktrego jest lista pokazana na rysunku 9.3.

298

PHP. Czarna ksiga

Rysunek 9.3.
Wybierz swoje
ulubione piwo,
uywajc znacznika
<select>

Jakie s Twoje ulubione owoce?

Co powiniene spakowa, wybierajc si do Sydney?

Wybierz swoje ulubione piwo.


 4  
    )
   
 
(  ) )
; +)
 )8
 ; +) )=
; +)
 ) +) )8 ; +)
 )I
 ; +) )@ +)
 ) 
@ +)
 )>  =
  +)
 )J  +) )=< +) +  ) + )6,

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:


Czy lubisz banany?

Czy lubisz pomaracze?

Czy lubisz jabka?

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

PHP. Czarna ksiga

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.

Usuwanie wymylnych rozwijanych menu


Pierwszy krok wie si z usuniciem wymylnych rozwijanych menu, stworzonych
w JavaScripcie. Standardowy znacznik HTML   dostarcza rozwijanego menu,
ktre nie tylko jest atwe do stworzenia w PHP, ale jest take zrozumiae dla kadego.
Cokolwiek bardziej skomplikowanego wprawia niektrych uytkownikw w zakopotanie i moe spowodowa, e albo otrzymasz dane wpisane w niewaciwe pole, albo
nie otrzymasz tych danych wcale. Powszechnym symptomem jest strona w poowie pusta, poniewa kliknicie na kontrolowanym przez JavaScript polu w rodku strony spowodowao zniszczenie serii innych, nie powizanych z nim pl.

Sprawdzanie poprawnoci pl na serwerze


Drugi krok wymaga, by na serwerze sprawdzane byy wszystkie pola. Bez wzgldu na
to, jak dobrym uczynisz swj kod JavaScript, klienci mog obej ten kod i wysa Ci
niepoprawne dane. Jedna ze sztuczek polega na skopiowaniu strony, zmianie kodu
JavaScriptu w kopii, a nastpnie otwarciu kopii w przegldarce. Wiele witryn uywa
niekompletnego i le sformatowanego JavaScriptu, dziaajcego wycznie w Internet
Explorerze (powodujcego bdy w przegldarkach takich jak Opera), pozwalajc uytkownikom przegldarek na decydowanie, czy skrypt ma kontynuowa dziaanie, czy te
ma si zatrzyma. Moesz otrzyma dane, ktre tylko czciowo zostay zweryfikowane
przez Twj skrypt lub ktre zostay w caoci stworzone przez cudzy skrypt, dlatego
wszystko (a ju na pewno ceny i podsumowania) musisz sprawdza w swoim kodzie
PHP. Gdy sprawdzasz pole na serwerze za pomoc PHP, nie zaoszczdzisz zbyt wiele
czasu, sprawdzajc je w przegldarce za pomoc JavaScriptu.
Gdy prbujesz zmieni JavaScript lub koszyk z zakupami korzystajcy z cookie, zmiana
cznej kwoty z piciu tysicy dolarw na tysic dolarw moe si uda, jednak zmian
na dziesi dolarw z pewnoci kto zauway.

W ktrym z Twoich projektw moe si zdarzy, e kto bdzie nalega na uycie


JavaScriptu do odrzucania stron, w ktrych wymagane pola nie zostay wypenione. Gdy

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.

Podzia dugich formularzy


Wiele handlowych witryn oferuje przykady zbyt dugich formularzy, stron rejestracyjnych czy ankiet, ktre zniechcaj potencjalnych klientw. Dugie formularze powinny
zosta podzielone na grupy powizanych ze sob pyta; kada grupa powinna wiza
si z jednym zagadnieniem i powinna znajdowa si na osobnej stronie.
Wyobramy sobie witryn, za porednictwem ktrej sprzedawana jest ywno; zamy,
e autorzy tej witryny chc, by klient przyjmowa cotygodniowe wiadomoci e-mail
oraz chcieliby pozna wiek, dochd i pe klienta. Niektrzy klienci wypeni taki formularz, ale wielu po prostu opuci witryn, za wielu innych zrobi to, co ja: wybierze
zupenie nieprawdziwe odpowiedzi na zaczepne i irytujce pytania. W przypadku pytania o poczt elektroniczn zawsze klikam na przycisku Nie, poniewa zbyt wiele witryn
wysya bezuyteczne, zamiecajce skrzynk listy; jako wiek wybieram najnisz lub najwysz moliwo, za jako dochd wskazuj kwot, jakiej nigdy nie zarobiby autor fachowej literatury. Od czasu do czasu w pytaniach o pe mam okazj wybra pozycj Inna.
A gdyby tak pytanie o adres e-mail umieci na osobnej stronie, wraz ze wzorem wiadomoci? Wiadomo ta mogaby zawiera interesujce informacje i czytelnik mgby
wybra twierdzc odpowied na pytanie: Czy chciaby otrzymywa wiadomoci podobne do tej?.

302

PHP. Czarna ksiga

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.

Przenoszenie informacji ze strony do strony


Gdy korzystasz z wielostronicowych formularzy, moesz przenosi informacje ze strony do strony za pomoc ukrytych pl, cookies lub rekordw sesji. Typow strategi jest
zapytanie o imi osoby na jednej stronie, a nastpnie wywietlanie tego imienia na kolejnych stronach, aby stay si one bardziej osobiste. Ukryte pole jest najprostszym sposobem przenoszenia imienia, ale najlepszym jest rekord sesji (o ile istnieje sesja), gdy
dziki niemu imi jest dostpne na kadej stronie witryny.

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.

Ustawianie cookies dla kadej ze stron


Gdy prosisz uytkownika o wypenienie wielostronicowego formularza, wartoci wpisane
na pierwszej stronie mog zosta umieszczone bezporednio w bazie danych lub przeniesione na drug stron w ukrytych polach. Jeli aktualizujesz profil klienta, moesz natychmiast wprowadza do bazy danych kad stron informacji, za ze strony do strony
nie bd przenoszone adne dane. Dla odrnienia, gdy zbierasz informacje w celu stworzenia nowego profilu, moesz nie chcie zapisywa w bazie danych niczego, a do chwili, gdy uytkownik kliknie na ostatniej stronie na przycisku zatwierdzenia warunkw.
W przypadku nowego profilu moesz przenosi zmienne ze strony na stron w ukrytych
polach, ale dodanie nowych stron w rodku wielostronicowego formularza oznacza dodanie nowych pl na wszystkich nastpnych stronach, co moe by rwnie nuce, jak
podatne na bdy. atwiejsze w uyciu mog by pliki cookies, poniewa moesz umieci w nich wszystko, tworzc nowy plik cookie dla kadej ze stron. Tylko ostatni skrypt
w sekwencji musi przejrze kade cookie. Maj one maj take t zalet, e pozostaj
w komputerze klienta przez jaki czas i pozwalaj mu na kontynuowanie wypeniania
formularza nastpnego dnia.
Problem z cookie uwidacznia si dopiero wtedy, gdy zbudujesz ju kilka stron wielostronicowego formularza. Pojawiaj si wtedy ograniczenia plikw cookie, wobec czego

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
  5 5 
  

Uycie rekordw sesji


Rekordy sesji mog mie nieograniczony rozmiar i ilo pozycji. S przechowywane
w polach tekstowych nowoczesnych baz danych, ktre pozwalaj na przechowanie do
czterech miliardw znakw, co zdecydowanie wystarcza dla ogromnej wikszoci zastosowa. Jeli rekord sesji jest przechowywany w osobnym pliku w nowoczesnym
systemie operacyjnym, moe mie rozmiar nawet wielu terabajtw. Jeden taki rekord
sesji mgby przechowa cay tekst, pochodzcy ze wszystkich formularzy wypenianych
kiedykolwiek przez wszystkich ludzi na tej planecie. Uycie cookie do przechowania
identyfikatora sesji oraz rekordu sesji do przechowania pozostaych informacji stanowi
doskonae rozwizanie dla komunikacji midzy stronami w obrbie witryny WWW.
Istnieje jednak problem dotyczcy rekordw sesji, polegajcy na ich tymczasowej naturze.
Rekordy sesji znikaj w momencie zamknicia przegldarki, staj si przestarzae, gdy
wyjdziesz na lunch i s zalene od innych rzeczy, jak cookie lub URL, przenoszcych
identyfikator sesji ze strony do strony. Nie mona bez pewnych trudnoci przywrci
poczenia z sesj, za prosty sposb stanowiby luk w zabezpieczeniach, gdy umoliwiaby atwe wamanie si do sesji. W zwizku z tym uytkownik nie moe zapamita strony w rodku sesji, a nastpnie zacz od niej prac nastpnego dnia.
Aby umoliwi uytkownikom poczenie si nastpnego dnia z t sam sesj, potrzebujesz systemu logowania i wylogowywania si, z zastosowaniem czego w rodzaju
identyfikatora uytkownika i hasa. Musisz zapisa wszystkie informacje sesji w profilu

304

PHP. Czarna ksiga

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.

Projektowanie dobrych dugich formularzy


Mj zakres zapamitywania obejmuje dwie strony. Innymi sowy, mog zapamita, co
wpisaem na pierwszej stronie, gdy wpisuj drug, ale nie pamitam ju tego podczas wpisywania trzeciej. Prbuj uywa tego zakresu jako odniesienia i uwzgldniam go, projektujc formularze. Gdy mam przygotowa profil uytkownika lub podobny formularz, staram
si zaprojektowa go w taki sposb, by na pierwszej stronie uzyska informacje identyfikujce uytkownika; informacje te wykorzystuj jako podstaw dla nastpnych stron.

Najpierw uzyskaj minimum


Jeli nie moesz potraktowa odwiedzajcego jako nowego klienta zanim wypeni obszerny formularz, stracisz potencjalnych klientw. Radz na pierwszej stronie zapyta
jedynie o nazw i adres email uytkownika, po czym wywietli informacje o logowaniu. Pytania marketingowe pozostaw na pniej.
Zaprojektuj formularz i obsugujcy go kod w taki sposb, aby mc zapisa podstawowy adres email, zanim zirytujesz odwiedzajcego natarczywym pytaniem lub znudzisz
go zbyt wieloma stronami zawierajcymi pytania. Zaprojektuj witryn tak, by uytkownik mg opuci w poowie proces rejestracji i wrci do niego pniej, ale ju z wasnym identyfikatorem.

Niech marketing paci za swoj natarczywo


Jeli kierownik marketingu chce zna wiek klienta, niech oferuje za to jak nagrod. Na
stronie rejestracyjnej zbierz minimalne informacje o kontakcie, podaj informacje o sposobie logowania si do witryny, za nastpne pytania zadawaj tylko wtedy, gdy uytkownik
si zaloguje. Nie mam pojcia, dlaczego autor witryny, za porednictwem ktrej sprzedaje
si sprzt biurowy pyta mnie, czy jestem mczyzn, czy kobiet czyby mczyznom
sprzedawano tylko niebieskie dugopisy, a kobietom tylko czerwone?
Jeli na Twojej witrynie nie sprzedajesz alkoholu, papierosw czy pornografii (lub czegokolwiek innego, na co Twj rzd nakada ograniczenia wiekowe), nie musisz pyta
klienta o wiek, aby pozwoli mu na dokonywanie zakupw. Pytanie o wiek moe by
pytaniem dodatkowym, ktremu moe towarzyszy jaka zachta, na przykad darmowy produkt przy nastpnej dostawie. W ten sposb uzyskasz zarwno wiek klienta, jak
i zachcisz go do zakupienia czego w celu zdobycia darmowego produktu a zachcenie do zakupw jest zawsze podane.

Rozdzia 9.

Formularze

305

To samo odnosi si do pyta o dochd i pe. Pozwl uytkownikom zarejestrowa si


nawet wtedy, gdy nie odpowiedz na te pytania i daj im jak zacht, aby na nie odpowiedzieli. Aby uzyska prawdziwe odpowiedzi, upewnij si, e zachta nie skania
do okrelonego wyboru. Jeli zacht dla modszych osb byoby DVD z filmem XFiles, za dla starszych DVD z filmem Moulin Rouge, podabym wiek 95 lat!

Stosuj informacje zwrotne


Gdy masz ju co, czego moesz uy do zidentyfikowania osoby wypeniajcej formularz, umie t informacj w pobliu pocztku strony, przypominajc uytkownikowi, e
jest zalogowany. Pobierajc kad z sekcji formularza wywietlaj informacje zwrotne, takie jak ekrany podsumowujce, stosowane na witrynie Amazon, przedstawiajce kroki ju
wykonane oraz pozostae do wykonania. Powszechnym problemem w przypadku le zaprojektowanych formularzy s klienci, ktrzy rejestruj si po kilka razy, poniewa albo
zapomnieli, e ju si zarejestrowali, albo uwaali, e ich rejestracja si nie powioda.
Moesz z atwoci przechowa tablic zawierajc nazw uytkownika i wypenione
czci formularza, a nastpnie umieci te informacje w rogu strony. Czasem cay formularz opieram na tablicy podobnej do nastpujcej:
   -.

4
 ) 
 5  )N!5
 )O05  )
 6,
   -.

4
 )

 5  )N!5
 )F
D/5  )
 6,
   -.

4
 )
 5  )N!5
 ); 5  )
 6,

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.

Rnica pomidzy nie zadaniem pytania a brakiem odpowiedzi


Gdy dane znajduj si ju w bazie danych, moesz skorzysta z jej mechanizmw do
oznaczenia pl pustych, nieznanych lub pl o wartoci . W MySQL pole acucha
moe zwraca acuch pusty lub warto , w zalenoci od ustawie w definicji
pola (szczegy znajdziesz w rozdziale 5.). Moesz wykorzysta to do pyta w rodzaju
podaj swoje hobby, konwertujc  w MySQL na
  w PHP, wskazujce, e
pytanie o hobby nie zostao zadane i powinno zosta wywietlone nastpnym razem,
gdy klient odczytuje swj profil. Oprcz tego pusty acuch MySQL moesz zamieni
na acuch  w PHP, wskazujcy, e pytanie o hobby zostao zadane, ale uytkownik
jeszcze nie odpowiedzia na nie. Jeli odrnienie wartoci  i
  od acucha pustego jest zbyt trudne (jest tak w przypadku niektrych baz danych i PHP3), stwrz
osobne pole okrelajce, czy pytanie zostao zadane. Moesz nawet uy daty, wskazujcej, kiedy pytanie zostao zadane i zadawa je dokadnie co rok.

306

PHP. Czarna ksiga

Wysyanie plikw do serwera


Formularze pozwalaj take na wysyanie plikw ze stacji roboczej do serwera WWW.
Istnieje kilka niewielkich rnic pomidzy formularzami wysyania plikw a formularzami standardowymi. Dodatkowo obie formy formularzy dziaaj inaczej i wywietlaj
rne rzeczy w rnych przegldarkach i systemach operacyjnych. PHP uatwia przetwarzanie po stronie serwera, ale nie pomaga w wyjanieniu uytkownikom, jak maj korzysta z moliwoci wysyania plikw w ich przegldarkach i systemach operacyjnych.
Pierwsz rzecz, potrzebn do wysyania plikw, jest znacznik formularza z ustawionym
parametrem . Skopiuj przedstawiony tu przykad lub chwy za swj egzemplarz
HTML Black Book (The Coriolis Group, Inc., 2000) aby pozna informacje na temat
. Znacznik formularza wyglda nastpujco:
   
+ P





    )
   
 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!)

Formularz koczy si standardowym znacznikiem wysyania i znacznikiem koca formularza:


 (
 G21) + )

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
@

AA E9


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

PHP. Czarna ksiga

Natychmiastowe rozwizania
Tworzenie formularza
Oto podstawowy formularz w HTML, pytajcy o imi, po czym wracajcy do strony o nazwie createaform.html:
 


    )
8
1 D0/1 09
  
 
 )
 
 (
 G21)
+ )

A oto podstawowy kod PHP, uyty do stworzenia tego formularza:


 4  


    )
8
1 D0/1 09
   
 
 )
  
 (
 G21)
 + )6,

Formularz wywietlony w przegldarce zosta pokazany na rysunku 9.5.


Rysunek 9.5.
Prosty formularz
z jednym pytaniem
i przyciskiem Wylij

Na stronie createaform.html dane wpisane przez uytkownika zostan umieszczone


w zmiennej o nazwie * . PHP pobiera wszystkie pola formularza (za pomoc metody
 lub ) i umieszcza je w zmiennych o nazwach odpowiadajcych parametrom  
pl formularza w znacznikach  w HTML. Oto kod odwoujcy si do danych
z formularza na stronie createaform.html:
4 4
 667 4B
D
09
 6,:

Tworzenie formularza za pomoc funkcji


W przypadku wikszych formularzy pokazany w podrozdziale Tworzenie formularza
kod trudno byoby w razie potrzeby zmodyfikowa, dlatego dobrym rozwizaniem moe
by podzielenie go na kilka mniejszych funkcji oraz oddzielenie pyta od formularza.
Oto podstawowy kod PHP do budowania znacznikw formularza i wstawiania do niego
pyta w postaci acucha znakw:
 4
 5 6
7
  4  

   )
 
  
 
(
 G21)
 + )6,
:

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:
 4 4  5
 A 4
 58
1 D0/1 096
66,

W wyniku otrzymujemy formularz pokazany na rysunku 9.6.


Rysunek 9.6.
Formularz
z jednym pytaniem

Tworzenie dugiej listy w formularzu


W przypadku duszej listy pyta formularz stworzony w podrozdziale Tworzenie
formularza staje si trudny w uyciu. W zwizku z tym w kolejnym przykadzie uyjemy tablicy pyta. Najpierw zdefiniujmy tablic zawierajc pytania uoone w takiej
kolejnoci, w jakiej maj pojawi si w formularzu:

310

PHP. Czarna ksiga

 -
 .

4 ) 5
 )8
1 D0/1 096,
 -
 .

4 ) 5
 ); 96,
 -.

4 ) 5
 )B
96,
 -
 .

4 ) 5
 )
96,
 - .

4 ) 5
 )U
196,

Tablica zawiera pi elementw, z ktrych kady jest tablic zawierajc elementy  ,


 oraz .  ; pole   jest uywane jako klucz tablicy. Pole to identyfikuje
zmienn zawierajc odpowied na pytanie i jako takie powinno zawiera nazw zgodn ze standardami nazw zmiennych w Twoim skrypcie PHP. Pole  informuje funkcj

'(, by stworzya znacznik  za pomoc funkcji


0'(. Pole .  
zawiera wypisywany na stronie tekst dla znacznika  ; tekst ten moe zawiera
znaczniki formatujce HTML, poniewa jest zwracany bez adnych modyfikacji.
Nastpny fragment kodu tworzy znacznik pola tekstowego. Funkcja ta jest zapoyczona
z podrozdziau Tworzenie formularzy i zostaa poddana kilku modyfikacjom. Uywa
nazwy do zidentyfikowania odpowiedzi na pytanie, tekstu pytania oraz opcjonalnej domylnej odpowiedzi.
 A 4
 5

  6
7
4M 4

  - 
.66
7


  - 
.,
:
4  4

  - 
.66
7


  - 
.(
 

  - 
.
,
:
  4

  - .,,
   
 
 


  - 
.)6,
:

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

PHP. Czarna ksiga

W tym przykadzie wszystkie pytania zostan wyrwnane w kolumnach, gdy przewijanie


w pionie jest atwiejsze, ni przewijanie w poziomie. Moesz z atwoci stworzy kolejn
kolumn po prawej stronie (zawierajc komentarze do pyta), dodajc po prostu kolejny
element do tablicy *.   i generujc dodatkow kolumn w funkcji
'(.
Zacznijmy od listy pyta. W tym przypadku stworzymy tylko dwa pytania:
 -
 .

4 ) 5
 )8
1 D0/1 096,
 -
 .

4 ) 5
 ); 96,

Kada pozycja w tablicy *.   posiada nazw  , identyfikujc pytanie, oraz


tablic zawierajc dwa elementy: , okrelajcy rodzaj znacznika  , oraz
.  , zawierajcy tekst pytania (cznie z ewentualnymi znacznikami formatujcymi HTML).
Nastpny fragment kodu to funkcja
0'( z podrozdziau Tworzenie dugiej listy
w formularzu, w ktrej usunito tekst pytania, aby mona go byo formatowa wewntrz funkcji
'(.
 A 4
 5

  6
7
4M 4

  - 
.66
7


  - 
.,
:
4  4

  - 
.66
7


  - 
.(
 

  - 
.
,
:
  4   
 
 


  - 
.)6,
:

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,
:

Szczegy dziaania funkcji


'( zostay opisane w podrozdziale Tworzenie dugiej
listy w formularzu, wcznie z wykorzystaniem zmiennej jako nazwy funkcji. Peny
opis stosowania zmiennych jako nazw funkcji znajdziesz w rozdziale 10.
W tej wersji funkcji
'( po prostu usunem tekst pytania z funkcji formatujcej i dodaem go wewntrz funkcji
'(, dziki czemu tekst wszystkich pyta jest formatowany
w ten sam sposb.
W tym momencie moemy uy rnych technik formatowania pyta, z zastosowaniem
znacznikw akapitw, znacznikw podziau oraz tabel. W tym przypadku uyj prostej,
trzykolumnowej tabeli, z ktrych rodkowa posuy jako odstp pomidzy kolumn
pytania a kolumn odpowiedzi.
 4
 5 6
7
 ,
/  44
 5(6
 4 66
7
4  4 667   ),:
 A(- .,
   ) )(- . +)
 ),, +)
 )4
 5(6 +),
:
  4  

   )
 
 )  +
 )
  
 
(
 G21)
 + )6,
:

W tej wersji funkcji


'( zostay zastosowane znaczniki wiersza tabeli ( ) oraz
komrki tabeli ( ), ktre umieciem wok tekstu generowanego wewntrz ptli
$)'(. Dziki temu kade pytanie znajdzie si w nowym wierszu tabeli. Pierwsza
kolumna tabeli zawiera tekst pytania, druga niewielki odstp, za trzecia zawiera znacznik  , w ktrym uytkownik moe wpisa odpowied.
Instrukcja  '( ujmuje tekst pyta w znaczniki pocztku i koca tabeli, dziki czemu na stronie zostaj wygenerowane komrki wewntrz formularza. Ta symetria pozwala nam unikn problemw z niektrymi przegldarkami, ktre nie akceptuj bdnie sformatowanych tabel.
Przycisk Wylij znajduje si poza tabel i jako taki nie zostanie z ni wyrwnany.
Spjrz na wynik wywietlony w przegldarce, a nastpnie rozwa dokonanie modyfikacji, ktr za chwil zaproponuj. Formularz wywietlony w przegldarce zosta pokazany na rysunku 9.8.

314

PHP. Czarna ksiga

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

Wybr jednej z kilku moliwoci


Jeli otwierasz wasne biuro podry i na swojej witrynie pytasz klientw, ktry kraj
chc odwiedzi, powiniene zastosowa formularz z dug list wyboru, na ktrej klienci bd mogli zaznacza cel swojej planowanej podry. Na podstawie tego zaoenia
w tym rozwizaniu uyjemy tablicy zawierajcej list nazw krajw, znacznik  
formularza HTML (w celu wywietlenia listy krajw) oraz zmienn, do ktrej trafi wybrana pozycja.
W tym celu stworzymy najpierw tablic krajw:
 -.;

,
 -.; 
,
 -.;D  1L
,

Potrzebujemy funkcji do wywietlania pyta zawierajcych listy wyboru; posuy nam


do tego przedstawiona tu funkcja
0 '(. Przyjmuje ona nazw tablicy, list pozycji do umieszczenia na licie wyboru oraz opcjonalny parametr, w ktrym moemy
okreli, ktra z pozycji ma zosta wstpnie zaznaczona.
 A  4
 5

  6
7
,
/  445(6
 4

  -.66
7
4 4

  - 
.6
(

  - 
.6
7
    )( +),

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

PHP. Czarna ksiga

 A 
;
,
 -. A 
,

Gdy dodajesz pozycj do tablicy *.  , pobierz warto elementu 


 bezporednio ze zmiennej *  0
. W ten sposb dodasz domyln pozycj wyboru. Kolejny przykad przedstawia poprzednie pytanie z dodan domyln pozycj:
 - 
.

4 )  5
 
) A 
5
 )UV 
1  D/ D35
) 6,

Teraz moesz skopiowa funkcj


'( z poprzednich rozwiza i uy jej z nowym
typem pytania bez jakichkolwiek modyfikacji. W funkcji
'( lista pyta jest tablic,
ktrej kady element jest przetwarzany za pomoc funkcji odpowiedniej dla danego typu pytania (wybieranej na podstawie pola  w tablicy pytania). W poprzednich przykadach funkcja pytania otrzymywaa nazw pytania i warto domyln, lecz w przypadku funkcji
0 '( musimy przekaza dodatkowy parametr. Funkcja
'( nadal
dziaa, poniewa wszystkie parametry poza nazw pytania s przekazywane w pojedynczej tablicy.
Alternatyw dla tablicy z parametrami jest uycie staej listy trzech parametrw i modyfikacja istniejcej funkcji
0'(, aby przyjmowaa trzeci, niepotrzebny parametr;
w ten sposb kada z funkcji pyta przyjmowaaby dokadnie trzy parametry.
Pokrewne rozwizanie:
Uycie domylnych parametrw funkcji

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  .

Wybr jednej z kilku moliwoci


za pomoc przyciskw radiowych
Gdy podrujesz samochodem, moesz natychmiast zmieni stacj radiow za pomoc
jednego z zaprogramowanych wczeniej przyciskw. Ktry z twrcw doda tak moliwo take do HTML, w postaci znacznika  typu  . W przypadku krtkich list
wyboru przyciski radiowe s dobr alternatyw dla znacznikw   , gdy od razu wida wszystkie moliwoci. Z drugiej strony, znacznik   nadaje si do duszych list,
poniewa kada opcja na licie przyciskw radiowych zajmuje miejsce na stronie.
Aby uy przyciskw radiowych w przykadzie biura podry z poprzedniego podrozdziau, zaczniemy od stworzenia tablicy z list krajw:
 -.;

,
 -.; 
,
 -.;D  1L
,

Potrzebujemy funkcji do wywietlania pyta z przyciskami radiowymi; posuy nam do


tego funkcja
0  '(. Funkcja ta przyjmuje nazw pytania oraz tablic z jego parametrami (wcznie z opcjonalnym parametrem 
, okrelajcym, ktra z opcji
ma zosta domylnie zaznaczona).
 A
4
 5

  6
7
,
/  445(6
 4

  -.66
7
4  466
7
  ),
:
 
 
  

(
 (,
4 4

  - 
.6

(

  - 
.6
7
  ,

318

PHP. Czarna ksiga

:
)(,
:
  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.

Wybr kilku z wielu moliwoci


W poprzednim przykadzie, w ktrym otwierae wasne biuro podry i pytae klientw o kraj, ktry chcieliby odwiedzi, postanowie, e byoby przydatne posiadanie
formularza zawierajcego dug list krajw, ktre mogliby wybiera Twoi klienci. W tym
rozwizaniu uyjemy przyciskw opcji formularza HTML, tablicy, zawierajcej list
nazw krajw oraz tablicy, w ktrej zostan umieszczone wybrane pozycje. Nasz nowy
kod stanowi niewielk modyfikacj kodu uytego w podrozdziale Wybr jednej z kilku moliwoci, za znacznik   zosta zastpiony przez znacznik 
)%!  . Jeli uyjesz przedstawionego tutaj kodu, dane zwrcone przez formularz
bd miay posta tablicy z list wybranych pozycji, a nie prostej zmiennej z jedn pozycj.
By moe domylie si ju, e lubi tablice PHP, poniewa mog one by uywane
w formularzach do zwracania list wartoci. Wielowymiarowe tablice jednak nie
zadziaaj i pozostanie nam jedynie zastpienie standardowego parametru HTML
 #$# 4 przyjaznym dla PHP parametrem  #$# 4
(cho to ograniczenie moe zosta zniesione w przyszych wersjach przegldarek,
jak i samego PHP).

Zaczniemy od stworzenia tablicy z list nazw krajw:


 -.;

,
 -.; 
,
 -.;D  1L
,

Potrzebujemy funkcji, ktra tworzyaby znaczniki )%!  dla kadej


z pozycji tej tablicy. Funkcja
0)%! '( przyjmuje nazw pytania oraz list

Rozdzia 9.

Formularze

319

jego parametrw, do ktrych naley lista opcji przeznaczonych do wyboru oraz pole +

, okrelajce, czy wszystkie opcje maj by domylnie zaznaczone (uytkownik


moe wtedy po prostu wyczy te opcje, ktrych nie potrzebuje).
Zwr uwag na to, e parametr   w znaczniku  zawiera teraz po nazwie
pola nawiasy kwadratowe  informujce PHP, e otrzymana warto jest nastpn pozycj tablicy. Nawiasy kwadratowe powoduj, e parametr   odpowiada
w PHP linii:
 
-.A
D/

1A,

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

PHP. Czarna ksiga

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,

Kiedy to zrobisz, moesz wzi funkcj


'( z poprzedniego rozwizania i bez jakichkolwiek modyfikacji uy jej do wywietlenia listy pyta. W ten sposb uyby kodu:
 4
 5 6
7
 ,
/  44
 5(6
 4 66
7
4  4 667   ),:
 A(- .,
   ) )(- . +)
 ),, +)
 )4
 5(6 +) + ),
:
  4  

   )
 
 )   ) ) +) ) +)
 )  
 
(
 G21) +) + ) +
 )
 + )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:
- .- 

 .,,,

Teraz powiniene zmodyfikowa funkcj


'(, tak, aby stosowaa formatowanie dla
wszystkich pl formularza i zastpi zakodowany w skrypcie odstp wartoci zaadowan z tablicy *  . W innych jzykach globalne zmienne s deklarowane raz, na
pocztku skryptu. W PHP zmienna nie jest zmienn globaln, dopki nie wymienisz jej
w deklaracji & ! wewntrz swojej funkcji. To oznacza, e atwiej jest zadeklarowa
pojedyncz tablic w deklaracji & ! i przechowywa wszystko jako pozycje tablicy,
ni przechowywa wszystkie wartoci w osobnych zmiennych i prbowa doda kad
z nich do deklaracji & !.
Zanim uyjemy wartoci z tablicy *  , za pomoc funkcji * '( musimy sprawdzi, czy ta warto jest ustawiona i odpowiednio zareagowa, jeli zostaa pominita.
W przypadku acucha separatora zmieniem kod tak, by zupenie pomija kolumn separatora tabeli w przypadku, gdy warto separatora nie zostaa zdefiniowana. Oprcz
tego, na wypadek, gdyby kto zechcia uy dodatkowych opcji formatujcych znacznik
 kolumny separatora (jak parametr !&  ), acuch znacznika umieciem w osobnej
zmiennej *. Aby zobaczy, jak to dziaa, spjrz na nastpujcy kod:
 4
 5 6
7

,
 ,
4 4- .-(
.66
7
(
- .-(
.,
:
),
 ,
4 4- .- 

 .66
7
 - .- 

 . +),
:
 ,
/  44
 5(6
 4 66
7
4  4 667   ),:
 A(- .,
   )(- . +) ,
 4
 5(6
 +) + ),
:
  4  

   )

322

PHP. Czarna ksiga

 
 )   ) ) +) ) +)
 )  
 
(
 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 "! .

Zachowywanie odpowiedzi i podwietlanie bdw


W poprzednich rozwizaniach zakadalimy, e klient wypenia formularz i jednokrotnie
klika na przycisku Wylij. Ale co zrobi, gdy chcesz przenie wartoci ze strony do strony
w wielostronicowym formularzu lub ponownie wywietli t sam stron z dopisanymi komunikatami o bdach? W takim przypadku do tablicy *.   powiniene po prostu doda kolejne pola oraz stworzy nowe funkcje przetwarzajce. W przypadku bdw moesz
doda now, pocztkow kolumn na wypisywane na czerwono komunikaty o bdach, aby
nie zmienia pionowego ukadu formularza. Uyjesz w zasadzie tej samej tablicy *.  ,
co w poprzednich rozwizaniach, ale uzupenionej o dodatkowe wartoci. Aby umoliwi
atwe przetestowanie komunikatw o bdach, moesz zmieni pytanie tak, by pozwalao na
wybr tylko dwch krajw, tak jak w nastpujcym fragmencie kodu:
 - 
.

4 )  5
 )G D /0 1L/

1 95
) 6,

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 + ),
:

Musimy si take upewni, e na nowej stronie pojawi si poprzednie odpowiedzi, aby


uchroni uytkownikw przed ponownym wpisywaniem wszystkich pozycji. W tym
celu po prostu dodamy poprzednie odpowiedzi do tablicy pyta jako nowe wartoci
domylne:
4 4 
6
A

4 
66
7
 - 
.- 
. 
,
:

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

PHP. Czarna ksiga

*  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,
:

Pierwsz modyfikacj w funkcji


'( jest kod przetwarzajcy element *- .
Element  istnieje tylko wtedy, gdy na nasze pytanie zostaa udzielona bdna odpowied, dlatego pierwszym krokiem powinno by sprawdzenie, czy element ten istnieje. Jeli tak, kod pobiera z niego tekst, ustawia jego kolor na czerwony (za pomoc
znacznika 
 ) i dodaje go na pocztku tekstu pytania.

You might also like