You are on page 1of 31

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

PHP i MySQL. Tworzenie


aplikacji WWW
Autor: Marc Wandschneider
Tumaczenie: Jarosaw Dobrzaski, Radosaw Meryk
ISBN: 83-246-0323-9
Tytu oryginau: Core Web Application
Development with PHP and MySQL
Format: B5, stron: 856
Stwrz wydajne i bezpieczne aplikacje internetowe
Poznaj zasady programowania w PHP i korzystania z baz danych
Zaprojektuj interfejs uytkownika dla aplikacji
Wykorzystaj dokumenty w formacie XML
Zabezpiecz aplikacj przed nieautoryzowanym dostpem
Sie WWW ju dawno przestaa by jedynie zbiorem setek statycznych witryn.
Dzi w sieci mona znale dziesitki aplikacji sklepw, katalogw, systemw
bankowych, blogw i wielu innych. Do tworzenia takich aplikacji wykorzystuje si kilka
technologii, z ktrych najwiksz popularnoci cieszy si jzyk PHP w poczeniu
z baz danych MySQL. Nieodpatny dostp, atwo obsugi oraz potne moliwoci
sprawiy, e ta platforma jest stosowana przez ogromne rzesze programistw aplikacji
WWW na caym wiecie.
PHP i MySQL. Tworzenie aplikacji WWW to ksika, dziki ktrej poznasz moliwoci
tej technologii i nauczysz si z nich korzysta, piszc aplikacje internetowe. Dowiesz
si, jak tworzy programy w jzyku PHP, manipulowa danymi zgromadzonymi w bazie,
projektowa rozbudowane aplikacje i wdraa je. Przeczytasz tu o zabezpieczaniu
aplikacji, usuwaniu bdw, korzystaniu z plikw XML i usug sieciowych oraz
projektowaniu ergonomicznych interfejsw uytkownika. Dziki praktycznym
przykadom szybko nauczysz si stosowa PHP i MySQL w swoich projektach.
Programowanie w jzyku PHP
Organizacja kodu
Zasady programowania obiektowego
Projektowanie i tworzenie baz danych
Stosowanie jzyka SQL
Przygotowywanie projektu aplikacji
Budowanie interfejsu uytkownika
Usuwanie bdw z kodu
Metody uwierzytelniania uytkownikw
Wyraenia regularne
Usugi sieciowe i protok SOAP
Wdraanie aplikacji
Rozpocznij przygod z programowaniem w PHP

Wprowadzenie ..........................................................................................................................................17
Dla kogo przeznaczona jest ta ksika? ......................................................................... 17
O PHP ......................................................................................................................... 18
Ukad ksiki ............................................................................................................... 19
Zanim zaczniesz .......................................................................................................... 20
Podzikowania ............................................................................................................. 20

Cz I Podstawy PHP

21

Rozdzia 1. Wprowadzenie w tematyk PHP ........................................................................................... 23


Pierwsze programy w PHP ............................................................................................. 23
Wpisywanie kodu PHP .................................................................................................. 25
Oznaczanie sekcji kodu PHP .................................................................................... 26
czenie PHP i HTML .............................................................................................. 27
Instrukcje i komentarze ........................................................................................... 28
W jaki sposb mona zapamitywa dane? .................................................................... 29
Podstawowe typy danych w PHP .................................................................................... 30
Liczby .................................................................................................................... 30
Cigi znakw .......................................................................................................... 32
Wartoci typu boolean ............................................................................................. 35
Przydatne funkcje ......................................................................................................... 36
nl2br ..................................................................................................................... 36
var_dump ............................................................................................................... 36
print_r .................................................................................................................... 37
var_export .............................................................................................................. 37
Podsumowanie ............................................................................................................ 38

Rozdzia 2. Jzyk PHP ............................................................................................................................... 39


Wicej informacji o wprowadzaniu cigw znakw ........................................................... 39
Wicej informacji o typach danych ................................................................................. 41
Tablice ................................................................................................................... 41
Obiekty .................................................................................................................. 42
Specjalne typy i wartoci ......................................................................................... 43

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

PHP i MySQL. Tworzenie aplikacji WWW


Konwersja typw .......................................................................................................... 44
Podstawy ............................................................................................................... 44
Specyficzne rodzaje konwersji typw ......................................................................... 45
Przydatne funkcje do konwersji typw ....................................................................... 49
Zmienne i stae ............................................................................................................ 51
Definiowanie staych ............................................................................................... 51
Odwoania do zmiennych przez warto lub przez referencj ....................................... 51
Zasig zmiennych ................................................................................................... 53
Czas istnienia zmiennych ........................................................................................ 53
Zmienne predefiniowane ......................................................................................... 54
Wyraenia i operatory ................................................................................................... 55
Operatory: czenie wyrae ..................................................................................... 55
czenie wyrae i priorytety operatorw .................................................................. 62
Struktury sterujce ....................................................................................................... 63
Instrukcje if ............................................................................................................ 63
Instrukcja switch ..................................................................................................... 64
Ptle while (do...while) ............................................................................................ 66
Ptle for ................................................................................................................. 67
Ptle foreach .......................................................................................................... 67
Przerwanie dziaania ptli ........................................................................................ 67
Podsumowanie ............................................................................................................ 69

Rozdzia 3. Organizacja kodu i jego wielokrotne wykorzystywanie .....................................................71


Podstawowy mechanizm wielokrotnego wykorzystywania kodu: funkcje ............................. 71
Definiowanie i wywoywanie funkcji ........................................................................... 72
Przekazywanie parametrw do funkcji ....................................................................... 74
Zwracanie wartoci przez funkcje ............................................................................. 78
Zasig zmiennych wewntrz funkcji .......................................................................... 79
Zasig i dostpno funkcji ..................................................................................... 83
Funkcje jako zmienne .............................................................................................. 84
Sposb wielokrotnego wykorzystywania kodu dla rednio zaawansowanych:
zastosowanie plikw wczanych ................................................................................ 85
Organizacja kodu w plikach ...................................................................................... 86
Wybr nazw plikw i folderw ................................................................................... 88
Wczanie plikw bibliotecznych w skryptach ............................................................. 90
Zastosowanie mechanizmu wczania do adowania szablonw stron .......................... 95
Podsumowanie ............................................................................................................ 96

Rozdzia 4. Programowanie obiektowe .................................................................................................. 97


Nie tylko biblioteki ....................................................................................................... 97
Programowanie obiektowe .......................................................................................... 100
Podstawowa terminologia ...................................................................................... 100
Podstawowe informacje o programowaniu obiektowym w PHP ................................... 101
Inicjalizowanie i usuwanie obiektw ........................................................................ 105
Dostpno klasy: kto moe oglda informacje ..................................................... 107
Definiowanie statycznych danych wewntrz klas ...................................................... 109
Rozszerzanie obiektw ............................................................................................... 113
Rozszerzanie zdefiniowanych klas .......................................................................... 114
Wicej o widocznoci ............................................................................................ 114
Ponowna implementacja metod klasy bazowej ........................................................ 115
Definiowanie klas w taki sposb, aby dziaay tak samo: polimorfizm ........................ 116

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

Inne wasnoci ........................................................................................................... 123


Porwnywanie obiektw ......................................................................................... 124
Klonowanie obiektw ............................................................................................ 124
Wywietlanie wartoci obiektw w sposb przyjazny dla uytkownika ......................... 125
Przekazywanie wskazwek dotyczcych typw ......................................................... 126
Automatyczne adowanie ....................................................................................... 127
Podsumowanie .......................................................................................................... 127

Rozdzia 5. Tablice ....................................................................................................................................129


Wicej informacji o tablicach ....................................................................................... 129
Tworzenie tablic i umieszczanie w nich danych ........................................................ 130
Dostp do elementw tablic .................................................................................. 132
Usuwanie elementw i caych tablic ....................................................................... 134
Zliczanie elementw tablicy ................................................................................... 135
Przetwarzanie elementw tablic w ptli ........................................................................ 135
Ptle foreach ........................................................................................................ 135
Ptle standardowe ................................................................................................ 136
Wewntrzne liczniki ptli oraz metody each, next, prev, pos i reset ........................... 137
Metoda array_walk ................................................................................................ 139
Tablice wielowymiarowe .............................................................................................. 140
Operacje na tablicach ................................................................................................. 141
Sortowanie tablic .................................................................................................. 142
Inne operacje na tablicach ..................................................................................... 145
Podsumowanie .......................................................................................................... 147

Rozdzia 6. Cigi znakw i znaki alfabetw narodowych .....................................................................149


Cigi znakw w PHP ................................................................................................... 149
W jaki sposb PHP interpretuje cigi znakw? ......................................................... 150
Zestawy znakw i kodowanie Unicode .......................................................................... 150
Kod ASCII ............................................................................................................ 150
Zestawy znakw ISO 8859 .................................................................................... 151
Zestawy znakw jzykw dalekowschodnich ............................................................ 151
Unicode ............................................................................................................... 152
Zestawy znakw Unicode ....................................................................................... 153
Zestawy znakw w PHP ............................................................................................... 153
Obsuga innych zestaww znakw .......................................................................... 153
Kopoty, kopoty ................................................................................................ 155
W jaki sposb postpowa ze znakami? ................................................................. 156
Konfiguracja PHP w celu wykorzystania kodowania Unicode ........................................... 157
Instalacja i konfiguracja rozszerze mbstring i mbrex ............................................... 157
Przecianie funkcji ............................................................................................... 157
Operacje na cigach znakw ....................................................................................... 158
Pobieranie informacji o cigach znakw .................................................................. 159
Porzdkowanie cigw znakw ............................................................................... 160
Wyszukiwanie i porwnywanie ................................................................................ 162
Wydzielanie podcigw .......................................................................................... 165
Zmiana wielkoci liter ........................................................................................... 166
Konwersje kodowania ........................................................................................... 167
Podsumowanie .......................................................................................................... 167

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

PHP i MySQL. Tworzenie aplikacji WWW


