You are on page 1of 49

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

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

PHP i MySQL. Dynamiczne


strony WWW. Szybki start.
Wydanie II
Larry Ullman
Tumaczenie: Jaromir Senczyk i Grzegorz Werner
na podstawie tumaczenia Michaa Dadana i Piotra Pilcha
ISBN: 83-246-0207-0
Tytu oryginau: PHP and MySQL for Dynamic
Web Sites: Visual QuickPro Guide (2nd Edition)
Format: B5, stron: 688
Byskawiczny kurs tworzenia dynamicznych serwisw internetowych
Dynamiczne strony WWW spotykamy codziennie, korzystajc z internetu. Portale,
sklepy internetowe, gry sieciowe wszystkie te witryny korzystaj z baz danych
i skryptw wykonywanych po stronie serwera. Technologii umoliwiajcych realizacj
tego typu witryn WWW jest kilka. Wrd nich zasuon popularnoci cieszy si
duet o ogromnych moliwociach jzyk skryptowy PHP i baza danych MySQL.
Te dostpne nieodpatnie narzdzia wykorzystywane s przez tysice twrcw witryn
WWW. Docz do nich!
Ksika PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II to kolejna
edycja doskonaego przewodnika po tajnikach tworzenia witryn internetowych
za pomoc tych technologii. Znajdziesz w niej wszystkie informacje niezbdne
do rozpoczcia projektowania wasnych dynamicznych stron WWW od podstaw
programowania i korzystania z baz danych, poprzez wykorzystywanie sesji i plikw
cookie, a do zaawansowanych technik autoryzowania uytkownikw i budowania
aplikacji e-commerce. Kade zagadnienie jest przedstawione na praktycznym
przykadzie, co doskonale pomoe Ci w przyswojeniu wiedzy.
Podstawowe elementy skryptw PHP
Obsuga formularzy HTML
Tworzenie i stosowanie funkcji
Projektowanie baz danych
Operacje na danych
Wykrywanie i usuwanie bdw w skryptach
czenie skryptw PHP z baz danych
Stosowanie plikw cookie i mechanizmw zarzdzania sesjami
Zabezpieczanie i szyfrowanie danych
Zarzdzanie treci strony
Autoryzowanie uytkownikw
Projektowanie sklepw internetowych

Spis treci

Spis treci

Wprowadzenie

Wprowadzenie do PHP
19
Podstawy skadni ......................................................................................20
Przesyanie danych do przegldarki internetowej ....................................24
PHP, HTML i biae odstpy .................................................................28
Wstawianie komentarzy ...........................................................................33
Co to s zmienne? ....................................................................................36
acuchy ..................................................................................................39
Liczby .......................................................................................................43
Stae ..........................................................................................................47
Apostrof kontra cudzysw ......................................................................50

Rozdzia 2.

Programowanie w PHP
53
Tworzenie formularza w jzyku HTML ..................................................54
Obsuga formularza HTML ......................................................................58
Zarzdzanie opcj Magic Quotes ...............................................................61
Wyraenia warunkowe i operatory ...........................................................64
Weryfikacja danych pochodzcych z formularza .....................................68
Co to s tablice? .......................................................................................73
Ptle for i while ........................................................................................91

Rozdzia 3.

Tworzenie dynamicznych stron WWW


95
Wykorzystywanie plikw zewntrznych ..................................................96
Wywietlanie i obsuga formularza przez jeden skrypt ............................105
Tworzenie formularzy z pamici ..........................................................109
Tworzenie i wywoywanie wasnych funkcji .........................................112
Zasig zmiennej ......................................................................................124
Funkcje daty i czasu ...............................................................................128
Wysyanie poczty elektronicznej ............................................................132
5

Spis treci

Rozdzia 1.

Spis treci

Wprowadzenie do SQL i MySQL


139
Wybr typu kolumny .............................................................................140
Wybr innych waciwoci kolumn .......................................................144
Korzystanie z monitora mysqla ..............................................................146
Tworzenie baz danych i tabel .................................................................150
Wprowadzanie rekordw .......................................................................153
Wybieranie danych .................................................................................156
Wyraenia warunkowe ...........................................................................158
Stosowanie LIKE i NOT LIKE ..............................................................162
Sortowanie wynikw zapytania ..............................................................164
Ograniczanie wynikw zapytania ..........................................................166
Uaktualnianie danych .............................................................................169
Usuwanie danych ...................................................................................171
Funkcje ...................................................................................................173

Rozdzia 5.

Zaawansowany SQL i MySQL


183
Projekt bazy danych ...............................................................................184
Zczenia ................................................................................................200
Grupowanie wynikw zapytania ............................................................204
Indeksy ...................................................................................................206
Stosowanie rnych typw tabeli ...........................................................209
Wyszukiwanie FULLTEXT ...................................................................212
Optymalizacja bazy danych ....................................................................219

Rozdzia 6.

Obsuga i usuwanie bdw


225
Oglne typy bdw i ich usuwanie .......................................................226
Wywietlanie bdw PHP .....................................................................232
Sterowanie raportowaniem bdw PHP ................................................233
Tworzenie wasnych funkcji obsugi bdw .........................................236
Zapis komunikatw o bdach PHP do dziennika ..................................240
Techniki usuwania bdw z PHP .............................................................243
Techniki usuwania bdw SQL i MySQL ............................................246

Rozdzia 7.

PHP i MySQL
249
Modyfikacja szablonu ............................................................................250
czenie si z MySQL-em i wybieranie bazy ........................................251
Wykonywanie prostych zapyta ............................................................255
Odczytywanie wynikw zapytania .........................................................263

Spis treci

Rozdzia 4.

Spis treci

Bezpieczestwo ......................................................................................267
Zliczanie zwrconych rekordw ............................................................273
Uaktualnianie rekordw w PHP ...............................................................279
Rozdzia 8.

Tworzenie aplikacji internetowych


287
Dopasowanie zachowania aplikacji do konfiguracji serwera .................288
Przekazywanie wartoci do skryptu .......................................................291
Stosowanie ukrytych pl formularza ......................................................295
Edycja istniejcych rekordw ................................................................301
Stronicowanie wynikw zapyta ............................................................308
Wywietlanie tabel z moliwoci sortowania .......................................316
Nagwki HTTP .....................................................................................323

Rozdzia 9.

Sesje i ciasteczka
333
Posugiwanie si ciasteczkami ...............................................................334
Sesje .......................................................................................................351
Sesje a ciasteczka ................................................................................367
Zwikszanie bezpieczestwa sesji ..........................................................375

Rozdzia 11. Zagadnienia dodatkowe


425
Obsuga przesyania plikw ...................................................................426
Skrypty PHP i JavaScript .......................................................................437
Buforowanie wyjcia ..............................................................................445
Korzystanie z funkcji Improved MySQL Extension ..............................453
Nowe funkcje MySQL ...........................................................................457
Zastosowanie pakietu PEAR ..................................................................466
Rozdzia 12. Zarzdzanie zawartoci strony przykad
471
Tworzenie szablonu ................................................................................472
Tworzenie zwykych stron internetowych .............................................476
Zarzdzanie adresami URL ....................................................................480
Zarzdzanie plikami ...............................................................................508
7

Spis treci

Rozdzia 10. Zabezpieczenia


381
Bezpieczniejsza walidacja formularzy ...................................................382
Obsuga kodu HTML .............................................................................393
Walidacja danych wedug typu ..............................................................397
Walidacja formularza przy uyciu JavaScriptu .......................................401
Wyraenia regularne ..............................................................................408
Zabezpieczanie baz danych i szyfrowanie .............................................420

Spis treci

Rozdzia 13. Rejestrowanie uytkownikw przykad


521
Tworzenie szablonw .............................................................................522
Tworzenie skryptw konfiguracyjnych ..................................................526
Tworzenie strony gwnej ......................................................................533
Rejestracja ..............................................................................................535
Aktywacja konta .....................................................................................544
Logowanie i wylogowywanie si .............................................................548
Zarzdzanie hasami ...............................................................................555

Spis treci

Rozdzia 14. Sklep internetowy przykad


565
Tworzenie bazy danych ..........................................................................566
Cz administracyjna aplikacji .............................................................571
Tworzenie szablonu czci publicznej aplikacji .....................................586
Katalog produktw .................................................................................590
Koszyk ....................................................................................................602
Rejestrowanie zamwie ........................................................................612
Dodatek A

Instalacja
617
Instalacja w systemie Windows .............................................................618
Definiowanie uprawnie MySQL ..........................................................624
Testowanie instalacji ..............................................................................630
Konfigurowanie PHP .............................................................................634

Dodatek B

Przewodnik
637
Jzyk PHP ..............................................................................................638
Serwer MySQL ......................................................................................643

Dodatek C

Zasoby internetowe
651
Jzyk PHP ..............................................................................................652
Serwer MySQL ......................................................................................656
Jzyk SQL ..............................................................................................658
Bezpieczestwo ......................................................................................659
Inne strony internetowe ..........................................................................660
Skorowidz

663

Tworzenie dynamicznych
stron WWW

Tworzenie dynamicznych stron WWW

Rozdzia 3. Tworzenie dynamicznych stron WWW

Teraz, gdy opanowae ju podstawy PHP, czas rozpocz


tworzenie naprawd dynamicznych stron WWW. W porwnaniu
ze stronami statycznymi, ktre dominoway na pocztku istnienia
internetu, s one atwiejsze do utrzymania i bardziej interaktywne,
a ich wygld moe si zmienia w zalenoci od sytuacji.

Tworzenie dynamicznych stron WWW

W tym rozdziale omawiam bardzo wiele rozwiza,


ktre wykorzystuje si do budowy dynamicznych aplikacji
internetowych. Pisz midzy innymi o plikach zewntrznych,
obsudze formularzy innymi sposobami, pisaniu
i wykorzystywaniu wasnych funkcji, wysyaniu poczty
elektronicznej i stosowaniu funkcji date(). Wszystkie
wymienione elementy s wykorzystywane przez bardziej
zaawansowane aplikacje internetowe.

95

Rozdzia 3.

Wykorzystywanie
plikw zewntrznych

Wykorzystywanie plikw zewntrznych

Wszystkie zaprezentowane dotychczas skrypty


miay posta pojedynczych plikw, w ktrych
zapisany by cay kod HTML i PHP. Gdy
zaczniesz tworzy bardziej rozbudowane
witryny, zorientujesz si, e takie podejcie ma
wiele ogranicze. Na szczcie PHP obsuguje
pliki zewntrzne, co pozwala Ci rozbi kod na
kilka czci. Dziki temu bdziesz mg oddzieli
kod HTML od kodu PHP i wyodrbni ze skryptu
t jego cz, ktra odpowiada za najczciej
wykonywane operacje.
PHP ma cztery funkcje obsugujce pliki
zewntrzne: include(), include_once(),
require() i require_once(). Stosuje si je,
umieszczajc w skrypcie PHP instrukcje
tego typu:
include_once("nazwapliku.php");
require('/cieka/do/pliku/nazwapliku.html');

Dziaaj one w ten sposb, e bior ca


zawarto pliku o podanej nazwie i wstawiaj
j do oryginalnego skryptu w miejscu swego
wystpienia. PHP zakada, e kod wystpujcy
w plikach zewntrznych jest kodem HTML
i e powinien zosta przesany bezporednio
do przegldarki (chyba e jest on otoczony
znacznikami oznaczajcymi kod PHP).
W poprzednich wersjach PHP funkcj
include() stosowao si w nieco innych
okolicznociach ni require(). Obecnie ich
zastosowanie jest takie samo, cho rni si
one swym zachowaniem w sytuacjach awaryjnych.
Jeeli z jakich wzgldw funkcja include()
nie bdzie moga wczyta pliku, w przegldarce
internetowej zostanie wywietlony komunikat
o bdzie (rysunek 3.1), ale skrypt bdzie
w dalszym cigu wykonywany. Jeeli natomiast
zaadowanie pliku nie uda si funkcji require(),
po wywietleniu informacji o bdzie skrypt
zostanie zatrzymany (rysunek 3.2).

96

Rysunek 3.1. Dwa wywoania funkcji include()


zakoczone niepowodzeniem

Rysunek 3.2. Przy pierwszym niepowodzeniu


funkcji require() skrypt zostanie zatrzymany,
a w przegldarce pojawi si komunikat o bdzie

Tworzenie dynamicznych stron WWW


Obie funkcje maj te odmian _once(), ktra
gwarantuje, e dany plik zewntrzny zostanie doczony
do skryptu tylko jeden raz, nawet jeli programista
popeni bd i umieci w skrypcie kilka polece
doczajcych.
require_once('nazwapliku.html');

Struktura witryny
Gdy zaczynasz wykorzystywa w swych aplikacjach internetowych pliki zewntrzne,
caociowa struktura witryny nabiera wikszego znaczenia. Projektujc serwis internetowy,
powiniene bra pod uwag trzy czynniki:
atwo utrzymywania,
bezpieczestwo,
atwo poruszania si po witrynie.
Wykorzystanie plikw zewntrznych do przechowywania standardowych procedur PHP,
CSS, JavaScript i HTML bardzo upraszcza utrzymywanie witryny, poniewa cay wsplny
kod jest przechowywany tylko w jednym miejscu. W kolejnych przykadach bd czsto
tworzy specjalne katalogi na pliki zewntrzne i trzyma je odrbnie od zasadniczych skryptw.
W przypadku dokumentw niezawierajcych poufnych danych, takich jak szablony HTML,
zalecam stosowanie rozszerzenia .inc lub .html, natomiast pliki wymagajce wikszego
bezpieczestwa (przechowujce na przykad informacje potrzebne do poczenia si
z baz danych) powinny mie rozszerzenia .php. Uywaj nawet obu rozszerze (czyli .inc
i .html lub .php), aby wskaza, e dany plik jest plikiem zewntrznym okrelonego typu.
Powiniene te projektowa swoje witryny w taki sposb, aby uytkownicy mogli si po nich
atwo porusza i to zarwno posugujc si czami, jak i rcznie wpisywanymi adresami URL.
Staraj si nie tworzy zbyt wielu poziomw folderw i nie uywa trudnych do zapamitania
nazw plikw i katalogu. Nie mieszaj te wielkich liter z maymi i nie stosuj w nazwach znakw
przestankowych.

