You are on page 1of 22

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

PHP. Programowanie
Autor: Leon Atkinson
Tumaczenie: Jarosaw Dobrzaski
ISBN: 83-7197-967-3
Tytu oryginau: Core PHP Programming, 2E
Format: B5, stron: 674

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

Ksika PHP. Programowanie. to praktyczny przewodnik po PHP4 dla programistw


stron internetowych. Jeden z najlepszych programistw PHP Leon Atkinson, uczy
wszystkiego, co potrzebujesz, by stworzy dobr i szybk aplikacj sieciow. Dokadnie
opisuje skadni PHP i kluczowe elementy jzyka. Atkinson przedstawia take
najwaniejsze funkcje PHP, w tym funkcje wejcia-wyjcia, przetwarzania danych,
matematyczne, daty, czasu, konfiguracji, funkcje umoliwiajce wspprac z bazami
danych, funkcje graficzne i sieciowe. Prezentuje on rwnie dziaanie PHP na
przykadach realizujcych sortowanie, przeszukiwanie, analiz acuchw i inne
zadania. Opisane zostay take praktyczne metody tworzenia i diagnostyki programw
w PHP4.
Ksika PHP. Programowanie zawiera:
Jasny i szczegowy opis skadni i funkcji PHP
Dokadny opis integracji PHP z bazami danych
Techniki tworzenia i optymalizacji skryptw, pod ktem ich wydajnoci i atwej
rozbudowy
Praktyczne techniki diagnostyczne, uatwiajce znalezienie i poprawienie bdw

Spis treci
Sowo wstpne....................................................................................................................................... 9
Przedmowa ........................................................................................................................................... 11

Cz I Programowanie w PHP......................................................................................13
Rozdzia 1. Wprowadzenie do PHP .......................................................................................................15
Historia PHP ............................................................................................................ 16
Co sprawia, e PHP jest lepszy od innych jzykw? ..................................................... 18
Interfejsy do systemw zewntrznych......................................................................... 19
Jak PHP wsppracuje z serwerem sieciowym? ........................................................... 20
Wymagania sprztowe i programowe ......................................................................... 20
Instalacja na Apache dla Uniksa................................................................................ 21
Instalacja na IIS dla Windows 2000 .......................................................................... 23
Edycja skryptw ....................................................................................................... 23
Algorytmy ................................................................................................................ 24
Jak wyglda skrypt PHP? .......................................................................................... 25
Przechowywanie danych............................................................................................ 27
Odbieranie informacji od uytkownika ........................................................................ 28
Wybieranie pomidzy alternatywami........................................................................... 30
Powtarzanie sekwencji kodu...................................................................................... 31
Podsumowanie ........................................................................................................ 32

Rozdzia 2. Zmienne, operatory i wyraenia.....................................................................................33


Identyfikatory........................................................................................................... 34
Typy danych............................................................................................................. 34
Tworzenie zmiennych i ich zakres dziaania ................................................................ 37
Przyporzdkowanie zmiennym wartoci ...................................................................... 40
Odczytywanie wartoci zmiennych.............................................................................. 42
Uwalnianie pamici .................................................................................................. 42
Stae....................................................................................................................... 43
Operatory ................................................................................................................ 44
Operatory logiczne i relacyjne .................................................................................... 45
Operatory bitowe...................................................................................................... 46
Inne operatory ......................................................................................................... 47
Operatory przyporzdkowania .................................................................................... 49
Wyraenia ............................................................................................................... 50

Rozdzia 3. Instrukcje sterujce ........................................................................................................53


Prawda i fasz .......................................................................................................... 54
Instrukcja if ............................................................................................................. 54
Operator ?............................................................................................................... 56

PHP. Programowanie
Instrukcja switch...................................................................................................... 57
Ptle....................................................................................................................... 59
Instrukcja while........................................................................................................ 59
Instrukcja break....................................................................................................... 60
Instrukcja continue................................................................................................... 61
Instrukcja dowhile................................................................................................. 62
Instrukcja for ........................................................................................................... 63
Instrukcja foreach .................................................................................................... 65
exit, die i return ....................................................................................................... 65
Obliczanie wyrae logicznych ................................................................................... 66

Rozdzia 4. Funkcje ..............................................................................................................................67


Deklarowanie funkcji ................................................................................................ 67
Instrukcja return ...................................................................................................... 68
Zakres i instrukcja global.......................................................................................... 69
Argumenty ............................................................................................................... 69
Rekurencja .............................................................................................................. 72
Dynamiczne wywoania funkcji................................................................................... 73

Rozdzia 5. Tablice................................................................................................................................75
Tablice jednowymiarowe ........................................................................................... 75
Indeksowanie tablic ................................................................................................. 77
Inicjalizacja tablic..................................................................................................... 78
Tablice wielowymiarowe............................................................................................ 79
Formatowanie tablic ................................................................................................. 80
Odwoania do tablic z wntrza acucha ..................................................................... 81

Rozdzia 6. Klasy i obiekty...................................................................................................................83


Definiowanie klasy ................................................................................................... 84
Tworzenie obiektu .................................................................................................... 86
Dostp do metod i waciwoci ................................................................................. 87

Rozdzia 7. Operacje we/wy i dostp do dysku ................................................................................89


Poczenia HTTP ...................................................................................................... 90
Wysyanie treci do przegldarki................................................................................ 91
Buforowanie na wyjciu ............................................................................................ 92
Zmienne rodowiskowe ............................................................................................ 93
Pobieranie danych z formularzy ................................................................................. 94
Cookies .................................................................................................................. 95
Pobieranie plikw od uytkownika.............................................................................. 96
Wywoania metody PUT............................................................................................. 97
Zapis do plikw i ich odczytywanie............................................................................. 98
Sesje ...................................................................................................................... 99
Funkcje include i require......................................................................................... 102

Cz II Funkcje PHP .................................................................................................... 105


Rozdzia 8. Funkcje wejcia-wyjcia ............................................................................................... 107
Wysyanie tekstu do przegldarki............................................................................. 108
Buforowanie wyjcia ............................................................................................... 110
Pliki ...................................................................................................................... 111

Spis treci
Pliki skompresowane ............................................................................................. 145
POSIX ................................................................................................................... 151
Diagnostyka .......................................................................................................... 157
Obsuga sesji ........................................................................................................ 178
Polecenia interpretera ............................................................................................ 181
Nagwki HTTP....................................................................................................... 183
Sie...................................................................................................................... 185
FTP ....................................................................................................................... 190