Rozdzia 7. Interakcje z serwerem: formularze ..................................................................................169
Przykady formularzy ................................................................................................... 169
Przetwarzanie formularzy HTML ................................................................................... 172
Wprowadzanie formularzy na stronie ....................................................................... 172
W jaki sposb s przesyane dane? ....................................................................... 174
Dostp do danych formularzy z poziomu skryptu ...................................................... 176
Formularze a zestawy znakw ................................................................................ 178
Praca z serwerem ...................................................................................................... 179
rodowisko serwera .............................................................................................. 180
Zmienne serwera .................................................................................................. 180
Zmienne rodowiskowe ......................................................................................... 185
Przekierowania .......................................................................................................... 186
Podsumowanie .......................................................................................................... 188

Cz II Podstawowe wiadomoci o bazach danych

189

Rozdzia 8. Wprowadzenie do baz danych ..............................................................................................191


Terminologia .............................................................................................................. 191
Podstawy ............................................................................................................. 191
Relacyjne bazy danych .......................................................................................... 193
Powody, dla ktrych warto korzysta z systemw zarzdzania bazami danych .................. 194
Czynniki przemawiajce przeciwko plikom tekstowym bd arkuszom kalkulacyjnym ... 194
Serwery baz danych .............................................................................................. 195
Popularne serwery baz danych .................................................................................... 196
MySQL ................................................................................................................. 196
PostgreSQL .......................................................................................................... 197
Oracle .................................................................................................................. 197
Microsoft SQL Server ............................................................................................ 197
Inne ..................................................................................................................... 198
W jaki sposb dokona wyboru serwera bazy danych? ................................................. 198
Analiza danych ..................................................................................................... 198
Moliwoci ........................................................................................................... 199
Wydajno ........................................................................................................... 199
Dostpno z poziomu PHP ................................................................................... 199
Koszty ................................................................................................................. 199
Nasz wybr ................................................................................................................ 200
Wsplne interfejsy ..................................................................................................... 200
Podsumowanie .......................................................................................................... 201

Rozdzia 9. Projektowanie i tworzenie baz danych .............................................................................203


Co naley umieci w bazie danych? ............................................................................ 203
Organizacja danych .................................................................................................... 205
Klucze gwne ...................................................................................................... 205
Wybr typw danych .............................................................................................. 206
Organizacja danych w tabele .................................................................................. 210
Indeksy uatwiajce wyszukiwanie .......................................................................... 213
Wprowadzenie do jzyka SQL ...................................................................................... 213
Tworzenie baz danych ................................................................................................. 215
Komunikacja z serwerem bazy danych .................................................................... 215
Nawizywanie poczenia i uwierzytelnianie ............................................................. 215
Tworzenie bazy danych .......................................................................................... 216

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

Nadawanie uprawnie uytkownikom ........................................................................... 217


Przygotowania do tworzenia uytkownikw .............................................................. 218
Tworzenie uytkownikw ........................................................................................ 219
Usuwanie uytkownikw lub uprawnie ................................................................... 220
Tworzenie tabel .......................................................................................................... 221
Typy danych w jzyku SQL ..................................................................................... 221
Cykl istnienia klienta bazy danych .......................................................................... 225
Tworzenie tabeli ................................................................................................... 225
Mechanizmy zapisu tabel ...................................................................................... 227
Tworzenie indeksw .............................................................................................. 228
Klucze obce i kaskadowe usuwanie rekordw ......................................................... 228
Usuwanie tabel i baz danych ....................................................................................... 230
Podsumowanie .......................................................................................................... 231

Rozdzia 10. Wykorzystanie baz danych: przechowywanie i pobieranie informacji ........................233


Zanim zaczniemy ....................................................................................................... 233
Wprowadzanie danych do tabel ................................................................................... 234
Instrukcja INSERT INTO ......................................................................................... 234
Wprowadzanie danych w trybie masowym ............................................................... 235
Wprowadzanie danych innych typw ni tekstowe .................................................... 237
Pobieranie danych z tabel ........................................................................................... 238
Podstawowa skadnia ............................................................................................ 239
czenie danych z tabel przy pobieraniu ................................................................. 241
Sortowanie pobieranych danych ............................................................................. 244
Pobieranie po kilka wierszy naraz ........................................................................... 245
Modyfikowanie danych w tabelach ............................................................................... 246
Usuwanie danych z tabel ............................................................................................ 247
Podsumowanie .......................................................................................................... 248

Rozdzia 11. Wykorzystanie baz danych: zaawansowany dostp do danych .....................................249


Transakcje ................................................................................................................ 249
Problem ............................................................................................................... 250
Rozwizanie ......................................................................................................... 251
Pisanie transakcji ................................................................................................. 252
Bardziej zoony problem ....................................................................................... 253
Bardziej zaawansowane zapytania ............................................................................... 255
czenie wyrae .................................................................................................. 255
Okrelanie zbiorw i zakresw wartoci .................................................................. 256
Pobieranie niepowtarzalnych wartoci ..................................................................... 257
Wykorzystanie funkcji SQL w zapytaniach ................................................................ 257
Grupowanie danych dla funkcji agregacji ................................................................. 262
Modyfikowanie schematu tabel ................................................................................... 263
Podsumowanie .......................................................................................................... 264

Rozdzia 12. PHP a dostp do danych .....................................................................................................265


Przygotowania ............................................................................................................ 265
Nawizywanie poczenia i uwierzytelnianie .................................................................. 267
Kolejno zdarze ................................................................................................. 267
Nawizywanie poczenia ...................................................................................... 268
Ustawianie zestawu znakw obowizujcego dla poczenia ..................................... 270

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

PHP i MySQL. Tworzenie aplikacji WWW


Wykonywanie zapyta ................................................................................................. 270
Pobieranie danych ................................................................................................ 270
Sprawdzanie poprawnoci danych wprowadzanych przez uytkownika ........................ 273
Wprowadzanie, usuwanie i aktualizowanie danych ................................................... 275
Transakcje ........................................................................................................... 276
Obsuga bdw rozszerzenia mysqli ....................................................................... 277
Wielokrotne wykorzystywanie zapyta .......................................................................... 279
Wizanie parametrw ............................................................................................ 280
Wizanie wynikw ................................................................................................. 281
Stara szkoa: interfejsy proceduralne ........................................................................... 282
Podstawowe wiadomoci dotyczce proceduralnych interfejsw obsugi baz danych ....... 283
Trwae poczenia ..................................................................................................... 285
Podsumowanie .............................................................................................................. 286

Cz III Planowanie aplikacji internetowych

287

Rozdzia 13. Aplikacje internetowe i internet ...........................................................................................289


wiatowa pajczyna od kuchni .................................................................................... 289
Internet jest prostszy, ni przypuszczasz .................................................................... 290
Komputery komunikujce si z innymi komputerami .................................................. 290
Protok HTTP ........................................................................................................... 292
Typy MIME ................................................................................................................ 295
Protok SSL ............................................................................................................ 295
Inne wane protokoy ................................................................................................ 299
Projektowanie aplikacji internetowych ............................................................................. 299
Terminologia ............................................................................................................ 300
Prosty ukad ............................................................................................................. 300
Interfejs uytkownika ................................................................................................ 302
Implementacja regu biznesu ..................................................................................... 303
Warstwa tylna serwer ........................................................................................... 306
Architektury n-warstwowe .......................................................................................... 307
Wydajno i skalowalno ......................................................................................... 307
Podsumowanie .............................................................................................................. 309

Rozdzia 14. Implementacja interfejsu uytkownika .................................................................................311


Elementy interfejsu uytkownika ..................................................................................... 311
Czym jest interfejs uytkownika? ............................................................................... 312
Planowanie interfejsu uytkownika ............................................................................ 313
Udzielanie uytkownikom pomocy w rozwizywaniu problemw ................................... 316
Wskazwki i strategie projektowania ......................................................................... 317
Implementacja interfejsu uytkownika ............................................................................. 319
Kaskadowe arkusze stylw (CSS) .............................................................................. 319
Wczanie plikw ...................................................................................................... 322
Biblioteki kodu do generowania interfejsu uytkownika ............................................... 323
Implementacja sterowania interfejsem uytkownika ................................................... 327
Podsumowanie .............................................................................................................. 329

Rozdzia 15. Zarzdzanie uytkownikami ..................................................................................................331


W jaki sposb uytkownicy cz si z aplikacjami internetowymi? ................................... 331
Gocie a zarejestrowani uytkownicy ............................................................................... 334
Uwierzytelnianie uytkownikw ........................................................................................ 335

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

Logowanie czciowe i pene .................................................................................... 335


Gdzie mona zapisa informacje uytkownikw? ........................................................ 336
Co mona zapisa, a czego zapisywa nie naley ....................................................... 337
Podsumowanie .............................................................................................................. 339

Rozdzia 16. Zabezpieczenia aplikacji internetowych: planowanie i bezpieczestwo kodu ...............341


Strategie zabezpiecze ................................................................................................... 341
Co jest najwaniejsze? .............................................................................................. 342
Rwnowaga pomidzy bezpieczestwem a wygod uytkowania ................................. 343
Po zakoczeniu fazy tworzenia aplikacji ..................................................................... 344
Podstawowe podejcie .............................................................................................. 344
Identyfikacja zagroe .................................................................................................... 344
Zagroenia ............................................................................................................... 344
Czarne charaktery ..................................................................................................... 347
Zabezpieczenia kodu ...................................................................................................... 349
Zota zasada ............................................................................................................ 349
Filtrowanie danych wejciowych ................................................................................. 349
Organizacja kodu ...................................................................................................... 355
Co mona umieci w kodzie? ................................................................................... 356
Zagadnienia dotyczce systemu plikw ..................................................................... 357
Stabilno kodu i bdy ............................................................................................. 357
Operator wykonywania polece powoki i instrukcja exec ............................................ 358
Podsumowanie .............................................................................................................. 359

Rozdzia 17. Zabezpieczenia aplikacji internetowych: bezpieczestwo sprztu