97

Wykorzystywanie plikw zewntrznych

Czas na pierwszy przykad. Oddziel w nim kod HTML


odpowiedzialny za formatowanie tekstu od kodu PHP,
wykorzystujc mechanizm doczania plikw. Dziki
temu wszystkie kolejne przykady w tym rozdziale bd
mogy zwraca wyniki w tej samej postaci, a ja nie bd
musia przepisywa za kadym razem tych samych
fragmentw kodu. Powstanie w ten sposb system
szablonw zapewniajcy spjno i atwe zarzdzanie
rozbudowanymi aplikacjami. W przykadach
skoncentruj si na kodzie PHP. Powiniene rwnie
przeczyta informacje umieszczone w ramce Struktura
witryny, dziki ktrym zrozumiesz schemat organizacji
plikw. Jeli bdziesz mie pytania dotyczce CSS
(Cascading Style Sheets) lub (X)HTML uywanych
w przykadach, to skorzystaj z odnonikw podanych
w dodatku C, Zasoby internetowe.

Rozdzia 3.

Aby wykorzysta pliki zewntrzne:


1. Stwrz w edytorze tekstw lub programie

typu WYSIWYG projekt strony HTML


(listing 3.1 i rysunek 3.3).

Wykorzystywanie plikw zewntrznych

Na pocztek zaprojektuj wygld mojej aplikacji


HTML (jest on cakowicie niezaleny od kodu
PHP). Za pomoc komentarzy oznacz t cz
projektu, ktra bdzie inna dla kadej strony.
Uwaga: aby zaoszczdzi miejsca, nie
zamieciem pliku CSS, ktry decyduje
o wygldzie strony. Moesz go cign
razem z kodami przykadw z serwera ftp
lub uruchamia przykad bez tego pliku
(szablon bdzie dziaa, ale jego wygld
nie bdzie zbyt estetyczny).
Rysunek 3.3. Projekt strony HTML ogldany
w przegldarce internetowej (wykorzystujcy
HTML i CSS, ale jeszcze nie PHP)
Listing 3.1. Szablon stron WWW generowanych w tym rozdziale
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
<head>
5
<meta h1ttp-equiv="content-type" content="text/html; charset=iso-8859-2" />
6
<title>Witamy w naszej witrynie!</title>
7
<style type="text/css" media="all">@import "./includes/layout.css";</style>
8
</head>
9
<body>
10 <div id="wrapper"><!-- Zgodnie ze stylem CSS. -->
11
12
<div id="content"><!-- Zgodnie ze stylem CSS. -->
13
14
<div id="nav"><!-- Sekcja czy -->
15
<h3>Menu</h3>
16
<ul>
17
<li class="navtop"><a href="index.php" title="Przejd do strony domowej">Strona
domowa</a></li>
18
<li><a href="kalkulator.php" title="Uyj kalkulatora">Kalkulator</a></li>
19
<li><a href="kalendarz.php" title="Wyprbuj dziaanie formularza wyboru
daty">Kalendarz</a></li>
20
<li><a href="rejestracja.php" title="Zarejestruj si">Zarejestruj si</a></li>
21
</ul>
22
</div>
23
24
<!-- Pocztek treci specyficznej dla danej strony. -->
25
<h1 id="mainhead">Nagwek</h1>
26
<p>Tutaj umiecisz podstawow tre strony, inn dla kadej strony.</p>
27
<p>Tutaj umiecisz podstawow tre strony, inn dla kadej strony.</p>
28
<p>Tutaj umiecisz podstawow tre strony, inn dla kadej strony.</p>

98

Tworzenie dynamicznych stron WWW


Listing 3.1. Szablon stron WWW generowanych
w tym rozdziale cig dalszy
29
30
31
32
33
34
35

40
41
42
43

</div><!-- Koniec DIV "treci". -->


<div id="footer"><p>&copy; Copyright
2005 by Larry E. Ullman
&amp;DMCInsights,
Inc.</p></div>
</div><!-- Koniec DIV "obudowy". -->
</body>
</html>

Listing 3.2. Pocztek kadej strony bdzie


przechowywany w pliku nagwkowym
1
2
3
4
5

<!DOCTYPE html PUBLIC "-//W3C//DTD


XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/
xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type"
content="text/html;
charset=iso-8859-2" />

wiersza a do pocztku kodu specyficznego


dla danej strony i wklej to do nowego
dokumentu (listing 3.2).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type"
content="text/html; charset=iso-8859-2" />
<title><?php echo $page_title; ?></title>
<style type="text/css" media="all">@import
"./includes/layout.css";</style>
</head>
<body>
<div id="wrapper">
<div id="content">
<div id="nav">
<h3>Menu</h3>
<ul>
<li class="navtop"><a href="index.php"
title="Przejd do strony domowej">Strona
domowa</a></li>
<li><a href="kalkulator.php" title="Uyj
kalkulatora">Kalkulator</a></li>
<li><a href="kalendarz.php"
title="Wyprbuj dziaanie formularza
wyboru daty">Kalendarz</a></li>
<li><a href="rejestracja.php"
title="Zarejestruj si">Zarejestruj
si</a></li>
</ul>
</div>
<!-- Skrypt 3.2 - naglowek.html -->

Pierwszy plik bdzie zawiera pocztkowe


znaczniki HTML (od DOCTYPE, przez head,
a do pocztku ciaa strony).

99

Wykorzystywanie plikw zewntrznych

36
37
38
39

<p>Tutaj umiecisz podstawow tre


strony, inn dla kadej strony.</p>
<h2>Nagwek niszego rzdu</h2>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<!-- Koniec treci specyficznej dla
danej strony. -->

2. Skopiuj wszystko, poczwszy od pierwszego

Rozdzia 3.
3. Zmie wiersz zawierajcy tytu strony na:
<title><?php echo $page_title; ?></title>

Chc, aby tytu strony (pojawiajcy si


na grze w przegldarce internetowej;
patrz rysunek 3.3) by na kadej stronie
inny. Dlatego te bd przypisywa go
do zmiennej, ktrej zawarto bdzie
wywietlana przez PHP.

Wykorzystywanie plikw zewntrznych

4. Zapisz plik pod nazw naglowek.html.

Nazwy plikw zewntrznych mog mie


cakowicie dowolne rozszerzenia. Niektrzy
programici preferuj rozszerzenie .inc,
poniewa sugeruje ono, e mamy do czynienia
z plikiem doczanym (ang. included file).
W tym przypadku mgby rwnie uy
rozszerzenia .inc.html, wskazujcego,
e doczany plik zawiera kod HTML
(a nie PHP).

Listing 3.2. Pocztek kadej strony bdzie


przechowywany w pliku nagwkowym cig dalszy
6
7
8
9
10
11
12
13
14
15
16
17

18
19

20
21
22
23
24

100

<title><?php echo $page_title;


?></title>
<style type="text/css" media="all">
@import "./includes/layout.css";
</style>
</head>
<body>
<div id="wrapper"><!-- Zgodnie ze
stylem CSS. -->
<div id="content"><!-- Zgodnie ze
stylem CSS. -->
<div id="nav"><!-- Sekcja czy -->
<h3>Menu</h3>
<ul>
<li class="navtop"><a href=
"index.php" title="Przejd do
strony domowej">
Strona domowa</a></li>
<li><a href="kalkulator.php"
title="Uyj kalkulatora">
Kalkulator</a></li>
<li><a href="kalendarz.php"
title="Wyprbuj dziaanie
formularza wyboru daty">
Kalendarz</a></li>
<li><a href="rejestracja.php"
title="Zarejestruj si">
Zarejestruj si</a></li>
</ul>
</div>
<!-- Skrypt 3.2 - naglowek.html -->
<!-- Pocztek treci specyficznej
dla danej strony. -->

Tworzenie dynamicznych stron WWW


Listing 3.3. Zakoczenie kadej strony
bdzie przechowywane w pliku stopki
1
2
3
4
5
6
7
8
9

<!-- Koniec treci specyficznej


dla danej strony. -->
<!-- Skrypt 3.3 - stopka.html -->
</div><!-- Koniec DIV "treci". -->
<div id="footer"><p>&copy; Copyright
2005 by Larry E. Ullman &amp;
DMCInsights, Inc.</p></div>
</div><!-- Koniec DIV "obudowy". -->
</body>
</html>

5. Przejd do oryginalnego szablonu strony

i skopiuj wszystko od koca czci


specyficznej dla konkretnej strony do koca
pliku. Nastpnie wklej to do nowego pliku
(listing 3.3).
<!-- Skrypt 3.3 - stopka.html -->
</div><!-- Koniec DIV "treci". -->
<div id="footer"><p>&copy; Copyright
2005 by Larry E. Ullman &amp;
DMCInsights, Inc.</p></div>
</div><!-- Koniec DIV "obudowy". -->
</body>
</html>

6. Zapisz plik pod nazw stopka.html.


Listing 3.4. Ten skrypt tworzy stron WWW,
wykorzystujc szablon przechowywany
w plikach zewntrznych

7. Utwrz w edytorze tekstw nowy

dokument PHP (listing 3.4).


<?php # Skrypt 3.4 - index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<?php # Skrypt 3.4 - index.php


$page_title = 'Witamy w naszej
witrynie!';
include ('./includes/naglowek.html');
?>
<h1 id="mainhead">Nagwek</h1>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<h2>Nagwek niszego rzdu</h2>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
strony, inn dla kadej strony.</p>
<?php
include ('./includes/stopka.html');
?>

Poniewa wikszo znacznikw


formatujcych znajduje si w plikach
zewntrznych, moemy rozpocz
dokument od znacznikw PHP, a nie HTML.
8. Nadaj zmiennej $page_title odpowiedni

warto i docz nagwek HTML.


$page_title = 'Witaj!';
include ('./includes/naglowek.inc');

Dziki zmiennej $page_title kada strona


wygenerowana z wykorzystaniem tego
szablonu moe mie inny tytu. Poniewa jej
warto jest okrelana przed doczeniem
pliku nagwkowego, dostp do niej ma ten
ostatni. Pamitaj, e efektem wykonania
wiersza kodu zawierajcego wywoanie
funkcji include() jest umieszczenie zamiast
niego caej zawartoci doczanego pliku.

101

Wykorzystywanie plikw zewntrznych

Plik stopki zawiera ostatnie znaczniki


formatujce i znaczniki zamykajce
dokument HTML.

Rozdzia 3.
9. Pozamykaj znaczniki PHP i skopiuj z szablonu

Wykorzystywanie plikw zewntrznych

stron kod specyficzny dla danej strony.


?>
<h1 id="mainhead">Nagwek</h1>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<h2>Nagwek niszego rzdu</h2>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>
<p>Tutaj umiecisz podstawow tre
inn dla kadej strony.</p>

strony,
strony,
strony,
strony,
strony,
strony,
strony,
strony,

Te informacje mona te przesa


do przegldarki za porednictwem funkcji
echo(), ale poniewa nie wystpuj w nich
adne treci generowane dynamicznie,
szybszym i wydajniejszym rozwizaniem
jest chwilowe opuszczenie znacznikw PHP.
10. Stwrz w kodzie ostatni sekcj PHP

i docz plik stopki.


<?php
include ('./includes/stopka.inc');
?>

11. Zapisz dokument pod nazw index.php,

wgraj go na serwer razem z plikiem


stopka.html.
12. Utwrz podkatalog includes w tym samym

katalogu, w ktrym znajduje si index.php.


Nastpnie umie w katalogu includes pliki
naglowek.html, stopka.html i layout.css
(zaadowany z serwera ftp).
13. Przetestuj szablon adujc index.php

w przegldarce internetowej (rysunek 3.4).

102

Rysunek 3.4. Tym razem do uzyskania tego


samego wygldu strony (patrz rysunek 3.3)
wykorzystaem pliki zewntrzne PHP

Tworzenie dynamicznych stron WWW


Strona index.php stanowi kocowy
rezultat zastosowania systemu szablonu.
Nie musimy bezporednio odwoywa si
do doczanych plikw, poniewa skrypt
index.php sam doczy ich zawarto.
14. Jeli chcesz, moesz obejrze rdo

strony HTML (rysunek 3.5).

Wykorzystywanie plikw zewntrznych


Rysunek 3.5. Wygenerowany kod rdowy w jzyku HTML powinien by wiern kopi kodu wystpujcego
w pierwotnym szablonie stron (patrz listing 3.1)

103

Rozdzia 3.
Wskazwki
W pliku php.ini wystpuje ustawienie
include_path. Dziki niemu moesz

okreli, ktre pliki zewntrzne mog


by doczane, a ktre nie.
W rozdziale 7., PHP i MySQL, przekonasz

