Download as pdf or txt
Download as pdf or txt
You are on page 1of 63

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. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

PHP5. Tworzenie stron


WWW. wiczenia
praktyczne. Wydanie II
Autor: Andrzej Kierzkowski
ISBN: 83-246-0674-2
Format: A5, stron: 260
Kolejne wydanie najpopularniejszego podrcznika PHP
Tworzenie wasnych skryptw
Programowanie obiektowe
Bezpieczestwo witryn WWW
Statyczne witryny WWW to pocztek kariery kadego webmastera. Jednak jzyk
HTML, cho cigle rozwijany, ma ograniczone moliwoci, co powoduje, e aby
stworzy niektre elementy strony, bdziesz musia sign po inne technologie.
Umieszczenie na stronie WWW interaktywnego menu, forum dyskusyjnego lub ksigi
goci wymaga zastosowania narzdzi innego rodzaju.
Chcesz wzbogaci swoj witryn WWW o nowe, interaktywne elementy? Poznaj jzyk PHP5!
Ten jzyk programowania jest bardzo rozpowszechniony, efektywny, dziaa na wielu
platformach, a co najwaniejsze, jest dostpny bezpatnie. Zosta zaprojektowany
specjalnie do tworzenia aplikacji WWW. Jest te stosunkowo atwy do opanowania
i wygodny w uyciu.
Ksika PHP5. Tworzenie stron WWW. wiczenia praktyczne. Wydanie II to kolejne,
zaktualizowane i uzupenione, wydanie popularnego podrcznika przedstawiajcego
podstawy tworzenia aplikacji WWW. Czytajc j, nauczysz si obsugiwa za pomoc
PHP5 formularze umieszczane na stronach WWW, wysya i odbiera pliki, zarzdza
sesjami i cookies oraz korzysta z danych zgromadzonych w bazie MySQL. Rozdzia
powicony programowaniu obiektowemu zosta rozbudowany i wzbogacony o nowe
przykady i wiczenia. Ksika dodatkowo zawiera rozdzia o zagroeniach
wynikajcych ze stosowania PHP5 i sposobach zabezpieczania przed nimi witryn WWW.
Instalowanie i konfiguracja PHP5
Operatory
Zmienne
Ptle i konstrukcje warunkowe
Przesyanie danych z formularzy
Obsuga plikw i sesji
Poczenia z bazami danych
Tworzenie grafiki w PHP5
Komponenty witryn WWW
Programowanie obiektowe
Zabezpieczanie aplikacji WWW
Dziki tej ksice podstawy jzyka PHP opanowao ju prawie 20 000 osb. Docz do nich!
Wzboga swj warsztat poznaj jzyk PHP5

Wstp

Rozdzia 1. Pierwsze spojrzenie

Client-side vs. server-side


Witryna PHP
Apache, PHP, MySQL konta w internecie
Gotowe skrypty

7
13
17
18

Rozdzia 2. Instalacja i konfiguracja

21

Rozdzia 3. Podstawy PHP

33

Pierwsze skrypty
Zmienne, stae, operatory
Instrukcja warunkowa
Ptla for
Ptle while i dowhile
Instrukcja wyboru (switch)
Funkcje
Zoone struktury danych
tablice zwyke i tablice asocjacyjne

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie


Pobieranie danych z formularzy
Cookies
Obsuga plikw
Sesje
Baza danych

34
37
44
49
53
56
58
76

87
87
101
109
119
128

PHP5. Tworzenie stron WWW wiczenia praktyczne

Rozdzia 5. Grafika w PHP

147

Rozdzia 6. Trudniejsze zadania webmasterskie

169

Licznik tekstowy
Licznik graficzny
Ksiga goci
Newsy na stronie
Ankieta
Ring
Galeria zdj
Analiza dziennikw serwera
Forum dyskusyjne

Rozdzia 7. Klasy i obiekty


Podstawy modelu obiektowego PHP5
Dziedziczenie i zasig
Obiektowy licznik
Biblioteka PEAR

Rozdzia 8. Bezpieczestwo w PHP5


Zagroenia wynikajce z wczonej opcji
register_globals
Ataki typu File Inclusion
Ataki typu SQL Injection

170
179
185
191
201
207
212
215
221

227
228
232
234
240

249
249
251
255

Programy PHP, ktre napisae do tej pory, nie byy bardzo


rozbudowane i nie szokoway swoimi moliwociami. Nie stanowiy te rozwizania typowych problemw webmasterskich.
Pewnie ju zauwaye, e opieray si na komunikacji jednostronnej:
program co wylicza i wywietla wyniki w przegldarce. Nie mona
byo mu jednak w aden sposb przekaza danych ani te zapisa na
serwerze wynikw dziaania w celu wykorzystania ich w przyszoci. Nie byo te moliwoci przekazywania wynikw dziaania z jednej strony do drugiej. W tym rozdziale zajmiesz si tymi wanie zagadnieniami: pobieraniem danych od uytkownika, pamitaniem ich
zarwno po stronie klienta, jak i serwera oraz przekazywaniem informacji pomidzy stronami.

Pobieranie danych z formularzy


Podstawowym sposobem pobierania danych od uytkownika na stronach WWW s formularze. Zakadam, e majc styczno z HTML-em,
zapoznae si ju z tym tematem. Warto jednak przypomnie kilka
niezbdnych informacji.

88

PHP5. Tworzenie stron WWW wiczenia praktyczne

Formularz na stronie WWW ma nastpujc posta:


<FORM ACTION="skrypt.php" METHOD=POST>
<!--Tu wystpuj pola formularza -->
<INPUT TYPE=Submit VALUE="Wylij">
</FORM>

Metod w formularzu moe by take GET (jest to zreszt metoda domylna: jeeli nie wpiszesz w definicji formularza adnej, zostanie
uyta wanie ta). Metody rni si midzy sob sposobem przekazywania danych do serwera. Jeeli uyjesz metody GET, dane z formularza zostan doklejone do adresu skryptu odbierajcego formularz po
znaku zapytania. Adres bdzie wic mia posta:
http://adres.serwera/skrypt.php?pole1=wart1&poleh=warth&..&poleN=wartN

W przypadku formularzy z du liczb danych taka metoda moe by


niewygodna. Ma jednak jedn niewtpliw zalet: mona j stosowa
nie tylko do obsugi formularzy, ale po prostu w czu, ktre uytkownik bdzie nawet mg doda do zakadek.
Metoda POST z kolei przekazuje dane z formularza w inny sposb (po
nagwkach zlecenia HTTP). Danych z formularza nie zobaczysz wic
w adresie, ale mona ich za to przesa o wiele wicej.
W formularzu moesz uywa: pl tekstowych, pl hase, pl wyboru,
przyciskw opcji, obszarw tekstowych, menu, pl wyboru pliku do
przesania. Trudno w tym miejscu szczegowo omawia wszelkie elementy formularzy, dlatego zachcam do zapoznania si z ksik autorstwa Elizabeth Castro Po prostu HTML 4. Wydanie III, a w szczeglnoci z jej 16. rozdziaem (Formularze).
Pobieranie danych z formularza przez skrypt jest trywialnym zadaniem. Dane wpisane w polach formularza s pamitane w specjalnych
tablicach ($_GET i $_POST), a indeksy, pod ktrymi s dostpne, nosz
takie nazwy, jak pola formularza. Jeeli formularz zostanie przesany
metod GET, to wartoci wpisane w polach znajdziesz w odpowiednich
polach tablicy $_GET. Analogicznie jeeli metod przesania formularza
bdzie POST, to dane bdziesz mg odczyta z tablicy $_POST.

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

89

W I C Z E N I E

4.1

Utworzenie prostego formularza

Utwrz program, ktry bdzie wywietla formularz z jednym polem tekstowym, a po