i oprogramowania ........................................................................................................ 361
Zabezpieczenia serwerw WWW i PHP ......................................................................... 361
Uywaj aktualnego oprogramowania ....................................................................... 362
php.ini ................................................................................................................. 363
Konfiguracja serwera WWW ................................................................................... 364
Serwery wirtualne ................................................................................................. 365
Aplikacje internetowe umieszczone na serwerach komercyjnych ............................... 367
Protok SSL ............................................................................................................. 368
Zastosowanie SSL w PHP ...................................................................................... 368
Bezpieczestwo bazy danych ...................................................................................... 370
Uytkownicy i system uprawnie ............................................................................ 370
Wysyanie danych do serwera ................................................................................ 371
Nawizywanie poczenia z serwerem ..................................................................... 371
Uruchamianie serwera .......................................................................................... 372
Zabezpieczenia sieci .................................................................................................. 372
Zapory firewall ...................................................................................................... 373
Strefy DMZ ........................................................................................................... 373
Wicej o sieciowych atakach DoS i DDoS ............................................................... 374
Zabezpieczenia komputera i systemu operacyjnego ...................................................... 374
Pamitaj o aktualizacjach systemu operacyjnego ..................................................... 374
Uruchamiaj tylko te programy, ktre s potrzebne ................................................... 375
Pamitaj o fizycznych zabezpieczeniach serwera ...................................................... 375
Plany awaryjne ........................................................................................................... 376
Podsumowanie .......................................................................................................... 377

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

10

PHP i MySQL. Tworzenie aplikacji WWW

Cz IV Implementacja aplikacji internetowych

379

Rozdzia 18. Obsuga bdw i debugowanie ..........................................................................................381


W jaki sposb powstaj bdy? ................................................................................... 381
Bdy PHP ............................................................................................................ 381
Bdy w kodzie ..................................................................................................... 383
Bdy zewntrzne .................................................................................................. 384
W jaki sposb PHP zarzdza bdami? ......................................................................... 385
W jaki sposb PHP wywietla komunikaty o bdach? .............................................. 385
Jakie bdy generuje mechanizm obsugi PHP? ........................................................ 386
Obsuga bdw .................................................................................................... 387
Konfiguracja systemu obsugi bdw w PHP ........................................................... 392
Wyjtki ...................................................................................................................... 392
Podstawowe wiadomoci o wyjtkach ..................................................................... 393
Wykorzystanie wyjtkw ......................................................................................... 395
Nieobsuone wyjtki ............................................................................................. 398
Rozszerzanie wyjtkw .......................................................................................... 399
Debugowanie ............................................................................................................. 401
Wprowadzenie instrukcji diagnostycznych ................................................................ 401
Debugery kodu rdowego .................................................................................... 403
Podsumowanie .......................................................................................................... 404

Rozdzia 19. Pliki cookie i sesje ..............................................................................................................405


Pliki cookie: niewielkie i przydatne ............................................................................... 405
Podstawowe operacje ........................................................................................... 405
Jak dziaaj pliki cookie? ....................................................................................... 409
Zarzdzanie poprawnoci plikw cookie ................................................................ 410
Usuwanie plikw cookie ........................................................................................ 411
Tablice plikw cookie ............................................................................................ 411
Co mona umieszcza w plikach cookie? ................................................................ 412
Sposoby na odchudzajcych si .......................................................................... 412
Sesje ........................................................................................................................ 413
Podstawowe zastosowanie .................................................................................... 414
Konfiguracja PHP w celu obsugi sesji ..................................................................... 416
W jaki sposb jest przesyany identyfikator sesji? .................................................... 417
Zapisywanie danych w sesji ................................................................................... 418
Buforowanie stron ................................................................................................ 421
Niszczenie sesji .................................................................................................... 423
W jaki sposb dziaa pami sesji .......................................................................... 424
Bezpieczestwo sesji ................................................................................................. 428
Uzyskanie identyfikatora sesji ................................................................................ 428
Ograniczanie moliwych zniszcze spowodowanych przejciem identyfikatora sesji ........ 429
Podsumowanie .......................................................................................................... 431

Rozdzia 20. Uwierzytelnianie ................................................................................................................433


Planowanie logowania ................................................................................................ 433
Uwierzytelnianie realizowane przez serwer WWW .......................................................... 436
Proste uwierzytelnianie HTTP ................................................................................. 436
Schematy uwierzytelniania stosowane w systemie Windows ..................................... 441
Implementacja wasnego mechanizmu uwierzytelniania ................................................. 442
Konfiguracja bazy danych pod ktem obsugi logowania ........................................... 443
Dodawanie nowych uytkownikw ........................................................................... 444

10

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

11

Logowanie uytkownikw ....................................................................................... 453


Aktualizacja stron, ktre wymagaj zalogowania si ................................................. 460
Wylogowywanie uytkownikw ................................................................................ 463
Usuwanie uytkownikw ........................................................................................ 465
Podsumowanie .......................................................................................................... 466

Rozdzia 21. Zaawansowane techniki wysyania treci do przegldarki


oraz buforowanie wysyanej treci .................................................................................467
Globalizacja i parametry regionalne ............................................................................. 467
Parametry regionalne i ich waciwoci ................................................................... 468
Ustalanie lokalizacji uytkownika ............................................................................ 468
Ustawianie parametrw regionalnych dla biecej strony (Unix) ................................ 470
Ustawianie parametrw regionalnych dla biecej strony (Windows) .......................... 472
Poznawanie biecych parametrw lokalnych .......................................................... 474
Wysyanie sformatowanej treci .................................................................................. 474
Formatowanie liczb ............................................................................................... 475
Waluty ................................................................................................................. 475
Inne funkcje formatujce ....................................................................................... 478
Buforowanie treci ..................................................................................................... 481
Jak to dziaa ......................................................................................................... 482
Korzystanie z buforowania treci ............................................................................ 482
Pisanie wasnego programu obsugi ....................................................................... 484
Podsumowanie .......................................................................................................... 485

Rozdzia 22. Kontrola poprawnoci danych za pomoc wyrae regularnych ................................487


Uywanie wyrae regularnych ..................................................................................... 487
Czym s wyraenia regularne? ............................................................................... 488
Instalacja ............................................................................................................. 489
Testowanie wyrae .............................................................................................. 489
Proste wyszukiwanie ............................................................................................. 490
Klasy znakw ....................................................................................................... 491
Granice ................................................................................................................ 493
Kropka ................................................................................................................. 494
Repetycja wzorcw ................................................................................................ 494
Grupowanie i warianty ........................................................................................... 495
Sztuczki i puapki .................................................................................................. 495
Kontrola poprawnoci danych za pomoc wyrae regularnych ....................................... 496
Kontrola poprawnoci nazwy uytkownika ............................................................... 496
Wzorce pasujce do numerw telefonw ................................................................. 497
Wzorce pasujce do kodw pocztowych .................................................................. 498
Wzorce pasujce do adresw e-mail ....................................................................... 499
Inne funkcje operujce na wyraeniach regularnych .......................................................... 500
Funkcja ereg_replace ............................................................................................ 500
Funkcja split ......................................................................................................... 502
Podsumowanie .......................................................................................................... 503

Rozdzia 23. XML i XHTML .......................................................................................................................505


XML .......................................................................................................................... 505
Czym jest XML? .................................................................................................... 506
Kiedy korzysta z XML? ......................................................................................... 507
Podstawowa terminologia ...................................................................................... 508

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

11

12

PHP i MySQL. Tworzenie aplikacji WWW


Struktura dokumentu XML ..................................................................................... 509
Przestrzenie nazw ................................................................................................. 513
Kontrola poprawnoci XML .................................................................................... 515
Technologie pochodne .......................................................................................... 517
Praca z XML w PHP .................................................................................................... 518
Wybr pomidzy SAX i DOM ................................................................................... 519
Korzystanie z modelu DOM .................................................................................... 519
XHTML ...................................................................................................................... 530
Po co uywa XHTML? ........................................................................................... 530
Jak uywa XHTML? .............................................................................................. 531
Konwersja na XHTML ............................................................................................ 533
Podsumowanie .......................................................................................................... 533

Rozdzia 24. Pliki i katalogi .....................................................................................................................535


Dostp do plikw ....................................................................................................... 535
Otwieranie plikw ................................................................................................. 535
Zamykanie plikw ................................................................................................. 538
Odczyt plikw ....................................................................................................... 538
Zapis do plikw .................................................................................................... 540
Prawa dostpu do plikw i inne informacje .............................................................. 542
Usuwanie i zmiana nazw plikw ............................................................................. 544
Dostp do katalogw .................................................................................................. 544
Operowanie ciekami dostpu .............................................................................. 545
Przegldanie zawartoci katalogw przy uyciu klas ................................................. 546
Przegldanie zawartoci katalogw za pomoc funkcji ............................................. 546
Zmiana biecego katalogu ................................................................................... 547
Tworzenie i usuwanie katalogw ............................................................................ 547
Wzgldy bezpieczestwa ............................................................................................. 547
Kwestie zwizane z dostpem do plikw ................................................................. 548
Podsumowanie .......................................................................................................... 550

Rozdzia 25. Wysyanie plikw do serwera ..........................................................................................551


Wysyanie do serwera plikw uytkownika .................................................................... 551
Na czym polega wysyanie plikw do serwera .......................................................... 551
Konfigurowanie PHP pod ktem wysyania plikw do serwera ................................... 552
Formularz klienta .................................................................................................. 553
Kod po stronie serwera ......................................................................................... 555
Ograniczanie rozmiaru wysyanego pliku .................................................................. 557
Wysyanie wikszej liczby plikw ............................................................................. 558
Wysyanie plikw do serwera przykad ...................................................................... 560
Przygotowania ...................................................................................................... 560
Formularz nowego konta ........................................................................................ 561
Tworzenie nowego konta ....................................................................................... 561
Podgld danych uytkownika .................................................................................. 564
Pobieranie emblematu z bazy danych ..................................................................... 566
Wzgldy bezpieczestwa ............................................................................................. 567
Tylko zaufani uytkownicy ...................................................................................... 567
Ataki Denial of Service .......................................................................................... 568
Kontrola poprawnoci plikw ................................................................................. 568
Zoliwe nazwy plikw ........................................................................................ 568
Podsumowanie .......................................................................................................... 569

12

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

13

Rozdzia 26. Operowanie datami i czasem .............................................................................................571