si, e wszystkie pliki zawierajce poufne


dane (takie jak na przykad informacje
potrzebne do poczenia si z baz danych),
powinny by przechowywane w innym
katalogu ni pozostae dokumenty witryny.

Wykorzystywanie plikw zewntrznych

Odwoujc si do plikw znajdujcych si

w tym samym katalogu co plik biecy,


powiniene zawsze stosowa skadni
./nazwapliku. Z kolei do plikw znajdujcych
si w katalogu wyszego poziomu odwouj
si, piszc ../nazwapliku, a do plikw
z katalogu niszego poziomu piszc
.katalog/nazwapliku.
Doczajc pliki, moesz posugiwa si

ciekami wzgldnymi (tak jak ja)


lub bezwzgldnymi: include ('/cieka/
do/pliku/nazwapliku');
W przypadku gdy nie uda si doczy pliku
zewntrznego, funkcja require() ma wikszy

wpyw na funkcjonowanie skryptu ni


funkcja include(). Dlatego te powinno si
j stosowa jedynie tam, gdzie doczenie
danego pliku ma kluczowe znaczenie
(na przykad wwczas, gdy jest to plik
odpowiedzialny za nawizanie poczenia
z baz danych), a w przypadku doczania
kodu wpywajcego jedynie na kosmetyk
strony naley posugiwa si funkcj
include(). Wersje _once() przydaj si
w skomplikowanych aplikacjach, ale
w przypadku prostej witryny ich stosowanie
nie jest konieczne.
CSS dziaa w taki sposb, e jeli nie

uyjesz pliku CSS lub nie wczyta go


przegldarka, to strona bdzie nadal dziaa
poprawnie, ale jej wygld bdzie mniej
estetyczny (patrz rysunek 3.6).

104

Rysunek 3.6. Wygld strony HTML bez uycia


pliku CSS (porwnaj z rysunkiem 3.4)

Tworzenie dynamicznych stron WWW

Wywietlanie i obsuga
formularza przez jeden skrypt
We wszystkich dotychczasowych przykadach
do obsugi formularzy HTML wykorzystywaem
dwa niezalene skrypty. Jeden wywietla
formularz, a drugi odbiera wysane z niego
dane. Cho nie ma w tym nic zego, czasem
wygodnie jest realizowa obie te funkcje za
porednictwem jednego skryptu. Gdy ta sama
strona ma jednoczenie wywietla i obsugiwa
formularz, trzeba zastosowa wyraenie
warunkowe.
wysano dane z formularza */) {
Obsu je.
{
Wywietl formularz.

Chcc dowiedzie si, czy dane z formularza


zostay ju wysane, sprawdzam, czy zmiennej
$_POST przypisano jak warto (zakadajc, e
formularz uywa metody POST). Mog na przykad
sprawdzi zmienn $_POST['wyslany'], gdzie
wysany jest nazw ukrytego pola formularza.
if (isset($_POST['wyslany'])) {
// Obsu formularz.
} else {
// Wywietl formularz.
}

Jeli chcesz, aby skrypt obsuy formularz,


a nastpnie wywietli go ponownie (bo chcesz
na przykad doda kolejny rekord do bazy
danych), uyj konstrukcji:
if (isset($_POST['wyslany'])) {
// Obsu dane.
}
// Wywietl formularz.

Ta wersja skryptu wywietla formularz przy


kadym zaadowaniu strony i obsuguje go,
jeeli zostay z niego wysane jakie dane.
Aby zademonstrowa t wan technik,
stworz teraz kalkulator sprzeday. W dalszej
czci tego rozdziau uyj tej samej metody,
tworzc stron rejestracji.

1. Utwrz w edytorze tekstw nowy

dokument PHP (listing 3.5).


<?php # Skrypt 3.5 - kalkulator.php
$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');

Ten, i wszystkie pozostae przykady


w biecym rozdziale, bd uywa tego
samego szablonu co strona index.php.
Dlatego te skadnia pocztku kadej
strony bdzie taka sama, rne bd
jedynie tytuy.
2. Napisz wyraenie warunkowe obsugujce

formularz.
if (isset($_POST['submitted'])) {

Jak wczeniej wspomniaem, to, e


zmienna $_POST['submitted'] ma jak
warto, oznacza, e dane z formularza
zostay ju przesane i mona je obsuy.
Zmienna ta bdzie tworzona przez ukryte
pole formularza suce tylko jako
wskanik jego wysania.
3. Zweryfikuj wprowadzone dane.
if ( is_numeric($_POST['quantity'])
&& is_numeric($_POST['price']) &&
is_numeric($_POST['tax']) ) {

Weryfikacja jest w tym przypadku bardzo


prosta i polega na sprawdzeniu, czy
wartoci trzech zmiennych s numeryczne.
Mona j rozbudowa na przykad
o sprawdzenie, czy pierwsza z nich
ma warto cakowit (w rozdziale 10.,
Zabezpieczenia pojawi si wersja
tego skryptu wykonujca tak kontrol).
Jeli weryfikacja zakoczy si pomylnie,
obliczenia zostan wykonane.
W przeciwnym razie uytkownik
zostanie poproszony o ponowne
wprowadzenie danych.

105

Wywietlanie i obsuga formularza

if (/*
//
} else
//
}

Aby obsugiwa formularze HTML:

Rozdzia 3.
Listing 3.5. Ten skrypt zarwno wywietla, jak i obsuguje formularz rejestracyjny
1
2
3

Wywietlanie i obsuga formularza

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

106

<?php # Skrypt 3.5 - kalkulator.php


$page_title = 'Kalkulator kosztw';
include
('./includes/naglowek.html');
// Sprawd czy formularz zosta wysany.
if (isset($_POST['submitted'])) {
// Podstawowa weryfikacja danych we formularzu.
if ( is_numeric($_POST['quantity']) && is_numeric($_POST['price']) &&
is_numeric($_POST['tax']) ) {
// Wylicz wyniki.
$taxrate = $_POST['tax'] / 100; // Zamie 5% na .05.
$total = ($_POST['quantity'] * $_POST['price']) * ($taxrate + 1);
// Wywietl wyniki.
echo '<h1 id="mainhead">Cakowity koszt</h1>
<p>Kupujesz ' . $_POST['quantity'] . ' sztuk w cenie ' . number_format ($_POST['price'],
2) . 'z za egzemplarz. Po uwzgldnieniu podatku ' . $_POST['tax'] . '%, daje to
cakowity koszt ' . number_format ($total, 2) . '.</p><p><br /></p>';
} else { // Wprowadzono niepoprawne dane.
echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Wprowad poprawn liczb egzemplarzy, cen i podatek.</p><p><br
/></p>';
}
} // Koniec gwnego IF.
// Koniec sekcji PHP i pocztek formularza HTML.
?>
<h2>Kalkulator kosztw</h2>
<form action="calculator.php" method="post">
<p>Liczba egzemplarzy: <input type="text" name="quantity" size="5"
maxlength="10"
/></p>
<p>Cena: <input type="text" name="price" size="5" maxlength="10" /> </p>
<p>Podatek:</b> <input type="text" name="tax" size="5" maxlength="10" /></p>
<p><input type="submit" name="submit" value="Oblicz!" /></p>
<input type="hidden" name="submitted" value="TRUE" />
</form>
<?php
include ('./includes/stopka.html');
?>

Tworzenie dynamicznych stron WWW


4. Wykonaj obliczenia.
$taxrate = $tax / 100;
$total = ($_POST['quantity'] *
$_POST['price']) * ($taxrate + 1);

Pierwszy wiersz zamienia warto wyraon


w procentach (np. 5%) na uamek dziesitny
(0.05) uywany w dalszych obliczeniach.
W drugim wierszu liczba egzemplarzy
mnoona jest przez cen jednostkow.
Nastpnie mnoy si j przez warto
podatku (0.05) powikszon o 1 (1.05).
To najszybszy sposb wyznaczenia wartoci
powikszonej o podatek.
5. Wywietl wyniki.

Wywietlone s wszystkie wartoci, a cena


i cakowity koszt zostaj dodatkowo
sformatowane za pomoc funkcji
number_format().
6. Dokocz gwne wyraenie warunkowe

<h2>Kalkulator kosztw</h2>
<form action="kalkulator.php"
method="post">
<p>Liczba egzemplarzy: <input
type="text" name="quantity" size="5"
maxlength="10" /></p>
<p>Cena: <input type="text"
name="price" size="5" maxlength="10"
/></p>
<p>Podatek (%): <input type="text"
name="tax" size="5" maxlength="10"
/></p>
<p><input type="submit" name="submit"
value="Oblicz!" /></p>
<input type="hidden" name="submitted"
value="TRUE" />
</form>

Formularz jest do prosty, zawiera


jedynie dwie nowe sztuczki. Po pierwsze,
atrybut action uywa nazwy skryptu,
dziki czemu wysanie formularza
powoduje powrt do tej samej strony
zamiast przejcie do innej. Po drugie,
formularz zawiera ukryte pole o nazwie
submitted i wartoci TRUE. Pole to spenia
rol znacznika, ktrego istnienie jest
sprawdzane, aby ustali, czy formularz
wymaga obsugi (patrz gwne wyraenie
warunkowe).

i zamknij znacznik PHP.


} else {
echo '<h1 id="mainhead">Bd!</h1>
<p class="error"> Wprowad poprawn
liczb egzemplarzy, cen i
podatek.</p><p><br /></p>';
}
}
?>

Klauzula else zamyka wyraenie warunkowe


weryfikacji, wywietlajc komunikat
o bdzie (jeli wprowadzone wartoci nie
s numeryczne). Ostatni nawias klamrowy
zamyka natomiast wyraenie warunkowe
isset($_POST['submitted']). Nastpnie
zamykana jest sekcja PHP, dziki czemu
formularz bdzie mona utworzy bez
stosowania funkcji print() lub echo().
107

Wywietlanie i obsuga formularza

echo '<h1 id="mainhead"


Cakowity koszt</h1>
<p>Kupujesz ' . {$_POST
['quantity'] . ' sztuk w cenie ' .
number_format($_POST['price'], 2) .
' z za egzemplarz. Po uwzgldnieniu
podatku' . $_POST['price'] . '% daje
to ' . number_format($total,2) . '
z.</p><p><br /></p>';

7. Wywietl formularz HTML.

Rozdzia 3.
8. Docz plik stopki.
<?php
include ('./includes/stopka.html');
?>

9. Zapisz plik pod nazw kalkulator.php,

wgraj go na serwer i przetestuj


w przegldarce internetowej
(rysunek 3.7, 3.8 i 3.9).
Wskazwki

Wywietlanie i obsuga formularza

Aby zbada, czy dane z formularza zostay

ju wysane, moesz to te sprawdzi,


okrelajc, czy zmienna przycisku Wylij
dane ($_POST['submit']) ma warto.
Metoda ta nie zadziaa, jeli uytkownik
wyle formularz uywajc klawisza Enter.

Rysunek 3.7. Pierwsze wywietlenie formularza


HTML

Jeli bdziesz chcia uy grafiki jako

przycisku wysyania danych formularza,


formularz bdzie musia zawiera ukryte
pole umoliwiajce sprawdzenie, czy zosta
on wysany.
Powrt do tego samego formularza po jego

wysaniu moliwy jest take za pomoc


PHP. Mona to zrobi, umieszczajc
nazw biecego skryptu przechowywan
przez zmienn $_SERVER['PHP_SELF']
jako warto atrybutu action:
<form action="<?php echo
$_SERVER['PHP_SELF']; ?> "
method="post">

Rysunek 3.8. Strona wykonuje obliczenia,


prezentuje wyniki i ponownie wywietla formularz

Zalet tego rozwizania jest to, e formularz


bdzie powraca do tej samej strony nawet
wtedy, gdy zmienimy pniej nazw skryptu.

Rysunek 3.9. Jeeli jedna z wprowadzonych


wartoci nie jest numeryczna, zostaje wywietlony
komunikat o bdzie

108

Tworzenie dynamicznych stron WWW

Tworzenie formularzy
z pamici
Na pewno zetkne si ju z formularzami
z pamici, nawet jeli nie wiesz, e wanie
tak si je nazywa. S to zwyke formularze
HTML, ktre zapamituj wszystko, co do nich
wpisae. Z punktu widzenia uytkownika
kocowego jest to bardzo przydatne,
zwaszcza gdy trzeba ponownie wypeni
ten sam formularz.
Aby okreli pocztkow warto widniejc
w tekstowym polu wejciowym, wprowad
atrybut value:

Jeli chcesz, aby to PHP okreli t warto,


uyj po prostu polecenia echo() dla
odpowiedniej zmiennej:
<input type="text" name="city" size="20"
value="<?php echo $city; ?>" />

Zmodyfikuj teraz skrypt kalkulator.php


w taki sposb, aby zapamitywa on
wprowadzane dane.

1. Otwrz w edytorze tekstw plik

kalkulator.php (patrz listing 3.5).


2. Zmie definicj pola wejciowego
quantity (listing 3.6):
<p>Nazwisko: <input type="text"
name="quantity" size="5"
maxlength="10" value="<?php if
(isset($_POST['quantity'])) echo
$_POST['quantity']; ?>" /></p>

Po pierwsze, dodaem do pola


wejciowego atrybut value. Nastpnie
przesaem do przegldarki warto
zmiennej $_POST['quantity']. Musz
jednak najpierw upewni si, czy ma
ona w ogle jak warto. W tym celu
zastosowaem nastpujcy fragment kodu:
<?php
if (isset($_POST['quantity'])) {
echo $_POST['quantity'];
}
?>

Kod ten zapisaem w skrypcie maksymalnie


zwile (korzystajc z tego, e jeli blok
wyraenia warunkowego zawiera tylko
jedn instrukcj, to mona pomin
nawiasy klamrowe).
3. Powtrz te operacje dla ceny i podatku.
<p>Cena: <input type="text"
name="price" size="5"
maxlength="10" value="<?php if
(isset($_POST['price'])) echo
$_POST['price']; ?>" /> </p>
<p>Podatek:</b> <input type="text"
name="tax" size="5" maxlength="10"
value="<?php if (isset($_POST
['tax'])) echo $_POST['tax'];
?>" /></p>

109

Tworzenie formularzy z pamici

<input type="text" name="city" size="20"


value="Innsbruck" />

Aby utworzy formularz z pamici:

Rozdzia 3.
Listing 3.6. Formularz kalkulatora zapamituje teraz informacje wprowadzane przez uytkownika

Tworzenie formularzy z pamici

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2)

<?php # Script 3.6 - calculator.php


$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');
// Sprawd czy formularz zosta wysany.
if (isset($_POST['submitted'])) {
// Podstawowa weryfikacja danych we formularzu.
if ( is_numeric($_POST['quantity']) && is_numeric($_POST['price']) &&
is_numeric($_POST['tax']) ) {
// Wylicz wyniki.
$taxrate = $_POST['tax'] / 100; // Zamie 5% na .05.
$total = ($_POST['quantity'] * $_POST['price']) * ($taxrate + 1);
// Wywietl wyniki.
echo '<h1 id="mainhead">Cakowity koszt</h1>
<p>Kupujesz ' . $_POST['quantity'] . ' sztuk w cenie ' . number_format ($_POST['price'],
. 'z za egzemplarz. Po uwzgldnieniu podatku ' . $_POST['tax'] . '%, daje to cakowity
koszt ' . number_format ($total, 2) . '.</p><p><br /></p>';

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

110

} else { // Wprowadzono niepoprawne dane.


echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Wprowad poprawn liczb egzemplarzy, cen i podatek.</p><p><br
/></p>';
}
} // Koniec gwnego IF.
// Koniec sekcji PHP i pocztek formularza HTML.
?>
<h2>Kalkulator kosztw</h2>
<form action="calculator.php" method="post">
<p>Liczba egzemplarzy: <input type="text" name="quantity" size="5"
maxlength="10"
value="<?php if (isset($_POST['quantity'])) echo $_POST['quantity']; ?>" /></p>
<p>Cena: <input type="text" name="price" size="5" maxlength="10" value="<?php if
(isset($_POST['price'])) echo $_POST['price']; ?>" /> </p>
<p>Podatek:</b> <input type="text" name="tax" size="5" maxlength="10" value="<?php if
(isset($_POST ['tax'])) echo $_POST['tax'];?>" /></p>
<p><input type="submit" name="submit" value="Oblicz!" /></p>
<input type="hidden" name="submitted" value="TRUE" />
</form>
<?php
include ('./includes/stopka.html');
?>

Tworzenie dynamicznych stron WWW


4. Zapisz plik pod nazw kalkulator.php,

wgraj go na serwer i przetestuj w przegldarce


internetowej (rysunek 3.10 i 3.11).
Wskazwki
Poniewa w tym przykadzie kod PHP

wystpuje rwnie jako warto atrybutu


HTML o nazwie value, to komunikaty
o bdach mog wydawa si niezrozumiae.
W przypadku takich problemw, sprawd
w kodzie rdowym HTML, czy bdy PHP
s wywietlane wewntrz atrybutu value.
Wartoci atrybutw HTML powiniene
Rysunek 3.10. Ta wersja formularza zapamituje
informacje wprowadzone poprzednim razem

Jeli serwer uywa opcji Magic Quotes,

to zanim wywietlisz zmienne acuchowe


jako wartoci pl wejciowych, powiniene
zastosowa funkcj stripslashes():
<input type="text" name="last_name"
size="20" value="<?php if (isset
($_POST['last_name'])) echo
stripslashes($_POST['last_name']);
?>" />

Ze wzgldu na ograniczenia wynikajce


Rysunek 3.11. niezalenie od tego czy
formularz zosta wypeniony w caoci.

ze sposobu dziaania jzyka HTML nie


mona okreli pocztkowej wartoci
pola wejciowego typu password.
Aby wstpnie zaznaczy wybrane przyciski

opcji i pola wyboru, wprowad do


definiujcych je znacznikw atrybut
checked="checked".

Aby wstpnie wybra pozycj menu,


uyj atrybutu selected:
<select name="year">
<option value= "2005">2005</option>
<option value= "2006"
selected="selected">2006</option>
</select>

Przykad takiego rozwizania poka


pod koniec rozdziau.

<input type="checkbox"
name="interests" value="Narty"
checked="checked" />
<input type="radio"
name="gender" value="Kobieta"
checked="checked" />

Aby okreli pocztkow zawarto obszaru

tekstowego, umie j midzy znacznikami


textarea:
<textarea name="comments"
rows="10" cols="50"><?php echo
$_POST['comments']; ?></textarea>

111

Tworzenie formularzy z pamici

zawsze umieszcza w cudzysowach.


Dotyczy to zwaszcza atrybutu value.
W przeciwnym razie warto zoona
z kilku sw, na przykad Jan Kowalski,
pojawi si w przegldarce jako Jan.

Rozdzia 3.

Tworzenie i wywoywanie
wasnych funkcji
Jak zdye si ju przekona, PHP ma
bardzo wiele wbudowanych funkcji zdolnych
zaspokoi niemal kade potrzeby. Waniejsze
jest jednak to, e moesz tworzy wasne
funkcje realizujce okrelone przez Ciebie
zadania. Tworzc funkcje, posugujemy si
nastpujc skadni:

Tworzenie i wywoywanie funkcji

function nazwa_funkcji() {
// Kod funkcji.
}

Nazwa Twojej funkcji moe by dowoln


kombinacj liter, cyfr i znakw
podkrelenia, przy czym nie moe zaczyna
si od cyfry. Nie moesz rwnie uywa
nazw funkcji, ktre ju istniej (print, echo,
isset itp.).
W rozdziale 1. wspominaem ju, e PHP
nie rozrnia w nazwach funkcji maych
i wielkich liter (zatem inaczej ni w przypadku
zmiennych), w zwizku z czym zdefiniowan
powyej funkcj mona wywoa, piszc:
nazwa_funkcji(), nazwa_Funkcji(),
NAZWA_FUNKCJI() itp.
Kod wystpujcy w ciele funkcji moe
wykonywa niemal dowolne operacje,
poczwszy od generowania kodu HTML,
na przeprowadzaniu oblicze skoczywszy.
Wanie takie czynnoci bd wykonyway
funkcje, ktre zdefiniuj w tym rozdziale.

Aby utworzy wasn funkcj:


1. Utwrz w edytorze tekstw nowy

dokument PHP (listing 3.7).


<?php # Skrypt 3.7 - formularzdaty.php
$page_title = 'Formularz Kalendarza';
include ('./includes/naglowek.html');

Strona ta bdzie wykorzystywaa


ten sam szablon co dwie poprzednie.

112

Listing 3.7. Ta funkcja przydaje si przy tworzeniu


wikszej liczby menu rozwijalnych
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<?php # Skrypt 3.7 - kalendarz.php


$page_title = 'Kalendarz';
include ('./includes/naglowek.html');
// Funkcja tworzca trzy menu rozwijalne
wyboru miesicy, dni i lat.
function make_calendar_pulldowns() {
// Utwrz tablic miesicy.
$months = array (1 => 'Stycze', 'Luty',
'Marzec', 'Kwiecie', 'Maj', 'Czerwiec',
'Lipiec', 'Sierpie', 'Wrzesie',
'Padziernik', 'Listopad', 'Grudzie');
// Utwrz menu miesicy.
echo '<select name="month">';
foreach ($months as $key => $value) {
echo "<option value=\"$key\
">$value</option>\n";
}
echo '</select>';
// Utwrz menu dni.
echo '<select name="day">';
for ($day = 1; $day <= 31; $day++) {
echo "<option value=\"$day\">
$day</option>\n";
}
echo '</select>';
// Utwrz menu lat.
echo '<select name="year">';
for ($year = 2005; $year <= 2015; $year++) {
echo "<option value=\"$year\
">$year</option>\n";
}
echo '</select>';
} // Koniec definicji funkcji.
// Utwrz znaczniki formularza
echo '<h1 id="mainhead">Wybierz dat:</h1>
<p><br /></p><form action="kalendarz.php"
method="post">';

37
38 // Wywoaj funkcj.
39 make_calendar_pulldowns();
40
41 echo '</form><p><br /></p>'; // Koniec
formularza.
42
43 include ('./includes/stopka.html');
44 ?>

Tworzenie dynamicznych stron WWW


2. Zacznij od zdefiniowania nowej funkcji.
function make_calendar_pulldowns() {

Funkcja, ktr napisz, bdzie generowaa


menu rozwijalne dla dni, miesicy i lat,
podobnie jak skrypt kalendarz.php (patrz
listing 2.12). Nazwa, ktr nadaem funkcji,
jednoznacznie okrela jej przeznaczenie1.
Chocia nie jest to wymagane, definicje
funkcji umieszcza si zwykle na pocztku
skryptu lub w osobnym pliku.
3. Wygeneruj menu rozwijalne.

Tworzenie i wywoywanie funkcji

$months = array (1 => 'Stycze', 'Luty',


'Marzec', 'Kwiecie', 'Maj', 'Czerwiec',
'Lipiec', 'Sierpie', 'Wrzesie',
'Padziernik', 'Listopad', 'Grudzie');
echo <select name="month">';
foreach ($months as $key => $value) {
echo "<option value=\"$key\">
$value</option>\n";
}
echo '</select>
echo'<select name="day">';
for ($day = 1; $day <= 31; $day++) {
echo "<option value=\"$day\">
$day</option>\n";
}
echo '</select>
<select name="year">';
for ($year=2003; $year <= 2010;
$year++) {
echo "<option value=\"$year\">
$year</option>\n";
}
echo '</select>';

Jest to dokadnie ten sam kod co w oryginalnym


skrypcie, z tym e teraz umiecilimy go w ciele
funkcji. Jedyna drobna zmiana polega na uyciu
ptli for do stworzenia menu rozwijalnego
lat (poprzednio wykorzystalimy w tym celu
ptl while).
4. Zamknij definicj funkcji.
} // Koniec definicji funkcji.

Gdy kod jest do skomplikowany,


warto wstawia na kocu definicji funkcji
komentarze, poniewa dziki nim wiadomo,
gdzie definicja si koczy, a gdzie zaczyna.
1

make callendar pulldown to po angielsku utwrz menu rozwijalne kalendarza przyp. tum.

113

Rozdzia 3.
5. Utwrz formularz i wywoaj funkcj.
echo '<h1 id="mainhead"
Wybierz dat:</h1>
<p><br /></p><form action=
"formularzdaty.php" method="post">';
make_calendar_pulldowns();
echo '</form><p><br /></p>';

Ten fragment kodu tworzy znaczniki


definiujce formularz (oraz uywa
znacznikw HTML do stworzenia
ukadu strony) i wywouje funkcj
make_calendar_pulldown(), ktra generuje
kod opisujcy trzy menu rozwijalne.
6. Dokocz skrypt PHP, doczajc plik stopki.

Tworzenie i wywoywanie funkcji

include ('./includes/stopka.html');

7. Zapisz plik pod nazw formularzdaty.php,

wgraj go na serwer (do tego samego


katalogu co plik index.php) i przetestuj
w przegldarce internetowej (rysunek 3.12).
Wskazwki
Jeli pojawi si komunikat o bdzie call to
undefined function nazwa_funkcji, oznacza

on, e wywoae funkcj, ktra nie jest


zdefiniowana. Moe si to zdarzy na skutek
bdnego wpisania nazwy funkcji (podczas
jej definiowania lub wywoania) lub gdy
zapomnisz doczy plik, w ktrym
zdefiniowae funkcj.
Poniewa funkcje definiowane przez

uytkownika zajmuj nieco miejsca


w pamici, powiniene zawsze zastanowi
si, czy w danym przypadku warto je
stosowa. Zazwyczaj ich uycie opaca si
wwczas, gdy dany fragment kodu
wykonywany jest wiele razy w rnych
miejscach skryptu lub witryny.

114

Rysunek 3.12. Menu rozwijalne wygenerowane


przez funkcj zdefiniowan przez uytkownika

Tworzenie dynamicznych stron WWW

Tworzenie funkcji
pobierajcych argumenty
Rysunek 3.13. Czsto popenianym bdem
jest pominicie ktrego z argumentw
lub przekazanie do funkcji argumentu
niewaciwego typu

Funkcje tworzone przez uytkownika,


podobnie jak wbudowane funkcje PHP,
mog pobiera argumenty (zwane take
parametrami). Na przykad argumentem
funkcji print() jest to, co chcesz przesa
do przegldarki, a argumentem strlen()
jest acuch znakw, ktrego dugo
chcesz pozna.

function print_hello ($first, $last) {


// Kod funkcji.
}

Funkcj t moesz nastpnie wywoa jak


kad inn funkcj PHP, przekazujc jej
zmienne lub literay:
print_hello ('Jimmy', 'Stewart');
$surname = 'Stewart';
print_hello ('Jimmy', $surname);

Tak samo jak w przypadku kadej innej


funkcji, podanie nieprawidowej liczby
argumentw, spowoduje wystpienie bdu
(rysunek 3.13). Nazwy zmiennych, ktre
wybierzesz dla argumentw, nie maj znaczenia
z punktu widzenia pozostaej czci skryptu
(dowiesz si o tym w podrozdziale Zasig
zmiennej), dlatego postaraj si, aby byy
one jednoznaczne i jak najbardziej opisowe.
Aby zademonstrowa omawiane tu zagadnienia,
przepisz teraz przykad z kalkulatorem,
tak aby wykorzystywa on funkcj.

115

Tworzenie i wywoywanie funkcji

Kada funkcja moe pobiera dowoln liczb


argumentw, przy czym niezwykle istotna
jest kolejno ich wystpowania. Definiujc
funkcj, wprowad w miejscu wystpowania
argumentw nazwy zmiennych:

Rozdzia 3.

Aby zdefiniowa funkcje


pobierajce argumenty:
1. Otwrz w edytorze tekstw skrypt

kalkulator.php (listing 3.8).

Tworzenie i wywoywanie funkcji

2. Tu za wierszem, w ktrym doczasz plik


nagwka, zdefiniuj funkcj calculate_total().
function calculate_total ($qty,
$cost, $tax) {
$taxrate = $tax / 100;
$total = ($qty * $cost) *
($taxrate + 1);
$total = number_format ($total, 2);
echo '<p>Kupujesz ' . $qty . '
sztuk w cenie' . number_format
($cost, 2) . ' z za egzemplarz.
Po uwzgldnieniu podatku ' . $tax .
'% daje to' . number_format
($total, 2) . 'z.</p>";
}

Funkcja ta przeprowadza te same obliczenia


co w przykadzie z rozdziau 2. i zwraca
wyniki. Pobiera ona trzy argumenty: liczb
zamwionych sztuk, cen jednostkow
i wysoko podatku. Zwr uwag, e
zmiennymi uywanymi przez funkcj nie
s $_POST['quantity'], $_POST['price']
ani $_POST['tax']. Zmienne argumentw
funkcji posiadaj swoje wasne nazwy
wane w obrbie danej funkcji.

116

Listing 3.8. Ta wersja skryptu kalkulatora uywa


do wykonania oblicze funkcji z parametrami
1
2
3
4
5
6
7
8
9

<?php # Skrypt 3.8 - kalkulator.php


(trzecia wersja skryptw 3.5 i 3.6)
$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');
/* Funkcja wyliczajca cakowity koszt
i wywietlajca wynik. */
function calculate_total ($qty, $cost,
$tax) {

$taxrate = $tax / 100; // Zamie 5%


na .05.
10 $total = ($qty * $cost) * ($taxrate + 1);
11 echo '<p>Kupujesz ' . $qty . ' sztuk
w cenie ' . number_format($cost, 2) .
'z za egzemplarz. Po uwzgldnieniu
podatku ' . $tax .
'% daje to
cakowity koszt ' . number_
format($total, 2) . 'z.</p>';
12
13 } // Koniec funkcji.
14
15 // Sprawd czy formularz zosta
wysany.
16 if (isset($_POST['submitted'])) {
17
18 // Podstawowa weryfikacja danych
formularza.
19 if ( is_numeric($_POST['quantity']) &&
is_numeric($_POST['price']) &&
is_numeric($_POST['tax']) ) {
20
21 // Wywietl nagwek.
22 echo '<h1 id="mainhead">Cakowity
koszt</h1>';
23
24 // Wywoaj funkcj.
25 calculate_total ($_POST['quantity'],
$_POST['price'], $_POST['tax']);
26

Tworzenie dynamicznych stron WWW


Listing 3.8. Ta wersja skryptu kalkulatora uywa
do wykonania oblicze funkcji z parametrami
cig dalszy
27
28
29
30
31
32
33
34
35
36
37

41

42

43

44
45
46
47
48
49

} else { // Wprowadzono niepoprawne


wartoci.
echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Wprowad poprawn
liczb egzemplarzy, cen i
podatek.</p><p><br /></p>';
}
} // Koniec gwnego IF.
// Koniec sekcji PHP i pocztek
formularza HTML.
?>
<h2>Kalkulator kosztw</h2>
<form action="kalkulator.php"
method="post">
<p>Liczba egzemplarzy: <input
type="text" name="quantity" size="5"
maxlength="10" value="<?php if
(isset($_POST['quantity'])) echo
$_POST['quantity']; ?>" /></p>
<p>Cena: <input type="text"
name="price" size="5" maxlength="10"
value="<?php if (isset($_POST[
'price'])) echo $_POST['price']; ?>" />
</p>
<p>Podatek:</b> <input type="text"
name="tax" size="5" maxlength="10"
value="<?php if (isset($_POST ['tax']))
echo $_POST['tax'];?>" /></p>
<p><input type="submit" name="submit"
value="Oblicz!" /></p>
<input type="hidden" name="submitted"
value="TRUE" />
</form>
<?php
include ('./includes/stopka.html');
?>

weryfikujce dane (poprzednio byy


w nim wykonywane obliczenia).
echo '<h1 id="mainhead">Oglny koszt</h1>
calculate_total ($_POST['quantity'],
$_POST['price'], $_POST['tax']);
echo '<p><br /><p>';

Rwnie i tym razem tylko nieznacznie


zmienie sposb dziaania skryptu.
Wywietlany jest nagwek, a nastpnie
wywoywana funkcja i dodawane
odpowiednie odstpy na stronie.
Wywoywanej funkcji zostaj przekazane trzy
argumenty, z ktrych kady jest zmienn
$_POST. Warto zmiennej $_POST['quantity']
zostaje przypisana zmiennej $qty funkcji;
warto zmiennej $_POST['price'] zostaje
przypisana zmiennej $cost funkcji; warto
zmiennej $_POST['tax'] zostaje przypisana
zmiennej $tax funkcji.
4. Zapisz plik pod nazw kalkulator.php, wgraj

go na serwer i przetestuj w przegldarce


internetowej (rysunek 3.14).

Rysunek 3.14. Obliczenia wykonuje teraz funkcja


zdefiniowana przez uytkownika, ktra wywietla
rwnie wyniki

117

Tworzenie i wywoywanie funkcji

38
39
40

// Wywietl odstpy
echo '<p><br /></p>';

3. Zmie wyraenie warunkowe strony

Rozdzia 3.

Nadawanie argumentom
wartoci domylnych
Wasne funkcje mona te definiowa w nieco
inny sposb, a mianowicie ustalajc domylne
wartoci argumentw.
function greet($name, $greeting =
'Hello') {
echo "$greeting, $name!";
}

Tworzenie i wywoywanie funkcji

Na skutek okrelenia wartoci domylnej dla danego


argumentu staje si on argumentem opcjonalnym
i nie trzeba umieszcza go w wywoaniu funkcji.
Jeeli to zrobisz, wykorzystana zostanie podana
przez Ciebie warto. Jeli nie, w funkcji bdzie
obowizywaa warto domylna.
Moesz okreli wartoci domylne dla dowolnej
liczby argumentw, pod warunkiem e s to
ostatnie argumenty na licie parametrw funkcji.
Innymi sowy, wszystkie te argumenty, ktrych
warto musi by okrelona przez uytkownika,
musz znale si na pocztku listy argumentw.
W przypadku funkcji zdefiniowanej powyej
wszystkie pokazane tu wywoania s prawidowe:
greet($surname, $message);
greet('Roberts');
greet('Grant', 'Dobry wieczr');

Natomiast wywoanie greet() jest


nieprawidowe, poniewa nie mona nada
wartoci argumentowi $greeting bez nadania
wartoci argumentowi $name.

Aby okreli domylne wartoci


argumentw:
1. Otwrz w edytorze tekstw plik

kalkulator.php (patrz listing 3.8).


2. Zmie wiersz zawierajcy definicj funkcji

(wiersz 7.) w taki sposb, aby wymaganymi


argumentami byy liczba sztuk i cena
jednostkowa ($qty i $cost, listing 3.9).
function calculate_total
($qty, $cost, $tax = 5) {

Warto zmiennej $tax jest teraz zakodowana


na stae w definicji funkcji a tym samym jest
opcjonalna.
118

Listing 3.9. Jeeli w wywoaniu tej wersji funkcji


calculate_total() nie zostanie okrelona warto
podatku, to funkcja wykorzysta warto domyln
1
2
3
4
5
6
7
8
9
10
11

<?php # Skrypt 3.9 - kalkulator.php


(czwarta wersja skryptw 3.5, 3.6 i 3.8)
$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');
/* Funkcja wyliczajca cakowity koszt
i wywietlajca wynik. */
function calculate_total ($qty, $cost,
$tax = 5) {
$taxrate = $tax / 100; // Zamie 5% na
.05.
$total = ($qty * $cost)
* ($taxrate + 1);
echo '<p>Kupujesz ' . $qty . ' sztuk w
cenie ' . number_format($cost, 2) . 'z
za egzemplarz. Po uwzgldnieniu podatku
' . $tax .
'% daje to cakowity
koszt ' . number_format($total, 2) .
'z.</p>';

12
13 } // Koniec funkcji.
14
15 // Sprawd czy formularz zosta wysany.
16 if (isset($_POST['submitted'])) {
17
18
if (is_numeric($_POST['quantity']) &&
is_numeric($_POST['price'])) {
19
20
// Wywietl nagwek.
21
echo '<h1 id="mainhead">Cakowity
koszt</h1>';
22
23
if (is_numeric($_POST['tax'])) {
24
calculate_total
($_POST['quantity'],
$_POST['price'], $_POST['tax']);
25
} else {
26
calculate_total
($_POST['quantity'],
$_POST['price']);
27
}
28
29
// Wywietl odstpy.
30
echo '<p><br /></p>';
31
32
} else { // Wprowadzono niepoprawne
wartoci.

Tworzenie dynamicznych stron WWW


Listing 3.9. Jeeli w wywoaniu tej wersji funkcji
calculate_total() nie zostanie okrelona warto
podatku, to funkcja wykorzysta warto domyln
cig dalszy
33
34

echo '<h1 id="mainhead">Bd!</h1>


<p class="error">Wprowad poprawn
liczb egzemplarzy i cen
jednostkow.</p><p><br /></p>';

if (is_numeric($_POST['quantity'])
&& is_numeric($_POST['price'])) {

Poniewa wysoko podatku jest opcjonalna,


weryfikuj tylko pierwsze dwie zmienne.
4. Zmie sposb wywoania funkcji:
if (is_numeric($_POST['tax'])) {
calculate_total ($_POST
['quantity'], $_POST['price'],
$_POST['tax']);
} else {
calculate_total ($_POST
['quantity'], $_POST['price']);
}

Jeli uytkownik wprowadzi warto


podatku i jest ona liczb, to funkcja
zostanie wywoana w taki sam sposb jak
dotychczas. W przeciwnym razie funkcja
otrzyma tylko dwa pierwsze argumenty,
a dla podatku uyje wartoci domylnej.
5. Zmie komunikat o bdzie, aby dotyczy

jedynie liczby sztuk i kosztu


jednostkowego.
echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Prosz wprowad
poprawn liczb sztuk i cen
jednostkow.</p><p><br /></p>';

Poniewa warto podatku jest teraz


opcjonalna, to komunikat zosta
odpowiednio zmieniony.

119

Tworzenie i wywoywanie funkcji

35
}
36
37 } // Koniec gwnego IF.
38
39 // Koniec sekcji PHP i pocztek formularza
HTML.
40 ?>
41 <h2>Kalkulator kosztw</h2>
42 <form action="kalkulator.php"
method="post">
43
<p>Liczba egzemplarzy: <input
type="text" name="quantity" size="5"
maxlength="10" value="<?php if
(isset($_POST['quantity'])) echo
$_POST['quantity']; ?>" /></p>
44
<p>Cena: <input type="text"
name="price" size="5" maxlength="10"
value="<?php if (isset($_POST
['price'])) echo $_POST['price'];
?>" /> </p>
45
<p>Podatek:</b> <input type="text"
name="tax" size="5" maxlength="10"
value="<?php if (isset($_POST
['tax'])) echo $_POST['tax'];?>"
/>(opcjonalny)</p>
46
<p><input type="submit" name="submit"
value="Oblicz!" /></p>
47
<input type="hidden" name="submitted"
value="TRUE" />
48 </form>
49 <?php
50 include ('./includes/stopka.html');
51 ?>