Rozdzia 9. Funkcje przetwarzania danych..................................................................................... 199


Typy danych, stae i zmienne .................................................................................. 199
Tablice.................................................................................................................. 205
Mieszanie ............................................................................................................. 229
acuchy............................................................................................................... 232
Kodowanie i dekodowanie ...................................................................................... 239
Szyfrowanie ........................................................................................................... 260
Wyraenia regularne ............................................................................................... 264
Wyraenia regularne zgodne z Perlem ...................................................................... 268

Rozdzia 10. Funkcje matematyczne .................................................................................................273


Operacje matematyczne ......................................................................................... 273
Liczby losowe ........................................................................................................ 281
Liczby dowolnej precyzji .......................................................................................... 284

Rozdzia 11. Funkcje daty, czasu i konfiguracji................................................................................287


Data i czas ............................................................................................................ 287
Niestandardowe kalendarze .................................................................................... 294
Konfiguracja .......................................................................................................... 298

Rozdzia 12. Funkcje graficzne..........................................................................................................305


Analizowanie obrazkw ........................................................................................... 306
Tworzenie obrazkw JPEG, PNG i WBMP................................................................... 307

Rozdzia 13. Funkcje wsppracujce z bazami danych .................................................................339


dBase ................................................................................................................... 340
Abstrakcyjna baza danych typu DBM........................................................................ 344
filePro ................................................................................................................... 350
Informix................................................................................................................. 352
InterBase .............................................................................................................. 360
mSQL ................................................................................................................... 366
MySQL .................................................................................................................. 377
ODBC.................................................................................................................... 392
Oracle................................................................................................................... 403
Postgres ............................................................................................................... 422
Sybase ................................................................................................................. 432

Rozdzia 14. Inne funkcje ................................................................................................................... 441


Apache ................................................................................................................. 442
Aspell ................................................................................................................... 445
COM ..................................................................................................................... 446
Gettext.................................................................................................................. 448

PHP. Programowanie
IMAP..................................................................................................................... 449
Java...................................................................................................................... 470
LDAP .................................................................................................................... 470
Semafory .............................................................................................................. 481
Pami wsplna..................................................................................................... 483
SNMP ................................................................................................................... 486
WDDX ................................................................................................................... 489
XML ...................................................................................................................... 492

Cz III Algorytmy......................................................................................................505
Rozdzia 15. Sortowanie, wyszukiwanie i liczby losowe ................................................................507
Sortowanie ............................................................................................................ 508
Sortowanie bbelkowe ........................................................................................... 509
Algorytm Quicksort ................................................................................................. 511
Wbudowane funkcje sortujce................................................................................. 512
Sortowanie z funkcj porwnujc ........................................................................... 516
Wyszukiwanie ........................................................................................................ 519
Indeksowanie ........................................................................................................ 519
Liczby losowe ........................................................................................................ 523
Identyfikatory losowe.............................................................................................. 525
Losowanie banera reklamowego.............................................................................. 526

Rozdzia 16. Analiza skadni i acuchw..........................................................................................529


Podzia acuchw.................................................................................................. 529
Wyraenia regularne ............................................................................................... 531
Definiowanie wyrae regularnych ........................................................................... 532
Stosowanie wyrae regularnych w skryptach PHP...................................................... 533

Rozdzia 17. Integracja z bazami danych ......................................................................................... 541


Tworzenie tabel HTML z zapyta SQL....................................................................... 542
ledzenie odwiedzajcych za pomoc identyfikatorw sesji ....................................... 546
Przechowywanie danych w bazie.............................................................................. 550
Warstwy abstrakcyjne baz danych............................................................................ 556

Rozdzia 18. Sie.................................................................................................................................557


Uwierzytelnianie w HTTP ......................................................................................... 557
Sterowanie buforem przegldarki ............................................................................ 559
Ustawianie typu dokumentu .................................................................................... 561
Poczta elektroniczna z zacznikami......................................................................... 563
Weryfikacja adresu skrzynki pocztowej ..................................................................... 565

Rozdzia 19. Generowanie grafiki .....................................................................................................569


Przyciski dynamiczne.............................................................................................. 570
Generowanie grafiki w locie ................................................................................. 574
Wykresy supkowe.................................................................................................. 574
Wykresy koowe ..................................................................................................... 576
Rozciganie pojedynczych pikseli ............................................................................ 581

Spis treci

Cz IV Inynieria oprogramowania........................................................................583
Rozdzia 20. Integracja z HTML-em ..................................................................................................585
Umieszczanie fragmentw kodu PHP w dokumencie HTML ........................................ 585
Uywanie PHP do generowania caych dokumentw HTML ......................................... 589
Separowanie HTML-u od PHP .................................................................................. 591
Tworzenie pl <SELECT> ........................................................................................ 592
Przesyanie tablic w formularzach ............................................................................ 595

Rozdzia 21. Projektowanie ...............................................................................................................597


Tworzenie specyfikacji wymaga.............................................................................. 598
Tworzenie dokumentw projektowych....................................................................... 601
Uywanie CVS........................................................................................................ 602
Modularyzacja za pomoc include ........................................................................... 603
FreeEnergy ............................................................................................................ 604
FastTemplate ........................................................................................................ 606
Midgard ................................................................................................................ 606
Ariadne ................................................................................................................. 607
Bezpieczestwo i ochrona danych ........................................................................... 607
Ukrywanie ............................................................................................................. 608
Adresy przyjazne wyszukiwarkom ............................................................................. 609
Skrypty uruchamiane regularnie .............................................................................. 610

Rozdzia 22. Efektywno i diagnostyka.......................................................................................... 613


Mierzenie wydajnoci ............................................................................................. 614
Pobieranie wynikw zapytania z bazy danych ............................................................ 615
Kiedy przechowywa dane w bazie........................................................................... 616
Diagnostyka bieca .............................................................................................. 617
Diagnostyka zdalna ................................................................................................ 617
Symulowanie pocze HTTP ................................................................................... 618