rda dat i czasu ...................................................................................................... 571
PHP ..................................................................................................................... 571
System operacyjny ................................................................................................ 572
Serwer bazy danych .............................................................................................. 572
Strony WWW i uytkownicy ..................................................................................... 573
Daty i czas w PHP ...................................................................................................... 574
Datowniki w PHP ................................................................................................... 574
Pobieranie daty i czasu ......................................................................................... 575
Kontrola poprawnoci daty i czasu ......................................................................... 579
Porwnywanie dat i czasu ...................................................................................... 580
Wywietlanie sformatowanych dat i czasu ............................................................... 583
Problem z datownikami ......................................................................................... 587
Data i czas w serwerach baz danych ............................................................................ 587
Zakresy dat i czasu w popularnych serwerach baz danych ........................................ 587
Dodawanie i odejmowanie interwaw czasowych .................................................... 588
Interpretacja dat w bazach danych ......................................................................... 588
MySQL i datowniki ................................................................................................ 589
Podsumowanie .......................................................................................................... 589

Rozdzia 27. Usugi XML Web Services i SOAP ......................................................................................591


Usugi XML Web Services ........................................................................................... 591
Tworzenie platformy .............................................................................................. 592
Wchodzimy do wiata usug XML Web Services ....................................................... 592
Szukanie usug Web Services ................................................................................ 593
Jak dziaaj usugi Web Services ................................................................................. 594
SOAP ................................................................................................................... 594
WSDL .................................................................................................................. 595
HTTP ................................................................................................................... 601
XML-RPC .............................................................................................................. 602
Wykorzystywanie usug Web Services w PHP ................................................................ 602
Wybieranie usugi ................................................................................................. 602
Konfiguracja PHP .................................................................................................. 604
Korzystanie z usugi .............................................................................................. 605
Przykad korzystanie z API wyszukiwarki Google ........................................................ 609
Przygotowanie do korzystania z interfejsw API wyszukiwarki Google ......................... 609
Dalsze poznawanie usugi ..................................................................................... 610
Jak dziaa wyszukiwanie ........................................................................................ 611
Wyszukiwanie sw kluczowych .............................................................................. 612
Podsumowanie .......................................................................................................... 616

Rozdzia 28. Korzystanie z PEAR .............................................................................................................617


Wprowadzenie do PEAR .............................................................................................. 617
Biblioteka kodu .................................................................................................... 618
Klasy podstawowe PEAR ....................................................................................... 618
Spoeczno dajca wsparcie ................................................................................ 618
PECL ................................................................................................................... 619
Instalacja i konfiguracja .............................................................................................. 619
Unix ..................................................................................................................... 619
Windows .............................................................................................................. 620

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

13

14

PHP i MySQL. Tworzenie aplikacji WWW


Podstawowe polecenia ............................................................................................... 621
Udostpnianie pomocy .......................................................................................... 622
Wywietlanie listy pakietw ................................................................................... 622
Pobieranie i instalowanie pakietw ......................................................................... 623
Pobieranie informacji ............................................................................................ 624
Aktualizacja istniejcych pakietw .......................................................................... 625
Odinstalowywanie pakietw ................................................................................... 625
Opcje konfiguracyjne PEAR .................................................................................... 626
Przykad zastosowanie klasy Date ........................................................................... 626
Instalacja ............................................................................................................. 627
Podstawowy sposb uycia .................................................................................... 627
Dalsze przykady ................................................................................................... 628
Podsumowanie .......................................................................................................... 629

Rozdzia 29. Tworzenie i wdraanie aplikacji .......................................................................................631


Standardy pisania kodu .............................................................................................. 631
Troska o styl ........................................................................................................ 631
Opracowywanie dokumentu ze standardami pisania kodu ........................................ 633
wite wojny ........................................................................................................ 635
Inne kwestie do rozwaenia ................................................................................... 636
Kontrola kodu rdowego ........................................................................................... 637
Co nami kieruje? .................................................................................................. 637
Jak to dziaa ......................................................................................................... 638
Wybieranie systemu kontroli kodu rdowego ......................................................... 641
Praca z systemem kontroli kodu rdowego ........................................................... 642
Testowanie ................................................................................................................ 644
Po co testowa? ................................................................................................... 644
Testowanie moduw ............................................................................................ 645
Testowanie wydajnoci i pracy przy obcieniu ........................................................ 647
Kontrola bdw ................................................................................................... 650
Wdraanie ................................................................................................................. 651
Serwery testowe ................................................................................................... 651
Pisanie skryptw i automatyzacja procesu .............................................................. 652
Wdraanie na serwery docelowe ............................................................................. 652
Podsumowanie .......................................................................................................... 653

Cz V Przykadowe projekty i dalsze pomysy

655

Rozdzia 30. Strategie tworzenia udanych aplikacji internetowych ..................................................657


Obiekty typu singleton ................................................................................................ 657
Zarzdzanie sesjami ................................................................................................... 660
Konfiguracja ......................................................................................................... 660
Bezpieczestwo .................................................................................................... 661
Poczenie elementw w cao ............................................................................. 662
Holistyczny sposb obsugi bdw .............................................................................. 664
Bdy uytkownika a bdy aplikacji ........................................................................ 664
Zastpowanie domylnych programw obsugi ........................................................ 667
Wywietlanie komunikatw o bdach ..................................................................... 669
Tworzenie nowych klas wyjtkw ............................................................................ 671

14

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

Spis treci

15

Zarzdzanie poczeniami z baz danych ...................................................................... 672


Lepsze rozwizanie ............................................................................................... 674
Najlepsze rozwizanie ........................................................................................... 675
Nowa, poprawiona funkcja unieszkodliwiajca znaki specjalne .................................. 676
Ustawienia konfiguracyjne PHP .................................................................................... 677
Ustawienia oglne ................................................................................................ 677
Ustawienia zwizane ze znakami kodowanymi wielobajtowo ..................................... 678
Ustawienia zwizane z bdami .............................................................................. 679
Ustawienia dotyczce bazy danych ......................................................................... 679
Podsumowanie .......................................................................................................... 679

Rozdzia 31. System zarzdzania terminami .........................................................................................681


Przegld .................................................................................................................... 681
Instalacja i uruchamianie przykadu ............................................................................. 683
Struktura aplikacji i nawigowanie po stronach .............................................................. 683
Struktura strony .................................................................................................... 684
Ukad bazy danych ................................................................................................ 686
Strategia interfejsu uytkownika ............................................................................. 688
Pena lista plikw ................................................................................................. 689
Analiza kodu .............................................................................................................. 691
Klasa AppointmentManager ................................................................................... 691
Obsuga dat i czasu .............................................................................................. 695
Przetwarzanie formularzy i nawigowanie midzy stronami ......................................... 698
Prezentowanie tygodnia i miesica ......................................................................... 703
wiczenia i sugestie ................................................................................................... 707
Zmiana widoku tygodniowego i dziennego ............................................................... 707
Tygodnie od poniedziaku do niedzieli ..................................................................... 707
Usuwanie lub przenoszenie terminw ..................................................................... 708
Konwersja do klasy Date z PEAR ............................................................................ 708
Dopuszczenie nakadajcych si terminw .............................................................. 708
Udostpnienie systemu wielu uytkownikom ........................................................... 708
Podsumowanie .......................................................................................................... 709

Rozdzia 32. Blog .......................................................................................................................................711


Przegld .................................................................................................................... 711
Instalacja i uruchamianie przykadu ............................................................................. 713
Struktura aplikacji i nawigowanie midzy stronami ........................................................ 713
Ukad stron .......................................................................................................... 714
Struktura bazy danych i uwagi dotyczce bazy ......................................................... 716
Strategia budowy interfejsu uytkownika ................................................................. 718
Pena lista plikw ................................................................................................. 718
Analiza kodu .............................................................................................................. 720
Generowanie interfejsu uytkownika ....................................................................... 720
Zarzdzanie uytkownikami .................................................................................... 724
ledzenie zalogowanych uytkownikw ................................................................... 729
Zarzdzanie wpisami i komentarzami ..................................................................... 734
Sugestie i wiczenia ................................................................................................... 740
Ulepszenie listy uytkownikw na stronie gwnej .................................................... 740
Dopuszczenie anonimowych komentarzy ................................................................. 741
Komentarze hierarchiczne ..................................................................................... 741
Zastosowanie mechanizmu transakcji przy tworzeniu kont uytkownikw ...................... 741
Implementacja nowej funkcji strip_tags .................................................................. 742
Podsumowanie .......................................................................................................... 742

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

15

16

PHP i MySQL. Tworzenie aplikacji WWW


Rozdzia 33. Sklep internetowy .............................................................................................................743
Przegld .................................................................................................................... 743
Instalacja i uruchamianie przykadu ............................................................................. 744
Struktura aplikacji i nawigowanie midzy stronami ........................................................ 746
Podstawowa struktura aplikacji .............................................................................. 746
Struktura witryny ................................................................................................... 748
Struktura bazy danych ........................................................................................... 750
Strategia budowy interfejsu uytkownika ................................................................. 753
Pena lista plikw ................................................................................................. 754
Analiza kodu .............................................................................................................. 757
Przegldanie produktw ........................................................................................ 757
Implementacja koszyka z zakupami ........................................................................ 759
Przetwarzanie w ramach sekwencji kasowej ............................................................ 762
Przesyanie zamwie ........................................................................................... 770
Bezpieczestwo .................................................................................................... 776
Przetwarzanie patnoci .............................................................................................. 776
Sugestie i wiczenia ................................................................................................... 777
Pominicie informacji o dostawie ........................................................................... 777
Przetwarzanie po zoeniu zamwienia .................................................................... 777
Strony administracyjne .......................................................................................... 777
Status zamwienia i anulowanie zamwienia .......................................................... 777
Podsumowanie .......................................................................................................... 778

Dodatki

779

Dodatek A Instalacja i konfiguracja ........................................................................................................781


Dodatek B Odpowiedniki funkcji obsugi baz danych ............................................................................805
Dodatek C Zalecane materiay rdowe ...............................................................................................813
Skorowidz ................................................................................................................................................815

16

D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc

W rozdziale 10. Wykorzystanie baz danych: przechowywanie i pobieranie informacji


omwiem jzyk SQL w zakresie wykonywania podstawowych operacji na tabelach: wprowadzania danych, pobierania rekordw, ich aktualizowania i usuwania. W tym rozdziale
wykorzystamy poznane podstawy i przejdziemy do bardziej zaawansowanych zagadnie
i konstrukcji jzyka SQL.
W tym rozdziale:
n

nauczymy si, gdzie, kiedy i jak korzysta z transakcji;