3. Zmie weryfikacj danych formularza na

Rozdzia 3.
6. Moesz rwnie zaznaczy w formularzu,

e warto podatku jest opcjonalna.


<p>Podatek (%): <input type="text"
name="tax" size="5" maxlength="10"
value="<?php if (isset($_POST
['tax'])) echo $_POST['tax']; ?>"
/> (opcjonalny)</p>

Pole wejciowe zostao opatrzone


stosownym komentarzem w nawiasie.
7. Zapisz plik, wgraj go na serwer

i przetestuj w przegldarce internetowej


(rysunek 3.15 i 3.16).
Wskazwki

Tworzenie i wywoywanie funkcji

Jeeli nie chcesz nadawa okrelonemu

Rysunek 3.15. Jeli uytkownik nie wprowadzi


wartoci podatku, to skrypt uyje domylnej
wartoci 5%

parametrowi funkcji adnej wartoci,


przeka do niego acuch pusty ('')
lub warto NULL bd FALSE.
W podrczniku PHP opcjonalne

parametry funkcji oznaczone s


nawiasami kwadratowymi ([]).

Rysunek 3.16. Jeli uytkownik wprowadzi warto


podatku, to skrypt uyje jej zamiast wartoci
domylnej

120

Tworzenie dynamicznych stron WWW