Dodatki.......................................................................................................................... 619
Dodatek A Kody z ukonikiem ........................................................................................................... 621
Dodatek B Kody ASCII.........................................................................................................................623
Dodatek C Operatory .........................................................................................................................629
Dodatek D Znaczniki PHP ................................................................................................................... 631
Dodatek E Konfiguracja PHP w czasie kompilacji............................................................................633
Dodatek F Zasoby internetowe .........................................................................................................637
Dodatek G Przewodnik po stylach PHP.............................................................................................639
Skorowidz ..........................................................................................................................................643

Integracja z bazami danych


W tym rozdziale:
n

Tworzenie tabel HTML z zapyta SQL.

ledzenie odwiedzajcych za pomoc identyfikatorw sesji.

Przechowywanie danych w bazie.

Warstwy abstrakcyjne baz danych.

PHP cile wsppracuje z wieloma bazami danych. Jeeli wewntrzna wsppraca z okrelon
baz nie istnieje, zawsze mona skorzysta z ODBC, ktry jest standardem dla zewntrznych sterownikw baz danych. Regularnie pojawiaj si moduy, umoliwiajce wspprac z nowymi bazami danych. Programici PHP twierdz: Dajcie nam do testowania swj
produkt, a stworzymy kod obsugujcy go w PHP.
MySQL jest niewtpliwie najbardziej popularn baz danych wrd programistw PHP.
Poza tym, e jest darmowa, nadaje si do zastosowa sieciowych z uwagi na du szybko.
W przykadach tu opisanych zakadam posiadanie bazy danych MySQL. Mona j pobra
z witryny MySQL pod adresem <http://www.mysql.com> i zainstalowa w swoim systemie
lub pokusi si o dostosowanie opisanych tu przykadw do wsppracy z inn baz.
Wikszo relacyjnych baz danych uywa strukturalnego jzyka zapyta (SQL). Jest to jzyk
czwartej generacji, co oznacza, e przypomina bardziej tekst w jzyku angielskim ni kod
rdowy w PHP. Omwienie samego SQL wykracza poza ramy tej ksiki. W przypadku znikomej wiedzy na ten temat, radz przegldn list materiaw wymienion w dokumentacji na
stronie domowej MySQL: <http://www.mysql.com/doc.html>. Alternatyw moe by ksika,
taka jak Hands-On SQL Roberta Grotha i Davida Gerbera, wydana przez Prentice Hall.

542

Cz III n Algorytmy

Tworzenie tabel HTML z zapyta SQL


Jednym z prostszych zada, jakie mona wykona za pomoc bazy danych i PHP, jest pobranie
danych z bazy i wywietlenie ich w tabeli HTML. Tabela taka moe zawiera np. list towarw
na sprzeda, list projektw, list serwerw DNS i ich czasy reakcji. Na potrzeby przedstawionego tu przykadu wykorzystany zostanie pierwszy z tych przykadw. Zamy, e supermarket chce zamieci na stronie internetowej list towarw na sprzeda. W tym celu trzeba stworzy stron, ktra wywietla zawarto bazy danych. Zostanie tu zastosowana baza ,
tworzona podczas instalacji MySQL. Skrypt PHP, przegldajcy katalog produktw, bdzie
znajdowa si na tym samym komputerze, na ktrym zainstalowany jest serwer bazy danych.
Pierwszym krokiem jest utworzenie tabeli. Listing 17.1 pokazuje kod SQL, tworzcy prost
tabel, skadajc si z trzech kolumn. Tabela nazywa si . Zawiera ona kolumn,
zwan
, ktra zawiera wartoci cakowite, maksymalnie jedenastocyfrowe. Kolumna ta
nie moe by pusta i nowym wierszom automatycznie bd przyporzdkowywane kolejne
wartoci. Ostatni wiersz definicji okrela
jako klucz podstawowy. Powoduje to, e wartoci w tej kolumnie s traktowane jako indeksy i uniemoliwia dublowanie si kluczy. Pozostae dwie kolumny to   i .
Listing 17.1. Tworzenie tabeli katalog








 !"
#$
%&'&
(

  to acuch znakw o zmiennej dugoci, maksymalnie do 32 znakw.  to liczba


zmiennoprzecinkowa z szecioma cyframi przed i dwoma po przecinku. Format ten nadaje
si do zapisu cen.

Kolejnym krokiem jest umieszczenie elementw w tabeli. Jako e jest to tylko demonstracja,
wprowadzimy tu par przykadowych produktw, jakie mona naby w supermarkecie wraz
z wymylonymi cenami. W tym celu uyta zostanie instrukcja . Listing 17.2 jest
przykadem opisanej procedury.
Listing 17.2. Wprowadzanie danych do tabeli katalog
)



!"
)*)  ! 
*+,-(
)



!"
)*./!01!"*2+-3(
)



!"
)*%
4
5 !0 *3+-(
)



!"
)*1 5!" 64 6 "
*+32(
)



!"
)*)
78 "*+32(
)



!"
)*56
*+3(
)



!"
)*! 5 /
" *+32(
)



!"
)*9! *$+3(
)



!"
)*4 /
5 
/ 1*+--(
)



!"
)*) 
*+3(

Rozdzia 17. n Integracja z bazami danych

543

Kada instrukcja SQL koczy si rednikiem, podobnie jak w PHP. Informujemy serwer
MySQL, e chcemy wstawi wiersz do tabeli  i e podamy tylko nazw produktu i cen.
Jako e pomijamy tu
, MySQL stworzy go sam. Wynika to ze zdefiniowania tej kolumny
jako   . Sowo kluczowe  informuje serwer, e za chwil zostan przesane wartoci opisane w poprzednim poleceniu. Wartoci przesyane s w apostrofach, zgodnie
ze standardem przyjtym w SQL.
Aby sprawdzi, czy operacja si powioda, listing 17.1 wywietla wartoci, jakie otrzymalibymy, wybierajc wszystko z tabeli  z poziomu klienta MySQL. Realizuje to polecenie:
):#

(

po wydaniu ktrego otrzymujemy:




!"

)  ! 
+,./!01!"2+-3
%
4
5 !0 3+;1 5!" 64 6 "
+32
3)
78 "+32
$56
+3
,! 5 /
" +32
<9! $+3
-4 /
5 
/ 1+-2) 
+3
2/ 41"4! 2+24! 

