Professional Documents
Culture Documents
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
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
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 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
Spis treci
Pliki skompresowane ............................................................................................. 145
POSIX ................................................................................................................... 151
Diagnostyka .......................................................................................................... 157
Obsuga sesji ........................................................................................................ 178
Polecenia interpretera ............................................................................................ 181
Nagwki HTTP....................................................................................................... 183
Sie...................................................................................................................... 185
FTP ....................................................................................................................... 190
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
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
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
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
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!"646 "
*+32(
)
!"
)*)
78
"*+32(
)
!"
)*56
*+3(
)
!"
)*!
5
/
"*+32(
)
!"
)*9!*$+3(
)
!"
)*4/
5
/ 1*+--(
)
!"
)*)
*+3(
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:
):#
(
)
!
+,./!01!"2+-3
%
4
5
!0
3+;1 5!"646 "
+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
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.
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[(
547
<
4
"1
8!/
T
%&'&
(
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/4P_Q6H(
E
4I
/F4/!"E%
Y(
C
/E1F2(E1=E!"I(E1``
J
E415+FE%
a7/
"52E
4I
/b(
R
/!P/"E415(
R
??"1 T
1
T
!"!/
/
1 0
4
6 I
74/
"517!(
??8
@A !"1!4!/!/!71
"/
8
5!"1
8!/
T1
1CDE501" F764G8
""! H
I
4HHC/!!/
5!HHH
J
8/1"H1!7
K"
8
@A 6L41B0
A5
"6 ID=MN"H(
8/1"H9
O !"1!4 /68PD=MN"H(
!Q1(
R
??60S/0
65
"6 I1
"/
8
5!"1
8!/
T1
1CD764G4!! 50H!4HE501"
J
8/1"H1!7
K"
60/
L0
6!4D=MN"H(
8/1"H9
O !"1!4 /68PD=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&Y7Y5W1W4H17!Y2<22(
EVP!/6+FH*H(
1CDE50!4PF764GGP!/6EVP!/6E501"
J
??"1!7
K"
6
"
L
86
"1
549
J
??"1!7
K"
6
"
L
86
"1
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.
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
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
::464 1!1
5
7
U 15
"!
/!4P
:?
552
Cz III n Algorytmy
Rysunek 17.4.
Wiadomo
z forum
:?
CP" 1
"8
4#
/7E8
/!"EP4!1!
J
8/1"H=#FNHE%%)#NHFNH8
4NHMN"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!QNHFNH1"8P1!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!QNHFNH1"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=%&%FNH4P071NHFNH]6U1TNHMH(
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"8P1!+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!4PF764GGP!/6EVP!/6E501"
J
??"1!7
K"
6
"
L
86
"1
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!
@!T146
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>.