Listing 3.10. Funkcja calculate_total() pobiera teraz
do trzech argumentw i zwraca wynik
1
2
3
4
5
6
7
8
9
10

16
17
18
19
20
21
22
23
24

25
26
27
28
29

/* Funkcja wyliczajca cakowity koszt


i zwracajca wynik.
function calculate_total ($qty, $cost,
$tax = 5) {
$taxrate = $tax / 100; // Zamie 5%
na .05.
$total = ($qty * $cost) * ($taxrate
+ 1);
return number_format ($total, 2);
} // Koniec funkcji.
// Sprawd czy formularz zosta
wysany.
if (isset($_POST['submitted'])) {
if (is_numeric($_POST['quantity'])
&& is_numeric($_POST['price'])) {
// Wywietl nagwek.
echo '<h1 id="mainhead">Cakowity
koszt</h1>';
if (is_numeric($_POST['tax'])) {
$total_cost = calculate_total
($_POST['quantity'],
$_POST['price'],
$_POST['tax']);
} else {
$total_cost = calculate_total
($_POST['quantity'],
$_POST['price']);
}
echo '<p>Kupujesz ' .
$_POST['quantity'] . ' sztuk
w cenie ' . number_
format($_POST['price'], 2) .
'z za egzemplarz. Cakowity
koszt wyniesie ' .
$total_cost . 'z.</p>';

Ostatni cech funkcji, o ktrej powinienem


wspomnie, jest moliwo zwracania
wynikw (wartoci). Robi to niektre
funkcje, cho nie wszystkie. Na przykad,
funkcja print() zwraca warto 0 lub 1,
informujc, czy zostaa ona wykonana bez
przeszkd, natomiast echo() nie dostarcza
adnych informacji zwrotnych. Funkcja
strlen() zwraca liczb znakw w acuchu.
Jeli chcesz, aby Twoja funkcja zwracaa jak
warto, umie w niej wyraenie return.
function find_sign ($month, $day) {
// Kod funkcji.
return $sign;
}

Funkcja moe zwrci warto (na przykad


acuch znakw lub liczb) lub zmienn,
ktrej przypisaa wczeniej jak warto.
Wywoujc przykadow funkcj, moemy
przypisa zwracan przez ni warto do jakiej
zmiennej:
$my_sign = find_sign ('October', 23);

lub uy jej jako parametru innej funkcji:


print find_sign ('October', 23);

Aby funkcja zwracaa warto:


1. Otwrz w edytorze tekstw plik

kalkulator.php (patrz listing 3.9).


2. Zmie definicj funkcji (listing 3.10) na:
function calculate_total ($qty,
$cost, $tax = 5) {
$taxrate = $tax / 100;
$total = ($qty * $cost) *
($taxrate + 1);
return number_format ($total, 2);
}

121

Tworzenie i wywoywanie funkcji

11
12
13
14
15

<?php # Skrypt 3.10 - kalkulator.php


(pita wersja skryptw 3.5, 3.6, 3.8 i 3.9)
$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');

Zwracanie wartoci z funkcji

Rozdzia 3.
Ta wersja funkcji zwraca jedynie obliczon
sum bez adnych znacznikw HTML-a
i bez przesyania czegokolwiek do
przegldarki internetowej.
3. Zmie sposb wywoania funkcji na:

Tworzenie i wywoywanie funkcji

if (is_numeric($_POST['tax'])) {
$total_cost = calculate_total
($_POST['quantity'], $_POST
['price'], $_POST['tax']);
} else {
$total_cost = calculate_total
($_POST['quantity'], $_POST
['price']);
}

Zmienna $total_cost otrzymuje


teraz warto zwracan przez funkcj
calculate_total().
4. Dodaj nowe wyraenie echo()

wywietlajce wynik.
echo '<p>Kupujesz ' . {$_POST
['quantity'] . ' sztuk w cenie ' .
number_format($_POST['price'], 2) .
' z za egzemplarz. Po uwzgldnieniu
podatku daje to ' . $total_cost '
z.</p>';

Poniewa funkcja zwraca jedynie wynik, to


musimy doda wyraenie echo(), ktre go
wywietli.

Listing 3.10. Funkcja calculate_total() pobiera teraz


do trzech argumentw i zwraca wynik cig dalszy
30
31
32
33
34

} else { // Wprowadzono niepoprawne


wartoci.
echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Wprowad poprawn
liczb egzemplarzy i cen
jednostkow.</p><p><br /></p>';

35
36
37
38
39
40
41
42
43
44
45

46

47

48
49
50
51
52
53

122

// Wywietl odstpy.
echo '<p><br /></p>';

}
} // Koniec gwnego IF.
// Koniec sekcji PHP i pocztek formularza
HTML.
?>
<h2>Kalkulator kosztw</h2>
<form action="kalkulator.php"
method="post">
<p>Liczba egzemplarzy: <input
type="text" name="quantity" size="5"
maxlength="10" value="<?php if
(isset($_POST['quantity'])) echo
$_POST['quantity']; ?>" /></p>
<p>Cena: <input type="text"
name="price" size="5" maxlength="10"
value="<?php if
(isset($_POST['price'])) echo
$_POST['price']; ?>" /> </p>
<p>Podatek:</b> <input type="text"
name="tax" size="5" maxlength="10"
value="<?php if (isset($_POST ['tax']))
echo $_POST['tax'];?>" />(opcjonalny)</p>
<p><input type="submit" name="submit"
value="Oblicz!" /></p>
<input type="hidden" name="submitted"
value="TRUE" />
</form>
<?php
include ('./includes/stopka.html');
?>

Tworzenie dynamicznych stron WWW


5. Zapisz plik, wgraj go na serwer i przetestuj

w przegldarce internetowej (rysunek 3.17).


Wskazwki
Chocia ostatni przykad moe wydawa si

bardziej skomplikowany (funkcja wykonuje


tylko obliczenia, a gwny kod wywietla
wyniki), to stanowi przykad doskonalszego
stylu programowania. Funkcje powinny by
uniwersalne i niezalene od specyfiki stron,
na ktrych s uywane.
Wyraenie return zawsze koczy
Rysunek 3.17. Cel stawiany przed skryptem
mona zrealizowa na wiele rnych sposobw,
a efekt bdzie za kadym razem taki sam

wykonanie kodu funkcji. Kod znajdujcy


si za wykonanym wyraeniem return
nie zostanie wykonany.

ale wykonane zostanie tylko jedno z nich.


Funkcje czsto wykorzystuj t moliwo
w nastpujcy sposb:
function jakas_funkcja() {
if (warunek) {
return TRUE;
} else {
return FALSE;
}
}

Jeli funkcja ma zwraca wiele wartoci,


to naley uy tablicy i funkcji list().
function calculate_total ($qty,
$cost, $tax = 5) {
$taxrate = $tax / 100;
$total = ($qty * $cost) *
($taxrate + 1);
return array ($total, $tax);
}
// Zwyky kod PHP
list ($total_cost, $taxrate) =
calculate_total($_POST['quantity '],
$_POST['price'])

123

Tworzenie i wywoywanie funkcji

W jednej funkcji moe wystpowa kilka


wyrae return (na przykad w strukturze
switch lub w wyraeniu warunkowym),

Rozdzia 3.

Zasig zmiennej

Zasig zmiennej

Zasig zmiennej to trudne, ale bardzo wane


pojcie. Do kadej zmiennej w PHP przypisany
jest jaki zasig, czyli obszar, w ktrym
mona si do niej odwoywa (a zatem take
i do jej wartoci). Oglna zasada jest taka:
zasig zmiennej ograniczony jest do strony,
w ktrej j umieszczono. Innymi sowy,
po zdefiniowaniu zmiennej (nadaniu jej
wartoci) moesz si do niej odwoywa
w dowolnym miejscu na tej stronie, podczas
gdy inne strony nie maj do niej dostpu
(chyba, e uywasz specjalnych zmiennych).
Poniewa pliki doczane mona traktowa
jako cz oryginalnego (doczajcego je)
skryptu, wszystkie zmienne zdefiniowane
przed wyraeniem include mog by
wykorzystywane w doczanym pliku
(co pokazaem ju na przykadzie zmiennej
$page_title i pliku naglowek.html). Ponadto
zmienne zdefiniowane w doczanym
pliku s dostpne dla pliku doczajcego
od miejsca wystpienia wyraenia include.
Wszystko to staje si jeszcze bardziej
zagmatwane z chwil, gdy zaczynasz
definiowa wasne funkcje. Kada z nich ma
swj wasny zasig, co oznacza, e zmienne
wykorzystywane wewntrz funkcji nie
s dostpne poza ni i vice versa. Z tego
wzgldu zmienna wystpujca w ciele
funkcji moe mie dokadnie tak sam
nazw jak zmienna leca poza nim. S to
jednak dwie zupenie rne zmienne, ktre
mog mie rne wartoci. Koncepcja ta
czsto sprawia trudnoci pocztkujcym
programistom.
Moesz te zmieni zasig zmiennej
wystpujcej w funkcji, posugujc si
wyraeniem global.
function nazwa_funkcji() {
global $zmienna;
}
$zmienna = 20;
nazwa_funkcji(); // Wywoanie funkcji

124

W tym przykadzie $zmienna wystpujca


wewntrz funkcji i $zmienna poza ni to jedna
i ta sama zmienna. Oznacza to, e jeeli warto
zmiennej $zmienna zostanie zmieniona wewntrz
funkcji, to zmieni si warto zewntrznej
zmiennej $zmienna.
Innym sposobem na ominicie zasigu zmiennej
jest odwoanie si do zmiennych superglobalnych:
$_GET, $_POST, $_REQUEST itd. S one automatycznie
dostpne we wszystkich Twoich funkcjach
(dlatego wanie nazywamy je superglobalnymi).

Aby wykorzystywa zmienne globalne:


1. Otwrz w edytorze tekstw plik

kalkulator.php (patrz listing 3.10).


2. Zmie definicj funkcji na (listing 3.11):
function calculate_total($tax = 5) {
global $total;
$taxrate = $tax / 100;
$total = ($_POST['quantity'] *
$_POST['price']) *
($taxrate + 1);
$total = number_format ($total, 2);
}

Poniewa i tak wykorzystywaem ju zmienne


superglobalne, mog zmieni definicj
funkcji tak, aby nie pobieraa ona adnych
argumentw, tylko korzystaa wanie
z superglobalnych ($_POST['quantity']
i $_POST['price']). Na podobnej zasadzie
mog zrezygnowa ze zwracania wartoci
$total, nadajc jej zasig globalny.

Tworzenie dynamicznych stron WWW


Listing 3.11. Poniewa $_POST jest zmienn superglobaln, do przechowywanych w niej wartoci mona si
odwoywa we wszystkich funkcjach. Zmienna $total zostaa zadeklarowana wewntrz funkcji jako globalna

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

<?php # Skrypt 3.11 - kalkulator.php (szsta wersja skryptw 3.5, 3.6, 3.8, 3.9 i 3.10)
$page_title = 'Kalkulator kosztw';
include ('./includes/naglowek.html');
/* Funkcja wyliczajca cakowity koszt
i wywietlajca wynik. */
function calculate_total ($tax = 5) {
global $total;
$taxrate = $tax / 100; // Zamie 5% na .05.
$total = ($_POST['quantity'] * $_POST['price']) * ($taxrate + 1);
$total = number_format ($total, 2);
} // Koniec funkcji.
// Sprawd czy formularz zosta wysany.
if (isset($_POST['submitted'])) {
if (is_numeric($_POST['quantity']) && is_numeric($_POST['price'])) {
// Wywietl nagwek.
echo '<h1 id="mainhead">Cakowity koszt</h1>';
$total = NULL; // Zainicjalizuj $total.
if (is_numeric($_POST['tax'])) {
calculate_total ($_POST['tax']);
} else {
calculate_total ();
}
echo '<p>Kupujesz ' . $_POST['quantity'] . ' sztuk w cenie ' . number_format($_
POST['price'], 2) . 'z za egzemplarz. Cakowity koszt wyniesie ' . $total . 'z.</p>';
// Wywietl odstpy.
echo '<p><br /></p>';
} else { // Wprowadzono niepoprawne wartoci.
echo '<h1 id="mainhead">Bd!</h1>
<p class="error">Wprowad poprawn liczb egzemplarzy i cen jednostkow.</p><p><br /></p>';
}
} // Koniec gwnego IF.