dowiemy si, w jaki sposb wykonuje si zaawansowane zadania jzyka SQL,


takie jak korzystanie z wyrae i funkcji;

poznamy sposoby modyfikowania schematw tabeli w celu dodawania nowych


kolumn lub zmiany nazw tabel.

Podczas wykonywania operacji na danych zawsze trzeba dba o zachowanie spjnoci i integralnoci danych. O ile system zarzdzania baz danych zapewnia bezpieczne wprowadzanie
danych do tabel i pobieranie z nich informacji, nie moe zagwarantowa, e dane zapisane
w bazie zawsze bd miay sens. Przykadowo, jeli zaznaczylimy w tabeli zawierajcej
informacje o ksikach, e sprzedalimy trzy ksiki klientowi, ale przed zapisaniem zamwienia w odpowiedniej tabeli nastpia awaria zasilania, baza danych bdzie zawieraa niespjne informacje. Moe rwnie wystpi problem rywalizacji, kiedy dwch uytkownikw
jednoczenie sprbuje kupi ostatni egzemplarz ksiki. W najgorszym przypadku moe si
zdarzy, e zamwienie zo obaj uytkownicy.

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 249

250

Cz II n Podstawowe wiadomoci o bazach danych


Wspomniane problemy mona rozwiza za pomoc odpowiedniego kodu, opracowujc
mechanizmy blokowania tabel w celu uniemoliwienia korzystania z nich innym uytkownikom. Mona rwnie utworzy mechanizmy wykrywajce niespjnoci i niedokoczone
operacje. Jest to jednak sposb kosztowny, skomplikowany i podatny na bdy. Lepsze efekty
mona osign powierzajc te dziaania serwerowi bazy danych za pomoc transakcji.

Problem
Przeanalizujmy dokadniej przykad ksigarni online. Wyobramy sobie, e utworzono prymitywn tabel zawierajc dane o wszystkich produktach przeznaczonych na sprzeda oraz
tabel opisujc zamwienia. Dla uproszczenia zakadamy, e mona zakupi tylko jeden
typ ksiek. W przykadzie wykorzystamy zdefiniowane poniej tabele i pominiemy wiele
szczegw zamwie, takich jak informacje o wysyce, cenie oraz patnociach.
CREATE TABLE Products
(
pid INTEGER AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
isbn VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL,
number_in_stock INTEGER NOT NULL
)
ENGINE = InnoDB;
CREATE TABLE Orders
(
order_id INTEGER AUTO_INCREMENT PRIMARY KEY,
order_date DATETIME NOT NULL,
user_id INTEGER NOT NULL,
product INTEGER NOT NULL,
num_units INTEGER NOT NULL,
FOREIGN KEY(user_id) REFERENCES Users(user_id),
FOREIGN KEY(product) REFERENCES Products(pid)
)
ENGINE = InnoDB;

W przypadku sprzeday ksiki klientowi powinnimy wykona dwa zapytania:


UPDATE Products SET number_in_stock = 10 WHERE pid = 343;
INSERT INTO Orders (order_date, user_id, product, num_units)
VALUES (NOW(), 4358, 343, 1);

Problem powstanie w przypadku, gdy pierwsze zapytanie wykona si pomylnie, ale drugie
z jakichkolwiek przyczyn nie zostanie wykonane. Taka sytuacja moe si zdarzy z ktregokolwiek z nastpujcych powodw:
n

utracono poczenie z baz danych;

nastpia awaria serwera bazy danych bd brako miejsca na dysku twardym,


co przyczynio si do niepowodzenia drugiego zapytania;

z powodu awarii zasilania nastpio wyczenie serwera.

250 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

251

Wielu Czytelnikw zapewne wzrusza w tej chwili ramionami, mwic taka sytuacja nie
moe mi si przytrafi. Jeli jednak wemiemy za przykad due aplikacje internetowe,
przetwarzajce tysice, jeli nie miliony transakcji dziennie, przekonamy si, e takie sytuacje zdarzaj si, a klienci oczekuj, e powstae problemy zostan rozwizane w rozsdny
i niekopotliwy sposb. W powyszym przykadzie na szczcie klient nie zosta obciony za
co, czego nie otrzyma, ale byoby lepiej, gdyby aplikacja moga automatycznie wykrywa
awarie i odtwarza brakujce pozycje w polu number_in_stock tabeli Products.

Rozwizanie
Majc na uwadze moliwe problemy, wprowadzimy pojcie transakcji. Jest to mechanizm
pozwalajcy na grupowanie wielu zapyta i instrukcji SQL w jedn niepodzieln operacj
w bazie danych. Albo jest wykonywana i akceptowana (zatwierdzana) caa grupa instrukcji,
albo adna z nich i wtedy skutki operacji s wycofywane. W rzeczywistoci taki mechanizm
jest bardziej skomplikowany ni si wydaje na pierwszy rzut oka. System zarzdzania relacyjn
baz danych obsugujcy transakcje musi spenia tzw. reguy ACID:
n

Niepodzielno (ang. Atomicity) transakcje rzdz si zasad wszystko albo nic.


Caa grupa dziaa w obrbie transakcji musi by traktowana jako niepodzielna
jednostka. W przypadku niepowodzenia adna z operacji nie moe si wykona.

Spjno (ang. Consistency) po wykonaniu transakcji baza danych musi


znajdowa si w spjnym stanie, a wszystkie ograniczenia i reguy integralnoci
danych musz zosta spenione.

Izolacja (ang. Isolation) zmiany dokonywane przez transakcj w trakcie jej


przeprowadzania nie mog by dostpne dla innych transakcji. Wewntrzne
operacje rnych transakcji powinny by od siebie odseparowane.

Trwao (ang. Durability) serwer musi mie moliwo zakoczenia transakcji


w trybie nadzwyczajnym. Moe to oznacza, e po pomylnie zakoczonej transakcji
pozostan zalege operacje lub jeli transakcja zostanie przerwana lub anulowana
tylko cz operacji zostanie wykonana. W kadym przypadku serwer musi
mie moliwo natychmiastowego zakoczenia dziaania i rekonstrukcji spjnego
stanu przy ponownym uruchomieniu (niezalenie od tego, czy mamy do czynienia
z zatwierdzon transakcj, czy z transakcj anulowan).

Wszystkie bazy danych omawiane w tej ksice obsuguj transakcje. W systemie MySQL
trzeba jednak zwrci uwag na wykorzystywany typ tabeli. Jeli tabele zostay utworzone
z wykorzystaniem mechanizmu zapisu MyISAM, transakcje nie bd obsugiwane. W tej
ksice wszdzie tam, gdzie bdziemy wykorzystywa transakcje, zastosujemy mechanizm
zapisu InnoDB.
Niektre serwery obsuguj rne poziomy izolacji transakcji. Wikszo obsuguje cztery poziomy. Na najniszym poziomie (ktry jednoczenie jest najszybszy) transakcje maj
moliwo odczytywania postpu i biecego stanu innych transakcji. Na najwyszym poziomie transakcje s cakowicie od siebie odseparowane (poziom najwolniejszy). Istnienie
tych poziomw mona potraktowa jako przyznanie si do potrzeby kompromisu pomidzy
poziomem izolacji transakcji a wydajnoci aplikacji. Dla naszych potrzeb odpowiedni poziom izolacji zapewnia poziom domylny dla wikszoci serwerw baz danych omawianych

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 251

252

Cz II n Podstawowe wiadomoci o bazach danych


w tej ksice (powtarzalny odczyt ang. repeatable read). Wspomn jeszcze, e w systemie
Oracle domylnie obowizuje nieco niszy poziom izolacji, ale to nie stanowi dla nas problemu.
Czytelnikw zainteresowanych bardziej szczegowym zapoznaniem si z obsug transakcji
polecam signicie do ksiki, ktra w bardziej obszerny sposb opisuje ten temat.

Pisanie transakcji
Sposb oznaczania pocztku transakcji jest rny dla rnych serwerw baz danych, jednak
w przypadku wikszoci z nich transakcje rozpoczyna si prost instrukcj:
BEGIN;

W niektrych systemach baz danych jest dostpna opcja automatycznego zatwierdzania


(ang. autocommit) zarzdzajca sposobem wykonywania zapyta. Jeli ustawi si j na warto
TRUE (lub 1, co jest wartoci domyln), wszystkie wprowadzane zapytania bd automatycznie zatwierdzane w bazie danych. W przypadku ustawienia jej na FALSE (0), zapytania
bd rejestrowane tak, jakby wchodziy w skad transakcji. W tym przypadku zatwierdzanie
wykonuje si za pomoc jawnej instrukcji. Tak wic w systemie MySQL mona rozpocz
transakcj za pomoc instrukcji:
SET AUTOCOMMIT =0;

Po zakoczeniu wykonywania wszystkich zapyta w transakcji, jej wyniki zatwierdza si


w bazie danych za pomoc nastpujcej instrukcji:
COMMIT;

Aby anulowa transakcj i cofn wykonane w niej operacje, naley zastosowa nastpujc
instrukcj:
ROLLBACK;

W przypadku zakoczenia poczenia z serwerem, jego awarii lub przerwania transakcji


w inny sposb przed wykonaniem instrukcji COMMIT, automatycznie wykonuje si instrukcja
ROLLBACK i transakcja jest anulowana.
Wrmy do naszego problemu sprzeday ksiek. Jeli skorzystamy z transakcji, sekwencja
instrukcji SQL przyjmie nastpujc posta:
BEGIN;
UPDATE Products SET number_in_stock = 10 WHERE pid = 343;
INSERT INTO Orders (order_date, user_id, product, num_units)
VALUES(NOW(), 4538, 343, 1);
Jeli doszlimy do tego miejsca bez bdw:
COMMIT;
W innym przypadku, jeli wystpiy bdy:
ROLLBACK;

252 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

253

Bardziej zoony problem