Ostatnim krokiem jest napisanie skryptu PHP, ktry pobiera zawarto tabeli i przeksztaca j
w tabel HTML. Listing 17.3 przedstawia kod PHP, pobierajcy nazwy oraz ceny i wywietlajcy je w tabeli HTML. Na pocztku naley poczy si z serwerem bazy danych. Realizuje
to funkcja  . Pobiera ona nazw hosta, nazw uytkownika i haso. Zwykle
tworz w moich bazach MySQL uytkownika o nazwie !" bez hasa. Ograniczam rwnie
tego uytkownika tylko do pocze z lokalnego serwera. Jego nazwa jest taka sama, jak
nazwa uytkownika UNIX, ktry wykonuje skrypty, czyli serwera sieciowego. Jeeli wynajmujemy miejsce na serwerze, moemy mie przyporzdkowane inne nazwy uytkownika
i bazy danych, co wymaga zmiany odpowiednich argumentw w przykadzie.
Rysunek 17.1.
Tworzenie tabeli
HTML z wynikami
zapytania

544

Cz III n Algorytmy

Listing 17.3. Tworzenie tabeli HTML z wynikami zapytania


=>
??8 @A !"1!4!/!/!7148/
5!"1! 641B8 1 5@
1CDE501" F764G 8 ""! H
I 4 HHI 85HHH
J
8/1" H1!7 K"
8 @A 6L41B0
AD=MN"H(
8/1" H9
O !"1!4 /68 PD=MN"H(
!Q1 (
R
??60S/0
65
"6 I148/
5!"1!/!P
S 8!/
T1
1CD764G 4! ! 50H !4 HE501" 
J
8/1" H1!7 K"
60/
L0
6 !4 D=MN"H(
8/1" H9
O !"1!4 /68 PD=MN"H(
!Q1 (
R
??8 0/
"1!
@!T

/ U 1
0! 1
EVP!/6FH)

!"
H(
EVP!/6+FH#'

H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
8/1" H1!7 K"
6 "
L
86
"1
D=MN"H(
8/1" H 7P"1
6)VWH+764G !// /+H=MN"H(
8/1" H9
86
"1!WEVP!/6=MN"H(
!Q1 (
R
??8 A ! 
0! 1
8/1" H=FNH2NHMN"H(
??P  /!"1!1!/4
"
@S S
8/1" H=MN"H(
8/1" H=.FNHXNHM=M/ 6 P@=?M=?MN"H(
8/1" H=.FNHXNHM=M!"
=?M=?MN"H(
8/1" H=?MN"H(
??8 0/
"1!
K5! 1!/46
I1 !E50 F764G C! I 0T! E50!4P 
J
8/1" H=MN"H(
8/1" H=ME50 YM

=?MN"H(
8/1" H=.FNH/1I NHME50 YM!"
=?MN"H(
8/1" H=?MN"H(
R
?? "1! 
0! 1
8/1" H=?MN"H(
>M

Jeeli poczenie si powiodo, zwracany jest identyfikator cza z MySQL. Jak wida, w tym
samym wierszu nastpuje nawizanie poczenia i testowanie, czy operacja si powioda.

Rozdzia 17. n Integracja z bazami danych

545

Identyfikatory czy s zawsze wiksze od zera, a zero zwracane jest wtedy, gdy nie mona
nawiza poczenia. Dlatego te testowanie wystpienia wartoci # umoliwia wykrycie
nieudanego poczenia. W takim przypadku nastpuje po prostu opuszczenie skryptu.
Funkcja, za pomoc ktrej czymy si z baz, to  . Przegldajc opisy funkcji
MySQL w rozdziale 13., Funkcje wsppracujce z bazami danych, mona znale rwnie
inn funkcj:  . Funkcje te dziaaj identycznie w ramach skryptu, ale 
  nawizuje trwae poczenie z serwerem.
Wikszo funkcji wsppracujcych z bazami danych udostpnia moliwo tworzenia
trwaych pocze czyli takich, ktre nie zamykaj si z chwil zakoczenia skryptu. Jeeli
ten sam proces sieciowy uruchomi pniej inny skrypt, ktry czy si z tym samym serwerem
bazy danych, wykorzystane bdzie istniejce ju poczenie. Dziki temu mona oszczdzi
troch czasu. W praktyce oszczdnoci te nie s due i wynikaj ze sposobu, w jaki serwer
Apache 1.3x uywa procesw potomnych, zamiast wtkw. Procesy te obsuguj pewn
liczb wywoa, po czym s zastpowane przez nowe procesy. Po zakoczeniu procesu zakoczone zostaje rwnie trwae poczenie.
Rzeczywisty zysk czasu, wynikajcy ze stosowania trwaych pocze, pojawia si dopiero
przy duych obcieniach w takich chwilach mog one okaza si bardzo pomocne.
Dlatego te domylnie stosuj  . W chwili pisania tej ksiki zblia si moment
pojawienia si Apache 2.0. Zapowiadane jest tam stosowanie wielowtkowego podejcia,
co pozwoli zapewne w peni wykorzysta zalety trwaych pocze.
Nastpnym krokiem jest wybr bazy danych. Tutaj zostaa wybrana baza . Po poinformowaniu PHP, z ktrej bazy naley korzysta, otrzymamy wszystkie wiersze z tabeli .
Realizuje to funkcja $. Wykonuje ona zapytanie na okrelonym czu i zwraca
identyfikator wyniku. Identyfikator ten zostanie uyty do pobrania wynikw zapytania.
Zanim rozpoczniemy pobieranie danych ze zbioru wynikw, naley rozpocz budowanie
tabeli HTML. Jak mona si domyli, w tym celu uyty zosta znacznik otwierajcy tabel.
Stworzony zosta wiersz nagwkw, z szarym tem, a reszta waciwoci tablicy pozostaa
domylna.
Po wywietleniu wiersza nagwkw mona pobra kady z wierszy ze zbioru wynikw.
Najszybciej dziaajc funkcj jest %!&'. Kada z kolumn wyniku staje si
waciwoci zwrconego obiektu. Nazwy kolumn staj si nazwami waciwoci. Mona
rwnie zastosowa funkcje %!( lub %!, ktre s rwnie
efektywne. W wikszoci przypadkw stosowanie obiektw jest dla mnie bardziej czytelne.
Naley unika stosowania $, poniewa funkcja ta wykonuje czasochonn procedur przeszukiwania tablicy dwuwymiarowej.
Gdy nie ma ju wicej wierszy do pobrania, funkcja zwraca #. Aby wykorzysta to zachowanie, pobieranie pojedynczego wiersza jest realizowane w ptli (!. Wiersz w tabeli HTML
jest tworzony poprzez wywietlenie waciwoci obiektu w odpowiednich jej polach. Po wywietleniu wszystkich wierszy tabela jest zamykana. Nie trzeba w tym miejscu zamyka poczenia z baz danych, poniewa PHP robi to automatycznie w chwili zakoczenia skryptu.
Opisany przykad jest niezwykle prosty, ale dotyka wikszoci istotnych kwestii dotyczcych
wsppracy z bazami danych. Poniewa kady z wierszy jest wywietlany w ptli, wszystkie

546

Cz III n Algorytmy
wygldaj tak samo. Jeeli dane ulegn zmianie, nie trzeba wprowadza zmian w kodzie,
ktry przeksztaca je w HTML. Mona dowolnie zmienia zawarto bazy danych.
Dobrym przykadem zastosowania tej techniki jest losowy generator nazw marek handlowych:
<http://www.leonatkinson.com/random/>, ktry tworzy losowe nazwy z tabeli wyrazw przechowywanej w bazie MySQL, do ktrej kady moe dodawa nowe sowa. Kade odwieenie strony generuje kolejne dziesi nazw.

ledzenie odwiedzajcych
za pomoc identyfikatorw sesji
Witryny sieciowe powoli przeksztacaj si w aplikacje sieciowe. Pojawia si tu problem
zachowywania stanu. Podczas przechodzenia ze strony na stron aplikacja musi pamita,
kim jest uytkownik. Sie jest anonimowa: przegldarka czy si z serwerem, pobiera par
plikw i zamyka poczenie. Pi minut pniej, gdy ponownie poczymy si ze stron, proces
si powtarza. Mimo e informacje o logowaniu s przechowywane, serwer nas nie pamita.
Wszelkie dane, jakie podalimy o sobie trzy strony wczeniej, nawet jeeli zostay zapisane,
nie bd z nami kojarzone.
Wyobramy sobie kreator zamwie pizzy: pierwszy ekran pyta si, ile pizz chcemy zamwi;
nastpnie przechodzimy do ekranw odpowiadajcych kadej z zamawianych pizz i wybieramy jej zawarto i rodzaj ciasta; na koniec kolejna strona pyta o nasze nazwisko i telefon,
aby przesa nasze zamwienie do najbliszej pizzerii realizujcej dowz. Jednym ze sposobw
rozwizania tego problemu jest stopniowe przekazywanie dotychczas gromadzonych informacji z kadym nastpnym przesaniem danych z formularza uytkownika. W miar przechodzenia ze strony na stron liczba danych bdzie rosa. Przekazujemy serwerowi wielokrotnie
czciowe dane o zamwieniu metoda ta dziaa, ale wie si z przesyaniem wielu niepotrzebnych informacji.
Stosujc baz danych i identyfikator sesji, mona gromadzi informacje w miar ich przekazywania. Identyfikator staje si kluczem do informacji. Z chwil gdy skrypt pobiera identyfikator, przypomina sobie, co dziao si wczeniej.
Inn kwesti jest sposb pobrania identyfikatora. Istniej tu dwie moliwoci. Pierwsz jest
przekazywanie identyfikatora jako zmiennej w kadym czu i w kadym formularzu. W przypadku formularza mona to atwo zrealizowa za pomoc zmiennej ukrytej. W przypadku
cza naley wstawi znak zapytania i definicj zmiennej. Jeeli zaoymy, e identyfikator
sesji jest przechowywany w zmiennej  , jego przesanie na nastpn stron mogoby
mie nastpujc form:
8/1" Z#FN[8
!+8I8>4!441 "FE4!441 "N[M"!Q =?M[(

Metoda ta dziaa z wszystkim przegldarkami, rwnie z Lynx.


Drugim sposobem jest uycie cookies. Podobnie jak zmienne formularzy GET i POST, cookies
s zamieniane przez PHP na zmienne. Mona wic utworzy cookie o nazwie  .

Rozdzia 17. n Integracja z bazami danych

547

Rnica polega bdzie na tym, e cookies musz by przesyane w nagwkach i naley


wysa je, zanim przegldarka otrzyma jakkolwiek tre HTML. Warto w tym miejscu zajrze do opisu funkcji  w rozdziale 8., Funkcje wejcia-wyjcia. Bardziej zoona
strategia polega na prbie zastosowania cookies i w przypadku niepowodzenia oparciu si
na zmiennych GET.
Obydwie metody s szeroko stosowane w Internecie. Wystarczy wej w jakkolwiek witryn
sklepu internetowego. Na potrzeby przykadu opisana tu zostanie strategia polegajca na
zastosowaniu zmiennych GET. Pierwszym krokiem jest stworzenie tabeli przechowujcej
identyfikatory sesji. Listing 17.4 przedstawia kod SQL, tworzcy prost tabel ' w bazie
danych MySQL.
Listing 17.4. Tworzenie tabeli przechowujcej sesje
4!4T


<
4
"1
8!/
T

%&'&
(

Kluczami w tabeli s 8-znakowe acuchy. Po kadym przejciu uytkownika na inn stron


odwieana jest zawarto kolumny  '. W ten sposb moemy pozby si
wszelkich sesji, ktre wygldaj na nieuywane. Kada wizyta na stronie spowoduje usuwanie
sesji bezczynnych przez 30 minut. Nastpnym krokiem jest sprawdzanie, czy uytkownik
posiada identyfikator sesji. Jeeli nie posiada, zostaje on utworzony. Jeeli posiada, naley
sprawdzi, czy jest on prawidowy.
Po pierwszym zaadowaniu skryptu z listingu 17.5 tworzy on identyfikator sesji. Kade
kliknicie przycisku Odwie w przegldarce spowoduje sprawdzenie sesji przez skrypt. Jeeli
identyfikator sesji nie znajduje si w tabeli ', wwczas zostanie odrzucony i utworzony
bdzie nowy. Mona sprbowa przesa nieprawidowy identyfikator, usuwajc jaki znak
w pasku adresu przegldarki.
Rysunek 17.2.
Sprawdzanie
identyfikatora
sesji

Listing 17.5. Sprawdzanie identyfikatora sesji


=>
?:
::!7 "4 /
T

4 4 
"1
15!" 6C1
/S4!4T1
:?
CP" 1 ")!441 "E !" IF<

548

Cz III n Algorytmy
J
??4
" 1!"1!
/!4P5 8P4 
"6 I"
S
E% FH#.\'%V)]^&9H(
E% +FH
0 5!CI1T 7" 8G/4 P_Q6H(
E
4 I
/F4 / !"E% Y(
C /E1F2(E1=E !" I(E1``
J
E415+FE% a7 /
"52E
4 I
/b(
R
/! P/"E415(
R
??"1 T
1
T
!"!/
/
 1 0 4 6 I
7 4/
"5 17!(
??8 @A !"1!4!/!/!71 " /
8  5!"1
 8!/
T1
1CDE501" F764G 8 ""! H
I 4 HHC/!! /
5!HHH
J
8/1" H1!7 K"
8 @A 6L41B0
A5
"6 ID=MN"H(
8/1" H9
O !"1!4 /68 PD=MN"H(
!Q1 (
R
??60S/0
65
"6 I1 " /
8  5!"1
 8!/
T1
1CD764G 4! ! 50H !4 HE501" 
J
8/1" H1!7 K"
60/
L0
6 !4 D=MN"H(
8/1" H9
O !"1!4 /68 PD=MN"H(
!Q1 (
R
??P4P"1B 1!464 1 I4
/6 I4!4T1
EVP!/6FH#4!4T
H(
EVP!/6+FH]4
"1
8!/
T
=*H(
EVP!/6+F5
!H&Y7Y5W1W4H 17!Y2<22(
EVP!/6+FH*H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


P4P"AL4
/6 I4!4T1D=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
??48/
5!"1!4!4T1
1C144! E4!441 "
J
??T!K! 17
764!4TB"
4 B8PT!T!T48/
5!"1!
EVP!/6FH):H(
EVP!/6+FH#4!4T
H(
EVP!/6+FH]F*H+
554
4I!4E4!441 "+H*H(
1CDE50!4P F764G GP!/6EVP!/6E501" 

Rozdzia 17. n Integracja z bazami danych

549

J
??"1!7 K"
6 "
L
86
"1

8/1" H"1!7 K"


6 "
L
86
"1
5 
0! 14!4T
D=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
??T!K! 1/S "6 4
@T
1U1!/4P5
@ 41B 5"
!cL4!4TB
1C764G "P7/ 4E50!4P 
J
??4!4T
14 "1!T! 5U1!K!"1! 
4P 4
"1!T 8!/
T1
EVP!/6FH%4!4T
H(
EVP!/6+FH)4
"1
8!/
T
F" H(
EVP!/6+FH]F*E4!441 "*H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


 5U1!K6L
0! 14!4T
D=MN"H(
8/1" H 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
R
! 4!
J
??@615!" 6C1
/
8/1" H1!"
"615!" 6C1
/4!4T1E4!441 "D=MN"H(
E4!441 "FHH(
R
R
??T!K! 1"1!06@ 4!4T1"
!K6TAP  /6L
1CE4!441 "FFHH
J
??"1!06@ 4!4T1Y  / "
T!4 " 

E4!441 "F)!441 "<(


??P71!4 !"1!4!4T10
1!5
"6 I
EVP!/6FH)4!4T
H(
EVP!/6+FH)*E4!441 "*" H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


4
1L! !7!" P5 
0! 14!4T
D=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
R
8/1" HST15!" 6C1
/4!4T1 WE4!441 "=MN"H(
8/1" H=#FNHE%%)#>4!441 "FE4!441 "NHMH(
8/1" H5U1!K4 / "BH(
8/1" H=?M=MN"H(
>M

550

Cz III n Algorytmy
Kolejnym logicznym krokiem jest dodanie kolejnej tabeli, przechowujcej informacje o osobie
przegldajcej witryn. Jedna z kolumn powinna przechowywa identyfikator sesji z tabeli
'. Dopisanie tego kodu moe by dobrym wiczeniem.

Przechowywanie danych w bazie


Informacja przechowywana w bazie danych nie ogranicza si do krtkich acuchw, jak
32-znakowa nazwa towaru z listingu 17.3. Mona te tworzy due, 64-kilobajtowe obiekty,
ktre pomieszcz nawet kompletn stron internetow. Zalet jest fakt, e strony zawsze istniej
w bardzo uporzdkowanym otoczeniu. Mona je okreli numerem, ktry wystarcza do ustalenia zalenoci midzy stronami. Minusem jest niemono zaadowania strony istniejcej
w bazie danych do swojego ulubionego edytora. Naley tu rozway zyski i straty dla
wikszoci stron nie ma potrzeby przechowywania kadego ich elementu w bazie danych.
Przykadem sytuacji, kiedy umieszczenie zawartoci strony w bazie danych jest zasadne, jest
forum internetowe. System taki przechowuje wiadomoci, ktre, oprcz tego, e s stronami,
posiadaj charakterystyki, takie jak: tytu, data utworzenia i autor. Taka struktura moe by
w prosty sposb odwzorowana w tabeli bazy danych. Co wicej, poniewa kadej wiadomoci mona nada jednoznaczny identyfikator, mona organizowa wiadomoci w formie
drzewa zalenoci. Uytkownik zostawia wiadomo, ktra rozpocznie wtek w dyskusji i spowoduje pojawienie si nowych wiadomoci do niego nawizujcych. Wiadomoci mona
wywietla w hierarchii wtkw, co uatwia ich przegldanie.
Jak w kadym systemie opartym na bazie danych, pierwszy krok polega na stworzeniu tabeli.
W listingu 17.6 utworzona zostaje tabela do przechowywania wiadomoci. Kada wiadomo
ma tytu, nazw nadawcy, czas wysania, wiadomo nadrzdn i tre. Identyfikator wiadomoci nadrzdnej moe wynosi zero, co oznacza, e wiadomo inicjuje nowy wtek.
Treci wiadomoci nie musi by zwyky tekst, moe ni by rwnie kod HTML. Tym sposobem uytkownicy maj moliwo tworzenia w bazie stron za pomoc wasnych przegldarek.
Listing 17.6. Tworzenie tabeli przechowujcej wiadomoci
]1
5 7 4


!7
$;

5

$;
)  / " 
%/ 5! 
/!4 
%&'&
(

Skrypt z listingu 17.7 ma dwa tryby pracy: listowanie tytuw wiadomoci i przegldanie
pojedynczej wiadomoci. Jeeli zmienna 
jest pusta, wwczas ukazana zostaje lista
wszystkich wiadomoci w systemie, zorganizowanych wedug wtkw. Realizuje to funkcja
!(. W tym miejscu warto powrci do fragmentu rozdziau 4., Funkcje, gdzie
opisana jest rekurencja. Funkcja !( korzysta z rekurencji przy przegldaniu kadej

Rozdzia 17. n Integracja z bazami danych

551

z gazi drzewa wiadomoci. Na pocztku pobiera list wszystkich wiadomoci, ktre nie
maj wiadomoci nadrzdnych. S to pocztki wtkw. Po ukazaniu wszystkich wiadomoci inicjujcych wtki !( jest wywoywana dla danego wtku. Proces powtarza
si do momentu odnalezienia wiadomoci, ktra nie posiada wiadomoci potomnych. Do
wywietlenia tytuw wiadomoci wykorzystano znaczniki . Wcicia pomagaj odwzorowa na ekranie hierarchi wiadomoci.
Rysunek 17.3.
Lista wiadomoci
forum

Listing 17.7. Proste forum


=>
8/1" H=M# /P7! "
=?MN"H(
??8 @A !"1!4!/!/!7148/
5!"1! 641B8 1 5@
1CDE501" F764G 8 ""! H
I 4 HHI 85HHH
J
8/1" H1!7 K"
8 @A 6L41B0
A5
"6 ID=MN"H(
8/1" H9
O !"1!4 /68 PD=MN"H(
!Q1 (
R
??60S/0
65
"6 I148/
5
"1!8  5!"1
 8!/
T1
1CD764G 4! ! 50H !4 HE501" 
J
8/1" H1!7 K"
60/
L0
6 !4 D=MN"H(
8/1" H0 / 1"D=MN"H(
!Q1 (
R
?:
::/! P/!" 6T"
CP" T
6U1!
TA

::464 1!1
5 7 U 15
"! 
/!4P
:?

552

Cz III n Algorytmy

Rysunek 17.4.
Wiadomo
z forum

CP" 1 "4I !44


!4E8
/!" 
J
 0
E501" (
E5
! 4!F
!HH(
8/1" H=MN"H(
EVP!/6FH)!7
)  / " H(
EVP!/6+FH#]1
5 7 4 H(
EVP!/6+FH]%
/!" FE8
/!" H(
EVP!/6+FH&)  / " H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


6 "
L
86
"1
5 
0! 1]1
5 7 ULD=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
I1 !E/ F764G C! I 0T! E50!4P 
J
??P

"1! !7
P1
5 7 U 1C /71! 5" U"1
5 T!T /!U 1
8/1" H=ME/ YM)  / " =#FNHH(
8/1" HE%%)#>7!44
!FE/ YMNHMH(
8/1" HE/ YM!7
=?M=MN"H(

Rozdzia 17. n Integracja z bazami danych


??P

"1!1
5 7 U 18 7"6 I
4I !44
!4E/ YM(
R
8/1" H=?MN"H(
R
?:
::6U1! !"1!C /7P
/
5 5 5

"1
1
5 7 U 1
::5
"6715!" 6C1
/!78/ 5

:?
CP" 1 "8 4 # /7E8
/!" EP4!1 !
J
8/1" H=#FNHE%%)#NHFNH8 4 NHMN"H(
8/1" H=%&%FNHI155!"NHFNH1"8P %
/!" NHH(
8/1" HFNHE8
/!" NHMN"H(
8/1" H=%&%FNHI155!"NHFNHNHH(
8/1" HFNH%)NHMN"H(
8/1" H=FNHNH)%.FNH2NHH(
8/1" H%.FNH3NH]FNH;22NHMN"H(
8/1" H=MN"H(
8/1" H=]FNH22NHM=M!7
=?M=?MN"H(
8/1" H=]FNH22NHMH(
8/1" H=%&%FNH !Q NHFNH1"8P 1 !NHH(
8/1" H)9FNH3NH^.FNH$;NHFNHEP4!1 !NHMH(
8/1" H=?MN"H(
8/1" H=?MN"H(
8/1" H=MN"H(
8/1" H=]FNH22NHM=M
5

=?M=?MN"H(
8/1" H=]FNH22NHMH(
8/1" H=%&%FNH !Q NHFNH1"8P % 4 !/NHH(
8/1" H)9FNH3NH^.FNH$;NHMH(
8/1" H=?MN"H(
8/1" H=?MN"H(
8/1" H=MN"H(
8/1" H=)%FNHNH]FNH;22NHMH(
8/1" H=^FNH1"8P  56NHH(
8/1" H)FNH;3NH])FNH3NHM=?^MH(
8/1" H=?MN"H(
8/1" H=?MN"H(
8/1" H=MN"H(

553

554

Cz III n Algorytmy
8/1" H=)%FNHNH]FNH;22NH.FNH7155 !NHMH(
8/1" H=%&%FNH4P071 NHFNH]6U 1TNHMH(
8/1" H=?MN"H(
8/1" H=?MN"H(
8/1" H=?MN"H(
8/1" H=?#MN"H(
R
?:
::6 "PT! 8!/
T!
:?
1CEDFHH
J
1CEFFH%)H
J
EVP!/6FH)]1
5 7 4 H(
EVP!/6+FH)2H(
EVP!/6+FH*H+
554
4I!4E1"8P 1 !+H*H(
EVP!/6+FH*H+
554
4I!4E1"8P % 4 !/+H*H(
EVP!/6+FH" E1"8P %
/!" H(
EVP!/6+FH*H+
554
4I!4E1"8P  56+H*H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


4
1L! !7!" P5 
0! 1
]1
5 7 ULD=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
R
R
?:
::]6U1! !"1!1
5 7 U 1 P0 14 61
5 7 U 1
:?
1CE7!44
!M2
J
EVP!/6FH)!7

5

)  / " %/ 5! /!4 H(
EVP!/6+FH#]1
5 7 4 H(
EVP!/6+FH]FE7!44
!H(
1CDE50!4P F764G GP!/6EVP!/6E501" 
J
??"1!7 K"
6 "
L
86
"1

8/1" H1!7 K"


6 "
L
86
"1
5 
0! 1]1
5 7 ULD=MN"H(
8/1" H' 7P"1
6)VWH+764G !// /+H=MN"H(
!Q1 (
R
1CE/ F764G C! I 0T! E50!4P 
J
8/1" H=FNHNH)%.FNH2NHH(
8/1" H%.FNH3NH]FNH;22NHMN"H(

Rozdzia 17. n Integracja z bazami danych

555

8/1" H=MH(
8/1" H=]FNH22NHM=M!7
=?M=?MH(
8/1" H=]FNH22NHME/ YM1 !=?MH(
8/1" H=?MN"H(
8/1" H=MH(
8/1" H=]FNH22NHM=M
5

=?M=?MH(
8/1" H=]FNH22NHME/ YM% 4 !/=?MH(
8/1" H=?MN"H(
8/1" H=MH(
8/1" H=]FNH22NHM=M]64
" =?M=?MH(
8/1" H=]FNH22NHME/ YM)  / " =?MH(
8/1" H=?MN"H(
8/1" H=MH(
8/1" H=)%FNHNH]FNH;22NHMH(
8/1" HE/ YM/!4 H(
8/1" H=?MH(
8/1" H=?MN"H(
8/1" H=?MN"H(
8 4 # /7E/ YMHWE/ YM!7
H(
R
8/1" H=#FNHE%%)#NHM14
1
5 7 U 1=?M=MN"H(
R
! 4!
J
8/1" H=M14
1
5 7 U 1=?MN"H(
??8 0/
"1!
@!T 14 6
4I !44
!42(
8 4 # /72HH(
R
>M

Z punktu widzenia efektywnoci, zastosowanie rekurencji nie jest optymalne. Kady wtek
powoduje kolejne wywoanie !(, z czym wie si nastpne zapytanie do bazy danych. Istnieje sposb na jednokrotne przesanie zapytania i przegldanie drzewa przechowywanego w pamici realizacj tego pomysu pozostawiam jako wiczenie dla Czytelnika.
Gdy uytkownik kliknie tytu wiadomoci, strona zostaje ponownie zaadowana z ustawionym 
. Powoduje to, e skrypt przecza si na tryb wywietlania pojedynczych
wiadomoci. Pola wiadomoci zostaj wywietlone w tabeli. Jeeli wiadomo zawiera jakikolwiek kod HTML, zostanie on zinterpretowany przez przegldark, poniewa nie nastpuje
tu adna filtracja znacznikw. Ograniczenie to znajduje zastosowanie w kodzie dodajcym
nowe wiadomoci.

556

Cz III n Algorytmy
W kadym z dwch trybw pracy ukazywany jest formularz do dodawania wiadomoci. Jeeli
wiadomo zostaa dodana w chwili wywietlania listy, zostanie uznana za pocztek nowego
wtku. Jeeli za wiadomo dodana zostaa podczas przegldania innej wiadomoci, uznana
zostanie za odpowied na t wiadomo i nowa wiadomo bdzie potomkiem przegldanej
wiadomoci.
Przedstawione tu forum jest proste, ale zawiera podstawowe elementy funkcjonalne takiego
systemu. Bardziej wyrafinowanym rozwizaniem byoby umoliwienie dodawania wiadomoci
tylko przez uwierzytelnionych uytkownikw lub nieudostpnianie wiadomoci na forum
do momentu ich akceptacji przez moderatora. Struktury tej mona uy do budowy dowolnej aplikacji, ktra zarzdza danymi przesanymi przez uytkownika, chociaby ksigi goci.
Jeeli szukamy bardziej wyrafinowanej implementacji forum internetowego, mona zajrze
do witryny projektu Phorum Briana Moona pod adresem <http://www.phorum.org>.

Warstwy abstrakcyjne baz danych


Wyobramy sobie, e podczas tworzenia aplikacji sieciowej, wykorzystujcej MySQL, zostalimy poproszeni o zmian bazy danych na Oracle. Kada z funkcji PHP jest inna dla tych
dwch baz i musielibymy zmieni kad z nich. Dodatkowo Oracle i MySQL uywaj
nieco odmiennego SQL, co wymagaoby zapewne zmiany wikszoci zapyta. Rozwizaniem tego problemu jest zastosowanie warstwy abstrakcyjnej. Pozwala to na oddzielenie
sposobu dziaania aplikacji od kodu komunikujcego si z baz danych. Pojedyncza funkcja wywouje tu odpowiedni funkcj w zalenoci od typu bazy, z jak si komunikujemy.
Jedn z najbardziej popularnych warstw abstrakcyjnych baz danych stanowi fragment
biblioteki PHP Base Library <http://phplib.netuse.de>. Biblioteka ta zawiera rwnie kod
do zarzdzania sesjami. Inn warstw abstrakcyjn jest Metabase, dostpna pod adresem:
<http://phpclasses.upperdesign.com>.
Niezalenie od warstw abstrakcyjnych, niezgodnoci midzy bazami powoduj stae powstawanie nowych rozwiza. MySQL uywa specjalnego kwalifikatora do opisu kolumn, zwanego
  . Powoduje on automatyczne wypenianie kolumn liczbami cakowitymi
w kolejnoci rosncej. W Oracle mona to w przyblieniu z realizowa za pomoc sekwencji
(SEQUENCE) i wyzwalacza (TRIGGER). Wszystkie te rnice trudno systematycznie godzi.
W 1999 r. Scott Ambler zaproponowa rozwizanie w swojej publikacji The Design of a
Robust Persistence Layer for Relational Databases, <http://www.ambysoft.com/persistenceLayer.html>. Zawar tam dogbn analiz problemu, wraz ze szczegowymi rozwizaniami,
jednak nie oddaj im sprawiedliwoci w kontekcie tego rozdziau.
Warstwy abstrakcyjne udostpniaj pewno kosztem pewnej utraty efektywnoci. Cz rozwiza poprawiajcych efektywno w danej bazie danych musi zosta pominita. Warstwa
abstrakcyjna udostpnia zwykle podstawowy zestaw funkcji bazy danych. Zysk polega tu
na uniezalenieniu si od jednego typu bazy.

You might also like