// Koniec sekcji PHP i pocztek formularza HTML.


?>
<h2>Kalkulator kosztw</h2>
<form action="kalkulator.php" method="post">
<p>Liczba egzemplarzy: <input type="text" name="quantity" size="5" maxlength="10" value="<?php
if (isset($_POST['quantity'])) echo $_POST['quantity']; ?>" /></p>
47
<p>Cena: <input type="text" name="price" size="5" maxlength="10" value="<?php if
(isset($_POST['price'])) echo $_POST['price']; ?>" /> </p>
48
<p>Podatek:</b> <input type="text" name="tax" size="5" maxlength="10" value="<?php if
(isset($_POST ['tax'])) echo $_POST['tax'];?>" />(opcjonalny)</p>

125

Zasig zmiennej

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Rozdzia 3.
3. Zainicjuj zmienn $total na zewntrz funkcji. Listing 3.11. Poniewa $_POST jest zmienn
superglobaln, do przechowywanych w niej wartoci
$total = NULL;
mona si odwoywa we wszystkich funkcjach.
Zmienna $total zostaa zadeklarowana wewntrz
Dobry styl programowania wymaga, aby,
funkcji jako globalna cig dalszy
zanim funkcja uyje zmiennej jako globalnej,

zainicjowa j wartoci NULL.