Trudno si do tego przyzna, ale w naszym systemie cigle jeszcze wystpuje pewien kopot. Rozwizalimy problem spjnoci bazy danych w przypadku awarii serwera podczas
wykonywania programu sprzeday, ale moe si zdarzy inna sytuacja kilku uytkownikw bdzie chciao zakupi jedn ksik w tym samym czasie.
Sprbujmy przeanalizowa sytuacj, w ktrej dwch uytkownikw sprbuje zakupi t sam
ksik, podczas gdy w magazynie pozosta tylko jeden egzemplarz.
+-----+-------------+------+-------+-----------------+
| pid | title
| isbn | price | number_in_stock |
+-----+-------------+------+-------+-----------------+
| 343 | 'Szczcie' | 'xx' | 19.99 |
1 |
+-----+-------------+------+-------+-----------------+

Kod obsugi sprzeday jest nastpujcy:


BEGIN
SELECT number_in_stock FROM Products WHERE pid = 343;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
Jeli doszlimy do tego miejsca bez bdw:
COMMIT;
W innym przypadku, jeli wystpiy bdy:
ROLLBACK;

Nasz nowy problem wystpi w przypadku, gdy dwch uytkownikw naszej aplikacji prbuje zakupi t sam ksik w tym samym czasie. Poniej zaprezentuj sekwencj operacji
wykonywanych przez obu uytkownikw w przyblieniu w tym samym czasie.
Uytkownik 1. rozpoczyna proces zakupu. Wykonuj si nastpujce instrukcje:
[Uytkownik 1]
BEGIN
SELECT number_in_stock FROM Products WHERE pid = 343;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")

Program wykonywany przez pierwszego uytkownika stwierdza, e w magazynie jest jeden


egzemplarz ksiki i jest gotowy do obsugi zakupu. Jednak w tym samym czasie robi zakupy
drugi uytkownik i wykonuje nastpujcy kod:
[Uytkownik 2]
BEGIN
SELECT number_in_stock FROM Products WHERE pid = 343;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 253

254

Cz II n Podstawowe wiadomoci o bazach danych


Zatem program wykonywany przez drugiego uytkownika rwnie stwierdza, e w magazynie pozosta jeden egzemplarz i jest gotowy do obsugi zakupu. Domylny poziom izolacji
transakcji dla naszego serwera bazy danych nie jest najbardziej restrykcyjny, zatem rwnolegle
wykonujce si transakcje mog odczyta wartoci tego samego wiersza. Teraz jednak kod
obsugujcy pierwszego uytkownika wykona nastpujce instrukcje:
[Uytkownik 1.]
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
COMMIT;

Uytkownik numer 1 pomylnie zakupi ksik. Kiedy drugi uytkownik sprbuje j zakupi
za pomoc nastpujcego kodu:
[Uytkownik 2.]
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
COMMIT;

wykonanie zapytania UPDATE powiedzie si, ale nie spowoduje aktualizacji wierszy w tabeli!
Wynika to z faktu, i program obsugujcy transakcj serwera bazy danych stwierdzi, e dane
ulegy zmianie i nie pozwoli drugiemu procesowi ich zmodyfikowa. To jednak nie powoduje
zgoszenia bdu. W kodzie musimy teraz wprowadzi dodatkowe instrukcje, ktre wykryj,
czy interesujcy nas wiersz zosta zmodyfikowany i w takiej sytuacji anuluj transakcj lub
ponowi prb aktualizacji, jeli modyfikacja nie nastpia.
Istnieje jednak o wiele bardziej eleganckie rozwizanie, polegajce na zastosowaniu zmodyfikowanej instrukcji SELECT: SELECT... FOR UPDATE. W przypadku pobrania wartoci
wiersza za pomoc tego zapytania jednoczenie wskazujemy, e mamy zamiar zmodyfikowa w nim dane. W tej sytuacji inne transakcje lub uytkownicy prbujcy uzyska dostp
do danych zostan zablokowani do czasu zakoczenia transakcji. Teraz moemy przepisa
nasz kod w nastpujcy sposb:
BEGIN
SELECT number_in_stock FROM Products
WHERE pid = 343 FOR UPDATE;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
Jeli doszlimy do tego miejsca bez bdw:
COMMIT;
W innym przypadku, jeli wystpiy bdy:
ROLLBACK;

254 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

255

Dziki wprowadzeniu klauzuli FOR UPDATE wszystkie inne procesy prbujce uzyska dostp
do tej samej wartoci bd musiay czeka na wywoanie instrukcji COMMIT lub ROLLBACK.
To eliminuje problem rywalizacji o zakup ostatniej ksiki.
Dla transakcji istniej bardziej zaawansowane mechanizmy blokowania, ale w tej ksice nie
bdziemy pisali na tyle skomplikowanych programw, aby mogy by potrzebne. Przykady
transakcji zaprezentuj w czci V Przykadowe projekty i dalsze pomysy.

Do tej pory omwiem podstawowe zapytania SQL, jednak moliwoci jzyka s o wiele
wiksze. W tym podrozdziale opisz niektre bardziej zaawansowane wasnoci jzyka SQL.

czenie wyrae
Sowo kluczowe WHERE umoliwia wprowadzenie warunkw ograniczajcych zakres zwracanych wierszy przez niektre zapytania, w tym SELECT, UPDATE i DELETE. Wczeniej uywalimy prostych wyrae o postaci:
NazwaKolumny operator warto

Wyraenia mona jednak czy ze sob i w ten sposb formuowa bardziej zoone warunki. Do tego celu su sowa kluczowe AND i OR. Ich dziaanie jest podobne do dziaania
operatorw AND i OR w innych jzykach programowania. Wynik operacji AND jest prawdziwy,
jeli s spenione warunki po obu stronach operatora, natomiast wynik operacji OR jest prawdziwy, jeli jest speniony ktrykolwiek warunek po dowolnej stronie operatora. Dziki zastosowaniu operatorw AND i OR mona dowolnie formuowa zapytania. Na przykad, aby znale
wszystkich uytkownikw o imieniu Grayna, ktrzy urodzili si po roku 1980, mona wykorzysta nastpujce zapytanie:
SELECT user_name, user_email FROM Users
WHERE full_name LIKE 'Grayna%'
AND birthdate >= '1980-01-01';

W podobny sposb mona znale uytkownikw o imieniu Bogdan lub Bogusaw:


SELECT user_name, user_email FROM Users
WHERE full_name LIKE 'Bogdan%'
OR full_name LIKE 'Bogusaw%';

W poczeniach wielu wyrae tego typu mona i naley stosowa nawiasy, ktre objaniaj
kolejno sprawdzania warunkw:
SELECT user_name, full_name, birthdate FROM Users
WHERE (full_name LIKE 'Bogdan%' OR full_name LIKE 'Bogusaw%')
AND birthdate >= '1980-01-01';

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 255

256

Cz II n Podstawowe wiadomoci o bazach danych

Okrelanie zbiorw i zakresw wartoci


Do okrelania zakresw wartoci w wyraeniach w jzyku SQL s dostpne dwa przydatne
sowa kluczowe: IN i BETWEEN.
Sowo kluczowe IN umoliwia okrelenie zbioru wartoci skalarnych (nie mona stosowa
symboli wieloznacznych), do ktrego ma nalee warto w kolumnie:
SELECT * FROM Messages
WHERE forum_id IN (1, 3, 7, 4);

Sowo kluczowe BETWEEN umoliwia zdefiniowanie zakresu wartoci. Mona je wykorzysta


zarwno dla liczb, jak i dla dat:
SELECT * FROM Users
WHERE birthdate BETWEEN '1970-01-01' AND '1970-12-31';
SELECT * FROM Messages
WHERE message_id BETWEEN 1000 AND 5000;

W przypadku cigw znakw jest nieco gorzej. Jak wspominaem wczeniej, do okrelenia
zakresu cigw znakw serwer bazy danych wykorzystuje zdefiniowany porzdek sortowania. Dziki zdefiniowaniu porzdku sortowania mona okreli sposb porzdkowania
nie tylko danych w jzyku angielskim, ale take w innych jzykach. Tak wic nastpujce
zapytanie:
SELECT * FROM Users
WHERE user_name BETWEEN 'a' AND 'm';

zwraca nazwy uytkownikw pomidzy a a m. Przy wprowadzeniu tego zapytania moe


wywietli si nastpujcy komunikat o bdzie:
ERROR 1270 (HY000): Illegal mix of collations
(utf8_general_ci, IMPLICIT), (latin1_swedish_ci, COERCIBLE),
(latin1_swedish_ci, COERCIBLE) for operation 'BETWEEN';

Najbardziej prawdopodobn przyczyn tego bdu jest wykorzystanie w programie klienckim


uywanym do poczenia z serwerem innego zestawu znakw i porzdku sortowania ni
ustawiony na serwerze (patrz rozdzia 9. Projektowanie i tworzenie baz danych). Zazwyczaj
na serwerze ustawia si kodowanie Unicode (utf8). Aby wyeliminowa problem, naley ustawi
w programie klienckim ten sam zestaw znakw i porzdek sortowania, jak w bazie danych.
W przypadku klienta mysql bazy danych MySQL robi si to za pomoc nastpujcej instrukcji:
mysml> set character_set_connection =

character_set_database;

Powysza instrukcja ustawia take porzdek sortowania na domylny dla wybranego zestawu
znakw. Porzdek sortowania mona rwnie wprowadzi w osobnej instrukcji w nastpujcy
sposb:
mysml> set collation_connection =

collation_database;

Dodatkow komplikacj jest fakt, i niektre serwery baz danych interpretuj zakresy wartoci
zdefiniowane w klauzuli BETWEEN wcznie z wartociami granicznymi, natomiast inne nie
uwzgldniaj tych wartoci. Przed skorzystaniem ze sowa kluczowego BETWEEN naley upewni
si, w jaki sposb s interpretowane granice zakresu (we wszystkich bazach danych omawianych w tej ksice granice przedziaw wchodz w skad zakresu).

256 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

257

Pobieranie niepowtarzalnych wartoci


Czasami zamiast wszystkich wartoci w kolumnie (gdzie mog wystpowa duplikaty) interesuje nas tylko zbir moliwoci. W przypadku naszej tabeli Messages wykonanie zapytania:
SELECT forum_id FROM Messages;

moe spowodowa wywietlenie wielu powtrze nazw forw, na ktrych publikowano wicej
ni jedn wiadomo. Jeli jednak interesuje nas lista forw, na ktrych opublikowano co
najmniej jedn wiadomo, moemy w jzyku SQL zastosowa zapytanie SELECT DISTINCT:
SELECT DISTINCT forum_id FROM Messages;