wysaniu tego formularza wywietli wpisan warto.
W zalenoci od tego, czy zmienna $tekst (tekst bdzie nazw pola
w formularzu) przyjmuje jak warto, czy te nie, wywietlisz albo
formularz, albo informacj o tym, co zostao w nim wpisane.
4-01.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Formularz</TITLE>
</HEAD>
<BODY>
<? // Drukuje formularz i jednoczenie odbiera i wywietla wpisane
w nim dane.
if ($_GET['tekst']) { // jest wpisana jaka warto w formularzu
$tekst = $_GET['tekst'];
print "Wpisana warto to <B>$tekst</B><BR>";
print '<A HREF="4-01.php">Powrt do formularza</A>";
} else {
// nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-01.php" METHOD=GET>';
print '<INPUT TYPE="text" NAME="tekst">';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

Warto sprawdzi, jak dziaa skrypt, zarwno z wykorzystaniem metody GET, jak i POST. Pamitaj, e poza zmian metody w formularzu
musisz te zmieni nazw tablicy, z ktrej s odczytywane dane, na
$_POST. Zauwa rnic w adresie po wysaniu formularza za pomoc
jednej i drugiej metody.

90

PHP5. Tworzenie stron WWW wiczenia praktyczne

Wpisz w polu formularza tekst <H1>tekst</H1>. Pojawi si niespodziewany efekt wywietlony tekst zostanie wypisany du czcionk. Dzieje si tak, poniewa wpisany tekst wklejasz bezporednio
do kodu strony. Jeszcze ciekawszy efekt uzyskasz, wpisujc tekst
<script>alert(123);</script>.

Jak widzisz, atwo straci kontrol nad tym, co wywietla strona, jeeli wywietlane na niej dane pochodz bezporednio z formularza.
Sprawa nie jest powana, jeeli chodzi tylko o stron wysyan pojedynczemu klientowi po wpisaniu przez niego danych. Mona sobie
jednak wyobrazi ksig goci z wpisami gromadzonymi w bazie danych i wywietlanymi na danie. Jeeli do bazy bdziesz wpisywa
nieobrobione dane z formularza, efekty dziaania odwiedzajcych (czasem zupenie niepodane) bd ogldali wszyscy. Z tego powodu
powiniene stosowa funkcj oczyszczajc wpisywane dane, szczeglnie takie, ktre mog si pojawi na stronach WWW.
W I C Z E N I E

4.2

Bezpieczne wywietlanie danych

Popraw program z wiczenia 4.1 tak, by przetwarza wpisane dane, aby byy bezpieczne w wywietlaniu. Sprawd jego dziaanie na przykadach z poprzedniego wiczenia.
W przyszoci zapewne przygotujesz wasn funkcj oczyszczajc
wprowadzane dane. W zalenoci od ich charakteru, funkcja powinna wykonywa rne operacje. Na pocztek wykorzystaj wbudowan
funkcj PHP, ktra znaczniki HTML-a przetworzy na bezpieczne do
wywietlenia. W szczeglnoci zamieni znaki wikszoci i mniejszoci
na &gt; i &lt;, co spowoduje, e wpisane znaczniki HTML nie zostan przy ich doczeniu do strony zinterpretowane, lecz wywietlone.
htmlspecialchars

Zamienia znaczniki HTML na kody


bezpieczne do wywietlenia
na stronach WWW.

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

91

4-02.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Formularz</TITLE>
</HEAD>
<BODY>
<? // Drukuje formularz i jednoczenie odbiera i wywietla wpisane
// w nim dane. Dane s przetworzone funkcj htmlspecialchars.
if ($_GET['tekst']) { // jest wpisana jaka warto w formularzu
$tekst = htmlspecialchars ($_GET['tekst']);
print "Wpisana warto to <B>$tekst</B><BR>';
print '<A HREF="4-0h.php">Powrt do formularza</A>";
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-0h.php" METHOD=GET>';
print '<INPUT TYPE="text" NAME="tekst">';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

Program rni si jednym wierszem przetwarzajcym zmienn $tekst:


$tekst = htmlspecialchars ($tekst);

W przypadku standardowych danych trudno dostrzec rnic. Jeeli


jednak uyje si ktrego ze stwarzajcych problemy wpisw z poprzedniego wiczenia, mona zobaczy efekt.

Dyskusyjn spraw jest to, w jaki sposb przetwarza wpisane przez


uytkownika dane. W przykadzie z poprzedniego wiczenia wpisane
przez uytkownika znaczniki zostan po prostu wywietlone. W przyszoci by moe zechcesz je po prostu wyeliminowa.
W I C Z E N I E

4.3

Obliczanie rozwiza rwnania kwadratowego

Utwrz program, ktry bdzie wywietla formularz z moliwoci wpisania trzech danych:
a, b i c, po czym wywietli rozwizanie rwnania kwadratowego: ax + bx + c = 0.
2

92

PHP5. Tworzenie stron WWW wiczenia praktyczne

Przypomnij sobie wiczenie 3.8. Rozwizanie bdzie podobne, ale


pozwoli na interaktywne wpisywanie danych przez odwiedzajcego
stron.
4-03.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Rwnanie kwadratowe</TITLE>
</HEAD>
<BODY>
<? // Pobiera od uytkownika wspczynniki rwnania, a nastpnie
// oblicza wartoci zerowe rwnania kwadratowego.
$a = str_replace (",", ".", $_GET['a']); settype ($a, "double");
$b = str_replace (",", ".", $_GET['b']); settype ($b, "double");
$c = str_replace (",", ".", $_GET['c']); settype ($c, "double");
if ($a || $b || $c) { // wartoci w formularzu s ok
print ("a = $a, b = $b, c = $c<BR>");
if ($a) {
$delta = $b*$b-4*$a*$c;
if ($delta < 0) {
print ('Rwnanie nie ma pierwiastkw rzeczywistych');
} elseif ($delta == 0) {
$x1 = -$b/(h * $a);
print ("Rwnanie ma jeden pierwiastek rzeczywisty: $x1");
} else {
$x1 = (-$b-sqrt($delta)) / (h*$a);
$xh = (-$b+sqrt($delta)) / (h*$a);
print ("Rwnanie ma dwa pierwiastki rzeczywiste: $x1 i $xh");
}
} elseif ($b) {
$x1 = -$c/$b;
print ("Rwnanie ma jeden pierwiastek rzeczywisty: $x1");
} else {
print ('Rwnanie nie ma pierwiastkw rzeczywistych');
}
print '<BR><A HREF="4-03.php">Powrt do formularza</A>';
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-03.php" METHOD=GET>';
print 'a: <INPUT TYPE="text" NAME="a"><BR>';
print 'b: <INPUT TYPE="text" NAME="b"><BR>';
print 'c: <INPUT TYPE="text" NAME="c"><BR>';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

93

W programie wykorzystano funkcj settype, ktra zamienia (o ile si


da) zmienn, bdc jej pierwszym parametrem, na typ okrelony drugim parametrem. Niektre typy, ktre mona zastosowa, to integer,
dodole, string oraz array. Zamiana na typ dodole (czyli na liczb rzeczywist) nie jest niestety doskonaa. Funkcja bierze pod uwag
taki pocztek zmiennej, ktry odpowiada liczbie rzeczywistej, a jeeli
po nim wystpuje cokolwiek innego, zostaje opuszczone.
Przed wywoaniem funkcji settype zostaa wykorzystana funkcja str_
replace, ktra w acuchu stanowicym jej trzeci parametr zamienia
wszystkie wystpienia pierwszego parametru na drugi. Uczyniono to
po to, by umoliwi uytkownikowi oddzielenie czci cakowitej
i uamkowej kadego ze wspczynnikw zarwno znakiem kropki,
jak i przecinka (dlatego przecinek zamieniasz na kropk, ktra jest
standardowym separatorem liczb uamkowych).
W I C Z E N I E

4.4

Pobieranie nazwy i hasa uytkownika

Utwrz program, ktry po podaniu odpowiedniej nazwy uytkownika i jego hasa


wywietli tajn informacj. Jeeli za wpisane dane bd nieprawidowe informacj o bdzie.
Dane o uytkownikach i hasach zapamitaj jawnie w tablicy asocjacyjnej. Oczywicie uytkownik nie bdzie mg ich podejrze. W przyszoci moesz zapamitywa zaszyfrowane informacje w plikach
tekstowych lub w bazie danych, jednak na pocztku takie proste rozwizanie wystarczy.
4-04.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Informacja na haso</TITLE>
</HEAD>
<BODY>
<? // Pobiera od uytkownika nazw i haso. Jeeli dane s prawidowe,
// wywietla tajn informacj, a jeeli nie - informacj o bdzie.
$hasla = array ('admin' => 'hasloadmina15', 'tester' => 'tester15',
'marek' => '1wgd7w3', 'henryk' => '56sghx');

94

PHP5. Tworzenie stron WWW wiczenia praktyczne


if (($_POST['uzytkownik']) && ($_POST['haslo'])) { // wartoci
w formularzu
s wpisane
if ($hasla[$_POST['uzytkownik']] == $_POST['haslo']) {
print ("Tajna informacja to: <B>h*h=4</B>");
} else {
print ("Wpisano niepoprawne dane o uytkowniku i hale.<BR>");
print ('<A HREF="4-04.php">Wr</A> i sprbuj ponownie.');
}
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-04.php" METHOD=POST>';
print '<TABLE><TR><TD>uytkownik: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"uzytkownik\" VALUE=\"".$_POST['uzytkownik'].
"\"></TD></TR>";
print '<TR><TD>haslo: </TD><TD><INPUT TYPE="password" ';
print 'NAME="haslo"></TD></TR></TABLE>';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

W formularzu wykorzystano metod POST, a nie GET. Zrobie tak, aby


nie ujawnia hasa uytkownika w adresie. Taka informacja mogaby
przypadkowo zosta ujawniona nieupowanionym osobom (na przykad poprzez zapamitanie w historii przegldarki lub przypadkowe
dodanie strony do zakadek).
Do wpisania hasa uytkownika w formularzu uyto pola typu password.
Dziki temu wpisywane haso nie jest wywietlane na ekranie (kady
znak jest zastpowany gwiazdk).
Zrobie jeszcze jedno: w formularzu dla pola dzytkownik ustalie warto pocztkow jako zmienn $_POST['dzytkownik']. Stao si tak
dla wygody uytkownika. Zamy, e podczas wypeniania formularza nie zostan wpisane kompletne dane (uytkownik wpisze jedynie nazw, a zapomni o hale). Wwczas po wysaniu formularz zostanie ponownie wywietlony, z wypenionym ju polem z nazw.

W podobny sposb mona wykorzystywa pola innych typw na


przykad menu czy opcji wyboru.

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

95

W I C Z E N I E

4.5

Wywietlanie menu w formularzu I

Napisz program, ktry wywietli menu, a nastpnie pokae wybran przez uytkownika opcj.
Wybran przez uytkownika opcj okrel za pomoc instrukcji switch.
Na podstawie wartoci zmiennej $opcja w $cowyorano zapamitaj j.
Poniewa zostaa wykorzystana metoda POST, w adresie jej nie zauwaysz.
4-05.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Menu w formularzu</TITLE>
</HEAD>
<BODY>
<? // Wywietla formularz z menu, a nastpnie wywietla wybran przez
// uytkownika opcj.
if ($_POST['opcja']) {
// wartoci w formularzu s wpisane
switch ($_POST['opcja']) {
case 'pilka': $cowybrano = 'pika nona'; break;
case 'kosz': $cowybrano = 'koszykwka'; break;
case 'siat': $cowybrano = 'siatkwka'; break;
case 'nar': $cowybrano = 'narciarstwo'; break;
case 'hokej': $cowybrano = 'hokej'; break;
case 'boks': $cowybrano = 'boks'; break;
case 'inny': $cowybrano = 'inny sport'; break;
default: $cowybrano = 'niezidentyfikowana opcja'; break;
}
print ("Uytkownik wybra opcj: <B>$cowybrano</B>.<BR>");
print '<BR><A HREF="4-05.php">Powrt do formularza</A>';
} else {
// nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-05.php" METHOD=POST>';
print '<SELECT NAME="opcja">';
print '<OPTION SELECTED VALUE="">-&gt; wybierz, jak sport
lubisz:';
print '<OPTION VALUE="pilka">pika nona';
print '<OPTION VALUE="kosz">koszykwka';
print '<OPTION VALUE="siat">siatkwka';

96

PHP5. Tworzenie stron WWW wiczenia praktyczne

print
print
print
print
print
print
print

'<OPTION VALUE="nar">narciarstwo';
'<OPTION VALUE="hokej">hokej';
'<OPTION VALUE="boks">boks';
'<OPTION VALUE="inny">inny sport';
'</SELECT>';
'<INPUT TYPE="submit" VALUE="Wylij">';
'</FORM>';

?>
</BODY>
</HTML>

Zauwa, e warto kadej z opcji nie musi nazywa si tak samo,


jak tekst wypisywany uytkownikowi. Jest to do wygodne (czasem
opcje maj dugie nazwy). W celu wywietlenia penego opisu wybranej opcji mona posuy si instrukcj switch. Duo jednak wygodniej
do pamitania nazw opcji uy tablicy asocjacyjnej, o czym przekonasz
si w nastpnym wiczeniu.
W I C Z E N I E

4.6

Wywietlanie menu w formularzu II

Popraw program z poprzedniego wiczenia tak, by nazwy opcji i wartoci zostay


zapisane w tablicy asocjacyjnej, a zmiana treci formularza bya moliwa poprzez
poprawienie jej zawartoci.
Dane o opcjach i ich opisach zapamitaj w tablicy asocjacyjnej. Nazwy opcji bd kluczami, a odpowiednie wartoci wartociami
w tablicy dla tych kluczy.
4-06.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Menu w formularzu</TITLE>
</HEAD>
<BODY>
<? // Wywietla formularz z menu, a nastpnie wywietla wybran przez
// uytkownika opcj.
$opcje = array ('pilka' => 'pika nona', 'kosz' => 'koszykwka',
'siat' => 'siatkwka', 'nar' => 'narciarstwo',
'hokej' => 'hokej', 'boks' => 'boks',

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

97

'inny' => 'inny sport');


if ($_POST['opcja']) {
// wartoci w formularzu s wpisane
$znal = 0;
foreach ($opcje as $klucz => $wartosc) {
if ($klucz == $_POST['opcja']) { $cowybrano = $wartosc;
$znal = 1; }
}
if (!$znal) { $cowybrano = 'niezidentyfikowana opcja'; }
print ("Uytkownik wybra opcj: <B>$cowybrano</B>.<BR>");
print '<BR><A HREF="4-06.php">Powrt do formularza</A>';
} else {
// nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-06.php" METHOD=POST>';
print '<SELECT NAME="opcja">';
print '<OPTION SELECTED VALUE="">-&gt; wybierz, jak sport
lubisz:';
foreach ($opcje as $klucz => $wartosc) {
print ("<OPTION VALUE=\"$klucz\">".$wartosc);
}
print '</SELECT>';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

Trzeba przyzna, e taki sposb rozwizania problemu jest bardzo


wygodny, gdy wszelkie zmiany w treci formularza nanosisz tylko
raz (w tablicy $opcje) i maj one skutek w caym programie, zarwno
przy wywietlaniu formularza, jak i przy jego interpretacji.
Powysze wiczenie jest wstpem do utworzenia ankiety na stronie
WWW. Caociowe rozwizanie tego zadania znajdzie si w rozdziale 6.

W bardzo podobny sposb mona oprogramowa przyciski opcji. Sprbuj samodzielnie zmieni powyszy program tak, by wywietla je
zamiast menu. Rozwizanie znajduje si w pliku 4-06a.php.
W nieco inny sposb naley zaprogramowa pola wyboru, w ktrych
uytkownik moe zaznaczy wicej ni jedn opcj.

98

PHP5. Tworzenie stron WWW wiczenia praktyczne

W I C Z E N I E

4.7

Pole wyboru w formularzu

Napisz program z powyszych przykadw w taki sposb, by uytkownik mg wybra


wicej ni jedn opcj. Uyj pola wyboru.
Kade pole wyboru projektowanego formularza nazwij tak, jak nazywa
si klucz z tablicy asocjacyjnej.
4-07.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Pole wyboru w formularzu</TITLE>
</HEAD>
<BODY>
<? // Wywietla formularz z opcjami wyboru, a nastpnie wywietla
// wybrane przez uytkownika opcje.
$opcje = array ('pilka' => 'pika nona', 'kosz' => 'koszykwka',
'siat' => 'siatkwka', 'nar' => 'narciarstwo',
'hokej' => 'hokej', 'boks' => 'boks',
'inny' => 'inny_sport');
$znal = 0;
foreach ($opcje as $klucz => $wartosc) {
$jest = $_GET[$klucz];
if ($jest) { $cowybrano = $cowybrano.$wartosc." "; $znal = 1; }
}
if ($znal) { // wartoci w formularzu s wpisane
print ("Uytkownik wybra opcje: <B>$cowybrano</B>.<BR>");
print '<BR><A HREF="4-07.php">Powrt do formularza</A>';
} else {
// nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-07.php" METHOD=GET>';
print 'Wybierz, jaki sport lubisz:<P>';

foreach ($opcje as $klucz => $wartosc) {


print ("<INPUT TYPE=\"checkbox\" NAME=\"$klucz\" VALUE=\"1\">");
print ($wartosc."<BR>");
}
print '<P><INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';

?>
</BODY>
</HTML>

Rozdzia 4. Dane pobieranie, przekazywanie i przechowywanie

99

Celowo uyto metody GET, aby w adresie mona byo zobaczy, w jaki sposb s przekazywane informacje o wybranych przy uyciu pl
wyboru opcjach.
W kadym przebiegu ptli foreach jako $kldcz zostanie podstawiona
odpowiednia nazwa klucza, dziki czemu mona odwoa si do zawartoci tablicy $_GET i pobra zmienn formularza o odpowiedniej
nazwie.
Ze wzgldu na to, e uytkownik moe wybra wicej ni jedn opcj
menu, nie wywietlasz tylko jednej z nich, lecz zbierasz w ptli
w zmiennej $cowyorano wszystkie wybrane opcje.
Wyjtkow rol w formularzach speniaj pola ukryte. Jeeli do tej pory nie miae stycznoci z aplikacjami dziaajcymi po stronie klienta
(client-side), moesz wtpi w ich sens. Nic bardziej mylnego s
niezmiernie pomocne podczas przekazywania informacji pomidzy
kolejnymi formularzami przedstawianymi uytkownikowi do wypenienia. Na pewno docenisz je po wykonaniu poniszego wiczenia.
W I C Z E N I E

4.8

Uycie kilku formularzy

Napisz program, ktry w pierwszym formularzu zbierze informacje o tym, jakim towarem jest zainteresowany uytkownik, a w drugim, jak si nazywa. Po wpisaniu wszystkich potrzebnych danych program powinien wywietli zebrane informacje.
Tym razem instrukcja warunkowa bdzie bardziej skomplikowana
wszak musisz, w zalenoci od sytuacji, wywietli dwa formularze
lub kocowy wynik. Pierwszy warunek bdzie informowa, e uytkownik nie wybra jeszcze adnego towaru, drugi e nie poda
swoich danych. Jeeli oba bd spenione, zostanie wywietlona informacja o wyborze uytkownika.
4-08.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Co chciaby</TITLE>
</HEAD>
<BODY>

100

PHP5. Tworzenie stron WWW wiczenia praktyczne


<? //
//
//
//

Pozwala na wybr towarw, a nastpnie na wpisanie danych


uytkownika. Po wpisaniu wywietla informacje o wyborze
i uytkowniku. Informacje o wybranych towarach s przekazywane
przez ukryte pola formularza.

if (!($_POST['zak1'] || $_POST['zakh'])) { // nie wybrano adnego


towaru
print '<FORM ACTION="4-08.php" METHOD=POST>';
print '<INPUT TYPE="checkbox" NAME="zak1" VALUE="1">Towar 1<BR>';
print '<INPUT TYPE="checkbox" NAME="zakh" VALUE="1">Towar h<BR>';
print '<INPUT TYPE="submit" VALUE="Wylij"></FORM>';
} elseif (!($_POST['imienazwisko'])) {
// s wpisane dane o towarach, ale nie o osobie
if ($_POST['zak1']) { print 'Wybrano towar 1<BR>'; }
if ($_POST['zakh']) { print 'Wybrano towar h<BR>'; }
print '<FORM ACTION="4-08.php" METHOD=POST>';
print "<INPUT TYPE=\"hidden\" NAME=\"zak1\" VALUE=\"".$_POST
['zak1']."\">";
print "<INPUT TYPE=\"hidden\" NAME=\"zakh\" VALUE=\"".$_POST
['zakh']."\">";
print 'Podaj imi i nazwisko:<BR>';
print '<INPUT TYPE="text" NAME="imienazwisko">';
print '<INPUT TYPE="submit" VALUE="Wylij"></FORM>';
} else { // masz ju wszystkie dane
if ($_POST['zak1']) { print 'Wybrano towar 1<BR>'; }
if ($_POST['zakh']) { print 'Wybrano towar h<BR>'; }
print "<BR>Zamawiajcy: $imienazwisko<BR>";
}
?>
</BODY>
</HTML>

Warto zauway, e informacje o wybranych towarach s przekazywane pomidzy pierwszym formularzem i stron kocow poprzez
ukryte pola, zaszyte w drugim formularzu.

Czsto si zdarza, e chcesz dane wpisane przez uytkownika w formularzu otrzyma poczt elektroniczn. Jeeli korzystasz z systemu
Unix, sprawa jest atwa istnieje funkcja mail, ktra si tym zajmie.
Wywoanie jej w postaci:
mail ('odbiorcamadres.pl', 'Wiadomo testowa', 'Tak dziaa funkcja mail',
"From: wwwadmin@serwer.pl\r\n");

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 101

spowoduje posanie na adres (bdcy parametrem) e-maila z tematem


Wiadomo testowa i treci: Tak dziaa funkcja mail. Nadawc
listu bdzie wwwadmin@serwer.pl (jako czwarty parametr mona okreli nagwki listu oddzielone od siebie znakami nowego wiersza).
Jeeli korzystasz z Krasnala, wysyanie maili powinno od razu dziaa
poprawnie. Natomiast jeeli pracujesz na jakiej innej dystrybucji,
musisz uwierzy, e ta funkcja dziaa poprawnie, mimo e prawdopodobnie w Twoim systemie spowoduje bd. Umie j w programie tam, gdzie jest to konieczne, ale na razie w komentarzu, a jeszcze lepiej w instrukcji warunkowej. Po przeniesieniu na linuksowy
produkcyjny serwer wysyanie poczty elektronicznej powinno dziaa bezproblemowo. Podobnie stanie si, jeeli odpowiednio skonfigurujesz serwer Windows (albo wpisujc odpowiednie IP serwera SMTP
w pliku php.ini i bdc z nim poczonym, albo instalujc serwer
SMTP na wasnym komputerze).

Cookies
Jeeli ju miae do czynienia z programowaniem po stronie serwera
lub uywae JavaScriptu w bardziej zaawansowany sposb, pewnie
wiesz, czym s cookies. Jeeli nie, zapewne informacja posaem
uytkownikowi ciasteczko wywouje u Ciebie konsternacj. Zwr
uwag, e takie ciasteczko (ang. cookie) nie jest sposobem osodzenia
ycia osobom ogldajcym stron (cho kady twrca stron powinien
ich houbi), a jedynie prost metod zapamitania pewnych danych
o kliencie w jego przegldarce.
Zasada jest prosta. O ile uytkownik wyrazi na to zgod (decyduj
o tym ustawienia jego przegldarki), masz prawo zapisa pewne dotyczce go informacje na jego dysku. Warto zapamita, e:
1. tylko Twj serwis bdzie mg pozyska je z powrotem;
2. uytkownik moe zabroni ich zapisu i nadzorowa dowolnie
ich tre.
Oba fakty (jeli wzi pod uwag prawo kadego do prywatnoci) wydaj si bardzo sensowne. Pomimo tych ogranicze cookies mog by
bardzo przydatne webmasterowi. Moesz je na przykad wykorzystywa, by umoliwi osobom, ktre wyra na to zgod, zapamitanie ich
danych przy kolejnym wypenianiu formularza. To due uatwienie
dla odwiedzajcych, a wiele osb udostpnia w ten sposb swoje dane

102

PHP5. Tworzenie stron WWW wiczenia praktyczne

zaufanym serwisom, aby nie musie wpisywa informacji o sobie


wielokrotnie. Wiele serwisw stosuje cookies, by ledzi dziaania
uytkownikw i tworzy jego profil (w rnych celach marketingowych czy handlowych). Takie dziaanie jest zreszt czsto uwaane
za wtpliwe pod wzgldem etycznym.
Jeeli kto ju robi zakupy w ksigarni Amazon lub chociaby korzysta z jej wyszukiwarki, nie powinien si zdziwi, gdy wchodzc
ponownie na jej stron, zauway ksiki, ktre s zwizane z jego
zainteresowaniami. Kiedy nawet ksigarnia ta sprawdzaa, czy klient
korzysta ju z jej oferty, czy te nie, i jako nowemu dawaa nisze
ceny. Dwie osoby przegldajce informacje o danej ksice mogy
zobaczy j z cakiem rnymi cenami. Wywoao to wielkie oburzenie klientw, co zaowocowao zaniechaniem wspomnianej praktyki.
Mona by pewnym, e za takim dziaaniem na pewno kryy si
cookies, ktre ksigarnia wysaa uytkownikowi i wykorzystywaa,
by oceni, czy jest nowym, czy starym klientem, a take jakie s jego
zainteresowania.
Warto przez pewien czas poobserwowa, jak i jakie informacje wysyaj rne serwisy w postaci cookies. Istnieje moliwo ustawienia
sobie opcji informowania o ich otrzymywaniu w przegldarce:
q w Internet Explorerze w formularzu Opcje internetowe w zakadce
Zabezpieczenia i w opcji Poziom niestandardowy dla ustawie
cookies wcz dwa razy opcj Monituj,
q w Mozilli w formularzu Preferences w sekcji Advanced w grupie
Cookies zaznacz opcj Warn me before accepting a cookie.
Od tej pory, jeeli jaki serwis bdzie prbowa wysa cookie, bdziesz
o tym informowany.
Cookie zawiera kilka informacji, a wrd nich:
q nazw i warto (nie mog zawiera spacji),
q termin wanoci (jeeli nie jest podany, uznaje si, e wygasa
wraz z wyczeniem przegldarki),
q informacj domain, okrelajc serwer, ktrego dotyczy cookie

(standardowo jest to ten serwer, ktry ciasteczko wysa,


ale na przykad wpisanie .domena.pl pozwala na dostp do niego
z domen typu domena.pl, www.domena.pl, online.domena.pl,
serwis.domena.pl itd.),

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 103
q informacj path, ktra okrela, dla jakiego podkatalogu serwisu

cookie ma by widoczne (zazwyczaj chcesz, aby byo widoczne


w caym serwisie i ustawiasz path=/).
Musisz mie wiadomo, e nie wszyscy uytkownicy bd odbiera Twoje cookies. Naroso wok nich wiele mitw, a prasa popularna
podawaa nie zawsze prawdziwe informacje o zagroeniach, ktre ze
sob nios (czasem nazywajc je nawet programami, ktre serwis
umieszcza na dysku uytkownika!). W zwizku z tym istnieje grono
osb, ktre maj wyczone ich przyjmowanie.
Nie znaczy to jednak, e nie powinno si korzysta z cookies. Warto
wykorzystywa je w takich zastosowaniach, w ktrych mog uatwi
uytkownikowi wizyt na stronie, lub ktre pozwol Ci na zbieranie
informacji statystycznych oraz takich, ktre moesz uzyska, ale nie s
koniecznie potrzebne do dziaania serwisu. Cigle powiniene jednak
dba, by ten poprawnie dziaa u uytkownika, ktry ma wyczone
przyjmowanie cookies.
W I C Z E N I E

4.9

Zliczanie liczby wywietle strony I

Napisz program, ktry bdzie zlicza, ile razy uytkownik wywietli dan stron w czasie
dziaania jego przegldarki.
To bardzo typowy przykad zastosowania cookie. Bdziesz w nim
przechowywa informacj o liczbie wywietle danej strony. Cookie
bdzie nosio nazw ile, a jego wartoci bdzie liczba wywietle
strony. Dostp do informacji jest trywialny i bardzo podobny do odczytu danych z formularza. Warto ciastka o nazwie ile jest pamitana w specjalnej tablicy $_COO$_E w polu ile, wic moesz j odczyta
poprzez $_COO$_E['ile'].
W celu przesania uytkownikowi cookie posu si poleceniem
setcookie.
setcookie Posya uytkownikowi cookie. Funkcja posiada sze

parametrw: pierwszy okrela nazw, drugi warto


cookie, trzeci to termin wanoci, czwarty to
informacja path, pity domain, a ostatni parametr
to znacznik, ktry okrela, czy cookie moe by
wysyane jedynie przy bezpiecznym poczeniu
(SSL), i domylnie przyjmuje warto 0.

104

PHP5. Tworzenie stron WWW wiczenia praktyczne

4-09.php
<? // Program zlicza liczb wywietle przez uytkownika danej strony
// w czasie dziaania przegldarki. Informacja jest zbierana w cookie.
setcookie ('ile', ++$_COOKIE['ile']);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Ile razy?</TITLE>
</HEAD>
<BODY>
<?
print "Stron odwiedzie ".$_COOKIE['ile']." razy w czasie
biecego ";
print "uruchomienia przegldarki";
?>
</BODY>
</HTML>

Pomimo e funkcja setcookie moe mie a sze parametrw, moesz


j wywoywa z mniejsz ich liczb. W naszym programie podajesz
jedynie pierwsze dwa nazw i warto. Pozostae przyjm wartoci
domylne.
Powyszy skrypt nie ma zbyt wiele wsplnego ze zwykym licznikiem
cigle naley pamita, e zlicza odwiedziny kadego uytkownika
oddzielnie.
Skrypt przy kadym wywoaniu odczytuje warto cookie o nazwie ile
(poprzez zmienn $_COO$_E['ile']) i powiksza j o 1. Obie te operacje
s wykonywane jedn instrukcj przy uyciu przedrostkowego operatora inkrementacji. Jeeli uytkownik nie mia do tej pory takiej informacji, zostanie ona ustalona na 1. Po uaktualnieniu wartoci skrypt
wywietla informacj o dotychczasowej liczbie odwiedzin. Zapamitaj,
e funkcja setcookie musi by wywoywana zawsze przed wysaniem
czegokolwiek do przegldarki, nawet spacji czy pustego wiersza.

Wad programu jest to, e zlicza odwiedziny jedynie w czasie dziaania przegldarki. Po jej ponownym wczeniu rozpocznie obliczenia
od 1. Aby to poprawi, powiniene ustali termin wanoci cookie.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 105
W I C Z E N I E

4.10

Zliczanie liczby wywietle strony II

Napisz program, ktry bdzie zlicza liczb wywietle strony przez uytkownika
nawet po wyczeniu przez niego przegldarki.
Zadanie jest bardzo proste. W celu jego realizacji uyj trzeciego argumentu funkcji setcookie daty wanoci ciastka.
4-10.php
<? // Program zlicza liczb wywietle przez uytkownika danej strony.
// Informacja jest zbierana w cookie, ktrego wano wynosi 30 dni.
setcookie ('ileh', ++$_COOKIE['ileh'], time()+h59h000);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Ile razy?</TITLE>
</HEAD>
<BODY>
<?
print "Stron odwiedzie ostatnio ".$_COOKIE['ileh']." razy.";
?>
</BODY>
</HTML>

Cookie celowo zostao nazwane inaczej ni w poprzednim przykadzie,


aby podczas testowania nie byo niejasnoci. Pamitaj, e programy
z obu wicze (4.9 i 4.10) mog zobaczy oba ciastka: ile i ile2.
Nie ma tu znaczenia, ktry z nich ktremu nada warto.
Chcesz okreli termin wanoci cookie na miesic. Uywasz funkcji time, by ustali biecy znacznik czasu. Obliczasz liczb sekund
w 30 dniach (60 sekund *60 *24 *30), co daje wynik 2 592 000. Ustalasz wic termin wanoci, dodajc t warto do biecego znacznika czasu.
W programie fakt, e termin wanoci zosta ustawiony na miesic, nie
oznacza, e cookie wyganie po 30 dniach. Jeeli strona w tym czasie
bdzie odwiedzona, zostanie odwieona warto cookie ile2, z nowym (znowu miesicznym) terminem wanoci. Cookie straci wic
swoj wano po 30 dniach od ostatnich odwiedzin uytkownika
na stronie.

106

PHP5. Tworzenie stron WWW wiczenia praktyczne

Powysze przykady nie s w praktyce szczeglnie przydatne. Sprbuj teraz wykorzysta poznan technologi do realizacji uytecznych zada.
W I C Z E N I E

4.11

Przechowywanie informacji w cookies

Napisz program, ktry wywietla formularz pobierajcy imi i nazwisko uytkownika. Jeeli uytkownik wyrazi na to zgod, program powinien zapamita wpisane
dane w cookies w celu uproszczenia ponownego wypenienia formularza.
W wywietlanym formularzu uwzgldnij pole wyboru, ktre pozwoli
uytkownikowi na decyzj, czy chce, by jego dane zostay zapamitane,
czy te nie. Kademu uytkownikowi posyasz cookies w zalenoci
od jego wyboru z wpisanymi wartociami lub z wartociami pustymi,
by usun ewentualne poprzednio zapisane informacje.
4-11.php
<? // Drukuje formularz i jednoczenie odbiera i wywietla wpisane
// w nim dane. Informacje s zapisywane w cookie.
$imie = htmlspecialchars ($_POST['imie']);
$nazwisko = htmlspecialchars ($_POST['nazwisko']);
$imiecookie = htmlspecialchars ($_COOKIE['imiecookie']);
$nazwiskocookie = htmlspecialchars ($_COOKIE['nazwiskocookie']);
if (($nazwisko) && ($imie)) { // s wpisane wartoci w formularzu
if ($_POST['pamietac']) {
setcookie ("imiecookie", "$imie", time()+h59h0000);
setcookie ("nazwiskocookie", "$nazwisko", time()+h59h0000);
} else {
setcookie ("imiecookie", "");
setcookie ("nazwiskocookie", "");
}
}

?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Pamitasz imi i nazwisko</TITLE>
</HEAD>
<BODY>
<?

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 107
if (($nazwisko) && ($imie)) { // s wpisane wartoci w formularzu
print "Wpisana warto to <B>$imie $nazwisko</B>.<BR>";
print '<A HREF="4-11.php">Powrt do formularza</A>';
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-11.php" METHOD=POST>';
print '<TABLE><TR><TD>nazwisko: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"nazwisko\" VALUE=\"$nazwiskocookie\"></TD></TR>";
print '<TR><TD>imi: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"imie\" VALUE=\"$imiecookie\"></TD></TR></TABLE>";
print 'Chc, eby program pamita dane: <INPUT TYPE="checkbox"';
print 'NAME="pamietac"><BR>';
print '<BR><INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>

Poniewa odebrane dane zostan wywietlone na stronach WWW, po


odebraniu danych z formularza przetwarzasz je funkcj htmlspecialchars, aby unikn niepodanych efektw, takich jak w wiczeniu 4.1.
Moesz zapyta jednak, w jakim celu uyto tej funkcji do przetworzenia wartoci cookies? Pamitaj, e musisz do nich podchodzi tak
samo nieufnie, jak do wartoci pl formularzy uytkownik, chcc
zaszkodzi, moe manipulowa wartociami cookies podobnie, jak wartociami wpisanymi w formularzu!
Jeeli chcesz zapamita jakie dane osobowe uytkownika swojego
serwisu, dobrym zwyczajem jest zapytanie go najpierw, czy rzeczywicie tego chce. Ciekawym rozwizaniem jest to zaprezentowane
w tym wiczeniu w postaci pola wyboru. By moe uytkownik
bdzie korzysta z cudzego komputera, przegldajc serwis (np. w kawiarni internetowej). Dziki polu w formularzu bdzie mg atwo
zadecydowa, czy chce, by jego dane zostay zapamitane na komputerze, czy te nie.
W I C Z E N I E

4.12

Losowe wywietlanie bannera

Napisz program, ktry wywietla uytkownikowi banner reklamowy (wylosowany


jeden z piciu).

108

PHP5. Tworzenie stron WWW wiczenia praktyczne

Postaraj si, by o ile to moliwe uytkownik przy kolejnej wizycie na stronie w pierwszej kolejnoci oglda te bannery, ktrych
jeszcze nie widzia.
Dla kadego bannera w cookie zapamitaj informacj, i by ju wywietlony danemu uytkownikowi. Pi bannerw zamieszczono
w katalogu bannery w przykadach na serwerze.
4-12.php
<? // System wywietlania bannerw, ktry stara si, by uytkownikowi
// nie wywietli powtrnie bannera, dopki nie obejrzy przynajmniej
// raz wszystkich.
for ($i=1; $i<=5; $i++) { // sprawdzasz, ktre bannery ju wywietlano
$jest = $_COOKIE['banner'.$i];
if (!($jest)) { $tab[] = $i; $znaleziono = 1; }
}
// jeeli nie wywietlano, wczasz do tabeli wszystkie.
if (!($znaleziono)) { for ($i=1; $i<=5; $i++) { $tab[$i-1] = $i; }}
$nr= $tab[rand()%count($tab)];
setcookie ("banner".$nr, "1", time()+86400);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Losowy (prawie?) banner</TITLE>
</HEAD>
<BODY>
<?
print "<IMG SRC=\"bannery/$nr.gif\">";
?>
</BODY>
</HTML>

W pierwszej ptli for sprawdzasz, ktre bannery nie byy jeszcze wywietlane. Jeeli taki znajdziesz, wpisz jego numer do tabeli. Warto
zauway, e kolejna dana jest dopisana do tablicy w niespotykany
jeszcze sposb: $tao[ ] odwouje si do pierwszego wolnego pola w tabeli jest to bardzo wygodna i czsto stosowana konstrukcja.
Jeeli nie znaleziono adnego bannera, ktry nie by jeszcze wywietlony, uznajesz, e uytkownik widzia ju wszystkie. W zwizku z tym
mona mu wywietli dowolny z nich wic wszystkie dopisujesz
do tablicy. Nastpnie losujesz numer z tabeli (zwr uwag na sposb,

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 109

w jaki okrelasz liczb jej elementw, uywajc funkcji codnt). Na kocu


posyasz uytkownikowi informacj o wylosowanym bannerze i wywietlasz go.
W poprzednim wiczeniu (przy podawaniu danych osobowych) pozostawienie odbiorcy decyzji, czy chce, by te informacje byy pamitane,
miao gboki sens. W przypadku tego wiczenia oczywicie takiego
sensu nie ma. Niezalenie od tego, z jakiego komputera korzysta uytkownik, pozostawienie informacji, ktry losowy banner ju widzia,
nie ma adnego znaczenia.
Warto pomyle, jak zmodyfikowa program, by przesya tylko jedno
cookie informacyjne, a nie inne dla kadego bannera. Jeden serwis
moe posa danemu uytkownikowi tylko niewielk liczb ciasteczek, wic powiniene je szanowa. Sprbuj zmodyfikowa program
tak, by w jednym przesyanym cookie informacje o wywietlonych
bannerach byy oddzielone przecinkami.
Naley zauway, e w obu powyszych praktycznych przykadach
skrypty bd dziaay poprawnie, nawet jeeli uytkownik nie odbierze ciasteczek. Pierwszy po prostu nie podpowie mu jego danych
w formularzu, jednak poprawnie go wywietli i odbierze wpisane
dane. Drugi program w przypadku braku informacji bdzie po prostu
wywietla losowy banner. W adnym wypadku programy nie strac
jednak swojej funkcjonalnoci.

Obsuga plikw
Do tej pory dane dla tworzonych przez Ciebie programw byy wpisywane z klawiatury, a wyniki wypisywane na ekranie. Przydaaby si
jednak take metoda pamitania informacji w jaki trwalszy i atwy
do przekazania programowi sposb. Taki warunek speniaj pliki
dyskowe. PHP potrafi zapisywa i odczytywa pliki w systemie operacyjnym serwera. Naley podkreli jeszcze raz: jeste w stanie (zgodnie z uprawnieniami, ktre zostan tam nadane odpowiednim katalogom i plikom) tworzy, zapisywa, odczytywa i usuwa pliki na
serwerze. Na serwerze, a nie na komputerze uytkownika.
Zapis i odczyt plikw moe by niezwykle przydatny do zapamitania
niewielkich iloci informacji zarwno dla caego serwisu, jak i dla pojedynczego uytkownika. Tak naprawd mechanizm sesji przedstawiony

110

PHP5. Tworzenie stron WWW wiczenia praktyczne

w kolejnym punkcie opiera si wanie na plikach tekstowych. Jeeli


bdziesz chcia pamita wicej informacji, lepsz metod okae si
skorzystanie z bazy danych (punkt 4.5), ale jeeli jest ich niewiele,
mona uy plikw tekstowych.
Najprostsza operacja na pliku skada si z trzech etapw: otwarcia
pliku, zapisu lub odczytu z niego danych i zamknicia pliku.
W I C Z E N I E

4.13

Tworzenie pliku i zapis danych

Napisz program, ktry w podkatalogu dane utworzy plik z Twoim imieniem i nazwiskiem.
Na pocztku naley utworzy katalog dane, w ktrym powstanie plik.
Jeeli korzystasz z systemu Windows, sprawa jest prosta: po prostu
utwrz go jako podkatalog tego, w ktrym przechowujesz pliki PHP.
Jeeli natomiast korzystasz z serwera linuksowego, musisz jeszcze
nada odpowiednie prawa katalogowi, w celu umoliwienia wszystkim zapisu. Pozwoli na to program FTP, ktrego uywasz (jeeli nie,
koniecznie go zmie!). Ustaw dla katalogu prawa na 666.
Wykorzystaj trzy funkcje operujce na plikach.
fopen

Otwarcie pliku o nazwie okrelonej pierwszym


parametrem, w trybie okrelonym drugim parametrem.
Na przykad r oznacza otwarcie do odczytu,
a w do zapisu. Funkcja zwraca uchwyt pliku,
poprzez ktry moesz si do niego odwoywa.

fpdts

Pozwala na zapis tekstu, ktry jest drugim parametrem,


do pliku okrelonego uchwytem w pierwszym
parametrze.

fclose Zamyka wskazany przez uchwyt plik.


4-13.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Zapisujesz plik</TITLE>
</HEAD>
<BODY>
<? // Program tworzy plik tekstowy z imieniem i nazwiskiem.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 111
$plik = mfopen ("dane/imienazwisko.txt", "w");
if (!($plik)) {
print "BD: Nie da si utworzy pliku.";
} else {
print "Plik z imieniem i nazwiskiem zosta utworzony.";
fputs ($plik, "Andrzej Kierzkowski");
fclose ($plik);
}

?>
</BODY>
</HTML>

Zwr uwag na znak @ przed wywoaniem fopen dziki niemu informujesz PHP, e ewentualne bdy w wykonaniu nie maj by wysyane do przegldarki. Po prbie otwarcia pliku dobrym zwyczajem
jest zweryfikowanie, czy operacja si powioda. Czynisz to poprzez
sprawdzenie, czy uchwyt (zmienna $plik) ma ustalon warto. Jeeli
pracujesz w systemie Windows, a program zakoczy dziaanie bdem, najprawdopodobniej nie zaoye katalogu dane lub zaoye
go w zym miejscu (powinien by podkatalogiem tego, w ktrym
znajduje si program z biecego wiczenia). Jeeli program zakoczy dziaanie pomylnie, poszukaj utworzonego pliku i sprawd jego
zawarto.
W I C Z E N I E

4.14

Odczyt danych z pliku

Napisz program, ktry odczyta utworzony w poprzednim wiczeniu plik i wywietli


jego zawarto.
Tym razem otworzysz plik w trybie do odczytu. Uyj funkcji, ktra
odczytuje dane z pliku.
fgets

Odczytuje z pliku wskazanego przez pierwszy argument


liczb znakw w biecym wierszu, okrelon przez
drugi, opcjonalny, argument.

4-14.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Odczytywanie pliku</TITLE>
</HEAD>

112

PHP5. Tworzenie stron WWW wiczenia praktyczne


<BODY>
<? // Program odczytuje plik tekstowy z imieniem i nazwiskiem.
$plik = mfopen ("dane/imienazwisko.txt", "r");
if (!($plik)) {
print "BD: Nie da si otworzy pliku.";
} else {
$wiersz = fgets ($plik, h55);
print "Dane z pliku: <B>$wiersz</B>";
fclose ($plik);
}

?>
</BODY>
</HTML>

Aby sprawdzi, czy plik istnieje, moesz wykorzysta w tym celu


funkcj file_exist.
file_exists

Zwraca prawd, gdy istnieje plik, ktrego


nazw podaje si jako parametr, a fasz
w przeciwnym razie.

Pomyl, jak poprawi program, by najpierw sprawdza, czy plik istnieje, a dopiero potem go otwiera.

Ciekawy jest fakt, e za pomoc funkcji z poprzedniego wiczenia


moesz odczytywa pliki nie tylko z serwera, ale take inne dostpne
w internecie za porednictwem protokow HTTP i FTP.
W I C Z E N I E

4.15

Zmiana sposobu wywietlania odczytanej strony WWW

Napisz program, ktry odczyta zawarto gwnej strony serwisu http://helion.pl


i wywietli j, zamieniajc najpierw kolor ta z niebieskawego na zielony.
W celu wykonania tego wiczenia serwer, na ktrym uruchamiasz programy PHP, musi by podczony do internetu, aby program mg
odczyta stron Helionu.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 113
4-15.php
<? // Program odczytuje stron helion.pl i wywietla, podmieniajc kolory.
$plik = fopen ("http://helion.pl", "r");
if (!($plik)) {
print "BD: Nie da si otworzy strony http://helion.pl";
} else {
while (!(feof($plik))) {
$wiersz = (fgets ($plik, h55));
$wiersz = str_replace ('#E4E7ED', '#AhFFB5', $wiersz);
$wiersz = str_replace (' SRC="', ' SRC="http://helion.pl', $wiersz);
print "$wiersz";
}
fclose ($plik);
}
?>

Nie wypisujesz nagwkw HTML, liczc na to, e strona ma swoje. Po odczytaniu przetwarzasz plik wiersz po wierszu, uywajc funkcji feof.
feof

Zwraca prawd, gdy osignito koniec pliku, okrelonego


pierwszym parametrem, a fasz w przeciwnym razie.

W kadym wierszu dokonujesz dwch operacji: po pierwsze zamieniasz kolor z niebieskawego (#E4E#E4) na zielony (#A2FFB5) a po drugie
poprawiasz adresy wszystkich ilustracji, by zawieray rwnie adres
serwera (w innym przypadku nie byoby ich wida, poniewa program szukaby ich na Twoim serwerze).
Efekt jest ciekawy, cho niebieski kolor komponuje si znacznie
lepiej. Zauwa, e ukad strony si nieco rozsypa. Sprbuj odgadn, co jest tego przyczyn. Przyjrzyj si, jak s odczytywane pliki
z definicjami styli.

W praktyce najczciej pliki pamitane na dysku bd wsplne dla


wszystkich odwiedzajcych znajd si w nich informacje, ktrymi
bd si oni mogli dzieli. Istnieje w zwizku z tym ryzyko, e dwie
osoby jednoczenie bd pracowa na jednym pliku, co moe spowodowa niemae kopoty.

114

PHP5. Tworzenie stron WWW wiczenia praktyczne

Wyobra sobie sytuacj, gdy w pliku jest pamitany aktualny stan


licznika odwiedzin danej strony. Sam licznik dziaa w taki sposb,
e odczytuje warto z tego pliku, zwiksza j o 1 i zapisuje z powrotem (i oczywicie wywietla warto odwiedzajcemu). Nieszczliwy
przypadek moe spowodowa, e dwie osoby niemale jednoczenie
uruchamiaj program. Dziaania mog przybra opisany niej, niekorzystny dla Ciebie przebieg.
1. Pierwszy uytkownik odczyta warto z pliku.
2. Drugi uytkownik odczyta t sam warto z pliku.
3. Pierwszy uytkownik zwikszy warto o 1 i zapisze.
4. Drugi uytkownik zwikszy warto o 1 i zapisze.
Jaki bdzie efekt? Stron odwiedziy dwie osoby, a wskazanie licznika
wzronie tylko o 1! Stanie si tak dlatego, e dwie osoby bd miay
dostp do pliku w jednym czasie, podczas gdy odczyt, zwikszenie
i zapisanie wartoci z powrotem powinno si odby w czasie, gdy inne
osoby nie mog nawet odczyta wartoci licznika.
Jest to moliwe do zrealizowania poprzez zablokowanie pliku na czas
trwania operacji.
flock

Ustawia blokad pliku, ktrego uchwyt jest pierwszym


argumentem w trybie okrelonym przez drugi.
Na przykad tryb 2 oznacza blokowanie na wyczno,
a tryb 3 odblokowanie.

W I C Z E N I E

4.16

Prosty licznik tekstowy

Napisz program, realizujcy prosty licznik tekstowy, ktrego wskazanie jest pamitane w pliku tekstowym. Pamitaj o blokowaniu pliku.
Plik ze wskazaniem licznika zapamitaj w katalogu dane. Program
sprawdzi najpierw, czy plik licznika ju istnieje, a jeli takiego pliku
nie ma, zajmie si jego utworzeniem.
4-16.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Licznik</TITLE>
</HEAD><BODY>

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 115
<? // Program pokazuje dziaanie prostego licznika tekstowego.
if (!(file_exists("dane/liczba.txt"))) { // nie ma pliku z licznikiem
$plik = fopen ("dane/liczba.txt", "w+");
fputs ($plik, "0");
// wic go tworzysz
fclose ($plik);
}
$plik = fopen ("dane/liczba.txt", "r+");
if (!($plik)) {
print "BD: Nie da si otworzy pliku.";
} else {
flock ($plik, h);
$ile = fgets ($plik, h55);
$ile++;
print "Licznik wskazuje $ile.";
fseek ($plik, 0);
fputs ($plik, "$ile");
flock ($plik, 3);
fclose ($plik);
}

?>
</BODY>
</HTML>

Jeeli plik nie istnieje, otwierasz go w trybie w+ (tryb ten pozwala na


otwarcie istniejcego pliku do zapisu, uprzednio usuwajc jego zawarto, a jeli nie istnieje tworzy go). Jeeli plik istnieje, otwierasz go
w trybie r+, co pozwala na czytanie i zapis do niego.
Po odczytaniu danych wskanik przesun si poza liczb odwiedzin.
Jeeli wpisaby now, zostaaby dopisana na kocu pliku, po pierwotnej. Aby wpisa j znw we waciwym miejscu, naley przesun
si z powrotem do pocztku pliku. W tym celu uyto funkcji fseek.
fseek

Przesuwa wskanik pooenia w pliku, ktrego uchwyt


jest pierwszym argumentem, w miejsce wskazane
przez drugi.

Warto zauway, e blokada pliku nastpia po jego otwarciu (musi


tak by, inaczej zmienna plikowa nie byaby okrelona), a odblokowanie przed zamkniciem. W czasie istnienia blokady pliku dokonujesz na nim wszystkich operacji: odczytu, przesunicia wskanika i zapisu.

116

PHP5. Tworzenie stron WWW wiczenia praktyczne

W wiczeniach przedstawionych do tej pory pliki umieszczano w podkatalogu tego, w ktrym wystpuj dokumenty PHP, co oznacza,
e znajduj si one w drzewie katalogw serwera WWW. Nietrudno
przewidzie, co to oznacza. Zamiast http://localhost/cwphp/4-14.php
wystarczy w przegldarce wpisa adres http://localhost/cwphp/dane/
imienazwisko.txt, a wwczas to, co by moe miao by ukryte, stanie
si cakiem jawne. Niejednokrotnie powane serwisy postpuj w taki
sposb, ujawniajc nawet dane dotyczce swoich klientw. Jeeli koniecznie chcesz przechowywa pliki z informacjami w strukturze
katalogw serwisu, koniecznie zabezpiecz je metod, ktr poznae
w wiczeniu 2.4. Pamitaj jednak, e nie jest to zabezpieczenie bardzo
pewne, dlatego duo lepiej jest umieszcza pliki poza struktur serwisu.
Moesz te utworzy w katalogu plik .htaccess i umieci w nim polecenie 4eny from all, ktre uniemoliwia odczytanie za pomoc serwera
plikw lecych wewntrz. Warto te zwrci uwag, e masz dostp
do caego dysku serwera, ktry jest ograniczony jedynie nadanymi
prawami do katalogw. Aby odwoywa si do pliku, ktry znajduje
si poza struktur serwisu, najlepiej uywaj cieki bezwzgldnej (zaczynajcej si od katalogu gwnego struktury plikw). Moesz wic
prbowa tworzy pliki o nazwach /home/httpd/aki/mojplik.txt (o ile
nadae katalogowi aki odpowiednie prawa) czy C:\usr\apache\plik.txt.
Pomimo faktu, e pliki dyskowe zazwyczaj tworzy si po to, by wymienia informacje pomidzy poszczeglnymi uytkownikami, jest
moliwe atwe utworzenie unikatowego pliku tymczasowego dla jednego uytkownika. W tym celu wykorzystuje si funkcj tempnam.
tempnam

Tworzy plik o unikatowej nazwie w katalogu


okrelonym pierwszym parametrem. Pocztek nazwy
mona okreli drugim parametrem. Plik zwraca
nazw utworzonego pliku.

W I C Z E N I E

4.17

Przechowywanie informacji w pliku tymczasowym

Napisz program, ktry bdzie zbiera informacje o uytkowniku, podobnie jak ten
z wiczenia 4.8.
Dane niech bd jednak zbierane w pliku tymczasowym, ktrego
nazwa bdzie przekazywana w ukrytym polu.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 117

Bezpieczn lokalizacj dla plikw tymczasowych w systemie Windows


jest C:\WINDOWS\ TEMP, a w Linuksie katalog /tmp. Jeeli w wywoaniu funkcji tempnam podasz nazw nieistniejcego katalogu, plik
zostanie zaoony w domylnym katalogu plikw tymczasowych
w systemie.
4-17.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Co chciaby -- h</TITLE>
</HEAD><BODY>
<? // Pozwala na wybr towarw, a nastpnie na wpisanie danych
// uytkownika. Po wpisaniu wywietla informacje o wyborze
// i uytkowniku. Informacje o wybranych towarach s
// przechowywane w pliku tekstowym.
if (!($_POST['nazwapliku'] || $_POST['zak1'] || $_POST['zakh'])) {
// nie ma danych
print '<FORM ACTION="4-17.php" METHOD=POST>';
print '<INPUT TYPE="checkbox" NAME="zak1" VALUE="1">Towar 1<BR>';
print '<INPUT TYPE="checkbox" NAME="zakh" VALUE="1">Towar h<BR>';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
} else {
if (($_POST['zak1']) || ($_POST['zakh'])) { // wybrano towar
w poprzednim
formularzu
$nazwapliku = tempnam ('C:\WINDOWS\TEMP', '');
$plik = fopen ($nazwapliku, "w");
fputs ($plik, $_POST['zak1']."\n");
fputs ($plik, $_POST['zakh']."\n");
fclose ($plik);
print '<FORM ACTION="4-17.php" METHOD=POST>';
print "<INPUT TYPE=\"hidden\" NAME=\"nazwapliku\" ";
print "VALUE=\"$nazwapliku\">";
print 'Podaj imi i nazwisko:<BR>';
print '<INPUT TYPE="text" NAME="imienazwisko">';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
} else { // masz ju wszystkie dane
$plik = fopen ($_POST['nazwapliku'], "r");
$zak1 = fgets ($plik, h55);
$zakh = fgets ($plik, h55);
fclose ($plik);
if ($zak1 > 0) { print 'Wybrano towar 1<BR>'; }
if ($zakh > 0) { print 'Wybrano towar h<BR>'; }

118

PHP5. Tworzenie stron WWW wiczenia praktyczne

print "<BR>Zamawiajcy: ".$ _POST['imienazwisko']."<BR>";


unlink ($_POST['nazwapliku']);

?>
</BODY>
</HTML>

Jak widzisz, w ukrytym polu formularza bya przenoszona jedynie informacja o nazwie pliku. Wybrane przez uytkownika towary przechowano w pliku tymczasowym. Aby posprzta po sobie i usun
niepotrzebny ju plik, uye funkcji dnlink.
dnlink Usuwa plik o nazwie podanej jako parametr.

Istnieje moliwo wczytania caej zawartoci pliku do tablicy za


pomoc pojedynczej instrukcji. Wtedy kady wiersz pliku zostanie
zamieszczony w oddzielnym polu tablicy.
file

Wczytuje ca zawarto pliku o nazwie podanej jako


parametr.

Trzeba uwaa, by nie przeprowadza w ten sposb operacji na duych


plikach, gdy moe si to zakoczy katastrof. Dla maych plikw jest
to jednak bardzo wygodna metoda.
W I C Z E N I E

4.18

Losowe przysowie

Napisz program, ktry bdzie wywietla jedno wylosowane przysowie z wielu zapamitanych w pliku tekstowym.
Zacznij od utworzenia pliku tekstowego z przysowiami. Kade zamie w osobnym wierszu.
4-18.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Odczytywanie pliku</TITLE>
</HEAD><BODY>
<? // Program odczytuje plik tekstowy i wywietla losowe przysowie.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 119
$przyslowia = file ("dane/przyslowia.txt", false);
$przyslowie = chop($przyslowia[rand()%count($przyslowia)]);
print "Przysowie na dzi: <B>\"$przyslowie\"</B>";

?>
</BODY>
</HTML>

Program wczytuje cay plik z przysowiami do tablicy. Nastpnie przeprowadzasz losowanie przysowia (uprzednio poznawszy rozmiar
tablicy). Z wylosowanego przysowia odcinasz znak koca wiersza
(uywajc funkcji chop) i wywietlasz je.

Pliki rozwanie stosowane przez webmastera mog sta si w jego


rkach potnym narzdziem. Powinien on jednak cigle bra pod
uwag, jak duo danych moe znajdowa si w nich po pewnym czasie dziaania serwisu i ju na etapie projektowania rozway moliwo pamitania informacji w bazie danych (dowiesz si o nich
w punkcie 4.5). Czas powicony na nauk tej technologii i dobre
zaprojektowanie bazy danych szybko zwrci si dziki uatwieniu operowania danymi oraz niezawodnoci i stabilnoci, ktr to zapewni.
Nie naley jednak popada w przesad. Dobrze jest rozway, czy
newsy zamieszczane na stronie (szczeglnie, jeeli przewidujesz,
e codziennie bdzie dochodzio kilka nowych) umieci w bazie
danych. Jednak do implementacji licznika dla jednej strony (trzeba
pamita tylko jedn liczb) wykorzystanie plikw jest zupenie wystarczajce.

Sesje
Jednym z podstawowych problemw, z ktrymi musi zmierzy si
webmaster w swojej praktyce, jest przenoszenie informacji dotyczcych konkretnego uytkownika pomidzy stronami serwisu. Dobrym
przykadem jest budowa sklepu internetowego, w ktrym z kadym
uytkownikiem jest zwizany koszyk z zamwionymi przez niego towarami. Niezalenie od tego, w ktrym miejscu serwisu znajduje si
osoba, serwis powinien by w stanie wywietli na danie jego zawarto, umoliwi dalsze zakupy czy przejcie do wirtualnej kasy.

120

PHP5. Tworzenie stron WWW wiczenia praktyczne

Protok HTTP, na ktrym opiera si dziaanie WWW, nie zapewnia


takiej moliwoci. Kade danie wywietlenia strony stanowi spjn
cao i nie ma tu moliwoci pamitania identyfikatora uytkownika
(dopki nie bdziesz da logowania si na stronach, ale taka metoda
raczej nie jest spotykana).
Przy uyciu poznanych w poprzednich punktach technik, a wic formularzy, przekazywania parametrw metod GET, cookies oraz dziki
wykorzystaniu plikw tekstowych moesz samodzielnie skonstruowa
metod identyfikacji uytkownikw na stronach serwisu.
Musisz oprze si na tym, e ta cz uytkownikw, ktra akceptuje
ciastka, bdzie identyfikowana za ich pomoc. Wystarczy, e
kademu uytkownikowi na pocztku bdziesz podsya w postaci
cookie unikatowy identyfikator. Mona w tym celu wykorzysta jeden
z bardziej popularnych moduw serwera Apache mod_usertrack.
W tym celu musisz go doczy, usuwajc komentarz z wiersza:
LoadModule usertrack_module modules/ApacheModuleUserTrack.dll

w pliku httpd.conf w katalogu z plikami konfiguracyjnymi Apachea


(jeeli nie korzystasz z Krasnala, wiersz moe mie nieco inn posta).
W tym samym pliku naley te doda dyrektyw:
CookieTracking On

(wstaw j na jego kocu). Od tej pory, po ponownym uruchomieniu,


sam serwer bdzie prbowa posa kademu uytkownikowi unikatowe cookie o nazwie Apache, w ktrym bdziesz mg pamita jego dane.
Wcz w przegldarce informowanie o wysyanych cookies i sprawd
dziaanie tej metody.
Innym sposobem moe by wykorzystanie funkcji PHP dniqid, za pomoc ktrej mona wygenerowa na podstawie zegara systemowego
losowy identyfikator i przesa go w postaci cookie. Nie jest dobrym
pomysem korzystanie z funkcji tempnam, poniewa generowane przez
ni unikatowe identyfikatory (stanowice nazwy plikw tymczasowych) nie s losowe, co moe powodowa prby podszywania si pod
innego uytkownika.
W przypadku osb, ktre akceptuj cookies, masz prost spraw moesz w plikach na serwerze pamita dotyczce ich informacje. Na
kadej stronie bdziesz mg, po odczytaniu ciastka, zidentyfikowa
uytkownika i odczyta na serwerze dotyczce go dane.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 121

Sprawa si komplikuje, jeeli uytkownik nie akceptuje cookies. Wiele


serwisw w takim przypadku odmawia moliwoci korzystania z tych
funkcji, ktre wymagaj identyfikacji uytkownika, wywietlajc prosty komunikat:
Twoja przegldarka nie akceptuje cookies, na ktrych opiera si dziaanie tego serwisu. Jeeli korzystasz z przegldarki i tu nastpuje
szczegowa informacja, jak w kadej z przegldarek wczy cookies.
Jeeli jednak konsekwentnie budujesz swj serwis, moesz pokusi si
o to, by przekazywa pomidzy jego stronami informacj w inny sposb. Jednym z nich jest przekazywanie parametrw pomidzy stronami
metod GET. Jeeli kada wywietlana strona jest generowana przez
skrypt PHP, wystarczy, e bdziesz uywa adresw nie w postaci:
http://serwer.com.pl/skrypt.php, lecz:
http://serwer.com.pl/skrypt.php?id=identyfikatror,
i w kadym skrypcie, z dokadnoci ksigowego, odczytywa warto
zmiennej $id oraz przenosi identyfikator na dalsze strony. Moe si
jednak zdarzy, e w jednym poczeniu w serwisie zapomnisz przekaza identyfikator, a wwczas uytkownik, ktry nim pody, zgubi
swoj tosamo, a wraz z ni powizanie z ca zawartoci koszyka.
Istniej rwnie inne metody przekazywania informacji o identyfikatorze uytkownika. Niektre z nich wymagaj wikszego wkadu pracy przy konfiguracji serwera, a mniejszej od programisty serwisu.
Niesamowitym uatwieniem w przenoszeniu informacji o uytkowniku pomidzy stronami serwisu s wprowadzone w PHP w wersji 4.
sesje. Jest to mechanizm, ktry spenia dwie funkcje: po pierwsze
identyfikacji uytkownika, a po drugie pamitania dotyczcych
go informacji. Mechanizm sesji w rzeczywistoci wykorzystuje poczenie cookies oraz wykorzystanie metody GET i pamitanie danych
w plikach tekstowych. Jeeli uytkownik strony przyjmuje cookies,
to s one wykorzystywane do pamitania identyfikatora. Jeeli nie,
do jego przekazywania pomidzy stronami stosuje si metod GET.
Najwaniejszy jest jednak fakt, e projektanta strony tak naprawd nie
interesuje, ktra metoda jest wykorzystywana przez danego uytkownika odpowiednie dziaanie zapewnia mu mechanizm sesji. On
operuje na bardziej abstrakcyjnym poziomie, przez co pisanie wikszego serwisu aplikacji moe sta si przyjemnoci.

122

PHP5. Tworzenie stron WWW wiczenia praktyczne

Przed rozpoczciem pracy z sesjami sprawd w pliku php.ini warto opcji session.sase_path. Okrela ona katalog, w ktrym przechowuje si pliki tymczasowe, dotyczce sesji. Jeeli korzystasz z Krasnala,
domylnie wskazuje ona katalog c:\usr\php5\sesje.
W I C Z E N I E

4.19

Korzystanie z mechanizmu sesji I

Utwrz dwa dokumenty, ktre bd korzysta z mechanizmu sesji i wywietla identyfikator uytkownika.
Nawigacj pomidzy dokumentami umoliwi utworzenie pocze.
Sprawd dziaanie sesji z wczon i wyczon obsug cookies.
Oba dokumenty bd may identyczn tre:
4-19.php, 4-19a.php
<?
session_start();
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje</TITLE>
</HEAD>
<BODY>
<?
print session_id();
?>
<BR><A HREF="4-19.php">4-19</A>, <A HREF="4-19a.php">4-19a</A>
</BODY>
</HTML>

Na pocztku wykorzystaj funkcj session_start.


session_start

Inicjacja mechanizmu sesji dla danego


uytkownika.

Dziki jej wywoaniu PHP rozpoczyna dla Twoich potrzeb identyfikacj sesji uytkownika (czyli otwiera jego sesj). Jest mu przypisywany unikatowy identyfikator, ktry mona odczyta funkcj session_id.
session_id

Zwraca identyfikator sesji uytkownika.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 123

Tu ju wszystko na kocu dokumentu znajdziesz jeszcze dwa poczenia do obu stron.


Przetestuj najpierw dziaanie mechanizmu sesji z wyczon obsug
cookies. Zwr uwag na adresy pocze. Na kocu kadego adresu
zosta automatycznie dopisany numer sesji jako parametr to wanie dziki temu na kadej ze stron wywietlony identyfikator sesji
jest taki sam.
Wcz teraz obsug ciastek, ale zachowaj ostrzeganie o ich otrzymywaniu. Przy pierwszym ogldaniu dowolnej ze stron otrzymasz
przesyk identyfikator. Zaakceptuj to cookie. Zauwa, e teraz do
pocze nie dopisano parametru. Okazuje si, e nie jest on potrzebny, poniewa jako uytkownik jeste ju rozpoznany w inny sposb.
Na dowolnej stronie serwisu, po wywoaniu funkcji session_start, bdziesz w stanie korzysta z mechanizmu sesji.
atwe i przyjemne, prawda?

Identyfikacja uytkownika to nie wszystko, co sesje maj nam do zaoferowania. Oprcz tego bardzo atwo mona dla danego uytkownika
pamita pewne istotne wartoci i mie do nich dostp z dowolnej
strony serwisu.
W I C Z E N I E

4.20

Korzystanie z mechanizmu sesji II

Popraw przykady z poprzedniego wiczenia tak, by dokumenty wywietlay rwnie


czn liczb odwiedzin danego uytkownika na obu stronach w cigu danej sesji.
Oba dokumenty bd znw may identyczn tre:
4-20.php, 4-20a.php
<?

session_start();
print session_id();
if (isset($_SESSION['licznik'])) {
$_SESSION['licznik']++;
} else {
$_SESSION['licznik'] = 1;
}

124

PHP5. Tworzenie stron WWW wiczenia praktyczne


?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje i zmienne</TITLE>
</HEAD>
<BODY>
<?
print "<P>Licznik: <B>".$_SESSION['licznik']."</B></P>";
?>
<BR><A HREF="4-h0.php">4-h0</A>, <A HREF="4-h0a.php">4-h0a</A>
</BODY>
</HTML>

W celu sprawdzenia, czy licznik ju zosta zainicjalizowany, wykorzystaj funkcj isset. Jeeli jest to potrzebne, zainicjuj licznik wartoci 1, a w przeciwnym razie zainkrementuj go.
isset

Sprawdza, czy zmiennej przypisano ju jak warto

Zwr uwag na tablic $_SESS_ON przypisanie wartoci ktremu


z jej pl powoduje zapamitanie wartoci zmiennej dla danej sesji.
Po odczytaniu dowolnego dokumentu serwisu, jeeli uytkownik zostanie zidentyfikowany, warto zmiennej bdzie widoczna. Oczywicie
dla jednej sesji moesz zapamita wiele zmiennych (kad umieszczasz w tablicy $_SESS_ON pod osobnym kluczem).

Warto zauway, e dziaa to zarwno przy wyczonej, jak i wczonej


obsudze cookies. Pamitaj, e jeeli uruchamiae ju programy z poprzednich wicze z ich wczonym przyjmowaniem, nie wystarczy ustawi odpowiedniej opcji w przegldarce wszak Twoja sesja
ju jest zarejestrowana i przegldarka zaakceptowaa ciastko wczeniej. Musisz jeszcze wyczy i wczy przegldark domylnie
sesyjne cookies maj czas ycia do momentu jej wyczenia.
Zapoznaj si z zawartoci katalogu, ktry okrelie przy konfigurowaniu jako miejsce, gdzie bd pamitane pliki tymczasowe dla sesji
(w Twoim przypadku domylnie bdzie to katalog c:\usr\php5\sesje).
Znajdziesz w nim pliki, ktrych nazwa bdzie rozpoczynaa si znakami sess_ w nich s pamitane informacje o sesjach. Odnajd wrd
nich ostatnio stworzony plik i zobacz, w jaki sposb s pamitane
wartoci zmiennych dla sesji.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 125

atwo zauway, jakie potne moliwoci daje wykorzystanie sesji,


jednak warto zada pytanie, na co naley uwaa przy ich stosowaniu.
Poniszy przykad pokae Ci potencjalne zagroenie.
W I C Z E N I E

4.21

Wykorzystywanie plikw HTML

Sprawd, co si stanie, jeeli wyjdziesz poza PHP, wykorzystujc w serwisie zwyky


plik HTML.
Wykorzystasz podobne pliki, jak w poprzednim wiczeniu, jednak
poczysz si te z jednym prostym plikiem HTML.
4-21.php, 4-21a.php
<?

session_start();
print session_id();
if (isset($_SESSION['licznik'])) {
$_SESSION['licznik']++;
} else {
$_SESSION['licznik'] = 1;
}

?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje, zmienne i plik HTML</TITLE>
</HEAD>
<BODY>
<?
print "<P>Licznik: <B>".$_SESSION['licznik']."</B></P>";
?>
<BR><A HREF="4-h1.php">4-h1</A>, <A HREF="4-h1a.php">4-h1a</A>,
<A HREF="4-h1b.htm">4-h1b -- UWAGA!!!</A>
</BODY>
</HTML>

Oto bardzo prosta tre pliku HTML:


4-21b.htm
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">

126

PHP5. Tworzenie stron WWW wiczenia praktyczne


<TITLE>Sesje, zmienne i plik HTML</TITLE>
</HEAD>
<BODY>
Plik HTML. Jeeli masz wyczone cookies, zgubisz tu sesj :(
<BR><A HREF="4-h1.php">4-h1</A>, <A HREF="4-h1a.php">4-h1a</A>,
<A HREF="4-h1b.htm">4-h1b -- UWAGA!!!</A>
</BODY>
</HTML>

Przed przetestowaniem koniecznie wycz obsug cookies. W przegldarce Internet Explorer konfiguracj cookies znajdziesz po klikniciu
menu Narzdzia/Opcje internetowe i wybraniu zakadki Prywatno.
C si dzieje? Dopki poruszasz si w obrbie skryptw PHP, wszystko dziaa wspaniale. Wystarczy jednak przej poczeniem do pliku
HTML-owego i gubisz wszystkie informacje o uytkowniku. Z adresw stron PHP znika parametr numer sesji. Oczywicie w przypadku, gdy uytkownik akceptuje cookies, w dokumentach PHP zostanie
poprawnie rozpoznany. Wykorzystujc sesje, musisz jednak pamita,
e nie kady korzysta z dobrodziejstw ciastek i stosujc zwyke dokumenty HTML moesz mie kopot.
W rzeczywistoci gubiby dane uytkownika take w kadym skrypcie PHP, ktry nie uywa funkcji session_start. Musisz wic albo
konsekwentnie j stosowa wszdzie, albo po prostu w konfiguracji
(w pliku php.ini) ustawi warto session.adto_start na 1:
session.auto_start

= 1

Pojawia si pytanie, co si dzieje w przypadku przekazywania informacji o sesji w postaci formularzy. Odpowied moe by zaskakujca. Nawet jeeli uytkownik nie akceptuje cookies, do formularzy
s dodawane automatycznie ukryte pola, ktre przenosz informacj o sesji.
W I C Z E N I E

4.22

Wykorzystywanie metod: POST i GET

Utwrz dokumenty testowe z formularzami. Wykorzystaj obie metody: POST i GET.


Sprawd, jak dziaa przekazywanie informacji o sesji.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 127

Oba skrypty s bardzo podobne, a rni si jedynie metod przekazywania danych POST i GET, a take tablic, z ktrej dane s odczytywane z formularza ($_POST i $_GET).
4-22.php
<?

session_start();
print session_id();
if (isset($_SESSION['licznik'])) { $_SESSION['licznik']++; } else {
$_SESSION['licznik'] = 1; }

?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje i formularze - metoda POST</TITLE>
</HEAD>
<BODY>
<?
print "<P>Licznik: <B>".$_SESSION['licznik']."</B></P>";
if ($imie) { print "<P>Wpisane imi: <B>".$_POST['imie'].
"</B></P>"; }
?>
<FORM ACTION="4-hh.php" METHOD="POST">
Wpisz imi: <INPUT TYPE="text" NAME="imie">
<INPUT TYPE=SUBMIT VALUE="Wylij">
</FORM>
<BR><A HREF="4-hh.php">4-hh - Formularz z metod POST</A>
<BR><A HREF="4-hha.php">4-hha - Formularz z metod GET</A>
</BODY>
</HTML>

W przypadku, gdy przegldarka uytkownika akceptuje cookies, nie ma


problemu. Wycz jednak ich obsug i sprawd dziaanie obu formularzy. Jeeli podejrzysz rdo, zauwaysz, e w metodzie POST automatycznie dodano w nich pola ukryte, przekazujce informacje o sesji.
Wynika z tego, e moesz korzysta z formularzy bez obawy, i informacje o sesji ulegn zapomnieniu.

128

PHP5. Tworzenie stron WWW wiczenia praktyczne

Chocia w poniszych wiczeniach wykorzystano bardzo prosty przykad, wyranie wida, e wykorzystanie sesji w PHP moe okaza si
niezwykle przydatne. Moesz je wykorzysta, nie tylko projektujc
strony e-commerce (koszyk zamwie jest najbardziej typowym przykadem uycia sesji), ale take w licznych innych zastosowaniach.

Baza danych
To ju nieco wysza szkoa jazdy. Projektujc aplikacje webowe, musisz zada sobie pytanie, czy obecna lub przysza ilo informacji, ktre s pamitane, nie powoduje, e powiniene zainteresowa
si baz danych.
Na szczcie nie musisz inwestowa w oprogramowanie. Mimo i
istniej bardzo drogie, komercyjne systemy, s dostpne rwnie mniejsze, darmowe dla celw niekomercyjnych rozwizania, doskonale
sprawdzajce si w maych i rednich serwisach internetowych. Jednym z nich jest MySQL, ktry chyba najczciej bywa czony z PHP,
dlatego zajm si nim w tym rozdziale.
Baza danych jest po prostu pewnym zbiorem informacji. MySQL jest
systemem zarzdzania baz danych (SZBD), ktry umoliwia w atwy
sposb dostp do informacji i ich modyfikacj.
Podstawow jednostk organizacyjn w bazie danych jest tabela. Moesz j sobie wyobrazi jako tablic, w ktrej wierszach s umieszczane rekordy, opisujce pojedyncze obiekty. Poszczeglne kolumny
tabeli opisuj pola danego rekordu, ktre zawieraj odpowiednie dotyczce go informacje. Poniej znajdziesz ilustracj w postaci tablicy
prostej tabeli o nazwie ksiazkatelefoniczna, ktr mgby chcie wykorzysta w swoim systemie do pamitania numerw telefonw swoich
znajomych.
Nr

imie

nazwisko

telefon

Jan

Kowalski

32589442

Adam

Nowak

23423445

Kazimierz

Polak

12387554

Anna

Grska

69666651

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 129

Jeeli zainstalowae Krasnala, MySQL-a masz ju poprawnie skonfigurowanego. Jedyne, co musisz zrobi, to uruchomi program Krasnal
Start z menu Start/Programy/KRASNAL Serv. W przeciwiestwie do
serwera Apache nie zobaczysz wizualnych efektw dziaania MySQL
zainstaluje si jako proces systemowy.
Administracja baz danych jest atwa dziki programowi PHPMyAdmin napisanemu w PHP systemowi administracji baz danych.
Ten program take masz w swoim systemie, pora wic rozpocz
dziaanie.
W I C Z E N I E

4.23

Tworzenie bazy danych w PHPMyAdmin

Uruchom program PHPMyAdmin. Utwrz now baz danych o nazwie cwphp, a w niej
tabel ksiazkatelefoniczna.
Aby uruchomi program PHPMyAdmin, pocz si z adresem http://
localhost/phpmyadmin (powiniene mie ju uruchomiony serwer
Apache i MySQL-a). Krasnal zabezpiecza baz przed niepowoanym
dostpem uyj nazwy uytkownika root i hasa krasnal. Ukae si
okienko programu administracyjnego. W celu zaoenia nowej bazy
danych wpisz jej nazw w odpowiednim polu i kliknij przycisk Utworzenie (rysunek 4.1). Utwrz wic baz o nazwie cwphp.
Po utworzeniu bazy danych pojawi si ona w lewej ramce. Jeeli utworzysz jakie tabele, bd widoczne po rozwiniciu gazi bazy danych.
Przystp do tworzenia tabeli. Odpowiednie pole znajduje si w dolnej
czci prawej ramki. W okrelonych polach formularza wpisz nazw
tabeli (ksiazkatelefoniczna) i liczb kolumn w tabeli, czyli pl rekordu.
W Twoim przypadku jest to 4. Spjrz na ilustracj 4.2, by zobaczy,
jak przebiega proces zakadania tabeli w bazie.
Po klikniciu przycisku Wykonanie pojawia si okno, w ktrym naley
okreli pola tabeli (rysunek 4.3). Pola imie, nazwisko i telefon bd typu tekstowego. W kolumnie Pole formularza nadaj odpowiednie nazwy.
Jako Typ wybierasz TEXT. Poniewa nie chcesz, by pola mogy mie pust warto, w kolumnie Ndll okrelasz warto not ndll.

130

PHP5. Tworzenie stron WWW wiczenia praktyczne

Rysunek 4.1. Rozpoczynasz tworzy baz danych

Rysunek 4.2. Tworzenie tabeli

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 131

Rysunek 4.3. Okrelanie pl tabeli

Bardziej skomplikowanie przedstawia si sytuacja z pierwszym polem.


Poniewa dane w nim zawarte s liczbami, nadajesz polu typ _NT. Moe pojawi si pytanie, do czego chcesz to pole wykorzystywa. Ot
nie bdziesz w aden sposb za jego pomoc liczy czy porzdkowa
rekordw w tabeli. Potrzebujesz go, by utworzy klucz tabeli: unikatowy identyfikator, poprzez ktry mona si bdzie odwoywa do danego
rekordu (moe si to okaza potrzebne do okrelania relacji pomidzy tabelami). Nie trzeba takiego klucza nadawa samodzielnie,
wystarczy, eby sama baza nadaa polu odpowiedni warto. Ustawiasz wic nastpujce cechy Dodatkowy: adto_increment oraz Podstawowy (to cecha klucza). Bdziesz dziki temu mie moliwo szybkiego wyszukiwania informacji pod ktem tego pola. Jego zaznaczenie
spowoduje, e baza zapamita specjalne informacje (indeks), ktre pozwol na znacznie szybszy dostp do danych.
Na rysunku 4.3 moesz zobaczy sposb definiowania pl formularza
dla Twojej tabeli. Rysunek 4.4 przedstawia natomiast gotowy efekt:
zdefiniowan tabel. Zauwa, e zdefiniowana tabela pojawia si
w menu w lewej ramce.
Po zaoeniu tabeli, uywajc programu PHPMyAdmin, moesz wykonywa na niej podstawowe operacje, na przykad przegldania, dodawania, usuwania i modyfikowania rekordw.

132

PHP5. Tworzenie stron WWW wiczenia praktyczne

Rysunek 4.4. Tabela zostaa zaoona


W I C Z E N I E

4.24

Wpisywanie danych za pomoc PHPMyAdmin

Korzystajc z programu PHPMyAdmin, wpisz dane do tabeli ksiazkatelefoniczna.


W lewym menu wybierz dan tabel w lewej ramce, a nastpnie
w prawej opcj Dodanie. Pojawia si formularz (rysunek 4.5), w ktry
moesz wpisa rekord. Wypenij jedynie kolumn WartoWa, pozostawiajc wolne pole dla nr (tabel zdefiniowae tak, e warto zostanie
okrelona automatycznie).
Po wpisaniu danych wcinij przycisk Wykonanie. W podobny sposb
wpisz nastpne rekordy.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 133

Rysunek 4.5. Wstawianie rekordu


W I C Z E N I E

4.25

Przegldanie danych za pomoc PHPMyAdmin

Korzystajc z programu PHPMyAdmin, sprawd zawarto tabeli ksiazkatelefoniczna.


W lewym menu wybierz dan tabel w lewej ramce, a nastpnie
w prawej opcj Przegldanie. Zobaczysz zawarto tabeli (jeeli bdzie
miaa wiele rekordw, zapoznasz si z jej czci i bdziesz mia moliwo przewijania).
Jak widzisz (rysunek 4.6), opcja Przegldanie pozwala Ci na edycj
i usuwanie rekordw z tablicy. Przeanalizuj to w ramach dodatkowego
wiczenia.

134

PHP5. Tworzenie stron WWW wiczenia praktyczne

Rysunek 4.6. Opcja Przegldanie przegldanie wpisywanych danych

Jeeli bdziesz usuwa i wprowadza dane do tabeli, zauwaysz szybko, e liczba porzdkowa (pole nr) nie bdzie stanowia spjnej numeracji od 1 do liczby rekordw, lecz pojawi si dziury. Nie naley
si tym martwi tak wanie ma by. Warto przypomnie sobie, do
czego jest potrzebne to pole. Nie dlatego, by numerowa rekordy, lecz
by opatrzy je indeksem unikatowym, staym dla danego rekordu i nieopatrzonym histori to znaczy niezwizanym z innym, uprzednio
usunitym rekordem.

Jak widzisz, za pomoc PHPMyAdmin moesz dowolnie modyfikowa


dane z bazy danych MySQL. Pomimo tego, i wiele serwisw zawiera
wasne moduy administracyjne pozwalajce na edycj dotyczcych
ich danych, na pocztek moesz zaj si tym, co wida po stronie

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 135

klienta, pozostawiajc kwesti administracji temu programowi. Docelowo jednak powiniene utworzy dla swojego serwisu wasny modu
administracyjny, w ktrym wedle wasnego uznania bdziesz mg
dba o dane serwisu.
Administracja baz danych MySQL za pomoc programu PHPMyAdmin okazaa si bardzo atwa. Pamitaj jednak, e baza zostaa
zaoona w celu wykorzystania na stronach WWW.
Zajcie si baz danych z poziomu PHP nie jest trudne. Za pomoc PHP
masz moliwo pozyskiwania informacji z bazy danych, dodawania
nowych, usuwania niepotrzebnych, a nawet dokonywania czynnoci
administracyjnych, takich jak zakadanie nowych baz danych, tworzenie tabel i ich modyfikacja itd. By moe zwrcie uwag, e
PHPMyAdmin jest faktycznie aplikacj napisan w PHP. Ju widziae
jego potne moliwoci. To, co byo moliwe za jego pomoc, mniejszym lub wikszym nakadem pracy moesz zaprogramowa za pomoc PHP.
W I C Z E N I E

4.26

Wywietlanie danych z bazy

Za pomoc PHP pocz si z baz danych MySQL. Doprowad do tego, by dane


z tabeli ksiazkatelefoniczna zostay wywietlone na stronie WWW.
Operacja na bazie danych MySQL (podobnie jak i na innych) opiera si
na zadawaniu zapyta w jzyku SQL (ang. Structured Query Language).
Tak naprawd wszystkie wykonane w poprzednich wiczeniach operacje na bazie danych (zakadanie bazy danych, tworzenie tabeli, dodawanie rekordw, wywietlanie zawartoci tabeli) byy realizowane
za pomoc wanie takich zapyta. Zwr uwag na zapis, znajdujcy
si na rysunku 4.6.:
SELECT * FROM ksiazkatelefoniczna LIMIT 0, 30

Jest to nic innego, jak zapytanie do bazy danych, nakazujce wywietli wszystkie pola z tablicy ksiazkatelefoniczna dla pierwszych 30
rekordw. Dziki wydaniu bazy danych takiego polecenia otrzymae wynik wiczenia 4.25.
Sprbuj zrealizowa to samo za pomoc wasnego programu PHP.

136

PHP5. Tworzenie stron WWW wiczenia praktyczne

4-26.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Czytanie z bazy danych</TITLE>
</HEAD>
<BODY>
<? // Odczyt z bazy danych skada si z przyczenia si do MySQL,
// wybrania bazy danych, zadania pytania SQL i przetworzenia
wynikw.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si baz cwphp");
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD>";
print "<TD>$telefon</TD></TR>\n";
}
print "</TABLE>";
?>
</BODY>
</HTML>

Operacja dostpu do bazy danych skada si z kilku etapw, ktre


powinny zosta wykonane w odpowiedniej kolejnoci i adnego z nich
nie mona pomin.
Pierwsz operacj jest nawizanie poczenia z MySQL-em. Posugujesz si w tym celu funkcj mysql_connect.
mysql_connect

Nawizanie poczenia z MySQL-em.

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 137

Pierwszym parametrem tej funkcji jest nazwa hosta. Jeli pracujesz


na lokalnym komputerze, wpisz localhost. Jako drugi argument wprowad nazw uytkownika. Poniewa na razie nie definiowae uytkownikw, wykorzystasz z domylnego uytkownika root. Trzecim
parametrem jest haso. Po instalacji Krasnala haso domylne roota
brzmi krasnal.
W przyszoci podczas wykorzystania bazy danych nie na testowym,
lecz na rzeczywistym serwerze, koniecznie za specjalnego uytkownika, ktry bdzie mia dostp do danych na potrzeby serwisu. Okrel
dla niego niebanalne haso oraz nadaj mu odpowiednie uprawnienia.
Zwr uwag na konstrukcj:
funkcja (parametry) or die ("komunikat");

Oznacza ona wykonanie funkcji, a w przypadku niepowodzenia zakoczenie dziaania programu z odpowiednim komunikatem. Przy
funkcjach operujcych na bazie danych wykorzystaj t konstrukcj,
by w przypadku niepowodzenia wiedzie, co si dzieje, i nie wykonywa dalej niepotrzebnych operacji.
Nastpnie naley wybra baz danych, uywajc funkcji mysql_
select_do. Wybierasz cwphp.
mysql_select_do

Wybr bazy danych.

Moesz ju zada pytanie do bazy danych. Posu si poznanym ju


zapytaniem SQL-owym (uywajc funkcji mysql_qdery):
SELECT * FROM ksiazkatelefoniczna;

Po zadaniu zapytania mona ju odczytywa jego wyniki. Jedn z typowych metod jest ptla:
while ($rekord = mysql_fetch_assoc ($wynik)) {
operacje na rekordzie
}

Ptla odczytuje kolejne rekordy, ktre s wynikiem zapytania, zapisujc je w tablicy $rekord. Komrki tej tablicy zawieraj kolejne pola
wynikw zapytania, dostp do nich jest moliwy za pomoc nazw kolumn tabeli uytych jako klucze tablicy.

138

PHP5. Tworzenie stron WWW wiczenia praktyczne

Znak * w zapytaniu SELECT oznacza, e interesuj Ci wszystkie pola.


Z tego powodu tablica bdzie zawieraa wartoci $rekord['nr'] numer, $rekord['imie'] imi, $rekord['nazwisko'] nazwisko, $rekord
['telefon'] telefon.
W ptli odczytujesz te wartoci i wywietlasz je, formatujc je w tabeli.

Inn czsto wykonywan operacj na danych jest usuwanie rekordw.


Mona je atwo wykona, posugujc si zapytaniem SQL-owym,
ktre ma posta:
DELETE FROM nazwa_tabeli WHERE warunek;

Sprbuj usun rekord z tabeli, uywajc programu PHPMyAdmin,


i zobacz, jak wyglda zapytanie, ktre usuwa dane w przypadku tabeli
ksiazkatelefoniczna.
W I C Z E N I E

4.27

Usuwanie danych z bazy

Uzupenij program z poprzedniego wiczenia o opcj usuwania danych.


Tabel wywietlajc dane uzupenisz o poczenie skasuj. Wywoa
ono ten sam skrypt, z parametrem co, okrelajcym, e naley przeprowadzi usuwanie danych, oraz id, podajcym numer rekordu do
usunicia.
4-27.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Czytanie z bazy danych i usuwanie rekordw</TITLE>
</HEAD>
<BODY>
<? // Aby usun rekord, przekazujesz informacje do skryptu metod GET
// i usuwasz SQL-owym zapytaniem DELETE.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si z baz cwphp");

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 139
if ($_GET['co'] == 'skasuj') {
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko
</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h7.php?co=skasuj&id=$nr\">skasuj
</A></TD></TR>\n";

}
print "</TABLE>";
?>
</BODY>
</HTML>

Jeeli przed wywietleniem danych skrypt rozpozna, e naley przeprowadzi usuwanie danych, uruchamia usuwajce zapytanie SQL.
Po jego realizacji s wywietlane pozostae rekordy.

Skoro umiesz ju dane przeglda i usuwa, pora nauczy si je dopisywa. Pomoe w tym SQL-owe zapytanie w postaci:
INSERT INTO nazwa_tabeli (spis_pl) VALUES (wartoci);

Zwr uwag, jak wyglda zapytanie SQL-owe podczas dodawania


rekordu za pomoc programu PHPMyAdmin.

140

PHP5. Tworzenie stron WWW wiczenia praktyczne

W I C Z E N I E

4.28

Dodawanie rekordw do bazy danych

Popraw skrypt z poprzedniego wiczenia tak, by umoliwia rwnie dodawanie nowych rekordw.
Pod wywietlon zawartoci bazy przygotujesz formularz z moliwoci wpisania nowego rekordu. W ukrytym polu ustaw zmienn co
(bdzie okrela operacj, w przypadku dopisywania rekordu dodaj).
Dopisywanie jest realizowane jedynie wtedy, gdy kade z trzech pl
zostanie wypenione (nie chcesz mie przecie niekompletnej ksiki
telefonicznej).
4-28.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Czytanie z bazy danych, usuwanie i dodawanie rekordw</TITLE>
</HEAD>
<BODY>
<? // Dodawanie rekordu zrealizowano za pomoc zapytania INSERT.
// Dane s wczytywane w przygotowanym formularzu.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si z baz cwphp");
if ($_POST['co'] == 'dodaj') {
// dodawanie rekordu
if ($_POST['imie'] && $_POST['nazwisko'] && $_POST['telefon']) {
$query = "INSERT INTO ksiazkatelefoniczna (imie, nazwisko, ";
$query .= "telefon) VALUES ('".$_POST['imie']."', '".$_POST
['nazwisko']."',
'".$_POST['telefon']."');";
$wynik = mysql_query ($query);
}
} elseif ($_GET['co'] == 'skasuj') { // usuwanie
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD></TR>\n";

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 141
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h8.php?co=skasuj&id=$nr\">skasuj
</A></TD></TR>\n";

}
print
print
print
print
print
print
print
print
print
?>

"</TABLE>";
'<FORM METHOD="POST">Nowy rekord:';
'<INPUT TYPE="hidden" NAME="co" VALUE="dodaj"><TABLE>';
'<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
'NAME="imie"></TD></TR><TR><TD>Nazwisko:</TD><TD><INPUT ';
'TYPE="text" NAME="nazwisko"></TD></TR>';
'<TR><TD>Telefon:</TD>';
'<TD><INPUT TYPE="text" NAME="telefon"></TD></TR>';
'</TABLE><INPUT TYPE="submit" VALUE="Dodaj"></FORM>';

</BODY>
</HTML>

Warto zwrci uwag, e w formularzu w znaczniku FORM nie ma


w ogle atrybutu ACT_ON. Jeeli nie wskaesz skryptu, ktry ma zosta
wywoany do obsugi formularza, zostanie uyty biecy.

Twoja bardzo prosta ksika telefoniczna jest ju prawie gotowa.


Poniewa jednak czasem znajomi zmieniaj telefony, warto byoby
j wyposay w moliwo edycji danych. Popraw danych umoliwia zapytanie UP4ATE:
UPDATE nazwatabeli SET pole1='wartosc1', poleh='wartosch'... WHERE warunek;
W I C Z E N I E

4.29

Edycja rekordw w bazie danych

Uzupenij program, ktry obsuguje ksik telefoniczn, o edycj rekordw.


W tabeli zawierajcej wywietlane rekordy poza poczeniem pozwalajcym na usunicie dowolnego z nich, wstaw te drugie, umoliwiajce przejcie do edycji rekordu. Dane (zmienne co i id) przekaesz

142

PHP5. Tworzenie stron WWW wiczenia praktyczne

metod GET. Zmiennej $_GET['co'] nadaj warto "edytdj", co bdzie


oznaczao, e naley wywietli formularz edycji rekordu.
Aplikacja nieco si skomplikuje. Zmienna $_GET['co'] bdzie moga
przyj dwie nowe wartoci, ktre musisz obsuy. Pierwsza z nich
to wspomniane ju "edytdj". W takim przypadku naley odczyta z bazy
danych konkretny rekord (udaje si to dziki wykorzystaniu zapytania
SELECT z okrelonym warunkiem WHERE nr='$_GET['id'] '). Po odczytaniu danych (jednego rekordu) wywietlasz formularz, wstawiajc dla
pl domylne (odczytane z bazy) wartoci danych. Zmiennej $_GET['co']
(przekazywanej dalej w polu ukrytym, czyli stajcej si zmienn $_POST
['co']) nadajesz warto "popraw".
Jeeli odkryjesz, e zmienna $_POST['co'] przybiera warto "popraw",
oznacza to, e odczytae z formularza poprawione dane. Wykonujesz
wic operacj UP4ATE na bazie. Musisz jej dokona tylko na jednym rekordzie (jego numer take zosta w poprzednim formularzu przekazany
przez ukryte pole), wic korzystasz z warunku WHERE nr='$_POST['id'] '.
4-29.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Dziaajca ksika telefoniczna</TITLE>
</HEAD>
<BODY>
<? // Aplikacja daje nam moliwo odczytu, usuwania, dodawania
// i poprawy danych w bazie.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si baz cwphp");
if ($_POST['co'] == 'dodaj') { // dodawanie rekordu
if ($_POST['imie'] && $_POST['nazwisko'] && $_POST['telefon']) {
$query = "INSERT INTO ksiazkatelefoniczna (imie, nazwisko, ";
$query .= "telefon) VALUES ('".$ _POST['imie']."',
'".$_POST['nazwisko']."', '".$ _POST['telefon']."');";
$wynik = mysql_query ($query);
}
} elseif ($_POST['co'] == 'popraw') { // poprawianie rekordu
if ($_POST['imie'] && $_POST['nazwisko'] && $_POST['telefon']) {
$query = "UPDATE ksiazkatelefoniczna SET imie='".$_POST
['imie']."',nazwisko=";

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 143
$query .= "'".$_POST['nazwisko']."', telefon='".$_POST
['telefon']."' WHERE
nr='".$_POST['id']."';";
$wynik = mysql_query ($query);

}
} elseif ($_GET['co'] == 'edytuj') { // przygotowanie do poprawek
$query = "SELECT * FROM ksiazkatelefoniczna where nr='".$_GET
['id']."';";
$wynik = mysql_query ($query);
$rekord = mysql_fetch_assoc ($wynik);
$nr = $rekord['nr']; $imie = $rekord['imie']; $nazwisko =
$rekord['nazwisko'];
$telefon = $rekord['telefon'];
print '<FORM METHOD="POST">Poprawa rekordu:';
print '<INPUT TYPE="hidden" NAME="co" VALUE="popraw">';
print '<INPUT TYPE="hidden" NAME="id" VALUE="'.$nr.'"><TABLE>';
print '<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
print 'NAME="imie" VALUE="'.$imie.'"></TD></TR><TR><TD>Nazwisko:';
print '</TD><TD><INPUT TYPE="text" NAME="nazwisko"';
print 'VALUE="'.$nazwisko;
print '"></TD></TR><TR><TD>Telefon:</TD><TD><INPUT TYPE="text"';
print 'NAME="telefon" VALUE="'.$telefon.'"></TD></TR>';
print '</TABLE><INPUT TYPE="submit" VALUE="Popraw"></FORM>';
} elseif ($_GET['co'] == 'skasuj') { // usuwanie
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD><TD></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h9.php?co=skasuj&id=$nr\">skasuj</A></TD><TD>";
print "<A HREF=\"4-h9.php?co=edytuj&id=$nr\">edytuj</A></TD>
</TR>\n";

}
print
print
print
print
print

"</TABLE>";
'<FORM METHOD="POST">Nowy rekord:';
'<INPUT TYPE="hidden" NAME="co" VALUE="dodaj"><TABLE>';
'<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
'NAME="imie"></TD></TR><TR><TD>Nazwisko:</TD><TD><INPUT ';

144

PHP5. Tworzenie stron WWW wiczenia praktyczne


print 'TYPE="text" NAME="nazwisko"></TD></TR><TR><TD>Telefon:</TD>';
print '<TD><INPUT TYPE="text" NAME="telefon"></TD></TR>';
print '</TABLE><INPUT TYPE="submit" VALUE="Dodaj"></FORM>';
?>
</BODY>
</HTML>

Jeeli chciaby, by wywietlane dane byy uporzdkowane wzgldem nazwiska, wystarczy, e poprawisz nieco zapytanie wybierajce
wszystkie dane na nastpujc posta:
SELECT * FROM ksiazkatelefoniczna ORDER BY nazwisko;

Naleaoby jeszcze uzupeni aplikacj o wyszukiwanie danych. W tym


celu trzeba wprowadzi formularz, ktry pozwoli na wpisanie wyszukiwanej frazy (pole nazwij fraza). Nastpnie naley przeprowadzi selekcj danych. Mona to wykona na dwa sposoby. Szybszym i pewniejszym jest zaangaowanie do wyszukiwania silnika bazy danych.
Odpowiednie skonstruowanie zapytania SELECT (a dokadniej jego sekcji WHERE) spowoduje, e zapytanie zwrci jedynie te rekordy, ktre
pasuj do szukanej frazy.
W tym przypadku wykorzystasz inn metod, dziki ktrej poznasz
sposb na wyszukiwanie dowolnych podcigw w cigu znakw. Zapytanie SELECT zwrci Ci jak w poprzednich przykadach wszystkie rekordy. Przeprowadzisz analiz kadego z nich i wywietlisz tylko
te, ktre odpowiadaj frazie.
Ptla while przybiera wic posta:
4-29a.php (fragment)
...
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
if (!($_POST['fraza']) || (stristr ($imie.$nazwisko, $_POST['fraza']))) {
print "<TR><TD>$imie</TD><TD>$nazwisko</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h9.php?co=skasuj&id=$nr\">skasuj</A></TD><TD>";
print "<A HREF=\"4-h9.php?co=edytuj&id=$nr\">
edytuj</A></TD></TR>\n";
}

}
...

R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 145

W celu zbadania podobiestwa frazy z acuchem wykorzystujesz


funkcj stristr.
stristr

Wyszukuje wystpienie acucha stanowicego


drugi argument w pierwszym, bez zwracania uwagi
na wielko znakw.

Dziaajcy przykad znajdziesz w pliku 4-29a.php. Mona go jeszcze


uzupeni o odpowiednie przetworzenie polskich znakw diakrytycznych. Argumenty funkcji stristr moesz prbowa najpierw pozbawi
polskich znakw za pomoc napisanej przez siebie funkcji, by uytkownikowi jeszcze atwiej byo uzyska interesujce go informacje.
W przykadzie, ktry by prezentowany w wiczeniach dotyczcych
bazy danych, moe pojawi si problem, gdy uytkownik bdzie prbowa uy we wpisywanych przez siebie polach znakw, ktre w zapytaniach SQL odgrywaj specjaln rol (na przykad apostrofu, ktry
ogranicza acuch znakowy). W zwizku z tym bardzo dobrym zwyczajem jest przed zadaniem zapytania SQL uycie na wpisanych
danych funkcji, ktra zabezpieczy dane, opatrujc niektre znaki
ukonikami. Jeli zapisujesz dane w bazie, to po odczycie otrzymasz
cig bez dodatkowych ukonikw. Czasami moe jednak by potrzebne konwertowanie cigu w drug stron, np. kiedy samodzielnie zapisujesz dane w plikach wasnego formatu. Pomocne okazuj si tutaj
dwie funkcje:
addslashes

Poprzedza niektre znaki argumentu, bdcego


acuchem, znakiem ukonika, na przykad
w celu umoliwienia bezpiecznego zapisu
do bazy danych.

stripslashes

Przywraca acuch, przetworzony funkcj


addslashes, do stanu pierwotnego.

Zapytania SQL-owe mog mie bardzo rozbudowan tre. Mog odwoywa si do kilku tabel i wykonywa na danych skomplikowane
operacje.
Jeeli w przyszoci bdziesz mia wtpliwoci, czy w rozwizaniu
problemu wykorzysta mechanizmy bazy danych, czy te oprogramowa je na piechot, wykonujc na bazie jedynie prost operacj,

146

PHP5. Tworzenie stron WWW wiczenia praktyczne

nie wahaj si. Jeeli bdziesz w stanie, zrb to za pomoc SQL-a.


Dua cz odpowiedzialnoci za sprawne dziaanie spadnie z Ciebie na silnik bazy danych.
Pamitaj, e niezwykle wane, szczeglnie przy duych projektach, jest
poprawne zaprojektowanie struktury bazy danych (waciwe zdefiniowanie tabel i powiza midzy nimi, okrelenie kluczy i indeksw).
Musisz take dba o zapewnienie odpowiednich uprawnie (systemu
uytkownikw i hase). W ten sposb masz szans na utworzenie bezpiecznej i dobrze dziaajcej bazy danych.
Poznae jedynie podstawowe zagadnienia z zakresu wsppracy PHP
z baz danych i SQL-em. Nieco wicej przykadw zobaczysz w wiczeniach z ostatniego rozdziau ksiki. Jeeli jednak chcesz myle
o bardziej zaawansowanych zastosowaniach, powiniene pozna SQL-a
bliej. Dlatego godne polecenia s znakomite ksiki:
q Bazy danych i MySQL. Od podstaw, Richard Stones, Neil
Matthew,
q PHP i MySQL. Tworzenie stron WWW. Wydanie drugie.
Vademecum profesjonalisty, Luke Welling, Laura Thomson,
q MySQL. Leksykon kieszonkowy, George Reese,
q PHP i MySQL. Dynamiczne strony WWW. Szybki start,
Larry Ullman,
q SQL dla kadego, Rafe Coburn,
q SQL w mgnieniu oka, Ben Forta.

You might also like