4. Zmie sposb wywoania funkcji na:
if (is_numeric($_POST['tax'])) {
calculate_total($_POST['tax']);
} else {
calculate_total();
}

5. Zmie wyraenie echo() na:

49
50
51
52
53
54

<p><input type="submit" name="submit"


value="Oblicz!" /></p>
<input type="hidden" name="submitted"
value="TRUE" />
</form>
<?php
include ('./includes/stopka.html');
?>

Zasig zmiennej

echo '<p>Kupujesz ' . {$_POST


['quantity'] . ' sztuk w cenie ' .
number_format($_POST['price'], 2) .
' z za egzemplarz. Po uwzgldnieniu
podatku daje to ' . $total '
z.</p>';

Zamiast odwoywa si do zmiennej


$total_cost (ktrej warto bya poprzednio
zwracana przez funkcj), w tym przykadzie
wywietlana jest warto zmiennej globalnej
$total.
6. Zapisz plik, wgraj go na serwer i przetestuj

w przegldarce internetowej (rysunek 3.18).


Rysunek 3.18. Po raz kolejny ta sama strona
zostaa wygenerowana przy uyciu innej wersji
funkcji

126

Tworzenie dynamicznych stron WWW


Wskazwki
Inny aspekt zasigu zmiennej zwizany jest

z miejscem definicji funkcji. Pamitajmy,


e kod funkcji zostaje wykonany w miejscu
jej wywoania, a nie w miejscu definicji.
Wystarczy wic, e zmienn globaln
zdefiniujemy przed wywoaniem funkcji,
ktra jej uywa.
Zmienna statyczna to taka, ktra naley

do funkcji, jest inicjalizowana przy


pierwszym wywoaniu danej funkcji
i ktrej warto jest pamitana midzy
kolejnymi wywoaniami. Przy pierwszym
wywoaniu poniszej funkcji zostanie
wywietlona liczba 1, przy drugim 2 itd.
function licznik () {
static $var = 1;
echo $var++;
}

zasigu zmiennej. Zamiast przekazywa


zmienne do funkcji przez warto, naley
przekaza je przez referencj. Dziki temu
wszelkie zmiany ich wartoci bd te
widziane na zewntrz funkcji. Wicej
informacji na temat przekazywania
zmiennych przez referencj znajdziesz
w podrczniku PHP.
W PHP moesz te korzysta z tablicy
$GLOBALS przechowujcej wszystkie

zmienne globalne skryptu.


Zmienne $_SESSION i $_COOKIE mog by

dostpne dla wielu stron. Wicej na ten


temat w rozdziale 9., Sesje i ciasteczka.
Cho za kadym razem moesz przepisa swe

funkcje w taki sposb, aby wykorzystywa


w nich wyraenie global i zmienne
superglobalne, nie zawsze ma to sens.
Poprzednia wersja funkcji bya lepsza,
poniewa akceptowaa trzy wartoci
i zwracaa jedn bez wzgldu na to, jakie
byy nazwy pl wejciowych formularza
(odpowiadajce zmiennym $_POST).

127

Zasig zmiennej

Istnieje jeszcze jeden sposb na poszerzenie

Rozdzia 3.

Funkcje daty i czasu


Omwi teraz kilka funkcji zwizanych z dat
i czasem. Najwaniejsza z nich to date(),
zwracajca odpowiednio sformatowany
acuch znakw okrelajcy dat i godzin.
date (format, [znacznik_czasu]);

Funkcje daty i czasu

znacznik_czasu to opcjonalny argument pobierajcy

Tabela 3.1. Kady z tych parametrw wpywa


na format, w jakim funkcja date() zwraca wyniki
Znaczniki formatujce dla dat
Znak

Znaczenie

Przykad

rok wyraony 4 cyframi

2003

y
n

rok wyraony 2 cyframi


miesic wyraony
1 lub 2 cyframi
miesic wyraony
2 cyframi
miesic
miesic wyraony
3 literami
dzie miesica wyraony 1
lub 2 cyframi
dzie miesica
wyraony 2 cyframi
dzie tygodnia
dzie tygodnia
wyraony 3 literami
godzina w formacie
12-godzinnym, wyraona
1 lub 2 cyframi
godzina w formacie
24-godzinnym,
wyraona 1 lub 2 cyframi
godzina w formacie
12-godzinnym,
wyraona 2 cyframi
godzina w formacie
24-godzinnym,
wyraona 2 cyframi

03
2

Monday
Mon

minuty

45

sekundy

18

am lub pm

am

AM lub PM

PM

dat wyraon przez liczb sekund, jaka upyna


od pocztku Epoki Uniksa (czyli od pnocy
1 stycznia 1970 r.). Jego zastosowanie pozwala
nam uzyska informacje (np. dzie tygodnia)
dla dowolnej daty. W przeciwnym razie PHP
zwrci biec dat ustawion na serwerze.

Funkcja date() obsuguje mnstwo parametrw


formatujcych (tabela 3.1), ktre mona czy
ze zwykym tekstem. Na przykad:

echo date('F j, Y'); // January 21, 2003


echo date('H:i'); // 23:14
echo date('Dzi jest D'); // Dzi jest Mon

Za pomoc funkcji mktime() moesz obliczy


znacznik czasu dla wskazanej daty.
int mktime (godzina, minuta, sekunda,
miesiac, dzien, rok);

Z kolei funkcja getdate() zwraca tablic wartoci


(tabela 3.2) opisujcych biec dat i czas.
Na przykad:
$dates = getdate();
echo $dates['month']; // January

Rwnie ta funkcja posiada opcjonalny argument


w postaci znacznika czasu. Jeli nie zostanie on uyty,
funkcja getdate() zwrci biecy czas i dat.
Aby przewiczy posugiwanie si tymi funkcjami,
przepiszemy skrypt kalendarz.php w taki sposb,
aby wywietla wstpnie wybran biec dat.

128

F
M
j

l (mae L)
D
g

02
February
Feb
8
08

18

06

18

Tabela 3.2. Funkcja getdate() zwraca


tablic asocjacyjn
Tablica getdate()
Klucz

Warto

year

rok

Przykad
2005

mon

miesic

12

month

nazwa miesica

December

mday

dzie miesica

25

weekday

dzie tygodnia

Tuesday

hours

godziny

11

minutes

minuty

56

seconds

sekundy

47

Tworzenie dynamicznych stron WWW


Listing 3.12. Skrypt wykorzystuje teraz funkcje
date() i getdate()
1
2
3
4
5
6
7
8
9

27
28
29
30
31
32
33
34
35

// Funkcja tworzca trzy menu


rozwijalne wyboru miesicy, dni i lat.
function make_calendar_pulldowns($m =
NULL, $d = NULL, $y = NULL) {
// Utwrz tablic miesicy.
$months = array (1 => 'Stycze',
'Luty', 'Marzec', 'Kwiecie', 'Maj',
'Czerwiec', 'Lipiec', 'Sierpie',
'Wrzesie', 'Padziernik',
'Listopad', 'Grudzie');
// Utwrz menu miesicy.
echo '<select name="month">';
foreach ($months as $key => $value) {
echo "<option value=\"$key\"";
if ($key == $m) { // Wstpny wybr.
echo ' selected="selected"';
}
echo ">$value</option>\n";
}
echo '</select>';
// Utwrz menu dni.
echo '<select name="day">';
for ($day = 1; $day <= 31; $day++) {
echo "<option value=\"$day\"";
if ($day == $d) { // Wstpny
wybr.
echo ' selected="selected"';
}
echo ">$day</option>\n";
}
echo '</select>';
// Utwrz menu lat.
echo '<select name="year">';
for ($year = 2005; $year <= 2015;
$year++) {

1. Utwrz w edytorze tekstw skrypt

kalendarz.php (listing 3.7).


2. Zmie definicj funkcji na nastpujc

(listing 3.12):
function make_calendar_pulldowns
($m = NULL, $d = NULL, $y = NULL) {

Definiowana funkcja pobiera do trzech


argumentw reprezentujcych miesic,
dzie i rok. Ich zadaniem bdzie wybr
wstpnych pozycji w menu rozwijalnym
w podobny sposb, jak w formularzach
zapamitujcych dane.
3. Zmie ptl foreach tak, aby wstpnie

wybieraa miesic.
foreach ($months as $key => $value) {
echo "<option value=\"$key\"";
if ($key == $m) {
echo ' selected="selected"';
}
echo ">$value</option>\n";
}

Proces tworzenia menu rozwijalnego


praktycznie si nie zmieni, poza
dodaniem wyraenia warunkowego.
Jeli funkcja otrzyma warto $m, to
w formularzu powinien zosta wybrany
odpowiedni miesic. W tym celu warto
$m porwnywana jest z kluczami
kolejnych elementw tablicy. Jeli
jest rwna, to do odpowiedniego
znacznika option dodawany jest
atrybut selected="selected".
4. W podobny sposb zmodyfikuj ptle for

dla menu wyboru dnia.


for ($day = 1; $day <= 31; $day++) {
echo "<option value=\"$day\"";
if ($day == $d) {
echo ' selected="selected"';
}
echo ">$day</option>\n";
}

129

Funkcje daty i czasu

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

<?php # Skrypt 3.12 - kalendarz.php


(druga wersja skryptu 3.7)
$page_title = 'Kalendarz';
include ('./includes/naglowek.html');

Aby wykorzysta funkcje


operujce na dacie:

Rozdzia 3.
Kod ten dziaa tak samo jak w przypadku
miesicy. Inna jest tylko ptla. Jeli $d
jest rwne $day, to do odpowiedniego
znacznika option dodawany jest atrybut
selected="selected".
5.W taki sam sposb zmodyfikuj ptl lat.
for ($year = 2005; $year <= 2015;
$year++) {
echo "<option value=\"$year\"";
if ($year == $y) {
echo ' selected="selected"';
}
echo ">$year</option>\n";
}

6. Zmie wywoanie funkcji w taki sposb,

Funkcje daty i czasu

aby zostaa wywoana dla biecej daty.


$dates = getdate();
make_calendar_pulldowns
($dates['mon'], $dates['mday'],
$dates['year']);

Przed przekazaniem do funkcji parametrw


okrelajcych biecy dzie, miesic i rok
wywoam funkcj getdate(), ktra zwrci
tablic z wartociami odpowiadajcymi
dzisiejszej dacie. Nastpnie wywoam
funkcj, wykorzystujc odpowiednie
elementy tablicy.
7. Wywietl biec dat i godzin.
echo '<p>Dzi jest ', date ('l'),
'. Jest godzina ', date ('g:i a'),
'.</p>';

Ostatnie wyraenie spowoduje przesanie


do przegldarki nastpujcych danych:
<p>Dzi jest Tuesday.
Jest godzina ll:14pm.</p>

Zostan przy tym uwzgldnione parametry


formatujce przekazane do funkcji date().

130

Listing 3.12. Skrypt wykorzystuje teraz funkcje date()


i getdate() cig dalszy
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

echo "<option value=\"$year\"";


if ($year == $y) { // Wstpny wybr.
echo ' selected="selected"';
}
echo ">$year</option>\n";
}
echo '</select>';
} // Koniec definicji funkcji.
// Utwrz znaczniki formularza
echo '<h1 id="mainhead">Wybierz
dat:</h1>
<p><br /></p><form
action="kalendarz.php" method="post">';
// Pobierz informacj o dniu dzisiejszym
i wywoaj funkcj.
$dates = getdate();
make_calendar_pulldowns ($dates['mon'],
$dates['mday'], $dates['year']);
echo '</form><p><br /></p>'; // Koniec
formularza.
// Wywietl biec dat i czas.
echo '<p>Dzi jest ' . date ('l') . '.
Jest godzina ' . date ('g:i a') .
'.</p>';
include ('./includes/stopka.html');
?>

Tworzenie dynamicznych stron WWW


8. Zapisz plik pod nazw kalendarz.php, wgraj

go na serwer i przetestuj w przegldarce


internetowej (rysunek 3.19).
9. Moesz podejrze kod rdowy strony,

aby zobaczy, w jaki sposb menu


zapamituj dane (rysunek 3.20).
Wskazwki
Jak zobaczysz w rozdziale 4.,
Rysunek 3.19. Funkcje date() i getdate() pomogy mi
wprowadzi nieco ycia na t stron

Wprowadzenie do SQL i MySQL,


MySQL ma wasne funkcje operujce
na datach.
Funkcje daty PHP odzwierciedlaj czas

serwera PHP. Jeeli chcesz sprawdzi biec


dat i czas ustawione na komputerze
klienckim, musisz posuy si JavaScriptem.
Funkcja checkdate() pobiera trzy parametry

Funkcje daty i czasu

miesic, dzie i rok i sprawdza,


czy okrelaj one poprawn dat.

Rysunek 3.20. Kod rdowy strony ujawnia sposb zapamitywania wybranych pozycji
menu za pomoc atrybutu selected="selected"

131

Rozdzia 3.

Wysyanie poczty
elektronicznej
Jedn z moich ulubionych cech PHP jest
atwo, z jak mona w tym jzyku wysya
e-maile. Na prawidowo skonfigurowanym
serwerze sprowadza si to do wywoania
funkcji mail().

Wysyanie poczty elektronicznej

mail ($do, $temat, $tresc);

Zmienna $do powinna zawiera adres e-mail


lub list adresw oddzielanych przecinkami.
Zmienna $temat przechowuje temat listu,
a w zmiennej $tresc umieszcza si waciw
wiadomo. Moe ona zawiera ujte
w cudzysowy znaki nowego wiersza (\n),
dziki czemu tre wiadomoci bdzie
wywietlana na ekranie w kilku wierszach.
Funkcja mail() ma te czwarty, opcjonalny
parametr, w ktrym mog znale si
dodatkowe nagwki wiadomoci (From,
Reply-To, Cc, Bcc, etc.). Na przykad:
mail ('phpmysql@dmcinsights.com',
'Pytanie dotyczce listingu 3.13',
$tresc, 'From: osoba@adres.com');

Jeeli chcesz uy kilku rnych nagwkw,


oddziel je od siebie znakami \r\n:
$naglowki = 'From: Jan@Kowalski.pl\r\n';
$naglowki .= 'Cc: Janina@Kowalska.pl,
Janina@Kowalska\r\n';
mail ('phpmysql@dmcinsights.com',
'Pytanie dotyczce listingu 3.13',
$tresc, $naglowki);

W ostatnim przykadzie zamieszczonym


w tym rozdziale stworz prosty formularz
rejestracji. Jeli rejestracja zakoczy si
pomylnie, to wyle on wiadomo poczt
elektroniczn. W przykadzie tym
zademonstruj rwnie prosty sposb
obsugi i raportowania wielu bdw
zwizanych z wysaniem formularza.

132

Aby wysa e-mail:


1. Rozpocznij w edytorze tekstw nowy skrypt

PHP (patrz listing 3.13).


<?php # Script 3.13 - register.php
$page_title = 'Rejestracja';
include ('./includes/naglowek.html');

2. Utwrz wyraenie warunkowe sprawdzajce,

czy formularz zosta wysany oraz zmienn


przechowujc bdy rejestracji.
if (isset($_POST['submitted'])) {
$errors = array();

Zmienna $errors bdzie przechowywa


wszystkie bdy zwizane z weryfikacj danych
formularza. Zostaje zainicjowana jako tablica,
co nie jest konieczne, ale stanowi przykad
dobrego stylu programowania.
3. Sprawd, czy uytkownik wprowadzi swoje

nazwisko i adres poczty elektronicznej.


if (empty($_POST['name'])) {
$errors[] = 'Zapomniae wprowadzi
nazwisko.';
}
if (empty($_POST['email'])) {
$errors[] = 'Zapomniae wprowadzi adres
poczty elektroniczej.';
}

Weryfikacja tych dwch pl odbywa si


w najprostszy sposb poprzez sprawdzenie,
czy nie s puste. Jeli ktre z nich jest puste,
to do tablicy $errors zostaje dodany
odpowiedni komunikat.
W rozdziale 10., Zabezpieczenia, dowiesz
si, jak za pomoc wyrae regularnych
mona weryfikowa adresy e-mail
wprowadzane przez uytkownikw.

Tworzenie dynamicznych stron WWW


Listing 3.13. Funkcja mail() jest zaskakujco prosta w uyciu

35
36
37
38

<?php # Skrypt 3.13 - register.php


$page_title = 'Zarejestruj si';
include ('./includes/naglowek.html');
// Sprawd czy formularz zosta wysany.
if (isset($_POST['submitted'])) {
$errors = array(); // Zainicjalizuj tablic bdw.

// Zweryfikuj nazwisko.
if (empty($_POST['name'])) {
$errors[] = 'Zapomniae wprowadzi nazwisko.';

// Zweryfikuj adres poczty elektronicznej.


if (empty($_POST['email'])) {
$errors[] = 'Zapomniae wprowadzi adres poczty elektronicznej.';
}

Wysyanie poczty elektronicznej

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

// Zweryfikuj haso.
if (!empty($_POST['password1'])) {
if ($_POST['password1'] != $_POST['password2']) {
$errors[] = 'Hasa nie s takie same.';
}
} else {
$errors[] = 'Zapomniae wprowadzi hasa.';
}
if (empty($errors)) { // Jeli nie ma bdw.
// Zarejestruj uytkownika.
// Wylij wiadomo poczt elektroniczn.
$body = "Dzikujemy za zarejestrowanie si na naszej stronie!\nTwoje haso to
'{$_POST['password1']}'.\n\nZ powaaniem,\nMy";
mail ($_POST['email'], 'Dzikujemy za zarejestrowanie si!', $body,
'From:admin@strona.com');
echo '<h1 id="mainhead">Dzikujemy!</h1>
<p>Zostae zarejestrowany. Potwierdzenie zostao wysane poczt elektroniczn.</p><p><br
/></p>';

39
40 } else { // Raportuj bdy.
41
42
echo '<h1 id="mainhead">Bd!</h1>
43
<p class="error">Wystpiy nastpujce bdy:<br />';
44
foreach ($errors as $msg) { // Wywietl kady bd.
45
echo " - $msg<br />\n";
46
}
47
echo '</p><p>Wypenij formularz jeszcze raz.</p><p><br /></p>';
48
49
} // Koniec if (empty($errors))
50
51 } else { // Wywietl formularz.

133

Rozdzia 3.
4. Zweryfikuj haso.
if (!empty($_POST['password1'])) {
if ($_POST['password1'] != $_POST
['password2']) {
$errors[] = 'Hasa nie s takie same.';
}
} else {
$errors[] = 'Zapomniae wprowadzi
hasa.';
}

Wysyanie poczty elektronicznej

Weryfikacja hasa odbywa si w dwch


etapach. Najpierw sprawdzam, czy nie jest
ono puste, a nastpnie, czy haso wprowadzone
po raz drugi jest takie samo. Jeli ktry z tych
warunkw nie jest speniony, to do tablicy
$errors wstawiany jest kolejny komunikat
o bdzie.
5. Sprawd, czy podczas weryfikacji danych

Listing 3.13. Funkcja mail() jest zaskakujco


prosta w uyciu cig dalszy
52
53
54
55
56
57
58
59

wystpiy bdy.
if (empty($errors)) {

Jeli nie, to tablica bdw jest pusta i mona


wysa potwierdzenie rejestracji jako wiadomo
poczty elektronicznej.
6. Wylij wiadomo poczty elektronicznej.
$body = "Dzikujemy za zarejestrowanie si
na naszej stronie!\nTwoje haso to
'{$_POST['password1']}'.\n\nZ
powaaniem,\nMy";
mail ($_POST['email'], 'Dzikujemy
za zarejestrowanie si!', $body,
'From:admin@strona.com');

Przed wysaniem wiadomoci skadam jej tre


i przypisuj j do zmiennej $body. Dopiero
wtedy wywouj funkcj mail().

134

60
61
62
63
64
65

?>
<h2>Rejestracja</h2>
<form action="rejestracja.php"
method="post">
<p>Nazwisko: <input type="text"
name="name" size="20" maxlength="40"
/></p>
<p>E-mail: <input type="text"
name="email" size="20"
maxlength="40" /> </p>
<p>Haso: <input type="password"
name="password1" size="10"
maxlength="20" /></p>
<p>Potwierd haso: <input
type="password" name="password2"
size="10" maxlength="20" /></p>
<p><input type="submit"
name="submit" value="Zarejestruj
si" /></p>
<input type="hidden"
name="submitted" value="TRUE" />
</form>
<?php
} // Koniec gwnego wyraenia
warunkowego.
include ('./includes/stopka.html');
?>

Tworzenie dynamicznych stron WWW


7. Wywietl komunikat.
echo '<h1 id="mainhead">Dzikujemy!</h1>
<p>Zostae zarejestrowany.
Potwierdzenie zostao wysane poczt
elektroniczn.
</p><p><br /></p>';

Na razie skrypt nie rejestruje jeszcze


uytkownika, ale funkcjonalno t
dodamy wkrtce.
8. Uzupenij wewntrzne wyraenie
Rysunek 3.21. Jeli formularz nie bdzie wypeniony
w caoci, wywietlone zostan komunikaty o bdzie

warunkowe raportem bdw.

Poniewa zmienna $errors jest tablic,


mog atwo wywietli wszystkie
komunikaty o bdach, uywajc ptli
(rysunek 3.21).
9. Zakocz gwne wyraenie warunkowe

i zamknij znaczniki PHP.


} else {
?>

W ten sposb zostao zamknite wyraenie


warunkowe sprawdzajce czy formularz
zosta wysany. Teraz, na zewntrz
znacznikw PHP, stworz formularz.

135

Wysyanie poczty elektronicznej

} else {
echo '<h1 id="mainhead">Bad!</h1>
<p class="error">Wystpiy
nastpujce bdy:<br />';
foreach ($errors as $msg) {
echo " - $msg<br />\n";
}
echo '</p><p>Wypenij formularz
jeszcze raz.</p><p><br /></p>';
}

Rozdzia 3.

Wysyanie poczty elektronicznej

10. Utwrz formularz HTML.


<h2>Rejestracja</h2>
<form action="register.php"
method="post">
<p>Nazwisko: <input type="text"
name="name" size="20"
maxlength="40" /></p>
<p>Adres poczty elektronicznej: <input
type="text" name="email"
size="20" maxlength="40" /> </p>
<p>Haso: <input type="password"
name="password1" size="10"
maxlength="20" /></p>
<p>Potwierd haso: <input
type="password" name="password2"
size="10" maxlength="20" /></p>
<p><input type="submit"
name="submit" value=
"Zarejestruj si" /></p>
<input type="hidden" name="submitted"
value="TRUE" />
</form>

Brak tu specjalnych nowoci, moe oprcz


koniecznoci dwukrotnego wprowadzenia
hasa. Jest to konieczne, poniewa znaki hasa
nie s widoczne podczas ich wprowadzania
(rysunek 3.22). Gdyby uytkownik wprowadza
haso tylko jeden raz i pomyli si, nie
wiedziaby jakie haso w rzeczywistoci
wprowadzi.
11. Zakocz stron PHP.
<?php
}
include ('./includes/footer.html');
?>

Nawias klamrowy zamyka gwne wyraenie


warunkowe (ktre sprawdza, czy formularz
zosta wysany).
12. Zapisz plik pod nazw rejestracja.php,

wgraj go na serwer i przetestuj w przegldarce


internetowej (rysunek 3.23).

136

Rysunek 3.22. Formularz rejestracji

Rysunek 3.23. po pomylnym wypenieniu

Tworzenie dynamicznych stron WWW


Jeli wystpi dziwny komunikat o bdzie
(From header missing lub No SMTP server),
lub nie dostaniesz wiadomoci poczty
elektronicznej z potwierdzeniem rejestracji,
zapoznaj si z treci ramki Funkcja mail()
a konfiguracja poczty elektronicznej
13. Sprawd, czy dostae potwierdzenie poczt
Rysunek 3.24. E-mail wysany do mnie
przez funkcj mail()

elektroniczn (rysunek 3.24).


Wskazwki
W niektrych systemach, gwnie pochodnych
systemu Unix, zamiast sekwencji \r\n
powiniene uywa samego \n.
Funkcja mail() zwraca warto 0 lub 1,

Gdy wykorzystujesz funkcj mail() w sposb

pokazany w tym rozdziale, nie moesz wysya


wiadomoci z zacznikami ani stosowa
formatowania HTML. Jeeli zaley Ci
na wysyaniu zacznikw, musisz wykorzysta
odpowiedni klas MIME. Poszukaj
w rozdziale 11. informacji na temat PEAR.

137

Wysyanie poczty elektronicznej

informujc tym samym, e zostaa ona


prawidowo wywoana. Nie oznacza to
jednak jeszcze, e udao si wysa e-maile
ani e zostay one odebrane przez adresata.

Rozdzia 3.

Wysyanie poczty elektronicznej

Funkcja mail() a konfiguracja poczty elektronicznej


Funkcja mail() uywana w skryptach PHP nie wysya sama wiadomoci poczty
elektronicznej, lecz przekazuje to zadanie serwerowi poczty elektronicznej. Oznacza to,
e Twj komputer musi mie dziaajcy serwer poczty elektronicznej, aby funkcja mail()
dziaaa poprawnie.
Jeli Twj komputer pracuje pod kontrol jednego z wariantw systemu Unix lub gdy
uywasz zewntrznego, komercyjnego serwera WWW, to korzystanie z funkcji mail()
nie powinno przysparza kopotw. Natomiast jeli wykonujesz skrypty PHP na wasnym
komputerze, to prawdopodobnie bdziesz musia go dodatkowo skonfigurowa
Jeli Twj komputer pracuje pod kontrol systemu Windows i masz konto u dostawcy usug
internetowych udostpniajcego serwer SMTP (na przykad smtp.comcast.net), to powiniene
skonfigurowa go w pliku php.ini. Jednak rozwizanie takie bdzie dziaa tylko pod
warunkiem, e serwer ten nie wymaga uwierzytelniania za pomoc nazwy i hasa. W takim
przypadku bdziesz musia zainstalowa wasny serwer SMTP. Dostpnych jest wiele
rnych implementacji serwera SMTP (wyszukaj w internecie haso free windows smtp
server), a przekonasz si, e ich instalacja nie jest trudna.

138

You might also like