Powysze zapytanie zwrci pojedyncze wartoci pola forum_id i wyeliminuje wszystkie


duplikaty.

Wykorzystanie funkcji SQL w zapytaniach


Oprcz wartoci skalarnych i kolumn, w zapytaniach jzyka SQL mona wykorzysta szereg funkcji. Mog to by zarwno wbudowane funkcje serwera, jak i funkcje zdefiniowane
przez uytkownika w systemach obsugujcych tzw. procedury skadowane (ang. stored
procedures) funkcje zdefiniowane przez uytkownika i przechowywane na serwerze
w postaci skompilowanej.
W jzyku SQL wystpuj dwie klasy funkcji:
n

Funkcje agregacji funkcje, ktre przetwarzaj zbir wartoci (na przykad wartoci
danych w kolumnie tabeli) i zwracaj pojedyncz warto skalarn. Przykadem
mog by funkcje obliczajce sum wartoci w kolumnie lub ich redni arytmetyczn.

Funkcje skalarne funkcje przetwarzajce pojedyncz warto skalarn (na przykad


warto okrelonej kolumny w okrelonym wierszu) i zwracajce pojedyncz warto
skalarn. W przypadku podania jako parametru nazwy kolumny, funkcja zwraca
kolumn, ktrej wartoci s jej wynikami dla wartoci kolumny rdowej.
Przykadami mog by funkcje zamiany cigw znakw w polu na mae litery,
konwersji walut oraz funkcje formatujce dane przed wywietleniem.

W wyraeniach mona stosowa wycznie funkcje skalarne. Funkcje agregacji mona wykorzysta do przetwarzania wynikw zapytania przed ich zwrceniem do uytkownika.
Najczciej stosuje si je w odniesieniu do wynikw instrukcji SELECT.
Niestety, funkcje stanowi kolejny obszar, w ktrym poszczeglne serwery baz danych bardzo
si rni pomidzy sob. Cho zestaw wasnoci funkcjonalnych jest podobny, nazwy funkcji
i sposb ich uywania bardzo si rni pomidzy poszczeglnymi serwerami. W tym rozdziale
postaram si opisa najpopularniejsze funkcje dla najpopularniejszych serwerw. W przypadku,
gdy rozbienoci bd zbyt wielkie, przedstawi wersj dla bazy danych MySQL (zwizy
opis odpowiednikw dla innych serwerw baz danych mona znale w dodatku B Odpowiedniki funkcji obsugi baz danych).

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 257

258

Cz II n Podstawowe wiadomoci o bazach danych


W przypadku wywoywania funkcji w zapytaniach SQL, pomidzy nazw funkcji a otwierajcym znakiem nawiasu przed list argumentw nie moe by spacji.
AVG(daily_precip)
AVG (daily_precip)

Dobrze
le

Funkcje numeryczne
Rozpoczn od opisania kilku funkcji numerycznych, poniewa s one najbardziej zrozumiale
i najatwiejsze w uyciu. Wszystkie opisane poniej funkcje to funkcje agregacji, ktre wykorzystamy do przetwarzania zbioru wierszy w zapytaniu w celu uzyskania pojedynczej wartoci.

COUNT
Funkcj COUNT mona wykorzysta na dwa sposoby: COUNT(NazwaKolumny) lub COUNT(*).
Pierwszy sposb wywoania zlicza w zestawie wynikw liczb wartoci okrelonej kolumny
rnych od NULL. W drugiej wersji funkcja COUNT zlicza liczb wierszy w zestawie wynikw.
Na przykad instrukcja:
SELECT COUNT(*) FROM Users;

zlicza uytkownikw w tabeli Users. Aby policzy uytkownikw w tabeli Users, ktrych
nazwiska s rne od NULL (co przy naszym schemacie tabeli jest dozwolone), mona wykorzysta nastpujce zapytanie:
mysml> SELECT COUNT(full_name) from Users;
+------------------+
| count(full_name) |
+------------------+
|
4 |
+------------------+
1 row in set (1.26 sec)

SUM
Aby w zestawie wynikw uzyska sum wartoci zawartych w okrelonej kolumnie, mona
skorzysta z funkcji SUM. Gdybymy mieli tabel z informacjami o pogodzie w okrelonym
miejscu i chcieli obliczy cakowit warto opadw w 2002 roku, moglibymy wykona
nastpujce zapytanie:
SELECT SUM(daily_precip) FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';

MAX i MIN
Aby obliczy maksymaln lub minimaln warto kolumny w zestawie wynikw, mona
skorzysta z funkcji MAX i MIN. Kontynuujc nasz przykad bazy danych o pogodzie z poprzedniego punktu, aby znale dni w 2002 roku, w ktrych wystpiy najwiksze i najmniejsze
opady, moemy skorzysta z nastpujcych zapyta:

258 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

259

SELECT MAX(daily_precip) FROM DailyWeatherReports


WHERE date BETWEEN '2002-01-01' AND '2002-12-31';
SELECT MIN(daily_precip) FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';

Powysze dwa zapytania mona poczy w jedno. Zestaw wynikw takiego zapytania bdzie
skada si z dwch kolumn:
SELECT MAX(daily_precip), MIN(daily_precip)
FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';

AVG
Aby obliczy redni arytmetyczn wartoci w kolumnie, mona skorzysta z funkcji AVG.
Wykorzystuje si j w nastpujcy sposb:
SELECT AVG(daily_precip) FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';

Funkcje znakowe
W jzyku SQL wystpuje wiele przydatnych funkcji przetwarzania cigw znakw. Wikszo
z nich to funkcje skalarne, ktre mona wykorzysta w wielu przypadkach.

Wydzielanie podcigw
Aby wydzieli cz cigu znakw w jzyku SQL, mona skorzysta z funkcji SUBSTRING
(w systemie Oracle SUBSTR). Funkcja pobiera trzy argumenty: warto (nazw kolumny),
z ktrej ma by wydzielony podcig, indeks pierwszego znaku podcigu oraz liczb znakw
do wydzielenia.
Uwaga
W odrnieniu od jzyka PHP, gdzie indeksy maj wartoci poczwszy od 0, indeksy
w cigach znakw w jzyku SQL liczy si od 1. Oznacza to, e pierwszy znak w cigu
ma indeks 1.

Aby pobra pierwszych 5 znakw z kadego wiersza tabeli zawierajcej nazwy wszystkich
stanw w USA i prowincji w Kanadzie, mona wykona nastpujce zapytanie:
SELECT SUBSTRING(name, 1, 5) FROM states_provinces;

Aby znale stany i prowincje, ktrych nazwy zaczynaj si od sekwencji New, mona wykona nastpujce zapytanie:
SELECT * FROM states_provinces
WHERE SUBSTRING(name, 1, 3) = 'New';

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 259

260

Cz II n Podstawowe wiadomoci o bazach danych

Konwersja wielkoci liter


Aby przeksztaci cigi znakw na mae bd wielkie litery, mona skorzysta z funkcji LOWER
lub UPPER.
SELECT LOWER(user_name) FROM Users;
SELECT UPPER(last_name) FROM customers;

Funkcji LOWER i UPPER rzadko uywa si w wyraeniach formuowanych w klauzuli WHERE,


poniewa jak wspominaem w poprzednim rozdziale w przypadku wikszoci operacji
sortowania i porwna wielko liter nie ma znaczenia.

Wyszukiwanie cigu znakw


Czsto przydaje si funkcja, ktra wyszukuje pozycj okrelonego cigu znakw w tekcie
(lub kolumnie). Chocia we wszystkich serwerach baz danych, ktre bdziemy wykorzystywa,
taka funkcja jest dostpna, nazwy i sposoby korzystania z niej mog by rne. Zarwno
w systemie MySQL, jak i Oracle jest dostpna funkcja INSTR:
INSTR(szukaj_tu, znajd_mnie)

Na przykad, ponisze zapytanie mona wykorzysta do pobrania imion uytkownikw naszej


internetowej tablicy ogosze (przy zaoeniu, e w polu name imi wystpuje jako pierwsze):
SELECT user_name
SUBSTRING(full_name, 1, INSTR(full_name, ' '))
FROM Users;

Jeli szukany cig nie zostanie odnaleziony, funkcja INSTR zwraca warto 0.

Konkatenacja cigw znakw


W jzyku SQL istnieje funkcja suca do konkatenacji cigw znakw. W rnych serwerach baz danych funkcja ta moe nazywa si inaczej. W tym miejscu opisz skadni polecenia w systemie MySQL:
CONCAT(warto1, warto2, ..., warton)

Aby na podstawie zawartoci tabeli Users uzyska sformatowany cig znakw skadajcy
si z nazwy uytkownika i adresu e-mail, mona wykona nastpujce zapytanie:
SELECT CONCAT('Nazwa uytkownika: ',
user_name,
' tAdres e-mail:',
user_email)
FROM Users;

Przycinanie cigw znakw


Funkcja TRIM usuwa wiodce i kocowe spacja z cigw znakw. Dziaa tak samo jak odpowiadajca jej funkcja w PHP:

260 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

261

SELECT user_name, TRIM(full_name), user_email


FROM Users
WHERE user_name LIKE 'F%';

Funkcje przetwarzania dat i godzin


W jzyku SQL wystpuje kilka przydatnych funkcji przetwarzajcych daty i godziny. Nie
s one standardowe i w rnych serwerach wystpuj pod innymi nazwami, ale wikszo
podstawowych funkcji jest dostpna we wszystkich najpopularniejszych systemach baz danych.

Now
Aby odczyta biec dat i godzin w systemie MySQL i PostgreSQL, mona skorzysta
z funkcji NOW.
SELECT NOW();
INSERT INTO Orders (prodid, user_id, when)
VALUES(445455423, 32345, Now());

Rok, miesic, dzie


W jzyku SQL wystpuje grupa funkcji sucych do pobierania czci wartoci z dat. Funkcje
te znacznie si rni w rnych systemach baz danych. W bazie danych MySQL funkcja
YEAR pobiera dat i na jej podstawie zwraca czterocyfrowy numer roku. Funkcja MONTH zwraca
numer miesica daty, natomiast funkcje DAYOFMONTH, DAYOFWEEK i DAYNAME zwracaj informacje
na temat dnia w rnym formacie.

Formatowanie dat i godzin


Chocia we wszystkich systemach baz danych wystpuj funkcje suce do formatowania dat i godzin, poszczeglne implementacje bardzo si rni pomidzy sob. W systemie
MySQL do formatowania dat suy funkcja DATE_FORMAT, ktra pobiera warto daty do
sformatowania oraz cig formatu.
DATE_FORMAT(sformatuj_mnie, cig_formatu)

Parametr cig_formatu to sekwencja znakw, ktre s zastpowane odpowiednimi wartociami dotyczcymi daty. Na przykad:
mysml> SELECT full_name, DATE_FORMAT(birthdate, '%W %D %M %Y')
-> FROM Users
-> WHERE birthdate <> '000-00-00';
+--------------------------------+---------------------------------------+
| full_name
| DATE_FORMAT(birthdate, '%W %D %M %Y') |
+--------------------------------+---------------------------------------+
| Krzysztof Malinowski
| Tuesday 16th December 1980
|
| Akira Tanaka
| Wednesday 13th September 0000
|
| Patrycja Dominikowska
| Monday 31st March 1975
|
+--------------------------------+---------------------------------------+
3 rows in set (0.00 sec)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 261

262

Cz II n Podstawowe wiadomoci o bazach danych


Najpopularniejsze i najbardziej interesujce kody formatw zestawiono w tabeli 11.1. Pen
list wartoci mona znale w dokumentacji bazy danych MySQL.

Tabela 11.1. Kody formatw funkcji DATE_FORMAT


Kod

Znaczenie

%W

Dzie tygodnia w jzyku serwera bazy danych (czsto jest nim jzyk angielski).

%w

Dzie tygodnia w formacie liczbowym (0= niedziela, 6= sobota).

%Y

Rok wedug kalendarza juliaskiego przedstawiony za pomoc 4 cyfr (na przykad 1999).

%y

Rok wedug kalendarza juliaskiego przedstawiony za pomoc 2 cyfr (na przykad 33).

%M

Nazwa miesica w jzyku serwera bazy danych (czsto jest nim jzyk angielski).

%m

Numer miesica w formacie liczbowym (01 12).

%D

Dzie miesica z przyrostkiem liczebnika porzdkowego dla jzyka angielskiego


(1st, 2nd, 3rd itd.).

%d

Dzie miesica w formacie liczbowym (01 31)

%H

Godzina w formacie 24-godzinnym (00 23).

%h

Godzina w formacie 12-godzinnym (01 12).

%p

Przyrostek AM bd PM.

%i

Minuta w formacie liczbowym (00 59).

%S lub %s

Sekunda w formacie liczbowym (00 59).

Grupowanie danych dla funkcji agregacji


Funkcje agregacji w jzyku SQL s jeszcze bardziej przydatne, jeli przed wykonaniem
funkcji pogrupuje si wartoci danych w tabeli. W zaprezentowanym poprzednio przykadzie bazy danych z informacjami o pogodzie pokazaem, w jaki sposb mona wykorzysta
funkcj AVG do obliczenia redniej wartoci opadw w roku. Aby uzyska redni warto
opadw dla kilku lat, trzeba by byo wykona kilka zapyta i poda w nich rne wartoci lat.
Byoby o wiele wygodniej, gdyby mona to byo zrobi za pomoc jzyka SQL. Klauzula
GROUP BY umoliwia grupowanie wartoci w okrelonej kolumnie przed wykonaniem funkcji
agregacji dla kadej z grup:
SELECT YEAR(date), AVG(daily_precip)
FROM DailyWeatherReports
GROUP BY YEAR(date);

Klauzula GROUP BY razem ze skalarn funkcj YEAR umoliwia pogrupowanie tabeli wedug
wsplnych wartoci roku, a nastpnie wykonanie funkcji AVG dla wszystkich wierszy z poszczeglnych grup. Zapytanie mona jeszcze bardziej ucili za pomoc klauzuli HAVING,
ktra jest nieco podobna do klauzuli WHERE, ale dotyczy warunkw ograniczajcych dla podklauzuli GROUP BY. Przykadowo, aby uzyska list lat, w ktrych rednia warto opadw
przekroczya 50 mm, mona wykorzysta nastpujce zapytanie:

262 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

Rozdzia 11. n Wykorzystanie baz danych: zaawansowany dostp do danych

263

SELECT YEAR(date), AVG(daily_precip)


FROM DailyWeatherReports
GROUP BY YEAR(date)
HAVING AVG(daily_precip) > 50;

Dziki moliwoci czenia powyszych wasnoci mona tworzy niezwykle skomplikowane zapytania. Na przykad, aby uzyska redni warto opadw dla lat 1990 2000 dla
wszystkich miast o rocznej redniej wartoci opadw przekraczajcej 50 mm, mona wykorzysta nastpujce zapytanie:
SELECT YEAR(date), AVG(daily_precip)
FROM DailyWeatherReports
WHERE YEAR(date) BETWEEN 1990 AND 2000
GROUP BY YEAR(date)
HAVING AVG(daily_precip) > 50;

W pewnych sytuacjach trzeba doda bd usun kolumn z tabeli. Mona to zrobi za pomoc
instrukcji ALTER TABLE, ktra ma wiele moliwych zastosowa. W tym podrozdziale zademonstruj najczciej stosowane:
ALTER TABLE NazwaTabeli
ADD NazwaKolumny TypKolumny atrybuty...;
ALTER TABLE NazwaTabeli
DROP COLUMN NazwaKolumny;
ALTER TABLE NazwaTabeli
CHANGE COLUMN NazwaKolumny Nowe_szczegy;
ALTER TABLE NazwaTabeli
RENAME AS NowaNazwaTabeli;

Modyfikowanie schematu tabeli jest operacj, ktrej nie naley wykonywa czsto. Trzeba
mie pewno, e wykonywane dziaania s prawidowe. Celem projektowania jest utworzenie struktury bazy danych, ktra jest wydajna, elastyczna, skalowalna i zapewni spenienie potrzeb uytkownikw w przyszoci. Jeli zbyt czsto musimy modyfikowa schematy
tabel, moe to oznacza konieczno powtrnego przeprowadzenia procesu projektowania
tabel. Poza tym, modyfikowanie schematu tabel jest operacj kosztown. W niektrych
systemach baz danych usunicie kolumny wymaga duej iloci miejsca na dysku. Czsto
tabela jest zablokowana przez cay czas usuwania niepotrzebnych danych. Podobne, mniej
lub bardziej przejciowe problemy z wydajnoci, mog si zdarzy w przypadku dodawania
nowych kolumn.
Aby doda kolumn, naley skorzysta z klauzuli ADD i wprowadzi nazw nowej kolumny,
jej typ danych oraz inne atrybuty. Na przykad, aby w tabeli Users doda pole password suce
do zapisywania hase, mona wykorzysta nastpujce zapytanie:
ALTER TABLE Users
ADD password VARCHAR(50) NOT NULL;

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

(17-05-06) 263

264

Cz II n Podstawowe wiadomoci o bazach danych


Powysze zapytanie dodaje now kolumn tekstow do tabeli Users z atrybutem NOT NULL
wykluczajcym uycie NULL jako wartoci w dowolnym z wierszy. Dla istniejcych wierszy
w tabeli kolumna password zostanie ustawiona na pusty cig znakw ''. W jzyku SQL wystpuj dwa opcjonalne sowa kluczowe FIRST i AFTER, pozwalajce na okrelenie miejsca
w tabeli, w ktrym maj zosta umieszczone nowe kolumny:
ALTER TABLE Users
ADD password VARCHAR(50) NOT NULL
AFTER user_name;

Aby usun kolumn z tabeli, naley skorzysta z klauzuli DROP COLUMN. Na przykad, aby
usun kolumn password, ktr dodalimy przed chwil, mona wykorzysta nastpujce
zapytanie:
ALTER TABLE Users
DROP COLUMN password;

Podobnie jak inne operacje, ktre powoduj usuwanie informacji z bazy danych, usunicie
kolumny jest trwae i nie mona go cofn. Dlatego wanie takie polecenia musz by uywane
ze szczegln ostronoci (i raczej nie naley zezwala na ich wykonywanie zwykym uytkownikom bazy danych).
Do zmiany definicji kolumny suy klauzula CHANGE (klauzul rwnowan jest MODIFY).
W przypadku wprowadzenia nazwy w nowej definicji kolumny, kolumna zostanie przemianowana. Klauzul CHANGE mona rwnie wykorzysta do zmiany typu oraz atrybutw kolumny. Przykadowo, aby zmieni typ pola user_name w tabeli Users na cig 100-znakowy,
mona wykorzysta nastpujce zapytanie:
ALTER TABLE Users
CHANGE COLUMN user_name VARCHAR(100) NOT NULL;

Aby zmieni nazw tabeli User, mona skorzysta z klauzuli RENAME:


ALTER TABLE Users
RENAME AS MessageBoardUsers;

Instrukcj ALTER TABLE mog wykonywa tylko uytkownicy posiadajcy uprawnienie ALTER.

Po lekturze tego rozdziau Czytelnik rozszerzy swoj wiedz na temat jzyka SQL. Wykorzystalimy go do wykonywania coraz bardziej skomplikowanych zapyta i operacji na danych.
Dziki zastosowaniu transakcji mona wykona wiele instrukcji SQL w formie niepodzielnej
operacji. Podczas obsugi transakcji mona stosowa rne poziomy izolacji i blokowania. Po
lekturze tego rozdziau Czytelnik powinien wiedzie, w jaki sposb mona kwalifikowa
i sortowa dane, wykorzystywa funkcje, a take modyfikowa schemat tabel (pamitajc
o kosztach tej operacji).
Po lekturze ostatnich czterech rozdziaw dysponujemy wystarczajc wiedz na temat baz
danych, aby zacz z nich korzysta z poziomu kodu PHP. W nastpnym rozdziale przedstawi sposoby nawizywania poczenia z serwerem, wykonywania zapyta i przegldania
wynikw z poziomu naszej aplikacji internetowej.

264 (17-05-06)

D:\Roboczy Jarek\makiety poprawki i druku pdf\PHPiMySQL Tworzenie aplikacji WWW\09 druk\R11.doc

You might also like