You are on page 1of 390

Spis Treci

SPIS TRECI............................................................................................................................................................ 1
WSTP...................................................................................................................................................................... 7
Dla kogo jest przeznaczona ta ksika............................................................................................................... 7
Konwencje .......................................................................................................................................................... 7
Omwienie ksiki.............................................................................................................................................. 7
Od autora ........................................................................................................................................................... 8
Przykady kodu ................................................................................................................................................... 8
CZYM JEST PHP ...................................................................................................................................................... 8
DLACZEGO POWINIENE UY PHP......................................................................................................................... 9
GDZIE SZUKA POMOCY.......................................................................................................................................... 9
PODZIKOWANIA................................................................................................................................................... 10
O AUTORZE ........................................................................................................................................................... 10
ROZDZIA 1. KOMPILACJA I INSTALOWANIE PHP................................................................................ 11
WSTP................................................................................................................................................................... 11
POBIERANIE PHP................................................................................................................................................... 11
INSTALOWANIE WERSJI BINARNEJ.......................................................................................................................... 11
Binarna instalacja dla Windows ...................................................................................................................... 11
Instalowanie PHP w postaci moduu ISAPI................................................................................................. 12
Uycie PHP jako CGI................................................................................................................................... 14
Inne instalacje binarne..................................................................................................................................... 14
KOMPILOWANIE PHP ............................................................................................................................................ 15
Kompilowanie PHP w Uniksach...................................................................................................................... 15
Kompilacja moduu CGI .............................................................................................................................. 15
Kompilacja PHP jako statycznie doczanego moduu Apache................................................................... 17
Kompilacja PHP do postaci dynamicznie adowanego moduu Apache ..................................................... 17
Podsumowanie kompilacji PHP w systemach Unix .................................................................................... 18
Kompilowanie PHP w rodowisku Windows ................................................................................................... 18
Podsumowanie kompilacji PHP....................................................................................................................... 20
KONFIGUROWANIE PHP........................................................................................................................................ 20
Korzystanie z pliku php.ini ............................................................................................................................... 20
Inne metody zmiany konfiguracji PHP............................................................................................................. 21
PODSUMOWANIE ................................................................................................................................................... 22
ROZDZIA 2. JZYK.......................................................................................................................................... 23
WSTP................................................................................................................................................................... 23
OGLNE INFORMACJE NA TEMAT SKADNI ............................................................................................................ 23
TYPY ..................................................................................................................................................................... 24
Liczby cakowite i zmiennoprzecinkowe ...................................................................................................... 24
Cigi ................................................................................................................................................................. 24
Tablice.............................................................................................................................................................. 25
ZMIENNE I STAE................................................................................................................................................... 26
Zmienne predefiniowane .................................................................................................................................. 26
Zasig zmiennych ............................................................................................................................................. 30
Stae.................................................................................................................................................................. 31
OPERATORY I KOLEJNO OPERATORW............................................................................................................... 31
PROGRAMOWANIE PRZEPYWU STEROWANIA ....................................................................................................... 32
if, else, elseif ..................................................................................................................................................... 32
while ................................................................................................................................................................. 32
do .. while ......................................................................................................................................................... 32
for ..................................................................................................................................................................... 33
foreach.............................................................................................................................................................. 33
switch................................................................................................................................................................ 33
break i continue................................................................................................................................................ 35
include i require ............................................................................................................................................... 36
FUNKCJE................................................................................................................................................................ 36
Klasy i programowanie obiektowe................................................................................................................... 37
PORWNYWANIE WZORCW ................................................................................................................................. 39
Podsumowanie ................................................................................................................................................. 39
ROZDZIA 3. FORMULARZE I COOKIE....................................................................................................... 40
WSTP................................................................................................................................................................... 40
OBSUGA FORMULARZY W PHP............................................................................................................................ 41
Skalarne i wielowartociowe elementy formularza.......................................................................................... 41
Alternatywne metody odczytywania wartoci z formularza ............................................................................. 42
Uycie formularzy do przesyania plikw ........................................................................................................ 45
Uycie rysunku jako przycisku wysania danych.............................................................................................. 45
KONTROLA POPRAWNOCI DANYCH FORMULARZA................................................................................................ 46
Kontrola danych za pomoc wyrae regularnych.......................................................................................... 46
Kontrola poprawnoci za pomoc sprawdzania typw.................................................................................... 47
Klasa Validator ................................................................................................................................................ 48
COOKIE ................................................................................................................................................................. 49
WANE ZAGADNIENIA PROGRAMOWANIA DLA WWW.......................................................................................... 50
Obsuga nieprawidowych danych ................................................................................................................... 50
Obsuga i formatowanie wywietlanych danych .............................................................................................. 52
PODSUMOWANIE ................................................................................................................................................... 57
ROZDZIA 4. OPERACJE NA PLIKACH........................................................................................................ 58
WSTP................................................................................................................................................................... 58
ODCZYT I ZAPIS PLIKW........................................................................................................................................ 58
UYCIE GNIAZD..................................................................................................................................................... 59
UYCIE POTOKW................................................................................................................................................. 60
KLASA FILE........................................................................................................................................................... 61
PODSUMOWANIE ................................................................................................................................................... 61
ROZDZIA 5. WYSYANIE PLIKW PRZEZ FORMULARZ.................................................................... 62
WSTP................................................................................................................................................................... 62
WYSYANIE POJEDYNCZEGO PLIKU....................................................................................................................... 62
PUAPKI ................................................................................................................................................................ 64
PRZESYANIE WIELU PLIKW................................................................................................................................ 64
BEZPIECZESTWO ................................................................................................................................................. 65
PODSUMOWANIE ................................................................................................................................................... 66
ROZDZIA 6. WSPPRACA Z BAZAMI DANYCH.................................................................................... 67
WSTP................................................................................................................................................................... 67
WPROWADZENIE ................................................................................................................................................... 67
FUNKCJE BAZ DANYCH.......................................................................................................................................... 67
MYSQL................................................................................................................................................................. 68
Spis Treci 2

Rozpoczynamy prac z MySQL ........................................................................................................................ 68
Uycie MySQL.................................................................................................................................................. 68
ODBC................................................................................................................................................................... 71
Podstawy ODBC .............................................................................................................................................. 71
Instalowanie i kompilowanie unixODBC.................................................................................................... 72
Kompilowanie PHP z obsug unixODBC .................................................................................................. 72
Instalowanie sterownika OOB...................................................................................................................... 72
Konfigurowanie OOB.................................................................................................................................. 72
Korzystanie z ODBC ........................................................................................................................................ 73
PHPLIB................................................................................................................................................................ 74
PRZECHOWYWANIE DANYCH Z FORMULARZY........................................................................................................ 75
WYKORZYSTANIE MOLIWOCI BAZY DANYCH..................................................................................................... 77
PODSUMOWANIE ................................................................................................................................................... 78
ROZDZIA 7. SESJE I STAN APLIKACJI....................................................................................................... 80
WSTP................................................................................................................................................................... 80
PODSTAWY MECHANIZMU SESJI ............................................................................................................................. 80
WBUDOWANY W PHP MECHANIZM ZARZDZANIA SESJAMI .................................................................................. 81
Rozpoczcie pracy z sesjami w PHP................................................................................................................ 81
Przesyanie identyfikatora sesji bez uycia cookie........................................................................................... 83
Zapisywanie zmiennych sesji w bazie danych.................................................................................................. 85
Inne funkcje i opcje dotyczce sesji.................................................................................................................. 89
UYCIE PHPLIB DO OBSUGI SESJI....................................................................................................................... 90
TWORZENIE WASNEGO MECHANIZMU SESJI ......................................................................................................... 92
INYNIERIA PROGRAMOWANIA A SESJE ................................................................................................................. 92
PODSUMOWANIE ................................................................................................................................................... 94
ROZDZIA 8. UWIERZYTELNIANIE.............................................................................................................. 95
WSTP................................................................................................................................................................... 95
PODSTAWOWE UWIERZYTELNIANIE W APACHE..................................................................................................... 95
AKTUALIZACJA PLIKU .HTACCESS PRZY UYCIU PHP............................................................................................ 97
PODSTAWOWE UWIERZYTELNIANIE ZA POMOC PHP ........................................................................................... 99
KOMPLETNY SYSTEM UWIERZYTELNIANIA OPARTY O PHP ................................................................................. 100
PODSUMOWANIE ................................................................................................................................................. 104
ROZDZIA 9. NIEZALENO OD PRZEGLDARKI ............................................................................. 105
WSTP................................................................................................................................................................. 105
ROZPOCZYNAMY................................................................................................................................................. 105
WEWNTRZNE FUNKCJE PHP.............................................................................................................................. 106
Dodatkowe informacje na temat Browscap ................................................................................................... 106
BROWSERHAWK.................................................................................................................................................. 109
WYKORZYSTANIE DANYCH O PRZEGLDARCE..................................................................................................... 113
PODSUMOWANIE ................................................................................................................................................. 114
ROZDZIA 10. URUCHAMIANIE................................................................................................................... 115
WSTP................................................................................................................................................................. 115
INYNIERIA PROGRAMOWANIA A URUCHAMIANIE ............................................................................................... 115
Projekt aplikacji ............................................................................................................................................. 115
Definiowanie standardw programowania.................................................................................................... 116
Przegld oprogramowania............................................................................................................................. 116
Testowanie...................................................................................................................................................... 117
Uruchamianie................................................................................................................................................. 117
PROGRAMOWANIE DEFENSYWNE......................................................................................................................... 118
WASNA OBSUGA BDW................................................................................................................................ 122
PHP Kompendium wiedzy
3
ZAAWANSOWANA OBSUGA BDW ................................................................................................................. 125
PODSUMOWANIE ................................................................................................................................................. 129
BIBLIOGRAFIA..................................................................................................................................................... 130
ROZDZIA 11. PONOWNE WYKORZYSTANIE KODU............................................................................ 131
WSTP................................................................................................................................................................. 131
PONOWNE WYKORZYSTANIE KODU A INYNIERIA PROGRAMOWANIA.................................................................. 131
PONOWNE UYCIE ISTNIEJCEGO KODU .............................................................................................................. 132
PHP................................................................................................................................................................ 132
C/C++............................................................................................................................................................ 133
Java ................................................................................................................................................................ 138
Dodawanie obsugi Javy w PHP na *niksach ............................................................................................ 138
Doczanie obsugi Javy w PHP dla Windows .......................................................................................... 139
Opcje konfiguracji Javy.............................................................................................................................. 139
COM............................................................................................................................................................... 141
Inne metody .................................................................................................................................................... 143
PODSUMOWANIE ................................................................................................................................................. 144
BIBLIOGRAFIA..................................................................................................................................................... 144
ROZDZIA 12. ODDZIELANIE KODU HTML OD PHP............................................................................. 145
WSTP................................................................................................................................................................. 145
WPROWADZENIE ................................................................................................................................................. 145
ODDZIELENIE I INTEGRACJA PRZY UYCIU WBUDOWANYCH FUNKCJI PHP.......................................................... 146
Motywacja ...................................................................................................................................................... 146
Implementacja ................................................................................................................................................ 147
Czego naley unika....................................................................................................................................... 151
Podsumowanie: Oddzielanie i integracja przy wykorzystaniu funkcji PHP.................................................. 151
WYKORZYSTANIE SYSTEMU SZABLONW............................................................................................................ 152
FastTemplate.................................................................................................................................................. 152
Zaawansowane techniki uycia FastTemplate ............................................................................................... 157
PODSUMOWANIE ................................................................................................................................................. 159
BIBLIOGRAFIA..................................................................................................................................................... 159
ROZDZIA 13. FAJNY PHP.............................................................................................................................. 160
WSTP................................................................................................................................................................. 160
WYSYANIE DO PRZEGLDARKI PLIKW INNYCH NI HTML.............................................................................. 160
SKRYPTY AUTOMATYZUJCE .............................................................................................................................. 164
WDDX................................................................................................................................................................ 168
MONITOROWANIE SIECI ....................................................................................................................................... 172
PODSUMOWANIE ................................................................................................................................................. 174
ROZDZIA 14. WITRYNY OPARTE O SZABLONY................................................................................... 175
PODSTAWY WYKORZYSTANIA SZABLONW......................................................................................................... 175
ZAPOYCZANIE ................................................................................................................................................... 183
PERSONALIZACJA WITRYNY................................................................................................................................. 185
OBSUGA WIELU JZYKW.................................................................................................................................. 187
PODSUMOWANIE ................................................................................................................................................. 189
ROZDZIA 15. WITRYNY OPARTE O BAZ DANYCH............................................................................ 190
WSTP................................................................................................................................................................. 190
PROJEKT BAZY DANYCH ...................................................................................................................................... 190
ZARZDZANIE DANYMI APLIKACJI....................................................................................................................... 192
WYWIETLANIE DANYCH .................................................................................................................................... 199
PODSUMOWANIE ................................................................................................................................................. 204
Spis Treci 4

ROZDZIA 16. GENEROWANIE STATYCZNYCH STRON HTML W OPARCIU O DYNAMICZNE
DANE..................................................................................................................................................................... 205
WSTP................................................................................................................................................................. 205
KONCEPCJA......................................................................................................................................................... 205
GENEROWANIE STRON STATYCZNYCH................................................................................................................. 205
Uycie buforowania........................................................................................................................................ 205
Uycie FastTemplate...................................................................................................................................... 207
TECHNIKI BUFOROWANIA.................................................................................................................................... 208
PODSUMOWANIE ................................................................................................................................................. 210
ROZDZIA 17. WITRYNY HANDLU ELEKTRONICZNEGO................................................................... 211
WSTP................................................................................................................................................................. 211
BEZPIECZESTWO ............................................................................................................................................... 211
Zastosowanie SSL........................................................................................................................................... 211
Certyfikaty ...................................................................................................................................................... 211
Bezpieczestwo bazy danych.......................................................................................................................... 212
PRZETWARZANIE PATNOCI............................................................................................................................... 212
DOSTARCZANIE PRODUKTW.............................................................................................................................. 219
PODSUMOWANIE ................................................................................................................................................. 220
DODATEK A. FUNKCJE................................................................................................................................... 221
DODATEK B. PREDEFINIOWANE ZMIENNE I STAE PHP................................................................... 367
ZMIENNE ............................................................................................................................................................. 367
Zmienne Apache ............................................................................................................................................. 367
Zmienne rodowiska....................................................................................................................................... 369
Zmienne PHP ................................................................................................................................................. 369
STAE.................................................................................................................................................................. 370
DODATEK C. OPCJE KOMPILACJI PHP..................................................................................................... 372
BAZY DANYCH .................................................................................................................................................... 372
HANDEL ELEKTRONICZNY................................................................................................................................... 374
GRAFIKA ............................................................................................................................................................. 374
RNE................................................................................................................................................................. 375
--enable-inline-optimization........................................................................................................................... 376
SIE..................................................................................................................................................................... 379
DZIAANIE PHP .................................................................................................................................................. 379
SERWER............................................................................................................................................................... 380
TEKST I JZYK ..................................................................................................................................................... 380
XML................................................................................................................................................................... 381
DODATEK D. OPCJE KONFIGURACJI PHP ............................................................................................... 382
OGLNE DYREKTYWY KONFIGURACJI ................................................................................................................. 382
DYREKTYWY KONFIGURACJI POCZTY.................................................................................................................. 385
DYREKTYWY KONFIGURACJI TRYBU BEZPIECZNEGO ........................................................................................... 385
DYREKTYWY KONFIGURACJI DEBUGGERA........................................................................................................... 385
DYREKTYWY ADOWANIA ROZSZERZE ............................................................................................................. 385
DYREKTYWY KONFIGURACJI MYSQL................................................................................................................. 386
DYREKTYWY KONFIGURACJI MSQL.................................................................................................................... 386
DYREKTYWY KONFIGURACJI POSTGRESQL ........................................................................................................ 386
DYREKTYWY KONFIGURACJI SYBASE.................................................................................................................. 387
DYREKTYWY KONFIGURACJI SYBASE-CT ........................................................................................................... 387
DYREKTYWY KONFIGURACJI INFORMIX .............................................................................................................. 388
DYREKTYWY KONFIGURACJI BC MATH.............................................................................................................. 389
PHP Kompendium wiedzy
5
DYREKTYWY KONFIGURACJI MOLIWOCI PRZEGLDAREK................................................................................ 389
DYREKTYWY KONFIGURACJI ZUNIFIKOWANEGO ODBC..................................................................................... 389
DODATEK E. ZASOBY SIECI.......................................................................................................................... 390
Spis Treci 6
Wstp
Ksika ta jest przeznaczona dla programistw tworzcych aplikacje WWW za pomoc PHP. Naley
zwrci uwag, e zostao uyte okrelenie aplikacje WWW a nie strony WWW lub witryny WWW. W
przeszoci w Sieci znajdoway si w wikszoci proste strony HTML o ograniczonej moliwoci interakcji.
Dzisiejszy obraz Sieci jest o wiele bardziej skomplikowany. Uytkownicy i firmy oczekuj od Sieci coraz wicej.
Powoduje to powstanie coraz wikszej iloci dynamicznych aplikacji WWW. PHP jest idealny do tworzenia
takich aplikacji, poniewa zosta zaprojektowany wanie do realizacji tego zadania.
Dla kogo jest przeznaczona ta ksika
Ksika ta powinna by uyteczna dla szerokiego grona programistw WWW, ale pisana bya z myl o
rednio zaawansowanych lub zaawansowanych programistach. PHP jest jzykiem programowania a nie jzykiem
opisu strony, wic przydatne bdzie dowiadczenie w programowaniu. Programici znajcy C lub Perla powinni
uzna PHP za jzyk bardzo przyjazny, natomiast programici pracujcy w ASP Microsoftu (Active Server Pages)
uznaj PHP za jzyk o podobnej strukturze.
Poniewa ksika ta nie jest kierowana do pocztkujcych programistw, podstawowe pojcia dotyczce
programowania zostan przedstawione bardzo skrtowo. Zakada si, e Czytelnik zna takie pojcia
programowania, jak funkcje, zmienne i stae.
Konwencje
W ksice przyjto nastpujce konwencje:
Kod programu i jego wyniki zaznaczone s czcionk o staej szerokoci.
Nazwy plikw i katalogw zaznaczone s czcionk pochy.
Komendy i elementy jzyka zaznaczone s czcionk o staej szerokoci.
Omwienie ksiki
Ksika zawiera zwize wprowadzenie do PHP, oraz opis jzyka. Zosta w niej rwnie przedstawiony
sposb instalacji i konfiguracji PHP.
Druga cz, Specjalne wymagania przy programowaniu WWW, przeznaczona jest dla programistw
tradycyjnych aplikacji rozpoczynajcych prac przy aplikacjach WWW. W czci tej przedstawione zostay takie
zagadnienia jak: przetwarzanie formularzy, interakcj z uytkownikiem, utrzymywanie stanu oraz niezaleno
od przegldarki.
Nastpna cz, Zarzdzanie projektem aplikacji WWW opisuje zalety modularnoci i powtrnego
uycia kodu.
Cz Przykady zastosowa pokazuje uycie PHP na podstawie fragmentw dziaajcych ju aplikacji.
Cz ta czy zagadnienia przedstawione w poprzednich czciach i pokazuje przykady penej wymiany
informacji pomidzy przegldark uytkownika i aplikacj zainstalowan na serwerze WWW.
Na kocu ksiki znajduje si skorowidz zawierajcy wszystkie funkcje PHP4.
Od autora
Od okoo trzech lat tworz aplikacje WWW przy uyciu PHP i ASP, jako niezaleny przedsibiorca.
Fundamentem mojego sukcesu byo uycie PHP, poniewa pozwala on na szybkie budowanie prototypw, oraz
jest wystarczajco wydajny i pewny nawet do tworzenia duych aplikacji WWW.
Celem tej ksiki jest przekazanie innym programistw uytecznych informacji. Nie bd opisywa rnic
pomidzy PHP i innymi tego typu narzdziami i nie bd zajmowa si histori PHP. Wszystkie te informacje
mona znale na oficjalnej witrynie PHP, www.php.net. Zamiast tego poka zastosowanie PHP do stworzenia
aplikacji WWW. Omwi rwnie inynieri programowania w projektach WWW, sposoby przeniesienia
istniejcego kodu do nowych projektw WWW. Przedstawi rwnie kilka przydatnych narzdzi napisanych dla
PHP.
Przykady kodu
Zamieszczone przykady kodu byy tworzone i testowane pzy uyciu PHP 4.0.1 (poprawka 2) na Apache
1.3.11 dziaajcym w systemie RedHat 6.1. Do edycji plikw HTML i PHP wykorzystuj edytor Allaire Homeite
4.5.1 zainstalowany na Windows NT.
Do testowania maych fragmentw kodu stosowaem nastpujcy szablon HTML do ktrego wklejaem
odpowiedni kod PHP:
<html>
<head>
<title>Nazwa przykadu</title>
</head>
<body>
<!-- Kod PHP wklei poniej -->
</body>
</html>
Wiksze fragmenty kodu byy tworzone od razu razem z kodem HTML.
Czym jest PHP
PHP to jzyk programowania przeznaczony dla programistw WWW pozwalajcy na szybkie tworzenie
dynamicznych aplikacji WWW. Oficjalnym rozwiniciem skrtu PHP jest PHP: Hypertext Preprocessor
(preprocesor hipertekstu). Jest to jzyk programowania osadzany w HTML skadniowo podobny do C, Perla i
Javy. Na wydruku 1. przedstawiony jest przykad kodu PHP.
Wydruk 1. Prosty przykad kodu PHP
<html>
<head>
<title>Prosty przykad kodu PHP</title>
</head>
<body>
<?php
echo "Witajcie w PHP!" ;
?>
</body>
</html>
Po uruchomieniu tego przykadu (poprzez odpowiednio skonfigurowany serwer WWW) generowany jest
kod HTML zamieszczony na wydruku 2.
Wydruk 2. Wynik dziaania wydruku 1
<html>
<head>
<title>Prosty przykad kodu PHP</title>
</head>
<body>
Witajcie w PHP! </body>
</html>
Preprocesor PHP wykonuje cay kod zawarty pomidzy znacznikami <?php i ?> umieszczonymi w kodzie
HTML i zwraca wynik w postaci tekstu. Nie jest to szczeglnie interesujcy, ale pokazuje jak atwo mona
umieszcza kod PHP w kodzie HTML. Naley pamita, e kod ten jest wykonywany na serwerze WWW a nie
na kliencie. Oznacza to, e przegldarka nie wie, e do stworzenia strony by uywany PHP. Otrzymuje ona po
prostu strumie kodu HTML, identycznie jak w przypadku zwykych stron. Wicej na ten temat znajduje si w
Wstp 8

czci Specjalne wymagania przy programowaniu WWW.
Dlaczego powiniene uy PHP
PHP jest penowartociowym jzykiem programowania pozwalajcy na tworzenie aplikacji WWW z
wszystkimi potrzebnymi funkcjami. PHP wsppracuje z wieloma systemami baz danych. Pozwala to na bardzo
atwe tworzenie aplikacji WW korzystajcych z informacji zapisanych w bazie danych. Moliwy jest rwnie
dostp do usug sieciowych takich jak IMAP, POP3, NNTP i TTP. Pozwala on rwnie na otwieranie gniazd
sieciowych i podczanie si do innych protokow TCP/IP.
PHP moe by uyty we wielu konfiguracjach serwerw. Poniewa PHP jest rozprowadzany gwnie w
postaci kodu rdowego, moe by skompilowany na wielu rnych platformach, na przykad na Linuksie,
FreeBSD i nawet na Windows. Dostpne s rwnie binarne dystrybucje dla Win32.
PHP moe dziaa jako program CGI lub moe by zainstalowany jako modu Apache lub rozszerzenie
ISAPI. Dziki temu moe on dziaa z praktycznie kadym serwerem WWW, od Apache na Linuksie do IIS na
Windows NT. W celu utworzenia najbardziej elastycznego rodowiska pracy naley samodzielnie skompilowa i
zainstalowa PHP. Jeeli wolisz szybko zacz prac, moesz zastosowa binarn dystrybucj PHP.
Gdzie szuka pomocy
Pomoc mona uzyska na witrynie PHP oraz poprzez kilka grup dyskusyjnych i wysykowych. W lutym
2000 roku okoo 1400000 domen korzystao z PHP. Poniewa jest on tak popularny, istnieje ogromna grupa
programistw i konsultantw, ktrzy mog odpowiedzie na pytania. Wicej informacji na temat dostpnych
zasobw Sieci znajduje si w czci Zasoby na kocu ksiki.
PHP Kompendium wiedzy
9

Podzikowania
Na pocztku chciabym podzikowa wszystkim z wydawnictwa McGraw-Hill za umoliwienie mi
zrealizowania tego zadania. Szczeglne podzikowania nale si Rebece Young za wsparcie i pomoc w
technicznych aspektach pisania ksiki. Dzikuj Johnowi Steele, mojemu redaktorowi technicznemu, ktry
niezmiernie pomg mi swoimi trafnymi uwagami i informacjami.
Oczywicie, naley podzikowa caemu zespoowi tworzcemu PHP. Wiele osb z tego zespou
pomagao mi w pracy nad ksik. Caa cz zawierajca skorowidz funkcji jest ich zasug. To oni spdzili
setki lub tysice godzin tworzc ten wspaniay jzyk programowania i bogat dokumentacj.
Dzikuj Mattowi Wilson za umoliwienie mi wykorzystania w przykadzie do ksiki kodu MWeather.
Dzikuj Nickowi Bradbury za pozwolenie wykorzystania informacji i rysunkw z edytora TopStyle.
Podzikowania dla Nate Weiss za pomoc przy uyciu deserializera WDDX dla JavaScript, dla Johna Kos za
pomoc przy unixODBC i EasySoft ODBC-ODBC Bridge. Dla Martina Evans, gwnego programisty ODBC-
ODBC Bridge, za stworzenie tego wietnego produktu. Dzikuj Michaelowi Justin za pomoc przy konwerterze
RTF do HTML firmy Scrooge. Dzikuj rwnie Michaelowi C. Battilana za pomoc przy Cloanto Currency
Server. Dla Sama Ockman za umoliwienie wykorzystania w ksice rysunku serwera Penguin 1U. Dzikuj
Richardowi Litofski za pomoc przy BrowserHawk. Podzikowania dla Ali Ersheid za umoliwienie
wykorzystania w ksice dokumentacji CyberCash. Dzikuj Josephowi Harris (znany jako CDI) za klas
FastTemplate oraz inne fantastyczne narzdzia dostpne na witrynie The Webmasters.net.
Dzikuj rodzicom i braciom za nieustanne wsparcie nawet, gdy w latach osiemdziesitych spdzaem
cae noce na pisaniu programw w Apple Basicu. Dzikuj pani Barton, pani Smith i panu Wakefield, moim
nauczycielom angielskiego z liceum, ktrzy mieli ogromny wpyw na moje pisanie. Dzikuj Garemu Rogers i
Jasonowi Wallin za wskazanie mi PHP i Linuksa w czasie gdy coraz bardziej pograem si wykorzystujc ASP
i Windows. Dzikuj Tracy Ard za poyteczne komentarze do tej pracy oraz za jego niezmienn przyja.
Na koniec najwaniejsze podzikowania nale si mojej onie i crce za umoliwienie mi zakoczenia tej
pracy. Teraz znw moemy wieczorami chodzi skaka na trampolinie.
O autorze
Blake Schwendiman rozpocz programowanie w 1980 roku rozpoczynajc od Apple IIe i jzyka Basic.
Zdoby licencjat na uniwersytecie Arizona State University w roku 1994. W chwili obecnej Blake zarzdza firm
Intechra LLC, http://www.intechra.net/, firm konsultingow specjalizujc si w oprogramowaniu, ktra ma
siedzib w Rexburg, Idaho. Intechra LLC specjalizuje si w tworzeniu oprogramowania dla WWW. Blake ma
on Holy i trzyletni crk. Mona si z nim skontaktowa pod adresem blake@intechra.net.
Wstp 10
Rozdzia 1. Kompilacja i instalowanie
PHP
Wstp
Zanim rozpoczniemy nauk jzyka PHP, naley go poprawnie zainstalowa i skonfigurowa w uywanym
rodowisku interpreter PHP. Poniewa pakiet PHP moe dziaa na wielu serwerach WWW i systemach
operacyjnych, w rozdziale tym znajd si szczegowe opisy instalacji na jedynie kilku platformach, ale podane
informacje s wystarczajco uniwersalne i mog by wykorzystane przy konfigurowaniu rodowiska pracy na
innych platformach.
W rozdziale tym opisane zostan szczegowo Apache dla Linuksa oraz IIS dla Windows NT. S to czsto
spotykane konfiguracje serwerw WWW i s one na tyle rne, e ilustruj oglne zasady instalacji pakietu PHP
na wikszoci platform. Szczegowe dane na temat okrelonej platformy mona rwnie znale na witrynie
www.php.net.
Pobieranie PHP
Pierwszym krokiem do rozpoczcia pracy z PHP jest zaopatrzenie si w kopi interpretera PHP. Na
witrynie www.php.net umieszczone jest kilka wariantw tego pakietu. Najnowsza wersja zawsze znajduje si na
grze listy. W przypadku serwerw uniksowych zaleca si pobranie pakietu zawierajcego kompletny kod
rdowy i przeprowadzenie samodzielnej kompilacji. Platformy uniksowe to midzy innymi Linux, BSD, Solaris
itp. W przypadku Windows zaleca si pobranie binarnej instalacji PHP.
Ze strony zawierajcej pakiety instalacyjne mona rwnie pobra poprzednie wersje programw,
dokumentacj i narzdzia pomocnicze. Poprzednie wersje mog by potrzebne, jeeli masz ju gdzie
zainstalowane PHP i nie chcesz ryzykowa niekompatybilnoci.
Instalowanie wersji binarnej
Po pobraniu binarnej dystrybucji PHP, instalacja jest banalna. Najczciej binarna instalacja PHP jest
przeznaczona dla Windows. Poniewa jednak niektre dystrybucje Uniksa zawieraj binarn dystrybucj PHP,
opisany zostanie rwnie taki przypadek.
Binarna instalacja dla Windows
W PHP prawie wszystkie operacje mona wykona na kilka sposobw. Instalacja binarna dla Windows
zawiera zarwno wersj CGI (Common Gateway Interface) PHP, jak rwnie wersj ISAPI. Jeeli korzystasz z
serwera IIS (Internet Information Server) lub PWS (Personal Web Server) zalecane jest uycie moduu ISAPI.
Wersja CGI powoduje, e PHP jest uruchamiany za kadym odwoaniem do strony, wic jest mniej efektywny od
dynamicznego moduu jakim jest rozszerzenie ISAPI. Modu ISAPI jest rwnie ze swojej natury bezpieczniejszy
od programu CGI.

Instalowanie PHP w postaci moduu ISAPI
Jeeli korzystasz z serwera IIS, PWS lub innego serwera WWW obsugujcego moduy ISAPI,
najlepszym rozwizaniem bdzie uycie PHP w postaci moduu ISAPI. Aby zainstalowa tak wersj, naley
skopiowa pliki php4ts.dll i msvcrt.dll do katalogu systemowego Windows (zwykle \windows\system w Windows
95 lub \winnt\system32 w Windows NT). S to wspdzielone biblioteki niezbdne do prawidowej pracy kadej
wersji PHP dla Windows. Dodatkowo mona skopiowa do katalogu systemowego inne pliki .dll, ale nie jest to
konieczne do ich uycia.
Nastpnie naley tak skonfigurowa IIS lub PWS, aby korzysta z moduu ISAPI do obsugi plikw php.
Serwer IIS mona konfigurowa za pomoc konsoli konfiguracji zainstalowanej w menu Option Pack. Na
rysunku 1.1. znajduje jest rozwinite menu pokazujce pooenie tego programu w Windows NT.
Rysunek 1.1.
Uruchamianie
aplikacji
konfigurujcej IIS
Po uruchomieniu konsoli Meneder usug internetowych naley klikn prawym przyciskiem myszy na
wle serwera WWW (prawdopodobnie zatytuowany Domylna witryna sieci Web) i wybra Waciwoci, tak
jak jest to pokazane na rysunku 1.2. Nastpnie w oknie Waciwoci naley przej na zakadk Katalog
macierzysty i klikn przycisk Konfiguracja. Opcja ta pozwala na dodawanie i edycj skojarze.
Rysunek 1.2.
Konfigurowanie IIS
Teraz naley klikn przycisk Dodaj i wprowadzi potrzebne informacje. Na rysunku 1.3. pokazany jest
proces dodawania mapowania rozszerzenia phtml do moduu ISAPI PHP.
Rozdzia 1 Kompilacja i instalowanie PHP
12

Rysunek 1.3.
Dodawanie
mapowania dla
rozszerzenia w IIS
Po dodaniu mapowania zmiany s od razu widoczne w oknie dialogowym Konfiguracja aplikacji.
Czasami moe by poyteczne skojarzenie niektrych rozszerze z moduem ISAPI a niektrych z programem
CGI. Na rysunku 1.4. pokazana jest konfiguracja mojego serwera WWW. Na rysunku wida mapowania dla
PHP3, dla PHP4 jako CGI oraz PHP4 jako ISAPI. Jest to przydatne przy testowaniu rnic pomidzy wersjami 3
i 4 PHP.
Rysunek 1.4.
Mapowanie
rozszerze PHP
Po zakoczeniu konfiguracji naley ponownie uruchomi serwer WWW. Mona to zrobi przy uyciu
moduu Usugi w Panelu sterowania, lub uruchamiajc z linii polece nastpujce polecenia:
net stop iisadmin
net start w3svc
Po uruchomieniu serwera naley go przetestowa tworzc prosty plik testowy, na przykad taki, jak
pokazany na wydruku 1.1. i otwierajc go poprzez twj serwer. Jeeli wszystko jest skonfigurowane poprawnie,
powiniene zobaczy ekran z informacjami na temat instalacji PHP.
Wydruk 1.1. Testowy skrypt PHP
<html>
<head>
<title> phpinfo() </title>
</head>
<body>
<?php
phpinho();
?>
</body>
</html>
PHP Kompendium wiedzy
13

Trzeba pamita, e w pakiecie instalacyjnym PHP znajduje si uwaga na temat stanu moduu ISAPI ktra
ostrzega, e nie powinien by stosowany w rodowisku produkcyjnym. Sugeruje si, e w celu zapewnienia
odpowiedniej stabilnoci powinna by uyta wersja CGI. Nastpna cz rozdziau opisuje uycie PHP jako CGI.
Uycie PHP jako CGI
Jeeli nie masz zainstalowanego serwera WWW obsugujcego moduy ISAPI lub istniej inne powody
wyboru wersji CGI, naley przeprowadzi instalacj PHP jako CGI. Instalacja jest bardzo podobna do tej
przedstawionej powyej, rnice wystpuj jedynie przy mapowaniu rozszerze. Zamiast wybiera bibliotek .dll
ISAPI, naley wybra plik php.exe. Serwer IIS lub PWS wysya parametry do pliku wykonywalnego CGI, wic
oprcz nazwy pliku wykonywalnego naley poda opcje linii polece %s %s. Jest to pokazane na rysunku 1.4. dla
rozszerzenia .php4.
Rne serwery WWW maj rne metody okrelenia mapowania rozszerze. Do Apache dla Windows
istnieje wietny podrcznik dostpny pod adresem www.php.net/manual/config-apache-nt.html. Zasoby sieci na
temat instalacji PHP na rnych serwerach WWW dla Windows mona odszuka za pomoc wyszukiwarki
umieszczonej na witrynie www.php.net.
Inne instalacje binarne
Niektre instalacje Uniksa posiadaj instalacj binarn PHP zintegrowan z instalacj serwera WWW.
Niektrzy dostawcy, na przykad Red Hat, udostpniaj rwnie binarn instalacj na swoich witrynach.
Instalacja taka jest wykonana w formie plikw RPM (Red Hat Package Manager). Zalet uycia plikw RPM jest
atwo instalacji. Nie trzeba martwi si szczegami procesu kompilacji, poniewa plik RPM zawiera gotow do
uycia odpowiednio skompilowan wersj programu. Wad jest to, e z powodu wielu moliwych wariantw
platform dla Uniksa, problemem dla pocztkujcych moe by nawet wybr waciwego pliku. Poza tym w pliku
RPM nie zawsze s ustawione wszystkie potrzebne opcje konfiguracji, niezbdne do prawidowego dziaania
programu.
Jeeli masz plik RPM z PHP, moesz go zainstalowa wydajc polecenie rpm -i <plikrpm.rpm>.
Powoduje to zainstalowanie plikw binarnych do katalogw okrelonych przez twrc pliku RPM. Dla
wikszoci uytkownikw katalogi te s prawidowe. Po instalacji naley rcznie skonfigurowa serwer WWW
tak, aby korzysta z zainstalowanych wanie plikw binarnych PHP. Poniej przedstawimy sposb konfiguracji
Apache. Inne serwery WWW wymagaj przeprowadzenia podobnych czynnoci.
Niezalenie od tego, czy PHP bdzie dziaao jako program CGI czy w postaci moduu, pierwszy krok
konfiguracji jest zawsze taki sam. Trzeba utworzy skojarzenie pomidzy rozszerzeniem pliku a wewntrznym
typem stosowanym przez serwer. Robi si to dodajc do pliku konfiguracyjnego nastpujce linie:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .inc
Dyrektywy te powoduj, e Apache uwaa wszystkie pliki z rozszerzeniami .php, .phtml i .inc jako pliki
typu application/x-httpd-php. Do przetwarzania tego typu plikw wykorzystywane jest PHP.
Zakadajc, e masz zainstalowane PHP w postaci moduu Apache, kolejnym krokiem bdzie modyfikacja
pliku konfiguracyjnego httpd.conf tak, aby Apache zaadowa modu PHP:
LoadModule php4_module libexec/libphp4.so
Jeeli zainstalowana zostaa wersja CGI, naley wprowadzi nieco inne zmiany do pliku konfiguracji
httpd.conf. Dyrektywa konfiguracji jest podobna do poprzedniej, ale odwouje si do programu w postaci pliku
wykonywalnego.:
Action application/x-httpd-php /cgi-bin/php
Dyrektywa Action definiuje typ pliku powodujcy uruchomienie PHP po otrzymaniu dania cignicia
strony z serwera WWW. Oczywicie naley poda waciw ciek do pliku wykonywalnego.
Po wprowadzeniu zmian naley ponownie uruchomi serwer WWW, aby zaczy dziaa nowe
ustawienia. Serwer Apache mona zrestartowa za pomoc polecenia:
/cieka/do/apachectl restart
Aby przetestowa konfiguracj mona wczyta za pomoc przegldarki skrypt testowy, przedstawiony na
wydruku 1.1.
Binarna dystrybucja PHP uatwia szybkie rozpoczcie pracy z PHP w Uniksach, ale moe ona sprawia
problemy. Z powodu istnienia wielu wariantw Uniksw, znalezienie gotowej wersji dziaajcej na okrelonym
Rozdzia 1 Kompilacja i instalowanie PHP
14

systemie moe by czasami trudne. W wielu przypadkach bdzie to bardziej czasochonne ni cignicie kodu
rdowego, skompilowanie i zainstalowanie PHP. Proces ten zostanie opisany w kolejnej czci rozdziau.
Kompilowanie PHP
Jeeli chcesz skorzysta z elastycznoci wasnej instalacji PHP lub jeeli przewidujesz dodawanie
wasnych rozszerze do jzyka PHP (opisane w rozdziale 11. Ponowne wykorzystanie kodu), musisz dokadnie
pozna proces kompilowania PHP. Jeeli pracujesz na platformie, dla ktrej nie ma instalacji binarnej, moesz nie
mie innego wyboru jak tylko samodzielnie kompilowa PHP.
Kompilowanie PHP w Uniksach
W tej czci rozdziau przedstawione zostan informacje na temat kompilowania PHP na platformie Unix.
Naley pamita, e Unix okrela ca rodzin systemw, np.: Linux, BSD, Solaris i inne. Oczywicie systemy te
rni si midzy sob, ale wiele z krokw niezbdnych do kompilacji PHP jest identycznych. Wicej informacji
na temat okrelonej platformy mona odszuka za pomoc wyszukiwarki dostpnej na witrynie www.php.net.
Dla kadej platformy istnieje kilka sposobw kompilacji PHP. Jeeli serwerem WWW jest Apache, mona
skompilowa PHP jako plik wykonywalny, jako modu adowany dynamicznie lub jako statyczn bibliotek.
Jeeli nie korzystasz z Apache, naley odszuka w dokumentacji PHP i serwera WWW szczegy postpowania.
Przy okazji moemy zarekomendowa korzystanie z PHP w postaci dynamicznie adowanego moduu, jako
najlepsze rozwizanie dla wikszoci aplikacji. Jeeli PHP zostanie statycznie doczony do Apache, kada
zmiana konfiguracji wymaga wikszego nakadu pracy. W przypadku moduu CGI, wystpuj problemy z
bezpieczestwem.
W kolejnych czciach zakadamy, e cigne ju rda PHP i rozpakowae je. Proces kompilacji jest
waciwie taki sam dla kadego typu pliku wynikowego. Na pocztku trzeba uruchomi skrypt configure, ktry
ustawia opcje kompilacji. Nastpnie przy pomocy narzdzia make przeprowadza si kompilacj. Na koniec trzeba
zainstalowa gotowe PHP i zrestartowa serwer WWW. Informacje na temat skryptu konfiguracyjnego s
przedstawione w czci powiconej kompilowaniu moduu CGI, wic zaleca si przeczytanie tego fragmentu
jako wprowadzenia.
Kompilacja moduu CGI
Kompilacja PHP do postaci wykonywalnego moduu CGI jest najprostsz metod kompilacji i dobrym
rozwizaniem, jeeli nigdy wczeniej nie kompilowae programw dla Uniksa. Poniej przedstawiona jest
kompletna lista operacji jakie naley wykona. Niektre z nich nie s obowizkowe. Operacje opcjonalne s
zaznaczone czcionk pochy. Odwoanie do <php_dir> powinno by zamienione na nazw twojego katalogu
bazowego PHP.
cd <php_dir>
rm config.cache
make clean
./configure
make
make install
Wykonanie tych operacji spowoduje usunicie podrcznych danych konfiguracji, usunicie plikw
wynikowych a nastpnie skompilowanie PHP do postaci CGI. Jest to najprostsza metoda kompilacji, przytoczona
jedynie jako przykad. W prawdziwej kompilacji do skryptu konfiguracyjnego docza si opcje okrelajce
atrybuty PHP.
Druga i trzecia linia jest nieobowizkowa, poniewa polecenia w nich umieszczone s uywane jedynie do
wyczyszczenia poprzedniej konfiguracji i pozostaoci po poprzedniej kompilacji. Jeeli wczeniej nie
konfigurowae ani nie kompilowae PHP, nie s one potrzebne. Mona rwnie nie korzysta z tych opcji przy
kompilacji PHP, cho czasami ich wykonanie jest niezbdne. Jeeli wprowadzane s powane zmiany w
konfiguracji lub zmieniasz typ kompilacji z CGI na inny, moe okaza si, e wykonanie czyszczenia jest
niezbdne, aby kompilacja przebiega prawidowo. W zalenoci od szybkoci komputera, na ktrym
wykonywana jest kompilacja, przeprowadzenie caej konfiguracji i kompilacji moe zaj dosy duo czasu.
PHP Kompendium wiedzy
15

Pozostawienie zapisanych opcji konfiguracji oraz obiektw binarnych spowoduje znaczne skrcenie czasu
tworzenia PHP.
Wszyscy, ktrzy nigdy nie przeprowadzali takiego procesu powinni wiedzie, e skrypt konfiguracyjny
poszukuje w systemie narzdzi, plikw i innych danych systemowych. Nastpnie na podstawie tych danych
tworzy specyficzny dla systemu skrypt za pomoc mona skompilowa kod. Jeeli w czasie dziaania skryptu
konfiguracyjnego nastpi awaria, czsto zdarza si, e wymagany plik lub narzdzie nie jest odnajdywane lub
niewaciwie skonfigurowane. Po zakoczeniu dziaania skryptu konfiguracyjnego tworzony jest plik
tymczasowy config.cache zawierajcy szczegy na temat systemu, wic badanie systemu nie musi by
powtarzane przy ponownym uruchomieniu konfiguracji. Jeeli wprowadzisz due zmiany do konfiguracji
systemu, musisz usun plik tymczasowy przed kolejnym uruchomieniem skryptu konfiguracyjnego. W ten
sposb upewniamy si, e zmiany te zostan wykryte.
Po wykonaniu wszystkich podanych polece zostanie utworzony nowy plik wykonywalny php. Mona
przetestowa poprawno kompilacji za pomoc nastpujcego polecenia:
php < /dev/null
Jeeli zobaczysz wynik podobny do poniej przedstawionego, udao ci si poprawnie skompilowa i
zainstalowa PHP w postaci CGI.
X-Powered-By: PHP/4.0.2
Content-type: text/html
Trzeba zauway, e skompilowana wanie wersja PHP nie posiada funkcji, ktre by moe bdziemy
chcieli wykorzystywa w aplikacjach, poniewa zostaa skompilowana z uyciem tylko ustawie domylnych.
Trzeba ponownie uruchomi skrypt konfiguracyjny, ustawi opcje potrzebne w aplikacji a nastpnie ponownie
skompilowa i zainstalowa PHP.
Poyteczn cech zestawu domylnych ustawie jest to, e doczone jest do niego wiele czsto
uywanych opcji konfiguracji, w tym obsuga bazy danych MySQL, sesji i wiele, wiele innych. Oznacza to, e
przytoczone polecenia umoliwiaj skompilowanie PHP, ktry pozwala na rozpoczcie nauki jzyka.
Jeeli potrzebujesz obsugi innej bazy danych lub innego rozszerzenia, trzeba doda odpowiedni opcj
konfiguracji. Lista dostpnych opcji jest wywietlana po wpisaniu:
./configure --help
Wikszo opcji konfiguracji wpywajcych na dostpne funkcje PHP ma posta --enable-FUNKCJA lub --
with-PAKIET. Aby doda funkcj do PHP naley uy jednej z poniszych form:
--enable-FUNKCJA
--enable-FUNKCJA=yes
Aby usun funkcj z PHP, naley uy:
--disable-FUNKCJA
--enable-FUNKCJA=no
Pena lista opcji konfiguracji znajduje si w skorowidzu na kocu ksiki. Funkcje korzystajce ze skadni
--enable s to zwykle wbudowane opcje PHP, takie jak moliwo wykorzystywania krtkich znacznikw lub
obsuga protokou FTP. Pakiety s to zwykle moduy zewntrzne, ktre mog by doczone do PHP, na przykad
obsuga bazy danych Oracle lub Javy. Te wasnoci wymagaj zwykle wskazania zewntrznego pliku i do jego
wczania korzysta si z nastpujcego zapisu:
--with-PAKIET=/cieka/do/pakietu
Aby wyczy pakiet naley uy polece:
--with-PAKIET=no
--without-PAKIET
Jako przykad przedstawimy nastpujc konfiguracj:
./configure --with-apxs=/www/bin/apxs --with-java --with-cybercash=/home/blake/mck-3.2.0.6-i586-pc-linux-
gnulibc2.1 --withunixODBC=/usr/local/unixODBC --disable-debug --enabletrack-vars -- enable-fin-funcs --with-
snmp=/home/blake/ucd-snmp-4.1.2 --enable-ucd-snmp-hack
Powysze wywoanie konfiguracji powoduje dodanie do PHP obsugi Javy, CyberCash, SNMP (Simple
Network Management Protocol) oraz unixODBC. Nie zostao podane pooenie katalogu Javy, wic skrypt
konfiguracyjny uyje domylnej cieki do katalogu z tym pakietem. Dodatkowo zostaa dodana opcja -with-
apxs, ktra powoduje, e PHP jest kompilowane do postaci dynamicznie adowanego moduu Apache a nie jako
program typu CGI. Pniej omwimy to zagadnienie dokadniej. W przedstawianej konfiguracji wyczono
informacje dla debuggera oraz wczono opcje track-vars, fin-funcs oraz ucd-snmp-hack. Opcja fin-funcs
powoduje dodanie wasnego moduu rozszerze opisanego w dalszej czci ksiki (rozdzia 11.), natomiast
pozostae s standardowymi elementami konfiguracji opisanymi w skorowidzu na kocu ksiki.
Rozdzia 1 Kompilacja i instalowanie PHP
16

Wiele z pakietw oprogramowania jakie chcemy doda do PHP musi by osobno zainstalowane. Wicej
informacji na temat tego, gdzie mona zaopatrzy si w potrzebne pakiety, mona znale w dokumentacji na
witrynie www.php.net.
Po utworzeniu PHP w postaci CGI, naley skonfigurowa serwer WWW do wsppracy z nowym
programem. Aby skonfigurowa serwer Apache naley doda nastpujce dyrektywy do pliku httpd.conf:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .inc
Action application/x-httpd-php /cgi-bin/php
Pierwsze trzy dyrektywy definiuj zawarto plikw z rozszerzeniami php, phtml i inc jako typ
application/x-httpd-php. Ostatnia dyrektywa powoduje wysanie wszystkich plikw tego typu do pliku
wykonywalnego php. Zakadamy, e plik ten jest umieszczony w katalogu cgi-bin serwera WWW.
Dyrektywy te s minimum wymaganym do konfiguracji PHP w Apache, ale ta sama czynno moe by
zrealizowana jeszcze na kilka sposobw. Wicej szczegw mona znale w dokumentacji do Apache.
Kompilacja PHP jako statycznie doczanego moduu Apache
Apache pozwala na statyczne doczanie moduw bezporednio do pliku binarnego Apache. W
porwnaniu z wersj CGI uycie moduu pozwala poprawi wydajno aplikacji oraz zwikszy bezpieczestwo
systemu,. Wad tej metody jest konieczno powtrnej kompilacji Apache po kadej kompilacji PHP. Moe by
to czasochonne i frustrujce, poniewa w przypadku wystpienia kopotw z konfiguracj PHP, Apache moe
rwnie przesta dziaa. Jednak niektre aplikacje wymagaj zastosowania statycznie doczanego moduu
Apache, opiszemy teraz sposb jego tworzenia.
Przed skonfigurowaniem i skompilowaniem PHP niezbdne jest skonfigurowanie Apache. Zakadamy, e
na dysku jest ju katalog z kodem rdowym Apache. Aby skonfigurowa Apache, naley uy nastpujcych
polece:
cd <apache_dir>
./configure
Po zakoczeniu dziaania tego skryptu mona zaj si konfigurowaniem i kompilowaniem PHP.
cd <php_dir>
./configure --with-apache=<apache_dir>
make
make install
Opcja --with-apache powoduje kompilacj do postaci statycznej biblioteki oraz pozwala poda katalog z
plikami rdowymi Apache. Nastpnie naley skompilowa serwer Apache za pomoc polece:
cd <apache_dir>
./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
make
make install
Dyrektywa prefix moe by inna w twoim systemie, poniewa wskazuje ona katalog gdzie zostan
zainstalowane pliki zalene od architektury. Teraz naley uruchomi serwer Apache i przy wykorzystaniu skryptu
testowego z wydruku 1.1. sprawdzi poprawno konfiguracji.
Aby Apache prawidowo przetwarza pliki PHP naley odpowiednio zmodyfikowa plik httpd.conf. W
zalenoci od rozszerze jakie zostay wybrane do reprezentowania plikw PHP, naley wprowadzi odpowiednie
zmiany. I tym razem standardowa konfiguracja wyglda nastpujco:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .inc
Przedstawiony opis przedstawia jedynie bardzo prost wersj PHP, ktra zawiera jedynie opcje domylne.
Wicej informacji o zmianie konfiguracji kompilacji PHP znajduje si w czci na temat kompilacji wersji CGI.
Kompilacja PHP do postaci dynamicznie adowanego moduu Apache
Sposb kompilacji PHP do postaci dynamicznie adowanego moduu Apache nie rni si zbytnio od
innych przedstawionych do tej pory metod. Zalet tej metody jest moliwo kompilacji PHP bez koniecznoci
rwnoczesnej kompilacji Apache. Rwnie niektre moduy rozszerze (na przykad Java) wymagaj do
poprawnej pracy, aby PHP by skompilowany do postaci dynamicznie adowanego moduu. Aby Apache
obsugiwa dynamicznie adowane moduy naley go przekompilowa z nastpujcymi opcjami konfiguracji:
cd <apache_dir>
make clean
./configure --enable-module=so --enable-rule=SHARED_CORE --prefix=/www
PHP Kompendium wiedzy
17
make

make install
Oprcz kompilacji Apache przedstawione polecenia przygotowuj skrypt apxs, ktry jest niezbdny do
kompilacji dynamicznego moduu PHP. Jeeli wystpi kopoty ze skryptem apxs mona powtrnie wykona
przedstawione polecenia, co spowoduje ponowne wygenerowanie prawidowo skonfigurowanego skryptu. Po
skompilowaniu Apache z obsug dynamicznie adowanych moduw, naley skompilowa PHP w nastpujcy
sposb:
cd <php_dir>
make clean
rm config.cache
./configure --with-apxs=/www/bin/apxs (pozostae opcje)
make
make install
Polecenia porzdkujce s zalecane, jeeli PHP by ju kompilowany w innej konfiguracji. cieka podana
w dyrektywie konfiguracji --with-apxs powinna by pen ciek do skryptu apxs na serwerze.
Tak jak w przypadku poprzednich sposobw kompilacji naley prawidowo skonfigurowa Apache, aby
przetwarza pliki PHP. Po zmodyfikowaniu konfiguracji naley uruchomi Apache i wywoa skrypt testowy.
Podsumowanie kompilacji PHP w systemach Unix
Celem tego fragmentu ksiki nie byo podawanie szczegowego i wyczerpujcego opisu wszystkich
moliwych opcji konfiguracji, ale pokazanie podstawowych metod kompilowania PHP do rnych postaci. Jeeli
nie kompilowae wczeniej PHP, powiniene na pocztku sprbowa skompilowa podstawow konfiguracj, a
pniej uzupenia potrzebne opcje. Po zapoznaniu si z procesem kompilacji jest ju bardzo atwo testowa
rne konfiguracje i dodawa niestandardowe rozszerzenia.
Po skompilowaniu PHP i sprawdzeniu, czy dziaa z Apache, mona zapozna si z opcjami konfiguracji,
ktre mona ustawia bez potrzeby ponownej kompilacji. Zostay one opisane w dalszej czci rozdziau.
Kompilowanie PHP w rodowisku Windows
Kompilowanie PHP dla Windows jest na pocztku bardziej skomplikowanym procesem ni kompilacja
PHP dla Uniksa. Dokumentacja zaleca uycie Visual C++ wersja 6, cho wersja 5 rwnie powinna dziaa.
Prbowaem sprawdzi, czy mona uy pakietu Borland C++ Builder, ale nie udao mi si tego zrobi. Problem
stanowiy prekompilowane pliki lib, poniewa Microsoft i Borland korzystaj z rnych formatw tych plikw.
Prawdopodobnie mona zastosowa kompilator Borlanda, ale trzeba wczeniej przekompilowa wszystkie
biblioteki. W poniszym opisie zakadamy uycie Visual C++.
Przed rozpoczciem pracy naley si zaopatrzy w kilka programw i plikw pomocniczych. Tabela 1.1.
zawiera wszystkie dodatkowe programy oraz adresy w Internecie, gdzie byy dostpne w czasie pisania ksiki.
Tabela 1.1. Dodatkowe pliki pomocnicze i ich adresy w Sieci
Program Pooenie
Kod rdowy PHP www.php.net/download.php
Pakiet Cygwin http://sources.redhat.con/cygwin/
Narzdzia do kompilacji PHP dla
Win32
www.php.net/extra/win32build.zip
Obsuga BCMath www.php.net/version4/downloads/num
ber.tar.gz
Zastpnik pliku resolv.lib www.php.net/version4/downloads/bind
lib_w32.zip
Pakiet Cygwin zawiera popularne narzdzia GNU, takie jak gcc, make i bison. Niektre z tych programw
s wykorzystywane w procesie kompilacji, wic trzeba wczeniej zainstalowa ten pakiet. Inne potrzebne pliki s
integraln czci dystrybucji PHP. Kod rdowy PHP jest identyczny jak ten, ktry jest uywany do utworzenia
wersji dla Uniksa.
Potrzebny jest rwnie program do rozpakowywania plikw. Ja uywam programu Winzip, poniewa bez
problemu radzi sobie z plikami .tar.gz. Rwnie inne programy posiadaj takie moliwoci. Na pocztku naley
zainstalowa narzdzia Cygwin. Trzeba rcznie doda zmienn rodowiska wskazujc na pooenie plikw
Cygwin. Jeeli pracujesz w Windows 95, trzeba doda t zmienn rcznie do pliku autoexec.bat. W Windows NT
naley klikn prawym przyciskiem myszy ikon Mj komputer i wybra z menu Waciwoci. Teraz trzeba
Rozdzia 1 Kompilacja i instalowanie PHP
18

klikn zakadk rodowisko i doda now zmienn, tak jak jest to pokazane na rysunku 1.5. Zmienna nazywa si
CYGWIN a jej wartoci jest cieka do katalogu, gdzie zainstalowane s narzdzia Cygwin.
Rysunek 1.5.
Ustawienie
zmiennej
rodowiskowej
CYGWIN

Nastpnie utwrz katalog i rozpakuj do niego zawarto pliku win32build.zip. Uruchom Visual C++ i
wybierz Options z menu Tools. Teraz wybierz zakadk Directories (rysunek 1.6.) i przy uyciu listy rozwijalnej
opisanej Show directories for, wybierz opcj Executable files i dodaj katalog z plikami Cygwin. Teraz z listy
rozwijalnej wybierz Include files i dodaj katalog z win32build\include (rysunek 1.6.). Na koniec wybierz Library
files i dodaj katalog win32build\lib. Od tej pory kompilator Visual C++ bdzie mg korzysta z zainstalowanych
narzdzi i plikw.
Rysunek 1.6.
Ustawienie
katalogw w Visual
C++

Kolejnym krokiem bdzie skompilowanie nowej wersji pliku resolv.lib. Najpierw utwrz nowy katalog i
rozpakuj do niego pliki z archiwum bindlib_w32.zip. W Visual C++ otwrz projekt bindlib.dsp. Z menu Build
wybierz Set Active Project Configuration i wybierz wersj handlow biblioteki lub wersj do uruchamiania.
Nacinij klawisz F7, aby skompilowa projekt. Po zakoczeniu kompilacji naley skopiowa plik resolv.lib do
katalogu win32build\lib.
Nastpnie rozpakuj rda PHP i plik number.tar.gz za pomoc zewntrznego programu lub narzdzia tar
z pakietu Cygwin. Skopiuj rozpakowane pliki number.c i number.h do katalogu ext/bcmath w katalogu z kodem
rdowym PHP.
PHP Kompendium wiedzy
19

Jeeli wykonae wszystkie opisane wczeniej czynnoci, jeste gotowy do kompilacji PHP. Uruchom
Visual C++ i otwrz plik projektu php4ts.dsp, znajdujcy si w podkatalogu win32 katalogu z kodem rdowym
PHP. Projekt ten zawiera kilka konfiguracji. Najatwiej jest rozpocz od skompilowania wersji CGI wybierajc
wersj handlow lub wersj z danymi dla debuggera, tak jak jest to pokazane na rysunku 1.7.
Rysunek 1.7.
Wybr konfiguracji
dla wersji CGI

Skompiluj projekt i jeeli wszystko pjdzie dobrze posiadasz ju wasn wersj PHP. Jeeli potrzebujesz
wersji PHP jako ISAPI lub NSAPI, wystarczy wybra odpowiedni konfiguracj dla kompilacji i ponownie
skompilowa projekt. Jak wspomniaem wczeniej, najtrudniejsz czci byo wstpne przygotowanie
rodowiska. Gdy wszystko jest ju gotowe, caa reszta jest tak samo prosta jak w Uniksie.
Podsumowanie kompilacji PHP
Kompilowanie wersji PHP dla Windows jest za pierwszym razem duo trudniejsze od wersji dla Uniksa,
ale gdy wszystkie potrzebne dodatki zostan odpowiednio skonfigurowane, jest ju proste. Gdy poznae ju
proces kompilowania PHP dla obu platform moesz tworzy wysoce specjalizowane wersje PHP, speniajcych
precyzyjnie potrzeby konkretnej witryny. Dokadna wiedza na temat procesu kompilacji PHP jest rwnie
niezbdna, aby mc tworzy rozszerzenia PHP. Zagadnienie to zostao opisane w rozdziale 11.
Konfigurowanie PHP
Niezalenie od platformy na ktrej dziaa PHP, sposb jego konfigurowania jest taki sam. Wykorzystuje
si w tym celu plik php.ini. Plik ten jest dostarczany w dystrybucji PHP jako php.ini-dist i php.ini-optimized.
Jeeli nie znasz dobrze opcji konfiguracji, powiniene rozpocz do podstawowych ustawie z pliku php.ini-dist.
Pierwszym krokiem bdzie skopiowanie i zmiana nazwy pliku. Plik powinien by nazwany php.ini i skopiowany
do katalogu zalenego od uywanej platformy. W tabeli 1.2. zamieszczone s podstawowe warianty.
Tabela 1.2. Platformy PHP i pooenie pliku php.ini
Platforma Pooenie pliku php.ini
Windows Katalog <windows> zwykle \windows w Windows 95 i \winnt w
Windows NT
Unix Mona to sprawdzi za pomoc funkcji phpinfo(), ale zwykle jest
to /usr/local/lib.
Po umieszczeniu pliku konfiguracyjnego w odpowiednim katalogu, naley do niego wprowadzi
odpowiednie zmiany. Plik php.ini jest podzielony na sekcje, rozpoczynajce si od linii [nazwa_sekcji] podobnie,
jak w standardowych plikach ini systemu Windows. Plik ten zawiera obszerne komentarze opisujce
przeznaczenie sekcji i opcji konfiguracji. W pozostaej czci ksiki czasami bd przytaczane opcje niezbdne
do uruchomienia przykadw. Zwykle przykad taki zawiera nazw sekcji, nazw opcji oraz warto. Aby
wprowadzi zmiany najczciej zmienia si plik php.ini i ponownie uruchamia Apache, ale istniej rwnie inne
mechanizmy zmiany opcji. Mechanizmy te opisane zostan w pniejszej czci rozdziau.
Korzystanie z pliku php.ini
Zalecan metod zmiany konfiguracji jest modyfikacja pliku php.ini i ponowne uruchomienie serwera
WWW. Jeeli korzystasz z PHP w postaci programu CGI nie musisz restartowa serwera, poniewa plik php.ini
jest odczytywany za kadym uruchomieniem programu CGI. Dla przykadu mona zmieni sposb raportowania
bdw przez PHP, korzystajc z odpowiednich opcji konfiguracji. Opcje te maj nastpujce wartoci domylne:
Rozdzia 1 Kompilacja i instalowanie PHP
20

error_reporting = E_ALL & ~E_NOTICE ; Poka wszystkie bdy oprcz informacji
display_errors = On ; Wypisuj bdy (jako cz wynikowego HTML)
log_errors = Off ; Zapisuj bdy do pliku bdw
error_log = syslog ; Zapisuj bdy do dziennika systemowego
Pierwsza opcja powoduje generowanie komunikatw dla wszystkich typw bdw poza typem E_NOTICE.
Nastpna linia powoduje wstawianie komunikatw bdw do wynikowego kodu HTML. Nastpne dwa wiersze
powoduj zapisywanie komunikatw bdw w pliku. Zamy, e w instalacji produkcyjnej nie chcemy
wywietla bdw, a zamiast tego bdy bd zapisywane do okrelonego pliku. Mona to zrealizowa
zmieniajc konfiguracj w nastpujcy sposb:
error_reporting = E_ALL ; Poka wszystkie bdy
display_errors = Off ;
log_errors = On ; Zapisuj bdy
error_log = /tmp/php_log ; Zapisuj bdy do pliku /tmp/php_log
Taka konfiguracja powoduje, e wszystkie komunikaty bdw, w tym informacje, bd zapisywane w
pliku /tmp/php_log. Oczywicie plik ten powinien mie odpowiednio ustawione prawa dostpu, aby serwer
WWW mg zapisa w nim dane.
Z powodu duej iloci opcji konfiguracji, nie zostan tu przedstawione wszystkie moliwe opcje. Pena
lista znajduje si w skorowidzu na kocu ksiki. Tutaj przedstawione zostan jedynie oglne sposoby
wykorzystywania tych opcji. Aby zmieni opcj konfiguracji, naley otworzy w edytorze plik php.ini i odszuka
opcj. Zwykle znajduje si tam sporo komentarzy opisujcych moliwe wartoci danej opcji.
Inne metody zmiany konfiguracji PHP
Istniej dwie metody zmiany konfiguracji PHP bez koniecznoci modyfikacji pliku php.ini. Pierwszym
sposobem jest wstawienie tych opcji do pliku konfiguracyjnego Apache httpd.conf lub do pliku .htaccess.
Pierwsza metoda jest uyteczna, jeeli chcemy mie rne ustawienia PHP dla rnych serwerw wirtualnych lub
rnych katalogw. Druga metoda jest wykorzystywana, gdy nie jest moliwy dostp do plikw php.ini i
httpd.conf. Jest to czsta sytuacja, witryna jest umieszczona na dzierawionym serwerze zewntrznej firmy. Jest
to jednak najmniej zalecana metoda, poniewa plik .htaccess jest wczytywany i analizowany za kadym
odwoaniem do stron znajdujcych si w tym katalogu. Powoduje to znaczne spowolnienie serwera WWW.
W obu tych przypadkach sposb zmiany konfiguracji PHP jest tak sam. Naley uy dyrektyw
konfiguracji php_value i php_flag do ustawienia potrzebnych opcji. Na przykad, aby ustawi poprzednio opisane
opcje konfigurujce sposb raportowania bdw, naley uy nastpujcych dyrektyw Apache:
<VirtualHost 192.1.1.1>
ServerAdmin admin@server.net
DocumentRoot /www/hosts/wwwprojects/
ServerName www.testserver.com
php_value error_reporting 2047
php_flag display_errors off
php_flag log_errors on
php_value error_log /tmp/php_log
</VirtualHost>
Umieszczenie tych ustawie w pliku httpd.conf spowoduje, e zostanie ustawiony sposb raportowania
bdw dla serwera wirtualnego o nazwie www.testserver.com. Jeeli na tej samej maszynie istniej inne serwery
wirtualne, uywaj one konfiguracji okrelonej przez plik php.ini. Pozwala to na posiadanie rnych konfiguracji
PHP dla rnych serwerw wirtualnych lub katalogw.
Jeeli musisz zmieni konfiguracj PHP a nie masz dostpu do pliku php.ini ani do httpd.conf, moesz
wykorzysta pliki Apache .htaccess. Jest to rwnie uyteczne, jeeli okrelony katalog musi mie inne
ustawienia konfiguracji ni reszta witryny. Na przykad, mona zmieni sposb raportowania bdw dla jednego
katalogu na czas uruchamiania skryptw w nim si znajdujcych. W tym celu naley stworzy plik .htaccess z
nastpujc zawartoci:
php_value error_reporting 2039
php_flag log_errors off
php_flag display_errors on
Naley zauway, e w obu przykadowych plikach konfiguracyjnych Apache warto zmiennej
konfiguracji error_reporting jest ustawiana za pomoc wartoci numerycznej a nie staej. Jest o jedyny sposb
poprawnego ustawienia wartoci. Naley pamita, e konfigurujc PHP poprzez dyrektywy Apache nie mona
uywa jako wartoci adnych staych PHP. W przeciwnym wypadku efekty mog by niespodziewane.
Aby zilustrowa potg dostpnego mechanizmu konfiguracji na rysunku 1.8. przedstawiony zosta
schemat moliwoci konfiguracji rodowiska PHP.
PHP Kompendium wiedzy
21

Rysunek 1.8.
Elastyczno
konfiguracji z
zastosowaniem
php.ini oraz plikw
konfiguracyjnych
Apache
Podsumowanie
W tym rozdziale przedstawiono kilka informacji niezbdnych do rozpoczcia pracy z PHP. Z powodu
elastycznoci i duej iloci obsugiwanych platform niemoliwe jest szczegowe opisanie wszystkich dostpnych
konfiguracji. Korzystajc jednak z informacji umieszczonych w tej ksice, oraz na witrynie www.php.net
powiniene by w stanie zainstalowa i skonfigurowa PHP na twojej platformie.
Trzeba zauway, e PHP posiada wiele wasnych funkcji zmieniajcych ustawienia konfiguracji.
Przykadami takich funkcji s error_reporting() oraz set_time_limit(). Wicej informacji na temat tych funkcji
mona znale w skorowidzu na kocu ksiki.
Rozdzia 1 Kompilacja i instalowanie PHP
22
Rozdzia 2. Jzyk
Wstp
W rozdziale tym znajduje si zwizy opis jzyka programowania PHP. Jak wspomniaem we wstpie do
ksiki nie jest moj intencj powica zbyt wiele czasu na omawianiu oglnych koncepcji programowania. W
tym rozdziale znajduje si opis skadni podstawowych konstrukcji programowania, na przykad zmiennych,
staych i funkcji. Przykady przytoczone w tym rozdziale nie pokazuj najlepszych technik programowania a
jedynie ilustruj skadni i uycie omawianych elementw. Peny opis jzyka znajduje si w dokumentacji jzyka
dostpnej na witrynie http://www.php.net.
Oglne informacje na temat skadni
Poniewa PHP jest zwykle wbudowywany w kod HTML istniej specjalne znaczniki ograniczajce bloki
PHP. Uycie tych znacznikw jest nazywane czasem wyjciem z trybu HTML.
Wydruk 2.1. Sposoby oznaczania bloku kodu PHP w HTML
<? echo "uycie krtkich znacznikw PHP do wyjcia z trybu HTML<br>"; ?>
<?php echo "wyjcie przy uyciu penych znacznikw PHP<br>"; ?>
<script language="php">
echo "niektre edytory HTML nie obsuguj instrukcji przetwarzania<br>";
</script>
<% echo "mona stosowa rwnie znaczniki w stylu ASP<br>"; %>
Pierwsza metoda oznaczania blokw PHP jest dostpna jedynie wtedy, gdy uaktywnione s krtkie
znaczniki. Aby to zrobi naley uy funkcji short_tags(), wczy w pliku konfiguracyjnym opcj
short_tag_open lub skompilowa PHP z opcj -enable-short-tags. Znaczniki w stylu ASP s dostpne jedynie
wtedy, gdy uaktywniona jest opcja konfiguracji asp_tags. Wicej informacji na temat kompilowania i
konfiguracji PHP znajduje si w rozdziaach Kompilacja i instalowanie PHP oraz dodatku D - Opcje
konfiguracji.
PHP jest syntaktycznie bardzo podobny do C. Na przykad, instrukcje s oddzielone rednikiem. Znacznik
?> jest niejawnym kocem instrukcji, wic ponisze przykady s poprawne skadniowo:
Wydruk 2.2. Koniec instrukcji
<?php
echo "Test, test...<br>";
?>
<?php
echo "Test, test...<br>"
?>
Komentarze w PHP mona oznacza symbolami komentarzy pochodzcymi z C, C++ lub stosowanych w
skryptach Uniksa. Komentarze jednoliniowe komentuj tekst do koca linii lub do koca biecego bloku PHP w
zalenoci od tego, co bdzie pierwsze. Nie mona zagbia wielowierszowych komentarzy w stylu C.
Wydruk 2.3. Komentarze
<?php
echo "Witaj wiecie!<br>"; // To jest jednowierszowy komentarz w stylu C++
/* To jest wielowierszowy
blok komentarza */
echo "Witamy ponownie.<br>"; # To jest komentarz w stylu skryptw Uniksa
?>
<?php
/* Ponisza linia spowoduje wypisanie "To wywietli
nic."
*/
?>
To wywietli <?php # echo "co"; ?> nic.<br>
<?php

/*
echo "A tutaj mamy problem."; /* Komentarz ten jest
nieprawidowy */
*/
?>
Typy
PHP posiada nastpujce typy: liczby zmiennoprzecinkowe, liczby cakowite, cigi, tablice i obiekty. Typ
zmiennej jest ustalany w oparciu o kontekst w jakim jest uyta zmienna i nie jest on jawnie ustalany przez
programist. Jest to wana cecha o ktrej naley pamita podczas programowania aplikacji PHP, poniewa
niejawna konwersja typw moe spowodowa trudne do odnalezienia bdy. Na przykad ponisza instrukcja jest
prawidowa i spowoduje wywietlenie liczby 9:
print( 3* "3 mae winki");
Aby mona byo zapanowa nad typami, PHP posiada funkcje gettype() i settype() oraz kilka funkcji
przeznaczonych dla okrelonych typw, na przykad is_integer() lub is_array(). W skorowidzu funkcji na
kocu ksiki znajduje si pene omwienie tych funkcji. Teraz zostanie opisany kady z typw zmiennych
(oprcz obiektw). Obiekty PHP zostan opisane w dalszej czci rozdziau.
Liczby cakowite i zmiennoprzecinkowe
Liczby cakowite mona podawa uywajc notacji dziesitnej, semkowej i szesnastkowej. Liczby
zmiennoprzecinkowe mona podawa uywajc notacji zwykej lub zapisu naukowego. Na poniszym wydruku
pokazana jest skadnia PHP dla wszystkich tych notacji.
Wydruk 2.4. Reprezentacja liczb
<?php
$int1 = 523; // liczba dziesitna
$int2 = -523; // dziesitna ujemna
$int3 = 01013; // semkowa reprezentacja liczby 523
$int4 = 0x20B; // szesnastkowa reprezentacja liczby 523
$float1 = 523.197; // zwyky zapis liczby zmiennoprzecinkowej
$float2 = 5.23197e2; // notacja naukowa liczby zmiennoprzecinkowej
/* Wypisanie wszystkich liczb.
Wywietla "523, -523, 523, 523, 523.197, 523.197". */
print( "$int1, $int2, $int3, $int4, $float1, $float2<br>" );
?>
Cigi
Cigi w PHP s ograniczane apostrofami (') lub cudzysowami ("). Zapisy te rni si sposobem
interpretacji cigu. Jeeli cig jest otoczony cudzysowami, zmienne zapisane w cigu zostaj zamienione na ich
wartoci. Aby zapisa znaki specjalne w cigach otoczonych cudzysowami, naley uy znaku lewego ukonika
(\), tak jak zostao to pokazane w tabeli 2.1.
Tabela 2.1. Znaki specjalne w cigach otoczonych cudzysowami
Sekwencja znakw Znaczenie
\n
nowa linia
\r
powrt karetki (CR)
\t
tabulacja
\\
lewy ukonik
\"
cudzysw
\$
znak dolara
W cigach otoczonych apostrofami zmienne nie s zastpowane. Jedynymi dopuszczalnymi sekwencjami
sterujcymi s te oznaczajce lewy ukonik (\\) i apostrof (\'). Sekwencje te pozwalaj na wpisanie do cigu
znaku apostrofu i lewego ukonika. Cigi mog by czone przy uyciu operatora kropki (.). Dokadniej jest to
opisane w czci rozdziau na temat operatorw. Podobnie jak w jzyku C, mamy dostp do poszczeglnych
znakw cigu, traktujc go jak tablic znakw.
Wydruk 2.5. Przykad operacji na cigach
<?php
Rozdzia 2 Jzyk
24

$aStr1 = "To jest zwyky cig.";
print( "$aStr1<br>" );
$aStr2 = "Thatcher";
print( "$aStr2<br>" );
$aStr3 = "Nazywam si $aStr2";
// $aStr3 = "Nazywam si Thatcher"
print( "$aStr3<br>" );
$aStr4 = "Nazywam si \$aStr2";
// $aStr4 = "Nazywam si $aStr2"
print( "$aStr4<br>" );
$aStr5 = 'Nie rozwijaj \'$aStr2\'';
// $aStr5 = "Nie rozwijaj '$aStr2'"
print( "$aStr5<br>" );
// wypisuje "Nazywam si Thatcher i Nazywam si $aStr2"
print( "$aStr3" . " i " . "$aStr4" );
?>
Z powodu ulotnej natury typw w PHP, zmienne mog zmienia swj typ w zalenoci od kontekstu w
jakim wystpuj. Liczby mog by konwertowane niejawnie na cigi, jeeli zostan uyte jako argument
operatora operujcego na cigach. Cigi mog rwnie zosta skonwertowane na liczby, jeeli bd uyte w
wyraeniach matematycznych. Jeeli PHP prbuje skonwertowa cig na liczb, korzysta z nastpujcych zasad:
Jeeli cig zaczyna si od danych numerycznych, zostan one skonwertowane na liczb.
Jeeli cig nie zaczyna si prawidowymi danymi liczbowymi, wartoci cigu bdzie zero (0).
Jeeli dane numeryczne zawieraj jeden ze znakw .,e lub E, warto bdzie liczb zmiennoprzecinkow
a w przeciwnym przypadku liczb cakowit.
Prawidowymi danymi numerycznymi s: opcjonalny znak po ktrym nastpuje jedna lub wicej cyfr,
opcjonalna kropka dziesitna oraz opcjonalny znak wykadnika. Znakiem wykadnika jest e lub E, po ktrym
nastpuje jedna lub wicej liczb.
Wydruk 2.6. Niejawna konwersja pomidzy cigiem i liczb
<?php
$aVar = 123;
print( "\$aVar = $aVar, typ = " . gettype( $aVar ) . "<br>" );

$aVar2 = $aVar . " niejawnie skonwertowane do cigu";
print( "\$aVar2 = $aVar2, typ = " . gettype( $aVar2 ) . "<br>" );

$aVar3 = $aVar2 + 1; // niejawna konwersja na liczb cakowit
print( "\$aVar3 = $aVar3, typ = " . gettype( $aVar3 ) . "<br>" );

$aVar3 = $aVar2 * 1.1; // niejawna konwersja na liczb zmiennoprzecinkow
print( "\$aVar3 = $aVar3, typ = " . gettype( $aVar3 ) . "<br>" );

$aNotNumber = "abc";
$aVar4 = $aNotNumber * 1; // prba konwersji na liczb, zwracane jest 0
print( "\$aVar4 = $aVar4, typ = " . gettype( $aVar4 ) . "<br>" );

$aIsNumber = "3 mae winki";
$aVar5 = $aIsNumber + 1; // konwersja $aIsNumber na liczb 3
print( "\$aVar5 = $aVar5, typ = " . gettype( $aVar5 ) . "<br>" );
?>
Tablice
Tablice w PHP zachowuj si zarwno tak jak tablice indeksowane (wektory) oraz jak tablice mieszajce
(asocjacyjne). PHP pozwala rwnie na tworzenie tablic wielowymiarowych. Z powodu unikalnej konstrukcji
tablic w PHP, mona indeksowa jeden wymiar tablicy wielowymiarowej liczbami a inny w sposb asocjacyjny.
Tablice mog by tworzone przy uyciu funkcji list() lub array() albo poprzez jawne podanie kadej z
wartoci. W skorowidzu funkcji na kocu ksiki zostay opisane wszystkie funkcje do manipulacji tablicami.
Jednowymiarowe tablice mog zamieniane w cigach przez mechanizm zastpowania zmiennych na
wartoci w sposb identyczny jak wszystkie inne zmienne. W przypadku tablic wielowymiarowych naley uy
nawiasw klamrowych do zaznaczenia indeksw. Poniszy wydruk pokazuje przykady uycia rnych typw
tablic.
Wydruk 2.7. Inicjowanie i uycie tablic
<?php
// Jawne tworzenie prostej tablicy
$a[0] = "Ryan";
$a[1] = "Scott";
$a[] = "Randall"; // jawne przypisanie do indeksu (klucza) 2
PHP Kompendium wiedzy
25
$a[] = "Sherie"; // jawne przypisanie do indeksu (klucza) 3

print( "$a[3], $a[2], $a[1], $a[0]<br>" );

// Tworzenie tablicy asocjacyjnej
$color["niebieski"] = "#0000FF";
$color["zielony"] = "#00FF00";
$color["czerwony"] = "#FF0000";
print( "Warto szesnastkowa koloru czerwonego wynosi {$color['czerwony']}<br>" );

// Tworzenie tej samej co poprzedniej tablicy asocjacyjnej
// tylko nieco prociej
$color = array( "niebieski" => "#0000FF",
"zielony" => "#00FF00",
"czerwony" => "#FF0000" );
print( "Warto szesnastkowa koloru zielonego wynosi {$color['zielony']}<br>" );

// Rczne tworzenie tablicy wielowymiarowej
$m[0][0] = "Zero Zero";
$m[0][1] = "Zero Jeden";
print( "Wartoci \$m[0][1] jest {$m[0][1]}<br>" );

// Rczne tworzenie asocjacyjnej tablicy wielowymiarowej
$counties["Idaho"][0] = "Ada";
$counties["Idaho"][1] = "Adams";
$counties["Idaho"][2] = "Bannock";
$counties["Arizona"][0] = "Apache";
$counties["Arizona"][1] = "Cochise";
$counties["Arizona"][2] = "Coconino";
print( "\$counties['Idaho'][0] = {$counties['Idaho'][0]}<br>" );
?>
Zmienne i stae
Zmienne PHP s oznaczane znakiem dolara ($), po ktrym nastpuje nazwa zmiennej. Wielko liter w
nazwach zmiennych jest rozrniana. Prawidowe nazwy zmiennych musz zaczyna si liter lub znakiem
podkrelenia, po ktrych moe nastpi litera, liczba lub znak podkrelenia. Prawidowymi literami w zmiennych
s a-z, A-Z lub dowolne znaki ASCII z zakresu 127-255 (0x7f-0xff).
Wydruk 2.8. Nazwy zmiennych
<?php
$variable1 = "Ryan";
$variable2 = "Scott";
print( "$variable1, $variable2<br>" ); // wypisuje "Ryan, Scott"
$1variable = 123; // nieprawidowa nazwa zmiennej
$_test = "test"; // prawidowo, rozpoczyna si podkreleniem
$_ = "test2"; // prawidowo
?>
Wartoci mog by przypisywane do zmiennych przez warto lub przez referencj. Gdy przypisanie jest
realizowane przez warto, obliczona warto wyraenia jest przepisywana do docelowej zmiennej. Po
przypisaniu zmienne s niezalene i zmiana wartoci w jednej nie wpywa na warto drugiej zmiennej.
Gdy wartoci s przypisywane przez referencj, nowa zmienna staje si odwoaniem do oryginalnej
zmiennej. Zmiana wprowadzona do dowolnej zmiennej powoduje zmian drugiej. Aby wykona przypisanie
przez referencj, naley poprzedzi nazw znakiem &.
Wydruk 2.9. Przypisywanie zmiennych
<?php
$variable1 = "Ryan";
$variable2 = $variable1; // przypisanie wartoci
print( "$variable1, $variable2<br>" ); // wypisuje "Ryan, Ryan"
$variable2 = "Scott";
print( "$variable1, $variable2<br>" ); // wypisuje "Ryan, Scott"
$variable3 = &$variable1; // przypisanie przez referencj
print( "$variable1, $variable3<br>" ); // wypisuje "Ryan, Ryan"
$variable3 = "Katie";
print( "$variable1, $variable3<br>" ); // wypisuje "Katie, Katie"
?>
Zmienne predefiniowane
Oprcz zmiennych definiowanych przez uytkownika, w PHP istniej zmienne tworzone przez system.
Lista tych zmiennych zaley od kontekstu wykonania skryptu (na przykad, czy jest uruchamiany samodzielnie,
Rozdzia 2 Jzyk
26

czy poprzez serwer WWW), wersji PHP i typu serwera WWW. Poniewa lista zmiennych jest zalena od wielu
czynnikw, niektre z nich mog nie by nigdy dostpne.
PHP generuje rwnie zmienne dla cookie i danych formularzy przesyanych za pomoc metod GET i
POST. Szczegowe omwienie tych zmiennych zawarte jest w rozdziale 3 Formularze i cookie.
Cz ta zawiera podzbir dostpnych zmiennych dostpnych w czasie pracy PHP4 wraz z serwerem
Apache 1.3.11. Aby zobaczy wszystkie zmienne dostpne w rodowisku mona uy funkcji phpinfo().
Kompletniejsza lista predefiniowanych zmiennych znajduje si w skorowidzu na kocu ksiki. Tabela 2.2.
zawiera podzbir zmiennych rodowiska Apache, tabela 2.3., podzbir zmiennych rodowiska systemu a tabela
2.4. zawiera zmienne generowane przez PHP. W tabeli 2.5. zebrane s operatory arytmetyczne, natomiast
operatory bitowe w tabeli 2.6. Tabela 2.7. zawiera operatory porwnania, tabela 2.8 operatory zwikszania i
zmniejszania a tabela 2.9. zawiera operatory logiczne. Ostatnia tabela, 2.10. zawiera operatory przypisania.
Tabela 2.2. Zmienne rodowiska serwera Apache
Zmienna Definicja
HTTP_HOST
Zawarto nagwka Host: o ile zosta
wysany przez przegldark.
HTTP_USER_AGENT
Zawarto nagwka User Agent:
wysanego przez przegldark. Nagwek ten
opisuje przegldark dajc strony, na
przykad: Mozilla/4/0 (compatible; MSIE
5.01; Windows NT). Wicej na temat
wykorzystania tej zmiennej znajduje si w
rozdziale 9 Niezaleno od przegldarki.
REMOTE_ADDR
Adres IP uytkownika ogldajcego
stron.
SERVER_PROTOCOL
Nazwa i wersja protokou za pomoc
ktrego zostao wysane danie strony, na
przykad HTTP/1.1.
GATEWAY_INTERFACE
Wersja specyfikacji CGI uywanej
przez serwer, na przykad CGI/1.1.

Tabela 2.3. Zmienne rodowiska systemu
Zmienna Definicja
HOSTNAME
Nazwa komputera serwera.
HOSTTYPE
Typ komputera, na przykad i386.
PATH
Systemowa cieka serwera.
OSTYPE
System operacyjny dziaajcy na
serwerze, na przykad Linux.

Tabela 2.4. Zmienne generowane przez PHP
Zmienna Definicja
PHP_SELF
Nazwa pliku z wykonywanym
skryptem.
HTTP_COOKIE_VARS
Tablica asocjacyjna zmiennych
przekazanych do skryptu poprzez cookie
HTTP.
HTTP_GET_VARS
Tablica asocjacyjna zmiennych
przekazanych do skryptu za pomoc metody
GET.
HTTP_POST_VARS
Tablica asocjacyjna zmiennych
przekazanych do skryptu za pomoc metody
POST.

PHP Kompendium wiedzy
27

Tabela 2.5. Operatory arytmetyczne
Operator Nazwa Przykad Wynik
+
Dodawanie
$a + $b
Suma $a i $b
-
Odejmowanie
$a - $b
Rnica $a i
$b
*
Mnoenie
$a * $b
Iloczyn $a i $b
/
Dzielenie
$a / $b
Iloraz $a i $b
%
Reszta z
dzielenia
$a % $b
Reszta z
dzielenie $a przez $b

Tabela 2.6. Operatory bitowe
Operator Nazwa Przykad Wynik
&
Iloczyn bitowy
$a & $b
Bity ustawione
w $a i $b s ustawione
|
Suma bitowa
$a | $b
Bity ustawione
w $a lub $b s
ustawione
^
Rnica
symetryczna
$a ^ $b
Bity ustawione
w $a lub $b, ale nie w
obu na raz s
ustawione
~
Negacja
~$a
Bity ustawione
nie s teraz ustawione
i odwrotnie
<<
Przesunicie w
lewo
$a << $b
Przesunicie
bitw w $a w lewo o
$b krokw
>>
Przesunicie w
prawo
$a >> $b
Przesunicie
bitw w $a w prawo o
$b krokw

Tabela 2.7. Operatory porwnania
Operator Nazwa Przykad Wynik
==
Rwny
$a == $b
True, jeeli $a
jest rwne $b
===
Identyczny
$a === $b
True, jeeli $a
jest rwne $b i s one
tych samych typw
!=
Rny
$a != $b
True, jeeli $a
jest rne od $b
<
Mniejszy
$a < $b
True, jeeli $a
jest mniejsze od $b
>
Wikszy
$a > $b
True, jeeli $a
jest wiksze od $b
<=
Mniejszy lub
rwny
$a <= $b
True, jeeli $a
jest mniejsze lub
rwne $b
>=
Wikszy lub
rwny
$a >= $b
True, jeeli $a
jest wiksze lub
rwne $b

Tabela 2.8. Operatory zwikszania i zmniejszania
Rozdzia 2 Jzyk
28

Operator, przykad Nazwa Wynik
$a++
Postinkrementacja Zwraca $a, a nastpnie
zwiksza $a o jeden
++$a
Preinkrementacja Zwiksza $a o jeden i
zwraca $a
$a--
Postdekrementacja Zwraca $a, a nastpnie
zmniejsza $a o jeden
--$a
Predekrementacja Zmniejsza $a o jeden i
zwraca $a

Tabela 2.9. Operatory logiczne
Operator Nazwa Przykad Wynik
and
Iloczyn
logiczny
$a and $b
True, jeeli $a
i $b maj warto
True
or
Suma logiczna
$a or $b
True, jeeli $a
lub $b maj warto
True
xor
Rnica
symetryczna
$a xor $b
True, jeeli $a
lub $b maj warto
True, ale nie razem
!
Negacja
!$a
True, jeeli $a
nie jest True
&&
Iloczyn
logiczny
$a && $b
True, jeeli $a
i $b maj warto
True
||
Suma logiczna
$a || $b
True, jeeli $a
lub $b maj warto
True

Tabela 2.10. Operatory przypisania
Operator Przykad Wynik
= $a = $b
Przypisuje warto $b
do $a.
+= $a += $b
Przypisuje warto
($a+$b) do $a. Jest to
identyczne z $a=$a+$b.
-= $a -= $b
Przypisuje warto
($a-$b) do $a. Jest to
identyczne z $a=$a-$b.
*= $a *= $b
Przypisuje warto
($a*$b) do $a. Jest to
identyczne z $a=$a*$b.
/= $a /= $b
Przypisuje warto
($a/$b) do $a. Jest to
identyczne z $a=$a/$b.
.= $a .= $b
Przypisuje warto
($a.$b) do $a. Jest to
identyczne z $a=$a.$b.
%= $a %= $b
Przypisuje warto
($a%$b) do $a. Jest to
identyczne z $a=$a%$b.
|= $a |= $b
Przypisuje warto
PHP Kompendium wiedzy
29

($a|$b) do $a. Jest to
identyczne z $a=$a|$b.
&= $a &= $b
Przypisuje warto
($a&$b) do $a. Jest to
identyczne z $a=$a&$b.
^= $a ^= $b
Przypisuje warto
($a^$b) do $a. Jest to
identyczne z $a=$a^$b.
<<= $a <<= $b
Przypisuje warto
($a<<$b) do $a. Jest to
identyczne z $a=$a<<$b.
>>= $a >>= $b
Przypisuje warto
($a>>$b) do $a. Jest to
identyczne z $a=$a>>$b.
Zasig zmiennych
Oglnie rzecz ujmujc, zmienne globalne PHP maj taki sam zasig. Rozciga si on rwnie na pliki
doczane. Wewntrz funkcji definiowanych przez uytkownika zmienne maj zasig lokalny. Zmienne globalne
musz by deklarowane jako globalne, aby mogy by wykorzystywane wewntrz funkcji. PHP posiada rwnie
zmienne statyczne, ktre deklarowane wewntrz funkcji zapewniaj utrzymywanie swojej wartoci pomidzy
kolejnymi wywoaniami funkcji.
Wydruk 2.10. Zasig zmiennych
<?php
$aGlobal1 = "To jest test";
/*
Doczamy inny plik z kodem PHP. POwysza zmienna
$aGlobal1, bdzie dostpna w doczanym pliku.
*/
include( "example10_inc.php" );

function DoPrint( )
{
/*
Ponisza instrukcja wydrukuje tylko <br>
poniewa zmienna $aGlobal1 wewntrz funkcji
jest poza zasigiem.
*/
print( "$aGlobal1<br>" );
}
DoPrint();

function DoPrint2( )
{
global $aGlobal1;
/*
Ponisza instrukcja wypisze warto zmiennej
poniewa zostaa zadeklarowana jako globalna.
*/
print( "$aGlobal1<br>" );
}
DoPrint2();

function StaticFunc( )
{
static $aVal = 0;
print( "$aVal<br>" );
$aVal++;
}
// Ponisze wywoania spowoduj wypisanie 0, a nastpnie 1
StaticFunc();
StaticFunc();

?>
--- Zawarto pliku example10_inc.php3 ---
<?php
print( "$aGlobal1<br>" );
?>
Rozdzia 2 Jzyk
30

Stae
PHP posiada kilka predefiniowanych staych oraz pozwala na definiowanie wasnych. Pena lista staych
znajduje si w skorowidzu na kocu ksiki. Aby zdefiniowa now sta uywa si funkcji define(). Zauwa, e
stae PHP nie s makrami w stylu C i dlatego musz by wartociami skalarnymi.
Wydruk 2.11. Stae
<?php
define( "aString", "To jest stay cig znakw" );
define( "aNumber", 1 );

print( "Mamy tutaj zdefiniowane " . aNumber . " staych.<br>" );
print( "Jej wartoci jest '" . aString . "'<br>" );
?>
Operatory i kolejno operatorw
PHP posiada zestaw operatorw znanych programistom C i C++. W tabelach od 2.5. do 2.10.
zamieszczone zostao zestawienie dostpnych operatorw.
Oprcz operatorw umieszczonych w tabelach istnieje jeszcze kilka operatorw, ale s one trudniejsze do
klasyfikacji. Operator trjskadnikowy, zapisywany jako ?: jest dostpny zarwno w PHP jak i w C. Wyraenie
$wart = (wyraenie1) ? (wyraenie2) : (wyraenie3); przypisuje do zmiennej $wart warto wyraenie2, jeeli
wyraenie1 bdzie miao warto True, natomiast w przeciwnym przypadku $wart bdzie miao warto
wyraenie3.
Operator wykonania oznaczany przez znak ` (na jednym klawiszu ze znakiem ~) jest podobny do
operatora dostpnego we wielu jzykach programowania powoki. Wyraenie otoczone znakami ` jest
wykonywane na serwerze a zwracana warto przekazywana do zmiennej.
PHP posiada rwnie operator kontroli bdw @. Gdy operator ten jest umieszczony przed wyraeniem,
nie s generowane komunikaty bdw powodowanych przez to wyraenie. Uycie tego operatora pozwala na
stworzenie lepszej obsugi bdw, o ile uaktywniona jest opcja track_errors. Gdy opcja ta jest aktywna,
komunikaty bdw zatrzymane przez operator @ s zapamitywane w zmiennej globalnej $php_errormsg.
Zmienna ta jest nadpisywana przez kolejne bdy, wic aby kontrola bdw dziaaa poprawnie, zmienna ta
powinna by sprawdzana moliwie szybko.
Wydruk 2.12. Niektre dziaania z operatorami
<?php
$aNum1 = 1;
$aNum2 = 2;

$aVal = ( $aNum1 == $aNum2 ) ? "Wartoci s rwne" :
"Wartoci s rne";
print( "$aVal<br>" ); // drukuje "Wartoci s rne"

$aVal = ( 1 == "1" ) ? "Wartoci s rwne" :
"Wartoci s rne";
print( "$aVal<br>" ); // drukuje "Wartoci s rwne"

$aVal = ( 1 === "1" ) ? "Wartoci s identyczne" :
"Wartoci nie s identyczne";
print( "$aVal<br>" ); // prints "Wartoci nie s identyczne"

/*
Poniszy fragment powoduje przypisanie do $aListing
zawartoci biecego katalogu serwera,
a nastpnie konwersj znakw nowej linii
na znaczniki <br> I wypisanie wynikw
*/
$aListing = `ls -l`;
$aFmtList = nl2br( $aListing );
print( "<br>Zawarto katalogu:<br><b>$aFmtList</b><br>" );
?>
PHP Kompendium wiedzy
31

Programowanie przepywu sterowania
PHP posiada standardowe instrukcje programowania przepywu sterowania takie jak if oraz ptle while i
for. Programici C nie bd mieli kopotu ze skadni tych instrukcji. Dodatkowo PHP posiada dwie funkcje
doczania plikw z kodem rdowym: include() i require().
if, else, elseif
Jest to oczywicie najwaniejszy element jzyka. Instrukcja if organizuje przepyw sterowania poprzez
tworzenie rozgazie na podstawie wyrae logicznych.
Wydruk 2.13. Przykad uycia if, else i elseif
<?php
if ( 1 < 2 )
print( "To zostanie wydrukowane.<br>" );
else
print( "To nie zostanie wydrukowane.<br>" );

$aValue = 2;
if ( $aValue == 1 )
{
// Uywamy nawiasw klamrowych do otaczania blokw instrukcji
print( "\$aValue == 1<br>" );
}
elseif ( $aValue == 2 )
{
print( "\$aValue == 2<br>" );
}
elseif ( $aValue == 3 )
{
print( "\$aValue == 3<br>" );
}
else
{
print( "\$aValue nie jest 1, 2 ani 3<br>" );
}
?>
while
Jest to najprostszy typ ptli w PHP, ktra zachowuje si identycznie jak w C i innych jzykach wysokiego
poziomu.
do .. while
Mimo, e jest to ptla podobna do while, to w ptli do..while warunek ptli jest sprawdzany po
pierwszym przebiegu ptli. Gwarantuje to, e ciao ptli zostanie wykonane co najmniej raz.
Wydruk 2.14. Przykad uycia while i do..while
<?php
print( "Liczenie w gr przy uyciu <b>while</b>.<br>" );
$nIndex = 0;
// wypisuje liczby od 0 do 9
while ( $nIndex < 10 )
{
print( "$nIndex<br>" );
$nIndex++;
}

print( "Liczenie w d przy uyciu <b>do..while</b>.<br>" );
// wypisuje liczby od 10 do 1
do
{
print( "$nIndex<br>" );
$nIndex--;
} while ( $nIndex > 0 );
?>
Rozdzia 2 Jzyk
32

for
Ptla for jest najbardziej zoon instrukcj ptli w PHP, ale jest ona skadniowo identyczna z instrukcj
for w jzyku C. Jej skadnia jest nastpujca:
for (wyr1; wyr2; wyr3) instrukcja
Warto pierwszego wyraenia (wyr1) jest obliczana raz, na pocztku ptli. Warto drugiego (wyr2) jest
obliczana na pocztku kadego przebiegu ptli. Jeeli bdzie ono miao warto True, ptla bdzie si nadal
wykonywaa i zostan wykonane instrukcje ciaa ptli. Jeeli drugie wyraenie jest puste, przyjmowane jest, e
ma ono warto True. Na kocu kadego przebiegu ptli wykonywane jest trzecie wyraenie (wyr3). Kade z tych
trzech wyrae moe by puste.
Wydruk 2.15. Przykad uycia for
<?php
// Wypisuje liczby od 0 do 9
for ( $nIndex = 0; $nIndex < 10; $nIndex++ )
{
print( "$nIndex<br>" );
}

/*
$nIndex ma warto 10. Pokaemy teraz, e
kade z trzech wyrae moe zosta opuszczone.
Nie jest to zalecane ze wzgldu na czytelno kodu.
Ptla powoduje wypisanie liczb od 10 do 1
*/
for ( ; $nIndex > 0; $nIndex-- )
{
print( "$nIndex<br>" );
}
?>
foreach
Wyraenie foreach jest wygodnym sposobem na przegldanie tablic. Podobne konstrukcje znajduj si w
VBScript, Perl i innych jzykach. PHP posiada dwa warianty skadni:
foreach ( tablica as zmienna_wartosc) instrukcja
foreach ( tablica as zmienna_klucz => zmienna_wartosc) instrukcja
Pierwsza posta ptli przebiega po podanej tablicy i w kadym przebiegu warto biecego elementu
tablicy jest przypisywana do zmiennej (zmienna_wartosc) a wskanik biecego elementu tablicy jest przesuwany.
Druga posta realizuje to samo, ale dodatkowo do zmiennej (zmienna_klucz) jest przypisywany klucz biecej
pozycji.
Wydruk 2.16. Przykad uycia foreach
<?php
$aArray = array( "Czerwony", "Zielony", "Niebieski" );
foreach( $aArray as $aValue )
{
print( "Bieca warto to $aValue<br>" );
}

$aColorArray = array( "Czerwony" => "#FF0000",
"Zielony" => "#00FF00",
"Niebieski" => "#0000FF" );
foreach( $aColorArray as $aKey => $aValue )
{
print( "Warto szesnastkowa $aKey to $aValue<br>" );
}
?>
switch
Instrukcja switch upraszcza tworzenie wielokrotnych warunkw. Jest ona czsto uywana zamiast
skomplikowanych konstrukcji if...elseif...else zawierajcych wiele wystpie elseif. Skadnia i
implementacja tej instrukcji jest identyczna jak w C. Korzystnym ulepszeniem w PHP jest moliwo uywania
cigw jako wyrae instrukcji switch.
PHP Kompendium wiedzy
33

Programici Delphi i Pascala maj zwykle kopoty z zapamitaniem, e w konstrukcji switch w C
wystpuj instrukcje break. Czasami opuszczenie tej instrukcji jest wygodne. Poniszy przykad ilustruje czste
zastosowania instrukcji switch.
Wydruk 2.17. Przykady uycia switch
<?php
$nIndex = 2;
// Najprostsza instrukcja switch
switch ( $nIndex )
{
case 0:
print( "zero<br>" );
break;
case 1:
print( "jeden<br>" );
break;
case 2:
print( "dwa<br>" );
break;
}

// Uycie frazy 'default'
$nIndex = 17;
switch ( $nIndex )
{
case 0:
print( "zero<br>" );
break;
case 1:
print( "jeden<br>" );
break;
case 2:
print( "dwa<br>" );
break;
default:
print( "Nie jest to zero, jeden ani dwa<br>" );
break;
}

// Switch z uyciem cigu
$aColor = "niebieski";
switch( $aColor )
{
case "czerwony":
print( "#FF0000<br>" );
break;
case "zielony":
print( "#00FF00<br>" );
break;
case "niebieski":
print( "#0000FF<br>" );
break;
default:
print( "inny<br>" );
break;
}

/*
Opuszczenie instrukcji break spowoduje
wykonanie wszystkich wyrae po pasujcej pozycji.
Jeeli $nIndex jest 0, zostan wykonane wszystkie
trzy instrukcje print. Jeeli $nIndex jest 1, wykonane zostan
ostatnie dwie instrukcje print.
*/
$nIndex = 0;
switch ( $nIndex )
{
case 0:
print( "zero<br>" );
case 1:
print( "jeden<br>" );
case 2:
print( "dwa<br>" );
}

/*
opuszczenie instrukcji break moe by czasami przydatne
*/
$aColor = "Czerwony";
switch( $aColor )
Rozdzia 2 Jzyk
34

{
case "czerwony":
case "Czerwony":
// Ponisza instrukcja zostanie wykonana, jeeli $aColor
// bdzie mia warto "Czerwony" lub "czerwony"
print( "#FF0000<br>" );
break;
case "zielony":
case "Zielony":
print( "#00FF00<br>" );
break;
case "niebieski":
case "Niebieski":
print( "#0000FF<br>" );
break;
default:
print( "inny<br>" );
break;
}
?>
break i continue
PHP posiada rwnie znane z C instrukcje break i continue, ktre pozwalaj na dodatkowe sterowanie
ptlami. Obie te instrukcje pozwalaj na podanie im parametru numerycznego, ktry okrela ilo zagbionych
ptli, ktre naley przerwa lub rozpocz od pocztku.
Wyraenie break koczy wykonanie biecej konstrukcji sterujcej (ptli lub wyraenia switch).
Wyraenie continue jest uywane jedynie w ptlach. Powoduje ono opuszczenie pozostaych instrukcji ciaa ptli
i rozpoczcie nowej iteracji.
Najczciej instrukcje break i continue s stosowane w zagniedonych ptlach. W przypadku ptli
prostych, wyraenia warunkowe s wystarczajce do realizacji tych zada.
Wydruk 2.18. Przykady uycia break i continue
<?php
$aArray = array( 4, 5, 15, 12, 7, 3, 20, 11, 31 );
$aCurMax = 17;
/*
Sprawdzamy, czy istnieje w tablicy warto wiksza
od biecej wartoci maksymalnej.
*/
foreach( $aArray as $aValue )
{
/*
Wyraenie bdzie prawdziwe, gdy osignita zostanie warto
20. Poniewa wykonujemy instrukcj break,
nie sprawdzamy wartoci ktre s w tablicy po wartoci 20
*/
if ( $aValue > $aCurMax )
{
$aCurMax = $aValue;
break; // moemy napisa 'break 1;'
}
}
// wypisuje "Biecym maksimum jest 20"
print( " Biecym maksimum jest $aCurMax<br>" );

// wypisuje liczby nieparzyste od 0 do 20
$nIndex = 0;
for ( $nIndex = 0; $nIndex < 20; $nIndex++ )
{
if ( ( $nIndex % 2 ) == 0 )
continue; // opcjonalnie 'continue 1;'
print( "$nIndex<br>" );
}
?>
PHP osiada alternatywn skadni dla konstrukcji sterujcych if, while, for i switch. W kadej z tych
konstrukcji otwierajca klamra jest zamieniona na dwukropek (:) a zamykajca klamra na odpowiednio endif,
endwhile, endfor i endswitch. Gdy tworzysz due skrypty wbudowane w HTML, skadnia alternatywna moe by
uyteczna, poniewa zapewnia wyran identyfikacj koca struktur sterujcych.
Wydruk 2.19. Przykad uycia alternatywnej skadni PHP na stronie HTML
<html>
<head>
<title>Przykad 19</title>
PHP Kompendium wiedzy
35

</head>

<body>
<!-- Uywamy PHP do utworzenia listy opcji -->
<form action="someotherpage.phtml" method="post">
<table>
<tr>
<td>
Wybierz swj rok urudzenia:
</td>
<td>
<select name="BirthYear" size="1">
<?php
/*
Generujemy znaczniki dla lat 1920-2000
w odwrotnej kolejnoci
*/
$aCurYear = 2000;
while( $aCurYear >= 1920 ):
?>
<option value="<?php print( $aCurYear ); ?>">
<?php print( $aCurYear ); ?>
</option>
<?php
$aCurYear--;
endwhile;
/*
zakadajc, e pomidzy while i endwhile jest duo wicej tekstu,
moe by trudno znale kocowy rednik,
jeeli uyjemy zwykej skadni.
*/
?>
</select>
</td>
</tr>
</table>
</form>
</body>
</html>
include i require
PHP posiada dwa mechanizmy doczania plikw zewntrznych: include() i require(). Wyraenie
include() jest zwyk funkcj PHP, natomiast require() jest konstrukcj jzykow, ktra posiada kilka
ogranicze. W obu przypadkach po doczeniu pliku PHP przechodzi do trybu HTML na pocztku doczanego
pliku. Na kocu pliku analizator wraca do trybu PHP. Oznacza to, e dowolny kod zawarty w pliku doczanym
musi by otoczony prawidowymi znacznikami PHP.
Funkcja include() jest wykonywana za kadym jej wywoaniem i moe znajdowa si wewntrz ptli lub
instrukcji warunkowych. Pozwala to warunkowo wcza pliki, lub wcza grupy plikw przy pomocy
odpowiednio skonstruowanej ptli. Funkcja include() pozwala rwnie, aby doczany plik zwraca warto,
ktr mona nastpnie przypisa do zmiennej. Przetwarzanie pliku w instrukcji include() koczy si, gdy
zostanie napotkana instrukcja return.
Wyraenie require() rni si tym od include(), e nie wchodzi w skad konstrukcji sterujcych.
Oznacza to, e pliki nie mog by warunkowo doczane za pomoc require(). Wyraenie to jest wykonywane
raz, jeeli znajduje si w ptli lub nawet, jeeli znajduje si w instrukcji warunkowej, ktrej warunek ma warto
False. Inn rnic jest to, e pliki doczane za pomoc require() nie mog zwraca wartoci. Prba zwrcenia
wartoci w wyraeniu require() powoduje bd skadni.
Funkcje
Rozdzia 2 Jzyk
36
PHP pozwala na tworzenie funkcji definiowanych przez uytkownika. Funkcje nie musz by
deklarowane przed ich uyciem w kodzie PHP4. Funkcje w PHP mog posiada nastpujce cechy: zmienne
nazwy funkcji, zmienna liczba argumentw, argumenty domylne i argumenty przekazywane przez referencj.
PHP pozwala na wykonywanie dowolnego kodu w ciele funkcji, wczajc w to wywoania innych funkcji.
Zdolno ta pozwala rwnie na tworzenie funkcji rekurencyjnych. PHP nie pozwala na przecianie funkcji, nie
ma rwnie mechanizmu usuwania lub przedefiniowania wczeniej zdefiniowanych funkcji.

Domylnie argumenty s przekazywane przez warto. Aby przekaza argument przez referencj, naley
poprzedzi nazw zmiennej znakiem &. Uywajc argumentw domylnych, musz by one umieszczone po
wszystkich argumentach obowizkowych. W przypadku zmiennej listy argumentw, dostpne s funkcje
func_num_args(), func_get_arg() i func_get_args(), za pomoc ktrych mona pobra dane przekazane jako
argumenty. Ponisze przykady pokazuj uycie funkcji w PHP.
Wydruk 2.20. Przykady funkcji definiowanych przez uytkownika
<?php
// prosta funkcja
function ReturnSum( $a, $b )
{
return $a + $b;
}

// przekazanie argumentu przez referencj
function StringAppend( &$BaseString, $AddString )
{
// poniewa jest to przekazane przez referencj, warto
// $BaseString moe by zmieniona poza t funkcj
$BaseString .= $AddString;
}

// wartoci domylne
/*
Funkcja ta moe by wywoana przy uyciu jednej z postaci:
PrintAnchorTag( "href", "text" );
PrintAnchorTag( "href", "text", "target" );
*/
function PrintAnchorTag( $aHREF, $aText, $aTarg = "" )
{
if ( $aTarg == "" )
{
print( "<a href=\"$aHREF\">$aText</a>" );
}
else
{
print( "<a href=\"$aHREF\" target=\"$aTarg\">$aText</a>" );
}
}

// zmienna lista argumentw
function PrintEverything( )
{
$aNumArgs = func_num_args();
for ( $nIndex = 0; $nIndex < $aNumArgs; $nIndex++ )
{
$aArgVal = func_get_arg( $nIndex );
print( "Argument $nIndex: $aArgVal<br>" );
}
}

print( "ReturnSum( 3, 5 ): " . ReturnSum( 3, 5 ) . "<br>" );

$aString = "Marysia miaa ";
StringAppend( $aString, "ma owieczk" );
print( "$aString<br>" ); // wypisuje "Marysia miaa ma owieczk"

PrintAnchorTag( "example10.phtml",
"Zobaczmy jeszcze raz przykad 10" );
print( "<br>" );
PrintAnchorTag( "example10.phtml",
"Zobaczmy jeszcze raz przykad 10 w nowym oknie",
"_blank" );
print( "<br>" );

print( "Wywoanie PrintEverything( 1, 2, 3, 4, 5 ):<br>" );
PrintEverything( 1, 2, 3, 4, 5 );
?>
Klasy i programowanie obiektowe
PHP posiada zdolno tworzenia klas za pomoc skadni podobnej jak w C++. PHP posiada rwnie
bardzo prost implementacj programowania obiektowego, ktra jest jednak wystarczajca dla wikszoci
aplikacji WWW. Dostpne jest dziedziczenie jednobazowe, nie ma dziedziczenia wielobazowego. Istniej
konstruktory klas, ale nie ma destruktorw. PHP posiada (i wymaga uywania) wskanik $this, ktry jest
PHP Kompendium wiedzy
37

stosowany do odwoywania si do metod i zmiennych obiektu. Poniszy przykad pokazuje tworzenie prostej
klasy. Wicej przykadw na ten temat znajdzie si w pniejszych rozdziaach ksiki.
Wydruk 2.21. Przykady uycia klas w PHP
<?php
// tworzenie prostej klasy
class ShoppingBasket
{
var $fItems;
var $fCurValue;

/*
jest to konstruktor klasy,
poniewa ma tak sam nazw jak klasa.
Tak samo jak w C++ konstruktor moe posiada argumenty
W tym przypadku jest to pocztkowa warto koszyka.
Moe by to staa prowizja lub rabat..
*/
function ShoppingBasket( $aInitialValue = 0.0 )
{
$this->fCurValue = $aInitialValue;
}

// Dodanie okrelonej iloci przedmiotw
function AddItem( $aName, $aValue, $aQuantity = 1 )
{
$this->fItems[$aName]["Quantity"] += $aQuantity;
$this->fItems[$aName]["Value"] = $aValue;
$this->fCurValue += $aValue * $aQuantity;

return True;
}

function RemoveItem( $aName, $aQuantity = 1 )
{
// Usuwamy okrelon ilo przedmiotw
// jedynie, gdy bya dostpna wystarczajca ich ilo
if ( $this->fItems[$aName]["Quantity"] > $aQuantity )
{
$this->fItems[$aName]["Quantity"] -= $aQuantity;
$this->fCurValue -= $this->fItems[$aName]["Value"] *
$aQuantity;
}
else
{
return False;
}
}

function PrintBasket( )
{
if ( count( $this->fItems ) > 0 )
{
print( "Zawarto koszyka:<blockquote>" );
foreach( $this->fItems as $aKey => $aValue )
{
print( "{$aValue['Quantity']} $aKey<br>" );
}
print( "Warto cakowita: $" .
number_format( $this->fCurValue, 2 ) );
print( "</blockquote>" );
print( "<br>" );
}
else
{
print( "<i>Koszyk jest pusty</i><br><br>" );
}
}
}

/*
Tworzenie nowego obiektu ShoppingBasket. Dodanie kilku przedmiotw
usunicie kilku przedmiotw i wypisanie zawartoci koszyka
*/
$aBasket = new ShoppingBasket( 3.50 );
$aBasket->PrintBasket();
$aBasket->AddItem( "gizmo", 1.50 ); // dodanie 1 gizmo
$aBasket->PrintBasket();
$aBasket->AddItem( "foobar", 2.10, 6 ); // dodanie 6 foobarw
$aBasket->PrintBasket();
Rozdzia 2 Jzyk
38
$aBasket->RemoveItem( "foobar", 15 );

$aBasket->PrintBasket();
$aBasket->RemoveItem( "foobar", 3 );
$aBasket->PrintBasket();
?>
Porwnywanie wzorcw
PHP posiada dwa typy funkcji do porwnywania wzorcw (lub wyrae regularnych). Pierwszy typ jest
zgodny ze specyfikacj POSIX i s to funkcje ereg(), eregi(), ereg_replace(), eregi_replace() oraz split().
Kada z tych funkcji jako pierwszego argumentu wymaga wyraenia regularnego. PHP korzysta z rozszerzonych
wyrae regularnych zdefiniowanych przez POSIX 1003.2. PHP zawiera w katalogu regex strony podrcznika,
ktre w peni opisuj wyraenia regularne POSIX.
Drugi typ funkcji porwnywania wzorcw jest zgodny z wyraeniami regularnymi Perl. Nazwy tych
funkcji s poprzedzone cigiem preg_. Pena lista tych funkcji znajduje si w skorowidzu na kocu ksiki.
Skadnia tych wyrae jest taka sama jak w Perl 5 z kilkoma rnicami. Bieca implementacja tych funkcji
odpowiada Perl 5.005. Rnica pomidzy implementacj w Perl 5.005 i w PHP jest dokadnie opisana w
dokumentacji PHP dostpnej z witryny http://www.php.net.
Podsumowanie
Rozdzia ten jest zwizym opisem jzyka PHP i nie zawiera szczegowo opisanych podstaw
programowania. Dlatego nie zawiera on dyskusji na temat tego kiedy lub dlaczego naley uywa okrelonych
konstrukcji. Zamieszczone zostay za to przykady ilustrujce skadni i dostpne funkcje. PHP zawiera wszystkie
wasnoci potrzebne do tworzenia zoonych i atwych do zarzdzania aplikacji WWW. Jzyk jest wystarczajco
sprawny do realizacji wikszoci zada, ale jest przygotowany do tworzenia aplikacji dla WWW, co zostanie
pokazane w kolejnych rozdziaach.
PHP Kompendium wiedzy
39
Rozdzia 3. Formularze i cookie
Wstp
W czasie tworzenia dowolnego typu aplikacji utworzenie dobrego mechanizmu interakcji z
uytkownikiem jest jednym z najwaniejszych zada programisty. HTML posiada elementy formularzy, ktre s
uywane do zbierania danych od uytkownika, natomiast PHP zapewnia prosty mechanizm przetwarzania tych
formularzy. Poniewa PHP zosta zaprojektowany jako jzyk programowania dla WWW, obsuguje on
automatycznie wiele szczegw przetwarzania formularzy. Rozdzia ten zawiera informacje nie tylko na temat
sposobu uycia formularzy HTML w PHP, ale rwnie na temat kontroli poprawnoci i przetwarzania danych
formularza. Dla programistw, ktrzy przechodz od pisania zwykych aplikacji do tworzenia aplikacji WWW
przeznaczona jest cz zatytuowana Wane zagadnienia programowania dla WWW, ktra sygnalizuje
niektre problemy jakie powstaj gdy jako urzdzenie wyjciowe uywana jest przegldarka WWW. W rozdziale
tym znajduje si rwnie omwienie mechanizmu cookie, poniewa jest ono skadniowo podobne do obsugi
elementw formularzy. Cookie mog rwnie pomc w zrealizowaniu mechanizmu utrzymywania stanu, ktry
jest zwykle potrzebny w czasie dialogu z uytkownikiem.
Konwencje nazw plikw
We wszystkich przykadach oraz w mojej aktualnej pracy do oznaczania skryptw PHP ktre generuj strony
HTML uywam rozszerzenia .phtml oraz rozszerze .php lub .php3 do plikw doczanych. Nie uywam
najczciej uywanych rozszerze .php i .php3 do stron wywietlajcych dane jedynie dlatego, e uwaam e
rozszerzenie .phtml lepiej wyglda. Jest to jedyny powd. Do plikw doczanych uywam innego
rozszerzenia i chcemy zaznaczy, e jest to kod PHP. Nie uywam typowego rozszerzenia inc.
Moesz uywa dowolnego rozszerzenia dla skryptw PHP. Wszystkie rozszerzenia jakich uywasz do
skryptw PHP i plikw doczanych powinny zosta doczone do konfiguracji serwera WWW. Rozszerzenia
te konfiguruje si uywajc opcji konfiguracji, ktre zostay opisane w rozdziale 1, Kompilacja i instalowanie
PHP. Na przykad, jeeli uywasz rozszerze php i inc do oznaczania skryptw PHP i plikw doczanych,
powiniene si upewni, e serwer WWW zosta tak skonfigurowany, e bdzie traktowa oba te rozszerzenia
jako pliki PHP i przetwarza je przed wysaniem do przegldarki uytkownika. Jeeli nie zrobisz tego,
uytkownik moe zapisa twoje skrypty. Rozwamy nastpujcy przykad:
<!-- Plik: securityhole.phtml -->
<html>
<head>
<title>Przykad: bdny plik doczany otwiera dziur
w systemie zabezpiecze</title>
</head>
<body>
<?php
/*
Plik doczany bogus.inc, zawiera bd
ale rwnie znajduje si w nim nazwa uytkownika bazy danych i haso.
*/
include( "bogus.inc" );
print( "Poznajmy dziur w systemie bezpieczestwa.<br>" );
?>
</body>
</html>
<!-- Plik: bogus.inc -->
<?php
// Jest to doczany plik PHP demonstrujcy
// potencjaln dziur w systemie zabezpiecze,
// powatajc, gdy le skonfigurowany zostanie serwer WWW.
$aDatabaseIP = "12.34.56.123";
$aDatabaseUser = "secretuser";
$aDatabasePass = "secretpassword";
/*

Zagniedony komentarz powoduje bd.
/* wanie tutaj */
*/
?>
W przykadzie tym do gwnego pliku, securityhole.phtml, doczany jest plik bogus.inc. Doczany plik
zawiera dane na temat poczenia z baz danych, w tym nazw uytkownika i haso. Zawiera on rwnie bd
syntaktyczny. Gdy otwarty zostanie plik securityhole.phtml, wywietlony zostanie bd: Parse error: parse
error in bogus.inc on line 12.
Dociekliwy uytkownik moe sprbowa obejrze plik bogus.inc wpisujc odpowiedni URL w pasku adresu.
Jeeli serwer WWW jest skonfigurowany taj aby traktowa pliki .inc jako tekst (tak jak mj), cay tekst pliku
pojawi si w przegldarce. Jeeli serwer WWW jest tak skonfigurowany, aby traktowa pliki .inc jak kady inny
skrypt PHP, uytkownik zobaczy jedynie wczeniej wspomniany komunikat bdu.
Podsumowujc. W trakcie tworzenia aplikacji PHP moesz uy dowolnego rozszerzenia, ale aby unikn
potencjalnego zagroenia bezpieczestwa naley tak skonfigurowa serwer WWW, aby analizowa wszystkie
pliki posiadajce uywane przez ciebie rozszerzenia.
Obsuga formularzy w PHP
Do pobierania danych od uytkownika w HTML stosuje si formularze. W domylnej konfiguracji PHP
po przesaniu danych formularza do skryptu PHP, konwertuje wszystkie elementy formularza na zmienne PHP.
Ponisza strona HTML zawiera prosty formularz, do ktrego naley wpisa nazw uytkownika i jego haso. Po
przesaniu formularza do skryptu post1.phtml, zmienne $UserName i $Password bd zawieray wartoci wpisane
jako nazw uytkownika i haso.
Wydruk 3.1. Strona HTML i skrypt PHP ilustrujce procedur logowania si uytkownika.
<!-- To jest strona HTML, listing1.html -->
<html>
<head>
<title>Wydruk 3.1 - listing1.html</title>
</head>

<body>
<form action="post1.phtml" method="post">
Nazwa uytkownika: <input type="text" name="Username"><br>
Haso: <input type="password" name="Password"><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
<!-- To jest skrypt PHP, post1.html -->
<html>
<head>
<title>Wydruk 3.1: post1.phtml</title>
</head>

<body>
<?php
print( "Nazwa uytkownika: $Username<br>" );
print( "Haso: $Password<br>" );
?>
</body>
</html>
Skalarne i wielowartociowe elementy formularza
Elementy formularzy HTML zawieraj zwykle wartoci skalarne. Zamieszczony na wydruku 1 przykad
zawiera formularz z dwoma wartociami skalarnymi nazw uytkownika i hasem. Mona rwnie tworzy
elementy formularza zawierajce wiele wartoci, na przykad list wielokrotnego wyboru. Aby uy
nieskalarnych elementw formularza w PHP, naley doda do nazwy nawiasy kwadratowe oznaczajce zmienn
tablicow. Formularz na wydruku 2 pokazuje takie wielowartociowe elementy formularza.
Wydruk 3.2. Formularz HTML z elementami wielowartociowymi
<form action="displayall.phtml" method="post">
<table>
<tr>
PHP Kompendium wiedzy
41

<td valign="top">
Wybierz kolory ktre lubisz:
</td>
<td valign="top">
<!-- Nazwy s indeksami tablicy -->
<select name="Colors[]" size="5" multiple>
<option value="Red">Czerwony</option>
<option value="Green">Zielony</option>
<option value="Blue">Niebieski</option>
<option value="Purple">Purpurowy</option>
<option value="Yellow">ty</option>
</select>
</td>
</tr>
<tr>
<td valign="top">
Wprowad twj adres:
</td>
<td valign="top">
<!-- Trzy linie na dane adresowe. Uywamy notacji tablicowej
aby zaznaczy uycie wielu wierszy tablicy -->
<input type="text" name="address[]"><br>
<input type="text" name="address[]"><br>
<input type="text" name="address[]"><br>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="Wylij">
</td>
</tr>
</table>
</form>
Po przesaniu danych formularza z wydruku 2 do skryptu PHP, kada z tablic $Colors[] i $adress[]
bdzie zawiera zero lub wicej wartoci.
Alternatywne metody odczytywania wartoci z formularza
PHP posiada alternatywn metod dostpu do danych przesanych do skryptu. Predefiniowane zmienne
tablicowe HTTP_GET_VARS i HTTP_POST_VARS zawieraj tablice asocjacyjne elementw przesanych do skryptu przy
pomocy metod odpowiednio GET i POST. Skrypt wywietlajcy dane z wydruku 1 moe zosta przepisany w
nastpujcy sposb:
<!-- To jest skrypt PHP, post2.html -->
<html>
<head>
<title>Wydruk: post2.phtml</title>
</head>

<body>
<?php
error_reporting( 255 );
print( "Nazwa uytkownika: {$HTTP_POST_VARS['Username']}<br>" );
print( "Haso: {$HTTP_POST_VARS['Password']}<br>" );
?>
</body>
</html>
W niektrych przypadkach preferowane jest uycie zmiennych HTTP_GET_VARS lub HTTP_POST_VARS zamiast
korzystania ze zmiennych globalnych. Na przykad moesz chcie wywietli w czasie uruchamiania skryptu
wartoci wszystkich danych wysanych z formularza. Jeeli bardzo przejmujesz si wydajnoci serwera WWW,
mona tu nieco zyska, poniewa PHP nie bdzie musia tworzy zmiennych globalnych dla kadego z
elementw formularza. Mona wic tak skonfigurowa PHP, aby nie udostpnia tych zmiennych globalnych i tak
pisa skrypty, aby korzystay z wartoci zawartych w tablicach HTTP_GET_VARS i HTTP_POST_VARS. Wicej na temat
tej dyrektywy konfiguracji napisane zostao na kocu ksiki przy opisie opcji konfiguracji register_globals.
Ponisza funkcja demonstruje uycie tablic HTTP_GET_VARS i HTTP_POST_VARS do wywietlenia wszystkich
danych przekazanych z formularza do skryptu:
function DisplayGetVars()
{
global $HTTP_GET_VARS;
DisplayArray( $HTTP_GET_VARS );
}
function DisplayPostVars()
Rozdzia 3 Formularze i cookie
42
{

global $HTTP_POST_VARS;
DisplayArray( $HTTP_POST_VARS );
}
Obie z tych funkcji opieraj si o funkcj DisplayArray przedstawion na wydruku 3.3. Jest to prosta
funkcja wywietlajca wszystkie elementy tablicy w tablicy HTML. Obsuguje ona rekurencyjnie elementy
tablicy, ktre same s tablicami.
Wydruk 3.3. Funkcja DisplayArray
function DisplayArray( $aArray )
{
// Upewniamy si, czy $aArray jest na pewno tablic
if ( is_array ($aArray ) && (count( $aArray ) > 0 ))
{
// Rozpoczcie tabeli
print ("<table border = \"1\">");
// Wywietlenie nagwka tabeli
print ( " <tr><th>Klucz</th><th>Warto</th></tr>");
// Wywietlenie wszystkich par klucz/warto z tabeli
foreach( $aArray as $aKey => $aValue )
{
print( "<tr>" );
// Jeeli bieca warto jest tablic
// wywoujemy rekurencyjnie funkcj
// w przeciwnym wypadku wywietlamy warto
if (!is_array( $aValue ))
{
// jeeli warto jest pusta, poinformujmy o tym
if (empty( $aValue ))
{
print( "<td>$aKey</td><td><i>pusty</i></td>");
}
else
{
print( "<td>$aKey</td><td><i>$aValue</i></td>");
}
}
else
{
print( "<td>$aKey(array)</td><td>");
DisplayArray( $aValue );
print ("</td>" );
}
print ("</tr>");
}
print ("</table>");
}
else
{
print("<i>pusty lub nieprawidowy</i>");
}
}
Uywajc tej funkcji mona pisa wasne skrypty PHP wywietlajce wartoci wszystkich przesanych
elementw formularza. Poniszy skrypt, displayall.phtml powoduje wywietlenie wszystkich danych przesanych
przez HTTP GET, HTTP POST i cookie odesane przez przegldark (cookie zostan omwione w dalszej czci
tego rozdziau).
Wydruk 3.4. Skrypt displayall.phtml.
<html>
<head>
<title>Wywietlenie wszystkich elementw formularza</title>
</head>
<body>
<?php
error_reporting( 255 );
include( "../include/gen_form_funcs.php" );
?>
<h2>Caa zawarto HTTP_GET_VARS</h2>
<?php
DisplayGetVars();
?>
<br><br>
<h2>Caa zawarto HTTP_POST_VARS</h2>
<?php
DisplayPostVars();
?>
<br><br>
<h2>Caa zawarto HTTP_COOKIE_VARS</h2>
<?php
PHP Kompendium wiedzy
43

DisplayCookieVars();
?>
<br><br>
</body>
</html>

Na rysunkach 3.1. i 3.2. korzystajc z formularza z wydruku 2. przedstawiono formularz wprowadzania
danych i wyniki wysania danych do skryptu displayall.phtml. Zauwamy, e na rysunku 3.2, tablica
HTTP_POST_VARS zawiera trzy elementy: Colors, Address i Submit. Wartoci dwch pierwszych elementw s, jak
si tego mona byo spodziewa, tablicami. Wartoci elementu Submit jest napis umieszczony na przycisku.
Piszc skrypt obsugujcy te wartoci naley pamita, e element Submit jest zawsze umieszczany w tablicy
HTTP_POST_VARS.
Rysunek 3.1.
Przykad
wielowartociowyc
h elementw
formularza


Rozdzia 3 Formularze i cookie
44

Rysunek 3.2. Wynik
przesania
formularza
wielowartocioweg
o do
displayall.phtml

Uycie formularzy do przesyania plikw
Wikszo nowoczesnych przegldarek posiada zdolno przesyania plikw z dysku komputera
uytkownika na serwer WWW. PHP posiada obsug przesyania plikw wbudowan bezporednio w jzyk. Jest
ona dokadniej opisana w rozdziale 5 Wysyanie plikw przez formularz.
Uycie rysunku jako przycisku wysania danych
Jeeli projekt aplikacji WWW tak przewiduje, moesz uy rysunku w miejsce przycisku HTML
wysyajcego dane formularza do serwera. Dla PHP nie ma znaczenia, czy jest to przycisk czy rysunek, ale jeeli
uywasz rysunku oprcz danych do serwera zostan wysane dodatkowo wsprzdne x i y (wzgldem lewego
grnego rogu rysunku) punktu gdzie zosta kliknity rysunek. Nazwy zmiennych przechowujcych wsprzdne
s tworzone poprzez dodanie _x i _y do nazwy elementu reprezentujcego rysunek. Na przykad na wydruku 5
nazw elementu rysunku jest SubmitImg. Zmienne reprezentujce wsprzdne bd si nazyway SubmitImg_x i
SubmitImg_y. Mechanizm ten jest wygodny do tworzenia map obrazw po stronie serwera.
Wydruk 3.5. Przykad uycia rysunku w formularzu
<!-- Strona HTML, imgsubmit.html -->
<html>
<head>
<title>Uycie rysunku zamiast przycisku</title>
</head>

<body>
<form action="displayall.phtml" method="post">
Nazwa uytkownika: <input type="text" name="Username"><br>
Haso: <input type="password" name="Password"><br>
<input type="image" name="SubmitImg" src="submit.gif">
</form>
</body>
</html>
PHP Kompendium wiedzy
45

Niektre przegldarki posiadaj mechanizm pozwalajcy wykorzysta klawisz Enter zamiast klikania w
przycisk na formularzu. Gdy uyjemy rysunku zamiast przycisku, mechanizm ten nadal bdzie dziaa, ale nie
zostan wtedy przesane dane na temat wsprzdnych.
Kontrola poprawnoci danych formularza
Cz ta jest powicona kontroli poprawnoci danych formularza przez mechanizmy umieszczone na
serwerze a nie na komputerze klienta. Jzyki skryptowe dziaajce na kliencie, takie jak JavaScript mog by
wykorzystywane do kontroli poprawnoci elementw formularza przez wysaniem ich do serwera. Kontrola taka
jest zalecana w przypadku tworzenia wysoce interaktywnych aplikacji WWW, ale nie jest ona cakowicie pewna,
poniewa moe by niedostpna w wielu przegldarkach i systemach operacyjnych. Dlatego dane musz by
kontrolowane na serwerze nawet, jeeli byy one ju kontrolowane na komputerze klienta. PHP pozwala na
stosowanie kilku metod kontroli poprawnoci danych, wykorzystujc wyraenia regularne, kontrol typw
danych lub przeszukiwanie sownikw w bazie danych.
Kontrola danych za pomoc wyrae regularnych
Prawdopodobnie najskuteczniejszym mechanizmem kontroli danych jest uycie wyrae regularnych i
funkcji wyrae regularnych w PHP. Wyraenia te s potnym narzdziem, ale jeeli wczeniej nie miae z
nimi dowiadczenia, s do skomplikowane w uyciu.
PHP obsuguje dwa rodzaje wyrae regularnych w stylu POSIX i Perl. Skupimy si tutaj na
wyraeniach w stylu POSIX, ale wyraenia w stylu Perl daj podobne moliwoci. Nazwy funkcji wyrae w
stylu Perl s poprzedzone przedrostkiem preg_ i s opisane w skorowidzu na kocu tej ksiki. Poniewa lepiej
znam wyraenia regularne w stylu POSIX, s one uywane we wszystkich przytoczonych tu przykadach, ale
naley pamita, e funkcje wyrae w stylu Perl s szybsze i maj wiksze moliwoci.
Funkcje wyrae regularnych w stylu POSIX to: ereg(), ereg_replace(), eregi(), eregi_replace() oraz
split(). Do kontroli poprawnoci uywa si funkcji ereg() i eregi(). Oglna skadnia tych funkcji jest
nastpujca:
int ereg( string wzorzec, string ciag [, array dopasowanie] )
int eregi( string wzorzec, string ciag [, array dopasowanie] )
Obie funkcje wymagaj wzorca wyraenia regularnego, cigu do przeszukania oraz opcjonalnej tablicy,
ktra bdzie zawiera dopasowania wzorca odnalezione w przeszukiwanym cigu. Kada funkcja zwraca true,
jeeli wzorzec zosta odnaleziony w cigu. Funkcja eregi() jest identyczna z ereg() poza tym, e przy
przeszukiwaniu ignoruje ona wielko liter.
Unikanie kontroli poprawnoci
Chocia kontrola poprawnoci jest wana, jeeli nie musisz czego kontrolowa, to nie rb tego. Zamiast tego mona zastosowa
takie mechanizmy wprowadzania danych, ktre zmniejszaj szans pomyki uytkownika. Na przykad zastosowanie listy rozwijalnej z
miesicami jest mniej pracochonne ni kontrola poprawnoci wpisanych nazw. Zamiast wszdzie korzysta ze zwykych pl
tekstowych naley znale miejsca, gdzie mona zastosowa list, pole wyboru lub przyciski opcji.
Poniszy przykad pokazuje zastosowanie wyrae regularnych do kontroli poprawnoci amerykaskiego
kodu pocztowego oraz dat w formacie ISO (YYYY-MM-DD). Zauwa, e w przykadach tych jest sprawdzany
jedynie format a nie wartoci.
Wydruk 3.6. Kontrola poprawnoci kodu pocztowego i daty ISO
<html>
<head>
<title>Kontrola poprawnoci amerykaskiego kodu pocztowego i daty ISO</title>
</head>

<body>
<?php
$aCode1 = "83440";
$aCode2 = "83440-1607";
$aCode3 = "834";
$aCode4 = "M6K 3E3";
$aCodeFormat = "[0-9]{5}(-[0-9]{4})?";
if ( ereg( $aCodeFormat, $aCode1 ) == True )
Rozdzia 3 Formularze i cookie
46

print( "'$aCode1' jest poprawnym kodem pocztowym<br>" );
else
print( "'$aCode1' nie jest poprawnym kodem pocztowym<br>" );
if ( ereg( $aCodeFormat, $aCode2 ) == True )
print( "'$aCode2' jest poprawnym kodem pocztowym<br>" );
else
print( "'$aCode2' nie jest poprawnym kodem pocztowym<br>" );
if ( ereg( $aCodeFormat, $aCode3 ) == True )
print( "'$aCode3' jest poprawnym kodem pocztowym<br>" );
else
print( "'$aCode3' nie jest poprawnym kodem pocztowym<br>" );
if ( ereg( $aCodeFormat, $aCode4 ) == True )
print( "'$aCode4' jest poprawnym kodem pocztowym<br>" );
else
print( "'$aCode4' nie jest poprawnym kodem pocztowym<br>" );

$aDate1 = "2000-06-29";
$aDate2 = "2000-7-4";
$aDate3 = "June 29, 2000";
$aDate4 = "0000-99-99";
$aDateFormat = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}";
if ( ereg( $aDateFormat, $aDate1 ) == True )
print( "'$aDate1' jest poprawnym formatem daty ISO<br>" );
else
print( "'$aDate1' nie jest poprawnym formatem daty ISO<br>" );
if ( ereg( $aDateFormat, $aDate2 ) == True )
print( "'$aDate2' jest poprawnym formatem daty ISO<br>" );
else
print( "'$aDate2' nie jest poprawnym formatem daty ISO<br>" );
if ( ereg( $aDateFormat, $aDate3 ) == True )
print( "'$aDate3' jest poprawnym formatem daty ISO<br>" );
else
print( "'$aDate3' nie jest poprawnym formatem daty ISO<br>" );
if ( ereg( $aDateFormat, $aDate4 ) == True )
print( "'$aDate4' jest poprawnym formatem daty ISO<br>" );
else
print( "'$aDate4' nie jest poprawnym formatem daty ISO<br>" );
?>
</body>
</html>
Wyniki dziaania skryptu z wydruku 6 s nastpujce:
'83440' jest poprawnym kodem pocztowym
'83440-1607' jest poprawnym kodem pocztowym
'834' nie jest poprawnym kodem pocztowym
'M6K 3E3' nie jest poprawnym kodem pocztowym
'2000-06-29' jest poprawnym formatem daty ISO
'2000-7-4' jest poprawnym formatem daty ISO
'June 29, 2000' nie jest poprawnym formatem daty ISO
'0000-99-99' jest poprawnym formatem daty ISO
Programici programujcy wczeniej w jzyku Perl i ci, ktrzy uywali ju wyrae regularnych uwaaj
tak kontrol poprawnoci za atw i wydajn. Ci za, ktrzy nie znaj wyrae regularnych mog wybra inne
metody kontroli poprawnoci, opisane w nastpnych dwch czciach.
Kontrola poprawnoci za pomoc sprawdzania typw
W niektrych przypadkach wystarczy sprawdzi typ wprowadzonej danej i nie przejmowa si
wprowadzon wartoci. Metoda ta jest odpowiednia do kontrolo prostych typw, takich jak liczby i cigi, ale
rwnie pozwala na nieco wicej. Jeeli zostanie uyta w poczeniu z dodatkowym kodem kontroli poprawnoci,
bdzie wystarczajca dla wielu aplikacji. Poniszy przykad sprawdza typy zmiennych, aby upewni si, e
zostay wprowadzone tylko liczby.
<html>
<head>
<title>Kontrola liczb przy uyciu kontroli typw</title>
</head>

<body>
<?php
$aValue1 = "123";
$aValue2 = "123.446";
$aValue3 = "1.56e18";
$aValue4 = "3 mae winki";
if ( is_numeric( $aValue1 ) == True )
print( "'$aValue1' jest liczb<br>" );
else
PHP Kompendium wiedzy
47
print( "'$aValue1' nie jest liczb<br>" );

if ( is_numeric( $aValue2 ) == True )
print( "'$aValue2' jest liczb<br>" );
else
print( "'$aValue2' nie jest liczb<br>" );
if ( is_numeric( $aValue3 ) == True )
print( "'$aValue3' jest liczb<br>" );
else
print( "'$aValue3' nie jest liczb<br>" );
if ( is_numeric( $aValue4 ) == True )
print( "'$aValue4' jest liczb<br>" );
else
print( "'$aValue4' nie jest liczb<br>" );
?>
</body>
</html>
Skrypt przedstawiony na wydruku 7 interpretuje pierwsze trzy wartoci jako liczby natomiast ostatni nie.
Wicej na temat funkcji kontroli typw znajduje si przy opisie funkcji is_xxx() w czci Funkcje zmiennych
w skorowidzu funkcji na kocu ksiki.
Klasa Validator
Jedn z najpikniejszych cech oprogramowania typu open-source jest dostpno wietnych narzdzi
uzupeniajcych podstawowy produkt. Dodatkowe oprogramowanie dla PHP mona pozyska z wielu rde.
Witryna Webmasters Net (http://www.thewebmasters.net) zawiera nieco wietnych klas i moduw z kodem
rdowym. Do kontroli poprawnoci przeznaczona jest klasa Validator zawierajca wiele funkcji
upraszczajcych wiele zada i oszczdzajcych czas. Przykadowymi funkcjami kontroli poprawnoci s
is_email(), is_url() i is_phone() przeznaczone do sprawdzania adresw e-mail, URL i numerw telefonw.
Wicej informacji na temat tej klasy i innych dostarczanych przez Webmasters Net znajduje si w czci PHP
Tools and Extras ich witryny.
Wydruk 3.8. Kontrola poprawnoci danych przy uyciu klasy Validator
<?php
error_reporting( 0 );
include( "../include/class.Validator.php3" );
$aValidator = new Validator;
$aPhoneNum1 = "(208) 359-1540";
$aPhoneNum2 = "+1 208-359-1540";
$aPhoneNum3 = "support@intechra.net";
if ( $aValidator->is_phone( $aPhoneNum1 ) == True )
print( "'$aPhoneNum1' jest prawidowym numerem telefonu<br>" );
else
print( "'$aPhoneNum1' nie jest prawidowym numerem telefonu<br>" );
if ( $aValidator->is_phone( $aPhoneNum2 ) == True )
print( "'$aPhoneNum2' jest prawidowym numerem telefonu<br>" );
else
print( "'$aPhoneNum2' nie jest prawidowym numerem telefonu<br>" );
if ( $aValidator->is_phone( $aPhoneNum3 ) == True )
print( "'$aPhoneNum3' jest prawidowym numerem telefonu<br>" );
else
print( "'$aPhoneNum3' nie jest prawidowym numerem telefonu<br>" );
/*
Funkcja is_email kontroluje nie tylko poprawno formatu adresu email
ale rwnie sprawdza, czy istnieje w Internecie podany host
Oczywicie wymaga to podczenia z Internetem.
W chwili pisania tego przykadu host 'invalidhost.com'
nie by zarejestrowany.
*/
$aEmail1 = "blake@intechra.net";
$aEmail2 = "john";
$aEmail3 = "nobody@invalidhost.com";
if ( $aValidator->is_email( $aEmail1 ) == True )
print( "'$aEmail1' jest prawidowym adresem email<br>" );
else
print( "'$aEmail1' nie jest prawidowym adresem email<br>" );
if ( $aValidator->is_email( $aEmail2 ) == True )
print( "'$aEmail2' jest prawidowym adresem email<br>" );
else
print( "'$aEmail2' nie jest prawidowym adresem email<br>" );
if ( $aValidator->is_email( $aEmail3 ) == True )
print( "'$aEmail3' jest prawidowym adresem email<br>" );
else
print( "'$aEmail3' nie jest prawidowym adresem email<br>" );
?>
Rozdzia 3 Formularze i cookie
48

Klasa Validator jest potnym zestawem funkcji przyspieszajcych tworzenie oprogramowania, ale tak
jak w przypadku wszystkich narzdzi zewntrznych naley sprawdzi, czy spenia twoje wymagania.
Cookie
Z powodu trwajcej debaty na temat uycia cookie, wikszo programistw WWW i uytkownikw jest
zaznajomiona z koncepcj cookie. Cookie s plikami tekstowymi zapisanymi na komputerze klienta i s one ze
swojej natury niewinne. Jednak wielu uytkownikw nie przyjmuje cookie wysanych do przegldarek z powodu
plotek na temat ich wykorzystania. Jeeli twoja aplikacja opiera swoje dziaanie na cookie, niektrzy uytkownicy
nie bd mogli jej uywa. Jednak jeeli korzystasz z cookie, ale nie wymagasz ich do prawidowej pracy, twoja
aplikacja bdzie dziaaa z wikszoci przegldarek.
PHP posiada tylko jedna funkcj przeznaczon do tworzenia cookie, setcookie(). Poniewa cookie s
wysyane jako cz nagwka HTTP, funkcja setcookie() musi by wywoana przed wysaniem jakichkolwiek
danych do przegldarki lub naley zastosowa buforowanie wyjcia w celu opnienia wysyania danych do
przegldarki do chwili zdefiniowania wszystkich cookie. To samo ograniczenie obowizuje rwnie dla funkcji
header().
Dowolne cookie odesane do aplikacji przez przegldark jest automatycznie konwertowane na zmienn
PHP tak samo, jak dzieje si to w przypadku metod GET i POST. Cookie mog przenosi wartoci skalarne jak
rwnie tablice wartoci. Funkcja setcookie() jest zdefiniowana w sposb nastpujcy:
int setcookie( string nazwa, string warto, int czas, string cieka,
string domena, int bezpieczny )
Wszystkie argumenty funkcji poza nazw s opcjonalne. Jeeli funkcja jest wywoana tylko z nazw,
cookie o podanej nazwie jest usuwane. Dowolny z cigw moe zosta opuszczony podajc pusty cig ("").
Dowolna warto numeryczna moe zosta opuszczona podajc warto zero. Argument czas jest standardowym
czasem z systemu Unix w postaci liczby, ktr mona uzyska jako wynik funkcji mktime() lub time(). Parametr
bezpieczny wskazuje, e cookie moe by przesyane jedynie przez poczenie bezpieczne (HTTPS).
Naley pamita o nastpujcych puapkach i czstych bdach uycia cookie:
Ustawione cookie nie bd widoczne w skrypcie do czasu jego powtrnego zaadowania.
Przegldarki rnie obsuguj cookie. Sprawd aplikacj na moliwie duej iloci przegldarek.
Kada przegldarka przechowuje cookie niezalenie. Oznacza to, e jeeli uytkownik obejrzy witryn
przy uyciu jednej przegldarki i zostanie ustawione cookie, to cookie nie bdzie dostpne, jeeli
uytkownik ponownie obejrzy witryn za pomoc innej przegldarki.
Wicej oglnych informacji na temat cookie mona znale w specyfikacji cookie firmy Netscape, ktra
jest dostpna pod adresem http://www.netscape.com/newsref/std/cookie_spec.html.
Ponisze dwa przykady pokazuj uycie funkcji setcookie(). Wydruk 3.9 pokazuje jak ustawia i
wywietla cookie. Na wydruku 3.10 pokazane jest jak uywa buforowania wyjcia w poczeniu z funkcj
setcookie().
Wydruk 3.9. Uycie cookie
<?php
// Sprawdzenie czy istnieje zmienna cookie $LastTime
if ( !empty( $LastTime ) )
{
$aMessage = "Ostatnia wizyta miaa miejsce ";
$aMessage .= date( "d F Y", $LastTime );
$aMessage .= " o ";
$aMessage .= date( "h:i:s a", $LastTime );
}
else
{
$aMessage = "Nie bye tu przez ostatnie ";
$aMessage .= "dwa tygodnie.";
}
// Ustawienie cookie wanego przez dwa tygodnie
$aTwoWeeks = time() + ( 60 * 60 * 24 * 14 );
setcookie( "LastTime", time(), $aTwoWeeks );
// sprawdzenie istnienia niezwykle wanej tablicy z cookie
$aValMessage = "";
if ( !empty( $CookieArray ) )
{
$aValMessage = "Wartoci: " . $CookieArray[0];
PHP Kompendium wiedzy
49
$aValMessage .= ", " . $CookieArray[1];

$aStartValue = $CookieArray[1] + 1;
}
else
{
$aValMessage = "Wartoci nie s dostpne!";
$aStartValue = 0;
}
// usunicie niezwykle istotnej tablicy wartoci
setcookie( "CookieArray[0]" );
setcookie( "CookieArray[1]" );
// dodanie niezwykle istotnej tablicy wartoci
setcookie( "CookieArray[0]", $aStartValue, $aTwoWeeks );
setcookie( "CookieArray[1]", $aStartValue + 1, $aTwoWeeks );
?>
<html>
<head>
<title>Uycie cookie</title>
</head>
<body>
<?php
print( $aMessage . "<br><br>" . $aValMessage );
?>
</body>
</html>
Wydruk 3.10. Uycie setcookie() razem z buforowaniem wyjcia
<?php
/*
Uruchomienie buforowania wyjcia. Jeeli funkcja ob_start()
jest zakomentowana, skrypt spowoduje bd.
*/
ob_start();
?>
<html>
<head>
<title>Uycie setcookie() wraz z buforowaniem wyjcia</title>
</head>
<body>
<?php
setcookie( "anyname", "anyvalue", time() + 60 );
?>
Dziaa wietnie.
</body>
</html>
<?php ob_end_flush(); ?>
Ostatnia uwaga na temat cookie
W poprzedniej wersji PHP jeeli chciae ustawi wiele cookie za pomoc jednego skryptu, musiae wywoywa setcookie() w
odwrotnej kolejnoci do tej, w jakiej chciae obsugiwa cookie. Na przykad, jeeli chciae usun cookie a nastpnie ustawi nowe
o tej samej nazwie, naleao najpierw wywoa setcookie(), aby ustawi now warto a nastpnie usun poprzedni warto. W
PHP4 zostao to usunite. Naley wywoywa setcookie() w takiej kolejnoci jak si spodziewasz, e bd przetwarzane przez
przegldark. Proces ten jest pokazany na wydruku 3.9.
Mimo, e debata na temat tego, czy naley uywa cookie bdzie nadal trwaa, ich tworzenie w PHP jest
atwe i proste. Dalsze rozwaania na temat cookie bd kontynuowane w rozdziale 7 Sesje i stan aplikacji.
Wane zagadnienia programowania dla WWW
Cz ta zawiera niektre tematy, jakie musz bra pod uwag programici przechodzcy z pisania
zwykych aplikacji na aplikacje oparte o WWW. Problemy te powstaj zwykle w czasie przetwarzania i
wykorzystywania danych przesanych z formularza HTML.
Obsuga nieprawidowych danych
Pierwszym problemem jest sposb obsugi nieprawidowych danych. W tradycyjnych aplikacjach dane
wprowadzone przez uytkownika s czsto kontrolowane natychmiast po ich wprowadzeniu. Pozwala to
natychmiast informowa o nieprawidowych danych. W aplikacjach WWW nie ma niezawodnego mechanizmu
kontroli danych po wyjciu z poszczeglnych pl, wic caa kontrola poprawnoci jest przeprowadzana na
serwerze. Oznacza to, e jeeli istnieje bd w danych, uytkownik nie bdzie o nim wiedzia a do chwili
Rozdzia 3 Formularze i cookie
50

przesania danych formularza. Dlatego w trakcie tworzenia aplikacji musisz si zdecydowa, w jaki sposb
reagowa na bdy.
Istnieje kilka sposobw reagowania na bdy, przytoczymy tutaj dwa z nich. Pierwsz metod jest
wypisywanie bdw i nakazanie uytkownikowi, aby wrci do poprzedniej strony i poprawi dane. Wedug mnie
jest to najmniej podany sposb reakcji na bdy, ale jest najprostszy do zrealizowania. Jeeli do formularza
wpisywane jest bardzo mao danych (jedno lub dwa pola) metoda ta bdzie do zaakceptowania. Jeeli jednak
tworzysz duy formularz nie naley uywa tej metody, poniewa moe ona wymaga ponownego wprowadzenia
wszystkich danych. Niektre przegldarki nie utrzymuj wartoci formularza po uyciu przycisku Wstecz.
Drug metod obsugi nieprawidowych danych jest ponowne pokazanie strony formularza z
zainicjowanymi wszystkimi polami i zaznaczonymi nieprawidowymi pozycjami. Moesz utworzy taki
formularz przesyajc dane z formularza do tego samego skryptu. Metoda taka wymaga bardziej zaawansowanego
projektowania, ale skutkuje powstaniem solidniejszej i bardziej uytecznej aplikacji, poniewa ten sam skrypt
moe by uyty do pobierania nowych danych, zmiany danych istniejcych i kontroli poprawnoci tych danych.
Na wydruku 3.11 pokazane jest w jaki sposb mona uy jednego skryptu do zbierania i kontroli poprawnoci
danych na prostym formularzu uywanym do wpisywania adresw e-mail i numerw telefonw.
Wydruk 3.11. Inteligentna obsuga nieprawidowych danych
<?php
error_reporting( 0 );
// na pocztku przestawiamy skrypt na zbieranie nowych danych.
$aCurPhoneVal = "";
$aCurEmailVal = "";
$aPhoneTextCol = "black";
$aEmailTextCol = "black";
if ( !empty( $Submit ) )
{
/*
Jeeli zmienna $Submit jest zainicjowana jestemy tutaj po
przesaniu danych do skryptu. Prbujemy sprawdzi wartoci
zmiennych formularza.
*/
include( "../include/class.Validator.php3" );
$aValidator = new Validator;
$aValidPhone = $aValidator->is_phone( $Phone );
$aValidEmail = $aValidator->is_email( $Email );
if ( $aValidPhone && $aValidEmail )
{
// Dane s prawidowe, przechodzimy do odpowiedniej strony
header( "Location:thanks.html\n" );
}
else
{
// Dane nieprawidowe, wyrniamy je
$aCurPhoneVal = $Phone;
$aCurEmailVal = $Email;
if ( $aValidPhone == False )
$aPhoneTextCol = "red";
if ( $aValidEmail == False )
$aEmailTextCol = "red";
}
}
?>
<html>
<head>
<title>Inteligentna obsuga nieprawidowych danych</title>
</head>
<body>
<?php
if ( empty( $Submit ) ) {
?>
Prosz wprowadzi numer telefonu i adres email.
<br>
<?php
} else { // if
?>
We wprowadzonych danych wystpiy bdy.
Sprawd dane oznaczone kolorem czerwonym.
<?php
} // end if
?>
<form action="handle_errors.phtml" method="post">
<font color="<?php print( $aPhoneTextCol );?>">
Numer telefonu:</font>
PHP Kompendium wiedzy
51
<input type="text" name="Phone"

value="<?php echo $aCurPhoneVal;?>">
<br>
<font color="<?php print( $aEmailTextCol );?>">
Adres e-mail:</font>
<input type="text" name="Email"
value="<?php echo $aCurEmailVal;?>">
<br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
W skrypcie na wydruku 11, gdy strona jest otwierana bezporednio, zmienna $Submit jest pusta, wic
formularz jest wywietlany z pustymi polami. Gdy uytkownik kliknie przycisk Wylij, strona jest adowana po
raz drugi, ale tym razem zmienna $Submit nie jest pusta, wic sprawdzana jest poprawno danych. Jeeli oba
pola maj poprawne dane, wywoywana jest funkcje header(), ktra powoduje przekierowanie przegldarki do
nowej strony zawierajcej podzikowanie. Jeeli ktre pole zawiera nieprawidow warto, formularz
wywoywany jest ponownie, ale tym razem pola maj wartoci wprowadzone poprzednio przez uytkownika.
Dodatkowo, aby zaznaczy wystpienie bdu, nieprawidowe dane s wywietlane kolorem czerwonym.
Metoda ta pozwala na szybk identyfikacj przez uytkownika danych, ktre wymagaj poprawienia i nie
wymaga ponownego wprowadzenia caej zawartoci formularza. Jeeli tworzysz aplikacj WWW, ktra wymaga
od uytkownika wprowadzania danych naley rozway uycie podobnej metody do obsugi bdnych danych.
Jeeli twoja aplikacja bdzie niewygodna lub wymaga bdzie ponownego wprowadzania danych, na pewno nie
bdzie lubiana.
Przedstawione metody nie s jedynymi stosowanymi do obsugi bdnych danych, ale ilustruj one
podstawy tworzenia aplikacji WWW. Wybr metody obsugi bdw moe by kluczow decyzj przy
projektowaniu aplikacji.
Obsuga i formatowanie wywietlanych danych
W zwykej aplikacji wywietlanie danych wprowadzonych przez uytkownika nie wymaga zwykle
formatowania lub przetwarzania. Czasami formatowane s liczby, aby wywietla wartoci walutowe lub doda
separatory tysicy, ale zwykle nie ma zbyt duo kopotu przy wywietlaniu danych wprowadzonych przez
uytkownika. W przypadku programowania dla WWW wywietlanie danych wprowadzonych do formularza w
postaci strony WWW jest spraw krytyczn. Dzieje si tak, poniewa przegldarka interpretuje cay tekst
otrzymany z serwera WWW. Jeeli dostarczysz uytkownikom formularz a nastpnie bdziesz wywietla
wpisane dane, niektrzy uytkownicy bd dodawa znaczniki HTML, aby sprawdzi co si stanie.
Pamitajc o tym pomyl o formularzu, w ktrym uytkownicy bd mogli wpisywa swoje uwagi.
Zamy, e stworzysz formularz w ktrym zapisywane bd: nazwa uytkownika, adres e-mail oraz tre uwagi.
Po wprowadzeniu tekstu wywietlasz komunikat w celu weryfikacji a nastpnie przetwarzasz ten komunikat.
Pomysowi lub zoliwi uytkownicy mog prbowa przetestowa twj serwer WWW dodajc znaczniki HTML
lub kod JavaScript w treci komunikatu. Zwykle nie jest to niebezpieczne, ale na pewno skutkuje rnymi
efektami ubocznymi.
Aby unikn tego problemu zawsze naley przetwarza dane wprowadzone do formularza przed ich
wywietleniem. PHP posiada kilka funkcji pomagajcych w tym zadaniu. S to funkcje strip_tags() i
htmlentities(). Funkcja strip_tags() usuwa wszystkie znaczniki z cigu oprcz tych, ktre zostay podane w
dodatkowym opcjonalnym parametrze. Funkcja htmlentities() konwertuje specjalne znaki HTML na
odpowiadajce im symbole HTML. Na przykad znaki < i > s zastpowane przez &lt; i &gt;. Formularz i skrypt
na wydruku 3.12 pokazuje obrbk danych do ponownego wywietlenia.
Wydruk 3.12. Obrbka danych do wywietlenia.
<html>
<head>
<title>Pobieranie danych do wywietlenia</title>
</head>
<body>
<form action="safedisplay.phtml" method="post">
Wprowad tekst:<br>
<textarea cols="40" rows="6" name="TheText"></textarea>
<br><br>
Wybierz metod filtrowania:
<select name="FilterType" size="1">
<option value="0">brak</option>
Rozdzia 3 Formularze i cookie
52

<option value="1">strip_tags()</option>
<option value="2">htmlentities()</option>
</select>
<br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
<!-- Skrypt safedisplay2.phtml -->
<?php
error_reporting( 255 );
switch ( $FilterType )
{
case 0 : // brak
$aDisplayText = $TheText;
break;
case 1 : // strip_tags
$aDisplayText = strip_tags( $TheText );
break;
case 2 : // htmlentities
$aDisplayText = htmlentities( $TheText );
break;
}
?>
<html>
<head>
<title>Bezpieczne wywietlenie danych uytkownika</title>
</head>
<body>
<?php
print( $aDisplayText );
?>
</body>
</html>

Rysunki 3.3. do 3.6. pokazuj formularz wejciowy i wyniki dziaania skryptu. Rysunek 3.3. zawiera
formularz wprowadzania danych. Rysunek 3.4. pokazuje co si dzieje, jeeli nie ma filtrowania. Rysunki 3.5. i
3.6. pokazuj wyniki filtrowania danych z formularza za pomoc funkcji odpowiednio strip_tags() i
htmlentities().

Rysunek 3.3.
Formularz
wprowadzania
danych


PHP Kompendium wiedzy
53

Rysunek 3.4.
Wywietlanie bez
filtrowania


Rysunek 3.5.
Wywietlanie ze
strip_tags()


Rozdzia 3 Formularze i cookie
54

Rysunek 3.6.
Wywietlanie z
htmlentities()

Jeeli dokadnie przyjrzysz si tym rysunkom zauwaysz, e wida niespodziewane wyniki po
wywietleniu danych. Na przykad pojedynczy apostrof jest wywietlany na stronie jako sekwencja \'. Rwnie
znaki koca linii wprowadzone w polu tekstowym nie s uwzgldniane w wywietlanym tekcie.
Pierwsze z zakce jest powodowane przez dyrektyw konfiguracji --enable-magic-quotes oraz opcje
pliku php.ini magic_quotes_gpc, magic_quotes_runtime i magic_quotes_sybase. Jeeli jest ona uaktywniona,
wszystkie apostrofy, cudzysowy, NUL
1
i znaki backslash pochodzce z zewntrznych rde, na przykad
formularzy i bazy danych, s automatycznie poprzedzane ukonikiem. Jest to szczeglnie przydatne, jeeli dane te
bd zapisywane w bazie danych, poniewa nie bdziesz musia rcznie oznacza tych znakw w cigu SQL. Aby
wywietli taki cig, naley wywoa funkcj strip_slashes(), ktra usuwa te dodatkowe znaki.
Jeeli chodzi o problem ze znakami nowej linii, naley pamita, e HTML nie interpretuje znaku CR ani
LF jako znaku podziau wiersza, chyba, e wystpi on w bloku <pre></pre>. PHP posiada funkcj nl2br(), ktra
konwertuje znaki nowej linii na znaczniki <br>.
Na wydruku 13 znajduje si ten sam formularz i skrypt co na wydruku 12, ale z dodatkowymi opcjami
ktre powoduj wywoanie funkcji strip_slashes() i nl2br().
Wydruk 3.13. Ulepszona obrbka danych do wywietlenia
<html>
<head>
<title>Pobieranie danych do wywietlenia</title>
</head>
<body>
<form action="safedisplay2.phtml" method="post">
Wprowad tekst:<br>
<textarea cols="40" rows="6" name="TheText"></textarea>
<br><br>
Wybierz metod filtrowania:
<select name="FilterType" size="1">
<option value="0">none</option>
<option value="1">strip_tags()</option>
<option value="2">htmlentities()</option>
</select>
<br><br>
<input type="checkbox" name="DoSS"> strip_slashes()<br>
<input type="checkbox" name="DoNB"> nl2br()<br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
<!-- Skrypt safedisplay2.phtml -->
<?php

1
Znak o kodzie zero (przyp. tum.)
PHP Kompendium wiedzy
55

error_reporting( 0 );
switch ( $FilterType )
{
case 0 : // brak
$aDisplayText = $TheText;
break;
case 1 : // strip_tags
$aDisplayText = strip_tags( $TheText );
break;
case 2 : // htmlentities
$aDisplayText = htmlentities( $TheText );
break;
}
if ( $DoSS == "on" )
$aDisplayText = stripslashes( $aDisplayText );
if ( $DoNB == "on" )
$aDisplayText = nl2br( $aDisplayText );
?>
<html>
<head>
<title>Bezpieczne wywietlenie danych uytkownika</title>
</head>
<body>
<?php
print( $aDisplayText );
?>
</body>
</html>
Rysunek 3.7.
Formularz
wprowadzania
danych


Rozdzia 3 Formularze i cookie
56

Rysunek 3.8.
Wywietlanie
przefiltrowane
przez strip_tags(),
strip_slashes() i
nl2br()

Po wprowadzeniu zmian pokazanych na wydruku 3.13, formularz wprowadzania danych i posta danych
wynikowych jest taka, jak wida na rysunku 3.7. i 3.8.
Jeeli wczeniej miae dowiadczenie jedynie ze zwykymi aplikacjami, musisz pamita o tych
puapkach stosowania przegldarki jako warstwy prezentacji aplikacji. Oprcz pamitania o wspomnianych
problemach naley rwnie zwrci uwag, e kada przegldarka dziaa nieco inaczej. Szczegowe omwienie
tych problemw znajduje si w rozdziale 9 Niezaleno od przegldarki.
Podsumowanie
Rozdzia ten zawiera opis podstaw przetwarzania formularzy przy uyciu PHP. Poniewa PHP zosta
zaprojektowany jako jzyk programowania dla WWW, upraszcza on znacznie proces interakcji z formularzami
HTML. Waniejsze od prostego pobierania danych od uytkownikw jest prawidowa obsuga tych danych i
zabezpieczanie serwera i uytkownikw przed nieprawidowymi lub niebezpiecznymi danymi. W rozdziale tym
omwiono niektre narzdzia umoliwiajce obsuy nieprawidowe dane i zabezpieczy przed szkodliwymi
danymi. W rozdziale tym omwiono rwnie proces zapamitywania i odczytywanie cookie na komputerze
klienta. Wszystkie te tematy razem stanowi podstaw do tworzenia interaktywnych aplikacji WWW.
PHP Kompendium wiedzy
57
Rozdzia 4. Operacje na plikach
Wstp
Obsuga plikw jest zawarta we wszystkich nowoczesnych jzykach programowania. Zdolno do
tworzenia, czytania, zapisu i innych operacji na plikach lub innych obiektach systemu plikw jest niezbdna do
zrealizowania obsugi sesji i serializacji. Do obsugi plikw i innych obiektw systemu plikw PHP posiada
funkcje podobne do tych spotykanych w jzyku C. Tak jak C, w funkcjach sucych do odczytu i zapisu, PHP
uywa uchwytw plikw oraz pozwala na tworzenie uchwytw (pozwalajcych na operacje innymi typami
strumieni danych, takimi jak gniazda i potoki). Zdolno ta powoduje, e rwnie atwo mona zapisa dane do
pliku jak rwnie wysa je poprzez potok do innego programu.
Odczyt i zapis plikw
Jedn z gwnych rnic przy pisaniu aplikacji opartych o sie WWW w stosunku do zwykych aplikacji,
jest sposb utrzymywania stanu aplikacji. W przypadku zwykego programu, uytkownik uruchamia go,
wykonuje kilka komend i koczy dziaanie programu. W czasie pracy programu stan aplikacji jest utrzymywany
w pamici. W aplikacjach opartych o sie WWW stan musi by utrzymywany przez serwer WWW, poniewa
klientem jest zwykle prosta przegldarka WWW. Szczegowe przedstawienie zarzdzania stanem aplikacji
mona znale w rozdziale 7 Sesje i stan aplikacji. W chwili obecnej wystarczy wiedzie, e do utrzymywania
stanu aplikacji i tworzenia innych mechanizmw przechowywania danych mona uy plikw.
Wane jest, aby uywajc plikw, pamita o zagadnieniach bezpieczestwa. Poniewa aplikacja bdzie
dziaa w kontekcie serwera WWW, pliki bd miay uprawnienia uytkownika przy pomocy ktrego
uruchamiany jest serwer WWW. W przypadku Apache domylnie jest to uytkownik nobody, ktrego
uprawnienia ograniczaj dostp przez aplikacj do obiektw systemu plikw. Naley uwaa, aby korzystajc z
plikw nie naruszy systemu bezpieczestwa serwera WWW. W wikszoci przypadkw uycie bazy danych
zamiast plikw jest o wiele bardziej bezpieczne i praktyczne. Oczywicie istnieje wiele sytuacji gdy narzut
czasowy wprowadzany przez baz danych lub wymagania aplikacji powoduj, e pliki s jedynym sensownym
rozwizaniem.
Na wydruku 4.1 pokazane zostao w jaki sposb mona zrealizowa liczniki dostpu do stron witryny. Do
tego celu wykorzystane zostay podstawowe operacje na plikach, otwarcie, odczyt, zapis i zamknicie prostego
pliku ladu. W przykadzie tym nie zostay wykorzystane wszystkie dostpne w PHP funkcje operujce na
plikach. Bardziej szczegowy opis wszystkich funkcji znajduj si w skorowidzu funkcji na kocu ksiki.
Wydruk 4.1. Uycie plikw do zliczania odwoa do stron witryny
<?php
/*
Plik ten moe by doczany do dowolnego skryptu PHP.
Powoduje to automatyczne zliczanie odwoa do strony.
UYCIE: Wystarczy doczy ten plik. Tworzy on zmienn
globaln $aPageAccessCount, ktra zawiera ilo
odwoa do skryptu ktry docza ten plik.
*/
error_reporting( 0 );
$aLogFilePath = "/www/auto_logs/access.log";
$aCountArray = array();
// Sprawdzenie czy plik istnieje
if ( is_file( $aLogFilePath ) == True )
{
// Otwarcie i odczytanie pliku. Format pliku to oddzielone tabulatorami
// pary opisujce kolejne skrypty:
// cieka-do-skryptu licznik
$aFile = fopen( $aLogFilePath, "r" );

while( !feof( $aFile ) )
{
$aLine = fgets( $aFile, 1024 );
$aTempArray = explode( "\t", $aLine );
if ( count( $aTempArray ) == 2 )
{
$aCountArray[$aTempArray[0]] = $aTempArray[1];
}
}
fclose( $aFile );
}
// Ustawienie globalnego licznika odwoa do strony
// i uaktualnienie tablicy temp
$aPageAccessCount = $aCountArray[$PATH_TRANSLATED] + 1;
$aCountArray[$PATH_TRANSLATED] = $aPageAccessCount;
// Zapis caej tablicy do pliku
$aFile = fopen( $aLogFilePath, "w" );
foreach ( $aCountArray as $aKey => $aValue )
{
fputs( $aFile, "$aKey\t$aValue\n" );
}
fclose( $aFile );
?>
Na wydruku 4.1 pokazujemy uycie jednego pliku do przechowywania licznikw odwoa do dowolnej
liczby stron witryny. Nie jest to efektywny sposb, ale pokazuje ide takiego licznika. W skrypcie tym
sprawdzamy za pomoc funkcji is_file() czy istnieje plik ladu. Jeeli plik ten istnieje, jego kolejne linie s
odczytywane i analizowane. Kada linia zawiera pen ciek dostpu do skryptu, znak tabulacji i warto
licznika. Linia taka jest dzielona przy pomocy funkcji explode() na nazw skryptu i warto licznika a nastpnie
wartoci te s zapisywane w tablicy asocjacyjnej. Jeeli chcesz, moesz uy tej tablicy do wywietlenia
licznikw dla wszystkich stron witryny a nie tylko biecej strony. Po wypenieniu tablicy uaktualniany jest
licznik odwoa do biecej strony (rozpoznawanej przy uyciu zmiennej globalnej PHP $PATH_TRANSLATED) i
warto ta jest przypisywana do zmiennej $aPageAccessCount. Na koniec caa tablica jest zapisywana do pliku
ladu.
Na wydruku 4.2 pokazane jest strona demonstrujca jak atwo mona uy tego licznika. Jeeli szukasz
takiego mechanizmu do twojej witryny, naley pamita, e jest to bardzo nieefektywne rozwizanie. Bardziej
efektywne jest odczytywanie i zapis tylko jednej wartoci a nie caego pliku.
Wydruk 4.2. Uycie skryptu z wydruku 4.1
<?php
include( "auto_counter.php" );
?>
<html>
<head>
<title>Strona testowa 1</title>
</head>

<body>

Strona ta bya ogldana <b>
<?php
print( $aPageAccessCount );
?>
</b> razy.

</body>
</html>
Uycie gniazd
PHP umoliwia dostp do surowych gniazd TCP/IP, za pomoc ktrych mona komunikowa si z innymi
aplikacjami za pomoc dowolnego protokou. Niektre z bardziej znanych protokow TCP/IP, na przykad
HTTP, POP3 i SMTP posiadaj swoje implementacje w PHP, wic nie musisz w tych przypadkach uywa
surowych gniazd.
Na wydruku 4.3 pokazano sposb dostpu za pomoc gniazd do serwera quotd, ktry zwraca cytat dnia.
Protok quotd jest bardzo prosty. Po zestawieniu poczenia serwer wysya strumie danych tekstowych a
nastpnie zamyka poczenie. Z perspektywy klienta wystarczy jedynie zestawi poczenie, odczyta dane a
nastpnie zakoczy poczenie.
PHP Kompendium wiedzy
59

Wydruk 4.3. Uycie gniazd
<html>
<head>
<title>Przykad wykorzystania serwera QOTD: Uycie gniazd w PHP</title>
</head>
<body>
<?php
// otwarcie gniazda serwera qotd
$aFile = fsockopen( "208.129.36.164", 17 );
// odczytanie wszystkich danych ze strumienia
while ( !feof( $aFile ) )
{
$aLine = fgets( $aFile, 1024 );
print( "$aLine<br>" );
}
fclose( $aFile );
?>
</body>
</html>
Uycie potokw
Tak jak w przypadku gniazd, potoki s traktowane jak kolejny uchwyt pliku. Jedyn rnic pomidzy
plikiem i potokiem jest to, e potok jest jednokierunkowym strumieniem danych. Potok moe by uyty do
odczytu danych wyjciowych z programu lub skryptu. Na wydruku 4.4 pokazane jest uycie potoku do odczytania
wyniku zapytania do polecenia whois, ktre jest dostpne w wikszoci systemw Unix. Ten prosty skrypt i
formularz pozwalaj na wprowadzenie zapytania dla whois. Skrypt ten ilustruje rwnie czst praktyk uywania
tego samego skryptu do wywietlenia formularza i przetworzenia jego danych.
Wydruk 4.4. Skrypt przetwarzajcy zapytanie whois
<?php /* whois.php */
// cieka do programu whois
$whois_prog = '/usr/bin/whois';
if ( !is_file( $whois_prog ) )
{
// nie udao si znale programu
echo "Nie mog znale $whois_prog!<br>";
exit;
}
?>
<html>
<head>
<title>Whois: Uzycie potokw w PHP</title>
</head>
<body>

<?php
if ( $REQUEST_METHOD == 'POST' )
{
// otwarcie potoku do polecenia whois
if ( $aFile = popen( "$whois_prog $WhoisQuery", "r" ) )
{
// odczytanie wszystkich danych z potoku
while ( !feof( $aFile ) )
{
$aLine = fgets( $aFile, 1024 );
print( "$aLine<br>" );
}
pclose( $aFile );
}
else
{
echo "Nie mog otworzy $whois do odczytu!<br>";
}
print( "<hr>" );
}
?>
<form action="<?php echo $PHP_SELF ?>" method="post">
Wprowad zapytanie <b>whois</b>: <input type="text" name="WhoisQuery">
<input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>
Rozdzia 4 Operacje na plikach
60

Klasa File
W poprzednim rozdziale wspominalimy, e do PHP dostpne s wietne narzdzia dodatkowe
pochodzce z rnych rde. Klasa File dostpna z WebMasters Net (http://www.theWebMasters.net) jest
przydatnym narzdziem, szczeglne wtedy, gdy twoja aplikacja intensywnie wykorzystuje pliki. Klasa ta zawiera
wiele czsto uywanych funkcji PHP operujcych na plikach i hermetyzuje kontrol bdw, dziki czemu
moesz wicej czasu powici logice aplikacji zamiast zajmowa si pisaniem podstawowych konstrukcji
kontroli bdw.
Na wydruku 4.5 pokazany jest skrypt wywietlajcy nazwy wszystkich plikw w biecym katalogu w
postaci czy. Gdy uytkownik kliknie cze, skrypt zamieszczony na wydruku 4.6 wywietla jego zawarto
uywajc celu klasy File do odczytania jego zawartoci.
Wydruk 4.5. Uycie klasy File do wywietlenia zawartoci biecego katalogu
<?php
include( "class.File.php3" );
?>
<html>
<head>
<title>Uycie klasy File</title>
</head>
<body>
Poniej znajduje si lista plikw w biecym katalogu.<br>
Kliknij nazw pliku aby zobaczy ich zawarto.<br><br>
<?php
$aFileClass = new File();
$aDirContents = $aFileClass->get_files( "." );
for ( $nIndex = 0; $nIndex < count( $aDirContents ); $nIndex++ )
{
$aCurFile = $aDirContents[$nIndex];
print( "<a href=\"disp_file.phtml?fn=$aCurFile\">" );
print( "$aCurFile</a><br>" );
}
?>
</body>
</html>
Wydruk 4.6. Wywietlenie zawartoci pliku za pomoc klasy File
<?php
include( "./class.File.php3" );
?>
<html>
<head>
<title>Uycie klsy File</title>
</head>
<body>
<?php
print( "The file <b>$fn</b>:<br><br>" );
$aFileClass = new File();
$aFileCont = $aFileClass->read_file( $fn );
print( "<pre>" );
print( nl2br( htmlentities( $aFileCont ) ) );
print( "</pre>" );
?>
</body>
</html>
Podsumowanie
Zdecydowanie si na uycie plikw w aplikacji opartej na WWW jest jedn z krytycznych decyzji w fazie
projektowania aplikacji. Noe wszystkie aplikacje uywaj plikw, ale aby efektywnie korzysta z rnych typw
strumieni danych, na przykad gniazd i potokw, naley pozna sposoby korzystania z uchwytw plikw i funkcji
operujcych na plikach. Rozdzia ten zawiera nie tylko opis podstawowych operacji na plikach i systemie plikw,
ale rwnie przedstawia dodatkow klas uatwiajc operacje na plikach. Opis operacji na plikach zawarty w
tym rozdziale oraz opis formularzy zamieszczony w rozdziale poprzednim stanowi odpowiedni podstaw do
nastpnego rozdziau, Wysyanie plikw przez formularz.
PHP Kompendium wiedzy
61
Rozdzia 5. Wysyanie plikw przez
formularz
Wstp
Poprzednie dwa rozdziay omawiay niezbdne podstawy dla tego rozdziau, poniewa wysyanie plikw
wymaga poznania zarwno formularzy HTML, jak i funkcji systemu plikw. Obsuga przesyania plikw w PHP
jest bardzo atwa. PHP posiada wbudowany mechanizm pozwalajcy na odebranie pliku wysanego z przegldarki
zgodnej z RFC 1867. Wikszo nowoczesnych przegldarek jest zgodnych z tym dokumentem, poniewa zosta
on wczony do standardu HTML 3.2.
Jeeli pozwolisz uytkownikom na wysyanie plikw za pomoc formularza, musisz rozway
dopuszczalne typy plikw oraz ich wielkoci. Mechanizm wbudowany w PHP dziaa wietnie dla maych plikw,
ale jeeli masz zamiar przesya due pliki naley si zastanowi nad zastosowaniem innego mechanizmu, a
przykad anonimowego FTP. Moesz rwnie pomyle o stworzeniu dodatkowego mechanizmu przesyania
plikw, jeeli s one niezbdne do dziaania aplikacji.
Wysyanie pojedynczego pliku
Formularz przy pomocy ktrego mona przesya pliki rni si kilkoma szczegami od zwykego
formularza HTML. Znacznik <FORM> musi posiada atrybut ENCTYPE ustawiony na multipart/form-data zamiast
domylnego application/x-www-form-urlencoded. Musisz rwnie umieci na formularzy znacznik <INPUT> typu
file. Wydruk 5.1. zawiera prosty formularz HTML zawierajcy jeden znacznik <INPUT>.
Wydruk 5.1. Formularz HTML ze znacznikiem <INPUT>
<html>
<head>
<title>Formularz do przesyania plikw</title>
</head>
<body>
<form action="upload_single.phtml"
method="post" enctype="multipart/form-data">
Wylij plik: <input type="file" name="thefile"><br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
Po wysaniu danych formularza z wydruku 5.1, PHP tworzy automatycznie cztery zmienne globalne, ktre
opisuj przesany plik:
$thefile Zmienna zawiera nazw pliku tymczasowego w ktrym znajduje si plik przesany na serwer.
$thefile_name Zmienna ta zawiera nazw pliku na komputerze z ktrego zosta wysany.
$thefile_size Zmienna zawiera wielko przesanego pliku w bajtach.
$thefile_type Zmienna ta zawiera typ MIME przesyanego pliku (o ile przegldarka udostpnia tak
informacj).
Nazwy tych zmiennych s tworzone w oparciu o nazw znacznika <INPUT> w formularzu, tak jak jest to
pokazane na Wydruku 5.1. Piszc skrypt obsugujcy przesyanie pliku naley pamita, e PHP automatycznie
usuwa plik tymczasowy po zakoczeniu skryptu, wic jeeli nie skopujesz go, plik zostanie stracony.
Skrypt na wydruku 5.2 zawiera kod obsugi przesyania pliku poprzez formularz z Wydruku 1 i jeeli plik
jest rysunkiem (w formacie GIF lub JPEG) mniejszym od 100 kB, jest on wywietlany. Jeeli przesany plik nie
ma waciwego typu lub jest wikszy, wywietlany jest komunikat bdu.

Wydruk 5.2. Obsuga przesyania pliku
<?php
$aErrors = "";
if ( !empty( $thefile_name ) ) // nie wybrano pliku
{
if ( ( $thefile_type == "image/gif" ) ||
( $thefile_type == "image/pjpeg" ) ||
( $thefile_type == "image/jpeg" ) )
{
if ( $thefile_size < ( 1024 * 100 ) )
{
$aCurBasePath = dirname( $PATH_TRANSLATED );
$aNewName = $aCurBasePath . "/uppics/" .
$thefile_name;
copy( $thefile, $aNewName );
}
else
{
$aErrors .= "Za duy plik !!!";
}
}
else
{
$aErrors .= "Plik nie jest typu gif ani jpeg";
}
}
else
{
$aErrors .= "Nie wybrano pliku";
}
?>
<html>
<head>
<title>Wywietlenie przesanego pliku</title>
</head>
<body>

<?php
if ( $aErrors != "" )
{
print( "<b>Wystpi bd</b>: $aErrors<br>" );
}
else
{
print( "Przesany plik:<br><br>" );
print( "<img src=\"uppics/$thefile_name\" border=\"0\">" );
}
?>
</body>
</html>
W przykadzie zamieszczonym na wydruku 5.2. nie wzito pod uwag, e nie wszystkie przegldarki
wysyaj typu MIME pliku. Opuszczono rwnie inne zagadnienia kontroli bdw, na przykad kontrol
poprawnoci wykonania funkcji copy. Jednak przykad ten mia za zadanie pokazanie jak atwo mona obsuy
za pomoc PHP operacje przesyania pliku.
W przykadzie tym na pocztku sprawdzane jest, czy zosta wybrany plik do przesyania. Jeeli nie zosta
wybrany plik, zmienna $thefile_name jest pusta. Nastpnie sprawdzane jest, czy plik ma odpowiedni wielko i
typ MIME. Jeeli obie wartoci zostan zaakceptowane, przy pomocy wyraenia dirname($PATH_TRANSLATED)
odczytywany jest biecy katalog na serwerze WWW. Funkcja dirname() zwraca nazw katalogu z podanej
cieki. Zmienna $PATH_TRANSLATED jest zmienn PHP i zawiera pen ciek do biecego skryptu. Dodajc
/uppics/ i oryginaln nazw pliku na komputerze lokalnym, tworzymy now ciek. Na koniec, przesany plik
jest kopiowany z katalogu tymczasowego do katalogu okrelonego przez przed chwil skonstruowan ciek.
Naley pamita, e aby operacja kopiowania si udaa, docelowy katalog musi posiada odpowiednio ustawione
uprawnienia. Korzystajc z Apache w systemie Linux oznacza to, e uprawnienia do katalogu musz pozwoli na
zapis przez uytkownika nobody.
PHP posiada mechanizm pozwalajcy na ograniczanie w skrypcie wielkoci przesyanych plikw. Jest to
realizowane przez dodanie do formularza ukrytego pola o nazwie MAX_FILE_SIZE. Na wydruku 5.3 pokazany jest
formularz identyczny z tym z wydruku 5.1, ale dodane zostao pole MAX_FILE_SIZE ograniczajce wielko
przesyanych plikw do 100 kB.
Wydruk 5.3. Ograniczenie wielkoci przesyanego pliku za pomoc MAX_FILE_SIZE
<html>
PHP Kompendium wiedzy
63
<head>

<title>Formularz do przesyania plikw</title>
</head>
<body>
<form action="upload_single.phtml" method="post" enctype="multipart/form-data">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="102400">
Wylij plik: <input type="file" name="thefile"><br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
Puapki
PHP domylnie ogranicza wielko plikw, jakie mona przesya uywajc tego mechanizmu, do 2
megabajtw. Ta wielko jest waniejsza od zmiennej formularza MAX_FILE_SIZE. Warto ta moe by zmieniona
przez ustawienie wartoci upload_max_filesize w pliku php.ini, lub ustawienie dyrektywy w pliku Apache.conf
(wicej szczegw znajduje si w rozdziale o opcjach konfiguracji, ktry znajduje si na kocu ksiki). Gdy
osignita zostanie graniczna wielko pliku (zarwno ustawiona w formularzu jak i globalne maksimum), PHP
generuje bd, przerywa przesyanie i ustawia nazw pliku na none.
Mimo tego, e ta graniczna wielko pliku jest ustawiana w celu chronienia serwera WWW, sieje ona
zniszczenie w twoich aplikacjach. Poniewa bd przekroczenia wielkoci przesyanego pliku wystpuje przed
wykonaniem jakiejkolwiek linii skryptu, nie ma moliwoci przechwycenia generowanego ostrzeenia
generowanego przez mechanizm przesyania plikw. Oznacza to, e jeeli opcja konfiguracji display_errors ma
warto On (domylnie) w przegldarce bdzie si pojawia komunikat bdu.
Jeeli nie chcesz aby pojawia si ten komunikat, musisz ustawi w pliku php.ini opcj konfiguracji
display_errors na Off. Moesz nastpnie ustawi opcj log_errors na On a error_log na warto odpowiedni
dla twojego rodowiska. Jeeli uywasz Linuksa i Apache, ustawienie error_log na stderr spowoduje, e
wszystkie bdy PHP trafi do dziennika bdw Apache. Aplikacja twoja moe sprawdza zmienne przesyu
plikw i odpowiednio obsugiwa bdy. Jeeli uytkownikowi nie uda si przesy pliku, zmienna $thefile
bdzie miaa warto none, a $thefile_name bdzie zawieraa odpowiedni warto.
Innym problemem, nad jakim naley si zastanowi w trakcie pisania skryptu obsugi przesyania plikw
jest to, e zanim rozpocznie si wykonywanie skryptu musi zosta przesany cay plik lub maksymalna okrelona
ilo bajtw. Jeeli wic twoja aplikacja dopuszcza przesyanie duych plikw, ale akceptuje jedynie niektre
typy plikw, twoi uytkownicy mog dosy dugo czeka zanim zobacz komunikat o odrzuceniu przesyanego
pliku.
Przesyanie wielu plikw
Jeeli chcesz przesa kilka plikw uywajc jednego formularza moesz skorzysta z tablicy PHP do
przesania danych o przychodzcych plikach. Poniszy przykad pokazuje uycie tablicy do przesania czterech
plikw.
Wydruk 5.4. Przesyanie czterech plikw
<html>
<head>
<title>Formularz do przesyania plikw</title>
</head>
<body>
Prosz poda cztery pliki rysunkw do przesania:
<form action="upload_multiple.phtml" method="post" enctype="multipart/form-data">
Plik 1: <input type="file" name="thefiles[]"><br><br>
Plik 2: <input type="file" name="thefiles[]"><br><br>
Plik 3: <input type="file" name="thefiles[]"><br><br>
Plik 4: <input type="file" name="thefiles[]"><br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
Wydruk 5.5. Obsuga czterech przesyanych plikw
<?php
$aBasePath = dirname( $PATH_TRANSLATED );
// kady przesany plik naley skopiowa
Rozdzia 5 Wysyanie plikw przez formularz
64

// i zapamita ich nowe cieki do pniejszego wykorzystania
for ( $nIndex = 0; $nIndex < count( $thefiles ); $nIndex++ )
{
if ( !empty( $thefiles_name[$nIndex] ) )
{
$aType = $thefiles_type[$nIndex];
if ( ( $aType == "image/gif" ) ||
( $aType == "image/pjpeg" ) ||
( $aType == "image/jpeg" ) )
{
$aNewName = $aBasePath . "/uppics/" .
$thefiles_name[$nIndex];
copy( $thefiles[$nIndex], $aNewName );
$aNewNames[] = $thefiles_name[$nIndex];
}
}
}
?>
<html>
<head>
<title>Wywietlanie przesanego rysunku</title>
</head>
<body>

<?php
$aCount = count( $aNewNames );
print( "Przesano <b>$aCount</b> rysunki:<br><br>" );
foreach( $aNewNames as $aNewName )
{
print("<img src=\"uppics/$aNewName\" border=\"0\"><br><br>");
}
?>
</body>
</html>
Bezpieczestwo
Jeeli dopuszcza si dostarczanie jakichkolwiek danych do aplikacji, naley bra pod uwag kad
ewentualno. Jeeli pozwalasz na przesyanie plikw musisz si upewni, e pliki te zostan waciwie
obsuone na serwerze. Na przykad, jeeli tworzysz witryn do ktrej programici mog przesya wasne
skrypty nie naley pozwala na wykonywanie tych skryptw na serwerze. Mona je jedynie odebra i wywietli
w postaci czystego tekstu i nie mona zakada, e mona je bezpiecznie uruchomi.
Nawet pozwolenie na wywietlenie przesanych plikw niesie ze sob potencjalne zagroenie. Na
wydruku 5.6. pokazany jest prosty przykad w jaki sposb mechanizm wywietlania plikw moe spowodowa
dziur w systemie bezpieczestwa.
Wydruk 5.6. Naruszenie bezpieczestwa podczas obsugi przesanych plikw
<?php
include( "class.File.php3" );
// skopiowanie przesanego pliku
$aCurBasePath = dirname( $PATH_TRANSLATED );
$aNewName = $aCurBasePath . "/uploads/" . $thefile_name;
copy( $thefile, $aNewName );
?>
<html>
<head>
<title>Naruszenie bezpieczestwa przy przesyaniu pliku</title>
</head>
<body>
<?php
// wywietlenie zawartoci pliku
print( "Plik <b>$aNewName</b>:<br><br>" );
$aFileClass = new File();
$aFileCont = $aFileClass->read_file( $thefile );
print( "<pre>" );
print( nl2br( htmlentities( $aFileCont ) ) );
print( "</pre>" );
?>
</body>
</html>
Jest to oczywicie wymylony przykad. W przykadzie tym przesany plik jest kopiowany do nowego
katalogu, ale wywietlajc plik odczytywany i wysyany do przegldarki jest plik tymczasowy. W rzeczywistoci
PHP Kompendium wiedzy
65

prawdopodobnie odczytasz i wywietlisz plik znajdujcy si na ciece zapamitanej w $aNewName. Dla potrzeb tej
prezentacji poprzedni plik pokazuje w jaki sposb le napisany skrypt narusza system bezpieczestwa.
Aby wykorzysta niedoskonao skryptu kto moe wpisa do przegldarki nazw skryptu i poda nazw
dowolnego pliku na serwerze. Na przykad wprowadzenie takiego adresu URL spowoduje wywietlenie
zawartoci pliku /etc/passwd (zakadajc, e bdzie on wykonywany na systemie Uniksowym):
http://serwer.com/sciezka/upload_flaw.phtml?thefile=/etc/passwd
Mona przetestowa to na komputerze z Uniksem, e niebezpieczestwo jest rzeczywiste. Nawet mimo
tego, e serwer WWW pracuje jako uytkownik nobody, plik /etc/passwd musi by moliwy do odczytania przez
wszystkich uytkownikw.
W rozdziale o formularzach kadem nacisk na to, e nie wolno zakada, e wszyscy uytkownicy
aplikacji bd uywali jej zgodnie z twoimi zamiarami. Tak samo jest i teraz. Niektrzy uytkownicy bd chcieli
rozmylnie wykorzysta saboci aplikacji a inni niewiadomie spowoduj jej awari. Naley dokadnie
przemyle wszystkie moliwe skutki uboczne pozwolenia na przesyanie plikw na serwer WWW.
Podsumowanie
W rozdziale tym pokazane zostay sposoby odczytywania i wykorzystania plikw przesanych przez
przegldarki zgodne z dokumentem RFC 1867. Zostay przytoczone przykady obsugi jednego pliku jak rwnie
tablicy plikw. Na kocu rozdziau znajduje si maa cz ilustrujca w jaki sposb le napisany skrypt moe
stworzy dziur w systemie bezpieczestwa serwera.
Dopuszczenie do przesyania plikw do aplikacji moe by w wielu przypadkach uyteczne, ale naley
pamita, e niektrzy uytkownicy mog nie posiada dostatecznie szybkiego cza aby efektywnie korzysta z
tego mechanizmu, wic dobrym pomysem jest zapewnienie jeszcze jednego sposobu na dostarczanie plikw do
aplikacji.
Rozdzia 5 Wysyanie plikw przez formularz
66
Rozdzia 6. Wsppraca z bazami danych
Wstp
Jedn z najwaniejszych cech nowoczesnych jzykw programowania lub narzdzi programistycznych
jest zdolno wsppracy z baz danych. Jest to spowodowane tym, e systemy zarzdzania relacyjnymi bazami
danych (SZRBD) posiadaj wiele bardzo wydajnych i niezwykle uytecznych mechanizmw zarzdzania danymi,
jak na przykad indeksowanie, relacje pomidzy danymi, obsuga transakcji, kaskadowe operacje wykonywane na
danych i wiele innych. PHP pozwala na dostp do danych przy uyciu bogatego zestawu funkcji zwizanych z
bazami danych.
Wprowadzenie
Jak mona wywnioskowa na podstawie dokumentacji, autorzy PHP uwaaj obsug baz danych za jedn
z najwaniejszych i najsilniejszych cech PHP. Obsugiwane s midzy innymi takie bazy danych:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL Mictosoft SQL Server
ODBC
Obsugujc ODBC, PHP moe zosta uyty do prawdopodobnie dowolnej istniejcej bazy danych. Z
powodu ogromnej iloci obsugiwanych baz danych jest niemoliwe szczegowe omwienie obsugi kadej z
nich w tej ksice. Dodatkowo, jzyk SQL jest sam w sobie niezwykle bogatym i wydajnym narzdziem, ktre
rwnie nie zostanie odpowiednio dokadnie opisane w tej ksice. Najlepiej posikowa si dokumentacj
odmiany SQL zaimplementowanej w uywanej przez ciebie bazie danych. Zakadamy w tym rozdziale, e
czytelnicy znaj podstawy SQL w stopniu wystarczajcym do zrozumienia przykadw zamieszczonych na
wydrukach.
W rozdziale tym skupimy si na przykadach uycia MySQL i ODBC. Wybraem MySQL poniewa jest
to wydajna baza danych dostpna na zasadach licencji GNU General Public License (GPL) i jest powszechnie
uywana do wsppracy z PHP. ODBC wybraem, poniewa do wikszoci baz danych dostpne s sterowniki
tego standardu. Przykady ilustruj zastosowanie jzyka PHP i nie zawsze pokazuj najlepsze zastosowania SQL
oraz dziaania na bazach danych.
Funkcje baz danych
Kada z obsugiwanych baz danych posiada wasny zestaw funkcji PHP. Nazwy funkcji zwizanych z
MySQL rozpoczynaj si od mysql_ i podobna zasada obowizuje w przypadku innych baz (W skorowidzu
funkcji na kocu ksiki znajduje si kompletna lista funkcji zwizanych z bazami danych). Mimo, e kada z baz
danych ma wasny zestaw funkcji, istnieje wsplny model dostpu do kadego z typw baz danych. Pseudokod
opisujcy pobieranie danych z dowolnego systemu bazy danych przedstawiony jest na wydruku 6.1.
Wydruk 6.1. Pseudokod opisujcy pobieranie danych z bazy
<?php
pocz_z_Baz();
wybierz_baz();
wylij_wyraenie_SQL();

pobierz_wynik();
while ( istnieje_wiersz )
pobierz_wiersz();
zamknij_poczenie();
?>
Nastpne dwie czci zawieraj szczegy konfiguracji i uycia MySQL i ODBC.
MySQL
MySQL jest wietn baz danych dla wikszoci projektw. Oficjaln witryn MySQL jest
http://www.mysql.com. Na tej witrynie znajduje si najnowsza wersja systemu oraz dokumentacja opisujca
instalacj i konfiguracj MySQL w rnych rodowiskach.
Rozpoczynamy prac z MySQL
W zalenoci od twoich potrzeb i typu serwera, moesz albo cign rda MySQL, dystrybucj binarn
albo RPM. Najszybsz metod zainstalowania MySQL na systemie Linux dziaajcym na platformie Intel jest
cignicie pliku RPM i zainstalowanie go. Przy uyciu tej metody instalowane s wszystkie elementy serwera,
wic moesz od razu zaczyna prac. Jeeli uywasz systemu dziaajcego w oparciu o Win32, najszybsz
metod pozyskania serwera jest cignicie skompresowanej instalacji binarnej.
PHP4 posiada wbudowan obsug MySQL, wic nie musisz ponownie kompilowa PHP aby uywa
funkcji mysql_. Jednak jeeli korzystasz z wbudowanej obsugi MySQL, nie mona uywa innych moduw
odwoujcych si do MySQL, na przykad mod_auth_mysql i mod_perl. Jeeli potrzebujesz moduw uywajcych
MySQL, musisz przekompilowa PHP podajc opcj konfiguracji --with_mysql=/cieka/do/mysql.
Uycie MySQL
Po zainstalowaniu i uruchomieniu MySQL mona rozpocz pisanie skryptw PHP, ktre korzystaj z
danych umieszczonych w bazie danych. Skrypt zamieszczony na wydruku 6.2 pokazuje jak proste jest uycie
MySQL do pobrania danych z bazy. Tabela ktrej bd uywa w dwch kolejnych przykadach zostaa
utworzona za pomoc nastpujcego kodu SQL:
CREATE TABLE employees
(
id tinyint(4) DEFAULT '0' NOT NULL auto_increment,
first varchar(20),
last varchar(20),
adress varchar(255),
position varchar(50),
PRIMARY KEY (id),
UNIQUE id (id)
)
Wydruk 6.2. Pobieranie danych z bazy danych MySQL
<html>
<head>
<title>Pobieranie danych z MySQL</title>
</head>
<body>
<?php
// Ukrywamy komunikaty bdw i sami je obsugujemy
$aDBLink = @mysql_connect( "db.server.com", "user", "pass" );
if ( !empty( $aDBLink ) )
{
// wybr bazy danych MySQL
if ( mysql_select_db( "mydb", $aDBLink ) == True )
{
$aSQL = "select * from employees";
// Wykonanie zapytania SELECT
$aQResult = mysql_query( $aSQL, $aDBLink );
if ( $aQResult == True )
{
// Pobranie wiersza danych i wypisanie dwch pl
while ( $aRow = mysql_fetch_array( $aQResult ) )
{
$aFName = $aRow["first"];
$aPos = $aRow["position"];
Rozdzia 6 Wsppraca z bazami danych
68
print( "$aFName, $aPos<br>" );

}
mysql_free_result( $aQResult );
}
else
{
print( "Bd wykonania zapytania<br>" );
}
}
else
{
print( "Bd wyboru bazy danych<br>" );
}
}
else
{
print( "Bd przy podczaniu do bazy danych<br>" );
}
?>
</body>
</html>
Po uruchomieniu skryptu z wydruku 6.2, prbuje si on podczy do serwera bazy danych MySQL
dziaajcego na komputerze db.serer.com podajc nazw uytkownika i haso. Symbol @ umieszczony przed
funkcj mysql_connect() powoduje zablokowanie wypisywania bdw i ostrzee. Podczas testowania moesz
opuci ten symbol, ale w normalnej pracy naley go uywa i stosowa wasne procedury obsugi bdw.
Nastpn czynnoci wykonywan przez skrypt jest wybranie odpowiedniej bazy danych, w naszym przypadku
mydb. Jeeli si to powiodo, przy pomocy funkcji mysql_query() zadawane jest zapytanie do bazy danych. W
naszym przykadzie jest to zapytanie SELECT, ktre powoduje pobranie rekordw z bazy danych. Moe by to
dowolne zapytanie, na przykad: INSERT, UPDATE, ADD TABLE lub dowolne inne zapytanie SQL. Wynik funkcji jest
rny od zero w przypadku powodzenia i zero w przypadku bdu. Dodatkowo, jeeli zapytanie jest typu SELECT,
wynik funkcji jest identyfikatorem wyniku przekazywanym do funkcji mysql_result(), mysql_fetch_array(),
mysql_fetch_lengths(), mysql_fetch_object(), i mysql_fetch_row(), ktre s uywane do odczytania
wynikowych danych. W naszym przykadzie uywamy funkcji mysql_fetch_array() do odczytania wiersza z
wynikowych danych a nastpnie wywietlane s dane z odpowiednich pl.
Funkcje mysql_fetch_array() i mysql_fetch_row() s podobne do siebie i zwracaj jeden wiersz wyniku
w postaci tablicy. Funkcja mysql_fetch_array() zwraca wynik w postaci tablicy asocjacyjnej indeksowanej
nazwami kolumn. Wywoanie funkcji mysql_fetch_row() zwraca tablic indeksowan liczbami. Wywoanie
jednej z tych funkcji zwraca kolejny wiersz danych zwracanych przez zapytanie i przesuwa wewntrzny wskanik
do nastpnego wiersza. Jeeli nie ma wicej danych, funkcja zwraca False. Wywoanie funkcji
mysql_fetch_array() nie jest zauwaalnie wolniejsze ni wywoanie mysql_fetch_row(), a dostarcza o wiele
wicej danych.
Uywajc skryptu z wydruku 6.2 jako podstawy, mona napisa wszystkie moliwe aplikacje oparte na
bazie danych. Funkcje MySQL posiadaj dodatkowo kilka cech, ktre nie s dostpne dla wszystkich baz
obsugiwanych przez PHP. Dostarczone s specjalizowane funkcje do tworzenia i usuwania baz danych oraz
funkcje umoliwiajce odczytanie struktury bazy danych. Na przykad za pomoc funkcji mysql_list_tables()
mona uzyska list wszystkich tabel w bazie danych.
Jedn z moich ulubionych funkcji dla MySQL jest mysql_insert_id(). Uywajc pl o atrybucie
auto_increment mona po prostu zapisa dane do tabeli a nastpnie odczyta unikalny identyfikator rekordu za
pomoc funkcji mysql_insert_id(). Na wydruku 6.3 mamy formularz, ktry pozwala na wprowadzenie danych
nowego pracownika do bazy uywanej na wydruku 6.2. Skrypt korzysta z funkcji mysql_insert_id() w celu
zrealizowania potwierdzenia operacji wstawienia danych.
Wydruk 6.3. Wstawianie rekordu do bazy danych MySQL
<?php
/*
Funkcja InsertRecord
Wstawia mowy rekord do tabeli employees.
W przypadku powodzenia operacji zwraca identyfikator nowego rekordu
a w przypadku bdu warto ujemn wskazujc na przyczyn bdu.
*/
function InsertRecord( $aFirstName, $aLastName, $aAddr, $aPos )
{
// Przygotowanie wyraenia SQL INSERT
$aSQL = "insert into employees ( first, last, address, ";
$aSQL .= "position ) values ( '$aFirstName', '$aLastName', ";
$aSQL .= "'$aAddr', '$aPos' )";
PHP Kompendium wiedzy
69
// Przyczenie do serwera i wykonanie instrukcji INSERT

$aDBLink = @mysql_connect( "db.server.com", "root", "" );
if ( !empty( $aDBLink ) )
{
if ( mysql_select_db( "mydb", $aDBLink ) == True )
{
$aQResult = mysql_query( $aSQL, $aDBLink );
if ( $aQResult == True )
{
$aResult = mysql_insert_id( $aDBLink );
}
else
{
// print( "Bd wykonania zapytania<br>" );
$aResult = -1;
}
}
else
{
// print( "Bd wyboru bazy danych<br>" );
$aResult = -2;
}
}
else
{
// print( "Bd przy podczaniu do bazy danych<br>" );
$aResult = -3;
}
return $aResult;
}
?>
<html>
<head>
<title>Przykad MySQL: Wstawianie danych do bazy </title>
</head>
<body>

<?php
if ( $REQUEST_METHOD == 'POST' )
{
// Nastpio przesanie danych formularza
$aResult = InsertRecord( $FirstName, $LastName,
$Address, $Position );
if ( $aResult > 0 )
{
print( "Dodano nowy wiersz, ID = $aResult<br>" );
}
else
{
print( "Bd funkcji InsertRecord. Kod bdu = $aResult<br>" );
}
print( "<hr>" );
}
?>
Prosz wpisa dane nowego pracownika:<br>
<form action="<?php echo $PHP_SELF ?>" method="post">
Imi: <input type="text" name="FirstName" maxlength="20"><br>
Nazwisko: <input type="text" name="LastName" maxlength="20"><br>
Adres: <input type="text" name="Address" maxlength="255"><br>
Stanowisko: <input type="text" name="Position" maxlength="50"><br><br>
<input type="submit" name="Submit" value="Wylij">
</form>
</body>
</html>
W skrypcie z wydruku 6.3, funkcja IndertRecord() zawiera ca logik wstawienia nowego rekordu do
bazy danych. Zwraca on identyfikator nowego rekordu (warto przypisywana przez MySQL do kolumny id) lub
warto ujemn oznaczajc jedn z trzech obsugiwanych sytuacji bdnych. Realistycznie patrzc, Ten typ
aplikacji powinien zawiera o wiele wicej kodu odpowiedzialnego za obsug bdw, na przykad sprawdzanie
pustych pl, ale dla naszych potrzeb kod ten nie zosta rozmylnie wprowadzony. Poniewa pole id w tabeli
employees jest polem typu auto_increment, MySQL automatycznie generuje jednoznaczne wartoci tego pola
przy kadym wstawieniu rekordu. W naszym przykadzie warto ta jest odczytywana za pomoc funkcji
mysql_insert_id().
Przykad ten mia na celu pokazanie prostoty korzystania z baz danych w PHP. Wicej przykadw uycia
baz danych w aplikacjach WWW mona znale w rozdziale 15 Witryny oparte o baz danych. Znajduj si
tam bardziej zoone przykady zawierajce obsug bdw i skomplikowane zapytania.
Rozdzia 6 Wsppraca z bazami danych
70

MySQL jest wydajn baz danych posiadajc funkcje wystarczajce do tworzenia wikszoci typw
aplikacji WWW. Jest ona szybka, solidna i zawiera wikszo funkcji dostpnych w komercyjnych bazach
danych. Jednak w czasie pisania tej ksiki MySQL nie zawiera mechanizmu transakcji. Niedostpne s rwnie
niektre elementy SQL, na przykad podzapytania. Jeeli jeszcze nie wybrae swojego systemu bazy danych,
spisz swoje wymagania i porwnaj ze specyfikacj dostpnych systemw. W przypadku tworzenia aplikacji o
wysokiej jakoci koszt bazy nie jest jedynym czynnikiem jaki naley bra pod uwag. Jeeli twoja firma posiada
system bazy danych inny ni MySQL, nastpna cz zawiera informacje na temat ODBC, ktre pomog
podczy si do twoich istniejcych danych.
ODBC
Open Database Connectivity (ODBC) to powszechnie stosowany interfejs API (application programming
interface) sucy do czenia si z bazami danych. Jest on oparty na specyfikacji Call Level Interface
pochodzcym z X/Open oraz ISO/IEC i jako jzyka dostpu do danych uywa SQL. Istnieje kilka implementacji
ODBC API dla systemw Uniksowych. W systemie Windows ODBC jest zwykle instalowany razem z systemem.
Podstawy ODBC
PHP moe obsugiwa praktycznie kad implementacj ODBC, ale musi by w tym celu odpowiednio
skonfigurowany, poniewa ODBC nie jest w chwili obecnej domyln opcj. W PHP istniej cztery opcje
konfiguracji zwizane z ODBC: --with-unixODBC, --with-custom-ODBC, --with-iodbc oraz --with-openlink.
Opcje te s lepiej opisane w skorowidzu na kocu ksiki. W rozdziale tym przykady korzystaj z implementacji
ODBC unixODBC (http://www.unixodbc.org/). Jest on dostpny na zasadach licencji GPL lub LGPL i jest bardzo
atwy do instalacji i konfigurowania.
ODBC tym rni si od MySQL i innych API baz danych tym, e wszystkie odwoania do bazy danych
wykonuje za porednictwem sterownika bazy danych. Oznacza to, e najpierw musisz zainstalowa program
zarzdzajcy sterownikami, na przykad unixODBC, a nastpnie sterownik do twojego systemu bazy danych. Na
rysunku 6.1. pokazane s powizania pomidzy komponentami aplikacji PHP opartej o ODBC. Aplikacja
wywoujc funkcj, na przykad odbc_connect(), kontaktuje si z zarzdc sterownikw. Zarzdca ten jest
odpowiedzialny za zaadowanie odpowiedniego sterownika bazy danych i przekazanie do niego dania.
Sterownik bazy danych wywouje odpowiedni funkcj bazy danych, ktra realizuje nasze danie.
Rysunek 6.1.
Komponenty
aplikacji PHP
korzystajcej z
PHP
PHP Application - aplikacja PHP
Driver Manager - zarzdca sterownikw
Database Driver - sterownik do bazy danych
DBMS - SZRBD
Poniewa ODBC wymaga zastosowania zarzdcy sterownikw oraz sterownika odpowiedniej bazy
danych, instalacja i konfiguracja ODBC jest nieco bardziej skomplikowana ni konfiguracja MySQL. Rwnie
kady z uywanych sterownikw baz danych musi zosta zainstalowany i skonfigurowany.
W ksice tej zostanie opisana instalacja i konfiguracja zarzdcy sterownikw unixODBC oraz sterownika
ODBC-ODBC Bridge (OOB), ktry mona uzyska z Easysoft Limited, http://www.easysoft.com/. Sterownik
OOB powoduje wzrost komplikacji struktury, ale posiada tak duo zalet, e jest wart zainteresowania. Sterownik
ten pozwala na dostp do baz danych zainstalowanych na rnych platformach za pomoc wasnego modelu
klient-serwer. NA rysunku 6.2. zilustrowano sposb uycia sterownika OOB.
Rysunek 6.2.
Dodajemy
sterownik OOB
PHP Application - aplikacja PHP
Driver Manager - zarzdca sterownikw
The OOB driver - sterownik OOB
OOB Client - klient OOB
Network - sie
OOB Server - serwer OOB
Driver Manager - zarzdca sterownikw
Database Driver - sterownik do bazy danych
PHP Kompendium wiedzy
71

DBMS - SZRBD
Zalet stosowania sterownika OOB jest to, e moesz dziki niemu uywa ODBC w aplikacjach
dziaajcych na serwerze WWW i korzysta z danych z bazy danych dziaajcej na innym komputerze (ktry
moe dziaa na innym systemie operacyjnym). Dla przykadu w moim testowym systemie zainstalowaem Oracle
8i na serwerze Windows NT i utworzyem prost baz danych. Nastpnie w moim linuksowym serwerze WWW
dodaem sterownik OOB. Sterownika tego mona uywa do podczania si do dowolnej bazy zgodnej z ODBC,
dziaajcej na dowolnej platformie.
Dodatkowym utrudnieniem jest to, e uywajc OOB naley kolejno zainstalowa klienta i serwer OOB
na oddzielnych komputerach. Na szczcie na witrynie Easysoft bardzo atwo jest odszuka i zaadowa
odpowiednie programy.
Kolejne trzy czci omawiaj instalowanie zarzdcy sterownikw unixODBC, kompilacj PHP z obsug
unixODBC oraz instalowanie sterownika OOB. Czci te s przeznaczone dla uytkownikw Linuksa i
zakadamy, e potrafisz kompilowa programy dla tego systemu oraz, e masz zainstalowane wszystkie
niezbdne kompilatory i narzdzia.
Instalowanie i kompilowanie unixODBC
Po cigniciu i rozpakowaniu plikw unixODBC, musisz skompilowa zarzdc sterownikw. W
instalacji unixODBC znajduje si standardowy skrypt sucy do konfigurowania rodowiska kompilacji. W celu
skompilowania mojej konfiguracji PHP uyem nastpujcych opcji:
./configure --disable--drivers --disable-threads --prefix=/usr/local/unixODBC --disable-gui
Poniewa miaem ju potrzebny sterownik, nie potrzebowaem aby unixODBC doda swoje sterowniki
wewntrzne. Powodem wyczenia wtkw jest to, e moja instalacja PHP jest w postaci dynamicznie
adowanego moduu (--with-apxs) a Apache nie obsuguje domylnie wtkw. Skompilowanie tego moduu z
obsuga wtkw spowodowaoby awari Apache w trakcie adowania moduu. Wyczyem rwnie obsug
graficznego interfejsu uytkownika, poniewa nie mam na moim serwerze zainstalowanego rodowiska
XWindows.
Kompilowanie PHP z obsug unixODBC
Po skompilowaniu i zainstalowaniu zarzdcy sterownikw unixODBC naley przekompilowa PHP z
wczon obsug unixODBC. Odpowiedni opcj konfiguracji jest --with-unixODBC=/sciezka/do/unixODBC.
Uyta cieka musi by taka sama jak cieka uyta w opcji --prefix podczas kompilowania unixODBC. W
moim przypadku jest to /usr/local/unixODBC.
Jeeli statycznie czysz PHP z Apache, musisz rwnie przekompilowa Apache. Jeeli korzystasz z
dynamicznego czenia, wystarczy wyczy Apache, zainstalowa nowy modu PHP i powtrnie uruchomi
Apache.
Instalowanie sterownika OOB
W moim przypadku musiaem zainstalowa serwer OOB na komputerze z Windows NT i skonfigurowa
go tak, aby przyjmowa dania. Wykonaem to uruchamiajc program instalacyjny i wykonujc wszystkie kroki
w programie instalacyjnym. Wszystko zadziaao bez problemw. Nastpnie cignem i zainstalowaem
oprogramowanie klienta na serwerze z systemem Linux. Proces ten by niespodziewanie atwy, poniewa
dostpny by program instalacyjny prowadzcy uytkownika przez kolejne kroki procedury instalacyjnej. Mona
rwnie skorzysta z witryny Easysoft, gdzie na podstawie konkretnej konfiguracji otrzymamy szczegowy opis
tego jak cign i zainstalowa serwer i klienta OOB.
Konfigurowanie OOB
Po zainstalowaniu caego oprogramowania naley utworzy nazwy rde danych (DSN) zarwno na
kliencie jak i na serwerze. rda danych s mechanizmem specyficznym dla ODBC sucym do opisywania
sposobu wsppracy z systemem bazy danych. W Windows tworzy si DSN poprzez program rda danych
ODBC dostpny w Panelu sterowania. OOB wymaga utworzenia systemowego DSN a nie DSN uytkownika.
Program ten zawiera plik pomocy opisujcy sposb tworzenia systemowych DSN.
Rozdzia 6 Wsppraca z bazami danych
72

Aby utworzy DSN na Linuksie naley zmieni przy pomocy graficznego narzdzia unixODBC lub
edytora tekstowego pliki odbcinst.ini i odbc.ini. Plik odbcinst.ini jest uywany do opisu nazw sterownikw i czy
nazwy z plikami sterownikw. Mj plik wyglda nastpujco:
[OOB]
Driver = /usr/local/easysoft/oob/client/libesoobclient.so
Setup = /usr/local/easysoft/oob/client/libesoobsetup.so
FileUsage = 1
Plik odbc.ini zawiera opis rde danych. Swoje rdo skonfigurowaem nastpujco (serwer i haso jest
oczywicie zmylone):
[localdsn]
Server=satabase.server.com
Driver=OOB
Port=8888
Transport=tcpip
LogonUser=prodplaner
LogonAuth=password
TargetDSN=LocalOracle
TargetUser=prodplaner
TargetAuth=password
Korzystanie z ODBC
Po zainstalowaniu i skonfigurowaniu wszystkich komponentw korzystanie z ODBC w PHP jest bardzo
podobne do korzystania z MySQL. Na wydruku 6.4 znajduje si skrypt, ktry jest odpowiednikiem ODBC
skryptu umieszczonego na wydruku 6.2. Tabela uywana w tym przykadzie jest odpowiednikiem uywanej w
poprzednim przykadzie.
Wydruk 6.4. Odczytywanie danych z bazy ODBC
<html>
<head>
<title>Pobioeranie danych z bazy danych ODBC</title>
</head>
<body>
<?php
putenv("ODBCINI=/usr/local/unixODBC/etc/odbc.ini");
// Ukrywamy komunikaty bdw i sami je obsugujemy
$aDBLink = @odbc_connect( "localdsn", "prodplanner", "agdec" );
if ( !empty( $aDBLink ) )
{
$aSQL = "select * from employees";
$aQResult = @odbc_exec( $aDBLink, $aSQL );
if ( $aQResult == True )
{
$aRow = array();
$aRowNum = 1;
while ( odbc_fetch_into( $aQResult, $aRowNum, &$aRow ) )
{
$aFName = $aRow[1];
$aPos = $aRow[4];
print( "$aFName, $aPos<br>" );

$aRowNum++;
}
odbc_free_result( $aQResult );
}
else
{
print( "Bd wykonania zapytania<br>" );
}
}
else
{
print( "Bd podczenia do bazy danych<br>" );
}
?>
</body>
</html>
Wydruk 6.4 jest waciwie taki sam jak wydruk 6.2. Mimo, e nazwy funkcji s inne, koncepcja jest
nieomal identyczna. Jedyn zauwaaln rnic jest wywoanie putenv() na pocztku skryptu. Wywoanie to
umieszcza w rodowisku programu ciek do pliku inicjalizujcego ODBC. Nie jest to potrzebne, jeeli w ten
sam sposb ustawie rodowisko serwera WWW. Dodatkowo, na wydruku 6.4 do pl tabeli odwoujemy si dla
PHP Kompendium wiedzy
73

uproszczenia za pomoc numer a nie nazwy. Dostpne s funkcje ODBC zapewniajce obsug transakcji,
kursorw i wiele innych. W skorowidzu funkcji na kocu ksiki znajduj wszystkie funkcje do obsugi ODBC.
Uwaga na temat poczenia do baz danych
W poprzednim przykadzie poczenie do baz danych byo realizowane za pomoc podstawowych funkcji xxx_connect(). PHP
posiada rwnie zdolno tworzenia trwaych pocze za pomoc funkcji pxxx_connect(). Uycie poczenia trwaego poprawia
wydajno aplikacji, poniewa sam PHP utrzymuje poczenie z baz danych, wic moe by ono wielokrotnie uywane. Po
utworzeniu poczenia za pomoc odpowiedniej kombinacji host-uytkownik-haso, PHP cigle dostarcza tego samego poczenia do
kolejnych wywoa poczenia. W bazach danych utworzenie poczenia trwa zwykle dugo (na przykad w Oracle), wic uycie
trwaych pocze moe mie ogromny wpyw na ogln wydajno aplikacji.
PHPLIB
Jak wspomniaem w poprzednich rozdziaach, dostpne s wietne biblioteki do wykorzystania przez
programistw PHP. Jedna z najczciej uywanych bibliotek, PHP Base Library (PHPLIB) jest dostpna pod
adresem http://phplib.netuse.de. Zawiera ona klasy dostu do baz danych, obsugi sesji, narzdzi autoryzacji i
wiele, wiele innych.
Klasy dostpu do bazy danych w PHPLIB tworz warstw abstrakcji dla kilku baz danych obsugiwanych
przez PHP. Warstwa ta zapewnia wsplny interfejs dla bazowych funkcji baz danych, wic programici mog
atwo zmienia typ bazy danych bez koniecznoci nauki nowego zestawu funkcji lub wielu zmian w kodzie. W
czasie pisania ksiki PHPLIB obsugiwa MySQL, PostgreSQL, mSQL, Oracle 7, Oracle 8, Sybase, Microsoft
SQL Sever i bazy ODBC.
Poniszy wydruk ilustruje si moduu obsugujcego bazy danych z pakietu PHPLIB. W skrypcie
umieszczonym na wydruku 6.5. pokazany zosta sposb uproszczenia skryptu z wydruku 6.2.
Wydruk 6.5. Uycie PHPLIB do powtrzenia wynikw z wydruku 6.2
<?php
include ( "db_mysql.inc" );
// Dziedziczymy po klasie DB_Sql aby uy jej z
// nasz baz MySQL
class MySQLDBTest extends DB_Sql
{
var $Host = "208.129.36.163";
var $Database = "mydb";
var $User = "root";
var $Password = "";
}
// Tworzenie egzemplarza nowej klasy MySQLDBTest
$aDB = new MySQLDBTest;
$aDB->query( "select * from employees" );
while( $aDB->next_record() )
{
$aFName = $aDB->f( "first" );
$aPos = $aDB->f( "position" );
print( "$aFName, $aPos<br>" );
}
?>
Dostarczona przez PHPLIB klasa DB_Sql ukrywa w sobie szczegy procesu czenia i wyboru bazy
danych oraz zawiera kod obsugi bdw. Pozwala to osign w wyniku kod, ktry jest atwiejszy do czytania,
utrzymania i uruchamiania. Klasa DB_Sql nie jest przeznaczona do bezporedniego uywania. Zamiast tego
powinna by tworzona klasa dziedziczca po niej, w ktrej ustawiane s zmienne specyficzne dla twojego
rodowiska pracy. Jeeli PHP bdzie obsugiwa klasy abstrakcyjne, jest to idealny kandydat do takiej wanie
implementacji. Na wydruku 6.5 definiowana jest klasa pochodna MySQLDBTest, w ktrej zawarte s dane opisujce
poczenie z MySQL. Nastpnie tworzony jest obiekt tej klasy, na ktrym wykonywane s operacje.
Najwiksza zaleta korzystania z klas PHPLIB ujawnia si, gdy zachodzi potrzeba wymiany bazy danych.
Poniszy wydruk pokazuje jak atwo mona zamieni skrypt z wydruku 6.5, aby zamiast z MySQL korzysta z
Oracle poprzez sterownik ODBC.
Wydruk 6.6. Skrypt z wydruku 6.5 korzystajcy z Oracle i ODBC
<?php
putenv("ODBCINI=/usr/local/openlink/odbc.ini");
include( "db_odbc.inc" );
// Dziedziczymy po klasie DB_Sql aby uy jej z
// baz danych Oracle poprzez ODBC
Rozdzia 6 Wsppraca z bazami danych
74

class OracleDBTest extends DB_Sql
{
var $Database = "localdsn";
var $User = "prodplanner";
var $Password = "agdec";
}
// Tworzenie egzemplarza nowej klasy OracleDBTest
$aDB = new OracleDBTest;
$aDB->query( "select * from employees" );
while( $aDB->next_record() )
{
$aFName = $aDB->f( "first" );
$aPos = $aDB->f( "position" );
print( "$aFName, $aPos<br>" );
}
?>
Jedyn widoczn zmian pomidzy wydrukami 5 i 6 jest funkcja include(), ale znaczenie tej zmiany jest
olbrzymie. Skrypt z wydruku 6.5 korzysta z danych z bazy MySQL dziaajcej na tym samym komputerze co
serwer WWW. Skrypt z wydruku 6.6 pobiera dane z bazy Oracle zainstalowanej na serwerze z Windows NT.
Z powodu prostoty projektu i implementacji PHPLIB moe by on uyteczny dla programistw
pracujcych w zoonych, heterogenicznych rodowiskach, jak rwnie w prostych instalacjach skadajcych si z
jednego serwera. Biblioteka ta zapewnia jednakowy interfejs dostpu do rnych baz danych, co powoduje bardzo
atwe ponowne uycie istniejcego kodu. Wicej informacji na temat klas zawartych w PHPLIB mona odnale
na witrynie http://phplib.netuse.de/.
Przechowywanie danych z formularzy
Omwienie formularzy HTML jest potrzebne w rozdziale dotyczcych baz danych, poniewa formularze
s najczciej uywanym mechanizmem uywanym do wprowadzania danych w aplikacjach WWW. Tak jak
opisano w rozdziale 3, Formularze i cookie, PHP dostarcza wielu funkcji potrzebnych przy uywaniu
formularzy i baz danych.
W przy domylnych ustawieniach PHP automatycznie oznacza we wszystkich zmiennych GET, POST i
COOKIE apostrofy, cudzysowy, ukoniki i znaki NUL. Powoduje to, e warto przekazana z formularza jest od
razu gotowa do uycia w zapytaniu SQL. Jeeli zablokowae t opcj, musisz uy funkcji addslashes() zanim
skorzystasz w zapytaniu SQL z cigu przekazanego z formularza. Dodatkowo, wszystkie wartoci, ktre bd
wywietlane musz zosta przed wywietleniem przetworzone za pomoc funkcji stripslashes().
Tak jak we wszystkich aplikacjach, dane wpisane do formularza HTML musz by sprawdzone przed ich
zapisaniem do bazy danych. Mechanizmy kontroli poprawnoci danych byy opisane w rozdziale 3. Wynikiem
braku kontroli danych moe by niezadowolenie uytkownikw z aplikacji a nawet zaamanie systemu
bezpieczestwa serwera. Na przykad, niektre komunikaty bdw generowane przez baz danych mog
zawiera takie informacje na temat uywanej bazy danych, ktrych na pewno nie chciaby pokazywa
uytkownikom. Naley by przygotowanym na sytuacje, e niektrzy uytkownicy mog prbowa wyszuka
sabe punkty w aplikacji.
Aby zabezpieczy si przed niektrymi typami atakw naley zawsze uywa atrybutu maxlength w
polach tekstowych oraz kontrolowa typ i posta danych. Jak wspomniano w rozdziale 3, tam gdzie jest to
moliwe naley zastpowa procedury kontroli danych przez takie mechanizmy, ktre ze swojej natury
ograniczaj pomyki. Pola wyboru, przyciski opcji i inne tego typ elementy pozwalaj na du elastyczno i
ograniczaj moliwo bdu przy wprowadzaniu danych.
Tworzc alternatywne mechanizmy wprowadzania danych naley pamita o moliwoci korzystania z
bazy danych przy tworzeniu pocztkowego zestawu danych. Umieszczenie takiego zestawu opcji w bazie danych
skutkuje w duszym okresie stworzeniem aplikacji atwiejszej do zarzdzania. Na przykad na wydruku 6.7
pokazane zostao tworzenie listy wyboru zawierajcej kraje oraz stany USA. Oczywicie mona wybra stan w
USA a nastpnie Afryk poudniow. Przykad ten pokazuje jedynie koncepcj. W skrypcie tym uywane s
tabele us_states oraz world_countries. Kada z tabel zawiera identyfikator oraz nazw. Identyfikator jest
przekazywany jako warto formularza.
Wydruk 6.7. Uycie tabel sownikowych do generacji listy opcji
<?php
include ( "./db_mysql.inc" );
class MySQLDBTest extends DB_Sql
PHP Kompendium wiedzy
75

{
var $Host = "208.129.36.163";
var $Database = "mydb";
var $User = "root";
var $Password = "";
}
function GetGenOpts( $aTableName, $aCurSel = "" )
{
$aResult = "";
$aDB = new MySQLDBTest;
$aSQL = "select ID, Name from $aTableName order by Name";
$aDB->query( $aSQL );
while( $aDB->next_record() )
{
$aName = $aDB->f( "Name" );
$aID = $aDB->f( "ID" );
if ( $aID == $aCurSel )
{
$aResult .= "<option value=\"$aID\" selected>$aName</option>";
}
else
{
$aResult .= "<option value=\"$aID\">$aName</option>";
}
}
return $aResult;
}

?>
<html>
<head>
<title>Formularz wyboru stanu USA oraz kraju</title>
</head>
<body>
<form action="some_place.phtml" method="post">
<table>
<tr>
<td>
Wybierz stan USA:
</td>
<td>
<select name="us_state" size="1">
<?php
print( GetGenOpts( "us_states", "ID" ) );
?>
</select>
</td>
</tr>
<tr>
<td>
Wybierz kraj:
</td>
<td>
<select name="world_country" size="1">
<?php
print( GetGenOpts( "world_countries", "ZA" ) );
?>
</select>
</td>
</tr>
</form>
</body>
</html>
Na rysunku 6.3. pokazany jest formularz. Funkcja GetGenOpts() moe by uyta do tworzenia listy opcji z
kadej tablicy posiadajcej kolumny ID oraz Name. Opcjonalny parametr $aCurSel moe zosta uyty do okrelenia
wybranej pozycji na formularzu, jeeli formularz jest uyty do edycji danych a nie do wprowadzania nowych
danych. Uycie tabel sownikowych pozwala rwnie na natychmiastowe zmiany w aplikacji o ile zajdzie taka
potrzeba. Jeeli masz list akceptowanych przez ciebie kart kredytowych, naley j przechowywa w bazie
danych zamiast statycznie definiowa na stronie HTML, poniewa w razie zmiany tej listy, nie trzeba przeglda
wszystkich stron szukajc odwoa. Zamiast tego mona po prostu zmieni wartoci w tabeli bazy danych.
Aplikacja zostanie natychmiast zmieniona si bez modyfikacji jednej linii kodu.
Rozdzia 6 Wsppraca z bazami danych
76

Rysunek 6.3.
Dynamicznie
generowany
formularz do
wprowadzania
danych

Kolejny raz musimy powtrzy, e najlepszym zabezpieczeniem przed nieprawidowymi danymi jest
dobrze skonstruowany mechanizm wprowadzania danych. Jeeli umiecisz na formularzu pole tekstowe, zawsze
musisz zweryfikowa poprawno danych, zanim trafi one do serwera bazy danych.
Udostpniajc aplikacj, nie moesz zapomnie o bezpieczestwie bazy danych. Zawsze naley
zabezpieczy baz danych w taki sposb, aby moliwy by dostp do niej jedynie za pomoc aplikacji.
Oczywicie, w aplikacji nie powinny znajdowa si pola umoliwiajce wykonanie dowolnego zapytania SQL.
Naley rwnie przetestowa aplikacj za pomoc danych, ktre mog spowodowa bd. Sprbuj wprowadzi
do pl tekstowych apostrofy oraz znaki backslash. Mona rwnie wpisa rednik i po nim wyraenie SQL.
Na przykad, spjrzmy na przykad aplikacji, ktra pobiera identyfikator a nastpnie wykonuje wyraenie
SQL:
select * from table where ID = wprowadzona_wartosc
Spodziewasz si, e wprowadzona_wartosc bdzie jedn wartoci, wic mona j wklei do wyraenia
SQL. Mimo, e przypadek ten jest do nieprawdopodobny, kto moe wpisa do formularza napis 1; drop
database. Wynikowe wyraenie SQL bdzie nastpujce:
select * from table where ID = 1; drop database
Mimo, e jest nieprawdopodobne, aby przykad ten spowodowa jakiekolwiek szkody, to jednak moesz
odszuka podobne przykady, ktre mog spowodowa naruszenie bezpieczestwa, lub uszkodzenie bazy danych.
W oparciu o typ tworzonej aplikacji, powiniene okreli poziom wymaganego bezpieczestwa i kontroli
poprawnoci.
Wykorzystanie moliwoci bazy danych
Cz ta nie jest zwizana bezporednio z wykorzystaniem baz danych z PHP jest to dodatek
powicony pisaniu aplikacji wykorzystujcych bazy danych. Moe on znajdowa si rwnie w rozdziale
powiconym inynierii programowania. Wszyscy, ktrzy nie pisali zbyt wielu aplikacji w rodowisku
wielowarstwowym, powinni dokadnie przeczyta ten fragment i stosowa go podczas pisania wasnych aplikacji
WWW korzystajcych z bazy danych.
Zanim zaczem pisa aplikacje dla WWW, tworzyem w wikszoci aplikacje Windows wykorzystywane
przez jednego uytkownika. We wszystkich przypadkach bazy danych uywa jeden uytkownik i dziaaa na tym
samym komputerze. rodowisko takie jest bardzo wygodne, poniewa nie trzeba robi adnych zaoe
dotyczcych wspbienoci a system bazy danych jest zwykle czym wicej ni porednikiem sucym do
odczytu i zapisu danych.
PHP Kompendium wiedzy
77

W przypadku tworzenia aplikacji dla rodowiska wielowarstwowego, baza danych peni o wiele
waniejsz rol. Potrzebna jest zwykle nowoczesna baza danych, ktra potrafi zarzdza wspbienoci,
uprawnieniami uytkownika, transakcjami i to odbierajc wiele rwnoczesnych da w tym samym czasie.
Oprcz wykonywania tych krytycznych funkcji, wikszo nowoczesnych baz danych posiada ogromn ilo
funkcji, ktre pomagaj w pisaniu aplikacji. Niezalenie od tego, czy serwer bazy danych i serwer WWW
umieszczony jest na tym samym komputerze, czy na osobnych maszynach, powiniene wszdzie tam gdzie jest to
moliwe wykorzystywa si systemu zarzdzania baz danych.
W mojej ostatniej staej pracy trafiem na wietny przykad. Zadaniem byo powielenie kilku wierszy
danych z tabeli zmieniajc w nowych wierszach zawarto kilku pl. Znaleziony przeze mnie kod wyglda mniej
wicej tak:
wybierz wszystkie wiersze do kopiowania
dla kadego wiersza
inicjuj nowy cig zawierajcy wyraenie INSERT
wybierz nowy klucz gwny w bazie danych
jeeli te dane powinny by skopiowane bez zmian
skopiuj istniejce dane do wyraenia INSERT
w przeciwnym wypadku
dodaj nowe wartoci do wyraenia INSERT
wykonaj wyraenie INSERT z wyraenia
koniec dla kadego wiersza
Nie mam zamiaru mia si z programisty, ktry pisa ten fragment, ale fragment ten prezentuje styl
kodowania brute-force czsty u modych lub niedowiadczonych programistw. Fragment ten wymaga 1+
(2*ilo wierszy) odwoa do bazy danych. Pierwsze wywoanie pobiera wszystkie wiersze i nastpnie dla
kadego z nich jest potrzebne jedno wywoanie do wygenerowania nowego klucza gwnego i jedno dla
wykonania instrukcji INSERT. Cay fragment mona zredukowa do jednego wyraenia SQL wykonywanego w
caoci przez baz danych:
INSERT INTO tabela SELECT sequence.nextval AS PRIMARY KEY, inne_pola FROM tabela
Wyraenie to opiera si na generatorze sekwencji do wygenerowania nowego klucza gwnego, ktry to
mechanizm musi posiada baza danych, ale pokazuje w jaki sposb wykorzystujc odpowiednio SQL mona
unikn pisania sporej iloci kodu oraz poprawi wydajno aplikacji. Jeeli zdarzy ci si pisa kod formatujcy,
filtrujcy bd sortujcy dane pobierane z bazy danych, przyjrzyj si dokadniej swojemu zapytaniu SQL. Moesz
skorzysta z wbudowanych funkcji bazy danych lub zastosowa bardziej skomplikowany kod SQL do osignicia
oczekiwanych wynikw.
W jednym z ostatnich projektw musiaem posortowa wiersze opisujce personel w oparciu o rnic
wieku liczc od okrelonej daty. Na przykad, musiaem okreli pozycj rekordu osoby w oparciu o to, jak
bardzo jej wiek jest zbliony do 30 lat. Dodatkowo kadej osobie przypisywana bya warto, bdc liczb od 0
do 10, obliczana w oparciu o to jak blisko wiek osoby jest zbliony do zaoonych wymaga wiekowych. Kady,
ktrego wiek by oddalony od zaoonego o wicej ni 10 lat otrzymywa t sam ocen. Ponisze wyraenie
moe wyglda na dosy skomplikowane, ale otrzymujemy wszystkie potrzebne dane bez potrzeby pisania
dodatkowego kodu manipulujcego wynikami:
SELECT concat (firstname, ' ', surneme) as fullname,
ROUND(MAX(0, (10-ABS((30-ROUND(((TO_DAYS(NOW()) - TO_DAYS(birthdate))/365)))))))
AS age_dif FROM persons ORDER BY age_diff DESC
Kady z wierszy wyniku zawiera imi i nazwisko osoby oraz liczb oznaczajc dan warto.
Wszystko czego potrzebujemy, to w ptli odczyta wyniki i wywietli je na ekranie. Na pocztku wyniku znajd
si osoby o wieku najbliszym 30 lat.
Jednym z najwaniejszych problemw przypisaniu aplikacji dla WWW jest uycie waciwych narzdzi i
waciwych ludzi do realizacji poszczeglnych fragmentw projektu. Nastpna dua cz ksiki, Zarzdzanie
projektem przy tworzeniu aplikacji WWW zawiera wicej informacji na temat inynierii programowania dla
aplikacji WWW.
Podsumowanie
Rozdzia ten zawiera opis uycia baz danych razem z PHP. Poniewa PHP obsuguje wiele typw baz
danych, skupilimy si na bazie MySQL oraz dostpowi poprzez ODBC. Zamieszczona zostaa rwnie krtka
dyskusja na temat inynierii programowania i wykorzystaniu moliwoci baz danych. Dalsze informacje na temat
Rozdzia 6 Wsppraca z bazami danych
78

uycia baz danych znajduj si w rozdziaach 15, 16 i 17. Najobszerniejsze przykady znajduj si w rozdziale 15
Witryny oparte o baz danych.
PHP Kompendium wiedzy
79
Rozdzia 7. Sesje i stan aplikacji
Wstp
W rozdziale 4 Operacje na plikach zostao przedstawione wykorzystanie plikw do utrzymania stanu
sesji, ale nie zawiera on oglnego opisu problemu utrzymywania stanu. W standardowych aplikacjach stan jest
automatycznie utrzymywany w zmiennych przechowywanych w pamici komputera, plikach oraz bazach danych
wykorzystywanych przez program. Stan programu jest zawsze znany, poniewa cay model dziaania programu
jest dosy prosty: uytkownik uruchamia program, wykonuje swoje zadania a nastpnie zamyka program. Jeeli
uytkownik chwilowo przeczy zadanie a nastpnie powrci do niego, stan aplikacji nie zmieni si. Gdy
uytkownik koczy prac, niezbdne dane s serializowane oraz zapisywane i sesja pracy programu si koczy.
W aplikacjach WWW zarzdzanie danymi sesji jest bardziej zoone. Jest to powodowane faktem, e
zarwno przegldarka jak i serwer WWW nie byy projektowane do uruchamiania aplikacji WWW. Poniewa
aplikacje WWW s ze swojej natury aplikacjami wielodostpnymi, w utrzymanie sesji jest zaangaowany
zarwno serwer jak i klient. Pod pojciem klienta kryj si tutaj poszczeglni uytkownicy. Serwer korzysta z
danych przekazanych mu przez klientw podczas kolejnych odwoa do stron do ledzenia i utrzymywania
danych sesji.
PHP pozwala na stosowanie kilka metod utrzymywania stanu sesji. W PHP4 wbudowano funkcje do
obsugi sesji, ale dostpne s rwnie moduy zewntrzne realizujce to samo zadanie. Inn metod jest napisanie
w PHP wasnego mechanizmu zarzdzania sesjami.
Podstawy mechanizmu sesji
Jak napisaem we wprowadzeniu, obsuga sesji w sieci WWW wymaga wsppracy pomidzy
przegldark klienta i serwerem WWW. Gdy sesja zaczyna si, serwer WWW tworzy unikalny identyfikator sesji
(ID) i przekazuje go do klienta. Zwykle identyfikator ten jest przechowywany w cookie na komputerze klienta.
Nastpnie przegldarka wysya ID do serwera razem z kadym daniem przesania strony. Serwer wykorzystuje
ID do odczytania i odtworzenia wszystkich potrzebnych danych aplikacji. Po zakoczeniu aplikacji dane s
usuwane z serwera. Na rysunku 7.1. pokazany zosta schemat komunikacji pomidzy klientem a serwerem WWW
(w tym przypadku jest to serwer 1U produkowany przez Penguin Computing) w przypadku rozpoczynania sesji
oraz wykorzystywania zmiennych.

Rysunek 7.1.
Rozpoczynanie
sesji oraz uycie
zmiennych sesji
Wbudowany w PHP mechanizm zarzdzania sesjami
W wersji 4 do PHP wprowadzono mechanizm zarzdzania sesjami. Funkcje obsugi sesji s dokadnie
opisane w skorowidzu funkcji na kocu ksiki. Wszystkie nazwy funkcji obsugi sesji rozpoczynaj si od
sesion_.
Wykorzystujc sesje w PHP naley wykona nastpujce podstawowe operacje:
1. Rozpoczcie sesji za pomoc session_start().
2. Zarejestrowanie nazw zmiennych sesji za pomoc session_register().
3. Uycie zmiennych sesji.
System zarzdzania sesjami w PHP mona w duym stopniu konfigurowa. Mona zmieni sposb
przesyania identyfikatora sesji, miejsce przechowywania zmiennych sesji na serwerze oraz czstotliwo
usuwania przerwanych sesji. Poniewa dostpne jest wiele opcji konfiguracji, cz ta zostanie podzielona na
czci o wzrastajcym stopniu skomplikowania.
Rozpoczcie pracy z sesjami w PHP
Wydruki 7.1 i 7.2 pokazuj, jak atwe jest uycie sesji w PHP wykorzystujce domylne ustawienia. Na
wydruku 7.1 zamieszczony jest skrypt inicjujcy wszystkie zmienne sesji uywane w aplikacji oraz cze do
skryptu z wydruku 7.2, ktry wykorzystuje zmienne sesji ze skryptu na wydruku 7.1.
Wydruk 7.1. Uruchamianie sesji i inicjowanie zmiennych
<?php
session_start();
session_register( "aUser", "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Podstawy sesji: Strona 1</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
<br><br>
<a href="listing2.phtml">Przejcie do strony 2</a>
</body>
</html>
Wydruk 7.2. Uycie zmiennych sesji z wydruku 7.1
<?php
PHP Kompendium wiedzy
81
session_start();

?>
<html>
<head>
<title>Podstawy sesji: Strona 2</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
</body>
</html>
Pierwszym krokiem skryptu z wydruku 7.1 jest uruchomienie sesji poprzez wywoanie funkcji
session_start(). W domylnej konfiguracji PHP uywa cookie do przechowywania identyfikatora sesji. Funkcja
session_start() posiada te same ograniczenia co funkcje set_cookie() i header(). Funkcje te musz by
wywoywane przed wysaniem do przegldarki jakichkolwiek informacji lub musi zosta wczone buforowanie
danych wyjciowych. Chocia mona zmieni sposb przesyania identyfikatora sesji, najprostsz metod jest
wykorzystanie domylnego mechanizmu cookie. Pozostae metody zostan opisane pniej.
Po rozpoczciu sesji, zostaj zarejestrowane dwie zmienne, aUser oraz aAccount. Gdy uytkownik kliknie
cze prowadzce do strony 2, przegldarka samoczynnie wyle identyfikator sesji do serwera. W skrypcie z
wydruku 7.2 w trakcie wywoania funkcji session_start(), PHP korzysta z identyfikatora sesji do odczytania
wszystkich zmiennych sesji. Na rysunkach 7.2. i 7.3. pokazane s wyniki dziaania skryptw umieszczonych
odpowiednio na wydrukach 1 i 2.
Rysunek 7.2. Wynik
dziaania skryptu z
wydruku 7.1


Rysunek 7.3. Wynik
dziaania skryptu z
wydruku 7.2

Rozdzia 7 Sesje i stan aplikacji
82
Moliwe jest wywietlenie biecego identyfikatora sesji wypisujc na ekran zawarto zmiennej
$PHPSESSID. Dodatkowo, w domylnej konfiguracji na Apache i Linuksa, dane sesji s przechowywane w
katalogu /tmp w plikach o nazwach w postaci sess_$PHPSESSID. Po uruchomieniu poprzedniego przykadu
odszukaem plik sess_e66b342b4e76889f8f25105db11820c6, ktry zawiera:
aUser|s:6:"Cidnie";aAccount|s:4:"1016";.

Domylne ustawienia PHP dotyczce zarzdzania sesjami s atwe do uycia i wystarczaj dla wikszoci
aplikacji WWW. Jednak w niektrych przypadkach cookie mog nie by podan metod przesyania
identyfikatora sesji, a w przypadku niektrych duych aplikacji WWW uycie plikw na serwerze WWW moe
utrudnia skalowanie aplikacji. Nastpne dwie czci zawieraj omwienie sposobu rozwizania tych problemw.
Przesyanie identyfikatora sesji bez uycia cookie
Jeeli aplikacja absolutnie wymaga zastosowania zmiennych sesji, do przesyania identyfikatora sesji
moesz uy innego mechanizmu ni cookie. Naley pamita, e niektrzy uytkownicy maj w swoich
przegldarkach wczon obsug cookie. Pierwsz z metod jest rczne przesyanie identyfikatora sesji w postaci
zmiennej GET lub POST. Na wydruku 7.3 pokazany jest skrypt, ktry pokazuje w jaki sposb naley zmieni kod z
wydruku 7.1, aby identyfikator sesji by przesyany jako zmienna GET.
Wydruk 7.3. Rczne przesyanie identyfikatora sesji za pomoc metody GET
<?php
session_start();
session_register( "aUser", "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Rczne przesyanie identyfikatora sesji: Strona 1</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
<br><br>
<a href="listing2.phtml?<?=SID?>">Przejcie do strony 2</a>
</html>
Naley zauway, e kod jest taki sam jak na wydruku 7.1, poza czem w trzecim wierszu od koca. W
tym przypadku do adresu URL zostaa doklejona staa PHP SID. Staa ta jest zdefiniowana jako
SessionName=SessionID, poniszy kod jest semantycznie identyczny z odpowiedni lini z wydruku 7.3:
<a href="listing2.phtml?<?php echo session_name() . "=" . session_id()?>">
Przejcie do strony 2</a>
Naley pamita, e SID jest sta a nie zmienn, wic jeeli bdziesz chcia wydrukowa $SID zamiast
SID, nie otrzymasz takiego samego wyniku. Na wydruku 7.3 zastosowany zosta skrt <?=SID?>. Zapis taki jest
rwnowany z <?php echo SID;?> zakadajc, e w czasie kompilacji PHP uyto opcji --enable-short-tags.
Wydruk 7.3 ilustruje mechanizm rcznego przesyania identyfikatora sesji w programie, ale nie pokazuje
jak mechanizm ten wpywa na tworzenie aplikacji. Korzystajc z tego mechanizmu, kade cze i kady
formularz w aplikacji musi zawiera identyfikator sesji. Jeeli nie dodasz identyfikatora do jednego cza, SID
zostanie utracony, a aplikacja bdzie le dziaa. Na szczcie PHP posiada opcj automatycznego
przeksztacania czy, ktry to mechanizm rozwizuje ten problem za ciebie. Jeeli chcesz przesya identyfikator
sesji przy uyciu metod GET i POST, moesz uaktywni ten mechanizm kompilujc PHP z opcj --enable-trans-
sid. Po przebudowaniu PHP kod z wydruku 7.3 moe by zmieniony na nieco prostszy, pokazany na wydruku
7.4.
Wydruk 7.4. Przetwarzanie wzgldnych adresw URL przez PHP w celu przekazywania identyfikatora
sesji
<?php
session_start();
session_register( "aUser", "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Automatyczne przesyanie identyfikatora sesji: Page 1</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
<br><br>
PHP Kompendium wiedzy
83
<a href="listing2.phtml">Przejcie do strony 2</a>

</html>
Rnica pomidzy wydrukiem 3 i 4 jest taka, e na wydruku 7.4 nie ma odwoania do staej SID w czu.
Mona rwnie zauway, e wydruk 7.4 jest praktycznie identyczny z wydrukiem 7.1, ale wynik jego dziaania
jest rny z powodu zmiany konfiguracji. Gdy uytkownik kliknie cze, URL bdzie zawiera cig
PHPSESSID=xxx, tak samo jak w przypadku skryptu z wydruku 7.3. Kod ten dziaa, poniewa PHP szuka na stronie
wzgldnych adresw URL i dodaje do nich potrzebn warto identyfikatora sesji. Aby to pokaza, nastpny
skrypt zawiera kilka wzgldnych czy i kilka bezwzgldnych. Pokazujemy rwnie w jaki sposb PHP
przetworzy cza.
Wydruk 7.5. Przykady automatycznego uzupeniania czy przez PHP
<?php
session_start();
session_register( "aUser", "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Uzupenianie adresw URL</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
<br><br>
<a href="listing2.phtml">cze 1</a>
<br><br>
<a href="listing2.phtml?MyVar=1234">cze 2</a>
<br><br>
<a href="http://www.php.net/">cze 3</a>
<br><br>
<a href="http://localhost/listing2.phtml">cze 4</a>
<br><br>
<form action="listing2.phtml">
<input type="submit" name="Submit"
value="Przycisk przesania danych formularza">
</form>
</html>
Po uruchomieniu skryptu, do przegldarki zosta wysany nastpujcy kod HTML:
<html>
<head>
<title>Uzupenianie adresw URL</title>
</head>
<body>
Uytkownik: Cidnie<br>Konto: 1016<br> <br><br>
<a href="listing2.phtml?PHPSESSID=9771f86dc94e367cf1c62e0339d02c4b">cze 1</a>
<br><br>
<a href="listing2.phtml?MyVar=1234&PHPSESSID=9771f86dc94e367cf1c62e0339d02c4b">
cze 2</a>
<br><br>
<a href="http://www.php.net/">cze 3</a>
<br><br>
<a href="http://localhost/listing2.phtml">cze 4</a>
<br><br>
<form action="listing2.phtml"><INPUT TYPE="HIDDEN" NAME="PHPSESSID"
VALUE="9771f86dc94e367cf1c62e0339d02c4b">
<input type="submit" name="Submit"
value="Przycisk przesania danych formularza">
</form>
</html>
Poniewa pierwsze dwa cza s czami wzgldnymi, zostay do nich doczone dane na temat sesji.
cze 3 nie jest oczywicie czem wzgldnym, wic identyfikator sesji nie zosta doczony. Dziaanie takie byo
przewidziane. cze 4 pokazuje jak ostronym naley by uywajc funkcji automatycznego uzupeniania czy.
W tym przypadku jest to bezwzgldny adres URL, chocia strona ta znajduje si na tym samym serwerze. PHP
uzupenia jedynie adresy URL zapisane w postaci czy wzgldnych.
Do przykadu zosta doczony formularz, poniewa PHP potrafi rwnie uzupenia formularz tak, aby
zawiera on warto identyfikatora sesji. Oznacza to, e aplikacja korzystajca z formularzy rwnie bdzie
prawidowo dziaaa. Jedyn wad tego mechanizmu jest to, e dziaa on jedynie dla metody POST. Jeeli bdziesz
chcia uy formularza korzystajcego z metody GET, aplikacja nie bdzie dziaaa prawidowo. Mimo, e atrybut
ACTION zostanie prawidowo zmodyfikowany, przegldarka nie dodaje zmiennej PHPSESSID do cigu zapytania
(przetestowane na najnowszych wersjach Netscape i Internet Explorer).
Rozdzia 7 Sesje i stan aplikacji
84

Przesyanie identyfikatora sesji za pomoc metod GET i POST pozwala unikn niektrych problemw z
cookie i jest atwe do zrealizowania. Jeeli zamierzasz skorzysta z automatycznego uzupeniania adresw,
powiniene rwnie si zastanowi, jaki wpyw bdzie to miao na wydajno aplikacji. PHP musi przecie
podczas kadego uruchomienia strony odszuka wszystkie cza na stronie i zmieni URL.
Aby sprawdzi wpyw tego mechanizmu na wydajno stworzyem przykadow stron WWW oraz
skrypt, ktry odczytywa j z serwera i zapamitywa czas potrzebny na jej odczytanie. Przykadowa strona
zawieraa 14 czy z ktrych 12 byo czami wzgldnymi, ktre wymagay przepisania. Strona miaa wielko
9,55 kB. Uyem skryptu z wydruku 7.6 do odczytania strony kolejno 1000 razy. Skrypt uruchamiaem z aktywn
opcj --enable-trans-sid, oraz bez niej.
Wydruk 7.6. Skrypt do sprawdzania wydajnoci
<?php
function getmicrotime()
{
$mtime = microtime();
$mtime = explode( " ", $mtime);
$mtime = $mtime[1] + $mtime[0];
return ($mtime);
}
$aStartTime = getmicrotime();
$aFileName = "http://localhost/ch07/listing5.phtml";
for ($nIndx = 0; $nIndex < 1000; $nIndex++)
{
$aData = file( $aFileName );
}
$aEndTime = getmicrotime();
$aTotTime = $aEndTime - aStartTime;
print( "Czas cakowity: $aTotTime\n");
?>
Test by uruchamiany wiele razy, aby obliczy redni rnic czasw wykonania. Zanotowano rednio
9% zysk wydajnoci w przypadku zablokowania opcji --enable-trans-sid. Mimo, e rnica taka moe by w
wikszoci witryn mao znaczca, moe ona by wana w przypadku silnie obcionych witryn. Zanim
zastosujesz ktre z rozwiza, powiniene przeprowadzi wasne testy sprawdzajce wpyw zastosowanego
mechanizmu na wydajno.
Bd w PHP
Jak wspominalimy w tej czci, PHP wersja 4.0.1 poziom poprawek 2, zawiera bd w mechanizmie automatycznego uzupeniania
adresw URL. Bd ten poprawiono w wersji 4.0.2. Jeeli chcesz korzysta z tej funkcji, upewnij si, e masz zainstalowan waciw
wersj PHP.
Zapisywanie zmiennych sesji w bazie danych
Po wybraniu mechanizmu przesyania identyfikatora sesji, naley zdecydowa, gdzie bd zapisywane
wartoci samych zmiennych sesji. PHP posiada mechanizm zapisywania zmiennych sesji w dowolnie wybrany
sposb. Do napisania dowolnego mechanizmu obsugi sesji wystarczy zdefiniowa sze funkcji i zarejestrowa
je w PHP. Funkcje te wraz z ich parametrami s przedstawione poniej.
bool open( string save_path, string sess_name ); Funkcja ta jest wywoywana w trakcie inicjalizacji
sesji. Mona jej uy do wstpnej inicjalizacji sesji. Pierwszy argument jest ciek podan w jako
warto zmiennej konfiguracji session.save_path okrelonej w pliku php.ini, lub ostatnia warto
przekazana do funkcji session_save_path(). Drugi argument jest nazw sesji okrelon przez parametr
session.name zdefiniowany w pliku php.ini, lub ostatni wartocia przekazan do funkcji session_name().
Wartociami domylnymi s odpowiednio /tmp i PHPSESSID.
bool close(); Funkcja jest wywoywana w celu zakoczenia sesji.
mixed read( string sess_id ); Funkcja jest uywana do odczytania zawartoci sesji. Jeeli dane sesji nie
s dostpne, powinien zosta zwrcony pusty cig (""). Jeeli wystpi bd, powinna zosta zwrcona
warto False. Jeeli istniej dane sesji, powinny zosta zwrcone w postaci serializowanej. Dane te
powinny by dokadnie takie same, jak przekazane przez PHP do funkcji write().
bool write( string sess_id, string value ); Funkcja jest wywoywana w przypadku koniecznoci
zapamitania danych sesji. Dane przekazane do parametru value s danymi sesji w postaci serializowanej.
PHP Kompendium wiedzy
85

bool destroy( string sess_id ); Funkcja jest wywoywana podczas wywoania w skrypcie funkcji
session_destroy(). Powinna usun wszystkie dane zwizane z sesj.
bool gc( int max_lifetime ); Funkcja ta jest wywoywana w czasie rozpoczynania sesji. Jest ona
wywoywana z czstotliwoci okrelon przez parametr konfiguracji session.gc_probability. Funkcja
jest przeznaczona do usuwania nieuywanych danych sesji. Podczas swojego dziaania powinna usun
wszystkie dane nie uywane przez max_lifetime sekund. Usuwanie niepotrzebnych danych sesji jest
omwione w nastpnej czci rozdziau.
Po utworzeniu funkcji obsugi sesji naley zarejestrowa je za pomoc funkcji
session_set_save_handler(). Po tej operacji PHP bdzie wywoywao wszdzie tam gdzie jest to potrzebne nowe
funkcje. Do zilustrowania tego mechanizmu przygotowany zosta skrypt na wydruku 7.7, ktry zawiera 7 funkcji
obsugi zmiennych, ktre jedynie wypisuj swoj nazw i parametry wywoania. Funkcja read() z tego skryptu
zwraca dla celw testowych wartoci dwch zmiennych sesji.
Wydruk 7.7. Zdefiniowany przez uytkownika mechanizm obsugi sesji: mysession.php
<?php
function mysess_open( $aSavePath, $aSessionName )
{
print( "mysess_open( $aSavePath, $aSessionName )<br>" );
return True;
}
function mysess_close()
{
print( "mysess_close()<br>" );
return True;
}
function mysess_read( $aKey )
{
print( "mysess_read( $aKey )<br>" );
return "aUser|s:6:\"Cidnie\";aAccount|s:4:\"1016\";";
}
function mysess_write( $aKey, $aVal )
{
print( "Wywoanie mysess_write!\n\nWanie tutaj!\n\n" );
print( "mysess_write( $aKey, $aVal )<br>" );
return True;
}
function mysess_destroy( $aKey )
{
print( "mysess_destroy( $aKey )<br>" );
return True;
}
function mysess_gc( $aMaxLifetime )
{
print( "mysess_gc( $aMaxLifetime )<br>" );
return True;
}
session_set_save_handler( "mysess_open", "mysess_close", "mysess_read",
"mysess_write", "mysess_destroy", "mysess_gc" );
?>
Aby pokaza w jaki sposb PHP wywouje nowe funkcje, uyjemy skryptu z wydruku 7.8. Dodatkowo
ustawiem warto session.gc_probability na 100, wic funkcja czyszczenia pamici jest wywoywana na
pocztku kadej sesji.
Wydruk 7.8. Testowanie mysession.php
<?php
include( "./mysession.php" );
session_start();
?>
<html>
<head>
<title>Wasny mechanizm obsugi sesji</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
$aUser = "Katie";
$aAccount = "2026";
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
</body>
</html>
Rozdzia 7 Sesje i stan aplikacji
86

Rysunek 7.4. Wynik
dziaania skryptu
mysession.php

Gdy uruchomiem ten skrypt, wynik nie by taki, jakiego si spodziewaem. W przegldarce nie byo
informacji na temat wywoania funkcji write() i close(). Jak mona zauway dodaem nawet dodatkow
instrukcj print() aby dokadniej sprawdzi co si stao. Wynik w przegldarce jednak nadal nie by prawidowy.
Po dokadniejszym sprawdzeniu odkryem, e wynik dziaania obu funkcji znajduje si w pliku error_log serwera
Apache. Oznacza to, e w ktrym momencie wyjcie zostao tymczasowo przekierowane z stdout na stderr. W
wyniku tego przekierowania nie mona wysa adnych danych do przegldarki zarwno w funkcji write(), jak i
close(). Problem ten jednak nie wpywa na waciwy system obsugi sesji. Trzeba powiedzie, e ten efet moe
nie powtrzy si w przypadku uycia innej platformy i serwera, poniewa sposb obsugi standardowego
wyjcia danych i bdw moe by inny. Na przykad w przypadku serwera Xitami dziaajcego na Windows
widoczne byy wszystkie spodziewane dane.
Po poznaniu zasady dziaania mechanizmu, stworzenie prawdziwego mechanizmu obsugi sesji bdzie
dosy atwe. Jeeli chcesz uywa zmiennych sesji, powiniene przechowywa je w bazie danych a nie w pliku.
Idea ta moe by z pocztku mao zrozumiaa, ale naley pamita, e zapisywanie danych aplikacji na serwerze
WWW moe ogranicza skalowalno aplikacji. Jeeli aplikacja zostanie rozdzielona na kilka serwerw WWW i
zastosowany zostanie mechanizm rwnowaenia obcienia pomidzy serwerami, uycie plikw do obsugi sesji
moe spowodowa zaamanie aplikacji. Awaria ta bdzie wynikaa z tego, e kade danie moe by kierowane
do innego serwera w klastrze. Jeeli pocztkowe dane zostan zapisane na serwerze pierwszym, a kolejne danie
bdzie przekazane do serwera dwa, to dane sesji bd nieosigalne. Jeeli wszystkie dane sesji bd
przechowywane w bazie danych, zmienne sesji bd dostpne dla wszystkich serwerw WWW w klasterze.
Nastpny wydruk zawiera prosty przykad uycia bazy danych MySQL do przechowywania danych sesji.
W celu poprawienia czytelnoci kodu, przykad korzysta z klasy DB_Sql pochodzcej z pakietu PHPLIB
omwionej w rozdziale 6 Wsppraca z bazami danych. Do przechowywania danych sesji korzystamy z tabeli
zdefiniowanej w nastpujcy sposb:
CREATE TABLE Sessions
(
SessionId char(32) not null,
LastUpdated datetime not null,
DataValue text,
PRIMARY KEY (SessionID),
INDEX (LastUpdated )
);
Tabela ta zawiera pole do przechowywania identyfikatora sesji, pole data/czas do zapamitywania czasu
ostatniej zmiany oraz dane w postaci pola tekstowego typu BLOB. Pole LastUpdated posiada indeks w celu
poprawienia wydajnoci w trakcie odzyskiwania nieuytkw. Cay kod funkcji obsugi sesji zamieszczony jest na
wydruku 7.9.
Wydruk 7.9. Obsuga sesji przy uyciu bazy danych MySQL
<?php
include ( "db_mysql.inc" );
// Specjalizacja klasy DB_Sql do wykorzystania na naszym
// serwerem bazy danych MySQL
class MySQLDB extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
PHP Kompendium wiedzy
87
var $User = "root";

var $Password = "root";
}
function mysess_open( $aSavePath, $aSessionName )
{
// nie trzeba nic robi
return True;
}
function mysess_close()
{
// nie trzeba nic robi
return True;
}
function mysess_read( $aKey )
{
$aDB = new MySQLDB;
$aSQL = "select DataValue from Sessions where SessionID='$aKey'";
$aDB->query( $aSQL );
if ( $aDB->num_rows() == 1 )
{
$aDB->next_record();
$aData = $aDB->f( "DataValue" );
return $aData;
}
else
{
// Wstaw wiersz dla biecej sesji aby uproci funkcj write
$aSQL = "insert into Sessions values ( '$aKey', NOW(), '' )";
$aDB->query( $aSQL );
return "";
}
}
function mysess_write( $aKey, $aVal )
{
$aDB = new MySQLDB;
$aData = addslashes( $aVal );
$aSQL = "update Sessions set DataValue='$aData', ";
$aSQL .= "LastUpdated=NOW() where SessionID='$aKey'";
$aDB->query( $aSQL );
return True;
}
function mysess_destroy( $aKey )
{
$aDB = new MySQLDB;
$aSQL = "delete from Sessions where SessionID = '$aKey'";
$aDB->query( $aSQL );
return True;
}
function mysess_gc( $aMaxLifetime )
{
$aDB = new MySQLDB;
$aSQL = "delete from Sessions where UNIX_TIMESTAMP(NOW()) ";
$aSQL .= "- UNIX_TIMESTAMP(LastUpdated) > $aMaxLifetime";
$aDB->query( $aSQL );
return True;
}

session_set_save_handler("mysess_open", "mysess_close", "mysess_read",
"mysess_write", "mysess_destroy", "mysess_gc");
?>
Kod z wydruku jest cakiem prosty jak na tak du zmian mechanizmu obsugi sesji. Funkcje
mysess_open() i mysess_close() nie s w tym przypadku uywane, poniewa nie s potrzebne. Wszystkie dane
sesji s przechowywane w jednej tabeli, wic wartoci przekazane do mysess_open() nie s uywane, a po
zakoczeniu sesji nie trzeba niczego usuwa.
Interesujcymi funkcjami s mysess_read(), mysess_write(), mysess_destroy() oraz mysess_gc(). W
funkcji mysess_read() do bazy jest kierowane zapytanie majce za zadanie odczyta dane zwizane z
identyfikatorem sesji. Jeeli dane te zostan odnalezione s zwracane. Jeeli nie ma jeszcze rekordu w bazie,
tworzony jest nowy rekord z pustym polem DataValue i zwracany jest pusty cig (""). Powodem takiego dziaania
jest to, e gdy pniej bd zapisywane dane sesji nie bdzie koniecznoci sprawdzania, czy istnieje ju
odpowiedni rekord w bazie danych.
Funkcja mysess_write() za kadym wywoaniem uaktualnia pola DataValue oraz LastUpdated. Funkcja
mysess_destroy() usuwa rekord zwizany z identyfikatorem sesji. Funkcja mysess_gc() usuwa wszystkie wiersze,
ktrych warto pola LastUpdated wskazuje e nie rekord nie by uaktualniany przez ostatnie $aMaxLifetime
sekund. Poniszy kod pokazuje sposb wykorzystania mechanizmu sesji partego o baz danych.
Rozdzia 7 Sesje i stan aplikacji
88
<?php

include( "./mysql_session.php" );
session_start();
session_register( "aUser", "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Obsuga sesji z wykorzystaniem MySQL: Strona pierwsza</title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );?>
<br><br>
<a href="mysql_session_mgmt2.phtml?<?=SID?>">Przejcie do nastpnej strony</a>
</body>
</html>
Poprzedni przykad pokazuje jak atwo mona utworzy i uywa wasny mechanizm przechowywania
danych sesji w PHP. W przykadzie tym mona zastosowa kilka optymalizacji i usprawnie ulepszajcych
dziaanie, ale przykady maj za zadanie pokaza ogln ide. Jeeli potrzebujesz w swojej aplikacji zastosowa
zmienne sesji, PHP zawiera rozwizania pozwalajce na dowoln implementacj takiego mechanizmu.
Inne funkcje i opcje dotyczce sesji
PHP posiada jeszcze kilka nie omwionych jeszcze funkcji obsugi sesji. Funkcje session_name(),
session_module_name(), session_save_path() i session_id() mog by uyte do odczytywania lub ustawiania
odpowiednio, biecej nazwy sesji, nazwy moduu, cieki zapisu i identyfikatora. Miaem kopot wymyli
projekt, w ktrym byaby zalecana zmiana tych parametrw w czasie pracy. Jeeli twoja zmienna posiada tak
duo zmiennych sesji, ze musisz korzysta z dzielenia ich przy pomocy tych funkcji powiniene powanie
rozway zastosowanie sugestii zamieszczonych w czci Inynieria programowania a sesje, umieszczony w
dalszej czci rozdziau.
W pliku php.ini znajduj si nastpujce opcje konfigurujce mechanizm sesji:
sessions.save_handler. Opcja ta pozwala na zdefiniowanie nazwy programu obsugi uywanego do
zapisywania i odczytywania danych zwizanych z sesj. Moliwe s wartoci files, user i mm. Opcja ta
moe by odczytywana lub zmieniana w czasie pracy za pomoc funkcji session_module_name().
Ustawienie jej wartoci na files powoduje zapisywanie danych sesji w pliku na serwerze WWW.
Ustawienie na user, oznacza, e aplikacja posiada wasny mechanizm obsugi. Warto mm powoduje
korzystanie z wsplnej pamici serwera WWW. Jeeli wywoasz funkcje session_set_save_handler(),
warto opcji jest niejawnie przestawiana na user. Wartoci domyln jest files.
session.save_path. Opcja okrela argument przekazywany do funkcji obsugi sesji. Jeeli uywasz
wbudowanego mechanizmu przechowywania danych, jest to nazwa katalogu gdzie s tworzone pliki.
Wartoci domyln jest /tmp.
session.name. Opcja okrela nazw sesji, uywan rwnie jako nazwa cookie. Powinna zawiera jedynie
znaki alfanumeryczne. Wartoci domyln jest PHPSESSID.
session.auto_start. Opcja okrela, czy modu sesji automatycznie uruchamia sesj na pocztku strony.
Domyln wartoci jest 0 (wyczony).
session.lifetime. Pozwala okreli w sekundach czas wanoci cookie wysyanego do przegldarki.
Warto 0 oznacza do zamknicia przegldarki. Wartoci domyln jest 0.
session.serialize_handler. Opcja pozwala na zdefiniowanie nazwy programu obsugi uywanego do
serializacji i deserializacji danych. Dostpny jest wewntrzny format PHP (o nazwie php) oraz WDDX (o
nazwie wddx). WDDX jest dostpny jedynie po skompilowaniu PHP z obsug WDDX. Wartoci
domyln jest php.
session.gc_probability. Opcja okrela prawdopodobiestwo w procentach uruchomienia funkcji gc
(usuwania nieuytkw) podczas obsugi dania. Usuwanie nieuytkw polega na usuwaniu zmiennych
sesji zapisanych na serwerze WWW. Poniewa czsto niemoliwe jest okrelenie, kiedy sesja si
zakoczya, PHP wywouje funkcj usuwania nieuytkw usuwajc zmienne sesji, ktre nie byy
uaktualniane przez okrelony czas (patrz session.gc_maxlifetime). Wartoci domyln jest 1, co
oznacza, e 1% uruchomie sesji powoduje wykonanie funkcji usuwania nieuytkw. Jeeli do
PHP Kompendium wiedzy
89

przesyania identyfikatora sesji uywane s metody GET i POST, naley zwikszy t warto. Powodem
tego jest moliwo zapisania jako zakadki adresu URL, ktry posiada doczony identyfikator sesji.
Prawdopodobnie nie chcesz, aby uytkownicy po duszym czasie kontynuowali star sesj.
session.gc_maxlifetime. Opcja okrela ilo sekund, po ktrych dane s uwaane za nieuytki i
usuwane. Domylnie jest to 1440 sekund (24minuty). W zalenoci od aplikacji moesz wydua lub
skraca ten czas.
session.referer_check. Opcja okrela, czy identyfikatory sesji odwoujce si do zewntrznych witryn s
usuwane. Jeeli identyfikator sesji jest przesyany w adresie URL, uytkownicy nie zdajc sobie sprawy ze
skutkw mog publikowa identyfikator sesji. Sytuacja taka moe prowadzi do problemw z
bezpieczestwem serwera, ktrych mona unikn stosujc t opcj. Domylnie jest ustawiona na 0.
session.entropy_file. Opcja pozwala na podanie cieki do zewntrznego rda (pliku), ktre bdzie
uywane jako dodatkowe rdo entropii do generowania identyfikatorw sesji. Mog to by /dev/random
lub /dev/urandom, dostpne we wielu systemach Unix.
session.entropy_length. Opcja pozwala okreli ilo bajtw, ktre naley odczyta z pliku okrelonego
w poprzedniej opcji. Domylnie jest to 0 (wyczone).
session.use_cookies. Opcja pozwala na zdecydowanie czy do przechowywania identyfikatora sesji na
komputerze klienta uywane bd cookie. Domylnie jest to 1 (wczone).
PHP zapewnia ogromn elastyczno przy obsudze sesji. Projektujc aplikacj korzystajc ze zmiennych
sesji naley rozway wszystkie dostpne opcje. Mimo, e uycie cookie wydaje si najprostszym rozwizaniem,
moe to spowodowa powane problemy, poniewa uytkownicy mog wyczy obsug cookie. Inne metody
przesyania identyfikatora sesji wymagaj wicej pracy, ale korzystne jest wczeniejsze planowanie. Polecam
metod przesyania identyfikatora sesji w adresie URL, poniewa metoda ta wymaga podjcia decyzji na temat
stron, ktre bd uyway mechanizmu sesji. Polecam rwnie uycie projektu witryny opartego na szablonach
(szczegy w rozdziale 12 Oddzielanie kodu HTML od PHP), poniewa powoduje on, e rczne przesyanie
identyfikatora sesji jest o wiele prostsze ni w przypadku projektu pokazanego w tym rozdziale.
Uycie PHPLIB do obsugi sesji
W rozdziale 6 Wsppraca z bazami danych przedstawialimy PHPLIB, jako wietn bibliotek
zawierajc niektre zaawansowane funkcje do tworzenia aplikacji opartych o PHP. PHPLIB bya jedn z
pierwszych (i prawdopodobnie najbardziej znan) bibliotek klas zawierajcych obsug sesji w PHP.
Koncepcyjnie jest ona podobna do rozwizania zastosowanego w PHP4. Obsuga sesji w PHPLIB jest oparta w
caoci o kod PHP, wic jest moliwa do rozbudowy i konfiguracji poprzez dziedziczenie i rozbudow klasy
bazowej. Posiada ona rwnie niektre opcje inicjalizacji, ktre mog by bardzo uyteczne w naszych
aplikacjach.
Obsuga sesji w PHPLIB oparta jest o klas kontenerow zdefiniowan w PHPLIB. Uywana jest jedna z
klas pochodnych po klasach CT_xxx, przeznaczonych do obsugi przechowywania zmiennych sesji. Powoduje to,
e PHPLIB mona rozszerzy w sposb, ktry pozwala na przechowywanie zmiennych sesji w praktycznie
dowolnym miejscu. PHPLIB wymaga rwnie, aby funkcje obsugi strony sygnalizoway pocztek i koniec
strony, oraz ktra z funkcji PHPLIB jest uywana na stronie.
Wydruk 7.10 zawiera skrypt ilustrujcy uycie PHPLIB do zapisu zmiennych sesji w bazie MySQL.
Przykad ten jest identyczny z przedstawionym na wydruku 7.9, oprcz tego, e korzysta on z cookie do
przechowywania identyfikatora sesji na komputerze klienta.
Wydruk 7.10. Obsuga sesji w PHPLIB
<?php
include( "page.inc" );
include( "ct_sql.inc" );
include( "session.inc" );
include( "db_mysql.inc" );
// Specjalizacja klasy DB_Sql do poczenia z
// naszym serwerem MySQL
class MySQLDB extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
Rozdzia 7 Sesje i stan aplikacji
90

var $Password = "root";
}
class MySQLCt extends CT_Sql
{
var $classname = "MySQLCt";
var $database_table = "active_sessions";
var $database_class = "MySQLDB";
}
class MySqlSession extends Session
{
var $classname = "MySqlSession"; // obsuga przechowywania
var $mode = "cookie";
var $lifetime = 0; // uycie cookie sesji
var $that_class = "MySQLCt"; // nazwa uywanego kontenera
}
page_open( array( "sess" => "MySqlSession" ) );
$sess->register( "aUser" );
$sess->register( "aAccount" );
$aUser = "Cidnie";
$aAccount = "1016";
?>
<html>
<head>
<title>Obsuga sesji w PHPLIB: Pierwsza strona </title>
</head>
<body>
<?php
print( "Uytkownik: $aUser<br>" );
print( "Konto: $aAccount<br>" );
?>
<br><br>
<a href="phplib_session_mgmt2.phtml">Nastpna strona</a>
</body>
</html>
<?php
page_close();
?>
PHPLIB jest niezmiernie elastycznym narzdziem do zarzdzania danymi sesji. Tak jak PHP posiada on
mechanizmy zapewniajce zapisywanie danych sesji w liku, pamici wspdzielonej oraz tabeli bazy danych. Kod
z wydruku 7.10 jest nieco bardziej skomplikowany, ale dowiadczeni programici na pewno zauwa, e jest on
bardzo atwo rozszerzalny poprzez dziedziczenie bazowych klas obsugi sesji. Pierwsza klasa pochodna, MySQLDB
jest klas niezbdn do nawizania poczenia z naszym serwerem bazy danych. Kolejna klasa, MySQLCt jest klas
pochodn po klasie kontenerowej CT_Sql, ktra jest podstawow klas kontenerow zapewniajc zapisywanie
danych w bazach danych SQL. Zawiera ona odwoanie do klasy MySQLDB, ktra jest uywana do zrealizowania
dostpu do tabel. Ostatnia klasa, MySQLSession rozszerza bazow klas Session i ustawia klas MySQLCt jako klas
zapisujc wszystkie dane sesji.
Tabela bazy danych wymagana przez mechanizm obsugi sesji w PHPLIB posiada nastpujc struktur:
CREATE TABLE active_sessions (
sid varchar(32) not null,
name varchar(32) not null,
val text,
changed varchar(14) not null,
PRIMARY KEY (name, sid),
KEY changed (changed)
);
Po utworzeniu klas pochodnych PHPLIB wykorzystuje funkcj page_open() do dodania funkcji sesji do
biecej strony. Wywoanie tej funkcji powoduje utworzenie globalnej zmiennej $sess, ktra jest
wykorzystywana w kolejnych wywoaniach obsugi sesji. Podstawowe funkcje klasy Session w PHPLIB s
praktycznie identyczne z moliwociami wbudowanego mechanizmu PHP. Po utworzeniu klasy rejestrowane i
wykorzystywane s zmienne sesji. Jedynym dodatkowym wymaganiem jest wywoanie w skrypcie funkcji
page_close() do zaznaczenia koca skryptu.
Tak jak we wbudowanym mechanizmie sesji PHP, PHPLIB pozwala na wykorzystanie cookie lub
zmiennych GET i POST do przesyania identyfikatora sesji. PHPLIB posiada rwnie narzdzia do tworzenia
klas kontenerowych uywanych do zapisywania zmiennych sesji na dowolnie wymylonym serwerze. Dodatkow
funkcja PHPLIB jest moliwo dostarczania pliku inicjalizujcego uywanego do inicjalizacji zmiennych sesji
na pocztku kadej sesji. Poniszy kod pokazuje przykad takiego pliku inicjalizujcego:
<?php
global $lang; // jzyk aplikacji
$lang = "pl"; // domylnie polski
$sess->register("lang");
PHP Kompendium wiedzy
91

global $cur; // waluta aplikacji
$cur = "PLN"; // domylnie zotwki
$sess->register("cur");
global $cart;
$cart = new Shop_Cart; // utworzenie obiektu wzka na zakupy
// zdefiniowanego w local.inc
$sess->register("cart"); // zarejestrowanie obiektu
?>
Mimo, e PHP posiada wbudowany mechanizm sesji zbliony do rozwizania zastosowanego w PHPLIB,
moe by przydatny dostp do caego kodu rdowego PHP, na przykad aby wykona niektre optymalizacje.
Moesz rwnie stosowa PHPLIB do realizowania sesji w starszych wersjach PHP, ktre nie posiadaj
wbudowanego mechanizmu sesji.
Tworzenie wasnego mechanizmu sesji
W niektrych przypadkach w aplikacji moe nie by potrzebny kompletny mechanizm sesji. W wielu
wypadkach jedyn dan, jak musimy przesya pomidzy stronami, jest klucz gwny lub identyfikator. W
takich przypadkach bardziej efektywne bdzie przesyanie identyfikatora pomidzy stronami aplikacji za pomoc
zmiennych GET i POST. Majc t warto moesz odczyta z bazy danych wszystkie potrzebne na stronie dane.
Rozwizanie to jest proste do zrealizowania i nie wymaga adnych dodatkowych narzutw
wprowadzanych przez przedstawione w tym rozdziale narzdzia obsugi sesji. Z drugiej strony, przesyanie
identyfikatora wymaga nieco dokadniejszego projektowania aplikacji. Dodatkowo przesyanie wartoci
identyfikatora otwartym tekstem moe powodowa naruszenie bezpieczestwa, wic korzystajc z tej metody
zaleca si uywanie odpowiedniej mechanizmu szyfrowania.
Tak jak w przypadku wszystkich innych aspektw projektowania aplikacji naley wykona dokadn
analiz potrzeb aplikacji i na jej podstawie wybra waciwy schemat zarzdzania sesjami. Wybr niewaciwego
narzdzia na pocztku caego procesu moe by kosztowne i prowadzi w duszej perspektywie do problemw z
konserwacj i rozwojem aplikacji.
Inynieria programowania a sesje
Zmienne sesji mog by niezmiernie istotne we wielu aplikacjach WWW. S one elastyczne i atwe do
uycia, ale tak jak wszystkie inne narzdzia programistyczne powinny by uywane ostronie i wedug projektu.
Poniewa zmienne sesji s bardzo atwe do uycia, czsto s naduywane w takim samym stopniu, jak zmienne
globalne przy pisaniu tradycyjnych aplikacji.
Projektujc aplikacj WWW naley szczegowo rozway wszystkie zastosowania, w ktrych naley
skorzysta ze zmiennych sesji. Decyzja uycia zmiennej sesji powinna by oparta na takich samych przesankach,
jak decyzja uycia zmiennej globalnej. Steve McConnell, autor ksiki Code Complete (Microsoft Press, 1993)
uwaa, e powodem uycia zmiennej globalnej mog by nastpujce przypadki:
Przechowywanie wartoci globalnych. Dane globalne, to dane odzwierciedlajce stan caej aplikacji, na
przykad tryb pracy (wersja prbna, pena). Moe by to due zbiory danych uywane w caej aplikacji, na
przykad tabele sownikowe.
Zastpowanie nazwanych staych. Poniewa PHP posiada stae, zastosowanie to nie jest dopuszczalne.
Uproszczenie uycia bardzo czsto uywanych danych. Czasami niektre dane s tak czsto uywane w
aplikacji, e wystpuj w licie parametrw kadej procedury.
Eliminowanie wdrujcych danych. Czasami wartoci s przekazywane do procedury tylko po to, aby
mogy by przekazane do kolejnej. Gdy procedury w takim acuchu nie korzystaj z takich danych, s
one nazywany danymi wdrujcymi.
Lista ta wskazuje powody rozwaane uycia zmiennych globalnych przy programowaniu zwykych
aplikacji, ale decyzja uycia zmiennej sesji powinna by oparta na tych samych kryteriach.
Bd ostrony przy uznawaniu zmiennej za zmienn sesji, poniewa wydaje si wystpowa w kadej
procedurze i na kadej stronie witryny WWW. Takie podejcie najczciej prowadzi do naduywania danych
globalnych i zmiennych sesji. Naley pamita, e po zdefiniowaniu w aplikacji zmiennych sesji, kada strona
biorca udzia w sesji musi zaadowa wszystkie zmienne sesji nawet, gdy nie korzysta z adnej. Naley rwnie
Rozdzia 7 Sesje i stan aplikacji
92

unika uycia zmiennych sesji jedynie dlatego, e zapewniaj one wygodniejszy dostp do danych zwizanych z
sesj.
W jednym z moich ostatnich kontraktw natrafiem na wietny przykad nieprawidowego uycia
zmiennych sesji. W aplikacji uytkownicy mogli utworzy zbir danych i udostpni je do modyfikacji przez
innego uytkownika. Uytkownicy, ktrym dane byy udostpniane byli doradcami, ktrym pierwsi uytkownicy
ufali. Gdy uytkownik udostpnia dane doradcy, dane o tym byy zapisywane w bazie danych. Tabela uprawnie
zawieraa identyfikator pierwotnego uytkownika i doradcy oraz identyfikator danych udostpnianych przez
uytkownika. Gdy doradca logowa si do aplikacji, musia na pocztku wybra zbir danych do ogldania. W
aplikacji byy ustawiane zmienne sesji, ktre zawieray identyfikator konta doradcy, oraz identyfikator
przegldanych danych klienta.
Jeeli te identyfikatory byyby jedynymi zmiennymi sesji, nie byo by problemu. Jednak kto zdecydowa,
aby nie korzysta z bazy danych do sprawdzania uprawnie i w zmiennej sesji przesyana bya lista zleconych
identyfikatorw danych. Za kadym razem, gdy doradca otwiera w programie zbir danych, lista ta bya
uaktualniana (wraz z tabel uprawnie). Nastpnie, gdy element danych by pobierany z bazy, jego identyfikator
by poszukiwany w zawartoci zmiennej sesji zamiast w bazie danych.
Gwnym problemem powodowanym przez takie podejcie byy kopoty z synchronizacj danych. Jeeli
pierwotny uytkownik uaktualni tabel uprawnie w czasie, gdy doradca by zalogowany w aplikacji, doradca
mia dostp tylko do danych zleconych w trakcie rozpoczynania sesji. Dodatkowo, rozwijanie aplikacji wedug
tego modelu byo frustrujce, poniewa programista nie wiedzia czy uywa danych z bazy danych czy ze
zmiennych sesji.
Takie niefortunne dziaanie byo spowodowane tym, e pierwszy programista nie zapewni realizacji
dwch celw. Po pierwsze, zmienne sesji zostay zastosowane, aby wyeliminowa odwoania do baz danych (aby
przyspieszy adowanie strony) przy pobieraniu danych o uprawnieniach. Po drugie, zmienne sesji byy uywane
do uproszczenia sprawdzania uprawnie w kodzie strony.
Pierwszy cel nie zosta zrealizowany, poniewa programista nie aduje jawnie zmiennych sesji, s one
automatycznie odczytywane z trwaego nonika. Na wszystkich stronach aplikacji dane o uprawnieniach s
adowane z serwera WWW i po zakoczeniu strony ponownie zapisywane. Proces ten powoduje, e nawet strony,
ktre nie korzystaj z uprawnie, s spowolnione przez proces adowania zmiennych sesji. adowanie danych
uprawnie z bazy danych jedynie na stronach, ktre wymagaj tych informacji, jest o wiele bardziej efektywne.
Drugi cel nie zosta speniony, poniewa programista nie korzysta w peni z wydajnoci bazy danych. Na
wielu stronach kod wyglda nastpujco:
WYIERZ wszystkie potrzebne dane z konta pierwotnego uytkownika
DLA KADEGO WIERSZA
JEELI identyfikator tego wiersza znajduje si na licie uprawnie w zmiennej sesji
wywietl lub wykorzystaj dane
W PRZECIWNYM WYPADKU
ignoruj ten wiersz, poniewa doradca nie powinien go widzie
Jak wspominalimy w rozdziale 6 Wsppraca z bazami danych, naley wykorzystywa moliwoci
bazy danych do poprawienia wydajnoci aplikacji. Poprzedni przykad kodu moe by zastpiony zapytaniem, w
ktrym tabela z danymi jest poczona z tabel z uprawnieniami. Spowoduje to usunicie ogromnej iloci kodu i
wyeliminuje konieczno przechowywania listy uprawnie w danych sesji.
Zmienne sesji s niezmiernie potrzebne przy programowaniu aplikacji WWW, ale powinny by uywane
rozwanie. W trakcie projektowania naley rozway wszystkie alternatywne sposoby uzyskana tego samego
efektu. Wikszo aplikacji WWW wymaga zastosowania tylko kilku zmiennych sesji. Gdy chcesz zastosowa
zmienn sesji, postaw sobie nastpujce pytania:
Czy ta zmienna jest uywana w caym programie? Jeeli ta warto jest uywana na kadej stronie
aplikacji, jest to wietny kandydat na zmienn sesji. Na przykad, jeeli aplikacja korzysta z logowania
uytkownikw, dobrze jest przechowywa identyfikator uytkownika w zmiennej sesji.
Czy zmienna ta jest unikalna dla tej sesji? Jeeli jest to na pewno dana zwizana z sesj, zapamitaj j w
zmiennej sesji. Na przykad, jeeli tworzysz wzek na zakupy, musisz prawdopodobnie przechowywa
jego identyfikator w zmiennej sesji. Jednak jeeli aplikacja korzysta z kilku trwaych wzkw na zakupy
w ktrych uytkownik moe przechowywa zamwienie w czasie kilku sesji, prawdopodobnie nie
potrzebujesz zmiennej sesji, ale dobrze zaprojektowanej bazy danych.
Czy dana jest dana kluczow? Pytanie to jest zwizane z pierwszym. Jeeli aplikacja korzysta ze
zmiennych sesji do przechowywania identyfikatora uytkownika, unikaj przechowywania innych danych
PHP Kompendium wiedzy
93

zwizanych z uytkownikiem w zmiennej sesji. Zamiast tego, w razie potrzeby skorzystaj z identyfikatora
do odczytania potrzebnych danych. Na przykad, jeeli aplikacja personalizuje strony, nie przechowuj
zmiennych potrzebnych do tego celu w sesji. Przechowuj w sesji identyfikator i wykorzystaj kilka funkcji
odczytujcych dane potrzebne do personalizacji. Struktura taka nie tylko eliminuje powtrzenia danych,
ale rwnie pozwala uytkownikowi na zmian swoich ustawie w jednej sesji i natychmiastowe
odzwierciedlenie tego w drugiej rwnolegej sesji.
Czy aplikacja na pewno potrzebuje zmiennych sesji? Pytanie to moe wydawa si oczywiste, ale czsto
jest pomijane z powodu atwoci uywania zmiennych sesji. To, e uytkownik przeglda witryn i
przeprowadza jakie operacje niekoniecznie oznacza, e potrzebna jest sesja. Zmienne sesji nie powinny
zastpowa innych mechanizmw przechowywania danych.
Jeeli odpowied na te pytania nie zgadza si z zasugerowanymi odpowiedziami, naley rozway
zastosowanie innych metod przechowywania danych. Sesje s wietnym narzdziem, ale nieprawidowo uywane
mog doprowadzi do stworzenia aplikacji penej bdw i trudnej do utrzymania.
Podsumowanie
W PHP dostpne jest kilka wietnych narzdzi do stworzenia mechanizmu sesji. Naley wybra
mechanizm, ktry najlepiej pasuje do potrzeb i ktrego zastosowanie bdzie przynosio owoce w duszym czasie
a nie tylko bdzie mia krtkoterminowy wpyw na kodowanie aplikacji. Nieprawidowe uycie zmiennych sesji
moe doprowadzi do stworzenia aplikacji trudnej do rozwijania, ktra posiada trudne do zidentyfikowania bdy.
Rozdzia 7 Sesje i stan aplikacji
94
Rozdzia 8. Uwierzytelnianie
Wstp
W poprzednim rozdziale Sesje i stan aplikacji omwione zostay sposoby ledzenia uytkownikw
witryny WWW w celu zapewnienia cigoci pracy aplikacji. Ten rozdzia powicony bdzie sposobom
upewnienia si, e uytkownicy maja wystarczajce uprawnienia do pracy w aplikacji.
Istniej rne schematy uwierzytelniania przeznaczone do rnych zada. Wikszo serwerw WWW
posiada narzdzia przeznaczone do autoryzacji uytkownikw w oparciu o uprawnienia i pliki serwera. W tym
rozdziale zajmiemy si uwierzytelnianiem opartym na mechanizmach serwera, ale jedynie w oparciu o serwer
Apache na Linuksie (Windows i IIS rwnie umoliwiaj uwierzytelnianie, ale nie zostanie ono tutaj opisane). W
dalszej czci rozdziau przedstawiony zostanie rwnie mechanizm niezaleny od serwera i platformy.
Podstawowe uwierzytelnianie w Apache
Rozdzia ten rozpoczniemy omwieniem podstawowego schematu uwierzytelniania dostpnego w
serwerze WWW Apache oraz problemami zwizanymi z t metod. Osoby znajce dyrektywy uwierzytelniania
Apache oraz przeznaczenie plikw .htaccess i innych plikw konfiguracyjnych serwera Apache nie dowiedz si
tutaj zbyt wiele nowego. Nawet w prostej witrynie moe by potrzebne ograniczenie dostpu do niektrych stron.
Wykorzystanie mechanizmu uwierzytelniania dostarczanego przez serwer WWW jest zwykle szybkim i
efektywnym sposobem zrealizowania takiego mechanizmu. Na przykad moe by niezbdne stworzenie zbioru
stron przeznaczonych do administracji witryn, za pomoc ktrych mona przeglda i zmienia wybrane
elementy witryny. Strony te nie mog by dostpne dla wszystkich uytkownikw, ale administrator musi mie
do nich dostp z dowolnej przegldarki.
Aby zrealizowa takie zaoenia moesz przenie wszystkie strony administracyjne do osobnego
podkatalogu w drzewie katalogw witryny WWW oraz zmieni konfiguracj Apache tak, aby dostp do stron
znajdujcych si w tym katalogu wymagay autoryzacji. Odpowiednie dyrektywy konfiguracji mog znajdowa
si w pliku httpd.conf lub .htaccess w chronionym katalogu. Jeeli masz dostp do plikw konfiguracyjnych
Apache powiniene skorzysta z nich zamiast z pliku .htaccess. Korzystanie z pliku .htaccess jest mniej
efektywne od wykorzystania standardowych plikw konfiguracyjnych, poniewa jest on odczytywany za kadym
daniem pliku z katalogu zawierajcego plik .htaccess. Jednak jeeli witryna jest umieszczona na
dzierawionym serwerze, prawdopodobnie nie bdziesz mg zmieni plikw konfiguracyjnych i zrestartowa
serwera WWW w celu pobrania zmienionej konfiguracji.
Na wydruku 8.1 zamieszczony jest wydruk prostej strony HTML zawierajcej cze do podkatalogu ze
stron administracyjn. Strona administracyjna znajduje si w katalogu wymagajcym uwierzytelniania, wic
kliknicie tego cza spowoduje, e przegldarka wywietli standardowe okno uwierzytelniania, pokazane na
rysunku 8.1. Wydruk 8.2 zawiera dyrektywy konfiguracji Apache ktre powoduj wywietlenie okna logowania.
Wydruk 8.1. Prosta strona HTML z czem do stron administracyjnych
<html>
<head>
<title>Proste uwierzytelnianie Apache</title>
</head>
<body>
<a href="admin/index.phtml">Przejd do strony administratora</a>
</body>
</html>
Wydruk 8.2. Dyrektywy konfiguracji Apache wczajce podstawowe uwierzytelnianie
AuthUserFile /www/auth_users
AuthName Adminstrative

AuthType Basic
<Limit GET>
require valid-user
</Limit>
Rysunek 8.1. Okno
dialogowe
uwierzytelniania w
przegldarce

Wicej informacji na temat uycia uwierzytelniania Apache mona znale w Sieci oraz we wielu
wietnych ksikach powiconych serwerowi Apache. Ten rodzaj uwierzytelniania wymaga wsppracy
pomidzy przegldark i serwerem. Mechanizm ten wyglda nastpujco: gdy uytkownik musi zosta
autoryzowany, serwer WWW wysya danie 401 do przegldarki a przegldarka odpytuje uytkownika i odsya
wprowadzone przez niego dane do serwera. Jeeli serwer zaakceptuje uwierzytelnianie, chroniony zasb jest
udostpniony uytkownikowi. Przegldarka wysya wprowadzone dane do serwera podczas dania sprowadzenia
wszystkich kolejnych stron a do zakoczenia pracy przegldarki.
PHP posiada zmienne globalne, ktrych moesz uy w aplikacji w celu odczytania danych autoryzacji.
Moesz skorzysta ze zmiennych $PHP_AUTH_USER oraz $PHP_AUTH_PW do odczytania nazwy uytkownika i hasa.
Wydruk 8.3 zawiera stron wywietlajca dane autoryzacji. Na rysunku 8.2. pokazana jest zawarto tej strony po
przejciu do niej poprzez cze znajdujce si na stronie z wydruku 8.1.
Wydruk 8.3. Wywietlanie zawartoci zmiennych autoryzacji
<html>
<head>
<title>Strona administratora</title>
</head>
<body>
<h1>Witamy na stronie administratora</h1>
<?php
print( "PHP_AUTH_USER: $PHP_AUTH_USER<br>" );
print( "PHP_AUTH_PW: $PHP_AUTH_PW<br>" );
?>
</body>
</html>
Rysunek 8.2.
Zmienne
autoryzacji w PHP

Schemat autoryzacji Apache zapewnia podstawowy stopie bezpieczestwa witryny. Jest on szczeglnie
uyteczny w sytuacjach, gdy chcesz chroni wszystkie strony i inne zasoby znajdujce si we fragmencie drzewa
Rozdzia 8 Uwierzytelnianie
96

katalogw witryny. Ograniczeniem stosowania tej metody jest konieczno dodawania i usuwania uytkownikw
poprzez wykonanie odpowiednich polece na serwerze. W nastpnej czci zostanie opisane w jaki sposb mona
wykorzysta PHP do aktualizacji pliku hase, co pozwoli na stworzenie narzdzia WWW do dodawania i
usuwania uytkownikw.
Aktualizacja pliku .htaccess przy uyciu PHP
Jeeli podstawowe uwierzytelnianie serwera WWW jest wystarczajce w tworzonej aplikacji, mona przy
uyciu PHP stworzy narzdzie administracyjne upraszczajce zarzdzanie uytkownikami. Mona udostpni to
narzdzie zaufanym osobom, ktrzy bd mogli operowa uytkownikami bez koniecznoci udostpniania im
bezporedniego dostpu do serwera.
Programici zespou The Webmasters Net (http://www.theWebmasters.net/) stworzyli dwie klasy suce
do zarzdzania uytkownikami i grupami plikw dla celw podstawowego uwierzytelniana. Do manipulacji
standardowym plikiem Apache htpasswd mona wykorzysta klas Htpasswd. Na wydruku 8.4 pokazany zosta
przykad, jak mona wykorzysta t klas do autoryzacji uytkownika, przy uyciu bardzo maej iloci kodu.
Przykad korzysta z tego samego pliku, ktry zosta uyty w poprzednim przykadzie.
Wydruk 8.4. Sprawdzanie poprawnoci autoryzacji uytkownika za pomoc klasy Htpasswd
<html>
<head>
<title>Szybkie sprawdzenie uytkownika z uzyciem klasy Htpasswd</title>
</head>
<body>
<?php
include( "./class.Htpasswd.php3" );
$aHTPasswd = new Htpasswd("/www/auth_users");
if ( !$aHTPasswd->EXISTS )
{
print( "Bd autoryzacji<br>" );
}
else
{
if ( $aHTPasswd->verifyuser( "phpbook", "phpbook" ) )
{
print( "phpbook to prawidowy uytkownik<br>" );
}
else
{
print( "phpbook nie jest prawidowym uytkownikiem<br>" );
}
}
?>
</body>
</html>
Klas Htpasswd mona rwnie wykorzysta do dodawania nowych uytkownikw, usuwania
uytkownikw, zmiany hasa, sprawdzania poprawnoci uytkownika oraz zmiany jego nazwy. Przy pomocy tej
klasy mona napisa obszerne narzdzie do administracji uytkownikami, ktre bdzie pomocne przy zarzdzaniu
mechanizmem podstawowego uwierzytelniania serwera. Skrypty na wydruku 8.5, 8.6 i 8.7 zawieraj skrypty
pokazujce, w jaki sposb mona poczy wszystkie te operacje w jednym formularzu.
Wydruk 8.5 zawiera pierwsz cz skryptu. Jest ona uywana do inicjalizacji skryptu i okrelenia czy
strona jest ogldana pierwszy raz, czy zostaa wywoana w wyniku dania POST. Skrypt ten jest podobny do
wielu przytoczonych do tej pory przykadw, ktre przesyaj dane do samego siebie i s uywane zarwno do
wywietlania jak i do zmiany danych.
Wydruk 8.5. Uycie klasy Htaccess do zarzdzania uytkownikami
<?php
include( "./class.Htpasswd.php3" );
$aHTPasswd = new Htpasswd("/www/auth_users");
if ( !$aHTPasswd->EXISTS )
{
print( "Bd krytyczny<br>" );
exit;
}

if ( $REQUEST_METHOD == 'POST' )
{
switch ( $acttype )
PHP Kompendium wiedzy
97
{

case 'none' :
break;
case 'add' :
$aHTPasswd->addUser( $NewUserName, $NewUserPass );
print( "<b>Dodano uytkownika $NewUserName</b><br>" );
break;
case 'delete' :
$aUserName = $aHTPasswd->USERS[$CurUserRow]["user"];
$aHTPasswd->deleteUser( $aUserName );
print( "<b>Usunito uytkownika $aUserName</b><br>" );
break;
case 'rename' :
$aUserName = $aHTPasswd->USERS[$CurUserRow]["user"];
$aHTPasswd->renameUser( $aUserName, $RenameName );
print( "<b>Nazwa uytkownika zmieniona z $aUserName
na $RenameName</b><br>" );
break;
case 'changepass' :
$aUserName = $aHTPasswd->USERS[$CurUserRow]["user"];
$aHTPasswd->changePass( $aUserName, $ChangePass );
print( "<b>Zmieniono haso dla uytkownika $aUserName</b><br>" );
break;
}
}
?>
Jeeli skrypt ten zostanie wywoany w wyniku dania POST, na podstawie wartoci zmiennej formularza
$acttype podejmowana jest decyzja co do kolejnej akcji. Zmienna posiada pi moliwych wartoci: none, add,
delete, rename oraz changepass. W zalenoci od wyboru uytkownika podejmowana jest odpowiednia akcja. W
skrypcie zaoono, e wszystkie potrzebne dane s prawidowo wypenione. Oczywicie, aby program mg by
normalnie uywany niezbdne jest dodanie kodu kontroli poprawnoci.
W nastpnej czci skryptu ustawiana jest zmienna $acttype. Dla wszystkich przyciskw znajdujcych si
na formularzu zdefiniowana jest odpowiednia akcja. Do ustawiania ukrytej zmiennej formularza $acttype
wykorzystujemy JavaScript.
Wydruk 8.6. Ustawianie zmiennej $acttype
<html>
<head>
<title>Prosty program zarzdajcy uytkownikami</title>
<script language="JavaScript">
<!--
function DoSubmit( aType )
{
document.mainform.acttype.value = aType;
document.mainform.submit();
}
//-->
</script>
</head>
Ostatnia cz skryptu pokazana na wydruku 8.7 jest po prostu stron HTML zawierajc formularz. Kod
PHP jest jedynie uywany do wstawiania istniejcych uytkownikw do listy SELECT. Kady przycisk na
formularzu zawiera atrybut onClick, ktry powoduje wywoanie przedstawionej funkcji JavaScript, ktra realizuje
wysanie danych formularza do odpowiedniej strony.
Wydruk 8.7. Strona z formularzem HTML
<body>
<form action="<?=$PHP_SELF?>" method="post" name="mainform" id="mainform">
<input type="hidden" name="acttype" value="none">
<h1>Prosty program zarzdzajcy uytkownikami</h1>
<h2>Dodanie uytkownika</h2>
Nazwa nowego uytkownika: <input type="text" name="NewUserName"><br>
Haso: <input type="password" name="NewUserPass"><br>
<input type="button" value="Dodaj" onClick="DoSubmit( 'add' );">
<hr>
<h2>Zmiana uytkownika</h2>
<table>
<tr>
<td>
<select name="CurUserRow" size="10">
<?php
$nIndex = 0;
foreach( $aHTPasswd->USERS as $aUser )
{
print( "<option value=\"$nIndex\">$aUser[user]</option>" );
$nIndex++;
}
Rozdzia 8 Uwierzytelnianie
98
?>

</select>
</td>
<td>
Usunicie zaznaczonego uytkownika:
<input type="button" value="Usu" onClick="DoSubmit( 'delete' );">
<br><br>
Zmiana nazwy zaznaczonego uytkownika:
<input type="text" name="RenameName"><input type="button"
value="Zmiana nazwy" onClick="DoSubmit( 'rename' );"><br><br>
Zmiana hasa dla zaznaczonego uytkownika: <input type="password"
name="ChangePass"><input type="button" value="Zmiana hasa"
onClick="DoSubmit( 'changepass' );"><br><br>
</td>
</tr>
</table>
</form>
</body>
</html>
Na rysunku 8.3. pokazana jest strona bezporednio o dodaniu uytkownika scott. Jak mwilimy
wczeniej, skrypt ten nie jest kompletnym narzdziem zarzdzajcym uytkownikami, a jedynie pokazuje sposb
wykorzystania klasy Htpasswd. Mona rwnie skorzysta z dostarczanej przez The Webmasters Net klasy
Htgroup do tworzenia i zarzdzania grupami uytkownikw.
Rysunek 8.3.
Program
zarzdzajcy
uytkownikami
w dziaaniu
Podstawowe uwierzytelnianie za pomoc PHP
Poprzednie dwie czci opisyway podstawowe uwierzytelnianie serwera Apache do ochrony fragmentw
witryny WWW (zwykle katalogw). W niektrych przypadkach moe by wymagane zabezpieczenie tylko
niektrych stron aplikacji lub nie jest moliwa modyfikacja odpowiednich plikw na serwerze WWW. W takim
przypadku moesz wykorzysta PHP do wysyania odpowiednich nagwkw do serwera i w ten sposb
bezporednio da autoryzacji.
PHP Kompendium wiedzy
99

Tak jak w przypadku wysyania innych danych nagwka, naley albo wysya dane nagwkw przed
wysaniem jakichkolwiek danych strony, albo korzysta z buforowania wyjcia. Na wydruku 8.8 zamieszczony
jest prosty skrypt dajcy autoryzacji. Skrypt ten jest w postaci pliku doczanego, auth_include.inc, wic bdzie
go mona atwo dodawa do wszystkich stron wymagajcych autoryzacji.
Wydruk 8.8. Skrypt auth_include.php
<?php
$aDoAuth = True;
if ( isset( $PHP_AUTH_USER ) )
{
if ( ( $PHP_AUTH_USER == "ryan" ) &&
( $PHP_AUTH_PW == "dentist" ) )
{
// prawidowa nazwa uytkownika i haso
$aDoAuth = False;
}
}
if( $aDoAuth == True )
{
Header( "WWW-Authenticate: Basic realm=\"My Realm\"" );
Header( "HTTP/1.0 401 Unauthorized" );
echo "Nie udao si zalogowanie do systemu.\n";
exit;
}
?>
Skrypt ten na pocztku pracy sprawdza, czy ustawiona jest zmienna $PHP_AUTH_USER. Jeeli tak, to
wartoci zmiennych $PHP_AUTH_USER i $PHP_AUTH_PW s porwnywane z prawidow nazw uytkownika i hasem
aplikacji. Jeeli sprawdzenie to si powiedzie, nie ma potrzeby wysyania do przegldarki nagwka autoryzacji.
Jeeli porwnanie nie uda si skrypt wysya do przegldarki nagwek HTTP 401, ktry powoduje wywietlenie
okna autoryzacji. Proces ten jest powtarzany a do podania waciwych danych autoryzacji, albo do przerwania
uwierzytelniania przez uytkownika. Doczenie tego pliku na pocztku dowolnego skryptu powoduje
konieczno autoryzacji uytkownika skryptu.
Prawdziwy system uwierzytelniania nie powinien mie zaszytych nazw uytkownikw i hase w samym
skrypcie. Zamiast tego naley wykorzysta baz danych lub usug katalogow (na przykad LDAP) lub nawet
pliki zawierajce dane uwierzytelniania.
Jedn z zalet takiego podejcia jest moliwo odwoania uwierzytelnienia uytkownika poprzez ponowne
wysanie nagwka HTTP 401. Mona to wykorzysta do ponownego logowania uytkownika po okrelonym
czasie bezczynnoci lub do chronienia rnymi hasami rnych czci aplikacji.
PHP posiada wystarczajco duo narzdzi i elastycznoci aby mona byo napisa dowolny system
autoryzacji uytkownikw. Poprzednia metoda jest oparta o moliwo obsugi przez przegldarki wywoa
HTTP 401 ale metoda ta posiada wiele ogranicze. Nastpna metoda jest bardziej niezalena od platformy i
posiada bardziej elastyczne podejcie do uwierzytelniania.
Kompletny system uwierzytelniania oparty o PHP
Wykorzystanie metody autoryzacji opisanej w poprzedniej czci jest atwe i proste. Wikszo
programistw WWW wykorzystywao ju pliki .htaccess do zabezpieczania katalogw, wic sposb ten jest
zwykle dobrze znany. W tej czci skupimy si na implementacji, ktra nie polega na wywoaniach HTTP 401 z
serwera, wymuszajcych na przegldarce wywietlenie okna uwierzytelniania. Gwnym powodem uycia tego
typu implementacji jest zwikszenie elastycznoci aplikacji.
Ponisza implementacja wykorzystuje klas Auth z PHPLIB. Jest to ekstremalnie solidna i elastyczna
implementacja, ale przez o wymaga sporo zachodu, zanim mona bdzie j wykorzysta. Jednak po jej
zaprogramowaniu jest wietnym zamiennikiem metody opisanej w poprzedniej czci. Jeeli nie korzystamy z
mechanizmw przegldarki przy wywietlaniu okna uwierzytelniania, musimy sami tworzy formularz HTML
sucy do pobierania danych niezbdnych dla naszej aplikacji. Dodatkowo, PHPLIB pozwala na stworzenie
autoryzacji opartej na uprawnieniach, wic do kadej strony mona przypisa wymagany poziom uprawnie dla
kadego z uytkownikw.
Mechanizm uwierzytelniania realizowany przez PHPLIB jest w wielu punktach podobny do mechanizmu
obsugi sesji. Do dziaania wymaga on sesji PHPLIB. Schemat autoryzacji PHPLIB jest uruchamiany podczas
wywoania funkcji PHPLIB page_open() i zadanie wasnoci sess. Gdy zostanie zadana ta wasno,
Rozdzia 8 Uwierzytelnianie
100

PHPLIB sprawdza zalogowanie uytkownika. Jeeli uytkownik nie podawa wczeniej danych autoryzacji,
PHPLIB wywietla zdefiniowan przez uytkownika stron. Strona ta pobiera dowolne dane, jakich aplikacja
wymaga do prawidowej autoryzacji uytkownika. Nastpnie PHPLIB wywouje dostarczon przez uytkownika
funkcj sprawdzajc uprawnienia uytkownika. Jeeli funkcja ta zaakceptuje uytkownika, PHPLIB wywietla
stron a w przeciwnym wypadku nastpuje ponowne uwierzytelnianie. Na rysunku 8.4. pokazana jest interakcja
pomidzy klientem, serwerem WWW (i tym razem jest to 1U z Penguin Computing) oraz aplikacj PHP.
Rysunek 8.4.
Interakcja w
schemacie
autoryzacji
PHPLIB
Z powodu elastycznoci jak zapewnia PHPLIB wymagane jest wykonanie kilku niezbdnych krokw
zanim uyjemy naszej klasy autoryzacji. Po pierwsze, na wydruku 8.9 pokazane s klasy zdefiniowane przez
uytkownika niezbdne do stworzenia klasy Auth i klas j wspomagajcych (Klasy sesji i bazy danych s
identyczne jak te, ktrych uywalimy w rozdziale 7). W naszym przypadku dane autoryzacji znajduj si w
tabeli bazy danych MySQL. Tabela uyta do autoryzacji jest zdefiniowana nastpujco:
CREATE TABLE MyAuth (
FirstName varchar(20) NOT NULL,
SurName varchar(30) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (FirstName, SurName)
);
Wydruk 8.9. Przygotowanie klas uywanych przez klas PHPLIB Auth
<?php
include( "page.inc" );
include( "ct_sql.inc" );
include( "session.inc" );
include( "db_mysql.inc" );
include( "auth.inc" );
class MySQLDB extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}
class MySQLCt extends CT_Sql
{
var $classname = "MySQLCt";
var $database_table = "active_sessions";
var $database_class = "MySQLDB";
}
class MySqlSession extends Session
{
var $classname = "MySqlSession"; // Obsuga przechowywania
var $mode = "cookie";
var $lifetime = 0; // uycie cookie sesji
var $that_class = "MySQLCt"; // wybr kontenera
var $allowcache_expire = 0;
}
class Sample_Auth extends Auth
{
var $classname = "Sample_Auth";
var $lifetime = 20; // 20 minut (0 == cigle)

function auth_loginform()
{
include( "./sample_lform.htinc" );
}

function auth_validatelogin()
{
global $FirstName, $SurName, $Password;

$aDB = new MySQLDB;
$aSQL = "select * from MyAuth where ( FirstName = ";
PHP Kompendium wiedzy
101
$aSQL .= "'$FirstName' ) and ( SurName = '$SurName' )";

$aSQL .= "and ( Password = '$Password' )";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
return $FirstName;
}
else
{
return False;
}
}
}
?>
Klasa Sample_Auth dziedziczca po klasie bazowej Auth zapewnia dziaanie specyficzne dla biecej
aplikacji. Zdefiniowane s odpowiednie funkcje auth_loginform() i auth_validatelogin(). Funkcja
auth_loginform() jest wywoywana, gdy klasa Auth wymaga uwierzytelnienia uytkownika. Moesz uy
instrukcji print() do stworzenia formularza HTML potrzebnego do zalogowania, ale zwykle doczenie pliku jest
atwiejsze. Na wydruku 8.10 pokazany jest plik uyty w tym przykadzie.
Wydruk 8.10. Przykadowy formularz logowania (sample_lform.htinc)
<?php
global $FirstName;
global $SurName;
$aCurFirstName = "";
$aCurSurName = "";
if ( !empty( $FirstName ) )
{
$aCurFirstName = $FirstName;
}
if ( !empty( $SurName ) )
{
$aCurSurName = $SurName;
}
?>
<html>
<head>
<title>Formularz autoryzacji dla PHPLIB</title>
</head>
<body>
<form action="<?=$this->url()?>" method="post">
<table>
<tr>
<td>
Imi:
</td>
<td>
<input type="text" name="FirstName" value="<?=$aCurFirstName?>">
</td>
</tr>
<tr>
<td>
Nazwisko:
</td>
<td>
<input type="text" name="SurName" value="<?=$aCurSurName?>">
</td>
</tr>
<tr>
<td>
Haso:
</td>
<td>
<input type="password" name="Password">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="Log In">
</td>
</tr>
<?php if ( !empty( $FirstName ) ) { ?>
<tr>
<td colspan="2">
<br><br>
Podane dane s nieprawidowe, sprbuj jeszcze raz..
</td>
</tr>
<?php } ?>
</table>
Rozdzia 8 Uwierzytelnianie
102

</form>
</body>
</html>
Strona ta jest zaprojektowana jedynie do wywietlania przez klas Auth. Na pocztku sprawdza, czy
zmiene formularza maj jakie wartoci. Moe to si zdarzy, gdy wywietlamy formularz po nieudanej
autoryzacji uytkownika W tym przypadku klasa Auth ponownie wywietla formularz logowania. Wartoci
zmiennych formularza s przenoszone do pl formularza FirstName i SurName jedynie z grzecznoci (ale
uytkownik nie musi ponownie wpisywa tych danych).
Nastpnie strona wywietla trzy pola tekstowe do wprowadzenia imienia, nazwiska i hasa uytkownika.
Dane formularza s wysyane do strony okrelonej przez $this->url(). W kontekcie tej strony zmienna $this
wskazuje na biecy obiekt klasy pochodnej po Auth. Funkcja url() zwraca stron, na ktrej by uytkownik
zanim obiekt klasy interweniowa i wywoa nasz stron autoryzacji. Na koniec definiujemy ostrzeenie jakie
zobaczy uytkownik gdy poda niewaciwe dane.
Gdy dane formularza zostan przesane do oryginalnej strony, Auth sprawdza ponownie dane autoryzacji.
Aby to zrobi wywouje ona zdefiniowan przez uytkownika funkcj auth_validatelogin(). Na wydruku 8.11
pokazujemy funkcj uyt w naszym przykadzie.
Wydruk 8.11. Funkcja auth_validatelogin()
function auth_validatelogin()
{
global $FirstName, $SurName, $Password;

$aDB = new MySQLDB;
$aSQL = "select * from MyAuth where ( FirstName = ";
$aSQL .= "'$FirstName' ) and ( SurName = '$SurName' )";
$aSQL .= "and ( Password = '$Password' )";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
return $FirstName;
}
else
{
return False;
}
}
Funkcja odwouje si do zmiennych globalnych $FirstName, $SurName i $Password, zdefiniowanych w
formularzu logowania. Ich wartoci s wyszukiwane w tabeli MySQL zawierajcej trzy kolumny: FirstName,
SurName i Password. Jeeli odnaleziony zostanie rekord w tabeli opisujcy biecego uytkownika, funkcja
auth_validatelogin() zwraca imi uytkownika (oczywicie uycie imienia jako identyfikatora uytkownika nie
byo by zbyt dobrym pomysem). Jeeli nie ma pasujcego rekordu, zwracana jest warto False.
Na wydruku 8.12 pokazana zostaa typowa strona WWW wykorzystujca o autoryzacji klas Auth. W
przykadzie wywietlane s cztery cza do innych podobnych stron, wymagajcych autoryzacji. Ostatnia strona z
listy zapewnia wylogowanie uytkownika.
Wydruk 8.12. Prosta strona wykorzystujca klas Auth
<?php
// bez buforowania (z witryny php.net)
include( "./auth_phplib.php" );
page_open( array( "sess" => "MySqlSession",
"auth" => "Sample_Auth" ) );
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache");
header ("Pragma: no-cache");
?>
<html>
<head>
<title>Przykad uycia klasy PHPLIB Auth</title>
<META HTTP-EQUIV="Expires" CONTENT="-1">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
</head>
<body>

<h2>Strona gwna</h2>
Posiadasz uprawnienia do ogldania tej strony!
<ul>
<li><a href="test_auth_phplib.phtml">Strona gwna</a></li>
<li><a href="test_auth_phplib2.phtml">Strona druga</a></li>
<li><a href="test_auth_phplib3.phtml">Strona trzecia</a></li>
<li><a href="test_auth_phplib_logout.phtml">Wylogowanie</a></li>
PHP Kompendium wiedzy
103

</ul>

</body>
</html>
<?php
page_close();
?>
Pierwsza strona docza prosty plik uwierzytelniania a nastpnie wywouje funkcj PHPLIB page_open(),
ktra uaktywnia sesj i mechanizm uwierzytelniania. Na kocu strony wywoywana jest funkcja page_close(),
ktra zapisuje dane sesji. Zmienne uwierzytelniania s przesyane pomidzy stronami przy pomocy mechanizmu
sesji. Druga i trzecia strona jest funkcjonalnie identyczna z pierwsz. Strona Wylogowanie, zawiera na dole strony
nastpujcy kod wymuszajcy wylogowanie uytkownika:
<?php
$auth->logout();
page_close();
?>
Funkcja $auth->logout() moe by wywoana w dowolnym momencie, a wymusza ona ponowne
wywoanie autoryzacji uytkownika na nastpnej stronie.
Kilka wierszy w tym przykadzie nie jest zwizane z mechanizmem uwierzytelniania. Wywoania funkcji
header() oraz znaczniki <META> zapewniaj, e przegldarka nie bdzie przechowywaa strony w buforze. Kod ten
jest dosy wany, poniewa buforowane strony mog myli uytkownikw, ktrzy nie bd wiedzieli, czy s ju
zalogowani. Szczeglne kopoty sprawia Microsoft Internet Explorer, wic podjto szczeglne rodki
zapewniajce prawidowe dziaanie przykadw. Podczas testowania tego przykadu nie stwierdzilimy adnych
problemw w IE 5.5, wszystkich wersjach Netscape, WebTV i Opera.
Jak wczeniej wspomnielimy, PHPLIB jest niezwykle elastycznym narzdziem, pozwalajcym na
stworzenie wasnego mechanizmu uwierzytelniania. Mona stworzy skomplikowane lub proste schematy
uwierzytelniania, w zalenoci od wymaga aplikacji. Zalet tego podejcia jest moliwo tworzenia wasnych
formularzy logowania, porwnywanie wpisanych danych z danymi przechowywanymi na dowolnym noniku
informacji, oraz moliwo atwego wylogowania uytkownika. Umieszczenie w aplikacji systemu zabezpiecze
wydaje si bardziej efektywne, szczeglnie dla pocztkujcych uytkownikw, ktrzy mog by zaskoczeni
systemowymi oknami dialogowymi.
Podsumowanie
W tym rozdziale zostao omwionych wiele aspektw uwierzytelniania uytkownikw w aplikacjach
PHP. Pierwsze kilka omwionych metod jest mocno zalene od platformy, ale s atwe do implementacji.
Ostatnia metoda, wymagajca uycia klas PHPLIB jest bardziej zoona, ale o wiele bardziej elastyczna i
cakowicie przenona pomidzy serwerami WWW i systemami operacyjnymi.
Jeeli aplikacja wymaga jakiego typu uwierzytelniania uytkownikw, powiniene w fazie projektowania
okreli specyficzne wymagania tej aplikacji. Niektre mechanizmy uwierzytelniania nie posiadaj
wystarczajcej elastycznoci. Inne mog nie zapewnia dostatecznego poziomu bezpieczestwa. Przy pomocy
tego rozdziau mona skojarzy twj potrzeby z oferowanymi przez poszczeglne metody moliwociami.
Rozdzia 8 Uwierzytelnianie
104
Rozdzia 9. Niezaleno od przegldarki
Wstp
Podczas pisania standardowych aplikacji interfejs uytkownika jest tworzony dla potrzeb aplikacji i
zwykle jest on przeznaczony dla jednej platformy. Nie przewiduje si niespodziewanych zmian tego interfejsu w
czasie dziaania programu w zalenoci od uytkownika, ktry uywa aplikacji. W czasie pisania aplikacji dla
WWW, interfejs uytkownika nie jest ju tak niezmienny, poniewa moe by on odtwarzany przez rne typy
przegldarek na rnych platformach. Tworzenie aplikacji niezalenej od przegldarki wymaga moliwoci
wykrywania typu przegldarka i wykorzystywania jej moliwoci.
Mimo, e wikszo nowoczesnych przegldarek bdzie wywietlao aplikacje w podobny sposb, zawsze
istniej rnice. Jeeli aplikacja wymaga jakiej wasnoci przegldarki, naley tak napisa aplikacj, aby
sprawdzaa typ uytej przegldarki i odpowiednio reagowaa. PHP pozwala na kilka metod wykrywania rodzaju
przegldarki, rozpoczynajc od stworzenia wasnego rozwizania do uycia narzdzi firm trzecich. W rozdziale
tym przedstawimy przykady wielu metod, z ktrych bdziesz mg wybra odpowiedni dla twojej aplikacji.
Rozpoczynamy
Na najbardziej podstawowym poziomie, PHP pozwala na odczytanie typu przegldarki poprzez zmienn
globaln $HTTP_USER_AGENT. Cig ten jest wysyany przez przegldark do serwera wraz z kadym daniem.
Jeeli wystarczy ci proste rozpoznanie typu przegldarki, mona wykorzysta bezporednio zmienn
$HTTP_USER_AGENT. Na przykad, sposb wykrycia przegldarki Internet Explorer przy uyciu porwnywania
cigw zamieszczony jest na wydruku 9.1.
Wydruk 9.1. Wywietlanie podstawowych danych na temat przegldarki
<html>
<head>
<title>Szybkie sprawdzenie typu przegldarki</title>
</head>
<body>
<?php
$aPos = strpos( $HTTP_USER_AGENT, "MSIE" ) ;
if ( $aPos === False )
{
print( "To <b>nie</b> jest MS Internet Explorer!<br>" );
}
else
{
print( "Przegldarka MS Internet Explorer!<br>" );
}
?>
</body>
</html>
W przykadzie tym sprawdzamy, czy przegldarka klienta to Internet Explorer. Przykad opiera si na tym,
e zwracana nazwa przegldarki w wikszoci wersji Internet Explorera zawiera fragment MSIE. Mona
wykorzysta t informacj do wywietlenia odpowiedniego komunikatu, lub przekierowa uytkownika do innej
czci witryny, ktra jest zoptymalizowana do wywietlania stron w okrelonej przegldarce. Metoda ta sprawdza
si w niektrych przypadkach, ale jest zbyt prosta, aby obsugiwa ogromn ilo prawidowych cigw user
agent. Kilka przegldarek zmienio format tego cigu podczas jednej ze zmiany wersji, wic rozpoznanie
okrelonej przegldarki moe by problematyczne, jeeli potrzebujesz dokadnej informacji o przegldarce. Na
przykad, niektre wersje Internet Explorera zawieray nastpujce cigi user agent:
Microsoft Internet Explorer/4.40.305beta (Windows 95)[en]

Mozilla/2.0 (compatible; MSIE 3.02; Update a; AOL 3.0; Windows 95)[en]
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)[en]
Rnice w zawartoci tego cigu powoduj, e sprawdzanie ich zawartoci staje si nieporczne. Istnieje
tak wiele kombinacji przegldarek, wersji, platform i jzykw, e dokadne rozpoznanie cho jednego
przegldarki staje si problematyczne.
W rzeczywistoci znajomo jedynie typu przegldarki nie jest tak wane. Zamiast tego lepiej wiedzie,
czy przegldarka obsuguje okrelone moliwoci, na przykad JavaScript lub ramki. Te informacje nie s zawarte
w cigu informacji o przegldarce. Nastpna cz omawia rozwizanie tego problemu w oparciu o PHP.
Wewntrzne funkcje PHP
Rozpoznawanie typu serwera ma zwykle suy do poznania moliwoci przegldarki. Z powodu
ogromnej iloci kombinacji przegldarek i platform, trudno jest stworzy oglne rozwizanie tego problemu. Na
szczcie PHP zawiera kilka metod dokadniejszego rozpoznania serwera za pomoc funkcji get_browser().


Aby uy
funkcji
get_browser()
naley cign z
sieci plik
browscap.ini,
ktry jest
dostpny z wielu
witryn w Sieci.
W czasie pisania
ksiki plik by
dostpny bez
adnych opat z
witryny
http://www.cysca
pe.com/browscap
. Po jego
cigniciu i
zainstalowaniu w
serwerze WWW,
naley zmieni
plik php.ini.
Odszukaj opcj
konfiguracji
browscap i zmie
j na pen
ciek do pliku
browscap.ini. Po
ponownym
uruchomieniu serwera WWW bdzie mona korzysta z danych zawartych w pliku. W czasie pisania ksiki plik
browscap.ini zawiera ponad 2100 rnych przegldarek.
Dodatkowe informacje na temat Browscap
W czasie pisania ksiki podejmowane byy dodatkowe ulepszenia do istniejcej w
PHP funkcji get_browser(). Odkryem, e plik browser.ini dostpny z firmy cyScape
(wspomnianej ju wczeniej) wymaga kilku zmian aby dziaa z PHP 4.0 z poprawk 2.
Pierwsz z nich jest dodanie pustej linii na kocu pliku. Bez dodatkowego znaku koca linii
w trakcie uruchamiania PHP generowany jest bd skadni.
Drugim, o wiele bardziej skomplikowany problem jest zwizany z sam struktura
pliku. Typowo, plik browscap.ini jest zwykym plikiem konfiguracyjnym w ktrym kada
sekcja reprezentuje okrelon przegldark. Kada z sekcji odwouje si do sekcji wyszego
rzdu, wic zdefiniowana jest pewnego rodzaju struktura. Tym sposobem w sekcji opisujcej
now przegldark zdefiniowane s tylko nowe moliwoci a istniejce wczeniej znajduj
ci w opisie starszej przegldarki. Problem wynika z tego, e w czasie odczytu pliku PHP
konwertuje jego zawarto na mae litery. Konwersja ta powoduje, e PHP nie potrafi
odszuka nadrzdnej sekcji, poniewa nie wszystkie nazwy zapisane s maymi literami. Aby
rozwiza ten problem wykonaem prosty skrypt konwertujcy wszystkie linie pliku
browscap.ini na mae litery:
<?php
$aArray = file( "./browscap.ini" );
$aNewFile = fopen( "./browscap.ini", "w" );
foreach( $aArray as $aLine )
{
$aNewFile = strtolower( $aLine );
fputs( $aNewFile, $aNewLine );
}
fclose ($aNewFile );
?>
Skutkiem ubocznym takiej zmiany jest to, e wszystkie wywoania funkcji
get_browser() musz zawiera wywoanie funkcji strtolower(). Jednak po wprowadzeniu
takich zmian funkcja get_browser() dziaa tak, jak si tego spodziewamy.
Wykorzystanie funkcji get_browser() wraz z plikiem browscap.ini upraszcza proces rozpoznawania
moliwoci przegldarki i rozszerza jego zakres. Na wydruku 9.2 pokazany jest przykad uycia funkcji
get_browser(). Tak jak opisane zostao we wskazwce Dodatkowe informacje na temat Browscap pierwszym
krokiem powinno by przekonwertowanie zawartoci $HTTP_USER_AGENT na mae litery. Nastpnie, przy uyciu
metody udokumentowanej w http://www.php.net/, cig identyfikacyjny przegldarki jest zmieniany do waciwej
Rozdzia 9 Niezaleno od przegldarki
106

postaci przed wywoaniem funkcji get_browser(). Do zamiany okrelenia jzyka (na przykad [en]) na gwiazdk,
ktra wystpuje w pliku browscap.ini, uywana jest funkcja eregi_replace().
Wydruk 9.2. Uycie funkcji get_browser()
<?php
function GetMassagedUA()
{
global $HTTP_USER_AGENT;
$aUserAgent = strtolower( $HTTP_USER_AGENT );
$aUserAgent = eregi_replace( "\[[a-z]{2,}\]", "*", $aUserAgent );
if ( strpos( $aUserAgent, '*' ) === False )
{
$aUserAgent .= '*';
}
return $aUserAgent;
}
?>
<html>
<head>
<title>Moliwoci przegldarki</title>
</head>
<body>
<h1>Moliwoci przegldarki</h1>
<?php
$aUserAgent = GetMassagedUA();
print( "<h2>$aUserAgent</h2>" );
$array = (array) get_browser( $aUserAgent );
if ( count( $array ) > 1 )
{
while ( list( $key, $value ) = each ($array) )
{
$aValue = stripslashes( $value );
echo ("<b>$key=</b> $aValue<br>");
}
}
else
{
print( "<i>brak danych przegldarki</i><br>" );
}
?>
</body>
</html>

Na rysunku 9.2. w przegldarce Netscape 4.7.
PHP Kompendium wiedzy
107

Rysunek 9.2. Wynik
dziaania skryptu z
wydruku 9.1
wykonywanego w
przegldarce
Netscape 4.7

Lista dostpnych moliwoci pokazuje potg funkcji get_browser(). W kodzie zamieszczonym na
wydruku 9.2, wszystkie moliwoci s wywietlane poprzez rzutowanie zwracanego obiektu na tablic i
przegldanie kolejnych par klucz-warto. Mona rwnie sprawdzi kolejno kad z moliwoci korzystajc
bezporednio z obiektu i uywajc zapisu $obiekt->moliwo. Na wydruku 9.3 pokazujemy przykad
sprawdzenia, czy przegldarka obsuguje ramki.
Wydruk 9.3. Uycie get_browser() do sprawdzenia obsugi ramek
<?php
function GetMassagedUA()
{
global $HTTP_USER_AGENT;
$aUserAgent = strtolower( $HTTP_USER_AGENT );
$aUserAgent = eregi_replace( "\[[a-z]{2,}\]", "*", $aUserAgent );
if ( strpos( $aUserAgent, '*' ) === False )
{
$aUserAgent .= '*';
}
return $aUserAgent;
}
?>
<html>
<head>
<title>Obsuga ramek?</title>
</head>
<body>
<?php
$aUserAgent = GetMassagedUA();
print( "<h2>$aUserAgent</h2>" );
$aBrowsCap = get_browser( $aUserAgent );
if ( $aBrowsCap->frames == 1 )
{
print( "Przegldarka obsuguje ramki<br>" );
}
else
{
Rozdzia 9 Niezaleno od przegldarki
108
print( "Przegldarka nie obsuguje ramek<br>" );

}
?>
</body>
</html>
Funkcja get_browser() dostarcza duo informacji i jest dobra na pocztek, gdy aplikacja wymaga
rozpoznania typu przegldarki w czasie pracy. Jednak posiada ona kilka znaczcych ogranicze. Jak
wspomniaem wczeniej, uycie pliku browscap.ini, dostpnego w Internecie, rwnie niesie ze sob kopoty.
Pewno dziaania funkcji wymaga, aby plik browscap.ini by czsto uaktualniany, aby poda za zmianami w
najnowszych dostpnych przegldarkach. Na przykad nasz plik browscap.ini nie pozwala na prawidowe
rozpoznanie przegldarek Internet Explorer 5.5 i Opera 4.02. Problem tkwi w tym, e uaktualnienie i rozesanie
pliku browscap.ini wymaga sporo czasu. Jeeli twoja aplikacja wymaga dokadnego wykrywania moliwoci
biecej przegldarki, w nastpnej czci opisane zostanie narzdzie jednej z firm, ktre wietnie spenia swoje
zadanie.
BrowserHawk
Komponent BrowserHawk, dostpny z firmy cyScape jest wietnym narzdziem do wykrywania
moliwoci serwera. Jest on dostpny w formie obiektu COM, jeeli wykorzystujesz serwer z Windows, lub jako
Java bean dla innych platform. Obsuga jzyka Java jest dostpna w PHP4, ale nie jest domylnie wczona. Aby
wykorzysta Java bean, lub inny kod Java na serwerze, PHP musi by przekompilowane z opcj konfiguracji --
with-java. Niezbdne jest rwnie zainstalowanie maszyny wirtualnej Java (JVM) na serwerze. Wiele dystrybucji
Linuksa zawiera JVM i w wielu przypadkach pakiet ten jest instalowany automatycznie.
Dodatkowo komponent BrowserHawk wymaga kilku dodatkowych moduw. Jednym z nich jest Simple
API for XML (SAX) dostpny pod adresem http://www.megginson.com/SAX/. Wymagane moduy servletw
mona znale we wielu miejscach, w tym w najnowszych JVM pochodzcych od rnych dostawcw. Potrzebny
bdzie na przykad dostp do klasy javax.servlet.http.HttpServlet.
Po cigniciu i zainstalowaniu wymaganych klas Javy, naley skonfigurowa PHP, aby mg skorzysta
z BrowserHawk. Taj jak w przypadku kadej innej klasy Java naley poda pooenie pliku z klasami Javy
korzystajc ze zmiennej java.class.path w pliku php.ini. Poniej znajduje si przykad:
java.class.path=/usr/share/kaffe/Klasses.jar:/homeblake/php4.0.1pl2/ext/java/php_java.jar:/home/blake/bhawk/
lib/bhawk4j.jar:/home/blake/java/sax2.jar:/home/blake/java/servlet.jar:/home/blake/bhawk:
Zapis taki wskazuje, e klasy wymagane przez BrowserHawk s dostpne dla PHP w katalogach
../bhawk4j.jar, ../sax2.jar i ../servlet.jar. Wpisana jest tutaj rwnie cieka bez okrelenia pliku
(/home/blake/bhawk), ktra okrela pooenie plikw licencyjnych i danych pakietu BrowserHawk. cieka ta
powinna wskazywa na katalog, w ktrym zosta zainstalowany BrowserHawk.
Po ustawieniu wszystkich tych elementw konfiguracji i przekompilowaniu PHP z obsug Javy, naley
sprawdzi konfiguracj za pomoc funkcji phpinfo(). Wywoanie funkcji phpinfo() powoduje wywietlenie
duej iloci danych w postaci tabel HTML. Na wydruku 9.3. pokazana jest ta cz informacji, ktra wskazuje na
dostpno Javy.
Rysunek 9.3.
Wynik dziaania
funkcji phpinfo()
pokazujcy
dostpno Javy

PHP Kompendium wiedzy
109

Po skonfigurowaniu obsugi Javy i BrowserHawk w PHP, wykorzystanie komponentw BrowserHawk
jest atwe. Na wydruku 9.4 znajduje si kod, ktry pokazuje w jaki sposb stworzy obiekt BrowserHawk i
wykorzysta go do odczytania kilku podstawowych danych o przegldarce.
Wydruk 9.4. Przykad wykorzystania BrowserHawk
<html>
<head>
<title>Przykad wykorzystania BrowserHawk</title>
</head>
<body>
<h1>Przykad wykorzystania BrowserHawk</h1>
<?php
print( "<h2>$HTTP_USER_AGENT</h2>" );
$aBrowserHawk = new Java( "com.cyscape.browserhawk.BrowserHawk" );
$aBrowserInfo = $aBrowserHawk->getBrowserInfo( "$HTTP_USER_AGENT" );
// Czy przegldarka obsuguje ActiveX?
if ( $aBrowserInfo->getActiveXControls() == True )
{
print( "Przegldarka obsuguje kontrolki ActiveX<br>" );
}
else
{
print( "Przegldarka nie obsuguje kontrolek ActiveX<br>" );
}
?>
</body>
</html>
Na wydruku 9.4 pokazujemy w jaki sposb mona sprawdzi obsug ActiveX i tak samo atwo mona
sprawdzi kad z waciwoci BrowserHawk. W tabeli 9.1. zamieszczone s metody odczytujce informacje na
temat moliwoci przegldarki dostpne w BrowserHawk.
Typ Metoda Zastosowanie
Boolean getActiveXControls()
Sprawdza, czy przegldarka obsuguje
kontrolki ActiveX.
Boolean getAOL()
Sprawdza, czy uytkownik witryny
korzysta z przegldarki firmowanej przez
America Online (AOL) (na sieci AOL).
double getAOLVersion()
Zwraca numer wersji przegldarki
AOL.
int getAuthenticodeUpdate()
Zwraca numer wersji Authenticode
obsugiwanego przez przegldark.
Boolean getBackgroundSounds()
Sprawdza, czy przegldarka potrafi
odgrywa dwik w tle.
Boolean getBeta()
Sprawdza, czy przegldarka jest w
wersji beta.
java.lang.String getBrowser()
Zwraca ogln nazw przegldarki, na
przykad Netscape lub IE (Internet Explorer).
Boolean getCDF()
Sprawdza, czy przegladarka obsuguje
Channel Definition Format (CDF) uywany do
prenumerowania zawartoci WWW z
moliwoci automatycznej aktualizacji.
Boolean getCompressGZip()
Sprawdza, czy przegldarka przyjmuje
dane w skompresowanym formacie GZip.
Boolean getCookies()
Sprawdza, czy przegldarka obsuguje
cookie.
Boolean getCrawler()
Sprawdza, czy przegldarka jest
szperaczem sieciowym lub innym programem
wykorzystywanym do indeksowania
zawartoci witryny.
Boolean getDHML()
Sprawdza, czy przegldarka obsuguje
skrypty DHTML().
java.lang.String getFileUpload()
Sprawdza, czy przegldarka obsuguje
Rozdzia 9 Niezaleno od przegldarki
110

moliwo przesyania plikw do serwera
(przegldarki zgodne z RFC 1867).
Boolean getFontColor()
Sprawdza, czy przegldarka potrafi
wywietla kolorowy tekst.
Boolean getFontSize()
Sprawdza, czy przegldarka potrafi
wywietla rne wielkoci tekstu.
Boolean getFrames()
Sprawdza, czy przegldarka obsuguje
ramki.
java.lang.String getFullversion()
Zwraca kompletn wersje przegldarki
zawierajc wysz i nisz cz numeru oraz
litery, o ile wystpuj.
Boolean getGold()
Sprawdza, czy jest to wersja Gold
przegldarki Netscape Navigator.
Boolean getHDML()
Zwraca True, jeeli obsuguje HDML
(poprzednik WAP).
java.lang.String getIPAddr()
Zwraca adres IP klienta.
Boolean getJavaApplets()
Sprawdza, czy przegldarka obsuguje
applety Java.
Boolean getJavaScript()
Sprawdza, czy przegldarka obsuguje
JavaScript.
double getJavaScriptVer()
Zwraca numer wersji JavaScript
obsugiwanego przez przegldark.
java.lang.String getLanguage()
Zwraca wybrany przez uytkownika
jzyk.
int getMajorver()
Zwraca wysz cz numeru wersji
przegldarki.
double getMinorver()
Zwraca nisz cz numeru wersji
przegldarki.
java.lang.String getMinorverlet()
Zwraca liter niszej czci numeru
przegldarki, o ile wystpuje.
Boolean getMouseOver()
Sprawdza, czy przegldarka obsuguje
efekt JavaScript, mouseover.
Boolean getMSN()
Sprawdza, czy uytkownik korzysta z
sieci Microsoft Network (MSN).
java.lang.String getOSDetails()
Zwraca szczegy na temat systemu
operacyjnego (OS) systemu uytkownika.
Boolean getPDA()
Zwraca True, jeeli przegldark jest
urzdzeniem PDA na przykad PalmPilot.
java.lang.String getPlatform()
Zwraca bardziej oglne dane (w
porwnaniu do getOSDetails()) na temat
platformy uytkownika.
Boolean getPNG()
Sprawdza, czy przegldarka obsuguje
format rysunkw PNG (Potrable Network
Graphics).
Boolean getProxy()
Sprawdza, czy uytkownik jest
poczony poprzez serwer Proxy.
Boolean getSSL()
Sprawdza, czy przegldarka obsuguje
protok SSL (Secure Socket Layer).
Boolean getSSLActive()
Sprawdza, czy uytkownik jest
poczony poprzez aktywne poczenie SSL.
java.lang.String getSSLCipherSuite()
Zwraca zestaw szyfrowania SSL dla
biecej sesji. Dostpny jedynie w przypadku
PHP Kompendium wiedzy
111

aktywnej sesji SSL.
int getSSLKeySize()
Sprawdza wielko klucza SSL
obsugiwan przez przegldark. Dostpne
jedynie w przypadku aktywnego poczenia
SSL.
Boolean getStyleSheets()
Sprawdza, czy przegldarka obsuguje
kaskadowe arkusze stylu (CSS).
Boolean getTableBGColor()
Sprawdza, czy przegldarka obsuguje
ustawianie kolorw dla poszczeglnych
komrek tabeli HTML.
Boolean getTableBGImage()
Sprawdza, czy przegldarka obsuguje
ustawianie rysunkw ta dla poszczeglnych
komrek tabeli HTML.
Boolean getTables()
Sprawdza, czy przegldarka obsuguje
wywietlanie tabel.
Boolean getVBScript()
Sprawdza, czy przegldarka obsuguje
VBScript.
double getVersion()
Zwraca wersj przegldarki.
int getVersionpos()
Zwraca pozycj w numerze wersji
przegldarki, ktry jest umieszczony w cigu
identyfikacyjnym przegldarki.
Boolean getWAP()
Zwraca True dla urzdze
obsugujcych WML i WAP (Wireles
Application Protocol), na przykad telefony
komrkowe z WAP.
java.lang.String getWAPDeviceModel()
Zwraca model urzdzenia WAP, o ile
jest znany.
java.lang.String getWAPGateway()
Zwraca szczegy bramy UP.Link, o ile
jest wykorzystywana.
int getWAPMaxDeckSize()
Zawiera przyblion maksymalna ilo
bajtw, jak moe obsuy urzdzenie.
java.lang.String getWAPSubscriberID()
Automatycznie ustawiany na
identyfikator abonenta dla uytkownika WAP.
Boolean getWin16()
Sprawdza, czy przegldarka pracuje w
16 bitowym systemie operacyjnym Windows,
jak na przykad Windows 3.1.
Boolean getXML()
Sprawdza, czy przegldarka obsuguje
bezporednie wywietlanie plikw XML.
Jedyn wad przy uywaniu komponentu BrowserHawk jest to, e jest on zaprojektowany dla
uytkownikw JSP, wic niektre metody mog nie by bezporednio dostpne poprzez PHP. Niektre
zaawansowane funkcje raportujce nie mog by wykorzystane, poniewa opieraj si na obiektach
specyficznych dla JSP. Mimo to, standardowe obiekty zwracaj wystarczajco duo danych dla wikszoci
zastosowa i s stale aktualne dla najnowszych przegldarek.
Przewag uycia komponentu BrowserHawk nad innymi metodami opisanymi w tym rozdziale jest jego
dokadno i elastyczno. BrowserHawk uaktualnia swoj baz danych w razie potrzeby. W dokumentacji
znajduje si informacja, e rozpoznaje on okoo 9 razy wicej przegldarek, ni mona to zrobi korzystajc z
browscap. BrowserHawk jest rwnie zaprojektowany, aby sprawdza o wiele wicej wasnoci przegldarki, ni
jest to stosowane w innych metodach.
Jeeli aplikacja opiera si na dostarczaniu danych specyficznych dla przegldarki lub polega na bardzo
specyficznych wasnociach przegldarki, BrowserHawk zapewnia najlepsze rozpoznawanie przegldarki.
Aplikacja bdzie nadal dziaaa prawidowo, niezalenie od cigych zmian w technologiach przegldarek.
Rozdzia 9 Niezaleno od przegldarki
112

Wykorzystanie danych o przegldarce
Pierwszym zadaniem podczas tworzenia aplikacji niezalenej od przegldarki jest rozpoznanie moliwoci
przegldarki uytkownika. O wiele waniejszym krokiem jest zadecydowanie w jaki sposb zostan
wykorzystane te dane. Tak jak w przypadku innych decyzji podejmowanych w czasie projektowania, zaley ona
od wymaga stawianych aplikacji. Niektre moliwoci przegldarki i wasnoci aplikacji, takie jak animowane
podpowiedzi, lub obsuga kaskadowych arkuszy stylw nie s krytyczne. Brak innych wasnoci moe cakowicie
zatrzyma aplikacj, na przykad zdolno przegldarki do nawizania poczenia szyfrowanego SSL lub obsuga
wysyania plikw.
Projekt aplikacji powinien zawiera list wymaganych wasnoci przegldarki i zapewnia eleganck
obsug sytuacji, gdy nie mona skorzysta z ktrej z wymaganych wasnoci. Na wydruku 9.5. zamieszczony
zosta przykad w jaki sposb mona zrealizowa eleganck obsug braku wymaganej wasnoci przegldarki.
Dodatkowo, mona sprbowa warunkowo dostarcza niektrych elementw w zalenoci od zdolnoci
przegldarki do ich wywietlania. Na wydruku 9.6 pokazano przykad takiego dziaania.
Wydruk 9.5. Eleganckie zakoczenie aplikacji w przypadku braku obsugi przesyania plikw
<?php
$aBrowserHawk = new Java( "com.cyscape.browserhawk.BrowserHawk" );
$aBrowserInfo = $aBrowserHawk->getBrowserInfo( "$HTTP_USER_AGENT" );
?>
<html>
<head>
<title>Wysyanie pliku</title>
</head>
<body>
<h1>Wysyanie pliku</h1>
<form action="someurl.phtml" method="post" enctype="multipart/form-data">
<?php
if ( $aBrowserInfo->getFileUpload() == True ) {
?>
<input type="file" name="File"><br><br>
<input type="submit" name="Submit" value="Wylij">
<?php
} else {
?>
Przegldarka nie obsuguje wysyania plikw.<br><br>
prosz przesa pliki poczt na adres files@my.domain.com.
<?php
}
?>
</form>
</body>
</html>
Jeeli przegldarka posiada obsug wysyania plikw, skrypt ten wywietla formularz wysyania pliku.
Jeeli przegldarka nie obsuguje tej funkcji, wywietlany jest napis informujcy uytkownika o moliwoci
przesania pliku za pomoc poczty elektronicznej. W rzeczywistoci mechanizm taki jest niezbdny, aby
uytkownicy aplikacji uwaali j za przyjazn. Wybierajc taki mechanizm naley zwrci uwag, aby
uytkownicy mogli zrozumie dlaczego wykonanie operacji si nie powiodo. Wikszo ludzi nie chce widzie
komunikatw typu Twoja przegldarka nie obsuguje RFC 1867. Jeeli aplikacja moe dziaa pomimo tego, e
operacja si nie udaa, nie wywietlaj ponownie tego komunikatu. Naley po prostu zapewni moliwie
najwiksz dostpn ilo funkcji.
Wydruk 9.6. Warunkowe dostarczanie treci w zalenoci od moliwoci przegldarki
<?php
$aBrowserHawk = new Java( "com.cyscape.browserhawk.BrowserHawk" );
$aBrowserInfo = $aBrowserHawk->getBrowserInfo( "$HTTP_USER_AGENT" );
if ( $aBrowserInfo->getPNG() == True )
{
$aImage = "Logo.png";
}
else
{
$aImage = "Logo.gif";
}
?>
<html>
<head>
<title>Nasze logo</title>
</head>
<body>
<h1>Nasze logo</h1>
PHP Kompendium wiedzy
113

<img src="<?=$aImage?>" width="180" height="70" alt="" border="0">
</body>
</html>
Skrypt ten wywietla grafik w formacie PNG jeeli przegldarka potrafi wywietli ten format, w
przeciwnym wypadku wysyany jest rysunek w formacie GIF. Przykad ten jest prosty, ale ilustruje podstawow
zasad dziaania. Zamiast wykorzystywa zmienne do wysyania rnych danych, aplikacja moe skorzysta z
informacji o moliwociach przegldarki do wywietlenia cakowicie innej sekcji witryny. Na przykad mona
stworzy witryn zoptymalizowan dla ogldania jej przez przegldarki WebTV. Systemy takie maj zwykle
ograniczon wielko ekranu i zwykle mniej moliwoci wywietlania rnych czcionek. Dlatego trzeba inaczej
projektowa tak witryn aby poprawi widoczno wszystkich elementw. Poniszy kod jest prostym
przykadem sposobu implementacji takiego przypadku. Zakadamy, e jest to gwna strona witryny.
<?php
$aBrowserHawk = new Java( "com.cyscape.browserhawk.BrowserHawk" );
$aBrowserInfo = $aBrowserHawk->getBrowserInfo( "$HTTP_USER_AGENT" );
if ( $aBrowserInfo->getBrowser() == "WebTV" )
{
// Przegldarka WebTV, przekierowanie do stron zoptymalizowanych dla WebTV
header( "Location: http://mysite.com/webtv/\n" );
}
else
{
// To nie jest przegldarka WebTV, przekierowanie do standardowych stron
header( "Location: http://mysite.com/main/\n" );
}
?>
W przykadzie tym, uytkownicy przegldarek WebTV s kierowani na odpowiednio zoptymalizowane
strony. Inni uytkownicy s kierowani do zwykego zestawu stron przeznaczonych dla innych typw
przegldarek. Przykad ten moe by rozszerzony, aby wykrywa przegldarki dziaajce na komputerach typu
PDA lub inne specyficzne typy przegldarek.
Wad takiego rozwizania jest to, e jeeli uytkownik wyle znajomemu cze do strony przeznaczonej
dla innej przegldarki ni uywa ten znajomy, wygld strony nie bdzie odpowiedni dla biecego typu
przegldarki. Dodatkowo mechanizm ten wymaga, aby kada strona posiadaa kilka rwnolegych stron
przeznaczonych dla odpowiednich typw przegldarek. Wprowadzenie takiego projektu jest nieporczne dla
duych witryn. Lepszym rozwizaniem przy tworzeniu stron specyficznych dla przegldarki jest wyczenie
kluczowych rnicych si elementw i umieszczenie ich w osobnych plikach dla kadego typu przegldarki.
Tego typu mechanizm moe by zaimplementowany przy uyciu systemu szablonw, ktre bd opisane w
rozdziaach 13 i 14. Tam te przytoczymy przykady implementacji takiego scenariusza.
Podsumowanie
Wykrywanie moliwoci przegldarki moe by niezmiernie wane dla wielu aplikacji WWW. W czasie
projektowania aplikacji naley pozna ograniczenia rnych przegldarek, zanim zatwierdzimy realizacj
specyficznych funkcji. Nastpnie, w oparciu o wymagania projektu naley wykorzysta narzdzia do wykrywania
przegldarki i wczania niektrych funkcji. Naley unika sytuacji, gdy przegldarka wywietla niezrozumiay
komunikat bdu w przypadku, gdy funkcja jest niedostpna. Naley dy do zapewnienia zestawu funkcji
niezalenych od uywanego typu przegldarki.
Rozdzia 9 Niezaleno od przegldarki
114
Rozdzia 10. Uruchamianie
Wstp
Uruchamianie aplikacji WWW jest rwnie krytycznym procesem jak uruchamianie innych typw
aplikacji. Problemem jest to, e moe by trudno zdalnie uruchamia program, szczeglnie gdy nie masz
odpowiednich uprawnie do administracji serwerem WWW. W tym rozdziale zaprezentowane zostan porady i
narzdzia, ktre mog usprawni uruchamianie aplikacji. Dodatkowo, niektre czci rozdziau s
przypomnieniem zasad inynierii programowania, poniewa mona unikn ogromnej pracy przy uruchamianiu
aplikacji, jeeli jej projekt jest odpowiednio przygotowany.
Z powodu ogromnego zainteresowania jakie wzbudzio programowanie aplikacji WWW, powstao wiele
narzdzi (midzy innymi PHP) do tworzenia takich aplikacji. Narzdzia te zostay stworzone na podstawie
istniejcych ju narzdzi, na przykad ASP i JSP, inne natomiast zostay stworzone jedynie w celu tworzenia
interaktywnych aplikacji WWW. Niespodziewanie, narzdzia speniajce zasady inynierii programowania s tu
w mniejszoci. Prawdopodobnie brak ten jest spowodowany potrzeb zaistnienia na rynku jako pierwsze
narzdzie lub z faktu, e pierwszymi projektantami nowej technologii nie byli bardziej zaawansowani
programici. Niezalenie od powodu, do tego nowego rodowiska programowania naley zaadaptowa wszystkie
istniejce zasady inynierii programowania. Pierwsza cz rozdziau zawiera przypomnienie zasad inynierii
programowania. Jest ona doczona do tego rozdziau, poniewa zbyt duo czasu spdzonego przy uruchamianiu
jest zwykle powodowane bdami przy tworzeniu projektu.
Inynieria programowania a uruchamianie
W rozdziale 3 Formularze i cookie doszlimy do wniosku, e mona unikn sprawdzania poprawnoci
niektrych danych w przypadku zastosowania lepszego mechanizmu wprowadzania danych. Tak samo, pisanie
lepszego (bardziej defensywnego) kodu powoduje ogromne zmniejszenie czasu straconego w czasie
uruchamiania.
Projekt aplikacji WWW musi by tak samo dokadnie przemylany, jak projekt kadej innej aplikacji.
Tworzenie wietnej aplikacji wymaga waciwego projektu, zgodnoci z standardami tworzenia oprogramowania,
sprawdzania oprogramowania, testowania moduw oraz uruchamiania. Uruchamianie jest koniecznie ostatnie na
tej licie, poniewa zakada si, e kod przeszed wszystkie wczeniejsze wymagane kroki. Kolejne czci
zawieraj przegld kadego z tych krokw i zakadaj, e posiadasz pewn wiedz inynierii programowania.
Projekt aplikacji
Identyfikacja wstpnych zaoe aplikacji przed napisaniem jakiegokolwiek kodu jest krytyczna w
przypadku kadego projektu. W duych projektach takie planowanie moe zaj tygodnie lub miesice. W
maych projektach mog zosta zapisane na skrawku papieru w przecigu kilku minut. W kadym z tych
przypadkw kluczowe jest przemylenie wymaga aplikacji, oraz wymylenie moliwie wielu moliwych
rozwiza przed rozpoczciem pisania kodu. Dane z firm TRW i IBM wskazuj, e wprowadzenie zmian do
aplikacji w pocztkowym okresie programowania (przed faz programowania) jest 10 do 200 razy tasze ni
wprowadzanie tych samych zmian na kocu tego procesu (McConnell, 1993).
W zalenoci od projektu, identyfikacja wymaganych funkcji aplikacji moe wymaga wykonania sporej
pracy. Wstpny podzia aplikacji na moduy moe uproci ten proces. W aplikacji WWW moduami takimi
mog by wsppraca z baz danych, autoryzacja uytkownika, obsuga stanu, id. Po zdefiniowaniu zada

poszczeglnych moduw naley w razie potrzeby podzieli je na mniejsze fragmenty i zapisa przeznaczenie
kadego fragmentu. W maych aplikacjach dobr strategi jest podzia moduw na pliki kodu bd klasy
obiektowe.
Oprcz zdefiniowania wymaga funkcjonalnych aplikacji, naley rozway architektur systemu. Naley
tu pomyle o rodzaju stosowanego systemu zarzdzania relacyjn baz danych (SZRBD) i innych mniej
oczywistych elementach, na przykad jak bd zorganizowane pliki kodu, jak radzi sobie ze zmianami, oraz czy
niektre moduy naley zakupi, czy te pisa je od pocztku. Mimo, e PHP moe dziaa na wielu serwerach
WWW i platformach systemowych, kada z takich kombinacji posiada indywidualne cechy. Naley powici
nieco czasu na zdefiniowanie powodw, dla ktrych naley wybra okrelony sprzt i serwer. Ilo funduszy
dostpnych na pocztku projektu rzadko jest dobrym powodem wyboru platformy. Wybr bazy danych jest
rwnie istotny, jeeli aplikacja ma by wysoce dynamiczna. Dodatkowo naley pomyle, czy serwer WWW i
baza danych bd pracowa na tym samym komputerze, czy osobno. W zalenoci od wielkoci i charakteru
aplikacji, moe by to krytyczne zagadnienie.
Nastpnie, naley zaprojektowa organizacj kodu. Zdefiniuj konwencj nazywania plikw i katalogw,
co uproci identyfikacj kodu. Wymyl alternatywny plan na wypadek, gdy istnieje due prawdopodobiestwo
zmian. Jeeli przewidujesz wystpowanie zmian, napisz aplikacj lokalizujc zmiany w kilku moduach a
buforujc reszt. Taki typ projektowania jest istotny szczeglnie, gdy korzystasz przy tworzeniu aplikacji z
narzdzi pochodzcych z innych rde lub oprogramowania w wersji beta. Tworzenie zastpnikw takiego kodu
jest atwe do zaimplementowania i w duszym okresie czasu umoliwia atwiejsze utrzymanie aplikacji.
Na koniec naley zadecydowa, ktre moduy aplikacji zostan stworzone przy pomocy gotowych
narzdzi pochodzcych od zewntrznych dostawcw. Decyzja tworzy czy kupi jest dosy skomplikowana. W
zalenoci od harmonogramu projektu, moesz nie i mie wystarczajco duo czasu, aby dostatecznie
przetestowa dostpne narzdzia. Jednak moesz rwnie nie mie wystarczajco duo czasu na stworzenie ich
od pocztku. Aby zmniejszy wpyw tej decyzji na projekt mona stworzy wasne funkcje porednie ukrywajce
implementacj.
Waciwe zaprojektowanie aplikacji wymaga czasu. W przypadku dobrego systemu faza projektowania
zajmuje 20 do 30 procent czasu tworzenia systemu (McConnell, 1993). Trzeba pamita, e ten czas jest
zuywany na projektowanie wysokiego poziomu, do projektowania szczegw implementacji rwnie potrzebny
jest czas.
Definiowanie standardw programowania
Zdefiniowanie standardw programowania uatwia dugoterminowe utrzymanie projektw o dowolnej
wielkoci. Nawet mae aplikacje programowane przez jednego programist mog korzysta z odpowiednio
stosowanego zbioru standardw programowania. Taki standard obejmuje sposoby nazywania, komentowania oraz
konwencje ukadu. Niektre z nich, na przykad ukad kodu, s mniej wane, poniewa nowoczesne edytory
potrafi przeformatowa kod, jednak inne, jak na przykad konwencje nazw plikw i katalogw mog mie
ogromne znaczenie przy konserwacji kodu
2
.
Przegld oprogramowania
Przegld oprogramowania dostarcza moliwoci zrealizowania kilku celw za jednym razem. Na
przykad, przegld oprogramowania pozwala na sprawdzenie kodu z standardami kodowania. Pozwalaj rwnie
mniej dowiadczonym programistom na korzystanie z wiedzy bardziej dowiadczonych kolegw. S rwnie
jednym z bardziej efektywnych metod zapewnienia odpowiedniej jakoci oprogramowania. Analizy przegldw
oprogramowania stosowanych przy tworzeniu prawdziwych aplikacji pokazay, e pozwalaj na wykrywanie
bdw z prawdopodobiestwem pomidzy 55 a 60%. Ten wynik naley zestawi z jedynie 25%
prawdopodobiestwem dla testowania moduw, 35% dla testowania funkcji oraz 45% dla testowania
integracyjnego. Dodatkowo, przegldy takie zwikszaj w duych projektach ogln wydajno zespou. W

2
Przypis tumacza. Z powodu lunego traktowania typw w PHP szczeglnie wane wydaje si odpowiednie nazywanie zmiennych. Dobrym pomysem
moe by stosowanie tzw. notacji wgierskiej, gdzie nazwa zmiennej zaczyna si od liter okrelajcych jej typ, np.: ca
liczby cakowite, g znakw, a ienna logiczna.
nIlosc to zmienna przechowuj
sTytul zawiera ci bIstnieje to zm
Rozdzia 10 Uruchamianie
116

niektrych przypadkach powoduj one 80 do 90% spadek awarii oraz 10 do 25% wzrostu wydajnoci
(McConnell, 1993). Przegld powinien by przeprowadzany zarwno podczas testowania jak i podczas
implementacji. Przegld projektu pozwala na identyfikacj jego wad w momencie, gdy ich usuwanie jest
najprostsze i najtasze.
Mona wykorzysta kilka metod realizacji przegldu. Niektre z nich s formaln inspekcj kodu inne
przegldem oglnym lub czytaniem kodu. W przypadku formalnej inspekcji kodu, kilku czonkw zespou zbiera
si razem w celu odszukania bdw. Prowadzcy spotkanie prowadzi je do przodu i pilnuje, aby jedynym
tematem bya identyfikacja bdw. Formalna inspekcja kodu nie powinna zawiera dyskusji na temat rozwiza.
W przypadku przegldu oglnego grupa programistw nieformalnie dyskutuje na temat kodu zadajc pytania.
Gdy zidentyfikowany zostanie bd, mog powsta sugestie na temat sposobu jego usunicia, ale gwnym celem
jest nadal jego identyfikacja. Czytanie kodu powicone jest jedynie dla kodu programu, a nie pracy grupowej.
Zwykle cz kodu jest przekazywana dwm lub wicej osobom, ktre niezalenie pracujc identyfikuj bdy.
Wynik ich pracy jest przekazywany autorowi kodu.
W zalenoci od rozmiaru i organizacji projektu uycie jednej z metod ma przewag nad inn. Na
przykad w przypadku, gdy pracujesz sam lub w maym zespole, moesz skorzysta z zatrudnienia osoby, ktra
wykona taki przegld metod czytania kodu. Niezalenie od wybranej metody, przeprowadzenie przegldu kodu
jest najbardziej efektywn metod identyfikacji problemw w projekcie bd implementacji.
Testowanie
Zwykle testowanie nie jest pomijane, ale czsto jest przeprowadzane przypadkowymi metodami. Tak jak
w przypadku innych projektw, testowanie aplikacji WWW powinno zawiera testowanie na rnych poziomach:
testowanie funkcji, testowanie moduw oraz testowanie integracyjne. Testowanie kadego moduu powinno by
odpowiednio zaplanowane. Z testami zwizany jest okrelony zbir oczekiwa i wymaga.
W maych projektach testowanie moe wymaga jedynie wymylenia kilku prostych przypadkw uycia
aplikacji a nastpnie sprawdzenie kadego przypadku. Wiksze projekty mog zawiera ludzi, ktrzy zajmuj si
jedynie testowaniem, ale kady z programistw powinien by odpowiedzialny za dostarczenie testerom
dostatecznie duo danych, aby ich praca bya efektywna. Kady twrca kodu powinien rwnie by
odpowiedzialny za testowanie swoich moduw na poziomie funkcji lub strony.
Uruchamianie
Uruchamianie jest ostatnim etapem w procesie tworzenia aplikacji, poniewa w momencie, gdy nastpuje
uruchamianie powinny by ukoczone procesy projektowania, programowania i cz testowania. Uruchamianie
moe by przeprowadzane w trakcie kadej z fazie testowania jako cz tego procesu. Wszystkie zmiany
wprowadzone do kodu w trakcie procesu uruchamiania powinny zosta ponownie przetestowane na wszystkich
poziomach testowania, poniewa zmiany mogy wprowadzi nowe bdy.
Uruchamianie powinno by gruntownym procesem przeznaczonym do identyfikacji rda problemu. Nie
powinno by prostym ataniem, ktre naprawi bdne przypadki, ale nie zapewni trwaego rozwizania. Kady,
kto bierze udzia w testowaniu powinien zna rdo problemu w momencie, gdy stwierdza si usunicie
problemu. Znalezienie rda problemu powoduje stworzenie kompletnego rozwizania zamiast obchodzenia
problemu. W zalenoci od natury problemu, czasami czasowe rozwizania mog by wystarczajce, ale musz
zosta odpowiednio udokumentowane. Rozwizywanie problemw powinno bra pod uwag priorytety.
W tej ksice prawdopodobnie nie zostanie opisane wszystko na temat prawidowej inynierii
programowania. Najwaniejsze jest, aby pamita, e inynieria programowania jest rwnie wana w aplikacjach
WWW jak w pozostaych aplikacjach oraz o tym, ze waciwe stosowanie zasad inynierii moe ograniczy
nakad pracy wymagany przy uruchamianiu. Nastpna cz zawiera opis kilku technik i narzdzi specyficznych
dla aplikacji PHP.
PHP Kompendium wiedzy
117

Programowanie defensywne
Zanim zaczniesz uruchamia program, powiniene podj kroki, prowadzce do napisania kodu
zawierajcego duo mniej bdw. Taki sposb programowania jest nazywany programowaniem defensywnym.
Takie programowanie polega na odpowiednim komentowaniu bdw, wewntrznym sprawdzaniu stanu procedur
w trakcie procesu programowania. Sposb komentowania jest indywidualny dla kadego programisty, ale
powinno by zgodne ze standardami. Jako minimum, programici powinni opisywa przeznaczenie funkcji, klasy
lub doczanego pliku oraz zawsze komentowa niejasne fragmenty kodu.
Do sprawdzania stanu funkcji, PHP, tak jak wiele jzykw wysokiego poziomu, posiada funkcj assert().
Funkcja assert() oblicza warto przekazanego parametru i podejmuje okrelone akcje w przypadku, gdy jego
warto wynosi False. W PHP do funkcji assert() mona przekaza zarwno cig jak i warto Boolean. Jeeli
przekazany zosta cig, jest on wykonywany jako blok kodu PHP. Opcje asercji w pliku php.ini (assert.active,
assert.warning, assert.bail, assert.callback i assert.quiet_eval) lub opcje przekazane jako parametr
wywoania funkcji assert_options() definiuj akcj jak podejmuje funkcja assert(). W tabeli 10.1
zamieszczone s rne opcje asercji.
Tabela 10.1. Opcje asercji i ich opis
Opcja Domylnie Opis
assert_active 1
Wcza wykonywanie assert().
assert_warning 1
Wywietla ostrzeenie PHP przy
kadej nieudanej asercji.
assert_bail 0
Koczy wykonanie w przypadku
nieudanej asercji.
assert_quiet_eval 0
Wycza raportowanie bdw w
czasie obliczenia wyraenia asercji.
assert_callback (null)
Nazwa funkcji uytkownika
wykonywanej w przypadku nieudanej asercji.
Funkcja assert() jest zaprojektowana jedynie do wykorzystywania w czasie tworzenia programu i nie
powinna by uywana w czasie normalnej pracy. Aplikacja powinna dziaa identycznie z wywoaniami funkcji
assert(), jak i bez nich. Na wydruku 10.1 pokazany zosta przykad uycia funkcji assert() do kontroli
poprawnoci parametrw wejciowych.
Wydruk 10.1. Uycie funkcji assert() do kontroli poprawnoci parametrw wejciowych
<?php
function ArrayAverage( $aArray )
{
$aTotal = 0;
// Apostrofy ozanczaj cig nie interpretowany przez PHP
assert( 'is_array( $aArray )' );
foreach( $aArray as $aElement )
{
assert( 'is_numeric( $aElement )' );
$aTotal += $aElement;
}
return ( $aTotal / count( $aArray ) );
}
?>
Funkcja ArrayAverage() umieszczona na wydruku 10.1 spodziewa si jako parametru tablicy wartoci
numerycznych (liczb lub cigw zawierajcych liczby) i zwraca redni z wartoci w tablicy. Wyraenie assert()
jest wykorzystywane do kontroli poprawnoci parametru przekazanego do funkcji a pniej do sprawdzania, czy
tablica zawiera wartoci numeryczne. Naley zwrci uwag, e do assert() mona przekaza cig, ktry jest
wykonywany jako kod PHP, wic jeeli wykorzystywane s zmienne naley zapewni, e PHP nie podstawi zbyt
wczenie wartoci zmiennej w miejsce jej nazwy. Aby tego unikn naley uywa cigw w apostrofach.
Testowy skrypt dla funkcji z wydruku 10.1 jest zamieszczony na wydruku 10.2.
Wydruk 10.2. Uycie funkcji ArrayAverage()
<?php
include( "./arrayfunc.php" );
?>
<html>
<head>
<title>Testowanie asercji</title>
</head>
Rozdzia 10 Uruchamianie
118
<body>

<?php
$aResult = ArrayAverage( array( 1, 2, 3, 4, 5 ) );
print( "ArrayAverage( array( 1, 2, 3, 4, 5 ) ) = $aResult<br>" );
$aResult = ArrayAverage( array( 10.1, "5.5", 3, "4", 5 ) );
print( "ArrayAverage( array( 10.1, \"5.5\", 3, \"4\", 5 ) ) = $aResult<br>" );
$aResult = ArrayAverage( array( 1, 2, "cat", 4, 5 ) );
print( "ArrayAverage( array( 1, 2, \"cat\", 4, 5 ) ) = $aResult<br>" );
$aResult = ArrayAverage( 1, 2 );
print( "ArrayAverage( 1, 2 ) = $aResult<br>" );
?>
</body>
</html>
Testowy skrypt wywouje funkcj ArrayAverage() cztery razy. Pierwsze dwa razy przekazywane s
waciwe wartoci, natomiast ostatnie dwa razy przekazane wartoci s nieprawidowe. Na rysunku 10.1.
pokazany jest wynik dziaania skryptu. Naley zauway, e poniewa PHP wewntrznie wymusza typy
zmiennych, powoduje to, e wywoanie ArrayAverage(array(1, 2, "cat", 4, 5)) udaje si bez adnych
ostrzee (poza generowanymi przez asercje).
Rysunek 10.1.
Testowanie funkcji
ArrayAverage()
Podejmowane przez funkcj assert() dziaania zale od ustawie asercji. Poprzedni przykad
wyorzystywa domylne ustawienia asercji. Przyjemn cech asercji jest to, e gdy assert.active jest ustawione
na False, przestaj one dziaa. Aby zmieni t opcj naley albo wywoa funkcj assert_options(
ASSERT_ACTIVE, False) lub ustawi odpowiednio dyrektyw konfiguracji. Wykorzystujc opcj konfiguracji
mona instalowa aplikacj w rodowisku z wyczonymi asercjami a pracowa na innym, gdzie asercje s
aktywne.
Istnieje jeszcze jedna funkcja pomagajca w programowaniu defensywnym, error_reporting(). Funkcja
ta jako argumentu wymaga liczby cakowitej okrelajcej poziom raportowania bdw. Argument ten jest
traktowany jako maska bitowa, wic mona poda zestaw kilku ustawie. PHP posada zestaw staych uywanych
razem z t funkcj. S one nastpujce:
Warto Nazwa
E_ERROR
1
E_WARNING
2
E_PARSE
4
E_NOTICE
8
E_CORE_ERROR
16
E_CORE_WARNING
32
E_COMPILE_ERROR
64
E_COMPILE_WARNING
128
E_USER_ERROR
256
512
E_USER_WARNING
PHP Kompendium wiedzy
119

E_USER_NOTCE
1024
Dodatkowo istnieje rwnie staa E_ALL, ktra uaktywnia wszystkie informacje o bdach. Tworzc
aplikacj powinno si przestawi poziom raportowania bdw na E_ALL, co spowoduje wywietlanie wszystkich
informacji o bdach w kodzie. Ustawienie to jest rwnie wane w trakcie doczania do aplikacji zewntrznej
biblioteki. Na wydruku 10.3 zamieszczony jest przykad kodu generujcy ostrzeenia w przypadku ustawienia
maksymalnego poziomu raportowania bdw. Przy standardowych ustawieniach skrypt nie powoduje
wywietlenia adnego komunikatu.
Wydruk 10.3. Przykad uycia funkcji error_reporting()
<html>
<head>
<title>Poziomy raportowania bdw</title>
</head>
<body>
<?php
$aArray = array( "state" => "Idaho", "county" => "Madison",
"city" => "Rexburg", "country" => "US" );
// standardowy poziom raportowania bdw
print( "aArray[state] = " . $aArray[state] . "<br>" );
error_reporting( E_ALL );
print( "aArray[state] = " . $aArray[state] . "<br>" );
?>
</body>
</html>
Na rysunku 10.2. pokazane s wyniki dziaania tego przykadu. Jak mona zauway, ustawienie bardziej
restrykcyjnego poziomu raportowania bdw moe spowodowa wykrycie bdw w kodzie, ktre mog
spowodowa rne efekty uboczne w czasie tworzenia aplikacji. W tym przypadku problem moe wydawa si
niewinny, ale jeeli zdefiniujemy sta o nazwie state reprezentujc stan dziaania aplikacji, problem przestanie
by niewinny. Na wydruku 10.4 pokazujemy skrypt z tak wanie sta. Wyniki jego dziaania s widoczne na
rysunku 10.3.
Wydruk 10.4. Drugi przykad uycia funkcji error_reporting() oraz staej
<?php
// Stan dziaania aplikacji
define( state, 3 );
// Pozostay kod uywajcy staej state
?>
<html>
<head>
<title>Poziomy raportowania bdw</title>
</head>
<body>
<?php
$aArray = array( "state" => "Idaho", "county" => "Madison",
"city" => "Rexburg", "country" => "US" );
// domylny poziom raportowania
print( "aArray[state] = " . $aArray[state] . "<br>" );
error_reporting( E_ALL );
print( "aArray[state] = " . $aArray[state] . "<br>" );
?>
</body>
</html>
Rysunek 10.2.
Wynik dziaania
skryptu
error_reporting()

Rozdzia 10 Uruchamianie
120

Rysunek 10.3.
Wynik dziaania
drugiego skryptu
error_reporting()
W obu przykadach, gdy poziom raportowania bdw by ustawiony na standardowy poziom, nie byy
generowane adne ostrzeenia i program wykonywa si nieomal bezbdnie. Jednak po dodaniu w drugim
przykadzie staej, wietnie dziaajcy nagle przesta dziaa. Problem taki moe by bardzo trudny do
odszukania, jeeli staa taka byaby zdefiniowana w doczanym pliku. Przykad ten pokazuje zalety zastosowania
ustawienia poziomu raportowania bdw na maksimum. Wszystkie wywietlane ostrzeenia powinny zosta
zlikwidowane, aby unikn wystpowania bdw w przyszoci.
W zalenoci od twojego rodowiska, moesz ustawi poziom raportowania bdw na maksymalny w
trakcie rozwijania aplikacji i na minimalny na serwerze produkcyjnym. Takie ustawienie powoduje, e w
przegldarkach uytkownikw nie pojawiaj si ostrzeenia i komunikaty bdw. Jednak osobicie uwaam, e
najlepiej ustawi na serwerze produkcyjnym poziom raportowania na maksimum, ale skierowa strumie bdw
do pliku dziennika. Mona to zrealizowa ustawiajc zmienne konfiguracji display_errors, log_errors i
error_log na odpowiednio Off, On i stderr. Powoduje to, e PHP nie wywietla bdw w przegldarce a zamiast
tego kieruje wszystkie bdy do pliku stderr. Jeeli uywasz Apache, plikiem stderr dla Apache jest dziennik
bdw. Jeeli chcesz, moesz skorzysta z innej lokalizacji dziennika.
Gdy zostanie wykonany skrypt z wydruku 10.3 po skonfigurowaniu PGP w sposb wspomniany powyej,
na ekranie nie pojawi si ostrzeenia, a w pliku dziennika bdw Apache znajd si nastpujce pozycje:
[06-Dec-2001 20:53:22] PHP Warning: Undefined offset: 3 in c:\helion\php4-
devguide\site\ch10\error_reporting_2.phtml on line 17
[06-Dec-2001 20:54:03] PHP Warning: Use of undefined constant state - assumed 'state' in c:\helion\php4-
devguide\site\ch10\error_reporting.phtml on line 12
[06-Dec-2001 20:54:45] PHP Warning: Use of undefined constant state - assumed 'state' in c:\helion\php4-
devguide\site\ch10\error_reporting.phtml on line 12
[06-Dec-2001 20:54:49] PHP Warning: Undefined offset: 3 in c:\helion\php4-
devguide\site\ch10\error_reporting_2.phtml on line 17
[06-Dec-2001 20:54:51] PHP Warning: Undefined offset: 3 in c:\helion\php4-
devguide\site\ch10\error_reporting_2.phtml on line 17
[06-Dec-2001 20:54:53] PHP Warning: Use of undefined constant state - assumed 'state' in c:\helion\php4-
devguide\site\ch10\error_reporting.phtml on line 12
Nastpnym krokiem podczas programowania defensywnego moe by napisanie wasnego mechanizmu
rejestrujcego. W dowolnych miejscach aplikacji moesz sprawdza stan niektrych funkcji lub raportowa bdy
wewntrzne i kontynuowa prac. PHP posiada funkcj error_log() przy pomocy ktrej mona dodawa wasne
zapisy do pliku ladu aplikacji. Prototyp funkcji error_log() wyglda nastpujco:
int error_log(string komunikat, int typ [, string cel [, string naglowki]])
Pierwszy parametr, komunikat, zawiera zapisywane dane. Drugi z parametrw okrela gdzie zostanie
zapisany komunikat. Lista prawidowych wartoci parametru typ znajduje si w tabeli 10.2.
Tabela 10.2. Wartoci parametru typ
Warto Opis
0 Parametr komunikat jest wysyany do systemowego mechanizmu
rejestrowania PHP przy uyciu mechanizmu rejestrowania
zapewnianego przez system operacyjny lub pliku w zalenoci od
ustawienia zmiennej konfiguracji error_log.
1
PHP Kompendium wiedzy
121
Komunikat jest wysyany poczt elektroniczn na adres podany
w parametrze cel. Jedynie ten typ zapisu wykorzystuje parametr
naglowki. Do obsugi tego typu komunikatu wykorzystywana jest ta
sama funkcja wewntrzna, co w funkcji mail().

2 Komunikat jest wysyany poprzez poczenie PHP uywane do
uruchamiania zdalnego. Opcja ta jest dostpna jedynie w przypadku,
gdy wczone jest uruchamianie zdalne. W tym przypadku parametr cel
okrela nazw komputera lub adres IP oraz opcjonalnie numer portu
uywanego do odbierania informacji uruchamiania.
3 Komunikat jest doczany na koniec pliku o nazwie cel.
W czasie pisania ksiki typ 2 nie by dostpny. Kod rdowy zawiera komentarz informujcy, e zdalne
uruchamianie nie jest jeszcze dostpne. Inne typy komunikatw dziaaj w sposb opisany w tabeli. Na wydruku
10.5 pokazany jest przykad uycia funkcji error_log().
Wydruk 10.5. Uycie funkcji error_log()
<html>
<head>
<title>Rejestrowanie bdw</title>
</head>
<body>
<?php
// Zapisanie bdu do dziennika systemowego
error_log( "MJ BD: wystpi bd!", 0 );
// Wysanie bdu przez e-mail
error_log( "MJ BD: wystpi bd!", 1, "app_errors@intechra.net",
"From: error_logger@myhost.com\r\n" );
// Zapisanie bdu w pliku ladu aplikacji
error_log( "MJ BD: wystpi bd!", 3, "/tmp/error.log" );
?>
Wystpiy bdy.
</body>
</html>
Pierwsze wywoanie funkcji error_log() zapisuje komunikat bdu w systemowym dzienniku bdw. W
tym przykadzie bd ten wysyany do dziennika bdw Apache. Drugie wywoanie skutkuje wysaniem poczty
elektronicznej do odbiorcy okrelonego w parametrze cel. Informacje zawarte w dodatkowych nagwkach s
utworzone przy uyciu tych samych zasad, co w przypadku funkcji mail(). Ostatnie wywoanie powoduje
dodanie komunikatu bdu do pliku, w tym przypadku /tmp/error.log.
Wykorzystanie tego mechanizmu nie jest w dosownym znaczeniu uruchamianiem, ale jego zastosowanie
moe zaoszczdzi czas spdzony przy waciwym uruchamianiu, powodujc eliminacj niektrych bdw i
przeocze ju w fazie programowania. Jak wczeniej wspomniaem, unikanie uruchamiania programu poprzez
tworzenie poprawnego kodu jest o wiele cenniejsze od najlepszych narzdzi uywanych przy uruchamianiu.
Wasna obsuga bdw
Tak jak prawie kady element PHP mechanizm obsugi bdw moesz dostosowa do wasnych potrzeb,
aby spenia wymagania stawiane przez aplikacj. Jak pokazane zostao na kocu poprzedniego przykadu,
funkcja error_log() pozwala na skonstruowanie prostego mechanizmu rejestrowania wasnych bdw
wystpujcych w aplikacji, ale nie pozwala na obsug bdw generowanych przez PHP. Nie pozwala rwnie
na przechwytywanie komunikatw generowanych przez funkcje assert(). Na szczcie PHP pozwala w inny
sposb obsugiwa takie przypadki.
Funkcja set_error_handler() pozwala zarejestrowa funkcj w PHP, ktra bdzie wywoywana za
kadym razem, gdy wygenerowany zostanie komunikat bdu. Funkcja set_error_handler() wymaga podania
jednego argumentu nazwy funkcji obsugi bdw. Prototyp takiej funkcji wyglda nastpujco:
function ErrorCallBack( int nr_bledu, string ciag_bledu, string nazwa_skryptu,
int nr_lini, array kontekst)
Na wydruku 10.6 zamieszczony jest przykad sposobu rejestrowania i uycia funkcji obsugi bdw.
Wydruk 10.6. Wykorzystanie set_error_handler()
<?php
function myErrorHandler( $aErrorNo, $aErrorStr, $aFile, $aLine, $aContext)
{
switch ( $aErrorNo )
{
case E_ERROR:
$aErrorType = "E_ERROR"; // nie powinien wystpi
break;
case E_WARNING:
$aErrorType = "E_WARNING";
Rozdzia 10 Uruchamianie
122

break;
case E_PARSE:
$aErrorType = "E_PARSE"; // nie powinien wystpi
break;
case E_NOTICE:
$aErrorType = "E_NOTICE";
break;
case E_CORE_ERROR:
$aErrorType = "E_CORE_ERROR"; // nie powinien wystpi
break;
case E_CORE_WARNING:
$aErrorType = "E_CORE_WARNING"; // nie powinien wystpi
break;
case E_COMPILE_ERROR:
$aErrorType = "E_COMPILE_ERROR"; // nie powinien wystpi
break;
case E_COMPILE_WARNING:
$aErrorType = "E_COMPILE_WARNING"; // nie powinien wystpi
break;
case E_USER_ERROR:
$aErrorType = "E_USER_ERROR";
break;
case E_USER_WARNING:
$aErrorType = "E_USER_WARNING";
break;
case E_USER_NOTICE:
$aErrorType = "E_USER_NOTICE";
break;
default:
$aErrorType = "UNKNOWN ERROR TYPE";
break;
}
print( "<table border=\"1\"><tr><td>" );
print( "<b>$aErrorType</b>: <i>$aErrorStr</i><br>" );
print( "w pliku $aFile linia $aLine<br>" );
print( "</td></tr></table>" );
}
set_error_handler( "myErrorHandler" );
error_reporting( E_ALL );
?>
<html>
<head>
<title>Wasna obsuga bdw</title>
</head>
<body>
<?php
trigger_error( "Test bdw", E_USER_ERROR );
$aArray = array( "state" => "Idaho", "county" => "Madison",
"city" => "Rexburg", "country" => "US" );
print( "aArray[state] = " . $aArray[state] . "<br>" );
?>
</body>
</html>
W skrypcie na wydruku 10.6 zostaa zdefiniowana funkcja obsugi bdw myErrorHandler(), ktra
wywietla komunikaty bdw w obramowanej tabeli zawierajcej jedn komrk, co pomaga w odrnieniu
komunikatu bdu od reszty kodu HTML. Po zainstalowaniu funkcji obsugi, skrypt powoduje dwa bdy.
Pierwszy jest generowany przy uyciu funkcji PHP trigger_error(). Drugi bd (ostrzeenie) jest identyczny jak
bd pokazany na wydruku 10.3. Na rysunku 10.4. pokazany zosta wynik dziaania skryptu.
Rysunek 10.4.
Dziaanie funkcji
set_error_handler()
PHP Kompendium wiedzy
123

Uywajc funkcji set_error_handler() naley pamita, e PHP nie przekazuje do funkcji obsugi bdw
typu E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR oraz E_COMPILE_WARNING. Obsuga tego
typu bdw przez uytkownika nie jest bezpieczna. Z tego powodu w kodzie funkcji obsugi bdw z wydruku
10.6. pojawiy si komentarze nie powinien wystpi.
Uwaga na temat set_error_handler()
Funkcja set_error_handler() jest dostpna w PHP od wersji 4.0.1. Dodatkowo, funkcja uyta w tym przykadzie posiada pi
parametrw, w tym nazw skryptu, numer linii i dane kontekstu. Parametry te s dostpne dopiero w wersji 4.0.2. Wczeniejsze
wersje miay tylko dwa parametry: typ komunikatu i komunikat.
W skrypcie z wydruku 10.6 nie s wykorzystane dane na temat kontekstu. Bd one opisane w nastpnej
czci rozdziau. Dane te zawieraj nazwy i wartoci zmiennych istniejcych w skrypcie w momencie wystpienia
bdu.
Rwnie funkcja assert() pozwala na zdefiniowanie wywoywanej funkcji. Aby to zrealizowa naley
skorzysta z funkcji assert_options(). Funkcja obsugujca nieudane asercje jest zdefiniowana w nastpujcy
sposb:
function AssertCallback ($NazwaPliku, $NrLinii, $Asercja )

Uwaga na temat assert_options()
W PHP do wersji 4.0.2 wcznie, w funkcji assert_options() wystpowa may bd. Wystpowa on w przypadku wywoania
funkcji w postaci assert_options(ASSERT_CALLBACK), w celu odczytania ustawionej funkcji obsugi. Mimo, e w dokumentacji
napisano, e wywoanie takie zwrci jedynie nazw biecej funkcji obsugi, to dodatkowo oprcz zwracania nazwy, biece
ustawienie funkcji obsugi byo czyszczone. Dlatego jeeli chcesz uy funkcji assert() z funkcj obsugi upewnij si, e nie jest
wywoywana pniej funkcja assert_options() w celu sprawdzenia nazwy zarejestrowanej funkcji. Bd ten zosta zauwaony i
poprawiony w wersjach PHP powyej 4.0.2.

Na wydruku 10.7. pokazany zosta przykad zdefiniowania i uycia funkcji wywoywanej przez assert().
Wydruk 10.7. Wykorzystanie funkcji wywoywanej przez callback()
<?php
error_reporting( E_ALL );
function MyACallback( $aFileName, $aLineNum, $aAssertion )
{
print( "<table border=\"1\"><tr><td>" );
print( "<b>assert()</b> nieudane: <i>$aAssertion</i><br>" );
print( "w pliku $aFileName w linii $aLineNum<br>" );
print( "</td></tr></table>" );
}
// zarejestrowanie funkcji obsugi
assert_options( ASSERT_CALLBACK, "MyACallback" );
// wyczenie normalnych ostrzee
assert_options( ASSERT_WARNING, 0 );
?>
<html>
<head>
<title>Wasna obsuga asercji</title>
</head>
<body>
Nieudana asercja.
<?php
assert( "1 == 2" );
?>
</body>
</html>
Kod z wydruku jest podobny do tego z wydruku 10.6. Wywoanie asercji powoduje wywietlenie
jednokomrkowej tabeli. Jeeli nie zostanie opcja ASSERT_WARNING, oprcz informacji zdefiniowanych przez
uytkownika wywietlony zostanie standardowy komunikat PHP. Na rysunku 10.5. pokazany jest wynik dziaania
skryptu z wydruku 10.7.
Rozdzia 10 Uruchamianie
124

Rysunek 10.5.
Uycie funkcji
zdefiniowanej dla
assert()
PHP posiada elastyczny mechanizm obsugi bdw. Pozwala on dziki temu pisa kod atwiejszy do
uruchamiania i pniejszego utrzymania. W nastpnej czci poczymy wszystkie przedstawione do tej pory
techniki, co w efekcie pozwoli lepiej uruchamia programy w caym cyklu produkcyjnym.
Zaawansowana obsuga bdw
Po omwieniu technik obsugi bdw moemy rozpocz tworzenie oglnego narzdzia do obsugi
bdw. Motywacj do napisania tego fragmentu by brak dostarczanych przez PHP narzdzi, ktre
automatycznie cz rne typy danych o bdach. Oprcz tego, PHP 3 posiada moliwo zdalnego
uruchamiania, ktra nie zostaa przeniesiona do PHP 4. Pozwala on przesya dane za pomoc protokou TCP/IP
do innego komputera. Opcja ta prawdopodobnie niedugo si pojawi, ale na razie musz wystarczy podstawowe
techniki obsugi bdw opisane w tym rozdziale.
Przykad przytoczony w tej czci jest niezwykle dugi, wic zostanie omwiony we fragmentach. Modu
ten znajduje si w jednym pliku, MyDebug.php i bdzie on okrelony jako modu MyDebug. Jest on tak
utworzony, e moe by atwo doczony do dowolnego skryptu PHP. Po doczeniu pliku wykonywany jest kod
pokazany na wydruku 10.8.
Wydruk 10.8. Doczanie moduu MyDebug
ParseConfig( getenv( "MYDEBUG_CONFIG" ) );
if ( $aMyDebugType & MYDEBUG_DISPLAYFILE )
{
// jeeli nie mona zapisa do pliku sladu
// poinformuj o tym uzytkownika i wyczy zapis do pliku
if ( CheckFileSanity( $aMyDebugFile ) == False )
{
error_log( "MyDebug nie udao si otworzy pliku $aMyDebugFile", 0 );
$aMyDebugType &= ~MYDEBUG_DISPLAYFILE;
}
}

if ( $aMyDebugType & MYDEBUG_DISPLAYFILE )
{
$aFileHandle = fopen( $aMyDebugFile, "a" );
}

if ( $aMyDebugType & MYDEBUG_DISPLAYIP )
{
$aSocketHandle = fsockopen( "udp://$aMyDebugIP", $aMyDebugPort );
}

// Teraz rejestrujemy funkcje obsugi i funkcje porzdkujce
set_error_handler( "MyErrHandler" );
assert_options( ASSERT_CALLBACK, "MyAssertHandler" );
assert_options( ASSERT_WARNING, 0 );
register_shutdown_function( "MyDebugShutdown" );
Pierwsza linia z wydruku 10.8. powoduje przetworzenie cigu konfiguracji MyDebug, ktry jest
przechowywany w zmiennej rodowiska serwera. Na przykad, plik konfiguracyjny Apache moe zawiera kod
podobny do nastpujcego:
SetEnv MYDEBUG_CONFIG FILE=/tmp/mydebug.log;
MAIL=mydebug@intechra.net;IP=myserver.com:5400;
PHP Kompendium wiedzy
125

Ta opcja konfiguracji jest specyficzna dla moduu MyDebug i nie jest dostpna jako standardowa cz
Apache czy PHP. Przykad ten pokazuje, e mona ustawia zmienne rodowiska, poprzez pliki konfiguracyjne
serwera WWW i s one dostpne w kodzie PHP. Zmienna MYDEBUG_CONFIG definiuje miejsca, gdzie MyDebug
bdzie zapisywa bdy. W tym przypadku modu bdzie zapisywa bdy do pliku (/tmp/mydebug.log), wysya
na adres e-mail (mydebug@intechra.net)oraz do gniazda UDP (myserver.com:5400). W normalnej pracy wybiera
si zwykle jedn z metod zapisu bdw, ale modu MyDebug pozwala na stosowanie wielu jednoczesnych miejsc
zapisu bdw. Funkcja ParseConfg() analizuje cig konfiguracji i ustawia odpowiednie zmienne globalne.
Po przeanalizowaniu cigu konfiguracyjnego sprawdzane s wszystkie pliki uywane do zapisu, aby mie
pewno, e mona do nich zapisywa dane. Jeeli modu MyDebug nie moe zapisa danych do pliku,
zapisywanie do niego jest wyczane. Nastpnie otwierane s wszystkie potrzebne pliki i gniazda. Gniazdo jest
otwierane uywajc UDP, co nie wymaga istnienia procesu nasuchu. Wasno ta jest uyteczna szczeglnie
wtedy, gdy zapisywanie jest aktywne na serwerze produkcyjnym, ale nie zawsze jest aktywny proces nasuchu.
Nastpnie modu MyDebug rejestruje funkcje obsugi bdw i asercji. Ostatni operacj jest
zarejestrowanie funkcji wywoywanej po zakoczeniu programu, co pozwala na eleganckie zakoczenie dziaania
moduu. Na wydruku 10.9 pokazana jest funkcja koczca program.
Wydruk 10.9. Funkcja koczca program
function MyDebugShutdown( )
{
global $aFileHandle, $aSocketHandle, $aMyDebugType;
if ( $aMyDebugType & MYDEBUG_DISPLAYFILE )
{
fclose( $aFileHandle );
}

if ( $aMyDebugType & MYDEBUG_DISPLAYIP )
{
fclose( $aSocketHandle );
}
}
Funkcja ta zamyka wymagane pliki oraz gniazdo sieciowe. Funkcj koczc moe zarejestrowa
dowolny skrypt. PHP pozwala na rejestrowanie wielu funkcji koczcych, ktre s wykonywane w czasie
koczenia pracy skryptu. Cho ten fakt nie jest odnotowany w dokumentacji, funkcje te s wywoywane w tej
samej kolejnoci, co zostay zarejestrowanie. Poniewa kolejno ta nie zostaa udokumentowana, skrypty twoje
nie powinny polega na kolejnoci wykonywania funkcji koczcych lub musisz sam to przetestowa. Mona
przekaza dodatkowe argumenty do funkcji register_shutdown_function(). PHP przekae je do funkcji
kocowej. Naley rwnie pamita, e w funkcji kocowej nie mona wysya adnych danych do przegldarki.
Po skonfigurowaniu moduu MyDebug, obsuguje on bdy za pomoc funkcji z wydruku 10.10.
Wydruk 10.10. Funkcje obsugi bdw
// Funkcja obsugi ustawiana przez set_error_handler()
function MyErrHandler( $aErrorNo, $aErrorStr, $aFile, $aLine, $aContext)
{
MyDebug( $aErrorStr, $aFile, $aLine, MYDEBUG_ERRCALLBACK,
$aErrorNo, $aContext );
}

// Funkcja obsugi dla funcji assert_options()
function MyAssertHandler( $aFileName, $aLineNum, $aAssertion )
{
MyDebug( "asercja( $aAssertion ) nieudana", $aFileName,
$aLineNum, MYDEBUG_ASSERTCALLBACK );
}
Obie funkcje przekazuj parametry do gwnej funkcji obsugi bdw, ktra moe rwnie zosta
wywoana bezporednio ze skryptu. Gwna funkcja obsugi bdw to przedstawiona na wydruku 10.11. funkcja
MyDebug().
Wydruk 10.11. Funkcja MyDebug()
// Funkcja MyDebug jest gwn funkcj obsugi
function MyDebug( $aMessage, $aFile, $aLine,
$aCallType = MY_DEBUG_INTERNAL, $aErrType = 0,
$aErrContext = array() )
{
global $aMyDebugType;

for ( $aDisplayType = MYDEBUG_DISPLAYFILE;
$aDisplayType <= MYDEBUG_DISPLAYIP;
$aDisplayType++ )
{
Rozdzia 10 Uruchamianie
126

if ( $aDisplayType & $aMyDebugType )
{
$aType = FormatType( $aCallType, $aDisplayType );
$aMessage = FormatMsg ( $aCallType, $aMessage, $aErrType, $aDisplayType );

if ( $aCallType == MYDEBUG_ERRCALLBACK )
{
$aContext = FormatContext( $aErrContext, $aDisplayType );
}
else
{
$aContext = "";
}

MyDebugOutput( $aType, $aMessage, $aFile, $aLine, $aContext, $aDisplayType );
}
}
}
Funkcja MyDebug() formatuje rne parametry w zalenoci od typu medium zapisu (plik, e-mail lub
TCP/IP). Nastpnie wywouje funkcje MyDebugOutput() (wydruk 10.12), ktra wysya dane do prawidowego
miejsca. Funkcje formatujce z wydruku 10.11 zostan omwione pniej.
Wydruk 10.12. Funkcja MyDebugOutput()
function MyDebugOutput( $aType, $aMessage, $aFile, $aLine,
$aContext, $aDisplayType )
{
global $aFileHandle, $aSocketHandle, $aMyDebugEmail;

switch( $aDisplayType )
{
case MYDEBUG_DISPLAYFILE:
$aMsg = "$aType: '$aMessage' wystpi w $aFile w lini $aLine. ";
if ( $aContext != "" )
{
$aMsg .= "Dane kontekstu:\n{$aContext}\n";
}
else
{
$aMsg .= "\n";
}
fputs( $aFileHandle, $aMsg );
break;
case MYDEBUG_DISPLAYEMAIL:
$aMsg = "$aType: '$aMessage' wystpi w $aFile w linii $aLine. ";
if ( $aContext != "" )
{
$aMsg .= "Dane kontekstu:\n{$aContext}\n";
}
else
{
$aMsg .= "\n";
}
mail($aMyDebugEmail, "Raport MyDebug", $aMsg, "From: mydebug@host.com\r\n");
break;
case MYDEBUG_DISPLAYIP:
$aMsg = "$aType|$aMessage|$aFile|$aLine|$aContext^^";
fputs( $aSocketHandle, $aMsg );
break;
}
}
Funkcja MyDebugOutput() wysya dane do waciwych miejsc. Jest ona zaskakujco prosta, jeeli pomyli
si o efektywnoci kadej z tych opcji. Kada funkcja formatujca uyta w module MyDebug posiada mechanizm
zamiany wewntrznego numeru bdu na posta czyteln dla czowieka. Na przykad funkcja FormatType()
przedstawiona na wydruku 10.13 formatuje kod typu bdu.
Wydruk 10.13. Funkcja FormatType()
/* Funkcja formatuje typ komunikatu w oparciu o to
gdzie bdzie wywietlony */
function FormatType( $aCallType, $aDisplayType )
{
switch( $aDisplayType )
{
case MYDEBUG_DISPLAYFILE:
case MYDEBUG_DISPLAYEMAIL:
switch ( $aCallType )
{
case MYDEBUG_INTERNAL:
return "INTERNAL";
PHP Kompendium wiedzy
127

break;
case MYDEBUG_ERRCALLBACK:
return "ERROR CALLBACK";
break;
case MYDEBUG_ASSERTCALLBACK:
return "ASSERT CALLBACK";
break;
}
break;
case MYDEBUG_DISPLAYIP:
return $aCallType;
break;
}
}
Jeeli dane s wysyane poprzez TCP/IP, nie jest przeprowadzane formatowanie. Sam numer typu jest
wysyany do zdalnego komputera. W innym wypadku numer typu jest zamieniany na czytelny cig. Inne funkcje
konwertujce uyte w MyDebug dziaaj podobnie. Jedyn funkcj formatujc, ktra jest wyranie inna, jest
funkcja formatujca kontekst bdu, FormatContext(). Funkcja ta jest wywoywana jedynie wtedy, gdy bd
zostanie obsuony przez funkcj zarejestrowan za pomoc set_error_handler(). Dane kontekstu udostpniane
przez PHP zawieraj wszystkie zmienne bdce w zasigu w momencie wystpienia bdu. Dane te s przesyane
w postaci tablicy asocjacyjnej z nazwami zmiennych i ich wartociami. Analiza tych danych wymaga
wykorzystania funkcji rekurencyjnej, poniewa w kontekcie mog znajdowa si tablice. Funkcja zamieszczona
na wydruku 10.14. analizuje dane kontekstu, przeksztacajc je na posta czyteln dla czowieka.
Wydruk 10.14. Analiza danych kontekstu
/* Funkcja formatuje typ komunikatu w oparciu o to
gdzie bdzie wywietlony. Funkcja oparta o
funkcj rekurencyjn FormatContextR */
function FormatContext( $aErrContext, $aDisplayType )
{
// od tej pory wszystkie wywietlane typy
// otrzymuj ten sam cig kontekstu
$aString = "";
$aDelim = "\n";
FormatContextR( $aErrContext, $aString, $aDelim );
return $aString;
}

function FormatContextR( $aErrContext, &$aString, $aDelim )
{
foreach( $aErrContext as $aVarName => $aVarValue )
{
if ( is_array( $aVarValue ) == True )
{
$aString .= "$aVarName = array( ";
FormatContextR( $aVarValue, $aString, "," );
$aString .= " )$aDelim";
}
else
{
$aString .= "$aVarName = {$aVarValue}{$aDelim}";
}
}
}
Funkcja FormatContext() ustawia kilka parametrw i wywouje funkcj rekurencyjn FormatContextR().
Funkcja rekurencyjna przeglda tablice zmiennych kontekstu i zapisuje kad par nazwa-warto do
wynikowego cigu. Jeeli napotkana zostanie tablica, rekurencyjnie jest wywoywana funkcja FormatContextR().
W zalenoci od miejsca wystpienia bdu, kontekst lokalny moe zawiera sporo danych. Jeeli bd
wystpi w gwnej czci skryptu, w zasigu znajd si wszystkie zmienne globalne, w tym zmienne rodowiska i
zmienne GET i POST. Wszystkie te zmienne znajd si w danych kontekstu. Jeeli bd wystpi w funkcji, kontekst
bdzie zawiera jedynie zmienne lokalne funkcji.
Do skryptu testujcego (wydruk 10.15.) doczylimy modu MyDebug oraz ustawilimy zmienn
konfiguracji na zapisywanie do pliku tekstowego. Po jego uruchomieniu na kocu pliku ladu znalaz si cig
bdu. Poniszy tekst nie jest caym plikiem, jedynie wynikiem wystpienia ostatniego bdu w skrypcie:
ERROR CALLBACK: 'Typ bdu PHP: E_USER_ERROR - error in sum'
wystpi w c:\helion\php4-devguide\site\ch10\test_mydebug.phtml w lini 16. Dane kontekstu:
a = 1
b = 2
aArray = array( 0 = spring,1 = summer,2 = autumn,3 = winter, )
Wydruk 10.15. Skrypt testowy
<?php
Rozdzia 10 Uruchamianie
128

include_once( "./mydebug.php" );
?>
<html>
<head>
<title>Test moduu MyDebug</title>
</head>
<body>
Nieudana asercja.<br><br>
<?php
function sum( $a, $b )
{
$aArray = array( "spring", "summer", "autumn", "winter" );
trigger_error( "error in sum", E_USER_ERROR );
}

assert( "1 == 2" );
trigger_error( "Bd testowy", E_USER_ERROR );
$aArray = array( "state" => "Idaho", "county" => "Madison",
"city" => "Rexburg", "country" => "US" );
print( "<br><br>aArray[state] = " . $aArray[state] . "<br>" );
sum( 1, 2 );
?>
</body>
</html>
Skrypt testowy przedstawiony na wydruku 10.15. nie robi nic, poza generowaniem bdw. Wynik funkcja
sum() nie jest nigdzie uywany, ale jest ona umieszczone w tym skrypcie, aby pokaza jak wywoanie funkcji
wpywa na dane kontekstu przekazywane przez PHP. Linie z opisem bdu zamieszczone bezporednio przed
wydrukiem 15 s wygenerowane przy wywoaniu funkcji sum().
Aby pokaza elastyczno tego moduu, napisana zostaa aplikacja Windows, ktra realizuje proces
nasuchu portu TCP/IP i wywietla przychodzce dane. Jest to prosta aplikacja Delphi, ktra odczytuje pakiety
UDP przychodzce do portu 5400. Po odczytaniu danych formatuje linie i wywietla je. Na rysunku 10.6.
pokazana zostaa ta aplikacja po odebraniu kilku komunikatw wygenerowanych przez PHP.
Rysunek 10.6.
Aplikacja
nasuchu dla
MyDebug
Jednym z powodw atrakcyjnoci jzyka PHP jest to, e jest on niezwykle rozszerzalny. Modu MyDebug
jest napisany cakowicie w PHP dodajc do niego niezwykle uyteczne funkcje (kompletne rda moduu
MyDebug s dostpne wraz z wszystkimi przykadami kodu z tej ksiki). Modu ten nie jest kompletny i moe
by rozwijany na wiele sposobw. Na przykad, wykorzystanie poczty elektronicznej do raportowania bdw jest
niezwykle nieefektywne, ale mona wykorzysta poczt elektroniczn do raportowania jedynie krytycznych
bdw i ostrzee, co pozwoli na wykorzystanie tej opcji w rodowisku produkcyjnym. Niezmiernie istotny jest
fakt, e wszystkie te opcje s zrealizowane cakowicie w PHP. Nie wszystkie narzdzia programowania dla
WWW s tak elastyczne.
Podsumowanie
W tym rozdziale przedstawione zostay informacje na temat technik programowania defensywnego, ktre
pozwalaj na uniknicie moliwie duo pracy przy uruchamianiu. W chwili obecnej PHP nie posiada programu
do uruchamiania skryptw, podobnego do tych, ktre s dostpne we wielu nowoczesnych jzykach
PHP Kompendium wiedzy
129

programowania. Jednak przy odrobinie pomysowoci i wykorzystujc rozszerzalno PHP, mona stworzy
wietne narzdzia do uruchamiania aplikacji. Opisany zosta jeden z moduw, ktry zapewnia elastyczn obsug
bdw i moe by modyfikowany i rozszerzany tak, aby spenia wymagania prawie kadego programisty.
Bibliografia
Steve McConnell. Code Complete. Seattle: Microsoft Press, 1993.
Rozdzia 10 Uruchamianie
130
Rozdzia 11. Ponowne wykorzystanie
kodu
Wstp
Podczas tworzenia dowolnej aplikacji niezmiernie wane jest wykorzystanie istniejcych moduw kodu.
Pierwszym powodem jest to, e uywane moduy kodu stanowi podstaw kolejnych aplikacji i w duszym
czasie polepszaj wydajno zespou programistw.
Poniewa PHP pozwala na doczanie zewntrznych plikw oraz na tworzenie klas, ponowne
wykorzystanie kodu jest dosy proste. W tym rozdziale ponowne wykorzystanie kodu zostanie krtko omwione
z perspektywy inynierii programowania, oraz przytoczone zostanie kilka przykadw kodu PHP nadajcego si
do powtrnego wykorzystania. W rozdziale tym omwione zostanie wykorzystanie w projektach PHP kodu
napisanego w innych jzykach programowania. Taka elastyczno pozwala programistom na przenoszenie do
sieci WWW istniejcych aplikacji bez koniecznoci cakowitego przepisywania kodu.
Ponowne wykorzystanie kodu a inynieria programowania
Ponowne wykorzystanie kodu nie polega jedynie na integracji istniejcego kodu z nowym produktem.
Nowe fragmenty kodu czsto s tworzone w sposb uatwiajcy ich ponowne wykorzystanie. Gdy planowane jest
ponowne wykorzystanie kodu, wane s efekty dugoterminowe, poniewa tworzenie takiego kodu zajmuje czsto
duo wicej czasu i jest bardziej kosztowne w porwnaniu do tego samego kodu do jednokrotnego uycia
(McConnell, 1996). Zalety ponownego uycia nie s natychmiast widoczne, ale wiele firm zauwayo okoo 58%
wzrost wydajnoci rocznie w przecigu czterech lat (McConnell, 1996).
Zalety te nie bd wykorzystane, jeeli nie zostanie zastosowane odpowiednie planowanie. Poniej
przedstawione zostay niektre wane zagadnienia, jakie naley wzi pod uwag:
Zaangaowanie kierownictwa w proces ponownego wykorzystania kodu.
Upewnienie si, e tworzenie kodu do ponownego wykorzystania jest integraln czci caego procesu
produkcji oprogramowania i e wszyscy programici zgadzaj si z t ide.
Skupienie si na tworzeniu maych, precyzyjnych moduach kodu.
Tworzenie kodu do ponownego wykorzystania przy uyciu moliwie najlepszych standardw
programowania i dokumentacji.
Tworzc kod naley mie na uwadze, e przy pisaniu aplikacji w przyszoci bd potrzebne podobne
fragmenty. Majc to na uwadze, czciej naley dzieli grupy funkcji na oddzielne moduy lub klasy. Jeeli
wiadomo, e dany fragment kodu bdzie wykorzystywany w przyszoci, naley napisa go i udokumentowa w
sposb zgodny z najlepszymi zaleceniami stosowanymi w zespole. Naley unika uywania danych lub zaoe
specyficznych dla projektu, a zamiast tego tworzy modu w sposb, ktry uproci jego wykorzystanie w
przyszoci.
W PHP kod nadajcy si do powtrnego wykorzystania mona tworzy przy pomocy kilku metod, na
przykad tworzc oddzielne pliki z kodem rdowym (pliki doczane) lub tworzc klasy obiektowe. Wybr
plikw doczanych lub podejcia obiektowego nie wpywa zbytnio na oglne zaoenia. Kluczem do sukcesu jest
tworzenie kodu nadajcego si do powtrnego uycia, ktry jest odpowiednio zorganizowany i dobrze
udokumentowany. Uycie hermetyzacji i technik ukrywania danych da w efekcie maksymalne zwikszenie
wydajnoci i efektywnoci ponownie wykorzystanego kodu.

Ponowne uycie istniejcego kodu
Z powodu natury projektw internetowych, w firmie moe nie istnie zbyt wiele fragmentw kodu do
wykorzystania. Jednak ponowne wykorzystanie kodu moe jedynie wymaga przewidywania przyszych
projektw. Omwione zostan teraz niektre techniki dostpne w PHP, o ktrych naley pamita przy
projektowaniu aplikacji.
Jeeli przenosi si zwyk aplikacj biurow do sieci, lub przepisuje si z innego jzyka na PHP,
prawdopodobnie istnieje wtedy kod, ktry mona wykorzysta. Poniewa PHP jest niezwykle rozszerzalny,
istnieje wiele metod uycia obcego kodu w aplikacjach opartych o PHP. Niektre z tych metod zostan opisane w
pniejszych czciach.
PHP
PHP zawiera kilka narzdzi uatwiajcych ponowne wykorzystanie kodu. Z tego powodu zostaa
przygotowana podstawa do tworzenia narzdzi dla PHP tworzonych przez rne firmy. Niektre z nich zostay
wspomniane w poprzednich rozdziaach i s wymienione na licie zasobw internetowych, na kocu ksiki.
Najbardziej oczywist metod ponownego wykorzystania kodu PHP jest uycie funkcji include() lub
require() do doczenia istniejcego kodu. Uywane ju we wczeniejszych przykadach, funkcje te pozwalaj
na doczanie czystego kodu PHP, HTML lub ich kombinacji. Zaczynajc od wersji PHP 4, dostpne s funkcje
include_once() i require_once(), ktre upraszczaj proces doczania. Funkcje te eliminuj problem wystpujcy
przy wielokrotnym doczaniu do skryptu tego samego pliku. Na wydruku 11.1. i 11.2. przedstawiono przykad
takiego problemu i sposb jego rozwizania.
Wydruk 11.1. Plik doczany date_funcs.php
<?php
include_once( "./format_funcs.php" );
// Zwraca ilo dni pomidzy datami
// jako sformatowany cig w postaci mm-dd-rrrr
function GetDateDiff( $aDateStr1, $aDateStr2 )
{
$aDateArray1 = explode( "-", $aDateStr1 );
assert( 'count( $aDateArray1 ) == 3' );
$aDateArray2 = explode( "-", $aDateStr2 );
assert( 'count( $aDateArray2 ) == 3' );
$aTime1 = mktime( 0, 0, 0, $aDateArray1[0], $aDateArray1[1], $aDateArray1[2] );
$aTime2 = mktime( 0, 0, 0, $aDateArray2[0], $aDateArray2[1], $aDateArray2[2] );
$aTimeDiff = abs( $aTime1 - $aTime2 );
return GetFormattedNumber( $aTimeDiff / ( 60 * 60 * 24 ) );
}
?>
Wydruk 11.2. Plik doczany format_funcs.php
<?php
function GetFormattedNumber( $aNum )
{
return number_format( $aNum, 0, '.', ' ' );
}
?>
Skrypt z wydruku 11.3. wykorzystuje funkcje z obu poprzednich plikw doczanych.
Wydruk 11.3. Skrypt wykorzystujcy oba pliki doczane
<?php
include( "./date_funcs.php" );
include( "./format_funcs.php" );
?>
<html>
<head>
<title>Problem z wielokrotnym doczaniem plikw</title>
</head>
<body>
<?php
$aNumVisitors = 14500;
print( "Witryn odwiedzio " );
print( GetFormattedNumber( $aNumVisitors ) );
print( " goci " );
print( "w przecigu ostatnich " );
print( GetDateDiff( "9-21-2000", "8-15-1992" ) );
print( " dni." );
?>
</body>
Rozdzia 11 Ponowne wykorzystanie kodu
132
</html>

Problem wystpujcy w skrypcie z wydruku 11.3 wynika z tego, e plik doczany date_funcs.php docza
rwnie plik format_funcs.php. Po uruchomieniu skryptu generowany jest komunikat bdu:
Fatal error: Cannot redeclare getformattednumber() in ./format_funcs.php on line 2
Na wydruku 11.4. pokazane zostao jak atwo mona rozwiza ten problem korzystajc z funkcji
include_once().
Wydruk 11.4. Skrypt wykorzystujcy include_once()
<?php
include_once( "./date_funcs.php" );
include_once( "./format_funcs.php" );
?>
<html>
<head>
<title>Problem z wielokrotnym doczaniem plikw</title>
</head>
<body>
<?php
$aNumVisitors = 14500;
print( "Witryn odwiedzio " );
print( GetFormattedNumber( $aNumVisitors ) );
print( " goci " );
print( "w przecigu ostatnich " );
print( GetDateDiff( "9-21-2000", "8-15-1992" ) );
print( " dni." );
?>
</body>
</html>
Funkcje require() i require_once() dziaaj podobnie. Ten mechanizm doczania plikw pozwala na
tworzenie wasnych bibliotek czsto uywanych funkcji oraz wykorzystanie kodu od zewntrznych dostawcw.
Dodatkowo PHP obsuguje tworzenie klas obiektowych, ktre mona ponownie wykorzystywa lub rozszerza.
W poprzednich rozdziaach zostay pokazane przykady rozszerzania klas pochodzcych z od rnych
dostawcw. Poniewa PHP obsuguje doczanie moduw oraz programowanie obiektowe, naturalnie pozwala
na tworzenie kodu wielokrotnego uycia. Oprcz tego, rozszerzalno PHP pozwala na wykorzystanie innego
istniejcego kodu.
C/C++
PHP jest napisany w C i C++. Z tego powodu moliwa jest integracja istniejcego kodu C/C++
bezporednio w PHP. Tak naprawd wiele z rozszerze PHP jest bezporednio przeniesiona z C lub C++. Na
przykad CyberCash
TM
Merchant Control Kit zosta napisany w C a jego funkcje s dostpne w PHP jako funkcje
cybercash_xxx().
Jeeli posiadasz istniejcy kod projektu w C lub C++, ktry ma by przeniesiony do rodowiska WW,
moesz rozway doczenie tego kodu do twojej instalacji PHP. Naley jednak pamita, e wymaga to sporo
pracy i w efekcie moe by mniej efektywne, ni proste przepisanie kodu na PHP.
Skupmy si teraz na tworzeniu wbudowanych funkcji PHP opartych o istniejce funkcje w C. Jeeli
istniejcy kod jest napisany w C++, mona utworzy obiekty PHP uywajce implementacji w C++, ale nie
opiszemy tutaj tego procesu. Mona zamiast tego napisa funkcje mapujce dla metod istniejcych obiektw
C++.
Zamy, e mamy trzy funkcje zamieszczone na wydruku 11.5 i chcemy na ich podstawie utworzy
wewntrzne funkcje PHP. Funkcje te s wykorzystywane do obliczania patnoci hipotecznych i tworzenia tabel
amortyzacji w USA. Pierwsze dwie funkcje zwracaj pojedyncze wartoci oznaczajce odpowiednio rat
miesiczn i sum wszystkich rat. Ostatnia funkcja zwraca tabel wartoci reprezentujcych warto odsetek
miesicznych w racie. Uywajc tych danych mona wygenerowa harmonogram amortyzacji.
Wydruk 11.5. Funkcje w C do konwersji na PHP
/*
_fin_mpmt:
oblicza miesiczn spat kredytu w oparciu o
kwot kredytu (p), oprocentowanie (i) oraz czas (l)
*/
double _fin_mpmt (double p, double i, double l)
{
double j;
double n;
j = i / (12 * 100);
n = l * 12;
PHP Kompendium wiedzy
133

return ( p* ( j/( 1 - (pow(( 1+j ), (n * -1))))));
}
/*
_fin_total:
oblicza cakowit kwot spat w czasie trwania kredytu
w oparciu o kwot kredytu (p), oprocentowanie (i) i czas (l)
*/
double _fin_total (double p, double i, double l)
{
return _fin_mpmt( p, i, l) * l * 12;
}
/*
_fin_table:
oblicza miesiczne odsetki uywane w planie amortyzacji dla kredytw
w oparciu o kwot (p), oprocentowanie (i), i czas (l)
*/
void _fin_table ( double p, double i, double l, double *pIntPmt)
{
double n, m, h, q, j, c;
int nIndex;
j = i / (12 * 100);
n = l * 12;
q = p;
m = _fin_mpmt( p, i, l );
for (nIndex = 0; nIndex < n; nIndex++ )
{
h = q * j;
c = m - h;
q = q - c;
pIntPmt[nIndex] = h;
}
return ;
}
W dystrybucji PHP dostarczany jest program o nazwie build_skel, ktry suy do tworzenia zbioru
szkieletowych plikw konfiguracji dla nowych rozszerze PHP. Program ten znajduje si w katalogu ext
dystrybucji PHP zawierajcej pliki rdowe. Aby doda funkcje finansowe do PHP naley uruchomi build_skel
w nastpujcy sposb:
./build_skel --extname=fin_funcs --proto=/sciezka/do/fin_funcs.proto --assign-params
Parametr extname jest nazw nowego rozszerzenia PHP, natomiast proto jest nazw pliku zawierajcego
prototypy tworzonych funkcji. Plik prototypw powinien zawiera prototypy funkcji PHP. Dla funkcji
finansowych uyjemy nastpujcej zawartoci pliku prototypw:
double fin_mpmt ( double principle, double interest, double length )
double fin_total ( double principle, double interest, double length )
array fin_table ( double principle, double interest, double length )
Parametr assign-params powoduje, e pliki szkieletowe doczaj parametry o prawidowych typach, co
zostanie opisane pniej. Inne dostpne parametry pozwalaj kontrolowa wygld dokumentacji, i inne
ustawienia generacji kodu. Wicej szczegw mona uzyska uruchamiajc skrypt build_skel bez parametrw.
Po uruchomieniu skryptu w sposb przedstawiony powyej, tworzony jest nowy katalog ext/fin_funcs, ktry
zawiera pliki rozszerze wymagane przez PHP. Pierwsza zmiana musi zosta wprowadzona do pliku config.4m.
W pliku tym zawarty jest opis omawiajcy wymagane zmiany. Plik ext/fin_funcs/config.m4 jest pokazany poniej
(komentarze zostay usunite):
PHP_ARG_ENABLE(fin_funcs, whether to enable fin_funcs support,
[ --enable-fin_funcs Enable fin_funcs support])
if test "$PHP_FIN_FUNCS" != "no"; then
AC_DEFINE(HAVE_FIN_FUNCS, 1, [ ])
PHP_EXTENSION(fin_funcs, $ext_shared)
fi
Funkcja build_skel tworzy plik rdowy w C, ktry zawiera wymagane funkcje i doczone pliki
nagwkw, wic natychmiast po uruchomieniu tego narzdzia i poprawieniu pliku config.m4 mona
skompilowa PHP z obsug nowych rozszerze. Aby upewni si, e pliki szkieletowe i konfiguracyjne s
prawidowe, mona wykona nastpujce czynnoci:
1. Uruchom skrypt buildconf w gwnym katalogu PHP.
2. Uruchom skrypt configure i dodaj obsug nowego rozszerzenia.
3. Skompiluj PHP.
4. Wykonaj skrypt testowy z katalogu z rozszerzeniem (fin_funcs.php) aby sprawdzi, czy rozszerzenie jest
aktywne w PHP.
Testowy modu rozszerzenia jest uaktywniany za pomoc dyrektywy konfiguracji --enable-fin_funcs.
Skrypt testowy wykrywajcy, czy rozszerzenie dziaa jest podobny do nastpujcego:
Rozdzia 11 Ponowne wykorzystanie kodu
134

<?php
if (extension_loaded( "fin_funcs" ))
{
// Wykonaj jedn z funkcji
}
else
{
print( "modu fin_funcs niedostpny<BR>" );
}
?>
Po skonfigurowaniu PHP, aby korzysta z nowego rozszerzenia, naley jeszcze uaktualni plik extension.c,
aby zawiera implementacj kadej z funkcji. We wielu przypadkach wymaga to jedynie doczenia oryginalnych
nagwkw i wywoaniu oryginalnych funkcji. W przykadzie z funkcjami finansowymi, funkcje s zdefiniowane
w sposb pokazany na wydruku 11.6. Naley zauway, e skrypt build_skel wygenerowa wikszo kodu w
ciele kadej funkcji. Kod dodany rcznie zaznaczony jest czcionk pogrubion.
Wydruk 11.6. Funkcje finansowe dodane do PHP
/* {{{ proto double fin_mpmt(double principle, double interest, double length)
*/
PHP_FUNCTION(fin_mpmt)
{
zval **principle_arg, **interest_arg, **length_arg;
double principle;
double interest;
double length;
double aRetVal;

if (ZEND_NUM_ARGS() != 3 ||
zend_get_parameters_ex(3, &principle_arg, &interest_arg, &length_arg) == FAILURE){
WRONG_PARAM_COUNT;
}

convert_to_double_ex(principle_arg);
principle = Z_DVAL_PP(principle_arg);
convert_to_double_ex(interest_arg);
interest = Z_DVAL_PP(interest_arg);
convert_to_double_ex(length_arg);
length = Z_DVAL_PP(length_arg);
aRetVal = _fin_mpmt( principle, interest, length );
RETVAL_DOUBLE( aRetVal );
}
/* }}} */

/* {{{ proto double fin_total(double principle, double interest, double length)
*/
PHP_FUNCTION(fin_total)
{
zval **principle_arg, **interest_arg, **length_arg;
double principle;
double interest;
double length;
double aRetVal;

if (ZEND_NUM_ARGS() != 3 ||
zend_get_parameters_ex(3, &principle_arg, &interest_arg, &length_arg) == FAILURE){
WRONG_PARAM_COUNT;
}

convert_to_double_ex(principle_arg);
principle = Z_DVAL_PP(principle_arg);
convert_to_double_ex(interest_arg);
interest = Z_DVAL_PP(interest_arg);
convert_to_double_ex(length_arg);
length = Z_DVAL_PP(length_arg);
aRetVal = _fin_total( principle, interest, length );
RETVAL_DOUBLE( aRetVal );
}
/* }}} */

/* {{{ proto array fin_table(double principle, double interest, double length)
*/
PHP_FUNCTION(fin_table)
{
zval **principle_arg, **interest_arg, **length_arg;
double principle;
double interest;
double length;
double *pIntPmts;
int n, nIndex;
PHP Kompendium wiedzy
135


if (ZEND_NUM_ARGS() != 3 ||
zend_get_parameters_ex(3, &principle_arg, &interest_arg, &length_arg) == FAILURE){
WRONG_PARAM_COUNT;
}

convert_to_double_ex(principle_arg);
principle = Z_DVAL_PP(principle_arg);
convert_to_double_ex(interest_arg);
interest = Z_DVAL_PP(interest_arg);
convert_to_double_ex(length_arg);
length = Z_DVAL_PP(le
n = (int)length * 12;
ngth_arg);
pIntPmts = emalloc( sizeof( double ) * n );
_fin_table( principle, interest, length, pIntPmts );
if (array_init(return_value)== FAILURE )
{
php_error( E_ERROR, "fin_table: nie udao si utworzy tablicy");
}
else
{
for ( nIndex = 0; nindex < n; nIndex++ )
add_next_index_double( return_value, pIntPmts[nIndex]);
}
efree( pIntPmts );
}
/* }}} */
W pierwszych dwch funkcjach do implementacji rozszerzenia wymagane byo napisanie jednie trzech
linii kodu. Pierwsza linia jest deklaracj zmiennej, druga wywouje wewntrzn funkcj obliczajc warto a
trzecia ustawia zwracan warto. Ostania funkcja jest utworzona w taki sposb, aby zwracaa tablic PHP.
Wymaga to nieco wicej pracy od dwch pierwszych funkcji, ale wyniki tej pracy s znaczce.
Implementacja funkcji fin_table() pokazuje kilka technik wanych dla programowania dla PHP. Po
pierwsze, przydzia pamici jest przeprowadzany za pomoc funkcji emalloc(), natomiast efree() zapewnia, e
PHP wykona normalny proces odzyskiwania nieuytkw. W implementacji fin_table() pami jest przydzielana
dla tablicy tymczasowej zawierajcej wartoci wygenerowane przez funkcj C _fin_table(). Po wywoaniu
funkcji wbudowanej, zwracana warto jest deklarowana przy pomocy wywoania funkcji array_init() jako
tablica PHP. Nastpnie przy pomocy ptli przebiegajcej po kolejnych komrkach tablicy i kolejnych wywoa
funkcji add_next_index_double(), wartoci z tablicy C s kopiowane do nowej tablicy PHP. Na koniec
tymczasowa tablica jest niszczona i funkcja si koczy.
Po wbudowaniu tych funkcji w PHP, mog by one wywoywane identycznie, jak inne wewntrzne
funkcje PHP. Na wydruku 11.7 pokazujemy przykad uycia nowego rozszerzenia.
Wydruk 11.7. Uycie funkcji finansowych dodanych do PHP
<html>
<head>
<title>Kalkulator kredytowy</title>
</head>
<body>
<?php
if ( $REQUEST_METHOD == 'POST' )
{
print( "Kwota poyczki: <b>" . number_format( $Amount ) . "</b><br>" );
print( "Oprocentowanie: <b>{$Interest}%</b><br>" );
print( "Czas spaty: <b>$Term lat</b><br><hr>" );
$aMontlyPayment = fin_mpmt( $Amount, $Interest, $Term );
print("Rata miesiczna: <b>" . number_format( $aMontlyPayment, 2 ) . "</b><br>");
print( "Suma rat: <b>" .
number_format( fin_total( $Amount, $Interest, $Term ), 2 ) . "</b><br><br>" );
$aArray = fin_table( $Amount, $Interest, $Term );
?>
<table border="1">
<tr>
<td>
Rata nr.
</td>
<td>
Podstawa
</td>
<td>
Odsetki
</td>
</tr>
<?php
$nIndex = 1;
Rozdzia 11 Ponowne wykorzystanie kodu
136

foreach( $aArray as $aIntPmt )
{
$aPrinciple = number_format( $aMontlyPayment - $aIntPmt, 2 );
$aIntPmt = number_format( $aIntPmt, 2 );
?>
<tr>
<td>
<?=$nIndex?>
</td>
<td>
<?=$aPrinciple?>
</td>
<td>
<?=$aIntPmt?>
</td>
</tr>
<?php
$nIndex++;
}
?>
</table>
<?php
}
?>
<form action="<?=$PHP_SELF?>" method="post">
<table>
<tr>
<td colspan="2">
To jest prosty kalkulator rat kredytu.
Wprowad kwot poyczki, oprocentowanie i czas spaty
</td>
</tr>
<tr>
<td>
Kwota:
</td>
<td>
<input type="text" name="Amount">
</td>
</tr>
<tr>
<td>
Oprocentowanie ("7.5" == 7.5%):
</td>
<td>
<input type="text" name="Interest">
</td>
</tr>
<tr>
<td>
Czas spaty (w latach):
</td>
<td>
<input type="text" name="Term">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="Wylij">
</td>
</tr>
</table>
</form>
</body>
</html>
Skrypt ten wywietla formularz do wprowadzenia danych kredytu, a nastpnie wysya je do samego siebie.
Po wywoaniu go poprzez wywoanie HTTP POST, wywoywane s funkcje finansowe i wywietlane wyniki ich
dziaania. Na rysunku 11.1. pokazany jest fragment strony bdcej wynikiem typowego wykonania programu.
PHP Kompendium wiedzy
137

Rysunek 11.1.
Wykorzystanie
nowych funkcji
finansowych

Jak wspomniano wczeniej, jeeli masz du bibliotek kodu C/C++ pochodzc z istniejcych aplikacji i
zamierzasz przenie je do rodowiska WWW, PHP posiada prosty mechanizm integracji istniejcego kodu z
nowymi aplikacjami. Zalet tego rozwizania jest moliwo ponownego wykorzystania dobrze przetestowanego
kodu oraz dobra wydajno skompilowanego kodu. Dodatkowo, funkcje napisane w C lub C++ mog realizowa
funkcje, ktrych nie da si napisa wycznie w PHP. Na przykad implementacja bezpiecznych gniazd zapewnia
moliwoci, ktre nie mog by w chwili obecnej zrealizowane przy pomocy funkcji PHP.
Rozwaajc integracj istniejcego kodu C/C++ z PHP naley wzi pod uwag, e koszt integracji moe
by wyszy od kosztu przepisania kodu na PHP. Przytoczony wczeniej przykad moe by atwo przepisany na
PHP i zajmie to mniej czasu. Dodatkowo kroki podjte w czasie integracji musz by w czci powtrzone dla
kadej nowej wersji PHP. Jeeli zamierzasz zawsze korzysta z najnowszej wersji PHP, powoduje to konieczno
cigej konserwacji istniejcej witryny.
Inn moliwoci wykorzystania istniejcego kodu C/C++ jest jego skompilowanie i wykonywanie na
serwerze WWW poprzez PHP. Metoda ta zostanie opisana w dalszej czci rozdziau.
Java
W rozdziale 9, Niezaleno od przegldarki przedstawiony zosta opis poczenia Javy z PHP.
Moliwo uywania klas Javy zostaa wprowadzona w PHP4. Z powodu popularnoci Javy, dostpne jest wiele
klas i moduw klas Javy, oferowanych przez wielu niezalenych dostawcw. Obsuga Javy nie jest wczona
domylnie do PHP, wic naley przekompilowa PHP, aby mc skorzysta z tego potnego narzdzia.
Dodawanie obsugi Javy w PHP na *niksach
Jeeli korzystasz z PHP na platformie *nix, musisz przekompilowa PHP w celu dodania obsugi Javy. W
podrczniku PHP znajdziemy, e nie mona wykorzysta opcji konfiguracji --with-java, jeeli posiadasz PHP
statycznie wczone w Apache. Opcja ta dziaa, jeeli PHP jest uruchamiany jako program CGI lub dynamicznie
wczany modu Apache. Z powodw bezpieczestwa nie zaleca si korzystania z PHP w postaci CGI. Jeeli
serwer Apache nie posiada obsugi dynamicznych moduw, naley go wczeniej przekompilowa.
Rozdzia 11 Ponowne wykorzystanie kodu
138

Poniszy skrypt powoduje przekompilowanie Apache tak, aby korzysta z dynamicznie adowanych
moduw oraz tworzy waciwie skonfigurowany skrypt apxs, ktry bdzie potrzebny do skompilowania PHP. W
skrypcie tym zakadamy, e bdzie on uruchomiony z gwnego katalogu instalacji Apache.
make clean
./configure --enable-module=so --enable-rule=SHARED_CORE --prefix=/www
make
make install
Po przekompilowaniu Apache mona uaktywni obsug Javy w PHP za pomoc nastpujcego skryptu.
Zakadamy w nim, e bdzie uruchomiony z gwnego katalogu instalacji PHP.
make clean
./configure --with-apxs=/www/bin/apxs --with-java ...
make
make install
Opcja --with-java moe zawiera ciek oznaczajc katalog instalacji uywanej maszyny wirtualnej
Javy. Po zakoczeniu kompilacji mona sprawdzi konfiguracj PHP za pomoc funkcji phpinfo(). Naley
rwnie ustawi kilka opcji konfiguracji Javy w pliku php.ini. Pierwsza jest linia z doczeniem rozszerzenia
(extension=libphp_java.so). Pozostae opcje zostan omwione pniej.
Doczanie obsugi Javy w PHP dla Windows
Zamiast kompilowania specjalnej wersji PHP dla Windows, rozszerzenie Javy jest dostpne do pobrania z
www.php.net. Powiniene sprawdzi ktra wersja JDK (Java Development Kit) jest zainstalowana na serwerze.
Mona to zrobi przy pomocy java -showversion. Naley pobra odpowiedni plik rozszerzenia i skopiowa
php_java.dll do katalogu systemowego. W Windows 95 jest to zwykle \windows\system a Windows NT
\winnt\system32.
Nastpnie naley uaktualni plik php.ini. Naley doda lini adujc rozszerzenie
(extension=php_java.dll). Nastpnie naley doda odpowiednio sekcj z opcjami konfiguracji. S one kluczowe
do prawidowego dziaania Javy na kadej platformie.
Opcje konfiguracji Javy
Niezalenie od platformy, jeeli obsuga Javy jest aktywna w PHP, musisz doda kilka opcji konfiguracji
do pliku php.ini. W Windows sekcja ta powinna wyglda podobnie do nastpujcej:
[java]
java.class.path="D:\php4\php_java.jar;D:\PHP4 book\other\RTF2HTML\lib\Scrooge_09b7.jar"
java.home="D:\Program Files\JavaSoft\JRE\1.3"
java.library="D:\Program Files\JavaSoft\JRE\1.3\bin\hotspot\jvm.dll"
W przypadku systemw *nix, sekcja ta jest nastpujca:
[java]
java.library.path=/usr/lib/kafee:/home/blake/php-4.0.1p12/modules
java.home=/usr/lib/kaffe
java.class.path=/usr/share/kaffe/Klasses.jar:/home/blake/php-
4.0.1.p12/ext/java/php_java.jar:/home/blake/bhawk/lib/bhawk4j.jar:/home/blake/bhawk:/home/blake/java/num
berspeller.jar:/home/blake/java/sax2.jar:/home/blake/java/servlet.jar:/home/blake/java/scrooge.jar
java.library=/www/libexec/libkaffevm.so
Po skonfigurowaniu obsugi Javy, w pliku php.ini musisz poda lokalizacj klas Javy lub plikw JAR.
Naley to wykona dla kadej uywanej klasy Javy, ktrej chcesz uywa. Jak wida na zamieszczonych opcjach
konfiguracji, java.class.path zawiera pen ciek do plikw implementacji.
Tak jak jest to w przypadku kadego jzyka umoliwiajcego tworzenie komponentw, dla Javy dostpne
jest wiele narzdzi, z ktrych mona skorzysta za pomoc jzyka obsugujcego API. Jednym z dostpnych
komercyjnie moduw Javy jest konwerter RTH na HTML Scrooge, ktry mona zaadowa z witryny
www.betabeans.de. Modu ten posiada prosty interfejs uywany do konwertowania plikw RTF na standardowy
HTML. Funkcja ta moe by wykorzystywana we wielu aplikacjach, w ktrych uytkownicy mog wysya takie
pliki. Poniewa RTF obsuguje rne czcionki i ukady, wykorzystanie RTF pozwala uytkownikowi na
dostarczanie plikw bez niebezpieczestwa bezporedniego dodawania kodu HTML do witryny. Modu Scrooge
zawiera przykadowy plik RTF (pokazany na rysunku 11.2.) ktrego moemy uy do sprawdzenia siy i
elastycznoci moduu.
PHP Kompendium wiedzy
139

Rysunek 11.2.
Przykadowy plik
RTF moduu
Scrooge
Uycie moduu Scrooge jest atwe i proste. Doczona dokumentacja zawiera nazw klasy Javy, oraz list
dostpnych metod i waciwoci. W skrypcie z wydruku 11.8 pokazane jest wykorzystanie tego moduu.
Wydruk 11.8. Uycie moduu Javy Scrooge
<HTML>
<HEAD>
<TITLE>Konwersja RTF na HTML</TITLE>
</HEAD>
<BODY>
<?php
if ($REQUEST_METHOD == 'POST' )
{
if ( ( $rtffile_type == "text/richtext" ) ||
( $rtffile_type == "application/rtf" ) )
{
// utworzenie obiektu Scrooge
$aR2H = new Java ("de.betabeans.scrooge.Scrooge");
$aArray = file ( $rtffile );

$sR2H->setOptWrapHTML( False );
$aOutput = $aR2H->convert( implode( "", $aArray) );
print( $aOutput );
}
else
{
print ("Wybrany plk nie jest plikiem <b>RTF</b>.<BR>");
}
}
?>
<FORM METHOD="POST" ACTION="<?=$PHP_SELF?>" enctype="multipart/form-data">
Przesyanie pliku: <INPUT TYPE="file" NAME="rtffile"><br><br>
<INPUT TYPE="submit" NAME="submit" value="Wylij">
</FORM>
</BODY>
</HTML>
Skrypt ten zawiera formularz przesyania pliku, za pomoc ktrego uytkownik moe przesa plik RTF.
Po przesaniu danych formularza sprawdzany jest typ pliku i jeeli jest prawidowy tworzony jest obiekt Scrooge.
Rozdzia 11 Ponowne wykorzystanie kodu
140

Przesany plik jest odczytywany do tablicy za pomoc funkcji file(), a nastpnie uywajc funkcji implode(),
tablica jest konwertowana na cig, ktry jest przekazywany do obiektu Scrooge. Zwracan wartoci jest cig
zawierajcy kod HTML utworzony na podstawie przesanego pliku. Wynikowy kod HTML jest wysyany do
przegldarki. Na rysunku 11.3. przedstawiony jest wynik uzyskany z przykadowego pliku RTF.
Rysunek 11.3.
Wynik
przetworzenia
przykadowego
pliku RTF na kod
HTML
nie potrafi uruchomi tego przykadu
Java jest tylko jednym z jzykw umoliwiajcych tworzenie komponentw, ktre mona wykorzysta w
rodowisku PHP. Nastpna cz opisuje uycie obiektw COM w PHP.
COM
COM jest z natury oparty o Windows, wic dyskusja ta odnosi si bdzie do PHP dziaajcego na
serwerze pracujcym pod kontrol systemu Windows. Standardowa instalacja PHP dla Windows posiada obsug
COM, wic nie jest potrzebna dodatkowa konfiguracja. Implementacja COM w PHP ewoluowaa z opartego o
funkcje API w wersji 3, do implementacji obiektowej w PHP 4. Powoduje to, e uycie COM w PHP jest bardzo
naturalne.
W czci tej omwimy serwer konwersji walut Cloanto Currency Server, dostpny z witryny
http://cloanto.com. Obiekt ten pozwala na przeliczanie walut pomidzy sob i posiada wewntrzn baz danych
kursw. Baza ta jest automatycznie uaktualniana, wic mona uy tego moduu w midzynarodowej aplikacji
handlu elektronicznego w celu umoliwienia wywietlania cen w lokalnej walucie.
Obiekt ten posiada bogaty zestaw metod, ale bardzo atwo mona uy podstawowych funkcji w
rodowisku testowym. Na wydruku 11.9. zamieszczony jest przykad wykorzystania tego obiektu. Rysunki 11.4. i
11.5. pokazuj formularz z cenami w dwch rnych walutach.
Wydruk 11.9. Uycie serwera konwersji walut Cloanto
<html>
<head>
<title>Uycie potokw</title>
</head>
<body>
<?php
$aFreeProg = '/usr/bin/free';
if ( !is_file( $aFreeProg ) )
{
print( "Nie mona znale programu na serwerze<br>" );
}
else
{
$aLines = array();
if ( $aProgFile = popen( $aFreeProg . " -t", "r" ) )
{
$nIndex = 0;
$aLines = array();
while ( !feof( $aProgFile ) )
{
$aLine = fgets( $aProgFile, 1024 );
$aLines[$nIndex++] = $aLine;
}
pclose( $aProgFile );

$aCount = count( $aLines );
$aTotal = $aLines[$aCount - 2];
$aArray = split( "[ ]+", $aTotal );
$aTotalK = number_format( $aArray[1] );
$aUsedK = number_format( $aArray[2] );
$aFreeK = number_format( $aArray[3] );
?>
Cakowita ilo dostpnej pamici <?=$aTotalK?> KB.<br>
Wolna pami <?=$aFreeK?> KB.<br>
Uyte <?=$aUsedK?> KB.<br>
<?php
}
else
PHP Kompendium wiedzy
141

{
print ( "Nie mona uy programu na serwerze<br>" );
}
}
?>
</body>
</html>
Rysunek 11.4.
Przykad uycia
serwera Cloanto,
wywietlana
waluta: dolary
amerykaskie

Rysunek 11.5.
Przykad uycia
serwera Cloanto,
wywietlana
waluta: forinty
wgierskie
W skrypcie umieszczonym na wydruku 11.9. utworzona jest prosta tabela cen dla trzech rnych towarw.
Dodatkowo dostpny jest formularz do wyboru lokalnej waluty. Po przesaniu danych formularza skrypt
wykorzystuje serwer Cloanto do przeliczenia cen na wybran walut. Obiekt ten jest uywany do uzyskania listy
krajw, wspczynnikw wymiany oraz wykonuje przeliczanie na bieco.
Jeeli tworzona jest aplikacja handlu elektronicznego, przy pomocy tego obiektu mona doda niezwykle
przydatn dla uytkownikw funkcj, ktra eliminuje frustrujce pomyki w liczeniu cen. Wykorzystujc serwer
Cloanto wraz z wykrywaniem typu przegldarki mona przelicza ceny na lokaln walut bez potrzeby pytania
uytkownika o jej nazw.
Rozdzia 11 Ponowne wykorzystanie kodu
142

Z powodu duej iloci programistw Windows oraz dojrzaoci modelu COM, dostpne jest wiele
komponentw dla wszystkich typw projektw. Uywajc obsugi COM w PHP mona z atwoci wykorzysta
istniejcy kod we wasnych projektach.
Inne metody
Prawdopodobnie posiadasz istniejcy kod, ktrego nie da si wykorzysta przy uyciu adnej z
przedstawionych metod. Jeeli tak si stanie, nadal mona go wykorzysta w PHP. Jeeli kod ten jest skryptem
(na przykad skryptem Perla) lub mona go skompilowa do postaci wykonywalnej, da si go zastosowa w
skrypcie.
PHP posiada kilka funkcji sucych do uruchamiania programw i skryptw na serwerze. Poniewa
tematem tego rozdziau jest integracja, najlepsz metod wykorzystania programw na serwerze bdzie
skorzystanie z funkcji popen() do uruchamiania programw i skryptw oraz przechwytywania ich wynikw.
Technika ta bya przedstawiona w rozdziale 4 Operacje na plikach, na przykadzie programu whois, dostpnego
na wikszoci systemw *nix. Na wydruku 11.10. pokazany zosta przykad odczytywania biecej iloci uytej
pamici w systemach *nix.
Wydruk 11.10. Uycie potokw do integracji PHP z istniejcymi skryptami lub programami
wykonywalnymi
<html>
<head>
<title>Uycie potokw</title>
</head>
<body>
<?php
$aFreeProg = '/usr/bin/free';
if ( !is_file( $aFreeProg ) )
{
print( "Nie mona znale programu na serwerze<br>" );
}
else
{
$aLines = array();
if ( $aProgFile = popen( $aFreeProg . " -t", "r" ) )
{
$nIndex = 0;
$aLines = array();
while ( !feof( $aProgFile ) )
{
$aLine = fgets( $aProgFile, 1024 );
$aLines[$nIndex++] = $aLine;
}
pclose( $aProgFile );

$aCount = count( $aLines );
$aTotal = $aLines[$aCount - 2];
$aArray = split( "[ ]+", $aTotal );
$aTotalK = number_format( $aArray[1] );
$aUsedK = number_format( $aArray[2] );
$aFreeK = number_format( $aArray[3] );
?>
Cakowita ilo dostpnej pamici <?=$aTotalK?> KB.<br>
Wolna pami <?=$aFreeK?> KB.<br>
Uyte <?=$aUsedK?> KB.<br>
<?php
}
else
{
print ( "Nie mona uy programu na serwerze<br>" );
}
}
?>
</body>
</html>
Skrypt ten otwiera potok do standardowego programu free. Program zwraca dane na temat iloci
dostpnej pamici w komputerze. Skrypt otwiera potok, ktry powoduje uruchomienie programu. Skrypt
odczytuje z potoku kolejne wiersze wyniku i wywietla je w przegldarce. W zalenoci od zwracanych danych
moe by niezbdna bardziej zaawansowana analiza, ale podstawowa idea jest ta sama.
PHP Kompendium wiedzy
143
Technika ta moe by uyta dla kadego programu, ktry zwraca wyniki na standardowe wyjcie. W
przypadku systemw Unix oznacza to, e mona w ten sposb uy nieomal kadej komendy bezporednio z

PHP. Pozwala to atwo zrealizowa odczytanie statusu systemu, zwracanie danych lub inne operacje. Jeeli trzeba
przenie istniejcy kod do PHP, pozwala to na szybkie prototypowanie, przed zastosowaniem wczeniej
opisanych metod. Pozwala to na szybsze rozpoczcie testowania funkcji aplikacji minimalizujc ilo
koniecznych prac programistycznych. Naley jednak zaznaczy, e uruchamianie programw wymaga znacznej
iloci zasobw serwera, co moe powodowa, e aplikacja bdzie powolna i trudna do skalowania.
Podsumowanie
W PHP nie brakuje moliwoci ponownego uycia kodu. Planujc tworzenie biblioteki kodu w PHP
przeznaczonej do wielokrotnego uytku lub przenoszc istniejcy kod do aplikacji WWW, mona znale
odpowiednie rozwizanie. Z powodu olbrzymiej iloci istniejcych komponentw (zarwno COM jak i Javy)
moe si okaza, e wikszo projektowanej aplikacji jest ju napisana. Uywajc tych komponentw mona
znacznie zmniejszy czas potrzebny na napisanie programu. Uywajc ich mdrze, mona otrzyma aplikacj
atwiejsza w konserwacji i skalowaniu.
Bibliografia
Steve McConnell, Rapid Development. Seattle: Microsoft Press. 1996.
Rozdzia 11 Ponowne wykorzystanie kodu
144
Rozdzia 12. Oddzielanie kodu HTML od
PHP
Wstp
Przy projektowaniu zwykych aplikacji zwykle nie bierze si pod uwag oddzielania tworzenia interfejsu
uytkownika od tworzenia czci wykonawczej programu. Jest to spowodowane tym, e standardowe aplikacje
wykorzystuj standardowe narzdzia tworzenia interfejsu uytkownika, dostpne dla wikszoci programistw.
Jedynymi fragmentami tworzonymi przez inne osoby s emblematy, rysunki przyciskw i podobne elementy
wpywajce na graficzny wygld produktu.
Programowanie dla WWW, pozwala na zastosowanie o wiele bogatszego interfejsu uytkownika i przez to
bardzo czsto wymaga zatrudnienia projektantw specjalizujcych si w tworzeniu strony graficznej aplikacji.
Gdy tworzenie interfejsu i kodu jest rozdzielone pomidzy zespoami lub osobami, oddzielenie kodu i HTML
staje si naturalne a integracja wynikw pracy wana. Nawet w maych jednoosobowych projektach oddzielenie
HTML od logiki aplikacji powoduje, e konserwacja aplikacji jest prostsza i bardziej efektywna.
Wprowadzenie
Programowanie dla WWW jest czsto nazywane tworzeniem aplikacji wielowarstwowej, poniewa
stosowane s tutaj oddzielne logiczne warstwy. Czsto uywanymi nazwami warstw s: warstwa prezentacji,
warstwa aplikacji (biznesowa) oraz warstwa bazy danych. Kada z tych warstw moe by fizycznie oddzielona od
drugiej. Najwaniejszym zadaniem przy projektowaniu wielowarstwowym jest logiczne oddzielenie warstw a nie
ich fizyczna implementacja.
Gwnymi zaletami podejcia wielowarstwowego przy tworzeniu aplikacji WWW s:
Moliwo przydzielenia zada osobom najlepiej przygotowanym do ich realizacji. Na przykad: graficy i
projektanci przygotowuj stron graficzn aplikacji, programici tworz logik aplikacji a projektanci baz
danych projektuj i uruchamiaj infrastruktur bazy danych.
Moliwo zmian w warstwie bez potrzeby modyfikacji innych. W praktyce nadal jest to trudne, ale wiele
maych zmian ogranicza si do pojedynczej warstwy.
Moliwo przeniesienia bd replikacji okrelonych warstw na inny sprzt w celu zapewnienia
skalowania bd nadmiarowoci.
Tak jak w przypadku wszystkich aplikacji, podczas trwania projektu aplikacji dla WWW mog pojawi
si dania wprowadzenia zmian. Jeeli zmiany te s ograniczone do jednej warstwy, moliwe jest, e nie bdzie
konieczne ponowne kodowanie. Celem tego rozdziau jest pokazanie sposobw tworzenia aplikacji odpornych na
zmiany w pnych stadiach rozwoju. Dodatkowo oddzielenie interfejsu uytkownika od logiki aplikacji jest jedn
z technik programowania modularnego, ktre pozwala na atwiejsze uycie istniejcych moduw.
W programowaniu tradycyjnym projekt modularny jest zwykle postrzegany jako tworzenie moduw
kodu, ktre mog by uywane w dowolnych aplikacjach. W przypadku projektowania dla WWW, moduy mog
zawiera dane bdce czci interfejsu, np. prawa autorskie lub mog by moduami kodu.
Modularno wicej wnosi do atwoci utrzymania aplikacji ni strukturalno i jest najwaniejszym
czynnikiem zapobiegania koniecznoci tworzenia poprawek do aplikacji majcych za zadanie usuwanie bdw.
Wedug bada 89% uytkownikw kodu zgaszao poprawienie moliwoci utrzymania aplikacji modularnej, a w
rozlegych testach programici osigali o 15% lepsze wyniki pracujc nad programem modularnym ni nad
niemodularnym (McConnell, 1993).

Jak wspomniano w poprzednim rozdziale, tworzenie aplikacji modularnej wymaga dodatkowych prac
projektowych i podjcia odpowiednich decyzji, ale w efekcie mona otrzyma aplikacj atwiejsz do
zrozumienia i konserwacji. W ksice A Methodology for Client/Server and Web Application Development Roger
Fournier sugeruje, e wsplne fragmenty lub moduy aplikacji zawsze powinny by najpierw projektowane,
tworzone i testowane a nastpnie udostpniane dla caej korporacji. Komponenty te powinny zawiera nie tylko
moduy kodu, ale rwnie procedury przechowywane w bazie danych, wyzwalacze i zdalne procedury (Fournier,
1998).
W kolejnych czciach zostanie opisane kilka metod implementacji tych metod. Dodatkowo w tym
rozdziale jak rwnie w rozdziale 14 Witryny oparte o szablony, doczone s kompletne przykady
zastosowania tych technik. Niektre przykady w kolejnych czciach pokazuj techniki jakich naley unika.
Oddzielenie i integracja przy uyciu wbudowanych funkcji
PHP
Poniewa PHP zawiera bogaty zestaw funkcji i narzdzi, oddzielenie moduw kodu od moduw
interfejsu moe by zrealizowane bezporednio przy pomocy narzdzi jzyka. Cz ta opisuje kilka sposobw
zrealizowania tego zadania.
Motywacja
Pierwsz motywacj dla oddzielenia elementw HTML od kodu jest umoliwienie ponownego
wykorzystania kodu oraz jego atwiejszej konserwacji. W wszystkich przykadach umieszczonych do tej pory w
ksice, HTML i PHP byy wymieszane w celu otrzymania krtkich i prostych przykadw. W przypadku
tworzenia kodu prawdziwego kodu technika ta jest niewygodna i powoduje powstanie trudnych do analizy
skryptw. Dla przykadu, skrypt z wydruku 12.1 zawiera fragment strony WWW ze zintegrowanym kodem PHP i
HTML.
Wydruk 12.1. PHP i HTML w jednym skrypcie
<?php
if ( $aShowForm == True ) {
?>
<p>
<font face="Arial" size="3">
<b>
<?php
print( $aQuestion );
?>
</b>
<form action="response.php3" method="POST">
<?php if (!empty( $UserID )) { ?>
<input type="Hidden" name="UserID" value="<?php print($aUserID );
?>">
<?php } ?>
<?php if ($aQuestionID != -1 ) { ?>
<input type="Hidden" name="QuestionID"
value="<?php print($aQuestionID ); ?>">
<?php } ?>
<ul>
<font face="Arial" size="2">
<!--wywietl moliwe odpowiedzi-->
<?php
if ( $aQuestionID != -1 )
{
if ($aSortOrd != 0 ) //Sortowanie alfabetyczne
{
$aSQL = "SELECT * FROM Answers WHERE (QuestionID=$aQuestionID)
ORDER BY Text";
}
else
{
$aSQL = "SELECT * FROM Answers WHERE (QuestionID=$aQuestionID)";
}
$aDB->SetSQL( $aSQL );
Rozdzia 12 Oddzielanie kodu HTML od PHP
146

Oprcz tego, e przykad jest niekompletny, Wydruk 12.1 pokazuje jak skomplikowana moe sta si
strona HTML z wbudowanym PHP. Nawet pomoc edytorw wyrniajcych skadni, zlokalizowanie blokw
kodu moe by trudne.
Problemy z utrzymaniem tego typu skryptw wykraczaj jednak poza podstawowe problemy z
czytelnoci kodu. Rwnie trudno jest wprowadza zmiany zarwno do kodu, jak i wygldu strony bez
wpywania na inne elementy. Na przykad, zamy, e projektanci uaktualni wygld przyciskw nawigacji i
musz by one umieszczone w witrynie. Odpowied na pytanie kto powinien wprowadzi zmiany jest trudna,
poniewa projektanci mog nie mie wystarczajco duo dowiadczenia, aby nie popsu kodu podczas
wprowadzania zmian, a programici mog by zmuszeni uaktualnia fragmenty kodu jedynie w celu zmiany
wygldu. W obu przypadkach wynikiem s opnienia w projekcie. Mona tego unikn stosujc lepsze praktyki
projektowe.
Jeeli twoja firma zamierza dostarcza wysokiej jakoci i atwe do konserwacji aplikacje WWW,
tworzenie stron za pomoc przedstawionej metody nie powinno by stosowane. Dodatkowo, jeeli
zainwestowano w projekt interfejsu, nie naley tego marnowa tworzc aplikacj utrudniajc wprowadzanie
prostych zmian. Teraz zostan zademonstrowane dostpne w PHP metody integrowania oddzielnych moduw
kodu i projektu.
Implementacja
Najprostsza metod integracji osobnych moduw jest wykorzystanie funkcji PHP include() lub
require(). Metoda ta wymaga umieszczenia elementw projektu HTML w osobnych plikach, ktre s uywane
przez moduy kodu PHP w czasie ich wykonywania. Na przykad na wydruku 12.2 i 12.3 umieszczone s
fragmenty projektu strony rozdzielonej na nagwek i stopk. Na wydruku 12.4 pokazano sposb integracji tych
segmentw z dynamicznie tworzonym fragmentem strony.
Wydruk 12.2. Fragment z nagwkiem HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Nowe ksiki wydawnictwa Helion</title>
</head>
<body>
<img src="logo.jpg" width="622" height="106" alt="" border="0">
<h1>Nowoci wydawnictwa Helion</h1>
Wydruk 12.3. Fragment ze stopk HTML
<br><br><br>
<hr>
<p>
&copy; 2001 Helion. Wszystkie prawa zastrzeone.
</p>
</body>
</html>
Wydruk 12.4. Skrypt czcy kod z projektem
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Nowe ksiki wydawnictwa Helion</title>
</head>
<body>
<img src="logo.jpg" width="250" height="68" alt="" border="0">
<h1>Nowoci wydawnictwa Helion</h1>
Mimo, jest to bardzo prosty przykad, pokazuje on w jaki sposb mona uy funkcji include() w celu
integracji HTML i kodu, co uatwia tworzenie efektywnych i atwych do modyfikacji aplikacji. Na wydruku 12.1
pokazany jest wygld wynikowej strony w przegldarce. Przykad ten pokazuje warto oddzielenia kodu od
HTML. Jeeli projekt nagwka lub stopki ulegnie modyfikacji, naley zmieni jedynie pliki HTML.
PHP Kompendium wiedzy
147

Rysunek 12.1.
czenie
HTML i kodu
PHP przy
uyciu
include()

Zamiast funkcji include() lub reqiure(), mona rwnie wykorzysta standardowe funkcje obsugi
plikw dostpne w PHP w celu odczytania plikw HTML i doczenia ich do strony. Metoda ta pozwala na
wiksz kontrol nad obsug plikw, w tym odszukiwanie plikw i obsug bdw. Uycie wasnych funkcji
doczania plikw pozwala na to, aby w plikach HTML nie byo adnego kodu PHP.
Kolejne wydruki zawieraj bardziej szczegowy przykad wykorzystania poprzedniej techniki
wykorzystujc funkcje obsugi plikw zamiast funkcji include(). Dodatkowo uyte zostay kaskadowe arkusze
stylw (CSS) w celu zapewnienia wikszych moliwoci zmiany wygldu strony. Na wydruku 12.5. i 12.6.
ponownie jest umieszczony nagwek i stopka, natomiast na wydruku 12.7 znajduje si warstwa logiczna strony.
Dla celw tej demonstracji utworzone zostay dwa osobne pliki CSS.
Wydruk 12.5. Nagwek HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Nowe ksiki wydawnictwa Helion</title>
<link rel="STYLESHEET" type="text/css" href="css1.css">
</head>
<body>
<img src="logo.jpg" width="622" height="106" alt="" border="0">
<h1>Nowoci wydawnictwa Helion</h1>
Wydruk 12.6. Stopka HTML
<p class="copyright">
&copy; 2001 Helion. Wszystkie prawa zastrzeone.
</p>
</body>
</html>
Wydruk 12.7. Skrypt aplikacji PHP
<?php
function MyIncludeFile( $aFileName )
{
if ( !is_file( $aFileName ) )
{
// przekierunkowanie na stron bdu
exit;
}
$aFileArray = file( $aFileName );
foreach( $aFileArray as $aLine )
{
print( "$aLine" );
Rozdzia 12 Oddzielanie kodu HTML od PHP
148

}
}
MyIncludeFile( "./header_2.html" );

include( "./db_mysql.inc" );

// tworzenie klasy news_db class suce do odczytu wiadomoci
class news_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

// Tworzenie obiektu klasy news_db i odczytanie wiadomoci
$aDB = new news_db;
$aDB->query( "select * from news order by date desc limit 5" );
while( $aDB->next_record() )
{
$aNewsID = $aDB->f( "news_id" );
$aAuthor = $aDB->f( "author" );
$aTitle = $aDB->f( "title" );
$aSynopsis = $aDB->f( "synopsis" );

print( "<h2>$aTitle</h2>" );
print( "<h4>autor: $aAuthor</h4>" );
print( "<p>$aSynopsis</p>" );
print( "<a href=\"full_story.phtml?news_id=$aNewsID\">peny tekst...</a>" );
print( "<br><br><hr>" );
}


MyIncludeFile( "./footer_2.html" );
?>
Aplikacja ta wykorzystuje ma baz danych do przechowywania tekstw wiadomoci. Tak jak w
poprzednich przykadach, w przykadzie tym wykorzystane s klasy obsugi baz danych PHPLIB. Zawarto i
struktura bazy danych nie jest istotna, poniewa jest to przykad rozdzielania kodu oraz technik jego integracji.
Dodatkowo wana jest elastyczno rozwizania wykorzystujcego pliki CSS. Mimo, e w tekcie strony PHP
znajduje si kilka podstawowych znacznikw HTML, ich uycie jest ograniczone a sposb ich interpretacji jest
kontrolowany przez CSS. Wygld kompletnej strony jest pokazany na rysunkach 12.2. i 12.3.
PHP Kompendium wiedzy
149

Rysunek
12.2.
Przykado
wa
aplikacja
z
pierwszym
arkuszem
stylw

Rozdzia 12 Oddzielanie kodu HTML od PHP
150

Rysunek
12.3.
Przykado
wa
aplikacja
z
pierwszym
arkuszem
stylw
Czego naley unika
Korzystajc z tej metody naley unika mieszania kodu programu i HTML. Doczane pliki HTML
powinny zawiera jedynie kod HTML, a doczane pliki PHP jedynie kod PHP. Uatwia to rozdzielenie
odpowiedzialnoci programistw PHP i projektantw interfejsu. Naley unika kodu PHP, ktry generuje kod
HTML. Cho pozwala to na pisanie kodu PHP nie zawierajcego znacznikw HTML, powoduje to, e za zmiany
projektu witryny odpowiada programista PHP. Utrudnia to rwnie wprowadzanie hurtowych zmian w wygldzie
caej witryny WWW.
Podsumowanie: Oddzielanie i integracja przy wykorzystaniu funkcji
PHP
Tworzc mechanizm oddzielania kodu PHP od HTML naley pamita o najwaniejszych celach takiego
dziaania. Czasami programici przesadzaj w swoim zapale pisania kodu i tworz mechanizmy, ktre nie
speniaj prawdziwych potrzeb. Celem oddzielenia HTML od PHP jest uproszczenie aplikacji, podzia
odpowiedzialnoci pomidzy projektantami i programistami oraz uatwiaj konserwacj aplikacji.
Celem oddzielenia HTML od PHP moe by cakowite oddzielenie projektu od logiki aplikacji. Uywajc
przedstawionych technik i wykorzystujc przy projektowaniu pliki CSS, cel ten jest nieomal osignity. Jednak
czasami trzeba dynamicznie wygenerowa niektre znaczniki HTML, na przykad moe by to generowany
dynamicznie znacznik cza. Rwnie jeeli przesyany jest identyfikator sesji lub inny identyfikator specyficzny
dla aplikacji, trzeba dynamicznie generowa wszystkie cza. W tych przypadkach jeeli wykorzystywana bdzie
opisana technika integracji, niezbdne bdzie doczenie czci znacznikw HTML do kodu PHP.
PHP Kompendium wiedzy
151

W nastpnej czci zatytuowanej Wykorzystanie systemu szablonw opisuj szczegy metody
umoliwiajcej cakowite oddzielenie kodu PHP od HTML. Jest to zalecana metoda, poniewa cay HTML moe
by pod opiek projektantw.
Wykorzystanie systemu szablonw
System szablonw jest mechanizmem przeznaczonym do cakowitego oddzielenia elementw projektu
HTML od kodu PHP. Oczywist zalet wykorzystania szablonw jest umoliwienie dowiadczonym
projektantom HTML na cakowite panowanie nad wszystkimi aspektami projektu. Gdy wszystkie znaczniki
HTML zostan usunite z kodu, caa warstwa projektu interfejsu aplikacji moe by modyfikowana niezalenie
od logiki aplikacji.
Tak jak przy wszystkich dotychczasowych technikach projektowania, aby osign zamierzony wynik
wykorzystujc szablony, wymagane s dodatkowe prace projektowe oraz skuteczne wprowadzenia ich w ycie.
Podstawowym zaoeniem jest podzia strony na jeden lub wicej szablonw projektowych, ktre s czone z
dynamiczn zawartoci generowan przez kod PHP. W prostych aplikacjach plik szablonu moe by
wykorzystywany dla wszystkich stron witryny. W bardziej skomplikowanych, moe by uyte bardzo wiele
szablonw.
FastTemplate
Mimo, e kady moe zbudowa wasny system szablonw, dostpne jest wietne narzdzie o nazwie
FastNet, ktre mona zaadowa z witryny www.thewebmasters.net. FastTemplate jest atwy do uycia i istnieje
specjalna dokumentacja dla pocztkujcych. Aby rozpocz prac z FastTemplate naley utworzy plik szablonu,
zwykle z rozszerzeniem tpl. Nastpnie w kodzie naley wykona nastpujce kroki:
1. Utworzenie obiektu klasy FastTemplate.
2. Uycie metody define() do przydzielenia plikom szablonw unikalnych nazw.
3. Uycie metody assign() do skojarzenia wartoci do zmiennych szablonu.
4. Uruchomienie metody parse() do przetworzenia pliki szablonu i przypisania wartoci do zmiennych.
5. Uycie metod FastPrint() lub fetch() do wypisania lub odczytania przetworzonego pliku szablonu.
W szablonach FastTemplate zmienne s umieszczane w nawiasach klamrowych ({}). Przykadowy plik
szablonu znajduje si na wydruku 12.8.
Wydruk 12.8. Przykadowy szablon FastTemplate
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>{TITLE}</title>
</head>
<body bgcolor="{BODY_COLOR}">
{BODY}
<hr>
<font size="1">
{COPYRIGHT}
</font>
</body>
</html>
Przykadowy szablon pokazany na wydruku 12.8 zawiera cztery zmienne FastTemplate: TITLE,
BODY_COLOR, BODY i COPYRIGHT. W najprostszym przypadku, zmienne te mog by ustawione bezporednio z kodu,
w sposb pokazany na wydruku 12.9.
Wydruk 12.9. Skrypt aplikacji
<?php
include( "class.FastTemplate.php" );

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( 'basic' => 'sample_1.tpl' ) );

$aBodyText = "Bardzo krtka zawarto strony. ";
for ( $nIndex = 1; $nIndex <= 10; $nIndex++ )
{
$aBodyText .= "$nIndex ";
}

Rozdzia 12 Oddzielanie kodu HTML od PHP
152

$aTemplate->assign( array( 'TITLE' => 'Prosty przykad',
'BODY_COLOR' => 'white',
'BODY' => $aBodyText,
'COPYRIGHT' => 'Helion 2001, wszystkie prawa zastrzeone' ) );

$aTemplate->parse( 'PAGE', 'basic' );

$aTemplate->FastPrint( 'PAGE' );
?>
Pierwszym krokiem jest utworzenie obiektu klasy FastTemplate. Konstruktor wymaga jednego argumentu
cieki do pliku szablonu. W naszym przykadzie zosta wykorzystany biecy katalog .. Nastpnie plikowi
umieszczonemu na wydruku 12.8 zostaje nadana nazwa basic. W kilku kolejnych liniach generowany i
zapamitywany jest rwnie test strony oraz wykorzystujc metod assign(), zmiennym FastTemplate
przypisywane s wartoci. Na koniec Szablon jest przetwarzany i zapamitywany w zmiennej PAGE, a nastpnie jej
zawarto wysyana jest do przegldarki. Wynik pokazany jest na rysunku 12.4.
Rysunek 12.4.
Wynik
przetwarzania
prostego szablonu

Po przetworzeniu szablonu przez obiekt FastTemplate, wynik jest zapisany w zmiennej, ktra moe zosta
wydrukowana lub zachowana dla innych celw, lub zmienna ta moe by uyta w kolejnym szablonie. Ostatnia
opcja pozwala na zagniedanie plikw szablonw. Nowymi plikami s: plik z danymi o prawach autorskich,
oraz gwny plik szablonu zamieszczone odpowiednio na wydrukach 10 i 11.
Wydruk 12.10. Szablon z prawami autorskimi (copyright.tpl)
&copy; {YEARS} Helion.
Wszystkie prawa zastrzeone. Dodatkowe informacje na temat praw autorskich
mozna znale <a href="legal.phtml">tutaj</a>.
Wydruk 12.11. Gwny plik szablonu (body.tpl)
<table width="100%">
<tr>
<th colspan="3">
{PAGE_HEADER}
</th>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td align="center" valign="top">
<!-- Panel nawigacji -->
<a href="index.phtml">pocztek</a><br><br>
<a href="about.phtml">o nas</a><br><br>
<a href="links.phtml">cza</a><br><br>
</td>
<td width="90%" valign="top">
<!-- Gwna sekcja tekstu -->
{PAGE_CONTENT}
</td>
<td width="125" valign="top">
<!-- Tutaj reklamy i inne -->
</td>
</tr>
</table>
Kady z dodatkowych plikw szablonw, ktre zostay do tej pory pokazane, zawieraj swoje zmienne
FastTemplate i aby szablony dziaay prawidowo, musz im zosta przypisane wartoci. Jeeli nie zostanie
przypisana zmienna FastTemplate, wygenerowane zostan nastpujce ostrzeenia:
[Wed Sep 12 19:42:38 2001] [error] [FastTemplate] Warning: no value found for variable: {PAGE_HEADER}
[Wed Sep 12 19:42:38 2001] [error] [FastTemplate] Warning: no value found for variable: {PAGE_CONTENT}
[Wed Sep 12 19:42:38 2001] [error] [FastTemplate] Warning: no value found for variable: {YEARS}
PHP Kompendium wiedzy
153

Dodajc nowe pliki szablonw naley rwnie zmieni gwny plik PHP. Na wydruku 12.12 pokazany
jest nowy skrypt PHP uywajcy zagniedonych szablonw.
Wydruk 12.12. Zagniedone pliki szablonw
<?php
include( "class.FastTemplate.php" );

function GetCurrentYear( )
{
$aNow = getdate();
$aNowYear = $aNow["year"];

return $aNowYear;
}

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( 'basic' => 'sample_1.tpl',
'copyright' => 'copyright.tpl',
'body' => 'body.tpl' ) );

$aBodyText = "Bardzo krtka zawarto strony. ";
for ( $nIndex = 1; $nIndex <= 10; $nIndex++ )
{
$aBodyText .= "$nIndex ";
}
$aStartYear = 1997;
$aCurrentYear = GetCurrentYear();
$aYears = "$aStartYear";
for ( $nIndex = $aStartYear + 1; $nIndex <= $aCurrentYear; $nIndex++ )
{
$aYears .= ", $nIndex";
}

$aTemplate->assign( array( 'TITLE' => 'Lepszy przykad',
'BODY_COLOR' => 'white',
'YEARS' => $aYears,
'PAGE_HEADER' => 'Lepszy przykad',
'PAGE_CONTENT' => $aBodyText
) );

$aTemplate->parse( 'BODY', 'body' );
$aTemplate->parse( 'COPYRIGHT', 'copyright' );
$aTemplate->parse( 'PAGE', 'basic' );

$aTemplate->FastPrint( 'PAGE' );
?>
W przykadzie tym zdefiniowano dwa dodatkowe pliki szablonw nadajc im nazwy copyright i body.
Poniewa te pliki szablonw zawieraj wasne zmienne FastTemplate, zmiennym tym naley przypisa wartoci.
Warto zmiennej YEARS jest generowana automatycznie, wic dane o prawach autorskich s zawsze aktualne.
Zmienna $aBodyText posiada identyczn warto jak w poprzednim przykadzie. Naley zauway, e w tym
rozdziale zmienne BODY i COPYRIGHT nie s ustawiane w metodzie assign(). Zamiast tego zmienne te otrzymuj
wartoci przy wywoaniu metody parse() na kocu tego skryptu. Wynik dziaania tego skryptu jest pokazany na
rysunku 12.5.
Rozdzia 12 Oddzielanie kodu HTML od PHP
154

Rysunek 12.5.
Wynik dziaania
zagniedonych
szablonw
FastTemplate

Klasa FastTemplate jest potnym narzdziem, za pomoc ktrego mona tworzy bogate i zoone
projekty interfejsu. Aby lepiej zilustrowa t technik w kolejnym przykadzie wrcimy do przykadu aplikacji
dostarczajcej najnowszych wiadomoci. Zamiast wykorzystywa do tego celu pliki doczane, w kodzie tym
wykorzystana zostanie sia klasy FastTemplate.
Na wydrukach 12.13, 12.14 i 12.15 umieszczony jest kod HTML szablonw tworzcych podstawowy
ukad strony, tre i element wiadomoci. W przykadzie tym uyty jest szablon zawierajcy prawa autorskie,
wykorzystany w poprzednim przykadzie.
Wydruk 12.13. Podstawowy szablon dla aplikacji dostarczajcej wiadomoci (ft_news_base.tpl)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>{TITLE}</title>
<link rel="STYLESHEET" type="text/css" href="css2.css">
</head>
{NEWS_BODY}
</html>
Wydruk 12.14. Szablon treci w aplikacji wiadomoci (ft_news_body.tpl)
<body>
<table width="640" border="0" align="center">
<tr>
<td>
<img src="logo.jpg" width="250" height="68" alt="" border="0">
<h1>Nowoci wydawnictwa Helion</h1>
</td>
</tr>
<tr>
<td>
<br><br>
{NEWS_ITEMS}
</td>
</tr>
<tr>
<td>
<br>
<p class="copyright">
{COPYRIGHT}
</p>
</td>
</tr>
</table>
</body>
Wydruk 12.15. Szablon elementu wiadomoci (ft_news_item.tpl)
<h2>{NEWS_TITLE}</h2>
<h4>autor: {NEWS_AUTHOR}</h4>
<p>{NEWS_SYNOPSIS}</p>
<a href="{FULL_STORY_URL}">wicej...</a>
<br><br><hr>
Na wydruku 12.16. zamieszczony jest skrypt generujcy stron z nowociami. Skrypt ten jest bardziej
skomplikowany ni w poprzednim przykadzie, ale wikszo kodu pochodzi z poprzednich przykadw.
PHP Kompendium wiedzy
155

Wydruk 12.16. Gwny skrypt aplikacji
<?php
include( "class.FastTemplate.php" );
include( "./db_mysql.inc" );

error_reporting( E_ALL & ~E_NOTICE );

function GetCurrentYear( )
{
$aNow = getdate();
$aNowYear = $aNow["year"];

return $aNowYear;
}

// Tworzenie klasy news_db do pobrania wiadomoci
class news_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( "base" => "ft_news_base.tpl",
"body" => "ft_news_body.tpl",
"item" => "ft_news_item.tpl",
"copyright" => "copyright.tpl" ) );

// generowanie roku dla treci praw autorskich
$aStartYear = 1997;
$aCurrentYear = GetCurrentYear();
$aYears = "$aStartYear";
for ( $nIndex = $aStartYear + 1; $nIndex <= $aCurrentYear; $nIndex++ )
{
$aYears .= ", $nIndex";
}

$aTemplate->assign( array( "YEARS" => $aYears,
"TITLE" => "Nowoci wydawnictwa Helion" ) );

// Tworzenie obiektu klasy news_db i generowanie elementw wiadomoci
$aDB = new news_db;
$aDB->query( "select * from news order by date desc limit 5" );
while( $aDB->next_record() )
{
$aNewsID = $aDB->f( "news_id" );
$aAuthor = $aDB->f( "author" );
$aTitle = $aDB->f( "title" );
$aSynopsis = $aDB->f( "synopsis" );

$aURL = "full_story.phtml?news_id=$aNewsID";

$aTemplate->assign( array( "NEWS_TITLE" => $aTitle,
"NEWS_AUTHOR" => $aAuthor,
"NEWS_SYNOPSIS" => $aSynopsis,
"FULL_STORY_URL" => $aURL ) );

$aTemplate->parse( "NEWS_ITEMS", ".item" );
}

$aTemplate->parse( "COPYRIGHT", "copyright" );
$aTemplate->parse( "NEWS_BODY", "body" );
$aTemplate->parse( "BASE", "base" );
$aTemplate->FastPrint( "BASE" );
?>
W przykadzie tym funkcja generujca rok dla tekstu o prawach autorskich pochodzi z poprzednich
przykadw, a obsuga bazy danych z poprzedniej realizacji aplikacji wiadomoci. Zauwamy, e na pocztku
skryptu wyczone zostay ostrzeenia PHP, poniewa ostrzeenie generowane przez FastTemplate zostan
omwione pniej.
W skrypcie tym zdefiniowane zostay cztery pliki szablonw. Na pocztku skryptu inicjowane s dwie
gwne zmienne FastTemplate, YEARS i TITLE reprezentujce odpowiednio rok praw autorskich i tytu strony.
Kolejn gwn funkcj skryptu jest dynamiczne dodawanie kolejnych wiadomoci. Zostao to
zrealizowane przez pobranie piciu najnowszych wiadomoci z bazy danych i wypisanie ich przy pomocy ptli.
W kadym przebiegu ptli przetwarzany jest szablon item i dodawany do zmiennej FastTemplate NEWS_ITEMS.
Rozdzia 12 Oddzielanie kodu HTML od PHP
156

Dodawanie to jest zrealizowane poprzez dodanie kropki (.) przed nazw szablonu. Dlatego wanie w pierwszym
przebiegu ptli FastTemplate generuje ostrzeenie wskazujce, e zmienna NEWS_ITEMS nie jest zainicjowana. Po
ustawieniu w ptli wartoci zmiennej NEWS_ITEMS przetwarzana jest reszta szablonw a nastpnie drukowana
strona.
Poprzedni przykad pokazuje w jaki sposb mona wykorzysta klas FastTemplate do generowania
powtarzajcych si elementw, takich jak tre kolejnych wiadomoci. Podobna konstrukcja moe by
wykorzystana do tworzenia wierszy tablicy lub listy czy. Po poznaniu podstawowych zaoe uywanie
FastTemplate staje si niezwykle naturalne.
Oczywist zalet klasy FastTemplate jak rwnie innych systemw szablonw jest to, e elementy
projektu strony mog by tworzone i zmieniane niezalenie od kodu aplikacji. Mimo, e wykorzystanie systemu
szablonw wymaga nieco innego mylenia w trakcie projektowania, jest ono warte zainteresowania.
Zaawansowane techniki uycia FastTemplate
W poprzednich rozdziaach dwa zagadnienia byy z rozmysem odsuwane a do tego rozdziau. Pierwsze
zostao wspomniane w rozdziale 7. Sesje i stan aplikacji, w ktrym mwiono o lepszych sposobach
przenoszenia identyfikatora sesji w aplikacji. Drugie znalazo si w rozdziale 9. Niezaleno od przegldarki,
gdzie znalaza si sugestia, e system szablonw moe by alternatywn metod dostarczania zawartoci zalenej
od typu przegldarki. W tej czci skupimy si na tych dwch zagadnieniach.
Pierwsze zagadnienie, przesyanie identyfikatora sesji, powinno by w tym momencie dosy oczywiste.
Wykorzystujc szablony projekt moe zawiera dynamiczne cza URL generowane w kodzie PHP. Podstawowy
przykad szablonu nawigacyjnego zamieszczony jest na wydruku 12.17.
Wydruk 12.17. Szablon nawigacji (navi.tpl)
<a href="{HREF_INDEX}">pocztek</a>
<a href="{HREF_NEWS}">nowoci</a>
<a href="{HREF_LINKS}">cza</a>
Waciwe adresy URL dla czy mog by tak generowane, aby zawieray identyfikator sesji, lub inny
specyficzny dla aplikacji. Inn zalet wykorzystania takich adresw jest atwa modyfikacja pooenia stron w
czasie pracy aplikacji. Na wydruku 12.18 zamieszczony jest skrypt generujcy dynamiczne adresy URL dla
poprzedniego szablonu.
Wydruk 12.18. Szablon nawigacji
<?php
include( "class.FastTemplate.php" );

session_start();
function MyGenURL( $aLinkName )
{
switch( $aLinkName )
{
case 'HREF_INDEX' :
$aBaseURL = 'index.phtml';
break;
case 'HREF_NEWS' :
$aBaseURL = 'news.phtml';
break;
case 'HREF_LINKS' :
$aBaseURL = 'links.phtml';
break;
default :
$aBaseURL = 'badlink.phtml';
break;
}
return $aBaseURL . session_name() . "=" . session_id();
}

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( 'navi' => 'navi.tpl' ) );

$aTemplate->assign( array( 'HREF_INDEX' => MyGenURL( 'HREF_INDEX' ),
'HREF_NEWS' => MyGenURL( 'HREF_NEWS' ),
'HREF_LINKS' => MyGenURL( 'HREF_LINKS' ) ) );

$aTemplate->parse( 'NAVI', 'navi' );
$aTemplate->FastPrint( 'NAVI' );
?>
PHP Kompendium wiedzy
157

Funkcja MyGenURL() jest gwnym elementem skryptu. Pobiera ona symboliczn nazw cza i zwraca
prawdziw lokalizacj strony wraz z doczonymi danymi sesji. Funkcja taka ma dodatkow moliwo obsugi
nieznanych nazw czy. Pozwala to unika brzydkich komunikatw HTTP 404: Page Not Found spotykanych
we wielu aplikacjach WWW.
Wykorzystanie szablonw do dostarczania treci zalenych od przegldarki rwnie jest korzystne. W
rozdziale 9. zasugerowane byy metody warunkowego doczania plikw lub przekierowania uytkownika do
katalogu odpowiadajcego uywanej przegldarce. Uywajc szablonw preferowana jest pierwsza metoda.
Problemem z przekierowaniem jest to, e uytkownik moe wysa cze do strony do osoby uywajcej innej
przegldarki. Przykad umieszczony na wydrukach 19., 20., 21. i 22. pokazuje w jaki sposb mona zintegrowa
treci zalene od typu przegldarki z szablonami. Na wydruku 12.19. pokazany jest gwny szablon strony.
Wydruk 12.20. i 12.21. to strony zalene od moliwoci przegldarki, natomiast wydruk 12.22 zawiera skrypt
PHP.
Wydruk 12.19. Podstawowy szablon strony (base_basic.tpl)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>{TITLE}</title>
</head>
<body>
{NAVI}
</body>
</html>
Wydruk 12.20. Menu oparte o Flash (flash_menu.tpl)
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
WIDTH=320 HEIGHT=240>
<PARAM NAME=movie VALUE="flash_menu.swf"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor
VALUE=#FFFFFF> <EMBED src="Track As Menu.swf" quality=high bgcolor=#FFFFFF WIDTH=320 HEIGHT=240
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
Wydruk 12.21. Menu HTML (html_menu.tpl)
<a href="index.phtml">pocztek</a>
<a href="news.phtml">wiadomoci</a>
<a href="links.phtml">cza</a>
Wydruk 12.22. Skrypt
<?php
include( "class.FastTemplate.php" );

// zakadamy, e zmienna $aHasFlash jest ustawiana przez
// prawdziw funkcj wykrywania Flash-a
$aHasFlash = False;
if ( $aHasFlash == True )
{
$aNaviFile = "flash_menu.tpl";
}
else
{
$aNaviFile = "html_menu.tpl";
}

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( "navi" => $aNaviFile,
"base" => "base_basic.tpl" ) );

$aTemplate->assign(array("TITLE" => "Przykad dziaania zalenego od przegldarki"));

$aTemplate->parse( "NAVI", "navi" );
$aTemplate->parse( "BASE", "base" );
$aTemplate->FastPrint( "BASE" );
?>
Przykad ten pokazuje, w jaki sposb mona umieszcza na stronie menu zrealizowane w programie
Macromedia Flash
TM
, gdy uywana przegldarka potrafi je wywietli i zwyke menu HTML w przypadku
korzystania z innych przegldarek. Oczywicie powinna zosta wykorzystana prawdziwa funkcja wykrywajca,
podobna do tej zamieszczonej na witrynie firmy Macromedia.
W oparciu o specyficzne potrzeby witryny mona pomysowo rozdziela wiele aspektw projektu w
zalenoci od moliwoci uywanej przegldarki i wykorzysta system szablonw do dostarczenia najlepszej
zawartoci dla kadej z przegldarek.
Rozdzia 12 Oddzielanie kodu HTML od PHP
158

Podsumowanie
Oddzielanie elementw projektu aplikacji WWW od jej logiki powoduje promowanie projektowania
modularnego i dziki temu zwikszenie moliwoci ponownego wykorzystania kodu oraz jego atwiejszej
konserwacji. Z powodu elastycznoci PHP cel modularnego tworzenia witryn WWW moe by osignity
wieloma sposobami. Zalecan w tym rozdziale metod jest wykorzystanie systemu szablonw, ktry pozwala na
pene oddzielenie wszystkich elementw projektu od kodu.
Tak zupenie na marginesie, rozdzia ten ma podoe czysto osobiste. Jaki czas temu zdaem sobie
spraw, e nigdy nie bd projektantem graficznym ani artyst, wic w mojej firmie powiciem sporo czasu na
znalezienie sposobu na doczenie projektw profesjonalnych projektantw z moimi aplikacjami. Pozwala to
osign ogln popraw witryny, poniewa warstwa prezentacji jest odpowiedniej jakoci a ja nie musz jej
tworzy ani zmienia samemu. Wykorzystuj klas FastTemplate w nieomal wszystkich moich obecnych
projektach. Pozwala ona moim projektantom atwo stworzy pliki szablonw stron wykorzystujc nawiasy
klamrowe do zaznaczenia elementw i pozwala mi na projektowanie w peni funkcjonalne oraz szybkie zmiany w
logice aplikacji.
Bibliografia
Roger Fournier. A Mehodology for Client/Server and Web Application Development. New Jersey:
Prentice Hall PTR. 1998.
Steve McConnell. Code Complete. Seattle: Microsoft Press. 1993.
PHP Kompendium wiedzy
159
Rozdzia 13. Fajny PHP
Wstp
W przypadku jzyka tak potnego i rozszerzalnego jak PHP, trudno jest poszufladkowa wszystkie fajne
rzeczy, jakie mona zrobi przy jego pomocy. Rozdzia ten zawiera opis niektrych z nich. Tematy tu omawiane
s albo zagadnieniami, ktre musiaem kiedy zaprogramowa, albo odpowiedziami na pytania czsto
pojawiajce si na listach dyskusyjnych powiconym PHP. Rozdzia ten nie opisuje oczywicie wszystkich
rozszerze i wasnoci PHP, ale opisuje niektre z nich, ktre nie zostay opisane w innych czciach ksiki.
Wysyanie do przegldarki plikw innych ni HTML
Oglnie mwic, PHP jest wykorzystywany do wysyania plikw HTML do przegldarki, ale moe by
on rwnie uyty do automatyzacji cigania plikw, lub dostarczania innych typw plikw do przegldarki. Na
przykad mona umoliwi uytkownikom na zapisanie fragmentu zawartoci bazy danych w formacie
tekstowym, na przykad takim jak CSV. Przykad ten ilustruje sposb, w jaki mona umoliwi uytkownikom
zapisanie fragmentu tabeli bazy danych. Na wydruku 13.1. umieszczono skrypt pobierajcy dane z bazy danych,
formatujcy je oraz wysyajcy je do przegldarki.
Wydruk 13.1. Wysyanie CSV do przegldarki
<?php
include_once( "db_mysql.php" );

// Tworzenie klasy pochodnej po DB_Sql sucej do pobrania danych pracownika
class employee_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

$aSQL = "select * from employees ";

$aDB = new employee_db;
$aDB->query( $aSQL );
/* metoda metadata() bardzo zaley od wersji MySQL
przykad ten moe nie dziaa dobrze na wszystkich wersjach MySQL */
$aMetaData = $aDB->metadata();

$aData = "";

$aNumFields = count( $aMetaData );
for ( $nIndex = 0; $nIndex < $aNumFields; $nIndex++ )
{
$aData .= "\"" . $aMetaData[$nIndex]["name"] . "\",";
}
// usunicie ostatniego znaku w cigu (,) i znaku koca linii (\n)
$aData = substr( $aData, 0, strlen( $aData ) - 1 ) . "\n";

while ( $aDB->next_record() )
{
$aLine = "";
for ( $nIndex = 0; $nIndex < $aNumFields; $nIndex++ )
{
$aLine .= "\"" . $aDB->f( $nIndex ) . "\",";
}
// usunicie ostatniego znaku w cigu (,) i znaku koca linii (\n)
$aLine = substr( $aLine, 0, strlen( $aLine ) - 1 );
$aLine .= "\n";

$aData .= $aLine;
}

header( "Content-length: " . strlen( $aData ) );
header( "Content-type: application/octetstream" );
header( "Content-disposition: inline; filename=\"employees.csv\"" );

print( $aData );
?>
Pierwsz czynnoci realizowan przez skrypt jest zdefiniowanie klasy pochodnej po klasie DB_Sql
pochodzcej z PHPLIB, ktra jest uywana do uruchomienia zapytania na bazie danych. Wicej informacji na ten
temat znajduje si w rozdziale 6. Wsppraca z bazami danych. Nastpnie wykonywane jest zapytanie i
pobierane z niego s metadane. Metadane zawieraj ilo pl oraz nazw kadego ze zwracanych pl. Dane te s
potrzebne do skonstruowania pierwszej linii pliku CSV. Zwykle CSV zawiera wiersz nagwka zawierajcy
nazwy pl, a nastpnie umieszczone s wiersze danych. Kade pole w CSV jest umieszczone w cudzysowach i
oddzielona s od siebie przecinkami. Kady wiersz koczy si znakiem nowej linii.
Po dodaniu wiesza nagwka, skrypt przebiega po kolejnych rekordach wyniku i konstruuje z nich
sformatowane wiersze CSV. Nastpnie do przegldarki wysyane s trzy wiersze nagwka HTML. Pierwszy
zawiera wielko wysyanego pliku, Nastpna zawiera typ zawartoci pliku. Jest ona wana, poniewa
przegldarka wykorzystuje te dane do rozpoznania, w jaki sposb powinna traktowa przesyane dane. Jeeli linia
ta zawieraa by text/html, przegldarka prbowaa by wywietli przychodzce dane w postaci HTML. Poniewa
typem tym jest w tym przypadku application/octetstream, przegldarka nie prbuje wywietli tych danych, a
zamiast tego pozwala zapisa je na dysku. Ostatni wiersz wskazuje przegldarce, e dane s wysyane razem z
nagwkami oraz sugeruje nazw dla zapisywanego pliku. Na rysunku 13.1. pokazane jest okno dialogowe
wywietlane przez Internet Explorer po uruchomieniu tego skryptu.
Pierwsze dwie linie tego pliku umieszczone s na wydruku 13.2., natomiast na rysunku 13.2. wida
wygld tego pliku w programie Microsoft Excel.
Rysunek 13.1.
Okno dialogowe
Zapisz jako


PHP Kompendium wiedzy
161

Rysunek 13.2. Plik
CSV w Excelu
Wydruk 13.2. Surowy plik CSV
"id","first","last","address","position"
"1","Bob","Smith","Poziomkowa 16, Miastko","Szef marketingu"
Innym czstym zastosowaniem przesyania zawartoci innej ni HTML do przegldarki, jest wysyanie
plikw graficznych. Na przykad moesz mie aplikacj, ktra zapisuje mae rysunki w bazie danych. Nastpnie
mona przy pomocy PHP zapisywa je oraz pobiera i wywietla. Poniszy wydruk pokazuje w jaki sposb
mona pobiera rysunki poprzez formularz HTML, zapisywa je w bazie danych, a nastpnie wywietla je na
innej stronie. Na wydruku 13.3. znajduje si formularz HTML uywany do przesyania rysunkw, natomiast
wydruk 13.4. zawiera skrypt zapisujcy rysunki do bazy danych. Tabela MySQL uywana do przechowywania
rysunkw zdefiniowana jest nastpujco:
CREATE TABLE pictures (
picture_id int(11) DEFAULT '0' NOT NULL,
name varchar(30) NOT NULL,
date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
pic_data mediumblob NOT NULL,
pic_size int(11) DEFAULT '0' NOT NULL,
pic_type varchar(30) NOT NULL,
PRIMARY KEY (picture_id)
);
Wydruk 13.3. Formularz przesyania plikw
<html>
<head>
<title>Przesyanie rysunkw</title>
</head>
<body>
<form action="upload_pic.phtml" method="post" enctype="multipart/form-data">
<table>
<tr>
<td colspan="2">
Prosz wybra plik z rysunkiem (jpeg lub gif)
do przesania, oraz poda jego nazw.
</td>
</tr>
<tr>
<td>
Plik rysunku:
</td>
<td>
<input type="file" name="PicFile">
</td>
</tr>
<tr>
<td>
Nazwa rysunku:
</td>
<td>
<input type="text" name="PicName" maxlength="30">
Rozdzia 13 Fajny PHP
162

</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="Wylij">
</td>
</tr>
</table>
</form>
</body>
</html>
Wydruk 13.4. Zapisywanie przesanego pliku w bazie danych
<?php
include_once( "db_mysql.php" );

// Utworzenie podklasy DB_Sql do zapisywania i odczytu rysunkw
class pictures_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

$aErrors = False;
if ( !empty( $PicFile_name ) ) // nie wybrano pliku
{
if ( ( $PicFile_type == "image/gif" ) ||
( $PicFile_type == "image/pjpeg" ) ||
( $PicFile_type == "image/jpeg" ) )
{
$aFile = fopen( $PicFile, "rb" );
$aFileContents = addslashes( fread( $aFile, filesize( $PicFile ) ) );
fclose( $aFile );

$aDB = new pictures_db();

$aSQL = "select ( max( picture_id ) + 1 ) as new_id from pictures";
$aDB->query( $aSQL );
if ( $aDB->next_record() )
{
$aNewID = $aDB->f( "new_id" );
}
if ( empty( $aNewID ) == True )
{
$aNewID = 1;
}

$aSQL = "insert into pictures ( picture_id, name, date, pic_data, ";
$aSQL .= "pic_size, pic_type ) values ( $aNewID, '$PicName', ";
$aSQL .= "NOW(), '$aFileContents', '$PicFile_size', '$PicFile_type' )";
print( $aSQL );
$aDB->query( $aSQL );
if ( $aDB->Errno != 0 )
{
$aErrors = True;
}
}
else
{
$aErrors = True;
}
}
else
{
$aErrors = True;
}

if ( $aErrors == False )
{
header( "Location: upload_ok.html\n" );
}
else
{
header( "Location: upload_failed.html\n" );
}
?>
Skrypt ten ponownie wykorzystuje klas PHPLIB do obsugi odwoa do bazy danych. Na pocztku
sprawdzane jest, czy plik jest waciwego typu. Nastpnie plik jest umieszczony w zmiennej i przygotowany do
PHP Kompendium wiedzy
163

umieszczenia w bazie danych poprzez uycie funkcji addslashes(). Nastpnie z tabeli pobierany jest nowy
identyfikator i dane s umieszczane w bazie danych. Na kocu skryptu przegldarka jest kierowana do
odpowiedniego pliku w zalenoci od tego, czy operacja si powioda czy nie.
Aby wywietli rysunek, wykorzystujemy kod z wydrukw 5. i 6. Na wydruku 13.5. umieszczona jest
prosta strona HTML powodujca wywietlenie jednego, okrelonego rysunku. Wydruk 13.6. zawiera skrypt
wywietlajcy rysunki.
Wydruk 13.5. Strona HTML powodujca wywietlenie rysunku z bazy danych
<html>
<head>
<title>Wywietlenie rysunku</title>
</head>

<body>

<img src="show_pic.phtml?ID=1" border="0" alt="">

</body>
</html>
Wydruk 13.6. Skrypt wywietlajcy rysunki
<?php
include_once( "db_mysql.php" );

// Utworzenie podklasy DB_Sql do zapisywania i odczytu rysunkw
class pictures_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

$aDB = new pictures_db();

$aSQL = "select * from pictures where ( picture_id = $ID )";
$aDB->query( $aSQL );
if ( $aDB->next_record() )
{
header( "Content-length: " . $aDB->f( "pic_size" ) );
header( "Content-type: " . $aDB->f( "pic_type" ) );
print( $aDB->f( "pic_data" ) );
}
else
{
// Nie znaleziony rysunek, obsuga bdu!
Header( "HTTP/1.0 404 Not Found" );
}
?>
Mimo, e dziwny wydaje si znacznik <IMG> wskazujcy na skrypt PHP, nie ma jednak adnej rnicy.
Wany kod znajduje si w skrypcie PHP, gdzie ustawiany jest waciwy typ zawartoci dla rysunku z bazy
danych. Skrypt powoduje pobranie odpowiedniego rysunku z bazy danych i przesanie danych. Jeeli
identyfikator rysunku ($ID) nie zostanie odnaleziony w bazie danych, skrypt zwraca standardowy kod bdu
HTTP 404.
Poniewa PHP pozwala na wysanie dowolnych nagwkw HTTP, mona w ten sposb przesya
dowoln zawarto. Elastyczno ta pozwala na atwe tworzenie aplikacji o duych moliwociach.
Skrypty automatyzujce
PHP nie jest jedynie jzykiem programowania dla WWW, ktry do dziaania wymaga serwera WWW, ale
jest on jzykiem skryptowym, ktry moe zosta do dowolnych zada programowych. Poniewa jest on tak
bogaty w funkcje, moe by wykorzystany do automatyzacji zada, ktre mog by trudne do zrealizowania w
standardowych jzykach programowania powoki lub plikach wsadowych. Dodatkowo, poniewa PHP jest
dostpny na wielu platformach, te same skrypty mog by uyte na wielu platformach.
Wykorzystanie PHP jako osobnego narzdzia skryptowego wymaga skompilowania wersji CGI PHP. Jest
to opsane w rozdziale 1., Kompilacja i instalowanie PHP 4. Majc dostpn wersj CGI mona uruchomi
dowolny skrypt PHP z linii polece. Poniszy przykad pokazuje wykorzystanie PHP do generowania plikw stref
DNS co jest przydatne w przypadku obsugi wielu stref.
Rozdzia 13 Fajny PHP
164


Wydruk 13.7. Baza do obsugi DNS
CREATE TABLE Domains (
domain_id int(11) NOT NULL,
name varchar(250) NOT NULL,
soa_server_id int(11) DEFAULT '1' NOT NULL,
cname_list varchar(250) NOT NULL,
mail_server_id int(11) DEFAULT '1' NOT NULL,
ip_address_id int(11) DEFAULT '1' NOT NULL,
incl_zone_file tinyint(4) DEFAULT '1' NOT NULL,
created_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
PRIMARY KEY (domain_id),
KEY name (name),
UNIQUE name_2 (name),
KEY created_date (created_date)
);
CREATE TABLE IPAddressess (
ip_address_id int(11) NOT NULL,
value carchar(15) NOT NULL,
PRIMARY KEY (ip_address_id),
KEY value (value)
);
CREATE TABLE MailServers (
mail_server_id int(11) NOT NULL,
name varchar(250) NOT NULL,
PRIMARY KEY (mail_server_id),
KEY name(name)
);
CREATE TABLE NameServers (
name_server_id int(11) NOT NULL,
name varchar(250) NOT NULL,
PRIMARY KEY (name_server_id),
KEY name(name)
);
CREATE TABLE SOAServers (
soa_server_id int(11) NOT NULL,
name varchar(250) NOT NULL,
PRIMARY KEY (soa_server_id),
KEY name(name)
);
Baza danych jest wykorzystywana do przechowywania danych niezbdnych do utworzenia plikw strefy
oraz innych plikw konfiguracyjnych niezbdnych do dziaania serwera DNS. Poniej pokazany jest jeden rekord
z tabeli Domains:
INSERT INTO Domains VALUES( '4', 'intechra.net', '1', 'www, secure, mail', '1', '1', '1', '2000-08-25
13:29:37');
Wiersz ten zawiera dane DNS na temat domeny intechra.net. Chocia rekord ten nie jest sam szczeglnie
uyteczny, to jednak poczony z innymi powizanymi tabelami pozwala uzyska informacje na temat adresw
IP, serwerw pocztowych oraz serwerw SOA. Uywajc wszystkich tych danych oraz skryptu PHP mona
niezmiernie uproci proces uaktualniania serwera DNS. Ponisze siedem wydrukw zawiera elementy gwnego
skryptu. Wydruki 8. do 13. s plikami szablonw uywanych do generowania plikw wynikowych. Przykad ten
korzysta z klasy FastTemplate opisanej w rozdziale 12. Oddzielanie kodu HTML od PHP.
Wydruk 13.8. Gwny szablon dla pliku strefy DNS (dns_primary.tpl)
$TTL 86400
{DOMAIN}. IN SOA {SOA_SERVER}. {ADMINISTRATOR}. (
{SERIAL} ; nr seryjny
10800 ; odswieanie
3600 ; ponowna prba
604800 ; wyganicie
86400 ; domylny TTL
)
{NAMESERVERS}
{DOMAIN}. IN A {IPADDRESS}
{CNAME_RECORDS}
{DOMAIN}. IN MX 10 {MAIL_SERVER}.
{DOMAIN}. LOC 43 49 57.551 N 111 46 38.071 W 1480.7m
Wydruk 13.9. Szablon nazw hostw DNS (zastpuje CNAME_RECORDS z wydruku 13.8.)
(dns_secondary.tpl)
{CNAME} IN CNAME {DOMAIN}.{CRLF}
Wydruk 13.10. Szablon serwerw nazw DNS (zastpuje NAMESERVERS z wydruku 13.8.)
(dns_nservers.tpl)
{DOMAIN}. IN NS {NAMESERVER}.{CRLF}
Wydruk 13.11. Gwny szablon dla pliku named.conf (named_primary.tpl)
PHP Kompendium wiedzy
165

acl trustedslaves { ns1.nameserver.com;ns2.nameserver.com; };
options {
directory "/var/named";
recursion yes;
fetch-glue no;
allow-query { any; };
};
zone "." { type hint; file "cache.db"; };
{ZONES}
Wydruk 13.12. Pomocniczy szablon dla pliku named.conf (zastpuje ZONES z wydruku 13.11.)
(named_secondary.tpl)
zone "{DOMAIN}" { type master; file "{DOMAIN_FILE}"; notify yes;
allow-transfer { trustedslaves; }; };
Wydruk 13.13. Szablon dla pliku podrzdnych DNS (named_slaves.tpl)
zone "{DOMAIN}" { type slave; file "{DOMAIN_FILE}"; masters {
master.com; }; };
Szablony te tworz szkielet niezbdny do utworzenia wszystkich plikw konfiguracyjnych dla serwera
nazw BIND. Pierwsze trzy generuj osobne pliki stref, ktre mog posiada rn liczb serwerw nazw i
definicji nazw komputerw. Pozostae s uywane do utworzenia pliku named.conf oraz pliku podrzdnego,
wykorzystywanego w podrzdnym serwerze nazw.
Skrypt pokazany na wydruku 13.14 odczytuje z bazy danych dane DNS i generuje wszystkie pliki
konfiguracyjne.
Wydruk 13.14, Skrypt DNS
<?php
include( "./class.FastTemplate.php" );
include( "./db_mysql.php" ); // db_mysql.inc o zmienionej nazwie
// tworzenie klasy obsugi bazy danych dla aplikacji
class genapps_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}
// katalog dla plikw wynikowych
$aPath = "./dns_output";

$tpl = new FastTemplate( "." );
$tpl->define( array( named_main => "named_primary.tpl",
named_zones => "named_secondary.tpl",
named_slaves => "named_slaves.tpl",
dns_main => "dns_primary.tpl",
dns_cnames => "dns_secondary.tpl",
dns_nservers => "dns_nservers.tpl" ));
// pobierz list serwerw nazw i zapamitaj do pniejszego wykorzystania
$aNSDB = new genapps_db();
$aSQL = "select * from NameServers";
$aNSDB->query( $aSQL ); // pobierz wszystkie dane strefy
$aDB = new genapps_db();
$aSQL = "select A.name, A.cname_list, A.incl_zone_file, B.name as soa_server,
C.name as ";
$aSQL .= "mail_server, D.value as ip_address from Domains A, SOAServers B, ";
$aSQL .= "MailServers C, IPAddressess D where ( A.soa_server_id = B.soa_server_id)";
$aSQL .= "and ( A.mail_server_id = C.mail_server_id ) and ";
$aSQL .= "( A.ip_address_id = D.ip_address_id )";
$aDB->query( $aSQL );

while ( $aDB->next_record() )
{
$aDomainName = strtolower( $aDB->f( "name" ) );
$aCNames = $aDB->f( "cname_list" );
$aSoaServer = $aDB->f( "soa_server" ) ;
$aMailServer = $aDB->f( "mail_server" );
$aIPAddress = $aDB->f( "ip_address" );
$aInclZoneFile = $aDB->f( "incl_zone_file" );
$tpl->assign( array( DOMAIN => $aDomainName,
ADMINISTRATOR => "admin." . $aSoaServer,
SERIAL => date( "Ymd" ) . "00",
MAIL_SERVER => $aMailServer,
SOA_SERVER => $aSoaServer,
IPADDRESS => $aIPAddress,
CRLF => "\n" ) );
/* nazwy hostw (rekordy CNAME) s przechowywane w licie
rozdzielanej przecinkami w bazie danyche. Dzielenie listy
i tworzenie linii dla kadego elementu */
$tpl->clear( CNAME_RECORDS );
Rozdzia 13 Fajny PHP
166

$aCNameList = explode( ",", $aCNames );
foreach( $aCNameList as $aCName )
{
$aCName = trim( $aCName );
$tpl->assign( array( CNAME => $aCName ) );
$tpl->parse( CNAME_RECORDS, ".dns_cnames");
}
// dodanie linii serwerw nazw do pliku strefy
$tpl->clear( NAMESERVERS );
$aNSDB->seek( 0 ) ;
while ( $aNSDB->next_record() )
{
$tpl->assign( array( NAMESERVER => $aNSDB->f( "name" )) );
$tpl->parse( NAMESERVERS, ".dns_nservers" );
}
$aDomainFile = $aDomainName . ".db";
/* plik strefy jest tworzony tylko wtedy, gdy pole 'incl_zone_file'
w bazie danych ma warto '!'
*/
if ( $aInclZoneFile == "1" )
{
$tpl->parse( DNS_MAIN, "dns_main");
$aFile = fopen( "$aPath/$aDomainFile", "w" );
fwrite( $aFile, $tpl->fetch( DNS_MAIN ) );
fclose( $aFile );
print ("Plik domeny '$aDomainFile' zosta utworzony\n" );
}
/* dodanie bicej nazwy domeny do gwnego i pomocniczego pliku
konfiguracyjnego */
$tpl->assign( array( DOMAIN_FILE => $aDomainFile ) );
$tpl->parse( ZONES, '.named_zones' );
$tpl->parse( SLAVES, '.named_slaves' );
}
$tpl->parse( NAMED_CONF, 'named_main' );
$aFile = fopen( "$aPath/named.conf", "w" );
fwrite( $aFile, $tpl->fetch( NAMED_CONF ) );
fclose( $aFile );
print( "Gwny plik 'named.conf' utworzony\n" );
$aFile = fopen( "$aPath/named.slave", "w" );
fwrite( $aFile, $tpl->fetch( SLAVES ) );
fclose( $aFile );
print( "Plik domeny 'named.slave' utworzony\n" );
?>
Skrypt ten odczytuje kolejne pozycje w tabeli Domains i tworzy plik strefy. Jest on utworzony za pomoc
szablonw z wydrukw 8., 9. i 10. Przykadowy plik strefy pokazany jest na rysunku 13.4.
PHP Kompendium wiedzy
167

Rysunek 13.4.
Przykadowy plik
strefy DNS
Dodatkowo tworzony jest odpowiednio sformatowany plik named.conf. W celu stworzenia tych plikw do
odczytania zapamitanego tekstu wykorzystana zostaa metoda FastTemplate fetch().
Aby uruchomi ten skrypt pod Windows lub na systemach Unix naley uy polecenia php
create_dns.php. Postp wykonywania skryptu jest pokazywany na standardowym wyjciu, a pliki wynikowe s
tworzone w katalogu okrelonym na pocztku skryptu.
Poniewa PHP jest kompletnym jzykiem skryptowym, przy jego pomocy mona napisa dowolne
narzdzia automatyzujce zoone zadania. Uyty z mechanizmami automatycznego uruchamiania programw, na
przykad cron, PHP moe by wykorzystany do wykonania wielu zoonych zada. Tworzenie plikw
konfiguracyjnych dla dowolnych programw moe by bardzo atwo wykonane przy uyciu systemu szablonw,
na przykad pakietu FastTemplate. Poniewa PHP jest niezwykle elastyczny, moe by on uyty do napisania
skryptw do takich zada jak: wysyanie masowej poczty, skadowanie i uaktualnianie bazy danych,
monitorowanie sieci lub aplikacji i wiele innych.
WDDX
WDDX (Web Distributed Data Exchange) to bezpatna, oparta na XML technologia pozwalajca
aplikacjom WWW dziaajcych na dowolnych platformach, atwo wymienia pomidzy sob dane. Obsuga
WDDX moe by uaktywniona w PHP poprzez podanie opcji konfiguracji --enable-wddx i ponowne
skompilowanie PHP. Celem WDDX jest zapewnienie spjnego interfejsu danych dla informacji przekazywanych
pomidzy aplikacjami sieciowymi. Dla przykadu, mona wykorzysta WDDX do wspdzielenia przez
partnerw danych z bazy danych.
SDK dla WDDX mona cign z witryny www.wddx.org. Pakiet ten zawiera dokumentacj i przykady
uycia WDDX. Patrzc na najbardziej podstawowym poziomie, kompilujc PHP z obsug WDDX umoliwia si
serializacj danych w postaci pakietw WDDX oraz deserializacj pakietw danych WDDX do struktur danych
Rozdzia 13 Fajny PHP
168

PHP. Aby to zilustrowa, skrypt z wydruku 13.15. tworzy kilka zmiennych i serializuje je w pakiet danych
WDDX, oraz wypisuje zawarto pakietu. Wynik serializacji pokazany jest na wydruku 13.16.
Wydruk 13.15. Wykorzystanie WDDX
<html>
<head>
<title>Przykad uycia WDDX</title>
</head>
<body>
<?php
$aFirstName = "Arian";
$aAge = 25;
$aArray = array( "red", "green", "blue" );
$aPacketID = wddx_packet_start( "products" );
wddx_add_vars( $aPacketID, "aFirstName" );
wddx_add_vars( $aPacketID, "aAge" );
wddx_add_vars( $aPacketID, "aArray" );
$aWDDXPacket = wddx_packet_end( $aPacketID );
print( $aWDDXPacket );
?>
</body>
</html>
Wydruk 13.16. Pakiet WDDX
<wddxPacket version='1.0'><header><comment>products</comment></header><data><struct><var
name='aFirstName'><string>Arian</string></var><var name='aAge'><number>25</number></var><var
name='aArray'><array
length='3'><string>red</string><string>green</string><string>blue</string></array></var></struct></data></wd
dxPacket>
W przedstawionym przykadzie funkcja wddx_packet_start() tworzy nowy pakiet WDDX. Nastpnie do
tego pakietu dodawane s trzy zmienne PHP i pakiet jest zamykany. Pakiet danych WDDX zawiera wszystkie
dane niezbdne do odtworzenia zmiennych za pomoc funkcji wddx_deserialize().
Aby pokaza jak mona wykorzysta WDDX w systemie uywajcym kilku jzykw programowania, w
kolejnym przykadzie pakiet WDDX jest wysyany do strony WWW, gdzie jest uywany przez JavaScript. Dane
WDDX reprezentuj informacje o towarach: nazw, cen i wag. Gdy uytkownik wybierze z listy nazw
produktu, w polach tekstowych tylko do odczytu uaktualniana jest cena i waga wybranego produktu. Przykad ten
pokazuje w jaki sposb mona manipulowa danymi na kliencie przy pomocy JavaScript. Na wydruku 13.17.
pokazany jest szablon HTML, natomiast wydruk 13.18. zawiera skrypt PHP wykorzystujcy ten szablon.
Wydruk 13.17 Uycie WDDX do manipulacji danymi na kliencie
<html>
<head>
<title>{TITLE}</title>
<link rel="STYLESHEET" type="text/css" href="css2.css">
<!--- Doczenie obsugi WDDX / Javascript --->
<SCRIPT SRC="wddx.js" LANGUAGE="JavaScript"></SCRIPT>
<!--- Doczenie obsugi obiektu WddxDeserializer --->
<SCRIPT SRC="wddxDes.js" LANGUAGE="JavaScript"></SCRIPT>
<script language="JavaScript">
<!--
function show_props(obj, obj_name)
{
var result = "";
for (var i in obj)
{
result += obj_name + "." + i + " = " + obj[i] + "\n";
}
return result;
}

function SetupProductsList()
{
MyDeser = new WddxDeserializer;
aProducts = MyDeser.deserialize( '{PRODUCTS_WDDX}' );
}

function Initialize()
{
SetupProductsList();
aNumProds = aProducts.ARECORDS.length;
// Czyszczenie listy produktw

// dodanie produktu do listy
for ( var nIndex = 0; nIndex < aNumProds; nIndex++ )
{
aValue = aProducts.ARECORDS[nIndex].PRODUCT_ID;
PHP Kompendium wiedzy
169
aName = aProducts.ARECORDS[nIndex].DESCRIPTION;

// tworzenie nowej opcji
NewOpt = new Option( aName, aValue, false, true );
// Dodanie nowego obiektu do listy SELECT
document.MainForm.Product_List.options[nIndex] = NewOpt;
}

SetInfo();
}

function SetInfo()
{
// ustawienie ceny i wagi zaznaczonego produktu
var RowNum = document.MainForm.Product_List.selectedIndex;

if ( RowNum > -1 )
{
document.MainForm.Price.value = aProducts.ARECORDS[RowNum].PRICE;
document.MainForm.Weight.value = aProducts.ARECORDS[RowNum].WEIGHT;
}
}
//-->
</script>
</head>
<body onload="Initialize()">
<form action="" name="MainForm" id="MainForm">
<table>
<tr>
<td colspan="3">
Wybierz towar z listy, aby zobaczy jego cen i wag.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<th>
Towar
</th>
<th>
Cena
</th>
<th>
Waga
</th>
</tr>
<tr>
<td>
<select name="Product_List" size="1" onChange="SetInfo();">
<option></option>
<option></option>
</select>
</td>
<td>
<input type="text" name="Price" readonly>
</td>
<td>
<input type="text" name="Weight" readonly>
</td>
</tr>
</table>
</form>
</body>
</html>
Szablon ten intensywnie wykorzystuje JavaScript. Pierwsza funkcja, show_props() jest jedynie funkcj
testujc uywan przy wywietlaniu waciwoci obiektu. Funkcja SetupProductsList() deserializuje dane
towarw, ktre zostay odczytane z bazy danych przez PHP. Funkcja korzysta z obiektu WddxDeserializer
dostpnego w SDK dla WDDX. Po deserializacji pakietu danych WDDX obiekt JavaScript aProducts zawiera
wszystkie dane produktw.
Funkcja Initialize() inicjuje stron i jest wywoywana automatycznie przez zdarzenie strony onLoad. Ta
funkcja z kolei wywouje funkcj SetupProductsList() a nastpnie dodaje nazwy i identyfikatory produktw do
listy rozwijalnej. Funkcja SetInfo() jest wywoywana po zmianie przez uytkownika wybranego elementu w
licie rozwijalnej. Uaktualnia ona wartoci wywietlane w polach tekstowych cena i waga.
Wydruk 13.18. Przygotowanie pakietu danych WDDX
<?php
Rozdzia 13 Fajny PHP
170

include( "class.FastTemplate.php" );
include( "db_mysql.inc" );

error_reporting( E_ALL & ~E_NOTICE );

class products_db extends DB_Sql
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}

$aTemplate = new FastTemplate( "." );
$aTemplate->define( array( "base" => "products_wddx.tpl" ) );
$aTemplate->assign( array( "TITLE" => "Products Page" ) );

$aPacketID = wddx_packet_start( "products" );

$aRecords = array();
$nIndex = 0;

$aDB = new products_db;
$aDB->query( "select * from Products" );
while( $aDB->next_record() )
{
$aRecord = $aDB->Record;

foreach( $aRecord as $aName => $aValue )
{
if ( !is_numeric( $aName ) )
{
$aRecords[$nIndex][$aName] = $aValue;
}
}
$nIndex++;
}
wddx_add_vars( $aPacketID, "aRecords" );
$aWDDXPacket = wddx_packet_end( $aPacketID );

$aTemplate->assign( array( "PRODUCTS_WDDX" => addslashes( $aWDDXPacket ) ) );

$aTemplate->parse( "BASE", "base" );
$aTemplate->FastPrint( "BASE" );
?>
Gwny skrypt PHP wykorzystuje klas FastTemplate w celu utworzenia kompletnej strony HTML.
Gwnym dziaaniem skryptu jest odczytanie zawartoci tabeli Products i utworzenie pakietu WDDX
zawierajcego odpowiednie dane, Jest to realizowane w ptli przebiegajcej przez rekordy wyniku, dodajc dane
do nowej tablicy, $aRecords. Jest to tablica dwuwymiarowa, gdzie pierwszy wymiar jest numeryczn
reprezentacj numeru wiersza. Drugi wymiar to tablica asocjacyjna z nazwami kolumn i ich wartociami.
Jeszcze jeden fragment tego kodu wymaga skomentowania. Linia z funkcj is_numeric() jest uywana do
usuwania nadmiarowych informacji zwracanej przez niejawnie wykonywan funkcj mysql_fetch_array().
Funkcja mysql_fetch_array() zwraca wiersz z wyniku w postaci tablicy. Dane pochodzce z wyniku s
przechowywane pod indeksami numerycznymi, jak rwnie pod indeksami asocjacyjnymi gdzie jako klucze s
wykorzystywane nazwy pl. Sprawdzenie to usuwa dane indeksowane liczbami, pozostawiajc jedynie dane
asocjacyjne.
Na rysunku 13.5. pokazana jest wynikowa strona w przegldarce. Zawsze po wybraniu nowego towaru
automatycznie jest uaktualniana cena i waga.
PHP Kompendium wiedzy
171

Rysunek 13.5.
Przykad
wykorzystania
danych WDDX na
kliencie

Cho przykad ten pokazuje w wykorzystanie WDDX do dostarczenia danych dla klienta, moe by
uywany na wiele sposobw. Moe by uywany do przesyania firmowych danych pomidzy serwerami, oraz
atwego wspdzielenia danych pomidzy rnymi platformami i jzykami. Jeeli planujesz wspdzielenie
danych, WDDX zawiera narzdzia do szybkiego dostarczania treci w postaci neutralnej dla platformy i jzyka.
Monitorowanie sieci
Poniewa PHP wewntrznie obsuguje gniazda i protokoy sieciowe, tworzenie narzdzi monitorujcych
sie jest atwe. Poniszy przykad wykorzystuje potoki i gniazda do zrealizowania prostych funkcji
monitorujcych sie. Mona rozszerzy ten przykad o sprawdzanie stanu serwera nazw, serwera pocztowego itd.
Przykad ten moe by szkieletem, ktry mona rozszerza o nowe funkcje.
Na wydruku 13.19. zamieszczone s trzy funkcje, phpPing(), phpTrace() i phpPageCheck(). Pierwsze dwie
wykorzystuj komendy systemowe do wykonania operacji ping i traceroute. Ostatnia wykorzystuje gniazda do
wysania dania HTTP HEAD do strony w celu sprawdzenia dostpnoci serwera i samej strony.
Wydruk 13.19. Funkcje sieciowe
<?php
$aPingCmd = '/bin/ping -c 4'; // *nix
$aTraceCmd = '/usr/sbin/traceroute -n'; // *nix

// zwraca redni czas wykonania komendy ping
function phpPing( $aAddress )
{
global $aPingCmd;

$aTotalTime = 0.0;
$aPingCount = 0;
if ( $aFile = popen( "$aPingCmd $aAddress", "r" ) )
{
// odczytanie danych z potoku
while ( !feof( $aFile ) )
{
$aLine = fgets ( $aFile, 1024 );
// odszukanie danych o czasie
$aPos = strpos( $aLine, "time=" );
if ( $aPos > 0 )
{
// wykorzystanie zmiennoci typw zmiennych PHP
// do konwersji czasu na liczb
$aTime = substr( $aLine, $aPos + 5 ) * 1.0;
$aTotalTime += $aTime;
$aPingCount++;
}
}
pclose( $aFile );
}
return $aTotalTime / $aPingCount;
}

Rozdzia 13 Fajny PHP
172

function phpTrace( $aAddress )
{
global $aTraceCmd;

$aTraceResults = "";
if ( $aFile = popen( "$aTraceCmd $aAddress", "r" ) )
{
// odczytanie wszystkich danych z potoku
while ( !feof( $aFile ) )
{
$aLine = fgets ( $aFile, 1024 );
$aTraceResults .= $aLine . "<br>";
}
pclose( $aFile );
}

return $aTraceResults;
}

function phpPageCheck( $aWebPage )
{
$aURL = parse_url( $aWebPage );
$aResult = False;
if ( $aURL["scheme"] == "http" )
{
$aRequest = "HEAD {$aURL['path']} HTTP/1.0\r\n\r\n";
$aSocket = fsockopen( $aURL["host"], 80 );
if ( $aSocket )
{
fputs( $aSocket, $aRequest );
while( !feof( $aSocket ) )
{
$aLine = fgets( $aSocket, 1024 );
if ( substr( $aLine, 0, 4 ) == "HTTP" )
{
$aArray = explode( " ", $aLine );
if ( ( $aArray[1] >= 200 ) && ( $aArray[1] < 300 ) )
{
$aResult = True;
}
}
}
}
}

return $aResult;
}
?>
Funkcje te mog by wykorzystane w skrypcie automatyzujcym do okresowego zapisywania wynikw
do bazy danych lub do pliku, albo mog by uyte bezporednio ze strony WWW. Skrypt z wydruku 13.20.
pokazuje w jaki sposb uywa si tych funkcji.
Wydruk 13.20. Wykorzystanie funkcji sieciowych
<?php
include( "./net_funcs.php" );
?>
<html>
<head>
<title>Test funkcji sieciowych</title>
</head>

<body>

<?php
print( "phpPing: " . phpPing ( 'www.php.net' ) . "<br><br>" );
print( "phpTrace: <ul>" . phptrace( 'www.php.net' ) . "</ul><br>" );
print( "phpPageCheck: " );
print( phpPageCheck( 'http://www.php.net/' ) ? "OK" : "NOT OK" );
print( "<br>" );
?>

</body>
</html>
Przykad ten pokazuje jak atwo mona wykorzysta PHP do wykonania podstawowego monitorowania
sieci. PHP obsuguje rwnie inne protokoy sieciowe, takie jak IMAP, SNMP, NNTP i POP3, co pozwala
rozszerza przytoczony przykad o sprawdzenie dostpnoci wszystkich rodzajw serwerw i komponentw
sieciowych.
PHP Kompendium wiedzy
173

Podsumowanie
Rozdzia ten opisywa rne zagadnienia pokazujce si i elastyczno PHP. Istniej rwnie rozszerzenia
do tworzenia rysunkw, analizy XML, tworzenia plikw PDF i wielu innych zada. Poniewa PHP jest tak
rozszerzalny i rozwijany przez ogromn grup programistw, naley spodziewa si dalszego zwikszania
elastycznoci i funkcjonalnoci.
Rozdzia 13 Fajny PHP
174
Rozdzia 14. Witryny oparte o szablony
W rozdziale 12., Oddzielanie HTML od PHP zostao opisane uycie systemu szablonw. W tym
rozdziale zostanie szczegowo opisane wykorzystanie szablonw do tworzenia witryn. Uycie szablonw do
projektowania aplikacji umoliwia o wiele wicej, ni jedynie oddzielanie logiki aplikacji od projektu
graficznego. Szablony umoliwiaj zastosowanie zapoyczania fragmentw witryn, personalizacji, niezalenoci
od przegldarki oraz obsugi wielu jzykw. Przykady przytoczone w tym rozdziale wykorzystuj klas
FastTemplate dostpn z witryny http://www.thewebmasters.net/. Istniej rwnie inne systemy szablonw, ale ta
implementacja jest wydajna, elastyczna i atwa do nauki.
Podstawy wykorzystania szablonw
Tworzenie witryn WWW korzystajcych z systemu szablonw wymaga nieco dokadniejszego
projektowania interfejsu uytkownika, ni tworzenie tej samej aplikacji bez szablonw. Jednak korzyci
wykorzystania dobrze zaprojektowanego zaczn si ujawnia bardzo szybko. Na rysunku 14.1. pokazana jest
typowa strona WWW, ktra moe by podzielona na kilka osobnych plikw szablonw.
Rysunek 14.1.
Strona WWW
skadajca si z
kilku plikw
szablonw
Page header - nagwek strony
navigation - panel nawigacji
footer - stopka
HTML base page - Podstawowa strona HTML
Main body - Gwny obszar strony
information, links, contacts, news - Informacje, cza,
kontakty, nowoci
Na rysunku 14.1. pokazana jest strona skadajca si z jednego lub wicej szablonw, ktre skadaj si na
stron HTML z rnymi logicznymi sekcjami strony. Na niektrych witrynach WWW moe by wykorzystany
tylko jeden szablon dla wszystkich stron witryny. W innych, kada strona moe by tworzona na podstawie kilku
szablonw. Aby zaprojektowa witryn korzystajc z szablonw, naley oceni potrzeby witryny i
zinwentaryzowa elementy znajdujce si na stronach.
Przykadem bdzie witryna penica funkcj sieciowego katalogu towarw. Katalog ten jest podzielony na
kategorie produktw, takie jak: ubrania, prezenty, zabawki itd. Kada strona musi zawiera wsplne elementy
nawigacyjne oraz logo caej witryny. Przegldajc wybran kategori produktw, powinien by wywietlany
element graficzny oznaczajcy t kategori. Kada strona produktu powinna zawiera dane o towarze, takie jak
cena, waga, dostpne kolory itd. Aby stworzy system szablonw dla takiej witryny zdefiniowano nastpujce
szablony:
1. merch_base.tpl: Podstawowy plik zawierajcy oglny ukad HTML.
2. merch_header.tpl: Nagwek wsplny dla wszystkich stron witryny.
3. merch_catXXX_header.tpl: Nagwek okrelonej kategorii (XXX zastpione przez nazw kategorii).
4. merch_navi.tpl: Panel nawigacyjny katalogu.
5. merch_body.tpl: Tre kadej strony.
6. merch_footer.tpl: Stopka kadej strony.
Aby pokaza jak zostay stworzone te pliki, przedstawiona zostan teraz zawarto kadego z nich.
Wydruki od 1. do 6 zawieraj kolejne pliki wymienione powyej. Na wydruku 14.3 pokazany zosta plik
merch_catubrania_header.tpl, waciwy dla kategorii produktw ubrania. Pliki dla pozostaych kategorii nie
zostay pokazane, poniewa s one waciwie takie same.
Wydruk 14.1. merch_base.tpl
<html>
<head>

<title>{TITLE}</title>
</head>
<body bgcolor="White">
<table width="630" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td colspan="2">{PAGE_HEADER}</td>
</tr>
<tr>
<td colspan="2" align="center">{CAT_HEADER}</td>
</tr>
<tr>
<td valign="top">{LEFT_NAVI}</td>
<td valign="top">
{BODY}
</td>
</tr>
<tr>
<td colspan="2">
{PAGE_FOOTER}
</td>
</tr>
</table>
</body>
</html>
Wydruk 14.2. merch_header.tpl
<img src="merch_layout_r1_c1.gif" width="630" height="61" border="0">
Wydruk 14.3. merch_catubrania_header.tpl
<img name="merch_layout_r2_c1" src="merch_layout_r2_c1.gif" width="630" height="37" border="0"><br>
<div align="center"><p>{CATEGORY_SPECIALS}</p></div>
Wydruk 14.4. merch_navi.tpl
<img src="merch_layout_r3_c1.gif" width="104" height="382" border="0" usemap="#merch_layout_r3_c1">
<map name="merch_layout_r3_c1">
<area shape="rect" coords="5,180,97,221" href="{HREF_COMPANY_INFO}" >
<area shape="rect" coords="7,143,86,166" href="{HREF_CONTACT}" >
<area shape="rect" coords="12,90,84,132" href="{HREF_CART}" >
<area shape="rect" coords="18,56,73,80" href="{HREF_HOME}" >
</map>
Wydruk 14.5. merch_body.tpl
<p>
&nbsp;
</p>
<h3>
{PRODUCT_NAME}
</h3>
<p>
{PRODUCT_DESCRIPTION}
</p>
<p>
{PRODUCT_PRICE}
</p>
Wydruk 14.6. merch_footer.tpl
<hr>
<p>
&copy {COPYRIGHT_YEARS} Intechra LLC. Wszystkie prawa zastrzeone.
</p>
Pliki te pokazuj jak niewiele potrzeba do stworzenia dosy skomplikowanej witryny korzystajcej z
szablonw. Niektre z tych plikw, na przykad nagwek zawiera jedynie rysunek. Inne, jak na przykad szablon
panelu nawigacyjnego zawiera zarwno rysunek, jak i map obrazu. Naley zwrci uwag, e szablon
nawigacyjny nie zawiera aktualnych adresw URL, a jedynie zmienne szablonu Pozwala to na stworzenie
waciwych adresw czy, na przykad zawierajcych identyfikator sesji. Skrypt PHP pokazany na wydruku
14.7. pokazuje w jaki sposb mona poczy pliki szablonw w jedn cao.
Wydruk 14.7. czenie szablonw
<?php
include( "class.FastTemplate.php" );

// zakadamy, e wybran kategori s ubrania
$aCategoryHeader = 'merch_catubrania_header.tpl';

$aTPL = new FastTemplate( "." );
$aTPL->define( array( 'base' => 'merch_base2.tpl',
'header' => 'merch_header.tpl',
'navi' => 'merch_navi.tpl',
'footer' => 'merch_footer.tpl',
'cat_header' => $aCategoryHeader,
'body' => 'merch_body.tpl'
Rozdzia 14 Witryny oparte o szablony
176

) );

$aTPL->assign( array( 'TITLE' => 'Katalog towarw: Ubrania',
'CATEGORY_SPECIALS' => 'Sprzedajemy koszulki Intechra!',
'PRODUCT_NAME' => 'Koszulka Intechra',
'PRODUCT_DESCRIPTION' => 'wietna koszulka z logo Intechra LLC!',
'PRODUCT_PRICE' => '14.95 z',
'COPYRIGHT_YEARS' => '2001',
'HREF_HOME' => 'index.phtml',
'HREF_CART' => 'cart.phtml',
'HREF_CONTACT' => 'contact.phtml',
'HREF_COMPANY_INFO' => 'company.phtml'
) );

$aTPL->parse( 'PAGE_HEADER', 'header' );
$aTPL->parse( 'CAT_HEADER', 'cat_header' );
$aTPL->parse( 'LEFT_NAVI', 'navi' );
$aTPL->parse( 'BODY', 'body' );
$aTPL->parse( 'PAGE_FOOTER', 'footer' );
$aTPL->parse( 'BASE', 'base' );
$aTPL->FastPrint( 'BASE' );
?>
Skrypt ten wykorzystuje klas FastTemplate do analizy i poczenia wszystkich plikw szablonw
tworzcych katalog produktw. W przykadzie tym wszystkie wartoci zostay na stae zaszyte w skrypcie w celu
uproszczenia opisu. W prawdziwej aplikacji dane na temat kategorii produktu oraz wywietlanego produktu
powinny by dostarczone poprzez formularz lub inn metod dynamicznego dostarczania danych. Skrypt ten po
prostu przypisuje wartoci do wszystkich zmiennych potrzebnych we wszystkich plikach szablonw.
Aby zrozumie w jaki sposb FastTemplate analizuje stron naley wiedzie, e niektre zmienne
FastTemplate s ustawiane przy uyciu metody assign(). Na przykad zmienna COPYRIGHT_YEARS
wykorzystywana w szablonie merch_footer.tpl jest inicjowana wartoci 2000 przy uyciu metody assign().
Dodatkowo niektre zmienne FastTemplate s ustawiane za pomoc metody parse(). Dla przykadu zmienna
PAGE_HEADER jest ustawiana poprzez analiz strony o nazwie header. Powoduje to, e warto PAGE_HEADER jest ju
dostpna w czasie analizy pliku merch_base.tpl, ktry w naszym przykadzie zosta nazwany base. Naley
pamita, e w przypadku zagbiania szablonw naley zainicjowa wszystkie wymagane zmienne szablonu
przed jego analiz. Dodatkowo naley analizowa szablony we waciwej kolejnoci. Dla przykadu, jeeli w
powyszym przykadzie strona base bya by analizowana na pocztku, wikszo wymaganych zmiennych (takich
jak PAGE_HEADER i BODY) nie byo by dostpnych.
Si zastosowania szablonw jest moliwo atwego wprowadzania zmian w projekcie graficznym
witryny. Na rysunku 14.2. pokazany zosta wygld strony wygenerowanej przez skrypt z wydruku 14.6.
Zmieniajc szablon o nazwie base, z zamieszczonego na wydruku 14.1. na ten z wydruku 14.8, wygld strony
ulega cakowitej zmianie. Efekt zmiany szablonu base pokazany jest na rysunku 14.3.
PHP Kompendium wiedzy
177

Rysunek 14.2.
Strona
wygenerowana
przez skrypt z
wydruku 14.7.
Wydruk 14.8. Nowy plik szablonu base
<html>
<head>
<title>{TITLE}</title>
<link rel="STYLESHEET" type="text/css" href="new_base.css">
</head>
<body bgcolor="White">
<table width="630" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td colspan="2">{PAGE_HEADER}</td>
</tr>
<tr>
<td colspan="2" align="center">{CAT_HEADER}</td>
</tr>
<tr>
<td width="526" valign="top">
{BODY}
</td>
<td valign="top">{LEFT_NAVI}</td>
</tr>
<tr>
<td colspan="2">
{PAGE_FOOTER}
</td>
</tr>
</table>
</body>
</html>
Rozdzia 14 Witryny oparte o szablony
178

Rysunek 14.3.
Strona
wygenerowana
przy uyciu
nowego szablonu
base
Sia systemu szablonw nie moe by przeceniana. Tak jak to zostao pokazane, zmieniajc zawarto
szablonu base, znacznie zmieniony zosta wygld strony, natomiast nie zostay wprowadzone adne zmiany po
stronie PHP. Elastyczno ta pozwala projektantom na tworzenie i konserwacj bogatego interfejsu uytkownika,
natomiast programici aplikacji rwnolegle tworz i konserwuj cz logiczn. Oczywici zachodzi niezbdna
interakcja pomidzy programistami i projektantami interfejsu, ale po zdefiniowaniu zestawu plikw szablonw i
zmiennych szablonw praca obu grup moe pracowa rwnolegle. Dodatkowo, wykorzystanie szablonw
pozwala programistom na wykorzystywanie zestawu prototypowych plikw interfejsu, do czasu a projektanci
dostarcz im ostateczne wersje.
W poprzednim przykadzie jedyn znaczca zmian wprowadzon w szablonie base byo doczenie pliku
CSS. CSS jest wartociowym dodatkiem do wikszoci zastosowa WWW, poniewa stanowi on system
szablonw dla HTML. Wykorzystujc CSS, mona zmieni atrybuty wszystkich elementw HTML. Na przykad
mona tak zdefiniowa znacznik <h3>, aby w kontekcie tej witryny wyglda w okrelony sposb. Na wydrukach
14.4. i 14.5. pokazany jest wygld komercyjnego edytora CSS o nazwie TopStyle z firmy Bradbury Software
LLC (http://www.bradsoft.com/). Edytor ten upraszcza proces tworzenia plikw CSS oraz pozwala na podgld
zmienionych stylw.
PHP Kompendium wiedzy
179

Rysunek 14.4.
Arkusz stylu
pokazujcy
moliwo
modyfikacji
znacznikw
<body>, <td> i
<h3>

Rysunek 14.5.
Inny arkusz stylu
pokazujcy
moliwo
modyfikacji
znacznikw
<body>, <td> i
<h3>
Uycie CSS wraz z systemem szablonw zwiksza moliwo wprowadzania zmian do wygldu witryny
minimalizujc konieczno wprowadzania zmian do kodu aplikacji. Pliki CSS mog by nawet doczane
dynamicznie, w postaci zmiennej szablonu. Mimo, e nie jest to optymalne rozwizanie dla wszystkich typw
witryn, pozwala zrealizowa kolejny poziom konfiguracji wygldu tworzonej aplikacji.
Rozdzia 14 Witryny oparte o szablony
180

Poprzedni przykad stanowi podstawowy szkielet dla tworzenia aplikacji WWW opartej o szablony.
Jednak nie zostay tu pokazane przykady tworzenia powtarzajcych si elementw. Czsto zachodzi potrzeba
stworzenia tabeli zawierajcej wszystkie towary, lub list kategorii zapisanych w bazie danych.
Kolejny przykad pokazuje, w jaki sposb mona doczy powtarzajce si elementy, korzystajc z klasy
FastTemplate. Wydruk 14.9. zawiera gwny plik szablonu. Wydruk 14.10. to zawarto szablonu items,
natomiast wydruk 14.11. szablon pojedynczego elementu. Na wydruku 14.12 znajduje si skrypt czcy te
szablony w cao.
Wydruk 14.9. Gwny szablon kategorii
<html>
<head>
<title>{TITLE}</title>
</head>
<body>
{ITEMS}
</body>
</html>
Wydruk 14.10. Szablon kategorii items
Do wyboru s nastpujce kategorie produktw:
<ul>
{ITEM_LIST}
</ul>
Wydruk 14.11. Szablon dla pojedynczej kategorii
<li><a href="show_category.phtml?cat_id={CAT_ID}">{CAT_NAME}</a></li>
Wydruk 14.12. Skrypt generujcy stron z list kategorii
<?php
include( "class.FastTemplate.php" );

$aTPL = new FastTemplate( "." );
$aTPL->define( array( 'base' => 'cat_base.tpl',
'items' => 'cat_items.tpl',
'item' => 'cat_item.tpl' ) );

$aCategories = array( "ubrania", "prezenty", "zabawki", "ksiki" );

foreach( $aCategories as $aID => $aName )
{
$aTPL->assign( array( 'CAT_ID' => $aID,
'CAT_NAME' => $aName ) );

// analiza elementu i jego doczenie do zmiennej szablonu
// ITEM_LIST
$aTPL->parse( 'ITEM_LIST', '.item' );
}

$aTPL->assign( array( 'TITLE' => 'Lista kategorii' ) );
$aTPL->parse( 'ITEMS', 'items' );
$aTPL->parse( 'BASE', 'base' );
$aTPL->FastPrint( 'BASE' );
?>
Rysunek 14.6. Lista
kategorii

PHP Kompendium wiedzy
181
Przedstawiony przykad zawiera wbudowan list kategorii w celu wygenerowania strony z list kategorii.
Wynik dziaania skryptu przedstawiony jest na rysunku 14.6. Po raz kolejny zamy, e dzia projektowy
zdecydowa si na zmian formatu listy kategorii z listy wypunktowanej na tabel. Zmiany s ograniczone jedynie
do plikw items i item. Wykorzystujc poprzedni przykad zmienione szablony przedstawione s na wydrukach
13. i 14. Efekt kocowy pokazany jest na rysunku 14.7.

Wydruk 14.13. Nowy szablon items
Do wyboru s nastpujce kategorie produktw:
<br><br>
<table border="1">
{ITEM_LIST}
</table>
Wydruk 14.14. Nowy szablon item
<tr>
<td>
Kategoria nr. {CAT_ID}
</td>
<td>
<a href="show_category.phtml?cat_id={CAT_ID}">{CAT_NAME}</a>
</td>
</tr>
Rysunek 14.7. Lista
kategorii w postaci
tabeli

Przedstawiony przykad pokazuje podstawowe kroki potrzebne do generowania listy powtarzajcych si
elementw przy uyciu FastTemplate. Istnieje rwnie w FastTemplate inny mechanizm pozwalajcy na
wyeliminowanie dodatkowych plikw zawierajcych szablon pojedynczego elementu. Aby uy tego
mechanizmu zmienimy szablon items, oraz gwny skrypt PHP. Na wydrukach 15. i 16. zamieszczone s
zmienione pliki. Wynik dziaania tego skryptu jest taki, jak pokazany na rysunku 14.7.
Wydruk 14.15. Nowy szablon items korzystajcy z dynamicznych blokw
Do wyboru s nastpujce kategorie produktw:
<br><br>
<table border="1">
<!-- BEGIN DYNAMIC BLOCK: item -->
<tr>
<td>
Kategoria nr. {CAT_ID}
</td>
<td>
<a href="show_category.phtml?cat_id={CAT_ID}">{CAT_NAME}</a>
</td>
</tr>
<!-- END DYNAMIC BLOCK: item -->
</table>
W szablonie tym zosta zdefiniowany podszablon blok dynamiczny o nazwie item. Jest to dokadnie to
samo, co stworzenie osobnego pliku zawierajcego szablon item. Zalet takiego rozwizania jest utrzymanie
oryginalnej struktury pliku HTML oraz ograniczenie iloci niezbdnych plikw szablonw. Uycie szablonw
wymaga rwnie kilku zmian w skrypcie uywajcym klasy FastTemplate. Zostay one zamieszczone na wydruku
14.16.
Wydruk 14.16. Nowy skrypt PHP
<?php
include( "class.FastTemplate.php" );

$aTPL = new FastTemplate( "." );
$aTPL->define( array( 'base' => 'cat_base.tpl',
'items' => 'cat_items_dyn.tpl') );
Rozdzia 14 Witryny oparte o szablony
182


$aTPL->define_dynamic( 'item', 'items' );

$aCategories = array( "ubrania", "prezenty", "zabawki", "ksiki" );

foreach( $aCategories as $aID => $aName )
{
$aTPL->assign( array( 'CAT_ID' => $aID,
'CAT_NAME' => $aName ) );

// analiza elementu i jego doczenie do zmiennej szablonu
// ITEM_LIST
$aTPL->parse( 'ITEM_LIST', '.item' );
}

$aTPL->assign( array( 'TITLE' => 'Lista kategorii' ) );
$aTPL->parse( 'ITEMS', 'items' );
$aTPL->parse( 'BASE', 'base' );
$aTPL->FastPrint( 'BASE' );
?>
W skrypcie tym widoczne s dwie wyrane zmiany w stosunku do wydruku 14.12. Po pierwsze, w nowym
skrypcie brakuje jednego wywoania metody define(). Po drugie, wykorzystana jest metoda FastTemplate
define_dynamic(), ktra wskazuje systemowi FastTemplate, e w szablonie items istnieje blok dynamiczny o
nazwie item. Od tej chwili FastTemplate traktuje blok dynamiczny identycznie, jak byby to osobny plik.
Korzystajc z tego mechanizmu, niezmiernie wane jest, aby blok dynamiczny by poprawny skadniowo.
Skadnia linii BEGIN i END musi by poprawna i wymagane jest zachowanie odpowiedniej wielkoci liter. Blok
kodu zaczyna si od nowej linii tekstu przeznaczonej jedynie dla tej dyrektywy. W linii zawierajcej wyraenia
BEGIN i END nie powinno by adnego innego tekstu, mona jedynie umieszcza tam dowoln ilo znakw
odstpu. Dyrektywa musi by napisana dokadnie w takiej postaci, jak ponisza linia kodu. Linia ta musi by
dokadnie taka, jak przedstawiona, z dokadnoci do odstpw pomidzy znakami. To samo obowizuje dla
dyrektywy END. Linie BEGIN i END nie mog rozciga si na wiksza ilo linii.
<!-- BEGIN DYNAMIC BLOCK: nazwa_bloku -->
Wszystkie te przykady tworz szkielet aplikacji WWW korzystajcych z szablonw. Nastpna cz tego
rozdziau zawiera kilka przykadw scenariuszy stosowanych w prawdziwych aplikacjach.
Zapoyczanie
Zapoyczanie jest bardzo atwo realizowalne za pomoc witryny opartej o szablony. Zapoyczanie
witryny to wykorzystanie projektu witryny partnerskiej jako podstawy wasnej aplikacji. Dla przedstawianego
wczeniej przykadu katalogu produktw, jest moliwe aby kilka witryn dystrybutorw korzystajcych z
wasnego projektu graficznego uywao katalogu jako jednej z dostpnych usug. Istnieje kilka sposobw
zrealizowania takiego scenariusza w PHP, ale wykorzystujc szablony mona zrobi to bardzo szybko.
Tworzenie zapoyczonej witryn jest w zasadzie identyczne, jak tworzenie innych witryn opartych o
szablony. Poniewa aplikacja opiera si na interfejsie z innej firmy, integracja i testowanie musi by
przeprowadzone przez obie strony, aby upewni si, e wszystkie funkcje dziaaj tak, jak to zostao
zaplanowane. Tworzc aplikacj, ktra moe by zapoyczana, naley zdecydowa na ile konfigurowalna
powinna by taka witryna. W niektrych przypadkach partnerzy mog umieci dodatkowe informacje o prawach
autorskich, da zmian w terminologii itd. W prostych przypadkach moesz doda jedynie kilka znakw
firmowych.
Aby zilustrowa to zagadnienie, ponisze pliki szablonw s wykorzystywane w aplikacji przedstawionej
w poprzedniej czci. W tym scenariuszu zmienione zostay jedynie dane o prawach autorskich oraz szablon
bazowy. Wydruki 17. i 18. zawieraj stopk z prawami autorskimi oraz plik bazowy.
Wydruk 14.17. Szablon partnera z opisem prawa autorskich
<hr>
<p>
Niektre fragmenty witryny pochodz z firmy Keen Partner Company. &copy 2000
&copy {COPYRIGHT_YEARS} Intechra LLC. Wszystkie prawa zastrzeone.
</p>
Wydruk 14.18. Bazowy szablon partnera
<html>
<head>
<title>{TITLE}</title>
PHP Kompendium wiedzy
183
<link rel="STYLESHEET" type="text/css" href="new_base.css">

</head>
<body bgcolor="White">
<table width="630" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
Firma Keen Partner Company wykorzystuje katalog produktw firmy Intechra LLC.
<td colspan="2">{PAGE_HEADER}</td>
</tr>
<tr>
<td colspan="2" align="center">{CAT_HEADER}</td>
</tr>
<tr>
<td width="526" valign="top">
{BODY}
</td>
<td valign="top">{LEFT_NAVI}</td>
</tr>
<tr>
<td colspan="2">
{PAGE_FOOTER}
</td>
</tr>
</table>
</body>
</html>
Zmodyfikowany zosta rwnie gwny skrypt czcy szablony a skrypt tworzcy stron wynikow jest
rwnie tak zmieniony, aby rozpozna waciwy wygld witryny na podstawie nazwy partnera. Na przykad
gwna witryna jest dostpna poprzez adres http://www.katalog.com/, natomiast witryna partnera poprzez
http://cobrand.katalog.com/. Nazwy te s oczywicie uywane jedynie do testowania i nie musz by to docelowe
nazwy witryny. Po uruchomieniu gwnego skryptu sprawdzana jest nazwa witryny i wywietlana jest
odpowiednia strona. Na wydruku 14.19. pokazany jest taki skrypt.
Wydruk 14.19. Gwny skrypt realizujcy zapoyczanie
<?php
include( "class.FastTemplate.php" );

$aHostArray = explode( ".", $HTTP_HOST );
$aPartner = $aHostArray[0];
switch ( $aPartner )
{
case "cobrand" :
$aPartnerBase = "partner_base.tpl";
$aPartnerFooter = "partner_footer.tpl";
break;
default :
$aPartnerBase = "merch_base2.tpl";
$aPartnerFooter = "merch_footer.tpl";
break;
}

// Zakadamy, e wybran kategori s ubrania
$aCategoryHeader = 'merch_catubrania_header.tpl';

$aTPL = new FastTemplate( "." );
$aTPL->define( array( 'base' => $aPartnerBase,
'header' => 'merch_header.tpl',
'navi' => 'merch_navi.tpl',
'footer' => $aPartnerFooter,
'cat_header' => $aCategoryHeader,
'body' => 'merch_body.tpl'
) );

$aTPL->assign( array( 'TITLE' => 'Katalog produktw: Ubrania',
'CATEGORY_SPECIALS' => 'Sprzedanemy koszulki Intechra!',
'PRODUCT_NAME' => 'Koszulka Intechra',
'PRODUCT_DESCRIPTION' => 'wietna koszulka z logo Intechra LLC!',
'PRODUCT_PRICE' => '14.95 z',
'COPYRIGHT_YEARS' => '2000',
'HREF_HOME' => 'index.phtml',
'HREF_CART' => 'cart.phtml',
'HREF_CONTACT' => 'contact.phtml',
'HREF_COMPANY_INFO' => 'company.phtml'
) );

$aTPL->parse( 'PAGE_HEADER', 'header' );
$aTPL->parse( 'CAT_HEADER', 'cat_header' );
$aTPL->parse( 'LEFT_NAVI', 'navi' );
$aTPL->parse( 'BODY', 'body' );
$aTPL->parse( 'PAGE_FOOTER', 'footer' );
Rozdzia 14 Witryny oparte o szablony
184
$aTPL->parse( 'BASE', 'base' );

$aTPL->FastPrint( 'BASE' );
?>
Po uruchamianiu tego skryptu analizowana jest zmienna $HTTP_HOST, aby sprawdzi, ktra witryna zostaa
wywoana. Jeeli nazwa zawiera cobrand, uywane s szablony partnera, natomiast w pozostaych przypadkach
uywane s standardowe szablony. Gdy strona ta zostanie wywoana poprzez adres http://www.katalog.com,
wynik jest identyczny jak na rysunku 14.3. Rysunek 14.8. przedstawia wygld strony po wywoaniu strony
poprzez adres zapoyczonej witryny.
Rysunek 14.8.
Zapoyczenie
katalogu
produktw
Personalizacja witryny
Personalizacja wydaje si ostatnio najpopularniejszym elementem przy projektowaniu witryn. Kady
portal i wiele duych witryn pozwalaj na personalizowanie witryny tak, aby speniaa potrzeby uytkownika. We
wielu przypadkach personalizacja jest ograniczona do typu wywietlanych informacji i niektrych podstawowych
kolorw. Wykorzystujc szablony moliwa jest o wiele bardziej zaawansowana modyfikacja wygldu witryny.
Zamiast tworzy przykady dla tej czci ksiki, chciabym odwoa si do witryny, ktr wykonaem. Nie jest
moim celem reklamowa ten serwis, ale jedynie pokaza jak bardzo mona modyfikowa wygld witryny
korzystajc z dobrego systemu szablonw.
T witryn jest http://www.HopeToAdopt.com/ i jest to sieciowy serwis dla rodzin adoptujcych dzieci.
Witryna pozwala na tworzenie wasnych profili poprzez odpowied na kilka prostych pyta oraz wybranie
odpowiednich opcji. Najlepsz cech witryny jest moliwo wybrania wasnego tematu uywanego w stronach
informacyjnych. Kady z dostpnych tematw jest przedstawiony w postaci ikony na stronie.
Gdy Uytkownik kliknie ikon tematu, w bazie danych zapisywany jest wybrany identyfikator tematu i
jest on uywany pniej przy wywietlaniu. Na rysunku 14.10.pokazany jest wygld witryny po wybraniu tematu
kolejowego.
PHP Kompendium wiedzy
185
Do stworzenia tematu potrzebne s cztery pliki: {temat}_navi.jpg, {temat}_header.jpg, {temat}_map.tpl
oraz {temat}_vars.php. Pierwsze dwie s rysunkami uywanymi w nagwku oraz panelu nawigacyjnym. Trzeci
jest map obrazu dla panelu nawigacyjnego. Ostatni plik jest zbiorem zmiennych specyficznych dla szablonu,
ktre s doczane do pliku skryptu PHP korzystajcego z danych tematu. Przykad takiego pliku jest pokazany na
wydruku 14.20.

Wydruk 14.20. Plik doczany specyficzny dla tematu
<?php
function AddTemplateVars( &$tpl, $aCurTemplate )
{
$tpl->assign( array( BODYBGCOLOR => "#FFFFFF",
MAINWIDTH => 584,
TOPIMGWIDTH => 584,
TOPIMGHEIGHT => 128,
LEFTIMGWIDTH => 137,
LEFTIMGHEIGHT => 312,
FILLWIDTH => 584,
TABLECOLOR => "#ffadad"));
}
function GetTemplteValue( $aValName )
{
switch ( $aValName )
{
case "NavSide": return "left";
case "HasOvr" : return False;
}
}
?>
Rysunek 14.10.
Profil
uytkownika z
tematem
kolejowym


Plik ten zawiera dane na temat kolorw wykorzystywanych w temacie, oraz wysoko i szeroko rnych
rysunkw uywanych w temacie. Dodatkowo dostpna jest funkcja zwracajca do gwnego skryptu dane na
temat tematu.
Przykad ten jest specyficzny dla aplikacji HopeToAdopt.com, ale moe suy jako ilustracja
elastycznoci systemu szablonw. Witryna HopeToAdopt.com jest uywana jako dziaajcy przykad pokazujcy
si systemu szablonw zamiast tworzenia kolejnego trywialnego przykadu. Peny kod tej witryny nie moe
by tutaj zamieszczony, ale poprzednie przykady zawieraj wystarczajco duo informacji, aby stworzy tego
typu witryn.
Rozdzia 14 Witryny oparte o szablony
186

Obsuga wielu jzykw
Coraz czstsze jest tworzenie witryn dziaajcych w kilku jzykach. Wykorzystujc system szablonw do
obsugi tej funkcji pozwala na tworzenie aplikacji w jednym jzyku, a nastpnie w atwy sposb doda pniej
kolejne jzyki. I tym razem tworzenie tak skomplikowanej aplikacji wymaga uwanego projektowania przed
rozpoczciem prac programowych, ale efekt jest wart tej pracy. Jedn z pierwszych decyzji jest zadecydowanie, w
jaki sposb bd dzielone i identyfikowane elementy waciwe dla jzyka. Jedn z metod jest stworzenie
oddzielnych katalogw dla poszczeglnych jzykw. Drug jest umieszczenie identyfikatorw jzyka w nazwach
i plikach szablonw. Metoda ta zostanie zastosowana w przykadzie.
W przykadzie tym, dla kadego jzyka wymagane s cztery pliki: rysunek nagwka, rysunek panelu
nawigacyjnego, mapa rysunku, oraz gwny plik. Nie bdziemy tu zamieszcza wszystkich plikw, pokaemy
jedynie gwny skrypt i wynik dziaania. Na wydruku 14.21. zamieszczony jest gwny skrypt, ktry generuje
jedn stron midzynarodowej witryny opartej o szablony.
Wydruk 14.21. Gwny skrypt midzynarodowej witryny
<?php
include( "class.FastTemplate.php" );

$aTPL = new FastTemplate( "." );

if ( empty( $Lang ) )
{
$Lang = 'enu';
}

$aHeaderImg = "intl_head_{$Lang}.gif";
$aNaviImg = "intl_nav_{$Lang}.gif";
$aNaviMap = "intl_map_{$Lang}.tpl";
$aBodyTpl = "body_{$Lang}.tpl";

$aTPL->define( array( 'base' => 'intl_base.tpl',
'body' => $aBodyTpl,
'navimap' => $aNaviMap ) );
'HREF_DEU' => $PHP_SELF . "?Lang=deu" ) );

$aTPL->assign( array( 'HREF_HOME' => "intl.phtml?Lang=$Lang",
'HREF_LINKS' => "links.phtml?Lang=$Lang",
'HREF_ABOUT' => "about.phtml?Lang=$Lang",
'HREF_CONTACT' => "contact.phtml?Lang=$Lang",
'HEADER_IMG' => $aHeaderImg,
'NAV_IMG' => $aNaviImg,
'HREF_ENU' => $PHP_SELF . "?Lang=enu",
'HREF_POL' => $PHP_SELF . "?Lang=pol",

$aTPL->parse( 'NAV_MAP', 'navimap' );
$aTPL->parse( 'BODY', 'body' );
$aTPL->parse( 'BASE', 'base' );
$aTPL->FastPrint( 'BASE' );
?>
Jedyn widoczn rnic w tym skrypcie, w porwnaniu z innymi przedstawionymi w tym rozdziale jest
cz na pocztku ustalajca biecy jzyk i korzystajca z tej informacji w celu doczenia waciwego pliku. W
przykadzie tym identyfikator jzyka jest przesyany poprzez adres URL, wic kade cze w witrynie musi
przesya t dan do kolejnej strony. W duych aplikacjach przedstawiona metoda definiowania wszystkich
moliwych czy staje si nieporczna. W praktyce kod generujcy cza prawdopodobnie bdzie umieszczony w
oddzielnym pliku doczanym. Niezalenie od prostoty przedstawionego przykadu, elastyczno i sia tego
rozwizania jest ogromna. Na rysunkach 14.12, 14.13 i 14.14 pokazana jest strona gwna w jzyku odpowiednio:
angielskim, polskim i niemieckim.
PHP Kompendium wiedzy
187

Rysunek 14.12.
Witryna
midzynarodowa
w jzyku
angielskim

Rysunek 14.13.
Witryna
midzynarodowa
w jzyku polskim

Rozdzia 14 Witryny oparte o szablony
188

Rysunek 14.14.
Witryna
midzynarodowa
w jzyku
niemieckim
Podsumowanie
W rozdziale tym pokazano jak zastosowanie systemu szablonw polepsza elastyczno i atwo
utrzymania aplikacji WWW. Dostarczone przykady pokazuj, w jaki sposb mona uy szablonw do obsugi
zapoyczania, personalizacji i obsugi jzykw.
Uywanym systemem szablonw jest FastTemplate, ktry mona uzyska pod adresem
http://www.thewebmasters.net/. Niezalenie od rodzaju uywanego systemu szablonw jest zalecane zapoznanie
si z tym sposobem tworzenia aplikacji WWW.
PHP Kompendium wiedzy
189
Rozdzia 15. Witryny oparte o baz
danych
Wstp
W rozdziale 6. Wsppraca z bazami danych opisane zostay narzdzia PHP pozwalajce na dostp do
baz danych. W ostatnim rozdziale dokadnie opisane jest wykorzystanie systemu szablonw do oddzielenia
interfejsu aplikacji od kodu aplikacji. Rozdziay te stanowi podstaw dla tego rozdziau. W rozdziale tym
opisane s szczegy projektu i implementacji na wysokim poziomie, wic nie bd opisane niskopoziomowe
funkcje obsugi baz danych. Wicej na ten temat mona przeczyta w rozdziale 6. oraz w skorowidzu funkcji na
kocu tej ksiki.
Projekt bazy danych
W kadym aspekcie tworzenia oprogramowania wynikiem dobrego projektu jest dobry produkt.
Nieprawidowy projekt bazy danych zwykle prowadzi do problemw z integracj, utrzymaniem i tworzeniem
aplikacji. Prawidowe projektowanie baz danych jest tematem wielu wspaniaych ksiek i jest to temat zbyt
obszerny i skomplikowany, aby go tutaj przedstawi, wic opisane zostan niektre podstawowe informacje.
Pierwsz decyzj jak naley podj jest wybr systemu zarzdzania baz danych (SZRBD). Poniewa
PHP obsuguje wiele popularnych systemw baz danych, przy podejmowaniu tej decyzji powinnimy wzi pod
uwag koszty, funkcjonalno, skalowalno oraz inne kluczowe aspekty bazy danych, a nie obsuga jzyka.
Dla wielu aplikacji PHP wietnym systemem bazy danych jest MySQL, poniewa PHP posiada domylnie
wbudowan obsug MySQL. MySQL jest dostpny na zasadach licencji GNU General Public License (GPL).
Posiada on obsug duego podzbioru SQL oraz bogate API. Informacje na temat instalacji i korzystania z
MySQL znajduj si w rozdziale 6. Przykady w tym rozdziale s napisane w oparciu o baz danych MySQL.
Dostpne s rwnie inne bazy danych, ktre take maj swoje silne strony. Jeeli masz zamiar stworzy
aplikacj, ktra obsugiwa bdzie du liczb uytkownikw lub potrzebujesz obsugi transakcji, powiniene
rozway zastosowanie Oracle lub Microsoft SQL Server. Wybr waciwej bazy danych dla aplikacji wymaga
wyboru pomidzy cen, dostpnoci obsugi technicznej, skalowalnoci i dostpnymi funkcjami. Wybr
niewaciwego systemu bazy danych moe spowodowa, e w przypadku duego obcienia aplikacja bdzie
miaa nisk wydajno lub odmwi posuszestwa. Jeeli przypuszczasz, e po stworzeniu aplikacji system bazy
danych moe by zmieniony na inny, naley skorzysta z poredniego API stanowicego bufor pomidzy
aplikacj a funkcjami specyficznymi dla okrelonej bazy danych, oraz korzysta ze standardowego jzyka SQL.
Dodatkowo naley pamita o rnicach w obsudze standardu SQL w rnych systemach baz danych. Dla
przykadu w Oracle mona korzysta z nastpujcych podzapyta:
SELECT * FROM tabela1 WHERE id IN (SELECT id FROM tabela2)
W czasie pisania tej ksiki MySQL nie potrafi obsugiwa takiej konstrukcji. Tworzenie kodu SQL
niezalenego od systemu bazy danych jest wyzwaniem samym w sobie, wic zmiana systemu bazy danych na
inny moe by niepraktyczna nawet dla maych aplikacji.
Po wybraniu systemu bazy danych kolejnym krokiem jest stworzenie i dokadne przetestowanie modelu
danych. Jako przykadu uyjemy sieciowego katalogu towarw, przeznaczonego dla wielu sprzedawcw lub
sklepw. W tym rozdziale opisany zostanie proces projektowania i implementacji bazy danych, ktra bdzie
wykorzystywana w dwch kolejnych rozdziaach. Celem jest stworzenie sieciowego katalogu, obsugujcego w

jednej bazie danych fragmenty danych przypisane do rnych sprzedawcw, a kady z tych sprzedawcw moe
mie wiele kategorii produktw. Oglny schemat tej bazy danych jest pokazany na rysunku 15.1.
Rysunek 15.1.
Podstawowy model
danych katalogu
towarw

Rozwijajc model z rysunku 15.1, kady sprzedawca moe mie jedn lub wicej kategorii produktw, a
kada z kategorii moe zawiera jeden lub wicej produktw. Na tym poziomie szczegowoci mona stworzy
kompletny model danych. Na rysunku 15.2 pokazany jest kompletny model danych katalogu produktw. Jego
implementacja w SQL zamieszczona jest na wydruku 15.1.
Rysunek 15.2.
Peny model
danych katalogu
towarw

Wydruk 15.1. Implementacja modelu danych katalogu produktw
CREATE TABLE mcMerchants
(
merchant_id int not null,
name varchar(50) not null,
created_date datetime not null,
internal_status int not null,
addtl_handling float default 0.0 not null,
mgr_email varchar(25) not null,
mgr_username varchar(30) not null,
mgr_password varchar(30) not null,
mgr_name varchar(50) not null,

primary key ( merchant_id ),
index( name ),
index( mgr_username )
);

CREATE TABLE mcCategories
(
merchant_id int not null,
category_id int not null,
name varchar(50) not null,
PHP Kompendium wiedzy
191

created_date datetime not null,
deleted tinyint default 0 not null,

primary key ( merchant_id, category_id ),
index( name )
);

CREATE TABLE mcProducts
(
merchant_id int not null,
product_id int not null,
category_id int not null,
name varchar(200) not null,
descr text not null,
has_image_file tinyint default 0 not null,
external_id varchar(100) not null,
ship_weight float not null,
price float not null,
created_date datetime not null,
deleted tinyint default 0 not null,

primary key ( merchant_id, product_id ),
index( name )
);

CREATE TABLE mcProductsToCategories
(
merchant_id int not null,
category_id int not null,
product_id int not null,

primary key ( merchant_id, category_id, product_id )
);

CREATE TABLE mcProductsOptions
(
merchant_id int not null,
product_id int not null,
option_id int not null,
name varchar(100) not null,
sort_type tinyint default 0 not null,

primary key ( merchant_id, product_id, option_id ),
index( name )
);

CREATE TABLE mcProductsOptionsValues
(
merchant_id int not null,
product_id int not null,
option_id int not null,
value_id int not null,
name varchar(100) not null,

primary key ( merchant_id, product_id, option_id, value_id ),
index( name )
);
Po zaprojektowaniu i sprawdzeniu modelu danych mona rozpocz prace nad aplikacj. Podstawowymi
zaoeniami aplikacji katalogu produktw s:
Wywietlanie danych o produktach w logicznym i atwym do uycia formacie.
Umoliwienie sprzedawcom uaktualniania danych o produktach w dowolnym momencie z dowolnego
komputera przyczonego do sieci Internet.
Umoliwienie sprzedawcom zarzdzanie kategoriami produktw i przypisywanie produktw do kategorii
w dowolnym momencie z dowolnego komputera przyczonego do sieci Internet.
Mwic prociej, celem jest dostarczenie metody na dodawanie, zmian i wywietlanie dowolnej danej
zawartej w katalogu produktw, wykorzystujc do tego celu Internet. W nastpnej sekcji opisane zostanie
zarzdzanie tymi danymi.
Zarzdzanie danymi aplikacji
Po zaprojektowaniu i stworzeniu bazy danych mona rozpocz tworzenie aplikacji zarzdzajcej
rekordami w bazie danych. Podstawowymi operacjami jakie mona przeprowadza na dowolnych danych jest
Rozdzia 15 Witryny oparte o baz danych
192

dodawanie, zmiana i usuwanie. W tej aplikacji niezbdne bdzie rwnie zarzdzanie hierarchi danych. Aby
speni to wymaganie, speniona musi by zasada, e przed dodaniem jakiegokolwiek produktw, musi istnie co
najmniej jedna kategoria produktw dla sprzedawcy.
Majc na uwadze t zasad, logicznym punktem startowym jest strona z moliwoci zarzdzania
kategoriami produktw. W aplikacji tej zakadamy, ze sprzedawca moe si zalogowa do fragmentu witryny w
celu zarzdzania danymi. W aplikacji bdziemy korzysta z omwionego wczeniej systemu szablonw
FastTemplate. Do podstawowego zarzdzania danymi aplikacji uyte zostan szablony przedstawione na
wydrukach od 2. do 4.
Wydruk 15.2. Podstawowy szablon zarzdzania danymi aplikacji (mgmt_app_base.tpl)
<html>
<head>
<title>{TITLE}</title>
<link rel="STYLESHEET" type="text/css" href="mgmt.css">
</head>
<body bgcolor="White">
{BODY}
</body>
</html>
Wydruk 15.3. Szablon zarzdzania danymi aplikacji (mgmt_body.tpl)
<table width="630" align="center">
<tr>
<td align="center" class="title">
{MERCHANT_NAME}
</td>
</tr>
<tr>
<td>
{PAGE_BODY}
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
</tr>
<tr>
<td>
{FOOTER}
</td>
</tr>
</table>
Wydruk 15.4. Szablon zarzdzania danymi aplikacji stopka (mgmt_footer.tpl)
<hr>
<p class="footer">
&copy; 2000 Intechra LLC. Wszystkie prawa zastrzeone.
</p>
Szablony przedstawione na wydrukach od 2. do 4. stanowi podstawowy szablon aplikacji zarzdzania
danymi. Szablony uywane do stworzenia strony zarzdzania konkretn kategori umieszczone s na wydrukach
od 5. do 7. Na wydruku 15.8. znajduje si skrypt czcy te szablony i wywietlajcy dane z bazy danych.
Wydruk 15.5. Szablon zarzdzania danymi aplikacji gwny szablon kategorii (mgmt_cats_ovr.tpl)
<h1>
Zarzdzanie kategoriami produktw
</h1>
<p>
Prosz uy poniszych narzdzi do dodaniam edycji i usunicia
kategorii produktw.
</p>
<p>
<a href="mgmt_cat_add.phtml">Kliknij tutaj</a> aby doda kategori.
</p>
{EXISTING_CATEGORIES}
Wydruk 15.6. Szablon zarzdzania danymi aplikacji tabela kategorii (mgmt_cats_table.tpl)
<h2>
Istniejce kategorie produktw:
</h2>
<table cellspacing="0" cellpadding="0">
<tr>
<th>
&nbsp;&nbsp;Identyfikator kategorii&nbsp;&nbsp;
</th>
<th>
&nbsp;&nbsp;Nazwa kategorii&nbsp;&nbsp;
PHP Kompendium wiedzy
193
</th>

<th>
&nbsp;&nbsp;Operacje&nbsp;&nbsp;
</th>
</tr>
{CATEGORY_LIST}
</table>
Wydruk 15.7. Szablon zarzdzania danymi aplikacji bieca kategoria (mgmt_cats_item.tpl)
<tr>
<td>
{CAT_ID}
</td>
<td>
{CAT_NAME}
</td>
<td class="small">
<a href="mgmt_cat_edit.phtml?cat_id={CAT_ID}">ZMIE</a>
<a href="mgmt_cat_del.phtml?cat_id={CAT_ID}">USU</a>
</td>
</tr>
Wydruk 15.8. Aplikacja zarzdzajca danymi zarzdzanie kategoriami (mgmt_cats.phtml)
<?php
error_reporting( E_ALL & ~E_NOTICE );
session_start(); // niejawne ustawienie zmiennej sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
header( "Location: login.phtml?retpage=" . urlencode( $REQUEST_URI ) . "\n" );
exit;
}

include( "class.FastTemplate.php" );
include( "./mgmt_db.php" );
include( "./mgmt_funcs.php" );

$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();

$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_cats_ovr.tpl",
"cat_table" => "mgmt_cats_table.tpl",
"cat_item" => "mgmt_cats_item.tpl" ) );

$aSQL = "select category_id, name from mcCategories
where ( merchant_id = $aMerchantID )";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
while ( $aDB->next_record() )
{
$aCatID = $aDB->f( "category_id" );
$aCatName = $aDB->f( "name" );

$aTPL->assign( array( "CAT_ID" => $aCatID,
"CAT_NAME" => $aCatName ) );
$aTPL->parse( "CATEGORY_LIST", ".cat_item" );
}
$aTPL->parse( "EXISTING_CATEGORIES", "cat_table" );
}
else
{
$aTPL->assign( array( "EXISTING_CATEGORIES" => "" ) );
}

$aTPL->assign( array( "TITLE" => "Zarzdzanie katalogiem towarw",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID )
) );


$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aTPL->FastPrint( "PAGE" );
?>
Pierwsz operacj jak wykonuje skrypt jest rozpoczcie sesji i sprawdzenie identyfikatora sprzedawcy,
$aMerchantID. Jeeli nie jest on ustawiony, uytkownik jest kierowany na stron logowania. Na stronie logowania
sprawdzane s dane uytkownika i jeeli zostanie on rozpoznany, ta zmienna sesji jest inicjowana identyfikatorem
Rozdzia 15 Witryny oparte o baz danych
194

sprzedawcy. Nastpnie uywajc identyfikatora jako filtru, skrypt ten pobiera kategorie z bazy danych. Jeeli
istnieje co najmniej jedna kategoria, skrypt pobiera te dane i generuje tabel istniejcych kategorii. Na rysunku
15.3. pokazana jest strona z dwiema kategoriami testowego sprzedawcy.
Rysunek
15.3.
Strona
zarzdza
nia
kategoria
mi
katalogu
produkt
w
Dodawanie kategorii jest zrealizowane za pomoc kliknicia w cze. Jeeli istniej kategorie, kada z
nich posiada wasne cza ZMIE i USU, na rysunku 15.3. szablony dodawania kategorii oraz skrypt
umieszczone s na wydrukach 9. i 10.
Wydruk 15.9. Szablon zarzdzania danymi aplikacji dodawanie kategorii (mgmt_cat_add.tpl)
<h1>
Dodawanie kategorii produktu
</h1>
<form action="{FORM_ACTION}" method="post">
<table>
<tr>
<td colspan="2">
{ERRORS}
</td>
</tr>
<tr>
<td>
Nazwa kategorii:
</td>
<td>
<input type="text" name="CategoryName">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="Wylij">
</td>
</tr>
</table>
</form>
Wydruk 15.10. Aplikacja zarzdzajca danymi dodawanie kategorii (mgmt_cat_add.phtml)
<?php
session_start(); // niejawne ustawienie zmiennej sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
header( "Location: login.phtml?retpage=" .
urlencode( $REQUEST_URI ) . "\n" );
exit;
}

include( "class.FastTemplate.php" );
PHP Kompendium wiedzy
195

include( "./mgmt_db.php" );
include( "./mgmt_funcs.php" );

$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();

$aErrors = "";
if ( $REQUEST_METHOD == 'POST' ) // Tutaj wchodzimy po wysaniu danych z formularza
{
if ( IsValidCategory( $aDB, $aMerchantID, $CategoryName ) == True )
{
SaveCategory( $aDB, $aMerchantID, $CategoryName );
header( "Location: mgmt_cats.phtml\n" );
exit;
}
else
{
$aErrors = "Nazwa kategorii zostaa ju uyta. ";
$aErrors .= "Prosz wybra inn nazw kategorii.";
}
}


$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_cat_add.tpl" ) );

$aTPL->assign( array( "TITLE" => "Zarzdzanie katalogiem produktw",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID ),
"FORM_ACTION" => $PHP_SELF,
"ERRORS" => $aErrors
) );


$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aTPL->FastPrint( "PAGE" );
?>
Skrypt przedstawiony na wydruku 15.10. jest podobny do wielu innych skryptw zbierajcych i
kontrolujcych dane, ktre byy opisane w tej ksice. Jest on uywany do wywietlenia formularza oraz kontroli
poprawnoci wprowadzonych danych. W tym przypadku caa logika kontroli poprawnoci oraz zapamitywania
nowych kategorii jest umieszczona w funkcjach IsValidCategory() i SaveCategory(). Te funkcje pomocnicze
zostan zamieszczone w dalszej czci rozdziau na wydruku pliku mgmt_funcs.php. Funkcja sprawdzajca
poprawno szuka jedynie kategorii o takiej samej nazwie.
Funkcje edycji i usuwania kategorii s bardzo podobne do innych skryptw zamieszczonych ju w tej
ksice. Przygldajc si wydrukowi 8. mona zauway, e cza do usuwania i zmiany kategorii zawieraj
identyfikator kategorii. Dla przykadu peny adres URL do usuwania kategorii Ubrania to
http://server.com/ch15/mgmt_cat_del.phtml?cat_id=1. Do skryptu jest przekazany identyfikator kategorii, wic
mona na jego podstawie skonstruowa proste wyraenie SQL DELETE. W przypadku edycji, ten sam mechanizm
umoliwia wczytanie nazwy kategorii do pola tekstowego. Kod rdowy tych stron nie zosta tu zamieszczony,
poniewa jest on bardzo podobny do kodu z wydrukw 9. i 10. Funkcje usuwajce i zmieniajce kategorie
pokazane s na wydruku pliku mgmt_funcs.php (wydruk 15.12.).
Podczas tworzenia kategorii naley pamita, e nazwa nowej kategorii nie moe znajdowa si w bazie
danych. W przypadku usuwania kategorii naley sprawdzi, czy nie istnieje produkt nalecy do tej kategorii.
Jeeli do kategorii nale jakie produkty usunicie kategorii spowodowaoby powstanie osieroconych rekordw
produktw i potencjalnie bdw aplikacji. Tworzc aplikacje WWW dziaajce w oparciu o baz danych,
spenienie wszystkich zasad biznesowych w kodzie jest krytyczne do dobrego dziaania aplikacji. Niektre z
zasad mog by realizowane przez funkcje bazy danych, na przykad wymuszanie wizw integralnoci lub
kaskadowe operacje na danych. Inne zasady mog by realizowane w bazie danych za pomoc wyzwalaczy lub
procedur przechowywanych. Pozostae zasady biznesowe musz by realizowane w kodzie aplikacji.
Tworzc kod obsugi zasad biznesowych dobr praktyk jest tworzenie funkcji obsugi wszystkich zasad.
Dla przykadu naley uy funkcji DeleteEntity() zamiast wplata w kod wyraenia DELETE. Funkcja
DeleteEntity() moe zawiera w sobie ca logik wymagan do kontroli wizw integralnoci oraz zasad
biznesowych i zwraca rne wartoci kodu powrotu w zalenoci od rnych bdw, jakie mog wystpi. W
Rozdzia 15 Witryny oparte o baz danych
196

ten sposb poprawia si moliwo pniejszego uycia kodu oraz uatwia wprowadzanie do aplikacji zmian w
logice.
Wracajc do katalogu produktw, kolejnym krokiem jest utworzenie stron obsugi aktualnego zestawu
produktw. Strony te s logicznie identyczne ze stronami obsugi kategorii. Na rysunku 15.4 pokazana jest strona
zarzdzania produktami, natomiast na wydruku 15.11. znajduje si skrypt generujcy t stron.
Rysunek
15.4.
Ekran
zarzdza
nia
produkta
mi
Wydruk 15.11. Aplikacja zarzdzania danymi zarzdzanie produktami (mgmt_prods.phtml)
<?php
error_reporting( E_ALL & ~E_NOTICE );
session_start(); // niejawne ustawianie zmiennej sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
header( "Location: login.phtml?retpage=" . urlencode( $REQUEST_URI )."\n" );
exit;
}

include( "class.FastTemplate.php" );
include( "./mgmt_db.php" );
include( "./mgmt_funcs.php" );

$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();

$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_prods_ovr.tpl",
"prod_table" => "mgmt_prods_table.tpl",
"prod_item" => "mgmt_prods_item.tpl" ) );

$aSQL = "select a.category_id, a.product_id, a.name, a.external_id, a.price,";
$aSQL .= "b.name as cat_name from mcProducts a, mcCategories b where (a.merchant_id";
$aSQL .= "= $aMerchantID) and (a.category_id = b.category_id)";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
while ( $aDB->next_record() )
{
$aCatID = $aDB->f( "category_id" );
$aCatName = $aDB->f( "cat_name" );
$aProdID = $aDB->f( "product_id" );
$aProdName = $aDB->f( "name" );
$aProdEID = $aDB->f( "external_id" );
$aProdPrice = $aDB->f( "price" );

$aTPL->assign( array( "PROD_ID" => $aProdID,
PHP Kompendium wiedzy
197

"PROD_EID" => $aProdEID,
"PROD_NAME" => $aProdName,
"PROD_CAT" => $aCatName,
"PROD_PRICE" => '$' .
number_format( $aProdPrice, 2 ) ) );
$aTPL->parse( "PRODUCT_LIST", ".prod_item" );
}
$aTPL->parse( "EXISTING_PRODUCTS", "prod_table" );
}
else
{
$aTPL->assign( array( "EXISTING_PRODUCTS" => "" ) );
}

$aTPL->assign( array( "TITLE" => "Zarzdzanie katalogiem produktw",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID )
) );


$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aTPL->FastPrint( "PAGE" );
?>
Strony umoliwiajce dodawanie, usuwanie i zmian produktw nie zostay tutaj szczegowo
przedstawione, ale s dostpne na stronie WWW wymienionej w zasobach sieci na kocu ksiki. Zasady
biznesowe obowizujce przy dodawaniu nowych produktw s nastpujce:
Produkt musi zosta przypisany do jednej kategorii.
Nazwy produktw w kategorii musz by unikalne.
Cena produktu musi wynosi co najmniej zero.
Waga towaru rwnie musi wynosi co najmniej zero.
W chwili obecnej nie ma ogranicze na kasowanie produktw. Po zmianie danych produktu musz by
spenione te same zasady biznesowe co przy dodawaniu nowego produktu. Na wydruku 15.12 zamieszczony
zosta fragment pliku mgmt_funcs.php zawierajcy niektre funkcje dostpu do bazy danych oraz funkcje zasad
biznesowych uywanych w aplikacji.
Wydruk 15.12. Aplikacja zarzdzajca danymi funkcje uytkowe (mgmt_funcs.php)
<?php

function GetMerchantName( $aDB, $aMerchantID )
{
$aResult = "";
$aSQL = "select name from mcMerchants where ";
$aSQL .= "( merchant_id = $aMerchantID )";
$aDB->query( $aSQL );
if ( $aDB->next_record() == True )
{
$aResult = $aDB->f( "name" );
}
return $aResult;
}

function NewCategoryID( $aDB, $aMerchantID )
{
$aSQL = "select ( max( category_id ) + 1 ) as new_id ";
$aSQL .= "from mcCategories where ( merchant_id = $aMerchantID )";
$aDB->query( $aSQL );
if ( $aDB->next_record() )
{
$aResult = $aDB->f( "new_id" );
}
if ( empty( $aResult ) == True )
{
$aResult = 1;
}
return $aResult;
}

function IsValidCategory( $aDB, $aMerchantID, $aCategoryName )
{
$aSQL = "select category_id from mcCategories where ";
$aSQL .= "( merchant_id = $aMerchantID ) and ";
$aSQL .= "( upper( name ) = upper( '$aCategoryName' ) )";
$aDB->query( $aSQL );
Rozdzia 15 Witryny oparte o baz danych
198
// Jeeli istnieje rekord z t sam nazw kategorii,

// zwr false
return ( $aDB->num_rows() == 0 );
}

function SaveCategory( $aDB, $aMerchantID, $aCategoryName )
{
$aNewID = NewCategoryID( $aDB, $aMerchantID );
$aSQL = "insert into mcCategories ( merchant_id, ";
$aSQL .= "category_id, name, created_date ) values ";
$aSQL .= "( $aMerchantID, $aNewID, '$aCategoryName', ";
$aSQL .= " NOW() )";
$aDB->query( $aSQL );
return ( $aDB->Errno == 0 );
}

function DeleteCategory( $aDB, $aMerchantID, $aCategoryID )
{
$aSQL = "delete from mcCategories where ( merchant_id = ";
$aSQL .= "$aMerchantID ) and ( category_id = $aCategoryID )";
$aDB->query( $aSQL );
return ( $aDB->Errno == 0 );
}

function UpdateCategory( $aDB, $aMerchantID, $aCategoryID, $aCategoryName )
{
$aSQL = "update mcCategories set name='$aCategoryName' ";
$aSQL .= "where ( merchant_id = $aMerchantID ) and ";
$aSQL .= "( category_id = $aCategoryID )";
$aDB->query( $aSQL );
return ( $aDB->Errno == 0 );
}
// i inne funkcje
?>
Aplikacja zarzdzajca danymi jest jedynie maym fragmentem caego katalogu produktw. Zapewnia ona
interfejs WWW do zarzdzania elementami katalogu. Inn wan funkcj katalogu jest moliwo wywietlania
produktw, szukania produktw oraz odczytywania szczegowych danych o produktach w katalogu. Nastpna
cz tego rozdziau traktuje wanie o tych zagadnieniach.
Wywietlanie danych
Aplikacja wywietlajca dane produktw z bazy pozwala na wywietlanie produktw okrelonej kategorii,
wywietlanie alfabetycznej listy produktw oraz zapewnia mechanizm przeszukiwania, pozwalajcy na
znalezienie okrelonego produktu. Aby odszuka produkty i kategorie biecego sprzedawcy wykorzystywany
jest identyfikator sprzedawcy, przekazywany w postaci zmiennej sesji. Zmienna ta jest ustawiana jeszcze zanim
uytkownik wejdzie na stron, na ktrej wywietlane s informacje o produktach.
Na rysunku 15.5. znajduje si gwna strona katalogu produktw. Strona ta pozwala na natychmiastowy
dostp do danych podzielonych na kategorie oraz na przeszukiwanie katalogu. Jeeli nie ma zarejestrowanych
adnych kategorii (co oznacza brak towarw), wywietlana jest informacja, e dla ten sprzedawca nie ma
zarejestrowanych produktw. Na wydruku 15.13. zamieszczony jest skrypt generujcy t stron.
PHP Kompendium wiedzy
199

Rysunek
15.5.
Gwna
strona
katalogu
produkt
w
Wydruk 15.13. Aplikacja zarzdzajca danymi wywietlanie produktw (mgmt_main.phtml)
<?php
error_reporting( E_ALL & ~E_NOTICE );
session_start(); // niejawne ustawianie zmiennej sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
print( "Bd wewntrzny aplikacji. Brak identyfikatora sprzedawcy." );
exit;
}

include( "class.FastTemplate.php" );
include( "./mgmt_db.php" );
include( "./mgmt_funcs.php" );

$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();

$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_main.tpl",
"cat_body" => "mgmt_main_body.tpl",
"cat_item" => "mgmt_main_cat_item.tpl" ) );

$aSQL = "select category_id, name from mcCategories
where ( merchant_id = $aMerchantID )";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
while ( $aDB->next_record() )
{
$aCatID = $aDB->f( "category_id" );
$aCatName = $aDB->f( "name" );

$aTPL->assign( array( "CAT_HREF" => GetCategoryHREF( $aCatID ),
"CAT_NAME" => $aCatName ) );
$aTPL->parse( "CATEGORY_LIST", ".cat_item" );
}
$aTPL->parse( "CATALOG_MAIN_BODY", "cat_body" );
}
else
{
Rozdzia 15 Witryny oparte o baz danych
200
$aTPL->assign( array("CATALOG_MAIN_BODY" => "Brak dostpnych produktw." ) );

}

$aTPL->assign( array("TITLE" => "Zarzdzanie katalogiem produktw",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID )
) );


$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aTPL->FastPrint( "PAGE" );
?>
Pliki szablonw uyte do wygenerowania tej strony s bardzo podobne do tych, ktre byy uywane w
skrypcie zarzdzajcym kategoriami, zamieszczonym na poprzednim wydruku. W skrypcie pokazanym na
poprzednim wydruku, do generowania adresw URL dla poszczeglnych nazw kategorii, zostaa wykorzystana
funkcja GetCategoryHREF(). Funkcja ta wchodzi w skad pliku mgmt_funcs.php i jest przedstawiona na wydruku
15.14. Funkcja ta pozwala na wygenerowanie przez ten skrypt serii statycznych stron na podstawie dynamicznych
danych. Metoda ta zostanie opisane szczegowo w nastpnym rozdziale.
Wydruk 15.14. Funkcja GetCategoryHREF()
function GetCategoryHREF( $aCatID, $aDynamic = True )
{
if ( $aDynamic == True )
{
return "mgmt_prod_list.phtml?cat_id=$aCatID";
}
else
{
return "mgmt_cat_{$aCatID}.html";
}
}
Na wydruku 15.15. zamieszczony zosta skrypt wywietlajcy produkty. Jest on uywany do wywietlania
listy podzielonej na kategorie, listy alfabetycznej oraz wynikw wyszukiwania.
Wydruk 15.15. Przykad skryptu wywietlajcego produkty
<?php
error_reporting( E_ALL & ~E_NOTICE );
session_start(); // niejawne ustawianie zmiennej sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
print( "Bd wewntrzny aplikacji. Brak identyfikatora sprzedawcy." );
exit;
}

include_once( "class.FastTemplate.php" );
include_once( "mgmt_db.php" );
include_once( "mgmt_funcs.php" );

$aMerchantID = 1;

if ( $REQUEST_METHOD == 'POST' ) // Tutaj wchodzimy po wysaniu danych z formularza
{
$aSQL = "select a.category_id, a.product_id, a.name, a.external_id, a.price, ";
$aSQL .= "a.ship_weight, a.has_image_file, a.descr, b.name as cat_name from ";
$aSQL .= "mcProducts a, mcCategories b where ( a.merchant_id = $aMerchantID) ";
$aSQL .= "and ( a.category_id = b.category_id ) and ( ( upper( a.name ) like ";
$aSQL .= "upper( '%{$SearchTerms}%' ) ) or ( upper( a.descr ) like ";
$aSQL .= "upper( '%{$SearchTerms}%' ) ) ) order by a.name";
}
else
{
if ( empty( $cat_id ) == False ) // lista wedug kategorii
{
$aSQL = "select a.category_id, a.product_id, a.name, a.external_id, ";
$aSQL .= "a.price, a.ship_weight, a.has_image_file, a.descr, b.name as ";
$aSQL .= "cat_name from mcProducts a, mcCategories b where ";
$aSQL .= "(a.merchant_id = $aMerchantID) and (a.category_id = b.category_id) ";
$aSQL .= "and ( a.category_id = $cat_id ) order by a.name";
}
else // lista alfabetyczna
{
$aSQL = "select a.category_id, a.product_id, a.name, a.external_id, a.price, ";
$aSQL .= "a.ship_weight, a.has_image_file, a.descr, b.name as cat_name from ";
$aSQL .= "mcProducts a, mcCategories b where (a.merchant_id = $aMerchantID) ";
$aSQL .= "and (a.category_id = b.category_id) order by a.name";
}
}
PHP Kompendium wiedzy
201


$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();

$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_prod_main.tpl",
"prod_item" => "mgmt_prod_item.tpl" ) );

$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
while ( $aDB->next_record() )
{
$aProdName = $aDB->f( "name" );
$aProdEID = $aDB->f( "external_id" );
$aProdPrice = $aDB->f( "price" );
$aProdWeight = $aDB->f( "ship_weight" );
$aHasImage = $aDB->f( "has_image_file" );
$aProdDescr = $aDB->f( "descr" );
$aCatName = $aDB->f( "cat_name" );
$aCatID = $aDB->f( "category_id" );
$aProdID = $aDB->f( "product_id" );

$aImageFile = "images/default.jpg";
if ( $aHasImage == True )
{
$aImageFile = "images/{$aMerchID}_{$aCatID}_{$aProdID}.jpg";
}

$aTPL->assign( array( "PROD_NAME" => $aProdName,
"CAT_NAME" => $aCatName,
"PROD_EID" => $aProdEID,
"PROD_PRICE" => number_format( $aProdPrice, 2 ).'z',
"PROD_DESCR" => $aProdDescr,
"IMAGE_FILE" => $aImageFile
) );
$aTPL->parse( "ITEM_LIST", ".prod_item" );
}
}
else
{
$aTPL->assign( array("ITEM_LIST" => "Nie ma produktw dla wybranego kryterium."));
}

$aTPL->assign( array( "TITLE" => "Zarzdzanie katalogiem produktw",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID )
) );


$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aTPL->FastPrint( "PAGE" );
?>
Pierwsz operacj podejmowan przez skrypt jest sprawdzenie, jaki zbir danych powinien zosta
wybrany. Jeeli jest on uruchomiony poprzez wywoanie POST, oznacza to, e uytkownik chcia wyszukiwa
dane. W przeciwnym przypadku naley wygenerowa list alfabetyczn, lub tylko dla jednej kategorii. Jeeli
ustawiona zostaa zmienna $cat_id, potrzebna jest lista dla okrelonej kategorii. W oparciu o te informacje,
generowane jest odpowiednie zapytanie SQL. W zalenoci od wyniku zapytania wynikowa strona zawiera list
produktw albo komunikat, ktry informuje uytkownika o braku produktw dla wybranej przez niego kryteriw.
Dla kadego rekordu sprawdzany jest znacznik has_image_file. Jeeli jest on ustawiony, generowana i
wykorzystywana jest standardowa nazwa pliku, natomiast w przeciwnym wypadku wywietlany jest domylny
rysunek.
Na rysunkach 15.6., 15.7., i 15.8. pokazane s odpowiednio: lista dla pojedynczej kategorii, lista
alfabetyczna oraz lista wynikw wyszukiwania. Szukan fraz byo pol.
Rozdzia 15 Witryny oparte o baz danych
202

Rysunek
15.6.
Lista
dla
kategori
i
(katego
ria
ubrania
)

Rysunek
15.7.
Alfabetycz
na lista
produktw

PHP Kompendium wiedzy
203

Rysunek
15.8. Lista
wynikw
wyszukiwa
nia
(szukanie
pol)
W sekcji tej skupilimy si na wywietlaniu danych w witrynie WWW. Zwykle wywietlanie danych z
bazy danych jest duo atwiejsze od manipulowania danymi, poniewa wystpuje tu mniej problemw i mniej
moliwoci wystpienia bdu. Nastpne dwa rozdziay s zbudowane w oparciu o dane i przykady tu
zaprezentowane.
Podsumowanie
Tworzenie aplikacji WWW korzystajcych z bazy danych wymaga dokadnego projektowania i
programowania, ale wynik jest wart zachodu. Po stworzeniu systemu administracyjnego aplikacja moe by w
uaktualniania dowolnym momencie i z dowolnego miejsca wiata, co skutkuje powstaniem dynamicznej witryny
WWW, ktra jest bardzo atwa do zarzdzania. Najwaniejszym krokiem jest dokadne zaprojektowanie bazy
danych, oraz zlokalizowanie wszystkich regu biznesowych. Jeeli te elementy zostan odpowiednio
zaprojektowane i zaprojektowane, konserwacja i utrzymanie aplikacji zostanie niezwykle uproszczone.
Rozdzia 15 Witryny oparte o baz danych
204
Rozdzia 16. Generowanie statycznych
stron HTML w oparciu o dynamiczne
dane
Wstp
Podstawowym zastosowaniem PHP jest tworzenie stron WWW z dynamicznie zmieniajc si zawartoci. Zawartoci t moe by
najprostszy licznik odwiedzin, a do personalizowanych stron korzystajcych z bazy danych. W niektrych jednak przypadkach w peni
dynamiczna zawarto strony nie jest konieczna lub zbytnio obnia wydajno witryny. We wielu przypadkach zawarto witryn nie jest
w peni dynamiczna.
Dla przykadu, katalog produktw z poprzedniego rozdziau jest dynamiczny jedynie w tym sensie, e mona zmienia produkty, ale
kady uytkownik powinien zobaczy te same produkty i kategorie. W takich sytuacjach bardziej efektywne jest jednokrotne
generowanie statycznych stron HTML (po zmianie danych rdowych) i ich wywietlanie w odpowiedzi na dania uytkownikw. Na
szczcie, przy pomocy PHP mona z atwoci wygenerowa takie strony, wic nie bd potrzebne adne dodatkowe narzdzia do
zamiany dynamicznej witryny na czciowo dynamiczn.
Koncepcja
Jednym z pomysw na stworzenie statycznych stron jest wysyanie kodu HTML do pliku zamiast do przegldarki. Mona to atwo
zrealizowa korzystajc ze standardowych funkcji obsugi plikw w PHP. Metoda ta wymaga jednak przepisania kadej ze stron tak, aby
cay kod HTML by wczony w kod PHP. Dla wikszoci witryn jest to niepraktyczne. Istnieje lepsza metoda, dziaajca z wszystkimi
istniejcymi skryptami i stronami, wymagajca wprowadzenia jedynie minimalnych zmian. Pomys ten zosta opisany w czci
Generowanie stron statycznych.
Innym sposobem na poprawianie wydajnoci serwera jest buforowanie stron, co powoduje, e skrypt nie uruchamia si przy kadym
wywoaniu. Ten sposb opisany jest w czci pod tytuem Techniki buforowania.
Generowanie stron statycznych
Poniewa PHP jest niezwykle elastyczny, istniej co najmniej dwa sposoby generowania statycznych stron z istniejcych skryptw PHP,
przy minimalnej iloci zmian. Pierwszym sposobem jest wykorzystanie funkcji buforujcych, drugim jest wykorzystanie klasy
FastTemplate opisanej w poprzednich rozdziaach.
Uycie buforowania
Jeeli rozmiar witryny nie jest zbyt duy, mona zastosowa funkcje PHP pozwalajce kontrolowa mechanizm buforowania do
przechwycenia wynikowego kodu HTML i zapisania go do pliku. Skrypt z wydruku 16.1. Jest logicznie identyczny ze skryptem z
wydruku7 z rozdziau 6. Wsppraca z bazami danych. Skrypt ten generuje kod strony na ktrej mona wybra stan USA oraz kraj.
Listy te s pobierane z bazy danych. Jest to dobry kandydat do stworzenia strony statycznej, poniewa lista stanw USA oraz krajw nie
zmienia si czsto. Jeeli trzeba poprawi wydajno aplikacji, mona zrezygnowa z pobierania tych elementw z bazy danych za
kadym razem, gdy uytkownik zada tej strony. Dziaanie takie ma jednak sens jedynie wtedy, gdy po zmianie wartoci w bazie
danych trzeba powtrnie wygenerowa stron.
Wydruk 16.1. Wykorzystanie buforowania do tworzenia statycznych stron HTML z PHP
<?php
ob_start();
include ( "db_mysql.php" );
class MySQLDBTest extends DB_Sql

Rozdzia 16. Generowanie statycznych stron HTML w oparciu o dynamiczne dane
206
{
var $Host = "localhost";
var $Database = "mydb";
var $User = "root";
var $Password = "root";
}
function GetGenOpts( $aTableName, $aCurSel = "" )
{
$aResult = "";
$aDB = new MySQLDBTest;
$aSQL = "select ID, Name from $aTableName order by Name";
$aDB->query( $aSQL );
while( $aDB->next_record() )
{
$aName = $aDB->f( "Name" );
$aID = $aDB->f( "ID" );
if ( $aID == $aCurSel )
{
$aResult .= "<option value=\"$aID\" selected>$aName</option>";
}
else
{
$aResult .= "<option value=\"$aID\">$aName</option>";
}
}
return $aResult;
}

?>
<html>
<head>
<title>Formularz wyboru krajw i stanw USA</title>
</head>
<body>
<form action="some_place.phtml" method="post">
<table>
<tr>
<td>
Wybierz stan USA:
</td>
<td>
<select name="us_state" size="1">
<?php
print( GetGenOpts( "us_states", "ID" ) );
?>
</select>
</td>
</tr>
<tr>
<td>
Wybierz kraj:
</td>
<td>
<select name="world_country" size="1">
<?php
print( GetGenOpts( "world_countries", "ZA" ) );
?>
</select>
</td>
</tr>
</form>
</body>
</html>
<?php
$aFileName = ereg_replace( 'phtml', 'html', $PATH_TRANSLATED );
$aFile = fopen( $aFileName, "w" );
fwrite( $aFile, ob_get_contents() );
fclose( $aFile );
ob_end_clean();
print( "Plik <i>$aFileName</i> utworzony<br>" );
?>
Pierwsz czynnoci wykonywan przez skrypt jest uaktywnienie buforowania przy pomocy wywoania funkcji ob_start(). Po
uaktywnieniu buforowania, dane nie s przesyane do przegldarki a tylko s zbierane w wewntrznym buforze. Na kocu skryptu
generowana jest nowa nazwa pliku i zamieniane jest rozszerzenie pliku z phtml na html. Po utworzeniu pliku bufor jest czyszczony, a do
przegldarki wysyany jest komunikat informacyjny. Do nowego pliku mona sign za pomoc przegldarki zmieniajc rozszerzenie
danego pliku z phtml na html.

Metoda ta dziaa wietnie dla wielu typw stron. W praktyce skrypty generujce strony powinny by umieszczone w obszarze serwera
WWW chronionym hasem i jedynie niektrzy uytkownicy powinni mie do nich dostp. Moliwe jest rwnie stworzenie stron za
pomoc ktrych mona zarzdza danymi dynamicznymi i za pomoc takiego interfejsu WWW generowa statyczne strony.
Uycie FastTemplate
W ostatnim rozdziale tematem przykadw by katalog produktw. Jest to kolejny przykad witryny, gdzie aktualne dane strony nie
zmieniaj si zbyt czsto. Kategorie i produkty oferowane przez firm mog zmienia si raz w miesicu lub raz w tygodniu. Katalog
jednak moe by przegldany codziennie i zawsze musi zawiera aktualne dane. Klasa FastTemplate bya uywana w poprzednim
rozdziale do stworzenia witryny katalogu. W tym rozdziale zostan omwione zmiany, jakie naley wprowadzi do skryptw tak, aby
bya moliwo tworzenia stron statycznych.
Po pierwsze, musi zosta zdefiniowana struktura katalogu. Dla stron kategorii kada ze stron jest nazywana korzystajc z szablonu
mgmt_cat_{$aCatID}.html. Na wydruku 16.2 znajduje si skrypt, ktry tworzy list kategorii produktw dla wszystkich kategorii. Jest
on podobny do skryptu z wydruku 16.15. z rozdziau 15. Witryny oparte o baz danych. W tym przypadku tworzy on list wszystkich
kategorii i zapisuje kolejne strony do osobnych plikw, wedug wspomnianego szablonu nazw.
Wydruk 16.2. Wykorzystanie klasy FastTemplate do tworzenia statycznych stron HTML z PHP
<?php
error_reporting( E_ALL & ~E_NOTICE );
session_start(); // Niejawnie ustawia zmienn sesji $aMerchantID
if ( empty( $aMerchantID ) == True )
{
print( "Bd wewntrzny. Brak identyfikatora sprzedawcy." );
exit;
}

include( "class.FastTemplate.php" );
include( "./mgmt_db.php" );
include( "./mgmt_funcs.php" );

$aTPL = new FastTemplate( "." );
$aDB = new mgmt_db();
$aCatDB = new mgmt_db();
$aTPL->define( array( "base" => "mgmt_app_base.tpl",
"body" => "mgmt_body.tpl",
"footer" => "mgmt_footer.tpl",
"page_body" => "mgmt_prod_main.tpl",
"prod_item" => "mgmt_prod_item.tpl" ) );
$aSQL = "select category_id from mcCategories";
$aCatDB->query( $aSQL );
while( $aCatDB->next_record() )
{
$cat_id = $aCatDB->f( "category_id" );
//print( "$cat_id<br>" );
$aSQL = "select a.category_id, a.product_id, a.name, a.external_id, ";
$aSQL .= "a.price, a.ship_weight, a.has_image_file, a.descr, b.name as ";
$aSQL .= "cat_name from mcProducts a, mcCategories b where ";
$aSQL .= "(a.merchant_id = $aMerchantID) and (a.category_id = b.category_id)";
$aSQL .= "and ( a.category_id = $cat_id ) order by a.name";
$aDB->query( $aSQL );
if ( $aDB->num_rows() > 0 )
{
while ( $aDB->next_record() )
{
$aProdName = $aDB->f( "name" );
$aProdEID = $aDB->f( "external_id" );
$aProdPrice = $aDB->f( "price" );
$aProdWeight = $aDB->f( "ship_weight" );
$aHasImage = $aDB->f( "has_image_file" );
$aProdDescr = $aDB->f( "descr" );
$aCatName = $aDB->f( "cat_name" );
$aCatID = $aDB->f( "category_id" );
$aProdID = $aDB->f( "product_id" );
$aImageFile = "images/default.jpg";
if ( $aHasImage == True )
{
$aImageFile = "images/{$aMerchID}_{$aCatID}_{$aProdID}.jpg";
}

$aTPL->assign( array( "PROD_NAME" => $aProdName,
"CAT_NAME" => $aCatName,
"PROD_EID" => $aProdEID,
"PROD_PRICE" => '$' . number_format( $aProdPrice, 2 ),
"PROD_DESCR" => $aProdDescr,
"IMAGE_FILE" => $aImageFile
PHP Kompendium wiedzy
207

Rozdzia 16. Generowanie statycznych stron HTML w oparciu o dynamiczne dane
208
) );
$aTPL->parse( "ITEM_LIST", ".prod_item" );
}
}
else
{
$aTPL->assign( array( "ITEM_LIST" => "Brak produktw dla kategorii <i>$aCatName</i>." ) );
}

$aTPL->assign( array( "TITLE" => "Zarzdzanie
katalogiem towarw: Kategoria $aCatName",
"MERCHANT_NAME" => GetMerchantName( $aDB, $aMerchantID )
) );

$aTPL->parse( "PAGE_BODY", "page_body" );
$aTPL->parse( "FOOTER", "footer" );
$aTPL->parse( "BODY", "body" );
$aTPL->parse( "PAGE", "base" );
$aFileName = "mgmt_cat_{$aCatID}.html";
$aFile = fopen( $aFileName, "w" );
fwrite( $aFile, $aTPL->fetch( "PAGE" ) );
fclose( $aFile );
print("Kategoria, <i>$aCatName</i>, zapisana do pliku: <b>$aFileName</b><br>");
$aTPL->Clear();
}
?>
W skrypcie tym zakadamy, e w zmiennej sesji przekazany zosta identyfikator sprzedawcy. Podczas wykonywania swoich zada klasa
FastTemplate zapisuje ca zawarto strony w wewntrznych buforach. Aby zapisa te dane w dowolnej zmiennej mona skorzysta z
metody fetch(). W poprzednim przykadzie metoda fetch() jest wykorzystywana do pobrania wartoci zmiennej FastTemplate
PAGE, ktra reprezentuje ca stron HTML. Warto ta jest zapisywana do pliku wyjciowego, a do przegldarki wysyany jest
komunikat potwierdzajcy prawidowe wykonanie operacji. Metoda Clear() powoduje skasowanie wszystkich buforw i zmiennych
FastTemplate, co umoliwia wykonanie nastpnego przebiegu ptli.
W poprzednim rozdziale przytoczona zostaa specyficzna funkcja, GetCategoryHREF(), ktra bya uywana w aplikacji zarzdzajcej
katalogiem. Jest ona zamieszczona ponownie na wydruku 16.3. Jest ona uywana do tworzenia cza do strony zadanej kategorii. W
trybie domylnym zwraca ona adres strony dynamicznej, ale gdy znacznik $aDynamic zostanie ustawiony na False, zwrci adres
strony statycznej.
Wydruk 16.3. Funkcja GetCategoryHREF()
function GetCategoryHREF( $aCatID, $aDynamic = True )
{
if ( $aDynamic == True )
{
return "mgmt_prod_list.phtml?cat_id=$aCatID";
}
else
{
return "mgmt_cat_{$aCatID}.html";
}
}
Stosujc t metod, w trakcie edycji danych mona przeglda strony dynamiczne a pniej generowa zbir stron statycznych.
Dla wielu typw witryn generowanie statycznych stron z danych dynamicznych jest stosunkowo praktyczne i powoduje wzrost
wydajnoci serwera. Jeeli dane wykorzystywane w aplikacji nie zmieniaj si zbyt czsto, powinno si rozway generowanie
statycznych stron. W przypadku mocno obcionych witryn wzrost wydajnoci moe z atwoci przeway dodatkowe komplikacje
zwizane z tworzeniem skryptw generujcych strony. Do generowania stron w regularnych odstpach czasu mona wykorzysta
odpowiednie oprogramowanie systemowe, na przykad cron.
Techniki buforowania
Generowanie stron statycznych jest efektywne w przypadku wielu rodzajw witryn, ale aby byo efektywne, wymaga dokadnego
projektowania i programowania. W przypadku wielu aplikacji wystarczajca powinna by porednia technika buforowania stron.
Koncepcyjnie buforowanie jest bardzo podobne do generowania stron statycznych i nadal wymaga ingerencji w tekst kadego ze
skryptw. Gdy uytkownik wysya danie pobrania skryptu, na pocztku sprawdzane jest czy istnieje aktualna strona w buforze. Jeeli
tak, zawarto tej strony jest wysyana do przegldarki. Jeeli nie ma tej strony, jest ona generowana, umieszczana w buforze do
wykorzystania przez kolejne wywoanie.
To czy strona jest aktualna, zaley od typu strony. Na przykad w witrynie moe istnie strona powitalna z biec dat. Jeeli na tej
stronie nie ma wicej elementw dynamicznych, musi by ona generowana raz w cigu dnia i jest aktualna przez 24 godziny. Inn stron
moe by strona z wiadomociami uaktualnianymi co godzin. W tym przypadku strona jest aktualna przez godzin.

Implementacja stron buforowanych jest bardzo prosta. Mona do tego celu wykorzysta buforowanie wyjcia lub szablony. Na
wydrukach 4. i 5. zamieszczony jest przykad z zastosowaniem buforowania wyjcia. Na wydruku 16.4. znajduj si funkcje realizujce
buforowanie, wic mog zosta atwo doczone do kadej strony. Wydruk 16.5. zawiera gwn stron, ktra wywietla biece dane o
pogodzie wykorzystujc skrypt o nazwie MWeather. Skrypt ten jest dostpny na stronie http://sourceforge.net/prjects/mweather/.
Wydruk 16.4. Funkcje buforujce (cache.php)
<?php
function GetCacheFileName( $aFileName )
{
return $aFileName . ".cache";
}

function DumpCacheFile( $aFileName, $aExpire = 3600 )
{
$aCacheFile = GetCacheFileName( $aFileName );
if ( is_file( $aCacheFile ) == True )
{
$aModTime = filemtime( $aCacheFile );
$aCurTime = time();

if ( ( $aCurTime - $aModTime ) > $aExpire )
{
return False;
}
else
{
readfile( $aCacheFile );
return True;
}
}
}

function SaveCacheFile( $aFileName, $aContents )
{
$aCacheFile = GetCacheFileName( $aFileName );
$aFile = fopen( $aCacheFile, "w" );
fwrite( $aFile, $aContents );
fclose( $aFile );
}
?>
Wydruk 16.5. Wykorzystanie funkcji buforujcych
<?php
error_reporting( E_ALL & ~E_NOTICE );
include( "./cache.php" );
if ( $aResult = DumpCacheFile( $PATH_TRANSLATED, 60 * 60 ) )
{
// aktualny plik w buforze, koniec skryptu
exit;
}
ob_start();

// dane strony
$aOldIncludePath = ini_get( 'include_path' );
ini_set( 'include_path', $aOldIncludePath . ":./mweather" );
include( "mweather.php" );
ini_restore( 'include_path' );

SaveCacheFile( $PATH_TRANSLATED, ob_get_contents() );
?>
Skrypt z wydruku 16.5. korzysta z funkcji buforujcych umieszczonych na wydruku 16.4. w celu
zrealizowania cogodzinnego buforowania strony z prognoz pogody. Funkcja DumpCacheFile() realizuje kilka
wanych operacji. Po pierwsze, sprawdzana jest data ostatniej modyfikacji pliku w buforze i jest ona
porwnywana z biec dat. Jeeli rnica pomidzy tymi datami jest wiksza od wartoci expire, funkcja
zwraca False. Jeeli tak nie jest, funkcja odczytuje plik z bufora, wywietla go i zwraca warto True. Po
powrocie do skryptu sprawdzana jest zwracana warto. Jeeli jest ona True, gwny skrypt si koczy, poniewa
plik z bufora jest aktualny i zosta on ju wysany do przegldarki. Jeeli warto ta wynosi False, skrypt jest
wykonywany i za pomoc funkcji buforowania wydruku jego wynik jest zapamitywany. Na kocu skryptu
wywoywana jest funkcja SaveCacheFile(), ktra zapisuje zawarto strony.
W przykadzie tym strona jest generowana przez doczany skrypt mweather.php. Jedynym zadaniem
gwnego skryptu jest modyfikacja zmiennej PHP include_path. Jest to wymagane przez skrypt MWeather i nie
ma nic wsplnego z buforowaniem.
PHP Kompendium wiedzy
209

Rozdzia 16. Generowanie statycznych stron HTML w oparciu o dynamiczne dane
210
Plik cache.php moe by uywany z dowolnym skryptem PHP, w ktrym naley zrealizowa funkcje
buforowania na danie. Bardzo wane jest jednak, aby zdawa sobie spraw, jakie skrypty mog dziaa z tym
typem buforowania. Metoda ta sprawdza si jedynie dla stron, ktre nie s wynikiem da HTTP GET lub POST.
Inaczej mwic, buforowanie jest niepraktyczne w przypadku stron zalenych od wartoci wprowadzonych przez
uytkownika. Poprzedni przykad pokazuje pogod w Rexburg w stanie Idaho, niezalenie kto oglda stron.
Jeeli skrypt wywietlaby pogod w miejscu okrelonym przez uytkownika, buforowanie nie moe by ju
zastosowane. Wyobramy sobie, e strona zostaa by umieszczona w buforze przez uytkownika z Londynu, a
kolejne wywoanie pochodzio by z Cape Town. Otrzymana strona bya by oczywicie nieprawidowa dla
uytkownika z Cape Town.
Przedstawiony typ buforowania jest uyteczny, ale nie moe by uywany dla wszystkich przypadkw.
Jeeli aplikacja zawiera strony z informacjami zmieniajcymi si co okrelony odcinek czasu i niezalene od
danych uytkownika, ten typ buforowania jest bardzo uyteczny i wyranie poprawia wydajno witryny. W
przedstawionym przykadzie do pobrania danych o aktualnej pogodzie potrzebny jest czas okoo dwch sekund.
Po zbuforowaniu, strona pojawia si natychmiast.
Podsumowanie
Mimo, e PHP jest najczciej uywany do dynamicznego tworzenia stron WWW, wane jest, aby
odnale sytuacje, gdy nie s potrzebne w peni dynamiczne strony. Generujc statyczne strony lub buforujc je,
mona wyranie poprawi wydajno witryny. Projektanci witryny powinni w ten sposb zrwnoway szybko
adowania si statycznych stron z elastycznoci stron dynamicznych, aby aplikacja miaa dostateczn szybko i
bya uyteczna dla uytkownikw.
Rozdzia 17. Witryny handlu
elektronicznego
Wstp
Handel elektroniczny jest dla wikszoci firm najwaniejszym zadaniem, jakie ma spenia firmowa
witryna WWW. Z tego powodu niezmiernie wane jest poznanie sposobu zrealizowania za pomoc PHP
wszystkich aspektw tworzenia aplikacji handlu elektronicznego. Dua cz tego rozdziau jest powicona
koncepcjom i zaoeniom projektowania tego typu aplikacji. Samo programowanie i korzystanie z istniejcych
narzdzi przeznaczonych dla e-handlu jest trywialne. Prawdziwym wyzwaniem jest stworzenie bezpiecznej,
stabilnej i skalowalnej aplikacji handlu elektronicznego.
Bezpieczestwo
Pierwszorzdn kwesti przy tworzeniu aplikacji przeznaczonych do handlu elektronicznego jest
zagadnienie bezpieczestwa. Ju w czasie projektowania aplikacji naley mie na uwadze ochron danych o
klientach. Naley wykona kilka krokw w celu zapewnienia moliwie najwyszego poziomu bezpieczestwa.
Nie naley tego traktowa jako propozycji, s to zazwyczaj wymagania wikszoci centrw rozliczajcych karty
kredytowe.
Zastosowanie SSL
Pierwszym krokiem powinno by wyodrbnienie fragmentw witryny, ktre wymagaj zastosowania
bezpiecznego poczenia za pomoc mechanizmu secure socket layer (SSL). Wikszo aplikacji posiada dwa
obszary dziaania. Pierwszy jest obszarem zawierajcym opisy dostpnych produktw i usug oferowanych na
witrynie. W czci tej zawieraj si zwykle strony zawierajce dane o firmie, regulaminy i inne dane nie zwizane
bezporednio z handlem. Drugi fragment zawiera aplikacj handlow. W czci tej zbierane s prywatne dane,
takie jak dane niezbdne do identyfikacji klienta lub numery kart kredytowych. Wikszo tego rozdziau jest
powicona temu wanie fragmentowi witryny.
Uycie PHP z SSL nie rni si niczym do uywania PHP na serwerze nie obsugujcym SSL. Istnieje
kilka dostpnych bezpiecznych serwerw WWW. Jednym z nich jest Stronghold
(http://www.c2.net/products/sh3/). W dystrybucji RedHat (http://www.redhat.com/) istnieje rwnie serwer
zawierajcy OpenSSL. Mona go uy do skompilowania bezpiecznego serwera Apache. Po zainstalowaniu
bezpiecznego serwera WWW opartego o Apache, mona uy jednej z metod opisanych w rozdziale 1.
Kompilacja i instalowanie PHP w celu dodania PHP w postaci wspdzielonego moduu. Mona rwnie
przekompilowa bezpieczny serwer Apache ze statycznie doczonym moduem PHP.
Certyfikaty
Kolejnym krokiem wymaganym do stworzenia bezpiecznej aplikacji jest zainstalowanie certyfikatu
bezpieczestwa. Certyfikat to plik na serwerze, ktry jest przesyany do przegldarki razem ze stronami WWW.
Certyfikaty s wystawiane przez kilka firm, ktre s rozpoznawane przez wikszo nowoczesnych przegldarek
jako bezpieczne. Jedn z takich firm jest Thawte Consulting (http://www.thawte.com/). Witryna firmy Thawte

Rozdzia 17. Witryny handlu elektronicznego
212
zawiera wszystkie dane niezbdne do wyprbowania i wykupienia certyfikatu bezpieczestwa. Aby otrzyma
certyfikat naley dostarczy kilka dokumentw:
1. Dokument potwierdzajcy istnienie firmy, na przykad akt zaoycielski spki.
2. Dokument potwierdzajcy prawo do nazwy domeny.
Jeeli nazwa widniejca na dokumentach przedstawionych w punkcie 1. zgadza si z danymi uzyskanymi
przez zapytanie whois do domeny dla ktrej instalowany jest certyfikat, nie trzeba dostarcza dokumentw
wymienionych w punkcie 2.
Z witryny firmy Thawte mona pobra i zainstalowa certyfikat testowy. Jeeli wykorzystujemy taki
certyfikat przegldarka generuje ostrzeenia, ale mona przetestowa aplikacj bez koniecznoci kupienia
certyfikatu.
Jeeli uywanym serwerem jest Apache, aby zacz on korzysta z certyfikatu naley zainstalowa
certyfikat i zmodyfikowa plik httpd.conf. Na wydruku 17.1. pokazana jest przykadowa konfiguracja wirtualnego
systemu hostingowego.
Wydruk 17.1. Plik httpd.conf z dyrektywami dotyczcymi certyfikatw
SSLCertificateFile /apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /apache/conf/ssl.key/server.key
NameVirtualHost 19.129.1.1:443
<VirtualHost 129.129.1.1:443>
SSLEnable
ServerAdmin webmaster@server.com
DocumentRoot /home/server/secure
ServerName secure.server.com
DirectoryIndex index.phtml index.html
</VirtualHost>
Na witrynie firmy Thawte dostpne s wszystkie informacje potrzebne do wygenerowania i
zainstalowania certyfikatu. Jeeli potrzebne jest wicej informacji na temat instalowania certyfikatu w
konkretnym serwerze WWW, naley ich szuka w dokumentacji serwera. Jeeli korzystasz z dystrybucji RedHat,
to informacje te s bardzo jasno napisane i atwe do odszukania.
Bezpieczestwo bazy danych
Jednym z odkry jakie zawdziczamy ostatnio internetowym zodziejom numerw kart kredytowych jest
to, e we wielu przypadkach witryny przechowuj dane w niezaszyfrowanej bazie danych dostpnej bezporednio
z Internetu. Nawet witryny uywajce kodowania SSL do zbierania danych, przechowuj dane prywatne w mao
bezpieczny sposb. Ostatnio jednak, niektre umowy pomidzy sprzedawcami a centrami rozliczeniowymi
zawieraj klauzul o przechowywaniu danych w postaci zaszyfrowanej, umieszczeniu bazy danych za firewallem,
albo o zastosowaniu obu tych rozwiza. Zaczyna by to powszechnie stosowan praktyk. Aplikacja powinna
kodowa zarwno transmisj jak rwnie przechowywane dane prywatne.
Wiele nowoczesnych systemw baz danych zawiera funkcje szyfrujce dane. Na przykad SZBD MySQL
zawiera funkcje ENCODE() oraz DECODE() jako integraln cz jzyka. Funkcje te nie s jednak wystarczajco
dobre do szyfrowania krytycznych danych. Uycie tych lub podobnych funkcji poprawia jednak poziom ochrony
przechowywanych danych. Ostatecznie to ty i twoja firma jestecie odpowiedzialni za dziury w systemie
bezpieczestwa, ktre spowoduj ujawnienie krytycznych danych.
Przetwarzanie patnoci
Po skompilowaniu i przetestowaniu bezpiecznego serwera WWW naley wybra metod obsugi
patnoci. PHP zawiera wasne interfejsy do kilku systemw przetwarzania patnoci, np.: CyberCash, VeriSign i
CCVS. Na rysunku 17.1. przedstawiony zosta obieg informacji pomidzy uytkownikiem, bezpiecznym
serwerem WWW i narzdziami obsugi patnoci.

Rysunek 17.1.
Zalenoci w
aplikacji handlu
elektronicznego
Na rysunku 17.1. zostay pokazane cztery podstawowe jednostki biorce udzia w obsudze patnoci:
uytkownik, serwer, system przetwarzania i instytucja finansowa. Klient i serwer komunikuj si ze sob za
pomoc protokou SSL, ktry zapewnia dwukierunkow szyfrowan transmisj. Serwer komunikuje si z
systemem obsugi patnoci za pomoc protokou narzuconego przez system. Sam system przetwarzania
komunikuje si z instytucj finansow w celu sprawdzenia czy moe przyj patno za pomoc karty
kredytowej (lub innej metody patnoci). Jeeli korzystamy z systemu CCVS moliwe jest ominicie systemu
przetwarzania i bezporednia komunikacja z finansowym centrum rozliczeniowym.
Jednym z powodw wyboru systemu obsugi patnoci CyberCash jest to, e protok komunikacyjny
uywany do przesyania informacji pomidzy serwerem a systemem obsugi transakcji, jest wbudowany w
interfejs programistyczny do CyberCash. Inne systemy transakcji wymagaj uycia przez aplikacj bezpiecznych
gniazd, w celu zrealizowania komunikacji z nimi. Naley pamita, e mimo uycia bezpiecznego serwera
wykorzystujcego protok SSL, sam PHP nie posiada implementacji SSL. Inaczej mwic, jeeli skrypt otworzy
port, to nie zostanie automatycznie uyty protok SSL, pomimo e serwer WWW uywa SSL. Dopki PHP nie
bdzie posiada bezporedniej obsugi gniazd SSL, wykorzystanie niektrych moliwoci systemw
transakcyjnych nie bdzie moliwe. CyberCash uywa do zapewnienia bezpiecznej transmisji pomidzy
serwerem WWW a centrum przetwarzania, wasnego algorytmu Triple DES (potrjny DES). W pozostaej czci
rozdziau bdziemy wykorzystywa CyberCash jako system przetwarzania patnoci.
CyberCash (http://www.cybercash.com/) jest firm oferujc interfejsy programistyczne (API) dla C i C++
oraz Javy. Wersja API dla C i C++ moe zosta wbudowana w PHP za pomoc opcji konfiguracji --with-
cybercash. Najpierw naley cign z witryny CyberCash pakiet Merchant Connection Kit (MCK). Oprcz tego
naley upewni si, e twoje konto sprzedawcy moe by uywane w systemie CyberCash. Jeeli nie masz
jeszcze konta sprzedawcy, naley je zarejestrowa u jednego z partnerw firmy CyberCash. Proces ten wymaga
podania wielu szczegowych informacji finansowych, ale moe by przeprowadzony w cigu 24 godzin. Gwne
kroki wymagane do zainstalowania MCK s nastpujce:
1. Nawizanie wsppracy z przedstawicielem finansowym firmy CyberCash (konto sprzedawcy).
2. Zarejestrowanie si na witrynie http://amps.cybercash.com/ jako sprzedawca CyberCash.
3. cignicie MCK.
4. Dekompresja i zainstalowanie MCK.
5. Kompilacja PHP z obsug CyberCash (--with-cybercash).
Na witrynie WWW firmy CyberCash znajduje si dokadny opis instalacji MCK. Pakiet ten moe by
zainstalowany na systemach Unix lub pod Windows. Procedura instalacji dla systemw Unix jest bardzo prosta.
Podstawowe kroki s nastpujce:
1. Dekompresja instalatora: uncompress install-mck-3.2.0.6-<system_operacyjny>.Z.
PHP Kompendium wiedzy
213

Rozdzia 17. Witryny handlu elektronicznego
214
2. Zmiana uprawnie do pliku instalatora w taki sposb, aby mona byo go uruchomi: chmod +x install-
mck-3.2.0.6-<system_operacyjny>.
3. Uruchomienie programu instalacyjnego: ./install-mck-3.2.0.6-<system_operacyjny>.
4. Uruchomienie programu konfiguracyjnego: ./configure.
W punktach 3. i 4. zostan zadane pytania na temat firmy, sklepu sieciowego i innych informacji tego
typu. Po wykonaniu tych krokw mona przekompilowa PHP podajc opcj konfiguracji --with-
cybercash=/cieka/do/MCK. Naley poda pen ciek do katalogu gdzie zosta zainstalowany MCK. Po
utworzeniu PHP z obsug CyberCash mona przeprowadzi testowe transakcje.
Jedn z miych cech uycie MCK wraz z PHP jest moliwo opuszczenia wikszoci opcji konfiguracji
(jak sugeruje to podrcznik). Uycie PHP do komunikacji z CyberCash jest bardzo proste i wymaga jedynie
doczenia jednego skryptu. Skrypt pokazujacy sposb uycia CyberCash znajduje si w dystrybucji PHP
zawierajcej peny kod rdowy w katalogu <php>/ext/cybercash. Na wydruku 17.2. zamieszczony jest ten
wanie skrypt testowy.
Wydruk 17.2. Test.php (skrypt testowy CyberCash)
<?php
require "cyberlib.php";

$merchant=""; /* Tutaj naley umieci idnetyfikator sprzedawcy. */
$merchant_key=""; /* Tutaj naley umieci klucz sprzedawcy. */
$payment_url="http://cr.cybercash.com/cgi-bin/";
$auth_type="mauthonly";

$response=SendCC2_1Server($merchant,$merchant_key,$payment_url,
$auth_type,array("Order-ID" => "2342322",
"Amount" => "usd 11.50",
"Card-Number" => "4111111111111111",
"Card-Address" => "1600 Pennsylvania Avenue",
"Card-City" => "Washington",
"Card-State" => "DC",
"Card-Zip" => "20500",
"Card-Country" => "USA",
"Card-Exp" => "12/99",
"Card-Name" => "Bill Clinton"));

while(list($key,$val)=each($response))
{
echo $key."=".$val."<br>";
}

?>
Jak wida przetwarzanie patnoci przy pomocy PHP i CyberCash jest bardzo proste. Zmienne $merchant
oraz $merchant_key musz zawiera identyfikator sprzedawcy oraz jego klucz nadany przez CyberCash.
Nastpnie po ustawieniu w tablicy asocjacyjnej danych wymaganych przez CyberCash patno jest
przekazywana do obsugi przy pomocy wywoania funkcji SendCC2_1Server() zdefiniowanej w doczonym pliku
cyberlib.php. Nie potrzeba nawet wywoywa adnej z funkcji cybercash_xxx() dostpnych w PHP. Funkcja
SendCC2_1Server() hermetyzuje w sobie wszystkie niezbdne funkcje, jak rwnie obsuguje komunikacj za
pomoc gniazd z serwerem CyberCash.
Dane niezbdne do dziaania z Cyberash s przekazywane za pomoc tablicy asocjacyjnej bdcej
ostatnim parametrem funkcji SendCC2_1Server(). Zawarto tej tablicy jest okrelana przez warto zmiennej
$auth_type. Zmienna ta okrela rodzaj wykonywanej operacji lub typ komunikatu przesyanego do CyberCash.
Komunikaty obsugiwane przez CyberCash zawarte s w tablicy 17.1.
Tabela 17.1. Komunikaty dostpne w CyberCash oraz zadania przez nie realizowane
Komunikat Realizowane zadanie
batch-commit
Potwierdza transakcje zebrane w grup.
batch-prep
Powoduje wysanie transakcji oznaczonych jako
gotowe do przetworzenia w postaci grupy.
batch-query
Pytanie o grup.
batch-retry
Ponawia prb przetworzenia oczekujcej grupy.
batch-unroll
Zapytanie o transakcj wysan w postaci grupy.
card-query
Odczytuje dane karty kredytowej dla podanego
zamwienia.
checkauth
Sprawdza i autoryzuje patno czekiem

zainicjowan przez sprzedawc. Komunikat ten jest
obsugiwany jedynie przez procesor Paymentech
(wykorzystujc opcj Electronic Check Payment ECP).
checkreturn
Zwraca pienidze na konto czekowe klienta.
mauthcapture
Autoryzuje i przechwytuje rozpoczt przez
sprzedawc transakcj za pomoc karty kredytowej. Jest
uywany jedynie dla gwnych procesorw
przechwytujcych.
mauthonly
Autoryzuje rozpoczt przez sprzedawc sprzeda za
pomoc karty kredytowej. Jest uywany dla kocowych
procesorw przechwytujcych.
postauth
Przechwytuje patno kart kredytow
autoryzowan za pomoc mauthonly lub checkauth.
query
Odpytuje baz transakcji.
retry
Ponawia oczekujc transakcj dla podanego
zamwienia.
return
Zwraca pienidze na kart kredytow klienta.
void
Uniewania transakcj.
merchant-check-
payment
Sprawdza i autoryzuje zainicjowan przez
sprzedawc patno w systemie PayNow.
check-query
Odszukuje w bazie danych PayNow danych na temat
okrelonych rachunkw.
check-update-status
Uaktualnia serwer rachunkw za pomoc zmian
przeprowadzonych w bramce.
check-query-order-
status
Sprawdza biecy status zamwie.
Dokumentacja CyberCash zawiera dokadny opis kadego z komunikatw oraz jego przeznaczenia. W
wikszoci przypadkw pierwszym obsugiwanym komunikatem (i czsto jedynym) jest komunikat mauthonly.
Jest on uywany do autoryzacji patnoci dokonywanej kart kredytow. W zalenoci od rodzaju sprzedawanego
produktu lub usugi, mona tak skonfigurowa CyberCash, aby automatycznie zaznacza i realizowa wszystkie
poprawnie autoryzowane transakcje.
W tabeli 17.2. zebrane s wszystkie pola uywane do obsugi komunikatu mauthonly. W tabeli zaznaczone
s wszystkie pola, ktre naley obowizkowo umieci w komunikacie.
Tabela 17.2. Pola komunikatu mauthonly i ich opis
Pole Opis Wy
magane
order-
id
Unikalny identyfikator transakcji.
amount
Kwota do autoryzacji (to znaczy kwota patnoci) w tej
transakcji. Naley uywa notacji waluta zote.grosze (na
przykad: usd 12.50).

card-
number
Numer karty kredytowej obcianej t transakcj.
card-
exp
Data wanoci karty kredytowej obcianej t
transakcj. Naley uy formatu mm/rr (na przykad: 02/01 dla
lutego 2001).

card-
name
Nazwa waciciela karty kredytowej.
card-
address
Adres zamieszkania waciciela karty kredytowej.
UWAGA: pole jest wymagane w przypadku kart AVS i
Discover.

card-
city
Miejscowo w ktrej mieszka waciciel karty.
UWAGA: pole jest wymagane w przypadku kart AVS i
Discover.

PHP Kompendium wiedzy
215

Rozdzia 17. Witryny handlu elektronicznego
216
card-
zip
Kod pocztowy miejscowoci, w ktrej mieszka
waciciel karty. Prawidowymi zapisami s 22091, 20191-
1448,, NW3 5RJ i 113 192. UWAGA: pole jest
wymagane w przypadku kart AVS i Discover.

card-
state
Stan w ktrym mieszka waciciel karty. UWAGA:
pole jest wymagane w przypadku kart AVS i Discover.

card-
country
Kraj w ktrym mieszka waciciel karty.
Funkcja SendCC2_1Server() zwraca wartoci rwnie w postaci tablicy asocjacyjnej, ktra zawiera dane
na temat transakcji przesane przez CyberCash. W tabeli 17.3. znajduj si pola znajdujce si w odpowiedzi na
komunikat mauthonly.
Tabela 17.3. Pola odpowiedzi na komunikat mauthonly i ich opis
Pole Opis
MStatus
Zwracany kod statusu wykonanej operacji Pole to zawsze istnieje.
Moe przyjmowa jedn z nastpujcych wartoci:
success transakcja udana.
success-duplicate wynik poprzedniej udanej transakcji.
partial success grupa zawiera nieudane transakcje.
failure-hard nieudana transakcja, jej powtrzenie nie uda si.
failure-q-or-cancel, failure-q-or-discard nieudane transakcje
z powodu problemw z transmisj, mog by powtrzone.
failure-swversion transakcja nieudana z powodu uycia starego
lub nieistniejcego (nieistniejcy numer wersji) oprogramowania.
failure-bad-money transakcja nieudana z powodu problemu z
obcieniem przez instytucj finansow.
MErrLoc
Miejsce wystpienia bdu w transakcji. Pole to pojawia si jedynie w
przypadku nieudanej transakcji (czyli MStatus jest rny od success).
Zwracane s nastpujce wartoci:
smps wystpi bd w CashRegister.
ccsp wystpi bd w bramce.
financial institution bd wystpi w instytucji finansowej
CCMckDirectLib3_2 bd wystpi w MCK
MErrMsg
Tekst komunikatu bdu zwracanego przez transakcj. Pole to
wystpuje jedynie w przypadku nieudanej transakcji.
MErrCod
e
Numer bdu odpowiadajcy komunikat bdu przekazanego w
MErrMsg.
merch-
txn
Numer uywany przez bramk do identyfikacji przeprowadzanej
transakcji. Pole to wystpuje zawsze.
order-
id
Identyfikator zamwienia do ktrego naley przetwarzana transakcja.
Pole to wystpuje zawsze.
cust-
txn
Numer transakcji uywany przez portfel CyberCash do identyfikacji
transakcji. Dla transakcji nie posiadajcych portfela jest on taki sam jak
merch-txn.
aux-msg
Komunikat bramki sprzedawcy zawierajcy dodatkowy opis z bramki
lub serwera patnoci.
MSWErrM
sg
Komunikat bdu przy uyciu nieaktualnej wersji portfela lub serwera
patnoci. Pole to nie zawsze wystpuje.
addnl-
response-data
Dodatkowe dane transakcji zwracane przez bramk. UWAGA: Jeeli
brak jest takich danych pole to jest puste.
Na wydruku 17.3. znajduje si przykad uycia CyberCash, pochodzcy z dziaajcej witryny. Przykad
ten zawiera obsug bdw oraz wysya informacje zwrotne do klienta. Elementy te nie byy zawarte w
przykadowym skrypcie z wydruku 17.2.

Wydruk 17.3. Uycie CyberCash
<?php
include "cyberlib.php"; // Funkcje obsugi CyberCash
include "dbclass.php"; // Klasa bazy danych dla tej aplikacji
include "class.FastTemplate.php"; // FastTemplate

// funkcja zamieniajca tablic asocjacyjn
// w jeden cig rozdzielany rednikami
function ArrayCrunch( $aArray )
{
$aResult = "";

foreach( $aArray as $aKey => $aValue )
{
$aResult .= "$aKey=$aValue;";
}

return $aResult;
}

$tpl = new FastTemplate( "." );

// pobranie identyfikatora pliku z zaszyfrowanego pola formularza
$aCustomerID = UnhideID( $ID );

$merchant = ""; /* tutaj identyfikator sprzedawcy. */
$merchant_key = ""; /* tutaj klucz sprzedawcy. */
$payment_url = "http://cr.cybercash.com/cgi-bin/";
$auth_type = "mauthonly";

$aDB = new dbAccess;
$aDB->Init();

// kontrola czy klient ten nie zapaci wczeniej
$aSQL = "select ISPAID from orders where ( ID = $aCustomerID )";
$aDB->SetSQL( $aSQL );
if ( $aDB->RecordCount() == 1 )
{
$aRow = $aDB->GetData( 0 );
$aIsPaid = $aRow["ISPAID"];
}
else
{
$aIsPaid = 0;
}

// Jeeli klient ju zapaci, poka informacj i zakocz skrypt
if ( $aIsPaid == 1 )
{
mail( "blake@intechra.net", "Ponowna prba patnoci ($aCustomerID)",
"Czy chcesz jeszcze raz zapaci??", "From: support@intechra.net\r\n" );

$tpl->define( array( base => "a_base.tpl",
footer => "c_footer.tpl",
body => "s_paid_already.tpl"
) );


$tpl->assign( array( TITLE => "Patno Intechra.Net",
URL => $aInternalURL,
THEDATE => date( "l, j F Y" ),
ORDERID => $aOrderID,
HIDDENID => $ID
) );

AddSiteVars( $tpl, $aHiddenID );

$tpl->parse( FOOTER, "footer" );
$tpl->parse( BODY, "body" );
$tpl->parse( PAGE, "base" );
$tpl->FastPrint( PAGE );
exit;
}

// pobierz nowy MCK_ID dla tego klienta
$aSQL = "select MAX( MCK_ID ) as MAX_ID from customers_to_mcks
where ( ID = $aCustomerID )";
$aDB->SetSQL( $aSQL );
if ( $aDB->RecordCount() == 1 )
{
PHP Kompendium wiedzy
217
$aRow = $aDB->GetData( 1 );

Rozdzia 17. Witryny handlu elektronicznego
218
$aMaxID = $aRow["MAX_ID"];
}
else
{
$aMaxID = 0;
}

$aCurID = $aMaxID + 1;
$aOrderID = "INT-" . date( "Ymd" ) . "-" . sprintf( "%06d", $aFamilyID ) .
"-" . sprintf( "%04d", $aCurID );

$aOrderDetails = array( "Order-ID" => $aOrderID,
"Amount" => "usd 39.00",
"Card-Number" => $CCNum,
"Card-Address" => $CCAddr,
"Card-City" => $CCCity,
"Card-State" => $CCState,
"Card-Zip" => $CCZip,
"Card-Exp" => $CCExpDate,
"Card-Name" => $CCName );

$response = SendCC2_1Server( $merchant, $merchant_key, $payment_url,
$auth_type, $aOrderDetails );

$aRawRequest = ArrayCrunch( $aOrderDetails );
$aRawResponse = ArrayCrunch( $response );

$aSQL = "insert into customers_to_mcks
values ( $aCustomerID, $aCurID, 0, NOW(), ENCODE( \"$aRawRequest\",
\"good_password\" ), ENCODE( \"$aRawResponse\",
\"good_password\" ) )";
$aDB->SetSQL( $aSQL );

if ( $response["MStatus"] == "success" )
{
mail( "blake@intechra.net",
"Patno dla Intechra.net zrealizowana ($aCustomerID)",
"Patno zakoczona sukcesem", "From: support@intechra.net\r\n" );

$aSQL = "update orders set ISPAID = 1 where ( ID = $aCustomerID )";
$aDB->SetSQL( $aSQL );

$tpl->define( array( base => "a_base.tpl",
footer => "c_footer.tpl",
body => "s_paid_ok.tpl"
) );


$tpl->assign( array( TITLE => "Patnoci Intechra.net",
URL => $aInternalURL,
THEDATE => date( "l, j F Y" ),
ORDERID => $aOrderID,
HIDDENID => $ID
) );

AddSiteVars( $tpl, $aHiddenID );

$tpl->parse( FOOTER, "footer" );
$tpl->parse( BODY, "body" );
$tpl->parse( PAGE, "base" );
$tpl->FastPrint( PAGE );
}
else
{
mail( "blake@intechra.net",
"Patno dla Intechra.net nieudana ($ ($aCustomerID)",
"Patno nieudana", "From: support@intechra.net\r\n" );

$tpl->define( array( base => "a_base.tpl",
footer => "c_footer.tpl",
body => "s_paid_fail.tpl"
) );

$tpl->assign( array( TITLE => "Patnoci Intechra.net",
HIDDENID => $ID
) );

$tpl->parse( FOOTER, "footer" );
$tpl->parse( BODY, "body" );
$tpl->parse( PAGE, "base" );
$tpl->FastPrint( PAGE );

}
?>
Skrypt z wydruku 17.2. pokazuje w jaki sposb na podstawie skryptu z wydruku 17.1. mona stworzy
prawdziwy system obsugi patnoci. Skrypt ten jest uywany do przetwarzania danych formularza, w ktrym
uytkownik podaje dane karty kredytowej. Na pocztku skrypt pobiera identyfikator klienta z pola formularza.
Nastpnie inicjuje zmienne CyberCash, w tym ustawiajc typ komunikatu na mauthonly. Nastpnie w bazie
danych sprawdzane jest, czy uytkownik nie zapaci ju wczeniej. W tej aplikacji kady uytkownik dokonuje
jednej patnoci za usug. Jeeli uytkownik ju zapaci skrypt wysya do administratora poczt zawierajc
komunikat informujcy o tym fakcie, oraz wywietla stron informujc uytkownika, e dokona ju wczeniej
patnoci. Na tym skrypt si koczy.
Jeeli patno nie bya jeszcze dokonana, z bazy danych pobierany jest nowy niepowtarzalny
identyfikator. Dokumentacja CyberCash nakazuje, aby identyfikator ten by co najwyej 25 znakowy i musi by
unikalny. Mona uywa w nim liter, liczb, kropek, daszkw i podkrele. Skrypt ten generuje identyfikatory w
postaci RRRRMMDD-CCCCCC-OOOO, gdzie YYYYMMDD jest biec dat, CCCCCC to identyfikator klienta a OOOO jest
identyfikatorem pobieranym z bazy danych.
W tablicy $aOrderDetails umieszczane s dane patnoci i wywoywana jest funkcja SendCC2_3Server().
danie i odpowied s zapisywane do bazy danych w postaci zaszyfrowanej. Nastpnie sprawdzany jest status
odpowiedzi. Jeeli transakcja zakoczya si powodzeniem, wywietlany jest komunikat o prawidowym
przetworzeniu transakcji i uaktualniane s dane klienta na temat patnoci. Jeeli operacja si nie powiedzie,
klient jest o tym informowany. W kadym z przypadkw do administratora wysyany jest informujcy e-mail.
Przegldajc ten przykad mona stwierdzi, e uycie API CyberCash w PHP jest proste, ale stworzenie
bezpiecznej i stabilnej aplikacji handlu elektronicznego wymaga sporej iloci przemyle i planowania. Po
systemie obsugujcym prawdziwe pienidze klienci oczekuj najlepszej jakoci usug. Jeeli aplikacja pozwoli
na przypadkowe wielokrotne patnoci lub nie dostarczy odpowiednich informacji, klienci nie bd zadowoleni.
Naley powici nieco czasu na przestudiowanie dokumentacji procesora transakcji. Dostpne jest mnstwo
informacji i ty jeste odpowiedzialny za ich zrozumienie i waciw implementacj.
Dostarczanie produktw
Innym aspektem aplikacji handlu elektronicznego, ktry wymaga planowania jest kwestia dostarczania
towarw do klientw. Jeeli twj towar musi by wysany do klienta, wymagane jest kilku dodatkowych krokw
oprcz wymienionych poprzednio. Powodem jest to, e wielu wystawcw kart kredytowych da, aby karta bya
obciana dopiero po dostarczeniu towaru do klienta. Mona da autoryzacji przed dostarczeniem towaru, ale
obcienie nie bdzie zrealizowane do czasu dostarczenia towaru. Wane jest rwnie podawanie rzeczywistego
kosztu przesyki.
Jeeli wysyasz towary, aplikacja przetwarzania patnoci staje si o wiele bardziej skomplikowana od
pokazanej w tym rozdziale. Jednak wiele wymaganych czynnoci moe by zrealizowane za pomoc PHP.
Zalecanym scenariuszem jest stworzenie osobnej aplikacji zapisujcej stan przesyek i po dostarczeniu przesyki
koczona jest patno kart i do klienta wysyany jest komunikat.
Dostpne jest kilka moliwoci ledzenia na bieco przesyek i kosztw. Zarwno UPS
(http://www.ups.com/) jak i Federal Express (http://www.fedex.com/) dostarczaj narzdzia do integracji moduu
przesyek we wasnej aplikacji WWW. Narzdzia UPS s bardzo elastyczne i wydajne i atwo mog by
umieszczone w aplikacji PHP korzystajc z niewielkiej iloci kodu. Niestety nie otrzymaem pozwolenia na
dokumentacj adnego z tych systemw przed zakoczeniem tego rozdziau. Jeeli otrzymam pozwolenie,
umieszcz odpowiednie informacje na witrynie WWW wymienionej w zasobach sieci w dodatkach. Mona
jedynie powiedzie, e wykorzystujc narzdzia sieciowe UPS mona skorzysta z mechanizmw obliczajcych
dokadne koszta przesyek da dowolnych miejsc na ziemi przy uyciu dowolnego poziomu usugi. Dane s
pobierane z witryny UPS aplikacja odpytuje ich serwery pobierajc dane prawidowe w momencie sprzeday.
PHP Kompendium wiedzy
219

Rozdzia 17. Witryny handlu elektronicznego
220
Podsumowanie
Tworzenie aplikacji handlu elektronicznego nie jest zbytnim wyzwaniem patrzc jedynie od strony kodu.
Wyzwaniem staje si stworzenie aplikacji, ktra jest jednoczenie bezpieczna i prosta w uyciu, oraz integruje w
sobie wszystkie niezbdne technologie. Tworzc aplikacje handlowe naley powici nieco czasu na poznanie
wszystkich komponentw oraz na gruntowne testowanie systemu. Naley rwnie szyfrowa przechowywane
dane oraz ca transmisj pomidzy klientem i serwerem realizowa za pomoc SSL.
Dodatek A. Funkcje
function_exists
Szuka w licie zdefiniowanych funkcji nazwy przekazanej w $function_name. Zwraca True, jeeli
znaleziono podan nazw funkcji, w przeciwnym wypadku zwraca False.
int function_exists( string nazwa_funkcji )
func_get_arg
Zwraca argument numer $arg_num z listy argumentw funkcji. Argumenty s numerowane od 0.
Func_get_arg() generuje ostrzeenie jeeli jest wywoana poza funkcj. Jeeli warto $arg_num jest wiksza ni
ilo przekazanych argumentw, generowane jest ostrzeenie a funkcja func_get_arg() zwraca False.
mixed func_get_arg( int arg_num )

<?php
function foo()
{
$numargs = func_num_args();
echo "Ilo argumentw: $numargs<br>\n";
if ($numargs >= 2)
echo "Drugi argument: " . func_get_arg(1) . "<br>\n";
}
foo (1, 2, 3);
?>
Funkcja func_get_arg() moe by uywana wraz z func_num_args() i func_get_args() do zrealizowania
funkcji ze zmienna liczb argumentw. Funkcja zostaa dodana w PHP 4.
func_get_args
Zwraca tablic, w ktrej kady element zawiera odpowiedni argument z listy argumentw funkcji. Funkcja
func_get_args() generuje ostrzeenie w wypadku wywoania jej spoza definicji funkcji.
array func_get_args( void )

<?php
function foo()
{
$numargs = func_num_args();
echo "Ilo argumentw: $numargs<br>\n";
if ($numargs >= 2)
echo "Drugi argument: " . func_get_arg(1) . "<br>\n";
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++)
echo "Argument $i = " . $arg_list[$i] . "<br>\n";
}

foo (1, 2, 3);
?>
Funkcja func_get_args() moe by uywana wraz z func_num_args() i func_get_arg() do zrealizowania
funkcji ze zmienna liczb argumentw. Funkcja zostaa dodana w PHP 4.
func_num_args
Zwraca liczb argumentw przekazanych do biecej funkcji. Funkcja func_num_args() generuje
ostrzeenie w przypadku wywoania jej z poza funkcji.
int func_num_args( void )


<?php
function foo()
{
$numargs = func_num_args();
echo "Ilo argumentw: $numargs<br>\n";
}

foo (1, 2, 3);
?>
Funkcja func_num_args() moe by uywana wraz z func_get_args() i func_get_arg() do zrealizowania
funkcji ze zmienna liczb argumentw. Funkcja zostaa dodana w PHP 4.
fwrite
Zapisuje zawarto $string do pliku wskazywanym przez $fp. Jeeli podany zosta argument $length,
zapisywanie jest przerywane po zapisaniu $length bajtw lub caej zawartoci $string. Jeeli podany zosta
argument $length, ignorowana jest opcja konfiguracji magic_quotes_runtime i z $string nie bd usuwane
ukoniki. Patrz rwnie fread(), fopen(), fsockopen(), popen() i fputs().
int fwrite( int fp, string [, int length])
getallheaders
Zwraca tablic asocjacyjn z wszystkimi nagwkami HTTP wysanymi wraz z biecym daniem.
Wskazwka
Mona rwnie odczyta wartoci zmiennych wspdzielonych CGI ze rodowiska. Mona to zrealizowa gdy PHP pracuje jako modu
Apache lub jako CGI. Aby odczyta wszystkie zmienne rodowiska zdefiniowane w ten sposb naley uy funkcji phpinfo().
array geallheaders( void )
Przykad: getallheaders()
$headers = getallheaders();
while (list ($header, $value) = each($headers))
{
echo "$header: $value<br>\n";
}
Przykad ten wywietla wszystkie nagwki biecego dania HTTP. Funkcja getallheaders() dziaa
jedynie, gdy PHP pracuje jako modu Apache.
getcwd
Zwraca biecy katalog.
string getcwd( void )
getdate
Zwraca tablic asocjacyjn zawierajc informacje o dacie odczytane na podstawie parametru $timestamp.
Tablica zawiera nastpujce elementy:
seconds sekundy
minutes minuty
hours godziny
mday dzie miesica
wday dzie tygodnia jako numer
mon miesic jako numer
year rok jako numer
yday dzie w roku jako numer, na przykad 299
weekday dzie tygodnia jako tekst, na przykad Friday
month miesic jako tekst, na przykad January
Dodatek A - Funkcje
222

array getdate( int timetamp )
getenv
Zwraca warto zmiennej rodowiska o nazwie $varname, lub w przypadku wystpienia bdu False.
string getenv( string varname )

$ip = getenv( "REMOTE_ADDR" ); // odczytuje numer IP uytkownika
List zmiennych rodowiska mona uzyska za pomoc funkcji phpinfo(). Znaczenie wielu z nich opisane
jest w specyfikacji CGI (http://hoohoo.ncsa.uiuc.edu/cgi/) na stronie powiconej zmiennym rodowiska
(http://hoohoo.ncsa.uiuc.edu/cgi/env.html).
Uwaga
Funkcja ta nie dziaa w trybie ISAPI.
gethostbyaddr
Zwraca nazw komputera o adresie przekazanym w argumencie $ip_address. W przypadku wystpienia
bdu funkcja zwraca $ip_address. Patrz rwnie: gethostbyname().
string gethostbyaddr( string ip_address )
gethostbyname
Zwraca adres IP komputera o nazwie przekazanej w $hostname. Patrz rwnie: gethostbyaddr().
string gethostbyname( string hostname )
gethostbynamel
Zwraca list adresw IP skojarzonych z nazw $hostname. Patrz rwnie: gethostbyname(),
gethostbyaddr(), checkdnserr(), getmxrr() oraz man named(8).
string gethostbynamel( string hostname )
GetImageSize
Odczytuje wielko rysunku GIF, JPG, PNG lub SWF i zwraca wymiary, typ pliku oraz cig tekstu z
szerokoci i wysokoci w postaci fragmentu znacznika IMG. Funkcja zwraca tablic z 4 elementami. Pod
indeksem 0 znajduje si szeroko rysunku w pikselach, pod indeksem 1 znajduje si wysoko rysunku. Indeks 2
zawiera znacznik okrelajcy typ rysunku, 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF. Pod indeksem 3 znajduje si
cig zawierajcy tekst height=xxx width=xxx, ktry moe by uyty bezporednio w znaczniku IMG.
array GetImageSize( string filename [, array imgeinfo])
Przykad: GetImageSize()
<?php $size = GetImageSize ("img/flag.jpg"); ?>
<IMG SRC="img/flag.jpg" <?php echo $size[3]; ?>
Opcjonalny parametr $imageinfo pozwala na odczytanie dodatkowych danych z pliku rysunku. W chwili
obecnej zwracane s rne znaczniki APP pliku JPG w postaci tablicy asocjacyjnej. Niektre programy
wykorzystuj znaczniki APP do umieszczenia w rysunku informacji tekstowej. Czstym zastosowaniem jest
umieszczanie danych IPTC http://www.xe.net/iptc/ w znaczniku APP13. Do zamiany binarnego znacznika APP13
na posta czyteln dla czowieka mona uy funkcji iptcparse().
Przykad: GetImageSize() zwracajcy IPTC
<?php
$size = GetImageSize ("testimg.jpg", &$info);
if (isset(($info["APP13"]))
{
$iptc = iptcparse( $info["APP13"]);
var_dump( $iptc);
}
?>
Uwaga
PHP Kompendium wiedzy
223

Funkcja ta nie wymaga biblioteki GD
getlastmod
Zwraca czas ostatniej zmiany biecej strony. Zwracana warto jest znacznikiem czasu Uniksa. W
przypadku bdu zwraca False.
int getlastmod( void )
Przykad: getlastmod()
<?php
// zwraca cig w postaci 'Ostatnia modyfikacja: March 04 1998 20:43:59.'
echo "Ostatnia modyfikacja: ". date ("F d Y H:i:s.", getlastmod());
?>
Patrz rwnie: date(), getmyuid(), get_current_user(), getmyinode() oraz getmypid().
getmxrr
Szuka w DNS rekordu MX skojarzonego z $hostname. Zwraca True, jeeli znalezione zostay jakie
rekordy, w przypadku wystpienia bdu lub braku rekordw zwracana jest warto False. Lista znalezionych
rekordw MX jest umieszczana w tablicy $mxhosts. Jeeli zostanie podana tablica $weight, zostanie wypeniona
wagami odnalezionych rekordw. Patrz rwnie: checkdnsrr(), gethostbyname(), gethostbynamel(),
gethostbyaddr() oraz man named(8).
int getxrr( string hostname, array mxhosts [, array weight])
getmyinode
Zwraca biecy inode pliku ze skryptem lub False w przypadku wystpienia bdu. Patrz rwnie:
getmyuid(), get_current_user(), getmypid() i getlastmod().
Uwaga
Funkcja ta nie dziaa w Windows
int getmyinode( void )
getmypid
Zwraca identyfikator procesu PHP lub False w przypadku wystpienia bdu.
Uwaga
Jeeli PHP dziaa jako modu serwera, w kolejnych wywoaniach skryptu nie jest gwarantowane, e identyfikatory procesw bd
rne. Patrz rwnie: getmyuid(), get_current_user(), getmyinode() oraz getlastmod().
int getmypid( void )
getmyuid
Zwraca identyfikator uytkownika uruchamiajcego biecy skrypt, lub False w przypadku wystpienia
bdu. Patrz rwnie: getmypid(), get_current_user(), getmyinode() oraz getlastmod().
int getmyuid( void )
getprotobyname
Zwraca numer protokou skojarzonego z protokoem $name wedug pliku /etc/protocols. Patrz rwnie:
getprotobynumber().
int getprotobyname( string name )
Dodatek A - Funkcje
224

getprotobynumber
Zwraca nazw protokou skojarzonego z protokoem $number wedug pliku /etc/protocols. Patrz rwnie:
getprotobyname().
int getprotobynumber( string name )
getrandmax
Zwraca maksymaln warto, jaka moe by zwrcona przez funkcj rand(). Patrz rwnie: rand(),
srand(), mt_rand(), mt_srand() oraz mt_getrandmax().
int getrandmax( void )
getrusage
Jest to interfejs do getrusage(2). Zwraca tablic asocjacyjn zawierajc dane zwrcone przez wywoanie
systemowe. Jeeli $who jest rwne 1, getrusage zostanie wywoane z RUSAGE_CHILDREN.
array getrusage( [int who] )
Przykad: getrusage()
$dat = getrusage();
echo $dat["ru_nswap"]; # ilo stronicowa
echo $dat["ru_majflt"]; # ilo bdw strony
echo $dat["ru_utime.tv_sec"]; # uyty czas uytkownika (sekundy)
echo $dat["ru_utime.tv_usec"]; # uyty czas uytkownika (mikrosekundy)
Wicej szczegw na temat getrusage mona znale w podrczniku systemowym pod hasem
getrusage(2).
getservbyname
Zwraca numer portu uywanego przez usug $service dla protokou $protocol, wedug definicji w
/etc/services. $protocol moe by TCP lub UDP. Patrz rwnie: getservbyport().
int getservbyname( string service, string protocol)
gettext
Funkcja szuka tumaczenia cigu w jednej z tablic tumacze. Zwraca przetumaczony cig lub oryginalny
cig, jeeli tumaczenie nie zostanie znalezione. Jako Znakw zastpczych mona uywa podkrelenia.
string gettext( string message )
Przykad: gettext()
<?php
// Ustaw jzyk na niemiecki
putenv( "LANG=de");
// Okrel poozenie tablic tumacze
bindtextdomain( "myPHPApp", "./locale");
// wybierz domen
textdomain( "myPHPApp");
// wypisz komunikat testowy
print (gettext( "Welcome to My PHP Application"));
?>
gettimeofday
Jest to interfejs do gettimeofday(2). Zwraca tablic asocjacyjn zawierajc dane zwracane przez
wywoanie systemowe.
sec sekundy
usec mikrosekundy
minuteswest przesunicie w minutach na zachd od Greenwich
dsttime typ poprawki dst
array gettimeofday( void )
PHP Kompendium wiedzy
225

gettype
Zwraca typ zmiennej PHP $var. Moliwe zwracane wartoci zamieszczone s poniej:
boolean integer double string
array object resource user function
unknown type
string gettype( mixed var )
Patrz rwnie: settype().
get_browser
Odczytuje moliwoci przegldarki uytkownika. Jest to realizowane przez odszukanie danych na temat
przegldarki w pliku browscap.ini. Domylnie uywana jest warto zmiennej $HTTP_USER_AGENT, ale mona
przekaza dowoln dowolny parametr $user_agent (na przykad, aby odczyta moliwoci innej przegldarki).
Zwracany jest obiekt zawierajcy dane opisujce, na przykad numer wersji, identyfikator, wartoci True lub
False dla takich wasnoci jak, obsuga ramek, JavaScript, cookie itd. Mimo, e plik browscap.ini zawiera dane o
wielu przegldarkach, to jednak uytkownik musi dba o jego aktualno. Format pliku jest bardzo prosty.
Poniszy przykad pokazuje przykadowe dane zwracane dla przegldarki uytkownika.
object get_browser( [string user_agent])
Przykad: get_browser()
<?php
function list_array ($array)
{
while (list ($key, $value) = each($array))
$str .= "<b>$key:</b> $value<br>\n";
return $str;
}
echo "$HTTP_USER_AGENT<hr>\n";
$browser = get_browser();
echo list_array( (array) $browser);
?>
Wynik dziaania tego skryptu moe wyglda nastpujco
Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)<hr>
<b>browser_name_pattern:</b> Mozilla/4\.0 (compatible; MSIE 5\.5; Windows NT 5\.0)<br>
<b>parent:</b> IE 5.0<br>
<b>version:</b> 5.5<br>
<b>minorver:</b> 5<br>
<b>platform:</b> Win2000<br>
<b>beta:</b> <br>
<b>browser:</b> IE<br>
<b>majorver:</b> 5<br>
<b>frames:</b> 1<br>
<b>tables:</b> 1<br>
<b>cookies:</b> 1<br>
<b>backgroundsounds:</b> 1<br>
<b>vbscript:</b> 1<br>
<b>javascript:</b> 1<br>
<b>javaapplets:</b> 1<br>
<b>activexcontrols:</b> 1<br>
<b>win16:</b> <br>
<b>ak:</b> <br>
<b>sk:</b> <br>
<b>aol:</b> <br>
<b>crawler:</b> <br>
<b>msn:</b> <br>
<b>cdf:</b> 1<br>
<b>dhtml:</b> 1<br>
<b>xml:</b> 1<br>
Aby skrypt ten mg dziaa naley tak ustawi zmienn konfiguracji browscap, aby wskazywaa na
katalog z plikiem browscap.ini. Wicej informacji (w tym adresy skd mona cign plik browscap.ini) mona
znale w FAQ do PHP pod adresem http://www.php.net/FAQ.php.
get_cfg_var
Zwraca warto zmiennej konfiguracji PHP okrelonej przez $varname, lub False w przypadku
wystpienia bdu. Funkcja ta nie zwraca danych konfiguracji ustawionych przy kompilacji PHP lub poprzez pliki
konfiguracyjne Apache (przy uyciu dyrektywy php3_configuration_option). Aby sprawdzi, czy system
Dodatek A - Funkcje
226

korzysta z pliku konfiguracji, naley sprbowa odczyta warto zmiennej konfiguracji cfg_file_path. Jeeli
jest to moliwe, oznacza to, e jest uywany plik konfiguracji.
string get_cfg_var( string varname )
get_class
Zwraca nazw klasy przekazanego obiektu $obj. Patrz rwnie: get_parent_class(), is_subclass_of().
string get_class( object obj )
get_class_methods
Zwraca tablic z nazwami metod zdefiniowanych w klasie okrelonej przez $class_name. Patrz rwnie:
get_class_vars(), get_object_vars().
array get_class_methods( string class_name )
get_class_vars
Zwraca tablic z nazwami waciwoci zdefiniowanych w klasie okrelonej przez $class_name. Patrz
rwnie: get_class_methods(), get_object_vars().
array get_class_vars( string class_name )
get_current_user
Zwraca nazw waciciela biecego skryptu PHP. Patrz rwnie getmyuid(), getmypid(), getmyinode()
oraz getlastmod().
string get_current_user( void )
get_declared_classes
Zwraca tablic nazw klas zadeklarowanych w biecym skrypcie. W PHP 4.0.1pl2 na pocztku tablicy
zwracane byy trzy dodatkowe klasy: stdClass (zdefiniowana w Zend/zend.c), OverloadedTestClass
(zdefiniowana w ext/standard/basic_functions.h) oraz Directory (zdefiniowana w ext/standard/dir.c).
array get_declared_classes( void )
get_extension_funcs
Zwraca nazwy wszystkich funkcji zdefiniowanych w module $module_name.
array get_extension_funcs( string module_name )
Przykad: get_extension_funcs()
print_r (get_extension_funcs( "xml"));
print_r (get_extension_funcs( "gd"));
Wykonanie tych linii spowoduje wypisanie listy funkcji umieszczonych w moduach xml i gd. Patrz
rwnie: get_loaded_extensions().
get_html_translation_table
Zwraca tablic translacji uywan wewntrznie w funkcjach htmlspecialchars() i htmlentities().
Moliwe jest okrelenie potrzebnej w danym momencie tabeli (HTML_ENTITIES i HTML_SPECIALCHARS). Tak samo
jak w przypadku funkcji htmlspecialchars() i htmlentities() mona opcjonalnie okreli rodzaj ukonikw
$quote_style. Domylnym ustawieniem jest tryb ENT_COMPAT. Opis trybw znajduje si w opisie funkcji
htmlspecialchars().
string get_html_translation_table( int table [, int quote_style])
Przykad: Tablica translacji
$trans = get_html_translation_table( HTML_ENTITIES );
$str = "To firma & <PRO> & spka";
$encoded = strtr( $str, $trans);
PHP Kompendium wiedzy
227

Zmienna $encoded zawiera teraz cig To firma &amp; &lt;PRO&gt; &amp; sp&oacute;&sup3;ka.
Ciekawym zastosowaniem jest uycie funkcji array_flip() w celu zmiany kierunku translacji.
$trans = array_flip( $trans );
$original = strtr ($str, $trans);
Teraz w zmiennej $original bdzie znajdowa si cig: To firma & <PRO> & spka.
Uwaga
Funkcja ta zostaa dodana w PHP 4.0
Patrz rwnie htmlspecialchars(), htmlentities(), strtr() i array_flip().
get_included_files
Funkcja zwraca tablic asocjacyjn z nazwami wszystkich plikw doczonych do skryptu za pomoc
funkcji include_once(). Indeksami tej tablicy s nazwy plikw uytych w include_once() bez rozszerzenia .php.
W PHP 4.0.1pl2 funkcja zakadaa, e pliki doczane poprzez include_once() maj rozszerzenia .php i inne
rozszerzenia nie dziaaj. Patrz rwnie: require_once(), include_once(), get_required_files().
array get_included_files( void )
get_loaded_extesions
Zwraca nazwy wszystkich moduw wkompilowanych i zaadowanych przez interpreter PHP.
array get_loaded_extensions( void )
Przykad get_loaded_extensions()
print_r (get_loaded_extensions());
Spowoduje to wypisanie listy podobnej do nastpujcej:
Array
(
[0] => standard
[1] => bcmath
[2] => Calendar
[3] => com
[4] => variant
[5] => ftp
[6] => mysql
[7] => odbc
[8] => pcre
[9] => session
[10] => xml
[11] => wddx
[12] => apache
)
Patrz rwnie: get_extension_funcs().
get_magic_quotes_gpc
Zwraca stan ustawienia magic_quotes_gpc (0 wyaczone, 1 wczone). Patrz rwnie:
get_magic_quotes_runtime(), set_magic_quotes_runtime().
long get_magic_quotes_gpc( void )
get_magic_quotes_runtime
Zwraca stan ustawienia magic_quotes_runtime (0 wyaczone, 1 wczone). Patrz rwnie:
get_magic_quotes_gpc(), set_magic_quotes_runtime().
long get_magic_quotes_runtime( void )
get_meta_tags
Otwiera plik $filename i analizuje go szukajc znacznikw meta.
array get_meta_tags( string filename [, int use_include_path])
Przykad: Znaczniki <META>
Dodatek A - Funkcje
228

<meta name="author" content="name">
<meta name="tags" content="php3 documentation">
</head> <!-- tutaj zatzymuje si analiza -->
Uwaga
Uwaga na koce linii PHP wykorzystuje wasn funkcj analizujc plik wejciowy, wic pliki z MacIntosha mog nie dziaa na
Uniksie.
Nazwa waciwoci staje si kluczem, natomiast zawarto umieszczana jest w tablicy jako warto
elementu. Dziki temu mona wykorzysta standardowe funkcje przegldajce tablice. Znaki specjalne s
zastpowane znakiem podkrelenia, natomiast pozostay tekst jest konwertowany do maych liter. Ustawienie
use_include_path na 1 spowoduje, e PHP bdzie prbowa otworzy plik znajdujcy si na standardowej ciece
doczania.
get_object_vars
Zwraca tablic asocjacyjn waciwoci zdefiniowanych w obiekcie okrelonym przez $obj. Jeeli
zmienna zdefiniowana w klasie nie ma przypisanej wartoci, nie znajdzie si ona w tablicy asocjacyjnej.
array get_object_vars( object obj)
Przykad: uycie get_object_vars()
<?php
class Point2D
{
var $x, $y;
var $label;
function Point2D( $x, $y)
{
$this->x = $x;
$this->y = $y;
}
function setLabel( $label)
{
$this->label = $label;
}
function getPoint()
{
return array( "x" => $this->x,
"y" => $this->y,
"label" => $this->label);
}
}
$p1 = new Point2D( 1.233, 3.445);
print_r(get_object_vars($p1));
// Waciwo $Label jest zdefiniowana, ale nie zainicjowana
// Array
// (
// [x] => 1.233
// [y] => 3.445
// )
$p1->setLabel("point #1");
print_r(get_object_vars($p1));
// Array
// (
// [x] => 1.233
// [y] => 3.445
// [label] => point #1
// )
?>
Patrz rwnie: get_class_methods(), get_class_vars().
get_parent_class
Zwraca nazw klasy bazowej dla klasy, ktrej instancj jest obiekt $obj. Patrz rwnie: get_class(),
is_subclass_of().
string get_parent_class( object obj )
PHP Kompendium wiedzy
229

get_required_files
Zwraca tablic asocjacyjn z nazwami wszystkich plikw zaadowanych do skryptu poprzez funkcj
require_once().
array get_required_files( void )
Przykad: Wypisywanie plikw doczanych za pomoc require i include.
<?php
require_once( "local.php" );
require_once( "../inc/global.php" );
for ($i=1; $i<5; $i++)
include "util". $i . ".php";
echo "Pliki doczane przez require_once\n";
print_r (get_required_files());
echo "Pliki doczane przez include_once\n";
print_r (get_included_files());
?>
Wykonanie tego skryptu spowoduje wygenerowanie nastpnego wyniku:
Pliki doczane przez require_once
Array
(
[0] => C:\helion\php4-devguide\site\doda\local.php
[1] => C:\helion\php4-devguide\site\inc\global.php
[2] => C:\helion\php4-devguide\site\doda\util1.php
[3] => C:\helion\php4-devguide\site\doda\util2.php
[4] => C:\helion\php4-devguide\site\doda\util3.php
[5] => C:\helion\php4-devguide\site\doda\util4.php
)
Pliki doczane przez include_once
Array
(
[0] => C:\helion\php4-devguide\site\doda\local.php
[1] => C:\helion\php4-devguide\site\inc\global.php
[2] => C:\helion\php4-devguide\site\doda\util1.php
[3] => C:\helion\php4-devguide\site\doda\util2.php
[4] => C:\helion\php4-devguide\site\doda\util3.php
[5] => C:\helion\php4-devguide\site\doda\util4.php
)
Uwaga
W PHP 4.0.1pl2 funkcja zakadaa, e pliki doczane poprzez include_once() maj rozszerzenia .php i inne rozszerzenia nie
dziaaj.
Patrz rwnie: require_once(), include_once(), get_included_files().
gmdate
Funkcja ta jest identyczna z date(), poza tym, e zwracany czas jest czasem Greenwich (GMT). Jeeli
przykd zostanie uruchomiony w Polsce (GMT +0100), pierwsza linia przykadu zwrci Jan 01 1998 00:00:00,
natomiast druga Dec 31 1997 23:00:00.
string gmdate( string format, int timestamp )
Przykad: gmdate()
echo date("M d Y H:i:s", mktime( 0,0,0,1,1,1998));
echo gmdate("M d Y H:i:s", mktime( 0,0,0,1,1,1998));
Patrz rwnie: date(), mktime() i gmmktime().
gmmktime
Funkcja identyczna jak mktime(), poza tym, e przekazane parametry reprezentuj czas GMT.
int gmmktime( int hour, int minute, int second, int month,
int day, int year [, int is_dst])
gmstrftime
Dodatek A - Funkcje
230
Zachowuje si tak samo jako jak funkcja strftime(), ale zwracany czas jest czasem GMT. Na przykad,
jeeli bdzie uyta w strefie czasowej GMT -0500, pierwsze wywoanie z przykadu wypisze cig Dec 31 1998
20:00:00, natomiast drugie: Jan 01 1999 01:00:00.

string gmstrftime( string format, int timestamp )
Przykad: gmstrftime()
setlocale( 'LC_TIME', 'en_US');
echo strftime("%b %d %Y %H:%M:$S", mktime( 20,0,0,12,31,98));
echo gmstrftime("%b %d %Y %H:%M:$S", mktime( 20,0,0,12,31,98));
Patrz rwnie: strftime().
GregorianToJD
Prawidowy zakres dat kalendarza gregoriaskiego to 4714 p.n.e. do 9999 n.e. Chocia mona stosowa
tak szeroki zakres dat, nie ma to jednak sensu. Kalendarz gregoriaski zosta ustanowiony 15 padziernika 1582
roku (lub 5 padziernika 1582 roku wedug kalendarza juliaskiego). Niektre kraje jeszcze dugo nie
wprowadziy tego kaledarza. Na przykad Anglia przyja go w 1752 roku, Rosja w 1918 a Grecja w 1923 roku.
Wikszo krajw europejskich przed kalendarzem gregoriaskim uywaa kalendarza juliaskiego.
int GregorianToJD( int month, int day, int year)
Przykad: Funkcje kalendarza
<?php
$jd = GregorianToJD( 10, 11, 1970);
echo "$jd\n";
$gregorian = JDToGregorian( $jd );
echo "$gregorian\n";
?>
gzclose
Funkcja zamyka plik gz wskazywany przez $zp. W przypadku powodzenia zwraca True, a w przypadku
bdu, False. Wskanik pliku gz musi by prawidowym wskanikiem wskazujcym na plik otwarty przez funkcj
gzopen().
int gzclose( int zp )
gzcompress
Zwraca dane wejciowe przekazane w $data skompresowane gzipem, lub False w przypadku wystpienia
bdu. Opcjonalny parametr $level moe przyjmowa wartoci od 0 dla braku kompresji, do 9 dla maksymalnej
kompresji. Patrz rwnie: gzuncompress().
string gzcompress( string data [, int level])
gzeof
Zwraca True, jeeli wskanik pliku gz znajduje si na kocu pliku lub wystpi bd. W przeciwnym
przypadku zwraca False. Wskanik pliku gz musi by prawidowym wskanikiem wskazujcym na plik otwarty
przez funkcj gzopen().
int gzeof( int zp )
gzfile
Funkcja identyczna z readgzfile(), poza tym, e gzfile() zwraca zawarto pliku w tablicy. Mona
ustawi parametr opcjonalny na 1, co spowoduje szukanie pliku rwnie na ciece ustawionej w include_path.
Patrz rwnie: readgzfile(), gzopen().
array gzfile( string filename [, int use_include_path])
gzgetc
Zwraca cig zawierajcy jeden znak (nieskompresowany) odczytany z pliku na ktry wskazuje $zp.
Zwraca False na kocu pliku (tak samo jak gzeof()).Wskanik pliku gz musi by prawidowym wskanikiem
wskazujcym na plik otwarty przez funkcj gzopen(). Patrz rwnie: gzopen() i gzgets().
string gzgetc( int zp )
PHP Kompendium wiedzy
231

gzgets
Zwraca cig znakw (nieskompresowany) o maksymalnej dugoci $length-1 odczytany z pliku na ktry
wskazuje $zp. Czytanie koczy si po odczytaniu $length-1 znakw, znaku nowej linii lub znaku EOF. Zwraca
False w przypadku wystpienia bdu. Wskanik pliku gz musi by prawidowym wskanikiem
wskazujcym na plik otwarty przez funkcj gzopen(). Patrz rwnie: gzopen(), gzgetc() i fgets().
string gzgets( int zp, int length )
gzgetss
Funkcja identyczna jak gzgets(), ale dodatkowo gzgetss() usiuje usun znaczniki HTML i PHP z
odczytanego tekstu. Mona uy opcjonalnego trzeciego parametru w celu okrelenia znacznikw, ktre maj
pozosta w tekcie. Parametr $allowable_tags zosta dodany w PHP 3.0.13, PHP4B3. Patrz rwnie: gzgets(),
gzopen() i strip_tags().
string gzgetss( int zp, int length [, string allowable_tags])
gzopen
Otwiera plik gzip (.gz) do odczytu lub zapisu. Parametr $mode jest taki jak w fopen() ("rb" lub "wb"), ale
moe zawiera rwnie poziom kompresji ("wb9") lub strategi: f dla filtrowania danych, na przykad "wb6f", h
dla kompresji tylko metod Huffmana, np.: "wb1h". Wicej informacji na temat filtrowania znajduje si w opisie
deflateIni2 w pliku zlib.h. Mona rwnie wykorzysta gzopen() do odczytania danych, ktre nie s w formacie
gzip. W takim przypadku gzread() odczytuje plik bez jego dekompresji. Funkcja gzopen() zwraca wskanik do
otwartego pliku. Po tej operacji wszystkie dane odczytywane z tego pliku s dekompresowane, natomiast dane
zapisywane do pliku s kompresowane. Jeeli otwarcie pliku nie uda si, funkcja zwraca False. Mona uy
opcjonalnego trzeciego argumentu i ustawi go na 1 w celu wczenia poszukiwania pliku do otwarcia na ciece
include_path.
int gzopen( string filename, string mode [, int use_include_path])
Przykad gzopen()
$fp = gzopen( "/tmp/file.gz", "r" );
Patrz rwnie: gzclose().
gzpassthru
Odczytuje plik wskazywany przez wskanik do pliku gz, a do znaku EOF, a jego (nieskompresowan)
zawarto kieruje na wyjcie. Jeeli wystpi bd zwraca False. Wskanik pliku gz musi by prawidowym
wskanikiem wskazujcym na plik otwarty przez funkcj gzopen(). Po zakoczeniu odczytu pliku jest on
zamykany.
int gzpassthru( int zp )
gzputs
Identyczna jak funkcja gzwrite().
int gzputs( int zp, string str [, int length])
gzread
Odczytuje maksymalnie $length bajtw z pliku gz wskazywanego przez $zp. Odczyt zostaje przerwany,
gdy zostanie odczytane $length znakw (nieskompresowanych), lub napotkany zostanie koniec pliku.
string gzread( int zp, int length )
Przykad: gzread()
// odzytanie zawartoci pliku gz do cigu
$filename = "/usr/local/somth.txt.gz";
$zd = gzopen( $filename, "r");
$contents = gzread( $dz, 10000 );
Patrz rwnie: gzwrite(), gzopen(), gzgets(), gzgetss(), gzfile(), gzpassthru().
Dodatek A - Funkcje
232

gzrewind
Ustawia znacznik pozycji na pocztku pliku. Jeeli wystpi bd, funkcja zwraca 0. Wskanik pliku gz
musi by prawidowym wskanikiem wskazujcym na plik otwarty przez funkcj gzopen(). Patrz rwnie
gzseek(), gztell().
int gzrewind( int zp )
gzseek
Ustawia znacznik pozycji pliku wskazywanego przez $zp na pozycj okrelon przez $offset. Jest to
odpowiednik wywoania (w C) gzseek( zp, offset, SEEK_SET). Jeeli plik jest otwarty do odczytu, funkcja jest
wykonywana, ale moe by to niezwykle powolne. Jeeli plik jest otwarty do zapisu, obsugiwane jest jedynie
przesunicie w przd; gzseek() kompresuje wtedy sekwencj zer a do nowej pozycji. W przypadku powodzenia
operacji zwraca 0, w przeciwnym wypadku zwraca -1.
Uwaga
Przesunicie poza znacznik EOF nie jest traktowane jako bd.
Patrz rwnie gztell() i gzrewind().
int gzseek( int zp, int offset )
gztell
Zwraca pozycje znacznika pozycji dla pliku wskazywanego przez $zp, to znaczy przesunicie od pocztku
pliku. Jeeli wystpi bd, funkcja zwraca False. Wskanik pliku gz musi by prawidowym wskanikiem
wskazujcym na plik otwarty przez funkcj gzopen(). Patrz rwnie: gzopen(), gzseek() i gzrewind().
int gztell( int zp )
gzuncompress
Na podstawie danych $data, skompresowanych za pomoc funkcji gzcompress() zwraca oryginalne
nieskompresowane dane. W przypadku bdu zwraca False. Funkcja zakoczy si niepowodzeniem, jeeli
rozmiar rozkompresowanych danych przekracza 256 krotno wielkoci danych wejciowych $data, lub jest
wikszy od opcjonalnego parametru $length. Patrz rwnie gzcompress().
string gzuncompress( string data [, int length])
gzwrite
Zapisuje zawarto $string do pliku gz wskazywanego przez $zp. Jeeli podano argument $length, zapis
jest przerywany po zapisaniu $length bajtw (nieskompresowanych), lub po osigniciu koca danych
wejciowych.
Uwaga
Jeeli podany zosta argument $length, ignorowany jest parametr konfiguracji magic_quotes_runtime i z cigu $string nie
bd usunite ukoniki.
Patrz rwnie: gzread(), gzopen() i gzputs().
header
Funkcja uywana na pocztku pliku HTML do wysania surowych nagwkw HTTP. Wicej informacji
na temat surowych nagwkw mona znale w specyfikacji protokou HTTP 1.1
(http://www.w3.org/Protocols/rfc2616/rfc2616).
Uwaga
PHP Kompendium wiedzy
233

Naley pamita, e funkcja header() musi by wywoana przed wysaniem danych HTML, niezalenie czy poprzez normalny kod
HTML czy poprzez PHP. Bardzo czsto spotykanym bdem jest umieszczanie wolnych linii przed wywoaniem funkcji header().
Istniej dwa nagwki specjalnego przeznaczenia. Pierwszy to nagwek Location. Oprcz odesania tego
nagwka do przegldarki zwraca on do Apache kod statusu REDIRECT. Dla programistw skryptw moe nie by
to zbyt wane, ale wane jest dla programistw zainteresowanych dziaaniem serwera Apache.
int header( string string )
Przykad: header()
header("Location: http://www.php.net"); /* przekierowuje rzegldark do witryny PHP */
exit; /* naley si upewni, e kod poniej nie
zostanie wykonany. */
Drugim nagwkiem specjalnego przeznaczenia jest nagwek rozpoczynajcy si cigiem HTTP/
(wielko znakw bez znaczenia). Na przykad jeeli skonfigurowana zostanie dyrektywa Apache ErrorDocument
404, tak aby wskazywaa na skrypt PHP, dobrze jest si upewni, e skrypt PHP generuje bd 404. W tym celu
naley wysa nastepujcy nagwek:
header("HTTP/1.0 404 Not Found");
Skrypty PHP czsto generuj dynamiczny kod HTML, ktry nie powinien by buforowany w
przegldarkach i serwerach proxy. Mona zablokowa wiele serwerw proxy za pomoc nagwkw:
header("Expires: Mon, 26 ul 1997 05:00:00 GMT"); //Data w przeszoci
header("LastModified: " .. gmdate("D, d M y H:i:s"); // Czas GMT
header("Cache-Control: no-cache, must-revalidate"); // zawsze zmodyfikowane HTTP/1.1
header("Pragme: no-cache"); // HTTP/1.0
Patrz rwnie: headers_sent().
headers_sent
Zwraca True, jeeli wysane zostay nagwki HTTP, w przeciwnym przypadku zwraca False. Patrz
rwnie: header().
boolean headers_sent( void )
hebrev
Opcjonalny parametr $max_chas_per_line wskazuje na maksymaln ilo znakw w linii danych
wyjciowych. Funkcja prbuje unikn amania wyrazw. Patrz rwnie: hebrevc().
string hebrev(string hebrew_text [, int max_chars_per_line])
hebrevc
Funkcja podobna do hebrev() z t rnic, e konwertuje znaki nowej linii (\n) na <br>\n. Opcjonalny
parametr $max_chars_per_line wskazuje maksymaln ilo znakw w wyniku. Funkcja prbuje unikn amania
wyrazw. Patrz rwnie: hebrev().
string hebrevc( string hebrev_text [, int max_chars_per_line])
hexdec
Zwraca dziesitny odpowiednik liczby szesnastkowej przekazanej w parametrze $hex_string. Funkcja
hexdec() konwertuje cig szesnastkowy na liczb dziesitn. Najwiksz liczb, jaka moe by skonwertowana
jest 7fffffff lub 2147483647 dziesitnie. Patrz rwnie: dechex().
int hexdec( string hex_string )
highlight_file
Wynikiem dziaania funkcji jest wersja pliku PHP, o nazwie $filename, z wyrnion skadni. Uywane
kolory s zdefiniowane w wewntrznym module wyrniania skadni.
void highlight_file( string filename )
Przykad: Tworzenie czy do plikw z wyrnion skadni
Aby utworzy cze umoliwiajce wyrnienie skadni dowolnego pliku, skorzystamy z dyrektywy
Apache ForceType. Pozwala to na stworzenie eleganckiego adresu URL, natomiast uycie funkcji
Dodatek A - Funkcje
234

highlight_file() pozwala na pokazanie adnie wygldajcego kodu. W pliku httpd.conf naley doda
nastpujce linie:
<Location /source>
ForceType application/x-httpd-php
</Location>
Nastpnie naley utworzy plik o nazwie source i umieci go w gwnym katalogu serwera WWW:
<HTML>
<HEAD>
<TITLE>Wywietlanie rda</TITLE>
</HEAD>
<BODY COLOR BGCOLOR="white">
<?php
$script = getenv( "PATH_TRANSLATED");
if (!$script)
{
echo "<BR><B>BD: wymagana nazwa skryptu</B><BR>";
}
else
{
if ereg("(\.php|\.inc)$", $script))
{
echo "<H1>rdo skryptu: $PATH_INFO</H1>\n<hr>\n";
highlight_file( $script );
}
else
echo "<H1>BD: Dopuszczalne sa jedynie rozszerzenia php i inc</H1>";
}
echo "Przetworzony: " . date( "Y/M/d H:i:s", time());
</BODY>
</HTML>
?>
Teraz mona uy adresw podobnych do przytoczonego poniej, aby wywietli kolorow wersj skryptu
/sciezka/do/skryptu.php.
http://serwer.com/source/sciezka/do/skryptu.php
Patrz rwnie: highlight_string() i show_source().
highlight_string
Wysya na wyjcie pokolorowan wersj cigu $str. Uywane kolory s zdefiniowane w wewntrznym
module PHP. Patrz rwnie: highlight_file() i show_source().
void highlight_string( string str )
htmlentities
Funkcja jest identyczna z htmlspecialchars(), ale wszystkie znaki posiadajce odpowiadajce im symbole
HTML s zamieniane na te symbole. Tak jak w przypadku funkcji htmlspecialchars() mona uy opcjonalnego
argumentu wskazujcego na sposb traktowania cudzysoww i apostrofw. Warto ENT_COMPAT (domylna)
konwertuje jedynie cudzysowy, pozostawiajc bez zmian apostrofy. ENT_QUOTES powoduje konwersj zarwno
cudzysoww jak i apostrofw. ENT_NOQUOTES powoduje, e zarwno cudzysowy jak i apostrofy pozostaj
niezmienione. W chwili obecnej uywany jest zestaw znakw ISO-8859-1. Naley pamita, e argument
opcjonalny zosta dodany w PHP 3.0.17 i PHP 4.0.3. Patrz rwnie: htmlspecialchars() i nl2br().
string htmlentities( string string [, int quote_style])
htmlspecialchars
Niektre znaki maj specjalne znaczenie w HTML i powinny by reprezentowane przez symbole HTML.
Funkcja ta zwraca cig z zastosowanymi niektrymi z tych konwersji. S to najczciej uywane konwersje przy
programowaniu dla WWW. Jeeli wymagana jest kompletna konwersja, naley uy funkcji htmlentities().
Funkcja ta jest uyteczna do usuwania znacznikw HTML z tekstu wprowadzonego przez uytkownika, na
przykad w ksidze goci lub na tablicy ogoszeniowej. Argument opcjonalny, $quote_style wskazuje sposb
konwersji apostrofw i cudzysoww. Domylny tryb ENT_COMPAT jest dostpny dla zachowania zgodnoci z
poprzednimi wersjami i konwertuje jedynie cudzysowy, pozostawiajc bez zmian apostrofy. ENT_QUOTES
PHP Kompendium wiedzy
235

powoduje konwersj zarwno cudzysoww jak i apostrofw. ENT_NOQUOTES powoduje, e zarwno cudzysowy
jak i apostrofy pozostaj niezmienione.
string htmlspecialchars( string string [, int quote_style])
Wykonywane s nastpujce konwersje:
& jest zamieniane na &amp;
" jest zamieniany na &quot;, o ile nie jest ustawiona warto ENT_NOQUOTES
' jest zmieniany na &#039; jeeli jest ustawiona warto ENT_QUOTES
< jest zmieniane na &lt;
> jest zmieniane na &gt;
Uwaga
Funkcja ta wykonuje jedynie przedstawione translacje. Aby przeprowadzi pen translacj naley uy funkcji htmlentities().
Naley pamita, e argument opcjonalny zosta dodany w PHP 3.0.17 i PHP 4.0.3.
hw_Array2Objrec
Konwertuje $object_array na rekord obiektowy. Wielokrotne atrybuty na przykad Title w rnych
jzykach s obsugiwane prawidowo. Patrz rwnie: hw_objrec2array().
string hw_Array2Objrec( array object_array )
hw_Children
Zwraca tablic identyfikatorw obiektw. Kady identyfikator naley do elementu kolekcji o
identyfikatorze $objectID. Tablica zawiera wszystkie elementy potomne, zarwno dokumenty jak i kolekcje.
array hw_Children( int connection, int objectID )
hw_ChildrenObj
Zwraca tablic rekordw obiektw. Kady z obiektw naley do elementu potomnego o identyfikatorze
$objectID. Tablica zawiera wszystkie elementy potomne, zarwno dokumenty jak i kolekcje.
array hw_ChildrenObj( int connection, int objectID )
hw_Close
Zwraca False, jeeli $connection nie jest prawidowym indeksem poczenia, a w przeciwnym przypadku
True. Zamyka poczenie o podanym indeksie do serwera Hyperwave.
int hw_Close( int connection )
hw_Connect
Otwiera poczenie do serwera Hyperwave i zwraca indeks poczenia, jeeli operacja si uda. Jeeli nie,
zwraca False. Kady z argumentw powinien by cigiem poza numerem portu. Argumenty $username i
$password s opcjonalne i mog by opuszczone. W takim przypadku nie bdzie przeprowadzana identyfikacja
uytkownika. Jest to zblione do identyfikacji uytkownika anonimowego. Funkcja zwraca indeks poczenia,
ktry jest potrzebny w innych funkcjach Hyperwave. Mona utrzymywa kilka pocze do serwera, Naley
jedynie pamita, e przesyane haso nie jest zaszyfrowane. Patrz rwnie: hw_pConnect().
int hw_Connect( string host, int port, string username, string password )
hw_Cp
Kopiuje obiekt o identyfikatorze podanym w drugim parametrze do kolekcji o identyfikatorze
$destination_id. Zwracan wartoci jest ilo skopiowanych obiektw. Patrz rwnie: hw_mv().
int hw_Cp( int conection, array object_id_array, int destination_id
Dodatek A - Funkcje
236

hw_Deleteobject
Usuwa obiekt o identyfikatorze przekazanym w drugim argumencie funkcji. Usuwa wszystkie kopie
obiektu. Zwraca True, jeeli nie wystpiy adne bdy, lub False gdy bdy wystpiy. Patrz rwnie hw_mv().
int hw_Deleteobject( int connection, int object_to_delete )
hw_DocByAnchor
Zwraca identyfikator obiektu, do ktrego naley $anchorID.
int hw_DocByAnchor( int connection, int anchorID )
hw_DocByAnchorObj
Zwraca rekord obiektu dokumentu, do ktrego naley $anchorID.
int hw_DocByAnchorObj( int connection, int anchorID )
hw_Document_Attributes
Zwraca rekord obiektu dokumentu. Dla zachowania zgodnoci z poprzednimi wersjami akceptowane jest
rwnie hw_DocumentAttributes(). Jednak nie zaleca si stosowania tej nazwy. Patrz rwnie:
hw_Document_BodyTag() i hw_Document_Size().
hw_Document_BodyTag
Zwraca znacznik BODY dokumentu. Jeeli jest to dokument HTML, znacznik BODY powinien by
wydrukowany przez dokumentem. Patrz rwnie: hw_Document_Attributes(), hw_Document_Size(). Dla
zapewnienia zgodnoci akceptowana jest rwnie nazwa hw_DocumentBodyTag(). Nie zaleca si jej stosowania.
string hw_Document_BodyTag( int hw_document )
hw_Document_Content
Zwraca tre dokumentu. Jeeli jest to dokument HTML, zawartoci jest wszystko po znaczniku BODY.
Dane ze znacznikw BODY i HEAD s zapamitywane w rekordzie obiektu. Parz rwnie:
hw_Document_Attributes(), hw_Document_Size() i hw_DocumentSetContent().
string hw_Document_Content( int hw_document )
hw_Document_SetContent
Zapisuje lub zmienia zawarto dokumentu. Jeeli dokument jest w formacie HTML, zawarto stanowi
wszystko po znaczniku BODY. Dane ze znacznikw HEAD i BODY s przechowywane w rekordzie obiektu. Jeeli
informacje te zostan umieszczone w zawartoci dokumentu, po wstawieniu dokumentu serwer Hyperwave
zmieni odpowiednio rekord obiektu; nie jest to najlepsze rozwizanie. Jeeli funkcja si nie powiedzie, dokument
bdzie zawiera poprzedni zawarto. Patrz rwnie: hw_Document_Attributes(), hw_Document_Size() i
hw_Document_Content().
string hw_DocumentSetContent( int hw_document, string content )
hw_Document_Size
Zwraca wielko dokumentu w bajtach. Patrz rwnie: hw_Document_BodyTag() i
hw_Document_Attributes(). W celu zachowania zgodnoci akceptowana jest rwnie nazwa hw_DocumentSize, ale
jej stosowanie nie jest zalecane.
int hw_Document_Size( int hw_document )
PHP Kompendium wiedzy
237

hw_EditText
Przesya test dokumentu na serwer. Rekord obiektu dokumentu nie moe by modyfikowany do czasu
zakoczenia edycji. Funkcja ta dziaa jedynie dla dokumentw czysto tekstowych. Nie otwiera specjalnego
poczenia i przez to na czas przesyania blokuje poczenie sterujce. Patrz rwnie: hw_PipeDocument(),
hw_FreeDocument(), hw_Document_BodyTag(), hw_Document_Size(), hw_Output_Document() i hw_GetText().
int hw_EditText( int connection, int hw_document )
hw_Error
Zwraca kod ostatniego bdu. Jeeli nie wystpoway adne bdy, zwraca 0. Bd odnosi si do ostatnio
wykonanej komendy.
int hw_Error( int connection )
hw_ErrorMsg
Zwraca cig zawierajcy ostatni komunikat bdu lub cig No Error. Jeeli funkcja si nie udaa, zwraca
False. Komunikat bdu odnosi si do ostatnio wykonanej komendy.
string hw_ErrorMsg( int connection )
hw_Free_Document
Zwalnia pami zajmowan przez dokument Hyperwave.
int hw_Free_Document( int hw_document )
hw_GetAnchors
Zwraca tablic identyfikatorw obiektw z czami dokumentw z identyfikatorem obiektu $objectID.
array hw_GetAnchors( int connection, int objectID )
hw_GetAnchorsObj
Zwraca tablic rekordw obiektw z czami dokumentw z identyfikatorem obiektu $objectID.
array hw_GetAnchorsObj( int connection, int objectID )
hw_GetAndLock
Zwraca rekord obiektu dla obiektu o identyfikatorze $objectID. Dodatkowo nakada blokad na obiekt,
dziki czemu inni uytkownicy nie maj do niego dostpu do czasu zwolnienia blokady. Patrz rwnie:
hw_Unlock() i hw_GetObject().
string hw_GetAndLock( int connection, int objectID )
hw_GetChildColl
Zwraca tablic identyfikatorw obiektw. Kady z identyfikatorw naley do kolekcji potomnej w
kolekcji o identyfikatorze $objectID. Funkcja nie zwraca dokumentw potomnych. Patrz rwnie:
hw_GetChildren() i hw_GetChildDocColl().
array hw_GetChildColl( int connection, int objectID )
hw_GetChildCollObj
Zwraca tablic rekordw obiektw. Kady z rekordw obiektw naley do kolekcji potomnej w kolekcji o
identyfikatorze $objectID. Funkcja nie zwraca dokumentw potomnych. Patrz rwnie: hw_ChildrenObj() i
hw_GetChildDocCollObj().
array hw_GetChildCollObj( int connection, int objectID )
Dodatek A - Funkcje
238

hw_GetChildDocColl
Zwraca tablic identyfikatorw obiektw dokumentw potomnych w kolekcji. Patrz rwnie:
hw_GetChildren() i hw_GetChildColl().
array hw_GetChldDocColl( int connection, int objectID )
hw_GetChildDocCollObj
Zwraca tablic rekordw obiektw dla dokumentw potomnych w kolekcji. Patrz rwnie:
hw_ChildrenObj() i hw_GetChildCollObj().
array hw_GetChildDocCollObj( int connection, int objectID )
hw_GetObject
Jeeli drugi parametr jest licz cakowit, zwraca rekord obiektu dla obiektu o identyfikatorze $objectID.
Jeeli drugi parametr jest tablic liczb cakowitych, funkcja zwrci tablic rekordw obiektw. W tym przypadku
analizowany jest rwnie trzeci parametr cig zapytania.
array hw_GetObject( int connection, {int,array} objectID, string query )
Cig zapytania posiada nastpujc skadni:
<expr> ::= "(" <expr> ")" |
"!" <expr> | /* Negacja */
<expr> "||" <expr> | /* OR */
<expr> "&&" <expr> | /* AND */
<attribute> <operator> <value>
<attribute> ::= /* dowolna nazwa atrybutu (Tytu, Autor, TypDokumentu ...) */
<operator> ::= "=" | /* rwny */
"<" | /* mniejszy od (porwnanie cigw) */
">" | /* wikszy od (porwnanie cigw) */
"~" /* porwnywanie wyrae regularnych */
Zapytanie pozwala na dalszy wybr odpowiednich obiektw z listy zwracanych obiektw. W
przeciwiestwie do pozostaych funkcji zapyta, to zapytanie moe dziaa na atrybutach bez indeksw. Ilo
zwracanych rekordw obiektw zaley od zapytania i od tego, czy moliwy jest dostp do dokumentu. Patrz
rwnie: hw_GetAndLock() i hw_GetObjectByQuery().
hw_GetObjectByQuery
Przeszukuje wszystkie obiekty na serwerze i zwraca tablic identyfikatorw obiektw. Maksymalna ilo
identyfikatorw jest ograniczona do $max_hits. Jeeli $max_hits ma warto -1, maksymalna ilo zwracanych
identyfikatorw nie jest ograniczona. Zapytanie dziaa jedynie na atrybutach posiadajcych indeksy. Patrz
rwnie: hw_GetObjectByQueryObj().
array hw_GetObjectByQuery( int connection, string query, int max_hits )
hw_GetObjectByQueryColl
Przeszukuje obiekty w kolekcji o identyfikatorze $objectID i zwraca tablic identyfikatorw obiektw.
Maksymalna ilo identyfikatorw jest ograniczona do $max_hits. Jeeli $max_hits ma warto -1, maksymalna
ilo zwracanych identyfikatorw nie jest ograniczona. Zapytanie dziaa jedynie na atrybutach posiadajcych
indeksy. Patrz rwnie: hw_GetObjectByQueryCollObj().
array hw_GetObjectByQueryColl( int connection, int objectID,
string query, int max_hits )
hw_GetObjectByQueryCollObj
Przeszukuje obiekty w kolekcji o identyfikatorze $objectID i zwraca tablic rekordw obiektw.
Maksymalna ilo obiektw jest ograniczona do $max_hits. Jeeli $max_hits ma warto -1, maksymalna ilo
zwracanych obiektw nie jest ograniczona. Zapytanie dziaa jedynie na atrybutach posiadajcych indeksy. Patrz
rwnie: hw_GetObjectByQueryColl().
array hw_GetObjectByQueryCollObj( int connection, int objectID,
string query, int max_hits )
PHP Kompendium wiedzy
239

hw_GetObjectByQueryObj
Przeszukuje wszystkie obiekty na serwerze i zwraca tablic rekordw obiektw. Maksymalna ilo
identyfikatorw jest ograniczona do $max_hits. Jeeli $max_hits ma warto -1, maksymalna ilo zwracanych
identyfikatorw nie jest ograniczona. Zapytanie dziaa jedynie na atrybutach posiadajcych indeksy. Patrz
rwnie: hw_GetObjectByQuery().
array hw_GetObjectByQueryObj( int connection, string query, int max_hits )
hw_GetParents
Zwraca indeksowan tablic identyfikatorw obiektw. Kady identyfikator obiektu jest obiektem
podrzdnym do obiektu o identyfikatorze $objectID.
array hw_GetParents( int connection, int objectID )
hw_GetParentsObj
Zwraca indeksowan tablic rekordw obiektw oraz dodatkowo skorelowan tablic z danymi
statystycznymi o rekordach obiektw. Dodatkowa tablica jest umieszczona w ostatnim elemencie zwracanej
tablicy. Kady z rekordw obiektw jest obiektem podrzdnym do obiektu o identyfikatorze $objectID.
array hw_GetParentsObj( int connection, int objectID )
hw_GetRemote
Zwraca zdalny dokument. Dokumenty zdalne w sensie Hyperwave s dokumentami pobieranymi z
zewntrznych rde. Najczciej dokumentami zdalnymi s strony WWW lub zapytania do baz danych. Aby by
moliwy dostp do zewntrznych rde dokumentw, Hyperwave wprowadza protok Hyperwave Gateway
Interface (HGI), ktry jest podobny do CGI. W chwili obecnej poprzez HGI mona uzyska dostp do serwerw
http, ftp i niektrych baz danych. Wywoanie hw_GetRemote() zwraca dokument pochodzcy ze zdalnego rda
danych. Jeeli chcesz uy tej funkcji, powiniene dobrze zna HGI. Powiniene rwnie rozway uycie PHP
zamiast Hyperwave do komunikacji z zdalnym rdem danych. Dodanie obsugi baz danych poprzez Hyperwave
bdzie bardziej skomplikowane, ni wykonanie tego samego w PHP. Patrz rwnie: hw_GetRemoteChildren().
int hw_GetRemote( int connection, int objectID )
hw_GetRemoteChilden
Zwraca obiekty pochodne do zdalnego dokumentu. Obiektami pochodnymi zdalnego dokumentu s
rwnie zdalne dokumenty. Funkcja ta moe by wykorzystana, jeeli mona ograniczy zapytanie bazy danych.
Jest to opisane w podrczniku Hyperwave Programmers Guide. Jeeli istnieje tylko jeden obiekt pochodny,
funkcja zwraca ten obiekt sformatowany przez HGI. Jeeli istneije wicej ni jeden element pochodny, funkcja
zwraca tablice rekordw obiektw, z ktrych kady by moe moe by wartoci wejciow w kolejnym
wywoaniu funkcji hw_GetRemoteChildren(). Obiekty te s obiektami wirtualnymi i nie istniej w serwerze
Hyperwave, i dlatego nie posiadaj wasnych identyfikatorw. Jeeli zamierzasz wykorzysta t funkcj
powiniene dobrze zna HGI. Powiniene rwnie rozway uycie PHP zamiast Hyperwave do komunikacji z
zdalnym rdem danych. Dodanie obsugi baz danych poprzez Hyperwave bdzie bardziej skomplikowane, ni
wykonanie tego samego w PHP. Patrz rwnie: hw_GetRemote().
hw_GetSrcByDestObj
Zwraca rekordy obiektw wskazujcych na obiekt o identyfikatorze $objectID. Obiekt ten moe by
dokumentem lub zakotwiczeniem. Patrz rwnie: hw_GetAnchors().
array hw_GetSrcByDestObj( int connection, int objectID )
Dodatek A - Funkcje
240

hw_GetText
Zwraca dokument z identyfikatorem $objectID. Jeeli dokument posiada zakotwiczenia, ktre mona do
niego wstawi, zostan one wstawione. Opcjonalny parametr $rootID/$prefix moe by cigiem lub liczb
cakowit. Jeeli jest to liczba, okrela w jaki sposb wstawiane s do dokumentu cza. Wartoci domyln jest
0 i powoduje to utworzenie czy z nazwy i obiektu docelowego cza. Jest to uzyteczne przy tworzeniu aplikacji
WWW. Jeeli cze wskazuje na nazw internet_movie, cze HTML bdzie miao posta <A
HREF="/internet_movie">. Pooenie rda i celu cza jest ignorowane. Bdziesz musia tak ustawi swj serwer
WWW, aby zamienia takie cza na, na przykad /my_script.php3/internet_movie. Skrypt my_script.php3 musi
sprawdzi zawarto $PATH_INFO i odczyta dokument. Wszystkie cza powinny zaczyna si od
/my_script.php3/. Jeeli nie chcesz tego robi, moesz ustawi odpowiednio parametr opcjonalny
$rootID/$prefix na dowolny prefiks. W tym przypadku musi by to cig.
int hw_GetText( int connection, int objectID [, mixed rootID/prefix])
Jeeli $rootID/$prefix jest liczb rn od 0, cze jest tworzone z wszystkich nazw wzgldem biecego
obiektu, zaczynajc od $rootID/$prefix oddzielanych ukonikami. Jeeli na przykad poprzedni dokument
internet_movie jest umieszczony w a-b-c-internet_movie, gdzie znak - jest separatorem hierarchii w serwerze
Hyperwave, a dokument rdowy znajduje si w a-b-d-source, wynikowe cze HTML bdzie miao posta <A
HREF="../c/internet_movie">. Jest to korzystne, jeeli chcesz zapisa ca zawarto serwera na dysk i
odwzorowa hierarchi dokumentw w systemie plikw. Funkcja ta dziaa jedynie dla dokumentw tekstowych.
Nie otwiera ona specjalnego poczenia, wic blokuje na czas przesyu poczenie sterujce.
Patrz rwnie: hw_PipeDocument(), hw_FreeDocument(), hw_Document_BodyTag(), hw_Document_Size() i
hw_Open_Document().
hw_getusername
Zwraca nazw uytkownika poczenia.
string hw_getusername( int connection )
hw_Identify
Autoryzuje uytkownika za pomoc cigw $username i $password. Autoryzacja jest wana jedynie w
biecej sesji. Funkcja nie jest potrzebna zbyt czsto. W wikszoci przypadkw atwiejsz metod autoryzacji
jest otwarcie poczenia. Patrz rwnie: hw_Connect().
hw_InCollections
Sprawdza, czy zbir obiektw (dokumentw lub kolekcji) przekazanych w $object_id_array jest czci
kolekcji przekazanych w $collection_id_array. Jeeli czwarty parametr, $return_collections jest rwny 0,
podzbir identyfikatorw bdcych czci kolekcji (na przykad dokumenty lub kolekcje podrzdne do jednej,
lub wicej kolekcji) jest zwracany w postaci tablicy. Jednak gdy czwarty argument jest rwny 1, zbir kolekcji
posiadajcych co najmniej jeden obiekt w znalezionym podzbiorze obiektw podrzdnych jest zwracany w
postaci tablicy. Opcja ta pozwala na przykad, na wyrnienie czci hierarchii dokumentw, w ktrej zawarte s
wyniki przekazanego zapytania.
array hw_InCollections( int connection, array object_id_array,
array collection_id_array, int return_collections)
hw_Info
Zwraca dane na temat biecego poczenia. Zwracany cig posiada nastpujc posta: <Serwer>,
<Host>, <Port>, <Uytkownik>, <Port na kliencie>, <Zamiana bajtw>.
string hw_Info( int connection )
PHP Kompendium wiedzy
241

hw_InsColl
Wstawia now kolekcj z atrybutami zawartymi w tablicy $object_array, do kolekcji o identyfikatorze
$objectID.
int hw_InsColl( int connection, int objectID, array object_array )
hw_InsDoc
Wstawia nowy dokument z atrybutami zawartymi w $object_record, do kolekcji o identyfikatorze
$parentID. Funkcja wstawia rekord obiektu lub rekord obiektu oraz tekst przekazany w $text, o ile zosta podany.
Jeeli chcesz wstawi dokument dowolnego typy, naley uy funkcji hw_insertdocument(). Patrz rwnie:
hw_InsertDocument() i hw_InsColl().
int hw_InsDoc( int connection, int parentID, string object_record, string 3text )
hw_InsertDocument
Przesya dokument do kolekcji o identyfikatorze $parentID. Dokument musi by wczeniej utworzony za
pomoc funkcji hw_NewDocument(). Naley si upewni, e rekord obiektu posiada co najmniej nastpujce
atrybuty: Type, DocumentType, Title i Name. Przydatne jest ustawienie atrybutu MimeType. Funkcja zwraca
identyfikator obiektu nowego dokumentu, lub False. Patrz rwnie: hw_PipeDocument().
int hw_InsertDocument( int connection, int parent_id, int hw_document )
hw_InsertObject
Umieszcza obiekt na serwerze. Obiekt musi by prawidowym obiektem Hyperwave. Wicej danych na
ten temat znajduje si w dokumentacji HG-CSP.
Uwaga
Jeeli chcesz wstawi zakotwiczenie atrybut position musi by zawsze ustawiony na warto pocztkow, kocow lub invisible.
Pozycje niewidoczne s wymagane, jeeli opis ni ma odpowiedniego cza do tekstu opisu.
Patrz rwnie: hw_PipeDocument(), hw_InsertDocument(), hw_InsDoc() i hw_InsColl().
int hw_InsertObject( int connection, string object_rec, string parameter )
hw_mapid
Mapuje identyfikator globalnego obiektu na dowolnym serwerze Hyperwave, nawet jeeli nie wykonano
podczenia do niego za pomoc hw_connect(), do identyfikatora obiektu wirtualnego. Ten obiekt wirtualny moe
by uywany identycznie, jak kady inny identyfikator obiektu, na przykad do pobrania rekordu obiektu za
pomoc hw_getobject(). Identyfikator serwera jest pierwsz czci globalnego identyfikatora obiektu (GOid) i w
chwili obecnej jest to numer IP w postaci liczby.
Uwaga
Aby uy tej funkcji naley ustawi znacznik F_DISTRIBUTED, co obecnie mona wykona jedynie w czasie kompilacji pliku
hg_comm.c. Nie jest to wykonywane domylnie. Naley zapozna si z komentarzami na pocztku pliku hg_comm.c.
int hw_mapid( int connection, int server_id, int object_id )
hw_Modifyobject
Polecenie to pozwala na usunicie, dodanie lub zmian poszczeglnych atrybutw rekordu obiektu. Obiekt
jest okrelony za pomoc identyfikatora $object_to_change. Pierwsza tablica, $remove, jest list atrybutw do
usunicia. Druga tablica, $add, jest list atrybutw ktre naley doda do obiektu. W celu zmiany atrybutu, naley
usun stary atrybut i doda nowy. Funkcja hw_Modifyobject() zawsze najpierw usuwa stare atrybuty a potem
dodaje nowe chyba, e wartoci atrybutw do usunicia nie s tablic cigw. Ostatni parametr wskazuje, czy
Dodatek A - Funkcje
242

operacja ma by wykonana w sposb rekurencyjny. Warto 1 oznacza rekurencyjne wywoanie. Jeeli nie jest
moliwa modyfikacja niektrych obiektw, zostan pominite bez adnej informacji o tym fakcie. Funkcja
hw_error() moe nie wskaza adnego bdu, cho nie wszystkie obiekty bd zmienione.
int hw_Modifyobject( int connecion, int object_to_change, array remove,
array add, int mode )
Kluczami w obu tablicach s nazwy atrybutw. Wartoci kadego z elementw tablicy moe by tablica
cigw, cig, bd cokolwiek innego. Jeeli bdzie to tablica, warto atrybutu jest tworzona z klucza, rednika i
wartoci. Wstawienie pustego cigu spowoduje cakowite usunicie atrybutu. Jeeli warto nie jest ani cigiem
ani tablic, ale na przykad liczb, nie bd podejmowane adne operacje na atrybucie. Jest to niezbdne, jeeli
chcesz doda cakowicie nowy atrybut a nie warto istniejcego atrybutu. Jeeli tablica z elementami do
usunicia bdzie zawieraa pusty cig dla atrybutu, usunicie si nie uda. Ustawienie wartoci tego atrybutu na, na
przykad 0, spowoduje, e nie bdzie podjta prba jego usunicia, natomiast dodanie atrybutu powiedzie si.
Jeeli chcesz zmieni atrybut Name z biec wartoci ksiki na artykuy, powiniene utworzy dwie tablice i
wywoa funkcj hw_modifyobject().
Przykad: zmiana atrybutu
// $connect jest istniejcym poczeniem do serwera Hyperwave
// $objid jest identyfikatorem obiektu do zmiany
$remarr = array("Name" => "ksiki");
$addarr = array("Name" => "artykuy");
$hw_modifyobject($connect, $objid, $remarr, $addarr);
Aby usun lub doda par nazwawarto, naley przekaza tablice zawierajce dodawane i usuwane
atrybuty przekazujc w trzecim parametrze pust tablic. Jeeli atrybut jest pierwszym atrybutem o tej nazwie,
naley ustawi wartoci w tablicy atrybutw do usunicia na liczby cakowite.
Przykad: dodanie cakowicie nowego atrybutu
// $connect jest istniejcym poczeniem do serwera Hyperwave
// $objid jest identyfikatorem obiektu do zmiany
$remarr = array("Name" => 0);
$addarr = array("Name" => "artykuy");
$hw_modifyobject($connect, $objid, $remarr, $addarr);
Uwaga
Atrybuty w wielu jzykach, na przykad Title mog by zmieniane na dwa sposoby. Pierwszym sposobem jest wpisywanie wartoci
atrybutw w postaci jzyk:tytu, lub przekazywanie tablicy z elementami dla kadego jzyka zapisanymi w identyczny sposb jak
poprzednio. Poprzedni przykad moe by zapisany w nastpujcy sposb:
Przykad: zmiana atrybutu Title
$remarr = array("Title" => "en:Books");
$addarr = array("Title" => "en:Articles");
$hw_modifyobject($connect, $objid, $remarr, $addarr);
lub
Przykad: zmiana atrybutu Title
$remarr = array("Title" => array("en" => "Books"));
$addarr = array("Title" => array("en" => "Articles", "ge"=>"Artikel");
$hw_modifyobject($connect, $objid, $remarr, $addarr);
W przykadzie tym zostanie usunity angielski tytu Books i dodany tytu angielski Articles i niemiecki
Artikel.
Przykad: usuwanie atrybutu
$remarr = array("Title" => "");
$addarr = array("Title" => "en:Articles");
$hw_modifyobject($connect, $objid, $remarr, $addarr);
Uwaga
Wykonanie poprzedniego przykadu spowoduje usunicie wszystkich atrybutw o nazwie Title i dodanie nowego atrybutu Title. Jest to
wygodne, jeeli chcesz usuwa atrybuty w sposb rekurencyjny. Jeeli chcesz usun wszystkie atrybuty o zadanej nazwie, musisz
przekaza pusty cig jako warto atrybutu. Jedynie atrybuty Title, Description i Keyword prawidowo obsuguj prefiksy jzykw.
Jeeli atrybut nie posiada prefiksu jzyka, uyty zostanie prefiks xx. Atrybut Name ma specjalne znaczenie; w niektrych przypadkach
nie jest moliwe jego cakowite usunicie. Otrzymasz wtedy komunikat bdu Change of base attribute (nie jest jasna przyczyna tego
bdu). Dlatego zawsze musisz dodawa nowy atrybut Name przed usuniciem starego.
Uwaga
PHP Kompendium wiedzy
243
Nie musisz otacza wywoania tej funkcji wywoaniami hw_getandlock() i hw_unlock(). Funkcja hw_modifyobject() robi to
samodzielnie. Zwraca True w przypadku pomylnego wykonania i False w przypadku bdu.

hw_Mv
Przenosi obiekt o identyfikatorze podanym w drugim parametrze z kolekcji i identyfikatorze $source do
kolekcji o identyfikatorze $destination. Jeeli identyfikator kolekcji docelowej wynosi 0, obiekt jest usuwany ze
rdowej kolekcji. Jeeli jest to ostatni egzemplarz obiektu, zostanie on usunity. Jeeli chcesz usun wszystkie
wystpienia za pomoc jednego wywoania, naley uy funkcji hw_deleteobject(). Zwracana warto jest
iloci przeniesionych obiektw. Patrz rwnie: hw_cp() i hw_deleteobject().
int hw_Mv( int connection, array object_id_array, int souce_id, int destination_id )
hw_New_Document
Zwraca nowy dokument Hyperwave. Zawarto dokumentu jest przekazana w parametrze $document_data,
natomiast rekord obiektu w $object_record. Wielko danych musi by przekazana w parametrze
$document_size. Funkcja ta nie wstawia dokumentu do serwera Hyperwave. Patrz rwnie: hw_FreeDocument(),
hw_Document_Size(), hw_Document_BodyTag(), hw_Output_Document() i hw_InsertDocument().
int hw_new_document (string object_record, string document_data, int document_size)
hw_Objrec2Array
Konwertuje $object_record na tablic obiektw. Kluczami wynikowej tablicy s nazwy atrybutw.
Atrybuty wielowartociowe, takie jak Title, w rnych jzykach tworz wasne tablice. Kluczami w tych tablicach
czci stojce z lewej strony dwukropka. Cz ta musi mie dwa znaki. Inne wartoci wielowartociowe nie
posiadajce prefiksw tworz indeksowan tablic. Jeeli nie podany zosta parametr opcjonalny, atrybuty Title,
Description i Keyword s traktowane jako atrybuty jzyka,, natomiast atrybuty Group, Parent i HtmlAttr s
traktowane jako wartoci wielowartociowe bez prefiksu. Przekazujc tablice zawierajca typy kadego z
argumentw mona zmieni to zachowanie. Tablica jest tablic asocjacyjn z nazw atrybutu jako klucze i
wartociami bdcymi jedn z wartoci HW_ATTR_LANG lub HW_ATTR_NONE. Patrz rwnie: hw_array2objrec().
array hw_objrec2array (string object_record [, array format])
hw_Output_Document
Drukuje dokument bez znacznika BODY. Dla zgodnoci z poprzednimi wersjami mona uy nazwy
hw_OutputDocument(), ale jest to posta przestarzaa.
int hw_output_document (int hw_document)
hw_pConnect
W przypadku powodzenia zwraca numer poczenia, lub False w przypadku, gdy poczenie nie moe by
wykonane. Otwiera trwae poczenie do serwera Hyperwave. Kady z argumentw oprcz numeru portu,
powinien by cigiem znakw. Argumenty $username i $password s opcjonalne. W takim przypadku nie jest
wykonywana autoryzacja na serwerze. Jest to zblione do korzystania z konta gocia. Funkcja zwraca numer
poczenia, ktry jest przekazywany do wszystkich funkcji Hyperwave. Mona mie kilka jednoczenie otwartych
trwaych pocze. Patrz rwnie: hw_Connect().
int hw_pconnect (string host, int port, string username, string password)
hw_PipeDocument
Zwraca dokument Hyperwave o identyfikatorze obiektu $objectID. Jeeli dokument posiada moliwe do
wstawienia zakotwiczenia, zostan one wstawione. Dokument zostanie przesany poprzez poczenie specjalne,
ktre nie blokuje poczenia sterujcego. Patrz rwnie: hw_GetText(). Wicej informacji na temat wstawiania
czy znajduje si w opisie funkcji hw_FreeDocument(), hw_Document_Size(), hw_Document_BodyTag() i
hw_Output_Document().
int hw_pipedocument (int connection, int objectID)
Dodatek A - Funkcje
244

hw_Root
Zwraca identyfikator obiektu kolekcji korzenia; w chwili obecnej posiada ona warto 0. Kolekcja
potomna tej kolekcji jest gwn kolekcj serwera.
int hw_root ()
hw_Unlock
Odblokowuje dokument, wic uytkownicy maj nw do niego dostp. Patrz rwnie: hw_GetAndLock().
int hw_unlock (int connection, int objectID)
hw_Who
Zwraca tablic z uytkownikami obecnie zalogowanymi na serwerze Hyperwave. Kada pozycja jest
kolejna tablica, zawierajc atrybuty: identyfikator elementu, nazwa, system, pola onSinceDate, onSinceTime,
TotalTime, oraz self. Wartoci self jest 1 jeeli pozycja naley do uytkownika inicjujcego danie.
int hw_who (int connection)
ibase_close
Zamyka poczenie z baz danych InterBase identyfikowane przez identyfikator poczenia zwracany
przez funkcj ibase_connect(). Jeeli identyfikator poczenia jest pominity, funkcja dziaa na ostatnio
otwartym poczeniu. Domylna transakcja w tym poczeniu jest zatwierdzana, natomiast pozostae transakcje s
wycofywane.
int ibase_close ([int connection_id])
ibase_connect
Nawizuje poczenie z serwerem InterBase. Argument $database musi by ciek do pliku bazy danych
na serwerze. Jeeli serwer nie jest serwerem lokalnym, musi by poprzedzony albo cigiem hostname: (TCP/IP),
//hostname (NetBEUI) lub hostname@ (IPX/SPX) w zalenoci od protokou uywanego w tym poczeniu.
Parametry $username i $password mog by pobierane w dyrektywach konfiguracji ibase.default_user i
ibase.default_password. Parametr $charset jest domylnym zestawem znakw dla bazy danych. Parametr
$buffers okrela ilo buforw bazy danych zakadanych na serwerze. Jeeli podane zostanie 0 lub parametr
zostanie opuszczony, serwer zakada domyln dla siebie ilo buforw. Parametr $dialect wybiera domylny
dialekt SQL obowizujcy dla wszystkich wyrae wykonywanych poprzez biece poczenie. Wartoci
domyln jest najwyszy dialekt obsugiwany przez biblioteki klienta. Jeeli ibase_connect() jest wywoywany
po raz drugi z tymi samymi parametrami, nie jest tworzone nowe poczenie. Zamiast tego zwracany jest
identyfikator istniejcego poczenia. Poczenie z serwerem jest zamykane natychmiast po zakoczeniu
wykonywania skryptu, chyba, e wczeniej zostaa wywoana funkcja ibase_close().
int ibase_connect(string database [, string username [, string password
[, string charset [, int buffers [, int dialect [, string role]]]]]])
Przykad: ibase_connect()
<?php
$dbh = ibase_connect ($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query ($dbh, $stmt);
while ($row = ibase_fetch_object ($sth))
{
print $row->email . "\n";
}
ibase_close ($dbh);
?>
Uwaga
Parametry $buffers i $dialect zostay dodane w PHP4-RC2. Dziaaj one jedynie z serwerem InterBase 6 i nowszymi od niego.
Parametr $role dziaa jedynie z InterBase 5 i wyszymi.
PHP Kompendium wiedzy
245
Patrz rwnie: ibase_pconnect().

ibase_execute
Wykonuje zapytanie przygotowane za pomoc ibase_prepare(). W przypadku, gdy to samo zapytanie jest
powtarzane dla rnych parametrw, jest to o wiele bardziej efektywne ni wykorzystanie ibase_query().
int ibase_execute (int query [, int bind_args])
Przykad: ibase_execute()
<?php
$updates = array(
1 => 'Eric',
5 => 'Filip',
7 => 'Larry'
);

$query = ibase_prepare("UPDATE FOO SET BAR = ? WHERE BAZ = ?");

while (list($baz, $bar) = each($updates)) {
ibase_execute($query, $bar, $baz);
}
?>
ibase_fetch_object
Pobiera wiersz w postaci pseudoobiektu korzystajc z $result_id zwrconego przez ibase_query() lub
ibase_execute().
object ibase_fetch_object (int result_id)
Przykad: ibase_fetch_object()
<php
$dbh = ibase_connect ($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query ($dbh, $stmt);
while ($row = ibase_fetch_object ($sth)) {
print $row->email . "\n";
}
ibase_close ($dbh);
?>
Patrz rwnie: ibase_fetch_row().


ibase_fetch_row
Zwraca kolejny wiersz korzystajc z identyfikatora wyniku zwracanego przez funkcj ibase_query().
array ibase_fetch_row (int result_identifier)
ibase_free_query
Zwalnia zapytanie przygotowane przez ibase_prepare().
int ibase_free_query (int query)
ibase_free_result
Zwalania wynik tworzony przez ibase_query().
int ibase_free_result (int result_identifier)
ibase_num_fields
Zwraca liczb okrelajc ilo pl w wyniku zapytania. Patrz rwnie ibase_field_info().
Uwaga
Funkcja ibase_num_fields() nie dziaa jeszcze w PHP 4.
Przykad: ibase_num_fields()
Dodatek A - Funkcje
246

<?php
$dbh = ibase_connect ($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query ($dbh, $stmt);

if (ibase_num_fields($sth) > 0) {
while ($row = ibase_fetch_object ($sth)) {
print $row->email . "\n";
}
} else {
die ("No Results were found for your query");
}

ibase_close ($dbh);
?>
ibase_pconnect
Dziaa bardzo podobnie do ibase_connect() z dwiema powanymi rnicami. Po pierwsze, w czasie
doczania do serwera funkcja prbuje odszuka istniejce (trwae) poczenie otwarte z tym samym zestawem
argumentw. Jeeli zostanie znalezione takie poczenie, jego identyfikator jest zwracany i nie jest tworzone
nowe poczenie. Po drugie, Poczenie do serwera InterBase nie jest zamykane po zakoczeniu wykonywania
skryptu. Poczenie pozostaje otwarte do wykorzystania w przyszoci (ibase_close() nie zamyka pocze
utworzonych przez ibase_pconnect()). Poczenie takie nazywane jest z tego powodu poczeniem trwaym. Opis
parametrw przekazywanych do funkcji jest zamieszczony przy opisie funkcji ibase_connect(); s one
identyczne.
int ibase_pconnect(string database [, string username [, string password
[, string charset [, int buffers [, int dialect [, string role]]]]]])
ibase_prepare
Przygotowuje zapytanie dodajc obsug parametrw doczanych pniej za pomoc funkcji
ibase_execute().
int ibase_prepare ([int link_identifier, string query])
ibase_query
Wykonuje zapytanie na basie danych InterBase i zwraca identyfikator wyniku wykorzystywany w
funkcjach ibase_fetch_row(), ibase_fetch_object(), ibase_free_result() i ibase_free_query(). Mimo, e
funkcja ta obsuguje doczanie zmiennych do parametrw, uywanie tego udogodnienia w tej wanie funkcji nie
ma wielkiego sensu. Przykad uycia funkcji jest umieszczony przy opisie funkcji ibase_prepare() i
ibase_execute().
int ibase_query ([int link_identifier, string query [, int bind_args]])
ibase_timefmt
Ustala format znacznika czasu, daty i czasu dla kolumn tych typw zwracanych zapytaniach.
Wewntrznie kolumny s formatowane przez funkcj C strftime(), wic wszelkie szczegy na temat cigu
formatujcego znajduj si w jej dokumentacji. Parametr $columntype jest jedn ze staych IBASE_TIMESTAMP,
IBASE_DATE i IBASE_TIME. Jeeli zostanie ion opuszczony, przyjmowana jest warto IBASE_TIMESTAMP w celu
zapewnienia zgodnoci z poprzednimi wersjami.
int ibase_timefmt (string format [, int columntype])
Przykad: ibase_timefmt()
<?php
// kolumny InterBase 6 typu TIME bd zwracane w postaci
// '05 godzin 37 minut'.
ibase_timefmt("%H godzin %M minut", IBASE_TIME);
?>
Mona rwnie ustawi domylny format za pomoc dyrektyw konfiguracji PHP ibase.timestampformat,
ibase.dateformat i ibase.timeformat. Parametr $columntype zosta dodany w PHP 4.0. Ma on znaczenie jedynie
w wersjach InterBase 6 i wyszych.
PHP Kompendium wiedzy
247

Uwaga
W PHP 4.0 wprowadzono zmian, ktra powodowaa niezgodno z poprzednimi wersjami, zmieniajc nazw dyrektywy konfiguracji
ibase.timeformat na ibase.timestampformat oraz dodane zostay dyrektywy ibase.dateformat i ibase.timeformat w
celu ulepszenia dziaania funkcji.
icap_close
Zamyka podany strumie icap.
int icap_close (int icap_stream [, int flags])
icap_delete_event
Usuwa zdarzenie z kalendarza o identyfikatorze podanym w $uid. Zwraca True.
string icap_delete_event (int sream_id, int uid)
icap_fetch_event
Pobiera zdarzenie okrelone przez $event_id ze strumienia kalendarza.
int icap_fetch_event (int stream_id, int event_id [, int options])
Zwraca obiekt zdarzenia zawierajcy nastpujce atrybuty:
int id Identyfikator zdarzenia.
int public True jeeli zdarzenie jest publiczne lub False, gdy jest prywatne.
string category Cig zawierajcy kategori zdarzenia.
string title Cig zawierajcy tytu zdarzenia.
string description Cig z opisem zdarzenia .
int alarm Ilo minut przed zdarzeniem gdy wysyane jest powiadomienie lub alarm.
object start Obiekt zawierajcy dat i czas.
object end Obiekt zawierajcy dat i czas.
Wszystkie pozycje daty i czasu zawieraj nastpujce atrybuty:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
icap_list_alarms
Zwraca tablic z identyfikatorami zdarze ktre wyl alarm o podanej godzinie. Funkcja
icap_list_alarms() wymaga podania daty i czasu oraz strumienia kalendarza. Zwracana jest tablica
identyfikatorw zdarze z aktywnym alarmem o podanej godzinie.
int icap_list_alarms (int stream_id, array date, array time)
Wszystkie pozycje z dat i czasem zawieraj nastpujce atrybuty:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
Dodatek A - Funkcje
248

icap_list_events
Zwraca tablic identyfikatorw zdarze pomidzy dwiema datami. Funkcja icap_list_events() pobiera
ze strumienia identyfikatory zdarze pomidzy data pocztkow i kocow. Zwracana jest tablica identyfikatorw
zdarze pomidzy podanymi datami.
array icap_list_events (int stream_id, int begin_date [, int end_date])
Wszystkie pozycje z dat i czasem zawieraj nastpujce atrybuty:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
icap_open
W przypadku powodzenia zwraca strumie ICAP, natomiast w przypadku wystpienia bdu, False.
Funkcja icap_open() otwiera poczenie ICAP do podanego w $calendar magazynu. Jeeli podany jest parametr
opcjonalny $options, jest on rwnie przekazany do otwieranej skrzynki pocztowej.
stream icap_open (string calendar, string username, string password, string options)
icap_snooze
Wcza alarm dla zdarzenia kalendarza okrelonego przez $uid. Zwraca True.
string icap_snooze (int stream_id, int uid)
icap_store_event
Zapisuje zdarzenie w kalendarzu ICAP.
string icap_store_event (int stream_id, object event)
Obiekt zdarzenia zawiera nastpujce atrybuty:
int id Identyfikator zdarzenia.
int public 1 jeeli zdarzenie jest publiczne lub 0, gdy jest prywatne.
string category Cig zawierajcy kategori zdarzenia.
string title Cig zawierajcy tytu zdarzenia.
string description Cig z opisem zdarzenia .
int alarm Ilo minut przed zdarzeniem gdy wysyane jest powiadomienie lub alarm.
object start Obiekt zawierajcy dat i czas.
object end Obiekt zawierajcy dat i czas.
Wszystkie pozycje daty i czasu zawieraj nastpujce atrybuty:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu.
ifxus_close_slob
Usuwa obiekt slob dla podanego w $bid identyfikatora obiektu slob. Zwraca False w przypadku
wystpienia bdu, True w przypadku powodzenia operacji.
int ifxus_close_slob (int bid)
PHP Kompendium wiedzy
249

ifxus_create_slob
Tworzy obiekt slob i otwiera go. Tryby: 1 = LO_RDONLY, 2 = LO_WRONLY, 4 = LO_APPEND, 8 = LO_RDWR, 16 =
LO_BUFFER, 32 = LO_NOBUFFER. Mona rwnie uy staych o nazwach IFX_LO_RDONLY, IFX_LO_WRONLY itd. Zwraca
False w przypadku wystpienia bdu a w przypadku powodzenia, identyfikator obiektu slob.
ifxus_free_slob
Usuwa obiekt slob. Parametr $bid jest identyfikatorem obiektu slob. Zwraca False w przypadku
wystpienia bdu i True w przeciwnym wypadku.
int ifxus_free_slob (int bid)
ifxus_open_slob
Otwiera obiekt slob. Parametr $bid powinien by identyfikatorem istniejcego obiektu. Tryby: 1 =
LO_RDONLY, 2 = LO_WRONLY, 4 = LO_APPEND, 8 = LO_RDWR, 16 = LO_BUFFER, 32 = LO_NOBUFFER. Zwraca False w
przypadku wystpienia bdu a w przeciwnym wypadku identyfikator nowego obiektu slob.
int ifxus_open_slob (long bid, int mode)
ifxus_read_slob
Czyta n bajtw z obiektu slob. Parametr $bid jest identyfikatorem istniejcego obiektu slob, natomiast
$nbytes jest iloci bajtw do przeczytania. Zwraca False w przypadku wystpienia bdu a w przeciwnym
wypadku zwraca cig.
int ifxus_read_slob (long bid, long nbytes)
ifxus_seek_slob
Ustawia biecy plik lub wyszukuje pozycj w otwartym obiekcie slob. Parametr $bid powinien by
identyfikatorem istniejcego obiektu slob. Tryby: 0 = LO_SEEK_SET, 1 = LO_SEEK_CUR, 2 = LO_SEEK_END natomiast
$offset jest przesuniciem w bajtach. Zwraca False w przypadku wystpienia bdu a w przeciwnym wypadku
pozycj w pliku.
int ifxus_seek_slob (long bid, int mode, long offset)
ifxus_tell_slob
Zwraca biec pozycj w pliku lub przesunicie w otwartym obiekcie slob. Parametr $bid powinien by
identyfikatorem istniejcego obiektu slob. Zwraca False w przypadku wystpienia bdu a w przeciwnym
wypadku pozycj w pliku.
int ifxus_tell_slob (long bid)
ifxus_write_slob
Zapisuje zawarto cigu do obiektu slob. Parametr $bid musi by identyfikatorem obiektu slob, natomiast
$content zawiera dane do zapisania. Zwraca False w przypadku wystpienia bdu, w przeciwnym przypadku
ilo zapisanych bajtw.
int ifxus_write_slob (long bid, string content)
ifx_affected_rows
Parametr $result_id powinien by identyfikatorem wyniku zwracanym przez funkcj ifx_query() lub
ifx_prepare(). Zwraca ilo wierszy zmienionych przez zapytanie zwizane z $result_id. W przypadku operacji
wstawienia, zamiany lub usunicia, ilo ta jest prawdziw liczb operacji (sqlerrd[2]). W przypadku operacji
SELECT nie jest dokadn liczb zwracanych wierszy, a jedynie oszacowaniem (sqlerrd[0]). Serwer bazy danych
moe nigdy nie zwrci iloci wierszy zwracanych przez operacj SELECT w tej fazie operacji (zaraz po operacji
Dodatek A - Funkcje
250

PREPARE, po ustaleniu planu wykonania przez optymalizator), poniewa nie rozpocz on odczytywania
zwracanych wierszy. Jest to uyteczna funkcja do ograniczania zapyta do takich, ktre zwracaj rozsdn ilo
wierszy po przygotowaniu zapytania przez ifx_prepare(). Patrz rwnie: ifx_num_rows().
int ifx_affected_rows (int result_id)
Przykad: wykorzystanie funkcji serwera Informix ifx_affected_rows()
$rid = ifx_prepare ("select * from emp
where name like " . $name, $connid);
if (! $rid) {
... bd ...
}
$rowcount = ifx_affected_rows ($rid);
if ($rowcount > 1000) {
printf ("Zapytanie zwraca zbyt duo wierszy: (%d)\n<br>", $rowcount);
die ("Prosz ograniczy zapytanie<br>\n");
}
ifx_blobinfile_mode
Ustawia domylny tryb przechowywania obiektw blob w zapytaniach SELECT. Tryb 0 oznacza
przechowywanie blobw w pamici, natomiast 1, przechowywanie ich w pliku.
void ifx_blobinfile_mode (int mode)
ifx_byteasvarchar
Ustawia domylny tryb zapytaniach SELECT. Tryb 0 powoduje zwracanie identyfikatora blob, natomiast 1,
zwracanie pola varchar z danymi tekstowymi.
void ifx_byteasvarchar (int mode)
ifx_close
Zawsze zwraca True. Funkcja ifx_close() powoduje zamknicie poczenia z baz danych Informix,
skojarzon z podanym identyfikatorem poczenia. Jeeli nie zosta podany identyfikator poczenia, zamykane
jest ostatnio otwarte poczenie.
Uwaga
nie jest to operacja niezbdna, poniewa nietrwae poczenia s zamykane automatycznie po zakoczeniu wykonywania skryptu.
Funkcja ifx_close() nie zamyka pocze trwaych generowanych przez ifx_pconnect().
Patrz rwnie: ifx_connect() i ifx_pconnect().
int ifx_close ([int link_identifier])
Przykad: Zamykanie poczenia z baz danych Informix
$conn_id = ifx_connect ("mydb@ol_srv", "itsme", "mypassword");
... potrzebne zapytania ...
ifx_close($conn_id);
ifx_connect
Zwraca identyfikator poczenia lub false w przypadku wystpienia bdu. Funkcja ifx_connect()
nawizuje poczenie z serwerem Informix. Wszystkie argumenty s opcjonalne i w przypadku opuszczenia
ktrego z nich, z pliku konfiguracyjnego pobierane s wartoci domylne, ifx.default_host zawiera nazw
serwera biblioteki Informixa korzystaj ze zmiennej rodowiskowej INFORMIXSERVER), ifx.default_user zawiera
nazw uytkownika a ifx.default_password zawiera domylne haso (jeeli nie jest zdefiniowana to bez hasa).
Jeeli drugi raz wywoano funkcj ifx_connect() z tymi samymi argumentami, nie jest nawizywane nowe
poczenie. Zamiast tego zwracany jest identyfikator istniejcego poczenia. Poczenie nie jest zamykane po
zakoczeniu wykonywania skryptu lub po wywoaniu funkcji ifx_close(). Patrz rwnie: ifx_pconnect() i
ifx_close().
int ifx_connect (string [database], string [userid], string [password])
Przykad: Podczenie do bazy Informix
$conn_id = ifx_connect ("mydb@ol_srv", "itsme", "mypassword");
PHP Kompendium wiedzy
251

ifx_copy_blob
Tworzy kopi podanego obiektu blob. Parametr $bid jest identyfikatorem obiektu blob. Zwraca False w
przypadku bdu, a w przeciwnym wypadku identyfikator nowego obiektu blob.
int ifx_copy_blob (int bid)
ifx_create_blob
Tworzy obiekt blob. Zwraca False w przypadku bdu, a w przeciwnym wypadku identyfikator nowego
obiektu blob.
int ifx_create_blob (int type, int mode, string param)
Parametr $type: 1 = TEXT, 0 = BYTE
Parametr $mode: 0 = obiekt blob jest przechowywany w pamici, 1 = obiekt blob jest przechowywany w
pliku.
Parametr $param: Jeeli tryb=0 jest to wskanik na zawarto, jeeli tryb=1, wskanik na strumie pliku.
ifx_create_char
Tworzy obiekt znakowy. Parametr $param powinien zawiera zawarto obiektu.
int ifx_create_char (string param)
ifx_do
Zwraca True gdy operacja si powioda i False w przypadku bdu. Wykonuje uprzednio przygotowane
zapytanie i otwiera dla niego kursor. W przypadku wystpienia bdu nie zwalnia $result_id. Dla zapyta innych
od SELECT ustawia rwnie waciw liczb zmienionych wierszy, ktr mona odczyta za pomoc
ifx_affected_rows(). Patrz rwnie ifx_prepare().
int ifx_do (int result_id)
ifx_error
Kody bdw serwera Informix (SQLSTATE i SQLCODE) s formatowane nastpujco:
x [SQLSTATE = aa bbb SQLCODE=cccc]
Gdy x jest spacj, oznacza to brak bdu.
E bd
N koniec danych
W ostrzeenie
? niezdefiniowany
string ifx_error (void)
Jeeli znak x jest czymkolwiek poza spacj, SQLSTATE i SQLCODE dokadniej opisuj bd. Opis
SQLSTATE i SQLCODE mona znale w podrczniku do serwera Informix. Zwraca jeden znak okrelajcy
wynik wyraenia oraz zarwno warto SQLSTATE jak i SQLCODE zwizane z ostatnio wykonywanym
wyraeniem SQL. Format tego cigu jest nastpujcy: (znak) [SQLSTATE=(dwa znaki) (trzy znaki)
SQLCODE=(jeden znak)]. Pierwszym znakiem moe by spacja (sukces), W (wyraenie wygenerowao
ostrzeenia), E (zdarzy si bd w czasie wykonywania wyraenia) lub N (wyraenie nie zwrcio adnych
danych). Patrz rwnie: ifx_errormsg().
ifx_erormsg
Zwraca komunikat serwera Informix opisujcy ostatni bd w serwerze lub gdy podano warto
opcjonalnego parametru $errorcode, komunikat zwizany z podanym numerem bdu. Patrz rwnie:
idx_error().
string ifx_errormsg ([int errorcode])
Przykad: ifx_errormsg()
printf("%s\n<br>", ifx_errormsg(-201));
Dodatek A - Funkcje
252

ifx_fetch_row
Zwraca tablic asocjacyjn zawierajca odczytany wiersz, lub False jeeli nie ma nastpnego wiersza.
Kolumny blob s zwracane w postaci numerycznych identyfikatorw blob, ktre mona uy w funkcji
ifx_get_blob(), lub jeeli zostay wywoane funkcje ifx_textasvarchar(1) lub ifx_byteasvarchar(1), pola blob
s zwracane w postaci cigw znakw. W przypadku wystpienia bdu zwraca False. Parametr $result_id musi
by prawidowym identyfikatorem wyniku zwracanym przez ifx_query() lub ifx_prepare() (tylko dla zapyta
SELECT). Opcjonalny parametr $position wskazuje na rodzaj operacji na kursorze. Moe by to NEXT, PREVIOUS,
CURRENT, FIRST, LAST lub liczba. Jeeli podana zostanie liczba, odczytywany jest wiersz o podanym numerze. Jest
to parametr opcjonalny stosowany tylko dla kursorw typu SCROLL.
array ifx_fetch_row (int result_id [, mixed position])
Funkcja ifx_fetch_row() odczytuje jeden wiersz danych z wyniku zwizanego z podanym
identyfikatorem wyniku. Wiersz jest zwracany w postaci tablicy. Kada kolumna wyniku jest przechowywana w
osobnej komrce tablicy, ktrej kluczem jest nazwa kolumny. Kolejne wywoania ifx_fetch_row() zwracaj
kolejne wiersze wyniku lub False, gdy nie ma ju kolejnych wierszy.
Przykad: Odczyt wierszy wyniku
$rid = ifx_prepare ("select * from emp where name like " . $name,
$connid, IFX_SCROLL);
if (! $rid) {
... error ...
}
$rowcount = ifx_affected_rows($rid);
if ($rowcount > 1000) {
printf ("Zapytanie zwraca zbyt duo wierszy: (%d)\n<br>", $rowcount);
die ("Prosz ograniczy zapytanie<br>\n");
}}
if (! ifx_do ($rid)) {
... error ...
}
$row = ifx_fetch_row ($rid, "NEXT");
while (is_array($row)) {
for(reset($row); $fieldname=key($row); next($row)) {
$fieldvalue = $row[$fieldname];
printf ("%s = %s,", $fieldname, $fieldvalue);
}
printf("\n<br>");
$row = ifx_fetch_row ($rid, "NEXT");
}
ifx_free_result ($rid);
ifx_fieldproperties
Zwraca tablic asocjacyjn z nazwami pl jako kluczami i waciwociami pl SQL dla wyniku zapytania
okrelonego przez $result_id, jako danymi. W przypadku wystpienia bdu zwraca False. Zwraca waciwoci
SQL serwera Informix w postaci tablicy asocjacyjnej, dla kadego pola zwracanego przez zapytanie. Waciwoci
te s zapisywane jako SQLTYPE:dugo:dokadno:skala:ISNULLABLE, gdzie SQLTYPE jest typem Informixa,
np.: SQLVCHAR, natomiast ISNULLABLE moe mie warto Y lub N.
array ifx_fieldproperties (int result_id)
Przykad: waciwoci pl SQL serwera Informix
$properties = ifx_fieldproperties ($resultid);
if (! isset($properties)) {
... bd ...
}
for ($i = 0; $i < count($properties); $i++) {
$fname = key ($properties);
printf ("%s:\t typ = %s\n", $fname, $properties[$fname]);
next ($properties);
}
ifx_fieldtypes
Dla wyniku zapytania o identyfikatorze $result_id zwraca tablic asocjacyjn z nazwami pl jako
kluczami i typami pl SQL jako danymi. W przypadku wystpienia bdu zwraca False.
array ifx_fieldtypes (int result_id)
Przykad: Nazwy i typy pl SQL
PHP Kompendium wiedzy
253
types = ifx_fieldtypes ($resultid);

if (! isset ($types)) {
... bd ...
}
for ($i = 0; $i < count($types); $i++) {
$fname = key($types);
printf("%s :\t typ = %s\n", $fname, $types[$fname]);
next($types);
}
ifx_free_blob
Usuwa obiekt blob o podanym identyfikatorze $bid. W przypadku wystpienia bdu zwraca False, w
przeciwnym wypadku True.
int ifx_free_blob (int bid)
Dla zapyta INSERT, UPDATE i DELETE zwracane wartoci s ustawiane przez serwer po wykonaniu
zapytania. Pozwala to odczyta ilo wierszy zmienionych przez zapytanie oraz numer kolejny wstawionego
wiersza. W przypadku wyrae SELECT, wartoci te s ustawiane po wykonaniu operacji PREPARE. Pozwala to na
odczytanie przewidywanej iloci wierszy wyniku. Wykorzystanie tej funkcji pozwala na zmniejszenei narzutu
czasowego na wykonanie zapytania select dbinfo('sqlca.sqlerrdx') i odczytanie wartoci zapisanych w
odpowiednim momencie przez sterownik bazy Informix.
ifx_free_char
Usuwa obiekt znakowy o podanym identyfikatorze $bid. W przypadku wystpienia bdu zwraca False, w
przeciwnym wypadku True.
int ifx_free_char (int bid)
ifx_free_result
Dla identyfikatora wyniku $result_id zwalnia zasoby przydzielone dla zapytania. W
przypadku wystpienia bdu zwraca False.
int ifx_free_result (int bid)
ifx_getsqlca
Zwraca pseudo-wiersz (tablic asocjacyjn) z wartociami sqlca.sqlerrd[0] ... sqlca.sqlerrd[5] po
skojarzeniu zapytania z $result_id. Parametr $result_id musi by prawidowym identyfikatorem wyniku
zwracanym przez ifx_query() lub ifx_prepare().
array ifx_getsqlca (int result_id)
Przykad: Odczytywanie wartoci sqlca.sqlerrd[x]
/* zakadamy, e pierwsza kolumna 'sometable' jest numerem seryjnym rekordu */
$qid = ifx_query("insert into sometable
values (0, '2nd column', 'another column') ", $connid);
if (! $qid) {
... bd ...
}
$sqlca = ifx_getsqlca ($qid);
$serial_value = $sqlca["sqlerrd1"];
echo "Numer seryjny wstawionego wiersza wynosi: " . $serial_value<br>\n";
ifx_get_blob
Zwraca zawarto obiektu blob o podanym identyfikatorze obiektu $bid.
int ifx_get_blob (int bid)
ifx_get_char
Zwraca zawarto obiektu znakowego o podanym identyfikatorze obiektu $bid.
int ifx_get_char (int bid)
Dodatek A - Funkcje
254

ifx_htmltbl_result
Zwraca ilo odczytanych wierszy, lub False w przypadku wystpienia bdu. Formatuje wiersze wyniku
o identyfikatorze $result_id do postaci tabeli HTML. Drugim opcjonalnym parametrem funkcji jest cig
atrybutw znacznika <TABLE>.
int ifx_htmltbl_result (int result_id [, string html_table_options])
ifx_nullformat
Ustawia domyln warto wartoci NULL po odczytaniu wiersza. Tryb 0 powoduje zwracanie "" a tryb 1
zwracanie "NULL".
void ifx_nullformat (int mode)
ifx_num_fields
Zwraca ilo kolumn zapytania o identyfikatorze $result_id lub False w przypadku wystpienia bdu. Po
przygotowaniu lub wykonaniu zapytania wywoanie to pozwala na odczytanie iloci kolumn w zapytaniu.
int ifx_num_fields (int result_id)
ifx_num_rows
Zwraca ilo wierszy odczytanych do tej pory z wyniku zapytania $result_id, po wykonaniu ifx_query()
lub ifx_do().
int ifx_num_rows (int result_id)
ifx_pconnect
Zwraca dodatni identyfikator trwaego poczenia do serwera Informix lub False w przypadku wystpienia
bdu. Funkcja ifx_pconnect() dziaa bardzo podobnie do ifx_connect() z dwoma wyjtkami. Funkcja dziaa
identycznie jak ifx_connect(), jeeli PHP nie dziaa jako modu Apache. Po pierwsze, w czasie poczenia
funkcja prbuje znale cze (trwae) otwarte do tego samego serwera z identycznym uytkownikiem i hasem.
Jeeli zostanie znalezione takie poczenie, zamiast otwierania nowego poczenia, zwracany jest identyfikator
istniejcego poczenia. Po drugie, poczenie z serwerem SQL nie jest zamykane po zakoczeniu wykonywania
skryptu. Zamiast tego cze pozostanie otwarte do wykorzystania w przyszoci (ifx_close() nie zamyka czy
zestawionych za pomoc ifx_pconnect()). Z tego powodu ten typ cza nazywany jest trwaym. Patrz rwnie:
ifx_connect().
int ifx_pconnect ([string database [, string userid [, string password]]])
ifx_query
Zwraca identyfikator wyniku lub w przypadku wystpienia bdu warto False. Identyfikator ten jest
uywany przez inne funkcje do pobrania wynikw dziaania zapytania. Ustawia jest warto okrelajca ilo
wierszy zwracanych przez zapytanie, ktr mona odczyta przez wywoanie ifx_affected_rows(). Funkcja
ifx_query() wysya zapytanie do bazy danych okrelanej przez podany identyfikator poczenia. Jeeli nie
zostanie podany identyfikator poczenia, operacja jest wykonywana na ostatnio otwartym poczeniu. Jeeli nie
istnieje otwarte poczenie, funkcja prbuje je ustanowi, identycznie jak funkcja ifx_connect() i nastpnie
wykorzystuje to poczenie. Wykonuje zapytanie $query na poczeniu $conn_id. W przypadku zapyta SELECT
deklarowany i otwierany jest kursor. Opcjonalny parametr $cursor_type pozwala na utworzenie kursora typu
SCROLL lub (oraz) HOLD. Jest to maska bitowa, ktra moe przyjmowa wartoci IFX_SCROLL, IFX_HOLD lub
jednoczenie obie wartoci. Zapytania inne ni SELECT wykonywane s w trybie natychmiastowym. IFX_SCROLL i
IFX_HOLD s staymi symbolicznymi i nie naley ich zapisywa w apostrofach. Jeeli nie podasz tego parametru,
otwierany jest zwyky kursor sekwencyjny. Dla dowolnego typu zapytania zapamitywana jest ilo wierszy
bdcych wynikiem zapytania (rzeczywista lub szacowana), ktr mona odczyta za pomoc funkcji
ifx_affected_rows().
int ifx_query (string query [, int link_identifier [, int cursor_type,
PHP Kompendium wiedzy
255

mixed [blobidarray]]])
Jeeli w zapytaniu UPDATE wystpuje kolumna BLOB (BYTE lub TEXT), mona doda parametr $blobidarray,
zawierajcy odpowiednie identyfikatory blob, i powiniene zamieni te kolumny znakiem ? w tekcie zapytania.
Jeeli zawarto kolumny TEXT (lub BYTE) pozwala na to, mona wywoa funkcje ifx_textasvarchar(1) i
ifx_byteasvarchar(1). Pozwoli to na traktowanie kolumn TEXT (lub BYTE) w zapytaniach SELECT, tak, jakby bya
to zwyka (cho duga) kolumna VARCHAR, i nie przejmowa si identyfikatorami obiektw blob. Wywoujc
ifx_textasvarchar(0) i ifx_byteasvarchar(0) (domylna sytuacja) zapytania SELECT kolumny BLOB bd
zwracane jako identyfikatory obiektw blob (wartoci numeryczne). Majc taki identyfikator mona pobra
zawarto kolumny BLOB za pomoc funkcji obsugujcych bloby. Patrz rwnie: ifx_connect().
Przykad: Wywietlenie wszystkich wierszy tabeli orders jako tabeli html
ifx_textasvarchar(1); // uycie "trybu tekstowego" do blobw
$res_id = ifx_query("select * from orders", $conn_id);
if (! $res_id) {
printf("Nie mona wykona zapytania : %s\n<br>%s<br>\n", ifx_error());
ifx_errormsg();
die;
}
ifx_htmltbl_result($res_id, "border=\"1\"");
ifx_free_result($res_id);

Przykad: Wstawienie kilku wierszy do tabeli catalog
// utworzenie identyfikatorw blobw dla kolunm byte i text
$textid = ifx_create_blob(0, 0, "Kolumna Text w pamici!");
$byteid = ifx_create_blob(1, 0, "Kolumna Byte w pamici");
// zapamitanie identyfikatorw blob w tablicy blobid
$blobidarray[] = $textid;
$blobidarray[] = $byteid;
// wykonanie zapytania
$query = "insert into catalog (stock_num, manu_code, " .
"cat_descr,cat_picture) values(1,'HRO',?,?)";
$res_id = ifx_query($query, $conn_id, $blobidarray);
if (! $res_id) {
... bd ...
}
// zwonienie identyfikatora wyniku
ifx_free_result($res_id);
ifx_textasvarchar
Ustawia domylny tryb tekstowy dla zapyta SELECT. Tryb 0 powoduje zwracanie identyfikatorw blob,
natomiast tryb 1 powoduje zwracanie zawartoci jako tekstu.
void ifx_textasvarchar (int mode)
ifx_update_blob
Uaktualnia zawarto obiektu blob dla podanego identyfikatora $bid. Parametr $content jest cigiem
zawierajcym nowe dane. Zwraca False w przypadku bdu a w przeciwnym przypadku True.
ifx_update_blob (int bid, string content)
ifx_update_char
Uaktualnia zawarto obiektu znakowego dla podanego identyfikatora $bid. Parametr $content jest
cigiem zawierajcym nowe dane. Zwraca False w przypadku bdu a w przeciwnym przypadku True.
ifx_update_char (int bid, string content)
ignore_user_abort
Funkcja ta ustawia znacznik, czy klient moe spowodowa przerwanie wykonywania skryptu. Zwraca
wczeniejsze ustawienie i moe by wywoana bez argumentw w celu sprawdzenia biecego ustawienia, bez
jego zmiany.
int ignore_user_abort ([int setting])
Dodatek A - Funkcje
256

ImageArc
Rysuje fragment elipsy o rodku o wsprzdnych $cx, $cy (lewy grny rg to 0,0) na rysunku
reprezentowanym przez $im. Parametry $w i $h okrelaj szeroko i wysoko elipsy, natomiast punkty
pocztkowe i kocowe s okrelane w stopniach podawanych w argumentach $s i $e.
int ImageArc (int im, int cx, int cy, int w, int h, int s, int e, int col)
ImageChar
Rysuje pierwszy znak w $c na rysunku okrelonym przez $id. Lewy grny rg litery znajduje si na
wsprzdnych $x, $y (lewy grny rg to 0,0), kolor to $col. Jeeli $font jest 1, 2, 3, 4 lub 5, uywane s
wbudowane czcionki (najwiksza liczba reprezentuje najwiksz czcionk). Patrz rwnie imageloadfont().
int ImageChar (int im, int font, int x, int y, string c, int col)
ImageCharUp
Rysuje pionowo pierwszy znak w $c na rysunku okrelonym przez $id. Lewy grny rg litery znajduje si
na wsprzdnych $x, $y (lewy grny rg to 0,0), kolor to $col. Jeeli $font jest 1, 2, 3, 4 lub 5, uywane s
wbudowane czcionki (najwiksza liczba reprezentuje najwiksz czcionk). Patrz rwnie imageloadfont().
int ImageCharUp (int im, int font, int x, int y, string c, int col)
ImageColorAllocate
Zwraca identyfikator koloru reprezentujcy kolor stworzony z podanych skadnikw RGB. Argument $im
jest wynikiem funkcji imagecreate(). Funkcja ImageColorAllocate() musi by wywoana do stworzenia kadego
koloru, ktry bdzie uywany na rysunku $im.
int imagecolorallocate (int im, int red, int green, int blue)
Przykad
$white = ImageColorAllocate ($im, 255, 255, 255);
$black = ImageColorAllocate ($im, 0, 0, 0);
ImageColorAt
Zwraca indeks koloru piksela o podanych wsprzdnych. Patrz rwnie: ImageColorSet() i
ImageColorsForIndex().
int imagecolorat (int im, int x, int y)
ImageColorClosest
Zwraca indeks koloru, w palecie kolorw rysunku, ktry jest najbliszy podanej wartoci RGB. Odlego
od danego koloru i kolorw istniejcych w palecie jest obliczana tak, jakby wartoci RGB reprezentoway
punkty w przestrzeni trjwymiarowej. Patrz rwnie: ImageColorExact().
int imagecolorclosest (int im, int red, int green, int blue)
ImageColorDeAllocate
Usuwa kolor poprzednio utworzony za pomoc funkcji ImageColorAllocate().
int imagecolordeallocate (int im, int index)
Przykad:
$white = ImageColorAllocate($im, 255, 255, 255);
ImageColorDeAllocate($im, $white);
ImageColorExact
Zwraca indeks podanego koloru w palecie kolorw rysunku. Jeeli kolor nie wystpuje w palecie,
zwracana jest warto -1. Patrz rwnie: ImageColorClosest().
int imagecolorexact (int im, int red, int green, int blue)
PHP Kompendium wiedzy
257

ImageColorResolve
Funkcja gwarantuje zwrcenie indeksu dla podanego koloru. Bdzie to dokadnie identyczny kolor lub
najbliszy mu podobny. Patrz rwnie: ImageColorClosest().
int imagecolorresolve (int im, int red, int green, int blue)
ImageColorSet
Ustawia indeks w palecie kolorw na podany kolor. Jest to przydatne do tworzenia efektw wypeniania
za pomoc palety, bez potrzeby wykonywania wypeniania. Patrz rwnie: ImageColorAt().
bool imagecolorset (int im, int index, int red, int green, int blue)
ImageColorsForIndex
Zwraca tablic asocjacyjn z kluczami red, green i blue, ktre zawieraj odpowiednie wartoci dla
podanego indeksu koloru. Patrz rwnie: ImageColorAt() i ImageColorExact().
array imagecolorsforindex (int im, int index)
ImageColorsTransparent
Ustawia kolor przezroczysty w rysunku $im na $col. Parametr $im jest identyfikatorem zwracanym przez
ImageCreate(), natomiast $col jest identyfikatorem koloru zwracanym przez ImageColorAllocate(). Zwracany
jest identyfikator nowego (lub biecego, jeeli nie podano nowego koloru) koloru przezroczystego.
int imagecolortransparent (int im [, int col])
ImageCopy
Kopiuje fragment rysunku $src_im do $dst_im, rozpoczynajc od wsprzdnych $src_x, $src_y o
szerokoci $src_w i wysokoci $src_h. Zdefiniowany fragment jest kopiowany do docelowego rysunku na
wsprzdne $dst_x i $dst_y.
int ImageCopy (resource dst_im, resource src_im, int dst_x, int dst_y,
int src_x, int src_y, int src_w, int src_h)
ImageCopyResized
Kopiuje prostoktny fragment rysunku do innego rysunku. Parametr $dst_im jest docelowym rysunkiem,
natomiast $src_im to identyfikator rysunku rdowego. Jeeli wsprzdne rda i celu oraz szeroko i
wysoko rni si, stosowane jest odpowiednie przeskalowanie kopiowanego fragmentu. Wsprzdne
wskazuj na lewy grny rg. Funkcja moe by uywana do kopiowania obszarw tego samego rysunku (jeeli
$dst_im jest taki sam jak $src_im), ale gdy obszary te nachodz na siebie, wyniki s nieprzewidywalne.
int ImageCopyResized (resource dst_im, resource src_im, int dstX, int dstY,
int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
ImageCreate
Zwraca identyfikator rysunku wskazujcy na pusty rysunek o rozmiarze $x_size na $y_size.
int imagecreate (int x_size, int y_size)
Przykad: Tworzenie nowego strumienia rysunku GD i tworzenie rysunku.
<?php
header ("Content-type: image/png");
$im = @ImageCreate (50, 100)
or die ("Nie mona zainicjowa nowego strumienia rysunku GD");
$background_color = ImageColorAllocate ($im, 255, 255, 255);
$text_color = ImageColorAllocate ($im, 233, 14, 91);
ImageString ($im, 1, 5, 5, "Prosty tekst przykadowy", $text_color);
ImagePng ($im);
?>
Dodatek A - Funkcje
258

ImageCreateFromGif
Zwraca identyfikator rysunku reprezentujcy rysunek pobrany z pliku o podanej nazwie. Funkcja
ImageCreateFromGif() w przypadku wystpienia bdu zwraca pusty cig. Wywietla rwnie komunikat bdu,
ale niestety jest on wywietlany w przegldarce jako nieprawidowe cze. Aby uatwi uruchamianie mona
zastosowa poniszy przykad, ktry tworzy rysunek GIF z komunikatem bdu.
int ImageCreateFromGif (string filename)
Przykad: Obsuga bdu w czasie tworzenia rysunku (podzikowania dla vic@zymsys.com)
function LoadGif ($imgname) {
$im = @ImageCreateFromGIF ($imgname); /* Prba otwarcia */
if (!$im) { /* Jeeli si nie udao */
$im = ImageCreate (150, 30); /* Tworzenie pustego rysunku */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* Wywietlenie komunikatu bdu */
ImageString($im, 1, 5, 5, "Bd przy adowaniu $imgname", $tc);
}
return $im;
}
Uwaga
Poniewa obsuga GIF zostaa usunita z biblioteki GD od wersji 1.6 funkcja ta nie jest ju dostpna.
ImageCreateFromJPEG
Zwraca identyfikator rysunku reprezentujcy rysunek pobrany z pliku o podanej nazwie. Funkcja
ImageCreateFromJPEG() w przypadku wystpienia bdu zwraca pusty cig. Wywietla rwnie komunikat bdu,
ale niestety jest on wywietlany w przegldarce jako nieprawidowe cze. Aby uatwi uruchamianie mona
zastosowa poniszy przykad, ktry tworzy rysunek JPEG z komunikatem bdu.
int ImageCreateFromJPEG (string filename)
Przykad: Obsuga bdu w czasie tworzenia rysunku (podzikowania dla vic@zymsys.com)
function LoadJPEG ($imgname) {
$im = @ImageCreateFromJPEG ($imgname); /* Prba otwarcia */
if (!$im) { /* Jeeli si nie udao */
$im = ImageCreate (150, 30); /* Tworzenie pustego rysunku */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* Wywietlenie komunikatu bdu */
ImageString($im, 1, 5, 5, "Bd przy adowaniu $imgname", $tc);
}
return $im;
}
ImageCreateFromPNG
Zwraca identyfikator rysunku reprezentujcy rysunek pobrany z pliku o podanej nazwie. Funkcja
ImageCreateFromPNG() w przypadku wystpienia bdu zwraca pusty cig. Wywietla rwnie komunikat bdu,
ale niestety jest on wywietlany w przegldarce jako nieprawidowe cze. Aby uatwi uruchamianie mona
zastosowa poniszy przykad, ktry tworzy rysunek PNG z komunikatem bdu.
Przykad: Obsuga bdu w czasie tworzenia rysunku (podzikowania dla vic@zymsys.com)
function LoadPNG ($imgname) {
$im = @ImageCreateFromPNG ($imgname); /* Prba otwarcia */
if (!$im) { /* Jeeli si nie udao */
$im = ImageCreate (150, 30); /* Tworzenie pustego rysunku */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* Wywietlenie komunikatu bdu */
ImageString($im, 1, 5, 5, "Bd przy adowaniu $imgname", $tc);
}
return $im;
}
PHP Kompendium wiedzy
259

ImageDashedLine
Rysuje na rysunku $im lini przerywan z $x1, $y1 do $x2, $y2 (lewy grny rg to 0,0) o kolorze $col.
Patrz rwnie: ImageLine().
int imagedashedline (int im, int x1, int y1, int x2, int y2, int col)
ImageDestroy
Zwalnia pami zajt przez rysunek $im. Parametr $im jest identyfikatorem rysunku zwracanym przez
funkcj ImageCreate().
int imagedestroy (int im)
ImageFill
Wykonuje wypenianie metod zalewania (flood fill) rysunku $im rozpoczynajc od wsprzdnych $x, $y
(lewy grny rg to 0,0) kolorem $col.
int imagefill (int im, int x, int y, int col)
ImageFilledPolygon
Tworzy wypeniony wielobok na rysunku $im. Parametr $points jest tablic PHP zawierajc wierzchoki
wieloboku, to znaczy $points[0] = x0, $points[1] = y0, $points[2] = x1, $points[3] = y1 i tak dalej. Parametr
$num_points zawiera cakowit ilo wierzchokw.
int imagefilledpolygon (int im, array points, int num_points, int col)
ImageFilledRectangle
Na rysunku $im tworzy wypeniony prostokt o kolorze $col, rozpoczynajc od grnego lewego rogu o
wsprzdnych $x1, $y1, koczc na prawym dolnym rogu o wsprzdnych $x2, $y2. Lewy grny rg rysunku ma
wsprzdne 0,0.
int imagefilledrectangle (int im, int x1, int y1, int x2, int y2, int col)
ImageFillToBorder
Wypenia na rysunku obszar ograniczony kolorem zdefiniowanym w parametrze $border. Punkt
rozpoczcia wypeniania to $x, $y (lewy grny rg to 0,0), kolor wypenienia to $col.
int imagefilltoborder (int im, int x, int y, int border, int col)
ImageFontHeight
Zwraca wysoko znaku w pikselach dla okrelonej czcionki. Patrz rwnie: ImageFontWidth() i
ImageLoadFont().
int imagefontheight (int font)
ImageFontWidth
Zwraca szeroko znaku w pikselach dla okrelonej czcionki. Patrz rwnie: ImageFontHeiht() i
ImageLoadFont().
int ImageFontWidth (int font)
ImageGammaCorrect
Stosuje korekcj gamma na rysunku $im na podstawie wartoci gamma wejciowej $inputgamma i
wyjciowej $outputgamma.
int imagegammacorrect (int im, float inputgamma, float outputgamma)
Dodatek A - Funkcje
260

ImageGIF
Tworzy plik GIF na podstawie rysunku $im. Parametr $im jest identyfikatorem zwracanym przez funkcj
ImageCreate(). Rysunek zostanie zapisany w formacie GIF87a chyba, e rysunek bdzie zawiera kolor
przezroczysty stworzony za pomoc funkcji ImageColorTransparent(). W takim przypadku formatem pliku
bdzie GIF89a. Nazwa pliku jest opcjonalna, jeeli zostanie pominita, utworzony zostanie bezporedni surowy
strumie rysunku. Wysyajc za pomoc funkcji header() typ zawartoci image/gif, mona stworzy skrypt PHP,
ktry bezporednio wysya do przegldarki rysunki GIF.
Uwaga
Poniewa obsuga GIF zostaa usunita z biblioteki GD od wersji 1.6 funkcja ta nie jest ju dostpna.
int imagegif (int im [, string filename])
ImageInterlace
Ustawia i kasuje bit przeplotu. Jeeli $interlace jest rwny 1, rysunek bdzie z przeplotem. Jeeli
$interlace jest 0, przeplot nie zostanie zastosowany. Funkcja zwraca biec warto bitu przeplotu dla rysunku.
int imageinterlace (int im [, int interlace])
ImageJPEG
Tworzy plik JPEG na podstawie rysunku $im. Parametr $im jest identyfikatorem zwracanym przez funkcj
ImageCreate(). Nazwa pliku jest opcjonalna, jeeli zostanie pominita, utworzony zostanie bezporedni surowy
strumie rysunku. Aby opuci nazw pliku i jednoczenie poda warto parametru $quality naley uy
pustego cigu (""). Wysyajc za pomoc funkcji header() typ zawartoci image/jpeg, mona stworzy skrypt
PHP, ktry bezporednio wysya do przegldarki rysunki JPEG.
Uwaga
Obsuga formatu JPEG jest dostpna jedynie, jeeli biblioteka GD jest w wersji 1.8 lub nowszej.
int imagejpeg (int im [, string filename [, int quality]])
ImageLine
Na rysunku $im rysuje lini od $x1, $y1 do $x2, $y2 (lewy grny rg to 0,0) o kolorze $col. Patrz rwnie:
ImageCreate() i ImageColorAllocate().
int imageline (int im, int x1, int y1, int x2, int y2, int col)
ImageLoadFont
aduje czcionk bitmapow zdefiniowan przez uytkownika i zwraca identyfikator czcionki (zawsze
wikszy od 5, wic nie koliduje z wbudowanymi czcionkami). Format pliku jest obecnie binarny, zaleny od
architektury. Oznacza to, e naley generowa pliki czcionek na komputerze z takim samym procesorem, co
komputer na ktrym jest uruchomione PHP. Format pliku jest nastpujcy:
Pozycja
w bajtach
Typ
danych C
Opis
0 3 int
Ilo znakw w pliku czcionek
4 7 int
Warto pierwszego znaku czcionki (czsto 32 dla spacji)
8 11 int
Szeroko kadego znaku w pikselach
12 15 int
Wysoko kadego znaku w pikselach
16
xxx
char
Tablica danych znakowych, jeden bajt na piksel w kadym
znaku, razem (znaki*szeroko*wyskoko) bajtw
Patrz rwnie: ImageFontWidth() i ImageFontHeight().
PHP Kompendium wiedzy
261

int imageloadfont (string file)
ImagePNG
Otwiera strumie GD ($im) w formacie PNG i przesya dane do standardowego wyjcia (zwykle jest to
przegldarka), lub jeeli podana jest nazwa pliku $filename, zapisuje rysunek do pliku.
int imagepng (int im [, string filename])
Przykad:
<?php
$im = ImageCreateFromPng("test.png");
ImagePng($im);
?>
ImagePolygon
Tworzy wielobok na rysunku $im. Parametr $points jest tablic PHP zawierajc wierzchoki wieloboku
to znaczy $points[0] = x0, $points[1] = y0, $points[2] = x1, $points[3] = y1 i tak dalej. Parametr
$num_points zawiera cakowit ilo wierzchokw. Patrz rwnie: ImageCreate().
int imagepolygon (int im, array points, int num_points, int col)
ImagePSBBox
Parametr $size jest wyraony w pikselach, $space pozwala zmieni domylna warto odstpu w
czcionkach. Warto ta jest dodawana do standardowej wartoci odstpu i moe by ujemna. Parametr $tightness
pozwala kontrolowa ilo wiata pomidzy literami. Warto ta jest dodawana do normalnej szerokoci znaku i
moe rwnie by ujemna. Parametr $angle jest wyraony w stopniach. Parametry $space i $tightness s
podawane w jednostkach odstpu znaku, gdzie 1 jednostka odstpu jest 1/1000 pica do kwadratu. Parametry
$space, $tightness i $angle s opcjonalne. Ramka ograniczajca jest wyliczana z wykorzystaniem dostpnych
danych z metryki czcionki i niestety nieco rni si od wynikw otrzymywanych przez rasteryzacj tekstu. Jeeli
kt wynosi 0, naley si spodziewa, e tekst bdzie potrzebowa o 1 piksel wicej w kadym kierunku. Funkcja
zwraca tablic zawierajc nastpujce elementy: 0 lewa dolna wsprzdna x, 1 lewa dolna wsprzdna y,
2 prawa grna wsprzdna x i 3 prawa grna wsprzdna y. Patrz rwnie: ImagePSText().
array ImagePSBBox (string text, int font, int size [, int space [, int tightness
[, float angle]]])
ImagePSEncodeFont
aduje z pliku wektor kodowania znakw i zmienia na niego istniejcy wektor kodowania czcionki.
Poniewa w czcionkach PostScript wektor kodowania nie zawiera wielu znakw na pozycjach powyej 127,
prawie na pewno musisz zmieni wektor kodowania w przypadku wykorzystywania jzykw innych ni
angielski. Dokadny format pliku jest opisany w dokumentacji T1lib. T1lib zawiera dwa gotowe do uycia pliki,
IsoLatin1.enc i IsoLatin2.enc. Jeeli chcesz cay czas wykorzystywa t funkcj, lepszym sposobem na
zdefiniowanie kodowania jest ustawienie w pliku konfiguracyjnym zmiennej ps.default_encoding na odpowiedni
plik kodowania. Wszystkie zaadowane przez uytkownika czcionki bd miay odpowiednio zdefiniowane
kodowanie.
int imagepsencodefont (int font_index, string encodingfile)
ImagePsExtendfont
Powiksza lub zmniejsza czcionk $font_index. Jeeli warto parametru $extend jest mniejsza od jeden,
funkcja zmniejsza czcionk.
bool imagepsextendfont (int font_index, float extend)
ImagePSFreeFont
Patrz rwnie: ImagePSLoadFont().
Dodatek A - Funkcje
262
void imagepsfreefont (int fontindex)

ImagePSLoadFont
Jeeli wszystko odbdzie si bez bdw, funkcja zwraca prawidowy indeks czcionki, ktry moe by
uyty do innych celw. Jeeli co si nie powiedzie, funkcja zwraca False i drukuje komunikat opisujcy bd.
Patrz rwnie: ImagePSFreeFont().
int ImagePSLoadFont (string filename)
ImagePsSlantFont
Pochyla czcionk wskazywan przez parametr $font_index o warto przekazan w parametrze $slant.
bool imagepsslantfont (int font_index, float slant)
ImagePSText
Parametr $size jest wyraony w pikselach. Parametr $foreground jest kolorem jakim zostanie
namalowany tekst, natomiast $background to kolor na ktry tekst bdzie si zmienia przy zastosowaniu
wygadzania (antialiasing). Nie s rysowane adne punkty w kolorze $background, wic to nie bdzie
zamalowane. Wsprzdne przekazane w $x, $y definiuj pocztek (punkt odniesienia) pierwszego znaku (mniej
wicej lewy dolny rg znaku). Funkcja rni si tym od ImageString(), gdzie $x, $y okrelaj lewy grny rg
pierwszego znaku. Jeeli potrzebujesz bliszych informacji na temat czcionek i systemu miar, znajduj si w
dokumentacji PostScript.
array imagepstext (int image, string text, int font, int size, int foreground,
int background, int x, int y [, int space [, int tightness
[, float angle [, int antialias_steps]]]])
Parametr $space pozwala na zmian domylnego odstpu w czcionce. Warto ta jest dodawana do
normalnej wartoci, wic moe by ujemna. Parametr $tightness powala na kontrolowanie iloci wiata
pomidzy literami. Warto ta jest dodawana do normalnej szerokoci znaki i rwnie moe by ujemna. Warto
$angle podawana jest w stopniach. Parametr $antialiasing_steps pozwala na okrelanie iloci kolorw uytych
do wygadzania tekstu. Dopuszczalnymi wartociami s 4 i 16. Wysza warto jest polecana dla tekstw o
rozmiarze mniejszych od 20, gdzie wygadzanie mocno wpywa na jako tekstu. W przypadku wikszych
czcionek mona uy wartoci 4, poniewa potrzeba wtedy mniej oblicze. Parametry $space i $tightness s
wyraane w jednostkach odstpu znaku, gdzie 1 jednostka odstpu jest 1/1000 pica do kwadratu. Parametry
$space, $tightness, $angle i $antialias s opcjonalne. Funkcja zwraca tablic zawierajc nastpujce elementy:
0 lewa dolna wsprzdna x, 1 lewa dolna wsprzdna y, 2 prawa grna wsprzdna x i 3 prawa
grna wsprzdna y. Patrz rwnie: ImagePSBBox().
ImageRectangle
Na rysunku $im tworzy prostokt w kolorze $col o wsprzdnych lewego grnego rogu $x1, $y1 i
prawego dolnego $x2, $y2. Lewy grny rg rysunku ma wsprzdne 0,0.
int ImageRectangle (int im, int x1, int y1, int x2, int y2, int col)
ImageSetPixel
Rysuje na rysunku $im piksel w kolorze $col na wsprzdnych $x, $y (lewy grny rg to 0,0). Patrz
rwnie: ImageCreate() i ImageColorAllocate().
int ImageSetPixel (int im, int x, int y, int col)
ImageString
Na rysunku $im rysuje cig $s rozpoczynajc od wsprzdnych $x, $y (lewy grny rg to 0,0) w kolorze
$col. Jeeli $font wynosi 1, 2, 3, 4 lub 5, uywane s wbudowane czcionki. Patrz rwnie: ImageLoadFont().
int ImageString (int im, int font, int x, int y, string s, int col)
PHP Kompendium wiedzy
263

ImageStringUp
Na rysunku $im rysuje pionowo cig $s rozpoczynajc od wsprzdnych $x, $y (lewy grny rg to 0,0) w
kolorze $col. Jeeli $font wynosi 1, 2, 3, 4 lub 5, uywane s wbudowane czcionki. Patrz rwnie:
ImageLoadFont().
int ImageStringUp (int im, int font, int x, int y, string s, int col)
ImageSX
Zwraca szeroko rysunku identyfikowanego przez $im. Patrz rwnie: ImageCreate() i ImageSY().
int ImageSX (int im)
ImageSY
Zwraca wysoko rysunku identyfikowanego przez $im. Patrz rwnie: ImageCreate() i ImageSX().
int ImageSY (int im)
ImageTTFBBox
Funkcja oblicza i zwraca ramk otaczajc tekst TrueType (w pikselach). Parametr $text jest cigiem do
zmierzenia. Parametr $size jest wielkoci czcionki, $fontfile jest nazw pliku z czcionk TrueType (moe by
w postaci URL). $angle jest ktem pochylenia tekstu $text w stopniach. Funkcja ImageTTFBBox() zwraca tablic
skadajca si z omiu elementw reprezentujcych cztery punkty tworzce ramk otaczajc tekst: 0
wsprzdna X lewego dolnego rogu, 1 wsprzdna Y lewego dolnego rogu, 2 wsprzdna X prawego
dolnego rogu, 3 wsprzdna Y prawego dolnego rogu, 4 wsprzdna X prawego grnego rogu, 5
wsprzdna Y prawego grnego rogu, 6 wsprzdna X lewego grnego rogu, 7 wsprzdna Y lewego
grnego rogu. Punkty te s niezalene od pochylenia tekstu, wic lewy grny oznacza grny wierzchoek po
lewej stronie, patrzc na tekst poziomo. Funkcja wymaga bibliotek GD i FreeType. Patrz rwnie:
ImageTTFText().
array imagettfbbox (int size, int angle, string fontfile, string text)
ImageTTFText
Na rysunku $im rysuje cig $text, rozpoczynajc od wsprzdnych $x, $y (lewy grny rg to 0,0), pod
ktem $angle w kolorze $col, za pomoc czcionki TrueType umieszczonej w pliku $fontfile. Wsprzdne
podane w $x, $y okrelaj punkt bazowy pierwszego znaku (mniej wicej lewy dolny rg znaku). Rni si to od
funkcji ImageString(), gdzie x, y okrelaj prawy grny rg pierwszego znaku. Parametr $angle jest wyraony w
stopniach, gdzie 0 stopni okrela tekst czytany z lewej do prawej (kierunek na godzin trzeci), natomiast wysze
wartoci reprezentuj pochylenie w kierunku przeciwnym do ruchu wskazwek zegara. (warto 90 powoduje
narysowanie tekstu od gry do dou). Parametr $fontflile jest ciek do pliku TrueType z uywan czcionk.
Parametr $text jest cigiem tekstowym, ktry moe zawiera sekwencje znakw UTF-8 (w postaci :{) uywane
do stosowania znakw o kodach powyej 255. $col jest indeksem koloru. Uycie ujemnego indeksu koloru
powoduje wyczenie wygadzania tekstu. Funkcja ImageTTFText() zwraca tablic omioelementow
reprezentujc cztery punkty stanowice ramk ograniczajc tekst. Punkty te s umieszczone w tablicy w
kolejnoci lewy grny, prawy grny, prawy dolny i lewy dolny. Punkty te s niezalene od pochylenia tekstu,
wic lewy grny oznacza grny wierzchoek po lewej stronie, patrzc na tekst poziomo.
array imagettftext (int im, int size, int angle, int x, int y, int col,
string fontfile, string text)
Przykad: ImageTTFText
<?php
Header ("Content-type: image/gif");
$im = imagecreate (400, 30);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
ImageTTFText ($im, 20, 0, 10, 20, $white, "/path/arial.ttf",
"Testowanie... Omega: &#937;");
ImageGif ($im);
ImageDestroy ($im);
Dodatek A - Funkcje
264

?>
Funkcja wymaga bibliotek GD i FreeType. Patrz rwnie: ImageTTFBox().
ImageTypes
Funkcja zwraca mask bitow zwizan z formatami rysunkw obsugiwanych przez bibliotek GD
doczon do PHP. Zwracane s nastpujce bity: IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP.
int imagetypes (void)
Przykad: ImageTypes
<?php
if (ImageTypes() & IMG_PNG) {
echo "Obsuga PNG jest aktywna";
}
?>
imap_8bit
Konwertuje cig 8-bitowy na cig quoted-printable (zgodnie z RFC2045, sekcja 6.7). Zwraca cig quoted-
printable. Patrz rwnie imap_qprint().
string imap_8bit (string string)
imap_alerts
Zwraca tablic wszystkich komunikatw ostrzee IMAP wygenerowanych od ostatniego wywoania
imap_alerts(), lub od pocztku strony. Gdy zostanie wywoana funkcja imap_alerts(), stos ostrzee jest
czyszczony. Specyfikacja IMAP wymaga, aby komunikaty te byy pokazywane uytkownikowi.
array imap_alerts (void)
imap_append
Zwraca True w przypadku powodzenia i False w przypadku bdu. Funkcja docza cig komunikatu do
skrzynki pocztowej $mbox. Jeeli podane zostay opcjonalne znaczniki $flags, funkcja docza rwnie do
skrzynki te znaczniki. Dziaajc na serwerze Cyrus IMAP, trzeba uy terminatorw linii \r\n zamiast \n, lub
operacja si nie powiedzie.
int imap_append (int imap_stream, string mbox, string message [, string flags])
Przykad: imap_append()
$stream = imap_open("{your.imap.host}INBOX.Drafts","username", "password");

$check = imap_check($stream);
print "Ilo komunikatw przed doczeniem: ". $check->Nmsgs."\n";

imap_append($stream,"{your.imap.host}INBOX.Drafts"
,"From: me@my.host\r\n"
."To: you@your.host\r\n"
."Subject: test\r\n"
."\r\n"
."przesyka testowa, prosz zignorowa\r\n"
);

$check = imap_check($stream);
print "Ilo komunikatw po doczeniu : ". $check->Nmsgs."\n";

imap_close($stream);
imap_base64
Dekoduje tekst zakodowany metod BASE-64 (patrz RFC2045, sekcja 6.8). Zdekodowany komunikat jest
zwracany w postaci cigu. Patrz rwnie: imap_binary().
string imap_base64 (string text)
PHP Kompendium wiedzy
265

imap_binary
Konwertuje 8-bitowy cig na cig zakodowany metod BASE-64 (zgodnie z RFC2045, sekcja 6.8).
Zwraca cig base64. Patrz rwnie: imap_base64().
string imap_binary (string string)
imap_body
Zwraca tre przesyki o numerze $msg_number z biecej skrzynki pocztowej. Opcjonalny parametr
$flags jest mask bitow zawierajc jedn lub wicej wartoci:
FT_UID Warto $msgno jest idnetyfikatorem UID
FT_PEEK Nie ustawia znacznika \Seen, jeeli jest ju ustawiony
FT_INTERNAL Zwracany cig jest w formacie wewntrznym
Funkcja imap_body() zwraca dosown kopi treci przesyki. Aby odczyta jeden fragment
wieloczciowej przesyki kodowanej za pomoc MIME naley uy funkcji imap_fetch_structure() do
zanalizowania struktury i imap_fetch_body() do skopiowania pojedynczego komponentu przesyki.
string imap_body (int imap_stream, int msg_number [, int flags])
imap_check
Zwraca dane na temat biecej skrzynki pocztowej. W przypadku bdu zwraca False. Funkcja
imap_check() sprawdza status biecej skrzynki na serwerze i zwraca dane w postaci obiektu o nastpujcych
waciwociach:
Date ostatnia zmiana zawartoci skrzynki
Driver protok uywany do komunikacji ze skrzynk: POP3, IMAP, NNTP
Mailbox nazwa skrzynki pocztowej
Nmsgs ilo przesyek w skrzynce
Recent ilo nowych przesyek w skrzynce
object imap_check (int imap_stream)
imap_clearflag_full
Funkcja powoduje usunicie okrelonego znacznika ze zbioru znacznikw przesyki w okrelonej
sekwencji. Znacznikami do usuwania s: \\Seen, \\Answered, \\Flagged, \\Deleted, \\Draft i \\Recent (wedug
RFC2060). Parametr $options jest mask bitow skadajc si z nastpujcych znacznikw: ST_UID, sekwencja
argumentw zawierajca UID zamiast numerw sekwencji.
string imap_clearflag_full (int stream, string sequence, string flag, string options)
imap_close
Zamyka strumie imap. Posiada opcjonalny parametr $flag CL_EXPUNGE, ktry powoduje
wyczyszczenie skrzynki przed zamkniciem poprzez usunicie przesyek zaznaczonych jako usunite.
int imap_close (int imap_stream [, int flags])
imap_createmailbox
Tworzy now skrzynk pocztow o nazwie $mbox. Nazwy zawierajce znaki narodowe powinny by
zakodowane przy pomocy funkcji imap_utf7_encode(). Zwraca True w przypadku powodzenia lub False w
przypadku wystpienia bdu. Patrz rwnie: imap_renamemailbox(), imap_deletemailbox() i imap_open() gdzie
znajduje si opis formatw nazw $mbox.
int imap_createmailbox (int imap_stream, string mbox)
Przykad: imap_createmailbox()
$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
or die("nie mona poczy: ".imap_last_error());

$name1 = "phpnewbox";
Dodatek A - Funkcje
266

$name2 = imap_utf7_encode("phpnewbx");

$newname = $name1;

echo "Now nazw bdzie '$name1'<br>\n";

# tworzymy now skrzynk o nazwie "phptestbox" w skrzynce poczty przychozcej
# sprawdzamy status po utworzeniu i na koniec usuwamy, przywracajc skrzynk
# do stanu pocztkowego
if(@imap_createmailbox($mbox,imap_utf7_encode("{your.imap.host}INBOX.$newname")))
{
$status = @imap_status($mbox,"{your.imap.host}INBOX.$newname",SA_ALL);
if($status) {
print("nowa skrzynka '$name1' ma nastpujcy status:<br>\n");
print("Komunikatw: ". $status->messages )."<br>\n";
print("Ostatnich: ". $status->recent )."<br>\n";
print("Nieprzeczytanych:". $status->unseen )."<br>\n";
print("Nastpny UID: ". $status->uidnext )."<br>\n";
print("Poprawno UID: ". $status->uidvalidity)."<br>\n";

if(imap_renamemailbox($mbox,"{your.imap.host}INBOX.$newname",
"{your.imap.host}INBOX.$name2")) {
echo "zmieniono nazw srzyni z '$name1' na '$name2'<br>\n";
$newname=$name2;
} else {
print "Nieudane wywoanie imap_renamemailbox na nowej skrzynce: "
.imap_last_error()."<br>\n";
}
} else {
print "Nieudane wywoanie imap_status na nowej skrzynce: "
.imap_last_error()."<br>\n";
}
if(@imap_deletemailbox($mbox,"{your.imap.host}INBOX.$newname")) {
print "nowa skrzynka usunita, przywracajc stan pocztkowy<br>\n";
} else {
print "Nieudane wywoanie imap_deletemailbox na nowej skrzynce: "
.implode("<br>\n",imap_errors())."<br>\n";
}

} else {
print "nie mona utworzy nowej skrzyki: ".implode("<br>\n",imap_errors())
."<br>\n";
}

imap_close($mbox);
imap_delete
Zwraca True. Funkcja imap_delete() oznacza do usunicia przesyk wskazywan przez $msg_number.
Opcjonalny parametr $flags posiada tylko jedn opcj, FT_UID, ktra wskazuje funkcji, e argumenty
$msg_number naley traktowa jako identyfikatory UID. Przesyki zaznaczone do usunicia pozostaj w skrzynce
do czasu wywoania funkcji imap_expunge() lub imap_close() z ustawionym parametrem opcjonalnym
CL_EXPUNGE.
int imap_delete (int imap_stream, int msg_number [, int flags])
Przykad: imap_delete()
$mbox = imap_open ("{your.imap.host}INBOX", "username", "password")
or die ("nie mona poczy: " . imap_last_error());

$check = imap_mailboxmsginfo ($mbox);
print "Przesyki przed usuniciem: " . $check->Nmsgs . "<br>\n" ;
imap_delete ($mbox, 1);
$check = imap_mailboxmsginfo ($mbox);
print "Przesyki po usuniciu: " . $check->Nmsgs . "<br>\n" ;
imap_expunge ($mbox);
$check = imap_mailboxmsginfo ($mbox);
print "Przesyki po wyczyszczeni: " . $check->Nmsgs . "<br>\n" ;
imap_close ($mbox);
imap_deletemailbox
suwa podan skrzynk pocztow (format nazw $mbox mona znale przy opisie imap_open()). Zwraca
True w przypadku powodzenia i False w przypadku bdu. Patrz rwnie: imap_createmailbox(),
imap_renamemailbox() i imap_open().
PHP Kompendium wiedzy
267

int imap_deletemailbox (int imap_stream, string mbox)
imap_errors
Zwraca tablic wszystkich komunikatw bdw IMAP wygenerowanych od ostatniego wywoania
imap_errors() lub od pocztku skryptu. Po wywoaniu imap_errors() stos bdw jest czyszczony.
array imap_errors (void)
imap_expunge
Usuwa przesyki zaznaczone jako usunite przez imap_delete(), imap_mail_move() lub
imap_setflag_full(). Zwraca True.
int imap_expunge (int imap_stream)
imap_fetchbody
Funkcja powoduje pobranie sekcji z treci podanego komunikatu w postaci tekstu i zwrcenie tego tekstu.
Specyfikacja sekcji jest cigiem liczb rozdzielonych kropkami, ktre s indeksami w licie czci, w sposb
okrelony przez specyfikacj IMAP4. Czci z treci nie s dekodowane przez t funkcj. Parametrem
imap_fetchbody() jest maska bitowa z jedn lub wicej staych:
FT_UID Parametr $msg_number jest UID
FT_PEEK Nie ustawia znacznika \Seen, jeeli nie by wczeniej ustawiony
FT_INTERNAL Zwracany cig jest w postaci wewntrznej bez konwersji kocw linii.
string imap_fetchbody (int imap_stream, int msg_number, string part_number
[, flags flags])
imap_fetchheader
Powoduje odczytanie caego, nieprzefiltrowanego RFC822 nagwka formatu podanego komunikatu i
zwrcenie go cigu znakw. Opcje s nastpujce:
FT_UID Parametr $msg_number jest UID
FT_INTERNAL Zwracany cig jest w postaci wewntrznej bez konwersji kocw linii.
FT_PREFETCH TEXT.RFC822 powinien by w tym samym czasie wstpnie pobrany. Pozwala to
unikn dodatkowego RTT na poczeniu IMAP, jeeli wymagany jest peny tekst przesyki (na przykad,
operacja zapis do pliku)
string imap_fetchheader (int imap_stream, int msgno, int flags)
imap_fetchstructure
Funkcja pobiera wszystkie informacje o strukturze podanej przesyki. Opcjonalny parametr $flags posiada
tylko jedn opcj, FT_UID, ktra wskazuje funkcji, e argumenty $msg_number naley traktowa jako identyfikatory
UID. Zwracany obiekt zawiera kopert, dat wewntrzn, rozmiar, znaczniki i struktur treci, oraz podobne
obiekty dla kadego zacznika MIME.
object imap_fetchstructure (int imap_stream, int msg_number [, int flags])
Tabela 1. Zwracany obiekt z imap_fetchstructure()
Typ Typ treci
encoding
Kodowanie do przesania treci
ifsubtype
TRUE jeeli wystpuje cig podtypu
subtype
Podtyp MIME
ifdescription
TRUE jeeli jest to cig opisu
description
Cig opisu treci
ifid
TRUE jeeli jest to cig identyfikacyjny
id
Cig identyfikacyjny
lines
Ilo linii
Dodatek A - Funkcje
268

bytes
Ilo bajtw
ifdisposition
TRUE jeeli jest to cig rozmieszczenia
disposition
Cig rozmieszczenia
ifdparameters
TRUE jeeli istnieje tablica dparameters
dparameters
Tablica parametrw rozmieszczenia
ifparameters
TRUE jeeli istnieje tablica parametrw
parameters
Tablica parametrw MIME
parts
Tablica obiektw opisujcych kad cz przesyki
Uwaga
Dparameters jest tablica obiektw posiadajcych atrybuty $attribute i $value. Parameters jest tablic obiektw posiadajcych
atrybuty $attribute i $value. Parts jest tablic obietw o identycznej strukturze jak nadrzdny obiekt, z ograniczeniem, e nie
mog posiada nastpnych obiektw parts.
Podstawowe typy treci
0:text, 1: multipart, 2:message, 3:application, 4:audio, 5:image, 6-video, 7-other
Rodzaje kodowania
0:7BIT, 1:8BIT, 2:BINARY, 3:BASE64, 4:QUOTED-PRINTABLE, 5:OTHER

imap_fetch_overview
Pobiera nagwki dla podanej sekwencji $sequence i zwraca skrt ich zawartoci. Parametr $sequence
moe zawiera sekwencj indeksw wiadomoci lub identyfikatorw UID, gdy parametr $flag zawiera FT_UID.
Funkcja zwraca tablic obiektw opisujcych nastpujce nagwki kolejnych wiadomoci:
subject temat wiadomoci
from nadawca wiadomoci
date data wysania
message_id identyfikator wiadomoci
references odwoania do tego identyfikatora wiadomoci
size rozmiar w bajtach
uid identyfikator UID wiadomoci w skrzynce
msgno numer kolejny komunikatu w skrzynce
recent wiadomo oznaczona jako niedawna
flagged wiadomo zaznaczona
answered wiadomo na ktr zostaa udzielona odpowied
deleted wiadomo zaznaczona do usunicia
seen wiadomo przeczytana
draft wiadomo oznaczona jako szkic
array imap_fetch_overview (int imap_stream, string sequence [, int flags])
Przykad: imap_fetch_overview()
$mbox = imap_open("{your.imap.host:143}","username","password")
or die("bd poaczenia: ".imap_last_error());

$overview = imap_fetch_overview($mbox,"2,4:6",0);

if(is_array($overview)) {
reset($overview);
while( list($key,$val) = each($overview)) {
print $val->msgno
. " - " . $val->date
. " - " . $val->subject
. "\n";
}
}
imap_close($mbox);
PHP Kompendium wiedzy
269

imap_getmailboxes
Zwraca tablic obiektw zawierajcych dane na temat skrzynek pocztowych. Kady obiekt posiada
nastpujce atrybuty: $name zawiera pen nazw skrzynki, $delimiter znak podziau w tej czci
hierarchii, w ktrej znajduje si skrzynka, $attributes maska bitowa, ktra moe by testowana za pomoc
nastpujcych staych:
LATT_NOINFERIORS skrzynka nie posiada dzieci (skrzynek w niej zaoonych)
LATT_NOSELECT jest to kontener a nie skrzynka i nie moe by otwierany
LATT_MARKED skrzynka jest zaznaczona i uywana jedynie przez UW-IMAPD
LATT_UNMARKED skrzynka nie jest zaznaczona i uywana jedynie przez UW-IMAPD
array imap_getmailboxes (int imap_stream, string ref, string pattern)
Nazwy skrzynek zawierajce znaki narodowe z poza drukowalnego zakresu kodw ASCII s zakodowane
i mog by rozkodowane za pomoc funkcji imap_utf7_decode(). Normalnie $ref powinien by okrelany przez
specyfikacj serwera, tak jak jest to opisane przy funkcji imap_open(), natomiast $pattern okrela pocztek
przeszukiwania w hierarchii skrzynek pocztowych. Jeeli chcesz uzyska wszystkie skrzynki, naley przekaza
do parametru $pattern cig "*". Mog by tu uywane dwa znaki specjalne: * i %. Jeeli uyjemy znaku * w
wyniku otrzymamy wszystkie skrzynki w hierarchii. Znak % powoduje otrzymanie jedynie skrzynek z biecego
poziomu hierarchii. Jeeli podamy jedynie "%", otrzymamy skrzynki z gwnego poziomu hierarchii, "~/mail/%"
na UW-IMAPD zwrci wszystkie skrzynki z katalogu ~/mail, ale bez podkatalogw.
Przykad: imap_getmailboxes()
$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
or die("bd poczenia: ".imap_last_error());

$list = imap_getmailboxes($mbox,"{your.imap.host}","*");
if(is_array($list)) {
reset($list);
while (list($key, $val) = each($list))
{
print "($key) ";
print imap_utf7_decode($val->name).",";
print "'".$val->delimiter."',";
print $val->attributes."<br>\n";
}
} else
print "nieudane wywoanie funkcji imap_getmailboxes: ".imap_last_error()."\n";
imap_close($mbox);
imap_getsubscribed
Identyczna z imap_getmailboxes(), ale zwraca jedynie skrzynki, do ktrych uytkownik posiada
subskrypcj.
array imap_getsubscribed (int imap_stream, string ref, string pattern)
imap_header
Alias funkcji imap_headerinfo(), dziaa dokadnie tak samo.
imap_header( void )
imap_headerinfo
Zwraca obiekt do rnych fragmentw nagwka: remail, date, Date, subject, Subject, in_reply_to,
message_id, newsgroups, followup_to, references.
imap_header( void )
Dostpne s nastpujce znaczniki wiadomoci:
Recent 'R' jeeli wiadomo jest przeczytana i niedawna, 'N' jeeli jest niedawna i nieprzeczytana, ' '
jeeli nie jest niedawna
Unseen 'U' jeeli nie jest przeczytana i nie jest niedawna, ' ' jeeli przeczytana lub niedawna
Answered 'A' jeeli udzielono odpowiedzi, ' ' jeeli nie udzielono odpowiedzi
Deleted 'D' gdy usunita, ' ' jeeli nie usunita
Dodatek A - Funkcje
270

Draft 'X' jeeli jest szkicem, ' ' gdy nim nie jest
Flagged 'F' jeeli jest zaznaczona, ' ' jeeli jest oznaczona
Uwaga
Dziaanie znacznikw Recent i Unseen jest nieco dziwne. Jeeli chcesz sprawdzi, czy wiadomo nie jest przeczytana, sprawd
Unseen == 'U' || Recent == 'N'.
toaddress (kompletna linia to:, do 1024 znakw)
to[] (zwraca tablic obiektw z linii to: zawierajca: personal, adl, mailbox, host)
fromaddress (kompletna linia from:, do 1024 znakw)
from[] (zwraca tablic obiektw z linii from: zawierajca: personal, adl, mailbox, host)
ccaddress (kompletna linia cc:, do 1024 znakw)
cc[] (zwraca tablic obiektw z linii cc: zawierajca: personal, adl, mailbox, host)
bccaddress (kompletna linia bcc:, do 1024 znakw)
bcc[] (zwraca tablic obiektw z linii bcc: zawierajca: personal, adl, mailbox, host)
reply_toaddress (kompletna linia reply_to:, do 1024 znakw)
reply_to[] (zwraca tablic obiektw z linii reply_to: zawierajca: personal, adl, mailbox, host)
senderaddress (kompletna linia sender:, do 1024 znakw)
sender[] (zwraca tablic obiektw z linii sender: zawierajca: personal, adl, mailbox, host)
return_path (kompletna linia return_path:, do 1024 znakw)
return_path[] (zwraca tablic obiektw z linii return_path: zawierajca: personal, adl, mailbox, host)
udate (mail, message, date, in, unix, time)
fetchfrom (linia from: sformatowana tak, aby zmiecia si w $fromlength znakach)
fetchsubject (linia subject: sformatowana tak, aby zmiecia si w $fromlength znakach)
imap_headers
Zwraca tablic cigw sformatowanych z danymi nagwkw. Pozwala na jeden element na przesyk.
array imap_headers (int imap_stream)
imap_last_error
Zwraca peny tekst ostatniego komunikatu bdu IMAP, ktry wystpi na biecej stronie. Stos bdw
pozostaje niezmieniony. Kolejne wywoania imap_last_error() zwrc ten sam bd, jeeli nie wystpi w
midzyczasie inne bdy.
imap_listmailbox
Zwraca tablic zawierajc nazwy skrzynek pocztowych. Opis parametrw $ref i $pattern znajduje si
przy opisie imap_getmailboxes().
array imap_listmailbox (int imap_stream, string ref, string pattern)
Przykad: imap_listmailbox()
$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
or die("bd poaczenia: ".imap_last_error());

$list = imap_listmailbox($mbox,"{your.imap.host}","*");
if(is_array($list)) {
reset($list);
while (list($key, $val) = each($list))
print imap_utf7_decode($val)."<br>\n";
} else
print "Nieudane wywoanie funkcji imap_listmailbox: ".imap_last_error()."\n";
imap_close($mbox);
PHP Kompendium wiedzy
271

imap_listsubscribed
Zwraca tablic z wszystkimi skrzynkami pocztowymi, do ktrych posiadasz subskrypcj. Jest ona niemal
identyczna jak imap_listmailbox(), ale zwraca jedynie te skrzynki, do ktrych zalogowany uytkownik posiada
subskrypcj.
array imap_listsubscribed (int imap_stream, string ref, string pattern)
imap_mail
Funkcja ta jest obecnie dostpna tylko w PHP 3.
string imap_mail (string to, string subject, string message
[, string additional_headers [, string cc [, string bcc [, string rpath]]]])
imap_mailboxmsginfo
Zwraca informacje na temat biecej skrzynki pocztowej. Zwraca False w przypadku wystpienia bdu.
Funkcja imap_mailboxmsginfo() sprawdza status skrzynki na serwerze. Jest podobna do imap_status(), ale
dodatkowo sumuje rozmiary wszystkich wiadomoci w skrzynce, co jednak powoduje wyduenie czasu
wykonywania funkcji. Zwraca dane w postaci obiektu z nastpujcymi waciwociami.
object imap_mailboxmsginfo (int imap_stream)
Waciwoci skrzynki pocztowej
Date data ostatniej zmiany
Driver sterownik
Mailbox nazwa skrzynki
Nmsgs ilo wiadomoci
Recent ilo ostatnich wiadomoci
Unread ilo wiadomoci nie przeczytanych
Deleted ilo usunitych wiadomoci
Size rozmiar skrzynki
Przykad: imap_mailboxmsginfo()
<?php

$mbox = imap_open("{your.imap.host}INBOX","username", "password")
or die("bd poczenia: ".imap_last_error());

$check = imap_mailboxmsginfo($mbox);

if($check) {
print "Date: " . $check->Date ."<br>\n" ;
print "Driver: " . $check->Driver ."<br>\n" ;
print "Mailbox: " . $check->Mailbox ."<br>\n" ;
print "Messages: ". $check->Nmsgs ."<br>\n" ;
print "Recent: " . $check->Recent ."<br>\n" ;
print "Unread: " . $check->Unread ."<br>\n" ;
print "Deleted: " . $check->Deleted ."<br>\n" ;
print "Size: " . $check->Size ."<br>\n" ;
} else {
print "imap_check() failed: ".imap_last_error(). "<br>\n";
}

imap_close($mbox);

?>
imap_mail_compose
string imap_mail_compose (array envelope, array body)
Przykad: imap_mail_compose()
<?php

$envelope["from"]="musone@afterfive.com";
$envelope["to"]="musone@darkstar";
$envelope["cc"]="musone@edgeglobal.com";

Dodatek A - Funkcje
272
$part1["type"]=TYPEMULTIPART;

$part1["subtype"]="mixed";

$filename="/tmp/imap.c.gz";
$fp=fopen($filename,"r");
$contents=fread($fp,filesize($filename));
fclose($fp);

$part2["type"]=TYPEAPPLICATION;
$part2["encoding"]=ENCBINARY;
$part2["subtype"]="octet-stream";
$part2["description"]=basename($filename);
$part2["contents.data"]=$contents;

$part3["type"]=TYPETEXT;
$part3["subtype"]="plain";
$part3["description"]="description3";
$part3["contents.data"]="contents.data3\n\n\n\t";

$body[1]=$part1;
$body[2]=$part2;
$body[3]=$part3;

echo nl2br(imap_mail_compose($envelope,$body));

?>
imap_mail_copy
Zwraca True w przypadku sukcesu lub False w przypadku wystpienia bdu. Kopiuje wiadomo
okrelon przez $msglist do okrelonej skrzynki pocztowej. Parametr $msglist moe zawiera zakres a nie tylko
numery komunikatw, jak to zostao opisane w RFC2060 (http://www.faqs.org/rfcs/rfc2060.html). Parametr
$flags jest mask bitow zawierajc CP_UID sekwencja liczb zawiera UID i CP_MOVE usuwa
komunikaty ze skrzynki po ich skopiowaniu.
int imap_mail_copy (int imap_stream, string msglist, string mbox [, int flags])
imap_mail_move
Przenosi przesyk pocztow okrelon przez $msglist to podanej skrzynki pocztowej. Parametr $msglist
moe zawiera zakres a nie tylko numery komunikatw, jak to zostao opisane w RFC2060
(http://www.faqs.org/rfcs/rfc2060.html). Parametr $flags jest mask bitow i moe zawiera jedn warto
CP_UID. Zwraca True w przypadku sukcesu lub False w przypadku wystpienia bdu.
int imap_mail_move (int imap_stream, string msglist, string mbox [, int flags])
imap_mime_header_decode
Dekoduje rozszerzenia nagwkw komunikatw MIME, ktre zawieraj tekst z poza ASCII (RFC2047
http://www.faqs.org/rfcs/rfc2047.html). Zdekodowane elementy s zwracane w postaci tablicy obiektw, z ktry
posiada dwie waciwoci: charset i text. Jeeli element nie moe by zdekodowany a inne sowa s w US-
ASCII, waciwo charset jest ustawiona na warto domyln.
array imap_mime_header_decode (string text)
Przykad: imap_mime_header_decode()
$text="=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>";

$elements=imap_mime_header_decode($text);
for($i=0;$i<count($elements);$i++) {
echo "Charset: {$elements[$i]->charset}\n";
echo "Text: {$elements[$i]->text}\n\n";
}
W przedstawionym przykadzie otrzymamy dwa elementy, gdzie pierwszy element jest zakodowany za
pomoc ISO-8859-1 a drugi bdzie US-ASCII.
imap_msgno
Zwraca numer sekwencji wiadomoci dla podanego UID. Jest to odwrotno imap_uid().
int imap_msgno (int imap_stream, int uid)
PHP Kompendium wiedzy
273

imap_num_msg
Zwraca ilo przesyek w biecej skrzynce pocztowej.
int imap_num_msg (int imap_stream)
imap_num_recent
Zwraca ilo ostatnich przesyek w biecej skrzynki pocztowej.
int imap_num_recent (int imap_stream)
imap_open
W przypadku powodzenia zwraca strumie IMAP, a w przypadku bdu False. Funkcja moe by
uywana do otwarcia strumienia do serwerw POP3 i NNTP i nie wszystkie funkcje i wasnoci s dostpne na
serwerach IMAP. Nazwa skrzynki skada si z dwch czci: nazwy serwera i cieki do skrzynki na tym
serwerze. Nazwa specjalna INBOX okrela biec skrzynk pocztow uytkownika. Fragment nazwy
okrelajcy serwer jest otoczony nawiasami klamrowymi {} i zawiera nazw serwera, lub jego numer IP,
okrelenie protokou komunikacji (rozpoczynajce si od /), oraz opcjonalnie numer portu rozpoczynajcy si od
znaku :. Podawanie nazwy serwera jest obowizkowe we wszystkich parametrach skrzynki pocztowej. Nazwy
skrzynek zawierajce znaki narodowe spoza drukowalnego podzbioru kodw ASCII s zakodowane za pomoc
funkcji imap_utf7_encode().
int imap_open (string mailbox, string username, string password [, int flags])
Opcje stanowi mask bitow zawierajc jedn, lub wicej z poniszych wartoci:
OP_READONLY otwiera skrzynk tylko do odczytu,
OP_ANONYMOUS nie uywa ani nie zmienia pliku .newsrc (tylko NNTP),
OP_HALFOPEN dla pocze IMAP i NNTP, otwiera poczenie, ale nie otwiera skrzynki,
CL_EXPUNGE automatycznie czyci skrzynk po jej zamkniciu.
Aby podczy si z serwerem IMAP dziaajcym na porcie 143 na komputerze lokalnym, naley
wywoa funkcj w nastpujcy sposb:
$mbox = imap_open ("{localhost:143}INBOX", "user_id", "password");
Aby podczy si z serwerem POP3 dziaajcym na porcie 110 na komputerze lokalnym, naley wywoa
funkcj w nastpujcy sposb:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");
Aby podczy si z serwerem NNTP dziaajcym na porcie 119 na komputerze lokalnym, naley
wywoa funkcj w nastpujcy sposb:
$mbox = imap_open ("{localhost:993/imap/ssl}INBOX", "user_id", "password");
Aby poczy si ze zdalnym serwerem naley zastpi localhost nazw lub numerem IP serwera, z
ktrym ma by nawizane poczenie.
Przykad: imap_open()
$mbox = imap_open ("{your.imap.host:143}", "username", "password");

echo "<p><h1>Skrzynki pocztowe</h1>\n";
$folders = imap_listmailbox ($mbox, "{your.imap.host:143}", "*");

if ($folders == false) {
echo "wywoanie nieudane<br>\n";
} else {
while (list ($key, $val) = each ($folders)) {
echo $val."<br>\n";
}
}

echo "<p><h1>nagwki w INBOX</h1>\n";
$headers = imap_headers ($mbox);

if ($headers == false) {
echo "wywoanie nieudane<br>\n";
} else {
while (list ($key,$val) = each ($headers)) {
echo $val."<br>\n";
}
}
imap_close($mbox);
Dodatek A - Funkcje
274

imap_ping
Zwraca True, jeeli strumie jest aktywny, False w przypadku nieaktywnego strumienia. Funkcja
imap_ping() sprawdza za pomoc operacji ping, czy strumie jest nadal aktywny. Moe sprawdza now poczt.
Jest to zalecana metoda okresowego sprawdzania nowej poczty oraz podtrzymywania poczenia do serwerw
rozczajcych nieaktywne poczenia (poniewa skrypty PHP nie dziaaj zbyt dugo, funkcja ta
prawdopodobnie nie bdzie zbyt uyteczna).
int imap_ping (int imap_stream)
imap_qprint
Konwertuje cig zakodowany w postaci quoted-printable na cig 8-bitowy zgodnie z RFC2045
(http://www/faqs.org/rfcs/rfc2045.html, sekcja 6.7). Zwraca cig 8-bitowy (binarny). Patrz rwnie: imap_8bit().
string imap_qprint (string string)
imap_renamemailbox
Zmienia nazw skrzynki pocztowej na now (format nazw skrzynek opisany jest przy funkcji
imap_open()). Zwraca True gdy operacja si powioda i False w przypadku bdu. Patrz rwnie:
imap_createmailbox(), imap_deletemailbox() i imap_open().
int imap_renamemailbox (int imap_stream, string old_mbox, string new_mbox)
imap_reopen
Ponownie otwiera strumie do nowej skrzynki na serwerze IMAP lub NNTP. Opcje s mask bitow
zawierajc jedn lub wicej nastpujcych wartoci:
OP_READONLY otwiera skrzynk tylko do odczytu,
OP_ANONYMOUS nie uywa ani nie zmienia pliku .newsrc (tylko NNTP),
OP_HALFOPEN dla pocze IMAP i NNTP, otwiera poczenie, ale nie otwiera skrzynki,
CL_EXPUNGE automatycznie czyci skrzynk po jej zamkniciu.
Zwraca True w przypadku powodzenia i False w przypadku bdu.
int imap_reopen (int imap_stream, string mailbox [, string flags])
imap_rfc822_parse_adrlist
Analizuje adresy w sposb zdefiniowany w RFC822 (http://www/faqs.org/rfcs/rfc2045.html). Dla kadego
adresu zwraca tablic obiektw. Waciwociami obiektw s:
mailbox nazwa skrzynki (nazwa uytkownika),
host nazwa hosta,
personal nazwa opisowa uytkownika,
adl cieka do domeny rdowej.
array imap_rfc822_parse_adrlist (string address, string default_host)
Przykad: imap_rfc822_parse_adrlist()
$address_string =
"Hartmut Holzgraefe <hartmut@cvs.php.net>, postmaster@somedomain.net, root";
$address_array = imap_rfc822_parse_adrlist($address_string,"somedomain.net");
if(! is_array($address_array)) die("co poszo le\n");

reset($address_array);
while(list($key,$val)=each($address_array)){
print "mailbox : ".$val->mailbox."<br>\n";
print "host : ".$val->host."<br>\n";
print "personal: ".$val->personal."<br>\n";
print "adl : ".$val->adl."<p>\n";
}
PHP Kompendium wiedzy
275

imap_rfc822_parse_headers
Zwraca obiekt z rnymi elementami nagwka, podobnie do imap_header(), ale bez znacznikw i innych
elementw pochodzcych z serwera IMAP.
object imap_rfc822_parse_headers (string headers [, string defaulthost])
imap_rfc822_write_address
Zwraca prawidowo sformatowany adres e-mail wedug definicji w RFC822
(http://www/faqs.org/rfcs/rfc2045.html), na podstawie skrzynki pocztowej, hosta i danych osobistych.
string imap_rfc822_write_address (string mailbox, string host, string personal)
Przykad: imap_rfc822_write_address()
print imap_rfc822_write_address("hartmut","cvs.php.net","Hartmut Holzgraefe")."\n";
imap_scanmailbox
Zwraca tablic zawierajc nazwy skrzynek, ktre zawieraj tekst przekazany w $string. Funkcja ta jest
podobna do imap_listmailbox(), ale dodatkowo sprawdza czy w danych skrzynki zawarty tekst $content. Opis
parametrw $ref i $pattern mona znale przy funkcji imap_getmailboxes().
array imap_scanmailbox (int imap_stream, string ref, string pattern, string content)
imap_search
Przeszukuje skrzynk pocztow otwart za poc podanego strumienia IMAP. Parametr $criteria zawiera
cig, w ktrym dozwolone s zamieszczone poniej sowa kluczowe rozdzielone spacjami. Wszystkie elementy
wielowyrazowe musz by otoczone apostrofami, na przykad FROM "jan kowalski".
array imap_search (int imap_stream, string criteria, int flags)
ALL zwraca wszystkie wiadomoci speniajce pozostae warunki
ANSWERED szuka wiadomoci z ustawionym znacznikiem \\ANSWERED
BCC "string" szuka wiadomoci z cigiem "string" w polu Bcc:
BEFORE "date" szuka wiadomoci sprzed podanej daty
BODY "string" szuka wiadomoci z cigiem "string" w temacie wiadomoci
CC "string" szuka wiadomoci z cigiem "string" w polu Cc:
DELETED szuka usunitych wiadomoci
FLAGGED szuka wiadomoci z ustawionym znacznikiem \\FLAGGED (czasami nazywanymi
wiadomociami wanymi)
FROM "string" szuka wiadomoci z cigiem "string" w polu From:
KEYWORD "string" szuka wiadomoci ze sowem kluczowym "string"
NEW szuka nowych wiadomoci
OLD szuka starych wiadomoci
ON "date" szuka wiadomoci z polem Date: ustawionym na "date"
RECENT szuka wiadomoci z ustawionym znacznikiem \\RECENT
SEEN szuka przeczytanych wiadomoci (z ustawionym znacznikiem \\SEEN)
SINCE "date" szuka wiadomoci z polem Date: ustawionym na dat wczeniejsz od "date"
SUBJECT "string" szuka wiadomoci z cigiem "string" w polu Subject:
TEXT "string" szuka wiadomoci z cigiem "string" w tekcie
TO "string" szuka wiadomoci z cigiem "string" w polu To:
UNANSWERED szuka wiadomoci, a ktre nie bya udzielona odpowied
UNDELETED szuka wiadomoci, ktre nie s usunite
UNFLAGGED szuka wiadomoci, ktre nie s oznaczone
UNKEYWORD "string" szuka wiadomoci nie posiadajcych sowa kluczowego "string"
UNSEEN szuka wiadomoci nie przeczytanych
Dodatek A - Funkcje
276

Na przykad, aby odnale wszystkie wiadomoci wysanych przez Mama, na ktre nie bya udzielona
odpowied, naley uy cigu "UNANSWERED FROM Mama". Przy przeszukiwaniu due i mae litery nie s
rozrniane. Podana lista warunkw jest odczytana ze rde UW c-client i moe by niekompletna lub
nieprecyzyjna (patrz RFC2060 sekcja 6.4.4). Prawidow wartoci parametru $flags jest SE_UID, ktry powoduje
zwracanie tablicy zawierajcej identyfikatory UID zamiast numerw kolejnych wiadomoci.
imap_setflag_full
Powoduje dodanie okrelonych znacznikw do wiadomoci z podanej sekwencji. Znaczniki jakie mona
ustawi to: \\Seen, \\Answered, \\Flagged, \\Deleted, \\Draft i \\Recent (wedug RFC2060). Prawidow wartoci
parametru $flags jest ST_UID, ktry powoduje zwracanie tablicy zawierajcej identyfikatory UID zamiast
numerw kolejnych wiadomoci.
string imap_setflag_full (int stream, string sequence, string flag, string options)
Przykad: imap_setflag_full()
$mbox = imap_open("{your.imap.host:143}","username","password")
or die("bd poczenia: ".imap_last_error());

$status = imap_setflag_full($mbox,"2,5","\\Seen \\Flagged");
print gettype($status)."\n";
print $status."\n";
imap_close($mbox);
imap_sort
Zwraca tablic numerw wiadomoci posortowan wedug podanego parametru. Jeeli $reverse jest 1,
sortowanie jest odwrotne.
array imap_sort (int stream, int criteria, int reverse, int options)
Sortowanie moe si odbywa wedug jednego (tylko jednego) z poniszych warunkw:
SORTDATE data wiadomoci
SORTARRIVAL data otrzymania wiadomoci
SORTFROM adresu nadawcy (From:)
SORTSUBJECT tematu wiadomoci
SORTTO adresu z pola To:
SORTCC adresu z pola Cc:
SORTSIZE wielkoci przesyki liczonej w oktetach
Opcje s mask bitow z nastpujcymi wartociami:
SE_UID Funkcja zwraca identyfikatory UID zamiast numerw kolejnych
SE_NOPREFETCH nie odczytuje wstpnie szukanych wiadomoci
imap_status
Zwraca obiekt zawierajcy dane statusu.
object imap_status (int imap_stream, string mailbox, int options)
Dozwolonymi znacznikami s:
SA_MESSAGES ustawia status->messages na ilo wiadomoci w skrzynce
SA_RECENT ustawia status->recent na ilo niedawnych wiadomoci w skrzynce
SA_UNSEEN ustawia status->unseen na ilo nierzeczytanych (nowych) wiadomoci w skrzynce
SA_UIDNEXT ustawia status->uidnext na nastpny UID jaki zostanie uyty w skrzynce
SA_UIDVALIDITY ustawia status->uidvalidity na sta, ktra zmienia si, gdy UID skrzynki przestaje
by prawidowy
SA_ALL ustawia wszystkie powysze waciwoci
Dodatkowo ustawiany jest status->flags zawierajcy mask bitow, ktra moe by porwnywana z
przedstawionymi powyej staymi.
Przykad: imap_status()
$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
or die("bd poaczenia: ".imap_last_error());
PHP Kompendium wiedzy
277


$status = imap_status($mbox,"{your.imap.host}INBOX",SA_ALL);
if($status) {
print("Wiadomoci: ". $status->messages )."<br>\n";
print("Niedawnych: ". $status->recent )."<br>\n";
print("Nieprzeczytanych:". $status->unseen )."<br>\n";
print("Nastpny UID: ". $status->uidnext )."<br>\n";
print("Poprawno UID: ". $status->uidvalidity)."<br>\n";
} else
print "nieudane wywoanie imap_status: ".imap_last_error()."\n";
imap_close($mbox);
imap_subscribe
Subskrybuje now skrzynk. Zwraca True po poprawnym wykonaniu operacji lub False w przypadku
bdu.
int imap_subscribe (int imap_stream, string mbox)
imap_uid
Zwraca identyfikator UID wiadomoci na podstawie jej numeru kolejnego. UID to jednoznaczny
identyfikator nie zmieniajcy si w czasie w przeciwiestwie do numerw kolejnych, ktre mog si zmieni po
zmianie zawartoci skrzynki. Funkcja jest odwrotna do imap_msgno().
int imap_uid (int imap_stream, int msgno)
imap_undelete
Usuwa znacznik usunicia dla podanej wiadomoci ustawiony przez funkcj imap_delete() lub
imap_move(). Zwraca True w przypadku powodzenia i False w przypadku bdu.
int imap_undelete (int imap_stream, int msg_number)
imap_unsubscribe
Usuwa subskrypcj do podanej skrzynki. Zwraca True w przypadku powodzenia i False w przypadku
bdu.
int imap_unsubscribe (int imap_stream, string mbox)
imap_utf7_decode
Dekoduje $text w postaci UTF-7 do danych 8-bitowych. Zwraca zdekodowane dane 8-bitowe, lub False,
gdy cig wejciowy nie jest prawidowym cigiem UTF-7. Funkcja ta jest niezbdna do dekodowania nazw
skrzynek zwierajcych znaki narodowe spoza drukowalnego zakresu kodw ASCII. Zmodyfikowane kodowanie
UTF-7 jest zdefiniowane w RFC2060 (http://www/faqs.org/rfcs/rfc2060.html sekcja 5.1.3), natomiast oryginalne
kodowanie UTF-7 jest zdefiniowane w RFC1642 (http://www/faqs.org/rfcs/rfc1642.html).
string imap_utf7_decode (string text)
imap_utf7_encode
Konwertuje 8-bitowe dane do tekstu UTF-7. Jest to niezbdne do zakodowania nazw skrzynek
zawierajcych znaki narodowe spoza drukowalnego zakresu kodw ASCII. Zmodyfikowane kodowanie UTF-7
jest zdefiniowane w RFC2060 (http://www/faqs.org/rfcs/rfc2060.html sekcja 5.1.3), natomiast oryginalne
kodowanie UTF-7 jest zdefiniowane w RFC1642 (http://www/faqs.org/rfcs/rfc1642.html). Zwraca cig
zakodowany zmodyfikowan metod UTF-7.
string imap_utf7_encode (string data)
imap_utf8
Konwertuje podany cig na posta UTF8 w sposb zdefiniowany w RFC2044.
string imap_utf8 (string text)
Dodatek A - Funkcje
278

implode
Zwraca cig zawierajcy wszystkie elementy tablicy w tej samej kolejnoci z cigiem sklejajcym
pomidzy elementami.
Uwaga
Funkcja implode() moe, z powodw historycznych, pobiera swoje argumenty w dowolnym porzdku. Jednak z powodu spjnoci
z explode() powinno si korzysta z kolejnoci przedstawionej w dokumentacji.
Patrz rwnie: explode(), join() i split().
string implode (string glue, array pieces)
Przykad: implode()
$colon_separated = implode(":", $array);
ini_alter
Zmienia warto podanej opcji konfiguracji. Zwraca False w przypadku niepowodzenia, natomiast w
przypadku sukcesu, poprzedni warto opcji.
Uwaga
Jest to alias do ini_set().
Patrz rwnie: ini_get(), ini_restore() i ini_set().
string ini_alter (string varname, string newvalue)
ini_get
Zwraca warto opcji konfiguracji lub False w przypadku wystpienia bdu. Patrz rwnie: ini_alter(),
ini_restore() i ini_set().
string ini_get (string varname)
ini_restore
Przywraca oryginaln warto podanej opcji konfiguracji. Patrz rwnie ini_alter(), ini_get() i
ini_set().
string ini_restore (string varname)
ini_set
Ustawia warto podanej opcji konfiguracji. Zwraca False w przypadku niepowodzenia, natomiast w
przypadku sukcesu, poprzedni warto opcji. Patrz rwnie: ini_alter(), ini_get() i ini_restore().
string ini_set (string varname, string newvalue)
intval
Zwraca warto cakowit zmiennej $var przy uyciu konwersji o podanej podstawie (wartoci domyln
jest 10). Parametr $var moe by dowolnym typem skalarnym. Nie mona uywa funkcji intval() na tablicach i
obiektach. Patrz rwnie doubleval(), strval() i settype().
int intval (mixed var [, int base])
in_array
Szuka $needle w $haystack. Zwraca True, jeeli cig zostanie znaleziony w tablicy i False, jeeli nie
zostanie znaleziony.
bool in_array (mixed needle, array haystack)
PHP Kompendium wiedzy
279

Przykad: in_array()
$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array ("Irix", $os)) {
print "Znaleziono Irix";
}
ip2long
Generuje adres IPv4 na podstawie standardowego formatu (cig z kropkami).
int ip2long (string ip_address)
Przykad: ip2long()
<?php
$ip = gethostbyname("www.php.net");
$out = "Nastpujce adresy s swoimi odpowiednikami:<br>\n";
$out .= "http://www.php.net/, http://".$ip."/ i http://".ip2long($ip)."/<br>\n";
echo $out;
?>
Patrz rwnie: long2ip().
iptcparse
Dzieli pojedynczy blok IPTC na pojedyncze znaczniki. Zwraca tablic uywajc jako indeksw oznacze
znacznikw a jako wartoci, wartoci znacznikw. W przypadku bdu lub braku danych IPTC zwraca False.
Patrz rwnie: GetImageSize().
array iptcparse (string iptcblock)
isset
Jeeli istnieje $var zwraca True, a False gdy nie istnieje. Jeeli zmienna zostaa usunita za pomoc
unset(), funkcja isset() zwraca False.
boolean isset (mixed var)
Przykad: isset()
$a = "test";
echo isset ($a); // TRUE
unset ($a);
echo isset ($a); // FALSE
$foo = NULL;
print isset ($foo); // FALSE
Patrz rwnie: empty() i unset().
is_array
Zwraca True, jeeli $var jest tablic i False, gdy ni nie jest. Patrz rwnie: is_float(), is_int(),
is_integer(), is_string() i is_object().
bool is_array (mixed var)
is_bool
Zwraca True, jeeli parametr $var jest wartoci boolean. Parz rwnie: is_array(), is_float(), is_int(),
is_integer(), is_string() i is_object().
bool is_bool (mixed var)
is_dir
Zwraca True, jeeli istnieje katalog o podanej nazwie. Wynik funkcji jest przechowywany w pamici
podrcznej. Wicej szczegw na ten temat znajduje si w opisie funkcji clearstatchache(). Patrz rwnie:
is_file() i is_link().
bool is_dir (string filename)
Dodatek A - Funkcje
280

is_double
Zwraca True, jeeli parametr $var jest liczb double, w przeciwnym wypadku zwraca False. Patrz
rwnie: is_bool(), is_int(), is_integer(), is_string(), is_array() i is_object().
int is_double( mixed var)
is_executable
Zwraca True, jeeli istnieje plik o podanej nazwie pliku i jest on plikiem wykonywalnym. Wyniki
dziaania funkcji s przechowywane w pamici podrcznej. Wicej szczegw na ten temat znajduje si w opisie
funkcji clearstatchache(). Patrz rwnie: is_file() i is_link().
bool is_executable (string filename)
is_file
Zwraca True, jeeli istnieje plik o podanej nazwie pliku i jest on zwykym plikiem. Wyniki dziaania
funkcji s przechowywane w pamici podrcznej. Wicej szczegw na ten temat znajduje si w opisie funkcji
clearstatchache(). Patrz rwnie: is_dir() i is_link().
bool is_file (string filename)
is_float
Alias do funkcji is_double(). Patrz rwnie: is_bool(), is_int(), is_integer(), is_string(), is_array()
i is_object().
bool is_float (mixed var)
is_int
Alias do is_long(). Patrz rwnie: is_bool(), is_float(), is_integer(), is_string(), is_array() i
is_object().
bool is_int (mixed var)
is_integer
Alias do is_long(). Patrz rwnie: is_bool(), is_float(), is_integer(), is_string(), is_array() i
is_object().
bool is_integer (mixed var)
is_link
Zwraca True, jeeli istnieje plik o podanej nazwie pliku i jest on czem symbolicznym. Wyniki dziaania
funkcji s przechowywane w pamici podrcznej. Wicej szczegw na ten temat znajduje si w opisie funkcji
clearstatchache(). Patrz rwnie: is_dir() i is_file(). Funkcja ta nie dziaa w systemie Windows.
bool is_link (string filename)
is_long
Zwraca True, jeeli $var jest liczb cakowit (long), w przeciwnym wypadku zwraca False. Patrz
rwnie: is_bool(), is_float(), is_integer(), is_string(), is_array() i is_object().
is_long( mixed var)
is_numeric
Zwraca True, jeeli $var jest liczb lub cigiem zawierajcym liczb, w przeciwnym wypadku zwraca
False. Patrz rwnie: is_bool(), is_float(), is_int(), is_string(), is_object(), is_array() i is_integer().
PHP Kompendium wiedzy
281
bool is_numeric (mixed var)

is_object
Zwraca True, jeeli $var jest obiektem, w przeciwnym wypadku zwraca False. Patrz rwnie: is_bool(),
is_int(), is_integer(), is_float(), is_string() i is_array().
bool is_object (mixed var)
is_readable
Zwraca True, jeeli plik o podanej nazwie istnieje i mona go odczyta. Naley pamita, e PHP moe
czyta ten plik jako uytkownik na rzecz ktrego jest uruchomiony serwer WWW (czsto jest to nobody). Nie s
brane pod uwag ograniczenia trybu bezpiecznego. Wicej szczegw na ten temat znajduje si w opisie funkcji
clearstatchache(). Patrz rwnie: is_writable().
bool is_readable (string filename)
is_real
Alias do funkcji is_double(). Patrz rwnie: is_bool(), is_int(), is_integer(), is_string(), is_array()
i is_object().
int is_real( mixed var )
is_resource
Zwraca True, jeeli zmienna przekazana przez parametr $var jest zasobem, w przeciwnym przypadku
zwraca False. Zasobami s identyfikatory plikw lub wynikw zapyta do bazy danych, ktre s tworzone i
usuwane poprzez wewntrzne funkcje PHP. Jeeli nie s one uywane mona zastosowa ich porzdkowanie, ale
nie powinny by one zwalniane przez kod uytkownika.
bool is_resource (mixed var)
is_string
Zwraca True, jeeli $var jest cigiem, w przeciwnym wypadku zwraca False. Patrz rwnie:
is_bool(), is_int(), is_integer(), is_float(), is_real(), is_object() i is_array().
bool is_string (mixed var)
is_subclass_of
Zwraca True, jeeli $obj jest obiektem klasy, ktra jest klas pochodn po $superclass, w przeciwnym
wypadku zwraca False. Patrz rwnie: get_class(), get_parent_class().
bool is_subclass_of (object obj, string superclass)
is_uploaded_file
Funkcja ta jest dostpna w PHP3 poczwszy od wersji PHP 3.0.16 i w PHP od wersji 4.0.2. Zwraca True,
jeeli plik o podanej nazwie zosta przesany poprzez HTTP POST. Jest ona uyteczna do sprawdzenia, czy
zoliwy uytkownik nie prbuje oszuka skryptu tak, aby pracowa on na pliku, na ktrym nie powinien, na
przykad /etc/passwd. Jest to uyteczne, gdy istnieje jakakolwiek szansa, e zawarto przesyanego pliku moe
by pokazana uytkownikowi, lub innym uytkownikom na tym samym systemie. Patrz rwnie:
move_uploaded_file().
bool is_uploaded_file (string filename)
is_writeable
Zwraca True, jeeli plik o podanej nazwie istnieje i mona do niego pisa. Parametr moe by rwnie
nazw katalogu, co pozwala sprawdzi, czy mona zapisywa do tego katalogu. Naley pamita, e PHP moe
czyta ten plik jako uytkownik na rzecz ktrego jest uruchomiony serwer WWW (czsto jest to nobody). Nie s
Dodatek A - Funkcje
282

brane pod uwag ograniczenia trybu bezpiecznego. Wicej szczegw na ten temat znajduje si w opisie funkcji
clearstatchache(). Patrz rwnie: is_readable().
bool is_writeable (string filename)
JDDayOfWeek
Zwraca dzie tygodnia. W zalenoci od trybu moe zwraca cig lub liczb.
mixed jddayofweek (int julianday, int mode)
Tabela 2. Tryby tygodni w kalendarzu
Tryb Znaczenie
0 Zwraca numer dnia jako liczb (0=niedziela,
1=poniedziaek, itd.)
1 Zwraca cig zawierajcy dzie tygodnia (angielski-
gregoriaski)
2 Zwraca cig zawierajcy skrt dnia tygodnia
(angielski-gregoriaski)
JDMonthName
Zwraca cig zawierajcy nazw miesice. Parametr $mode wskazuje funkcji do ktrego kalendarza
skonwertowa liczb dni juliaskich i jaki typ nazwy miesica naley zwrci.
string jdmonthname (int julianday, int mode)
Tabela 3. Tryby kalendarza
Tryb Znaczenie
0 Gregoriaski skrcony
1 Gregoriaski
2 Juliaski skrcony
3 Juliaski
4 ydowski
5 Republiki francuskiej
JDToFrench
Konwertuje liczb dni juliaskich do kalendarza Rewolucji Francuskiej.
string jdtofrench (int juliandaycount)
JDToGregorian
Konwertuje liczb dni juliaskich na cig zawierajcy dat gregoriask w formacie miesic/dzie/rok.
string jdtogregorian (int julianday)
JDToJewish
Konwertuje liczb dni juliaskich na kalendarz ydowski.
string jdtojewish (int julianday)
JDToJulian
Konwertuje liczb dni juliaskich na cig zawierajcy dat w kalendarzu juliaskim w formacie
miesic/dzie/rok.
string jdtojulian (int julian3day)
PHP Kompendium wiedzy
283

jdtounix
Zwraca znacznik czasu Uniksa odpowiadajcy dacie juliaskiej przekazanej w $jday, lub False jeeli
$jday wykracza poza er Uniksa (lata gregoriaskie pomidzy 1970 i 2037 lub 2440588 <= $jday <= 2465342).
Patrz rwnie: jdtounix().
Uwaga
Funkcja ta jest dostpna od wersji PHP4RC1.
int jdtounix (int jday)
JewishToJD
Mimo, e oprogramowanie moe obsugiwa daty a do roku 1 (3761 p.n.e.), jednak moe by to mylce.
Kalendarz ydowski jest w uyciu od kilku tysicy lat, ale w pocztkowym okresie nie byo wzoru na wyliczenie
pocztku miesica. Miesic by rozpoczynany po zaobserwowaniu nowiu ksiyca.
int jewishtojd (int month, int day, int year)
join
Jest to alias do funkcji implode() i dziaa identycznie. Patrz rwnie: explode(), implode() i split().
string join (string glue, array pieces)
JulianToJD
Zakres dat kalendarza juliaskiego to 4713 p.n.e. do 9999 n.e. Mimo, e oprogramowanie moe
obsugiwa daty od 413 p.n.e., jednak moe by to mylce. Kalendarz zosta utworzony w roku 46 p.n.e., ale jego
szczegy nie ustabilizoway si do roku 8 n.e. a nawet prawdopodobnie do 4 wieku. Rwnie pocztek roku
rni si w rnych kulturach nie wszyscy zaakceptowali stycze jako pierwszy miesic.
int juliantojd (int month, int day, int year)
key
Zwraca klucz biecej pozycji tablicy. Patrz rwnie: current() i next().
mixed key (array array)
krsort
Sortuje tablic w odwrotnej kolejnoci utrzymujc korelacj midzy kluczami i danymi. Jest to przydatne
w przypadku tablic asocjacyjnych.
int krsort (array array [, int sort_flags])
Przykad: krsort()
<?
$fruits = array ("d"=>"cytryna", "a"=>"pomaracza", "b"=>"banan", "c"=>"jabko");
krsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
echo "$key = $val\n";
}
?>
Wykonanie przykadu spowoduje wywietlenie:
d = cytryna
c = jabko
b = banan
a = pomaracza
Mona zmieni dziaanie funkcji uywajc opcjonalnego parametru $sort_flags. Szczegowy opis
znajduje si przy funkcji sort(). Patrz rwnie: asort(), arsort(), ksort(), sort(), natsort() i rsort().
Dodatek A - Funkcje
284

ksort
Sortuje tablic utrzymujc korelacj midzy kluczami i danymi. Jest to przydatne w przypadku tablic
asocjacyjnych.
int ksort (array array [, int sort_flags])
Przykad: ksort()
<?
$fruits = array ("d"=>"cytryna", "a"=>"pomaracza", "b"=>"banan", "c"=>"jabko");
ksort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
echo "$key = $val\n";
}
?>
Wykonanie przykadu spowoduje wywietlenie:
a = pomaracza
b = banan
c = jabko
d = cytryna
Mona zmieni dziaanie funkcji uywajc opcjonalnego parametru $sort_flags. Szczegowy opis
znajduje si przy funkcji sort(). Patrz rwnie: asort(), arsort(), krsort(), sort(), natsort() i rsort().
lcg_value
Zwraca liczb pseudolosow z zakresu (0, 1). Funkcja czy dwie wartoci CG z okresem 2^31 - 85 i 2^31
- 249. Okres tej funkcji jest rwny iloczynowi obu liczb pierwszych.
double lcg_value( void )
ldap_add
Zwraca True w przypadku powodzenia operacji i False w przypadku bdu. Funkcja ldap_add() jest
uywana do dodawania wpisw do katalogu LDAP. DN dodawanego wpisu jest okrelane w parametrze $dn.
Tablica $entry zawiera informacje na temat wpisw. Wartoci wpisw s indeksowane kolejnymi atrybutami. W
przypadku wielu wartoci atrybutu s one indeksowane liczbami rozpoczynajc od 0:
entry["atrybut1"] = warto
entry["atrybut2"][0] = warto1
entry["atrybut2"][1] = warto 2

int ldap_add (int link_identifier, string dn, array entry)

Przykad: Kompletny przykad autoryzowanego wizania
<?php
$ds=ldap_connect("localhost"); // zakadajc,e serwer LDAP
// dziaa na tym komputerze
if ($ds) {
// wizanie z odpowiednim dn, aby uzyska moliwo wprowadzania zmian
$r=ldap_bind($ds,"cn=root, o=My Company, c=US", "secret");

// przygotowanie danych
$info["cn"]="John Jones";
$info["sn"]="Jones";
$info["mail"]="jonj@here.and.now";
$info["objectclass"]="person";

// dodanie danych do katalogu
$r=ldap_add($ds, "cn=John Jones, o=My Company, c=US", $info);

ldap_close($ds);
} else {
echo "Bd wizania z serwerem LDAP";
}
?>
PHP Kompendium wiedzy
285

ldap_bind
Wie z katalogiem LDAP z odpowiednim RDN i hasem. Zwraca True w przypadku powodzenia i False
w przypadku bdu. Funkcja ldap_bind() wykonuje operacj wizania. Parametry $bind_rdn i $bind_password s
opcjonalne. Jeeli nie zostan podane, wykonane zostanie wizanie anonimowe.
int ldap_bind (int link_identifier [, string bind_rdn [, string bind_password]])
ldap_close
Zwraca True w przypadku powodzenia i False w przypadku bdu. Funkcja ldap_close() zamyka
poczenie z serwerem LDAP, skojarzone z podanym identyfikatorem $link_identifier. Wywoanie to jest
wewntrznie identyczne z ldap_unbind(). API LDAP korzysta z funkcji ldap_unbind(), wic prawdopodobnie
naley uywa tej funkcji zamiast ldap_close().
int ldap_close (int link_identifier)
ldap_compare
Zwraca True, jeeli zostanie dopasowana warto $value, w przeciwnym przypadku zwraca False. Zwraca
-1 w przypadku bdu. Funkcja ldap_compare() jest uywana do porwnywania wartoci $value atrybutu
$attribute z wartoci tego samego atrybutu w pozycji katalogu LDAP okrelonej przez $dn. Zamieszczony
przykad pokazuje, w jaki sposb mona sprawdzi czy podane haso odpowiada zdefiniowanemu w pozycji DN.
int ldap_compare (int link_identifier, string dn, string attribute, string value)
Przykad: Przykad kontroli hasa
<?php
$ds=ldap_connect("localhost"); // zakadajc,e serwer LDAP
// dziaa na tym komputerze
if ($ds) {
// wizanie
if(ldap_bind($ds)) {
// przygotowanie danych
$dn = "cn=Matti Meikku, ou=My Unit, o=My Company, c=FI";
$value = "secretpassword";
$attr = "password";
// porwnanie wartoci
$r=ldap_compare($ds, $dn, $attr, $value);
if ($r === -1) {
echo "Bd: ".ldap_error($ds);
} elseif ($r === TRUE) {
echo "Haso prawdowe.";
} elseif ($r === FALSE) {
echo "Haso nieprawidowe!";
}
} else {
echo "Bd przy czeniu z serwerem LDAP.";
}
ldap_close($ds);
} else {
echo "Nie mona przyczy do serwera LDAP.";
}
?>
Uwaga
Funkcja ldap_compare() nie moe porwnywa wartoci binarnych! Funkcja zostaa dodana w PHP 4.0.2.
ldap_connect
W przypadku powodzenia operacji zwraca dodatni identyfikator cza LDAP, w przypadku bdu zwraca
False. Funkcja ldap_connect() zestawia poczenie z serwerem LDAP na komputerze $hostname i porcie $port.
Oba argumenty s opcjonalne. Jeeli nie podane zostan argumenty, zwracany jest identyfikator istniejcego
poczenia. Jeeli zostanie podana jedynie nazwa komputera, domylnym portem jest 389.
int ldap_connect ([string hostname [, int port]])
Dodatek A - Funkcje
286

ldap_count_entries
Zwraca ilo pozycji w wyniku lub False w przypadku wystpienia bdu. Funkcja ldap_count_entries()
zwraca ilo pozycji zapamitanych w wyniku ostatniej operacji szukania. Parametr $result_identifier okrela
wewntrzny wynik LDAP.
int ldap_count_entries (int link_identifier, int result_identifier)
ldap_delete
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja ldap_delete()
usuwa pozycj z katalogu LDAP okrelon przez $dn.
int ldap_delete (int link_identifier, string dn)
ldap_dn2ufn
Uywana do przeksztacania DN na posta bardziej czytelna dla czowieka poprzez usunicie nazw typw.
string ldap_dn2ufn (string dn)
ldap_err2str
Zwraca cig z komunikatem bdu. Funkcja ta zwraca komunikat bdu opisujcy bd numer $errno.
Cho numery bdw LDAP s zestandaryzowane, rne biblioteki zwracaj rne, nawet przetumaczone,
tekstowe opisy bdw. Nigdy nie naley porwnywa tekstu komunikatw bdw, zamiast tego zawsze naley
uywa do porwnania numerw bdw. Patrz rwnie: ldap_errno() i ldap_error().
string ldap_err2str (int errno)
Przykad: Wyliczanie wszystkich komunikatw bdw LDAP
<?php
for($i=0; $i<100; $i++) {
printf("Bd $i: %s<br>\n", ldap_err2str($i));
}
?>
ldap_errno
Zwraca numer bdu LDAP dla ostatniego polecenia LDAP na podanym poczeniu. Funkcja ta zwraca
standardowy numer bdu zwracany przez ostatnie polecenie LDAP. Numer ten moe zosta zamieniony na
komunikat tekstowy za pomoc funkcji ldap_err2str(). Jeeli nie zmniejszysz wystarczajco poziomu ostrzee
w pliku php.ini lub nie bdziesz poprzedza funkcji LDAP znakiem @, generowane bdy bd pokazyway si
rwnie w wynikowym HTML.
int ldap_errno (int link_id)
Przykad: Generowanie i przechwytywanie bdw
<?php
// przykad ten zawiera bd, ktry zostanie przechwycony
$ld = ldap_connect("localhost");
$bind = ldap_bind($ld);
// bd skadni w wyraeniu filtrujcym (nr: 87),
// aby dziaao musi by "objectclass=*"
$res = @ldap_search($ld, "o=Myorg, c=DE", "objectclass");
if (!$res) {
printf("LDAP-Errno: %s<br>\n", ldap_errno($ld));
printf("LDAP-Error: %s<br>\n", ldap_error($ld));
die("Aaaaaa!<br>\n");
}
$info = ldap_get_entries($ld, $res);
printf("%d pasujcych wpisw.<br>\n", $info["count"]);
?>
Patrz rwnie: ldap_err2str() i ldap_error().
ldap_error
PHP Kompendium wiedzy
287
Zwraca cig z komunikatem bdu. Funkcja zwraca komunikat bdu objaniajcy bd wygenerowany
przez ostatnie polecenie LDAP wykonane na podanym poczeniu. Cho numery bdw LDAP s

zestandaryzowane, rne biblioteki zwracaj rne, nawet przetumaczone, tekstowe opisy bdw. Nigdy nie
naley porwnywa tekstu komunikatw bdw, zamiast tego zawsze naley uywa do porwnania numerw
bdw. Jeeli nie zmniejszysz wystarczajco poziomu ostrzee w pliku php.ini lub nie bdziesz poprzedza
funkcji LDAP znakiem @, generowane bdy bd pokazyway si rwnie w wynikowym HTML. Patrz rwnie:
ldap_err2str() i ldap_errno().
string ldap_error (int link_id)
ldap_explode_dn
Funkcja uywana do podziau cigu DN zwracanego przez funkcj ldap_get_dn(), na pojedyncze
komponenty. Kada z czci nazywana jest Relative Distinguished Name (RDN). Funkcja ldap_explode_dn()
zwraca tablic zawierajc wszystkie te czci. Za pomoc parametru $with_attrib mona zdecydowa, czy
RDN s zwracane ze swoimi wartociami, czy bez. Aby otrzyma RDN z wartoci (to znaczy w postaci
atrybut=warto) naley ustawi $with_attrib na 0. Aby otrzyma tylko wartoci, naley ustawi go na 1.
array ldap_explode_dn (string dn, int with_attrib)
ldap_first_attribute
Zwraca pierwszy atrybut pozycji lub False w przypadku bdu. Podobnie do odnonych pozycji, atrybuty
rwnie mog by czytane po kolei z okrelonej pozycji. Funkcja ldap_first_attribute() zwraca pierwszy
atrybut pozycji wskazywanej przez identyfikator pozycji. Pozostae atrybuty mog by odczytane za pomoc
kolejnych wywoa ldap_next_attribute(). Parametr $ber_identifier jest identyfikatorem wewntrznego
wskanika pamici. Jest on przekazywany przez referencj. Ten sam $ber_identifier jest przekazywany do
ldap_next_attribute(), ktra modyfikuje wskanik. Patrz rwnie: ldap_get_attributes().
string ldap_first_attribute (int link_identifier, int result_entry_identifier,
int ber_identifier)
ldap_first_entry
Zwraca identyfikator pierwszej pozycji wyniku lub False w przypadku bdu. Pozycje w wyniku LDAP
mog by czytane sekwencyjnie przy uyciu funkcji ldap_first_entry() i ldap_next_entry(). Funkcja
ldap_first_entry() zwraca identyfikator pierwszej pozycji wyniku. Identyfikator ten przekazywany jest do
funkcji ldap_next_entry() w celu odczytania kolejnych pozycji wyniku. Patrz rwnie: ldap_get_entries().
int ldap_first_entry (int link_identifier, int result_identifier)
ldap_free_result
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja
ldap_free_result() zwalnia pami zajmowan przez wynik, na ktry wskazuje $result_identifier. Caa
pami zajmowana przez wynik jest automatycznie zwalniana po zakoczeniu skryptu. W przypadku, gdy skrypt
wykonuje kolejne wyszukiwania, ktre powoduj powstanie duych wynikw mona wywoa funkcj
ldap_free_result(), aby zmniejszy ilo pamici zuywan przez skrypt.
int ldap_free_result (int result_identifier)
ldap_get_attributes
Zwraca wszystkie dane pozycji w postaci wielowymiarowej tablicy lub w przypadku wystpienia bdu,
False. Funkcja ldap_get_attribues() uywana jest w celu uproszczenia odczytywania atrybutw i wartoci z
pozycji znajdujcej si w wyniku. Zwracan wartoci jest wielowymiarowa tablica atrybutw i wartoci. Po
odszukaniu odpowiedniej pozycji w katalogu moesz za pomoc takiego wywoania odczyta wszystkie
informacje przechowywane w tej pozycji. Mona wykorzysta t funkcje do napisania aplikacji za pomoc ktrej
mona przeglda pozycje katalogu nawet, gdy nie znamy struktury okrelonych atrybutw. We wielu aplikacjach
szuka si okrelonego atrybutu, na przykad adresu e-mail lub nazwiska i nie ma potrzeby przejmowa si
zawartoci innych pozycji. Struktura tabeli jest nastpujca:
Dodatek A - Funkcje
288

return_value["count"] = ilo atrybutw w pozycji
return_value[0] = pierwszy atrybut
return_value[n] = n-ty atrybut
return_value["atrybut"]["count"] = ilo wartoci atrybutu
return_value["atrybut"][0] = pierwsza warto atrybutu
return_value["atrybut"][i] = i-ta warto atrybutu

array ldap_get_attributes (int link_identifier, int result_entry_identifier)
Przykad: Wywietlenie listy atrybutw przechowywanych w pozycji katalogu
// $ds jest identyfikatorem poczenia z katalogiem
// $sr jest prawidowym wynikiem pochodzcym z
// wywoania jednej z funkcji przeszukujcych
$entry = ldap_first_entry($ds, $sr);
$attrs = ldap_get_attributes($ds, $entry);
echo $attrs["count"]." atrybutw w tej pozycji:<p>";
for ($i=0; $i<$attrs["count"]; $i++)
echo $attrs[$i]."<br>";
Patrz rwnie: ldap_first_attribute() i ldap_next_attribute().
ldap_get_dn
Zwraca DN pozycji wyniku lub False w przypadku bdu. Funkcja ldap_get_dn() jest uywana do
sprawdzenia DN pozycji wyniku.
string ldap_get_dn (int link_identifier, int result_entry_identifier)
ldap_get_entries
Zwraca wszystkie dane pozycji w postaci wielowymiarowej tablicy lub w przypadku wystpienia bdu,
False. Funkcja ldap_get_entries() uywana jest w celu uproszczenia odczytywania wielu pozycji z wyniku i
nastpnie odczytywanie atrybutw i wielokrotnych wartoci. Wszystkie dane s zwracane za pomoc jednego
wywoania funkcji we wielowymiarowej tablicy.
Struktura tablicy jest nastpujca. Indeksy atrybutw s konwertowane do maych liter (wielko liter w
atrybutach ma znaczenie dla serwerw katalogw, ale nie gdy s uywane jako indeksy tablicy).
return_value["count"] = ilo pozycji w wyniku
return_value[0] : szczegy pierwszej pozycji
return_value[i]["dn"] = DN i-tej pozycji w wyniku
return_value[i]["count"] = ilo atrybutw w i-tej pozycji
return_value[i][j] = j-ty atrybut i-tej pozycji w wyniku
return_value[i]["atrybut"]["count"] = ilo wartoci dla atrybutw i-tej pozycji
return_value[i]["atrybut"][j] = j-ta warto atrybutu na i-tej pozycji

array ldap_get_entries (int link_identifier, int result_identifier)
ldap_get_values
Zwraca tablic wartoci atrybutu lub False w przypadku wystpienia bdu. Funkcja ldap_get_values()
jest uywana do odczytania wszystkich wartoci atrybutw z pozycji wyniku. Pozycja jest okrelona przez
$result_entry_identifier. Ilo wartoci mona odczyta z wynikowej tablicy, spod indeksu count.
Poszczeglne wartoci mog by odczytane poprzez numeryczne indeksy tablicy. Pierwszy indeks ma warto 0.
Funkcja wymaga identyfikatora pozycji wyniku, wic musi by poprzedzona przez jedn z funkcji wyszukujcych
i jedno z wywoa pobierajcych poszczeglne pozycje. W aplikacji mona na stae zapisa nazwy interesujcych
nas atrybutw (na przykad surname lub mail), mona rwnie uy funkcji ldap_get_attributes() do
sprawdzenia jakie atrybuty istniej dla danej pozycji. LDAP pozwala na przechowywanie wicej ni jednej
pozycji dla atrybuty, wic mona na przykad zapamitywa kilka adresw e-mail w pozycji katalogu
zawierajcej okrelon osob.
return_value["count"] = ilo wartoci atrybutu
return_value[0] = pierwsza warto atrybutu
return_value[i] = i-ta warto atrybutu

array ldap_get_values (int link_identifier, int result_entry_identifier,
string attribute)
Przykad: Lista wszystkich wartoci atrybutu mail dla pozycji katalogu
// $ds jest identyfikatorem poczenia z katalogiem
PHP Kompendium wiedzy
289
// $sr jest prawidowym wynikiem pochodzcym z

// wywoania jednej z funkcji przeszukujcych
// $entry jest idnetyfikatorem pozycji pochodzcym z
// jednego z wywoa zwracajcych pozycje katalogu
$values = ldap_get_values($ds, $entry,"mail");
echo $values["count"]." adresw email dla tej pozycji.<p>";
for ($i=0; $i < $values["count"]; $i++)
echo $values[$i]."<br>";
ldap_get_values_len
Zwraca tablic wartoci atrybutu lub False w przypadku wystpienia bdu. Funkcja
ldap_get_values_len() uywana jest do odczytania wszystkich wartoci atrybutu dla pozycji wyniku. Pozycja
jest okrelona przez $result_entry_identifier. Ilo wartoci mona odczyta z indeksu count wynikowej
tablicy. Poszczeglne wartoci s dostpne w tablicy pod indeksami cakowitymi. Indeksy zaczynaj si od 0.
Funkcji tej uywa si identycznie jak ldap_get_values(), ale obsuguje dane binarne a nie cigi.
Uwaga
Funkcja zostaa dodana w PHP 4.0.
array ldap_get_values_len (int link_identifier, int result_entry_identifier,
string attribute)
ldap_list
Zwraca identyfikator wyniku poszukiwania, lub False w przypadku wystpienia bdu. Funkcja
ldap_list() przeszukuje katalog w poszukiwaniu wartoci pasujcych do podanego filtra z zastosowaniem
zasigu LDAP_SCOPE_ONELEVEL. Zasig LDAP_SCOPE_ONELEVEL oznacza, e przeszukiwany zostanie tylko poziom
bezporednio po podanym bazowym DN podanym w wywoaniu funkcji (ekwiwalent wpisania ls i pobrania naw
plikw i folderw w biecym katalogu). Funkcja posiada 5 parametrw opcjonalnych. Opis znajduje si przy
omawianiu funkcji ldap_search().
Uwaga
Parametry opcjonalne $attrsonly, $sizelimit, $timelimit i $deref zostay dodane w PHP 4.0.2.
int ldap_list (int link_identifier, string base_dn, string filter [, array attributes
[, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])
Przykad: Utworzenie listy wszystkich jednostek organizacyjnych w organizacji
// $ds jest identyfikatorem poczenia do serwera katalogu
$basedn = "o=My Company, c=US";
$justthese = array("ou");
$sr=ldap_list($ds, $basedn, "ou=*", $justthese);
$info = ldap_get_entries($ds, $sr);
for ($i=0; $i<$info["count"]; $i++)
echo $info[$i]["ou"][0] ;
ldap_modify
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja ldap_modify()
uywana jest do zmiany istniejcych pozycji w katalogu LDAP. Struktura pozycji jest identyczna jak ldap_add().
int ldap_modify (int link_identifier, string dn, array entry)
ldap_mod_add
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja dodaje atrybut do
podanego $dn. Wykonuje zmian na poziomie atrybutu a nie na poziomie obiektu. Dodawanie na poziomie
obiektu wykonywane jest za pomoc funkcji ldap_add().
int ldap_mod_add (int link_identifier, string dn, array entry)
Dodatek A - Funkcje
290

ldap_mod_del
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja usuwa atrybut do
podanego $dn. Wykonuje zmian na poziomie atrybutu a nie na poziomie obiektu. Usuwanie na poziomie obiektu
wykonywane jest za pomoc funkcji ldap_del().
int ldap_mod_del (int link_identifier, string dn, array entry)
ldap_mod_replace
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja zamienia atrybut(y)
z podanego $dn. Wykonuje zmian na poziomie atrybutu a nie na poziomie obiektu. Modyfikacje na poziomie
obiektu wykonywane jest za pomoc funkcji ldap_modify().
int ldap_mod_replace (int link_identifier, string dn, array entry)
ldap_next_attribute
Zwraca kolejny atrybut w pozycji lub False w przypadku wystpienia bdu. Funkcja
ldap_next_attribute() jest wywoywana w celu odczytania atrybutw pozycji. Stan wewntrznego wskanika
jest utrzymywany przez $ber_identifier. Jest on przekazywany do funkcji przez referencj. Pierwsze wywoanie
ldap_next_identifier() jest wykonywane z $result_entry_identifier zwracanym przez
ldap_first_identifier(). Patrz rwnie: ldap_get_atributes().
string ldap_next_attribute (int link_identifier, int result_entry_identifier,
int ber_identifier)
ldap_next_entry
Zwraca identyfikator pozycji dla nastpnej pozycji w wyniku, ktrego pierwsza pozycja zostaa odczytana
za pomoc ldap_first_entry(). Jeeli nie ma ju kolejnych pozycji w wyniku, funkcja zwraca False. Funkcja
ldap_next_entry() uywana jest do odczytania pozycji znajdujcych si w wyniku. Kolejne wywoania
ldap_next_entry() powoduje zwracanie kolejnych pozycji a do ich wyczerpania. Pierwsze wywoanie
ldap_next_entry() jest wykonywane z identyfikatorem wyniku zwrconym przez ldap_first_entry(). Patrz
rwnie: ldap_get_entries().
int ldap_next_entry (int link_identifier, int result_entry_identifier)
ldap_read
Zwraca identyfikator wyniku przeszukiwania lub False w przypadku wystpienia bdu. Funkcja
ldap_read() szuka filtra w katalogu z zakresie LDAP_SCOPE_BASE, wic jest odpowiednikiem odczytania pozycji z
katalogu. Nie jest dozwolone uywanie pustego filtra. Jeeli chcesz odczyta wszystkie dane z tej pozycji naley
uy filtra objectClass=*. Jeeli wiesz, jaki typ pozycji jest uyty w serwerze katalogu, mona wykorzysta
odpowiedni filtr, na przykad objectClass=inetOrgPerson. Funkcja posiada pi parametrw opcjonalnych. Opis
znajduje si przy omawianiu funkcji ldap_search().
Uwaga
Parametry opcjonalne $attrsonly, $sizelimit, $timelimit i $deref zostay dodane w PHP 4.0.2.
int ldap_read (int link_identifier, string base_dn, string filter [, array attributes
[, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])
ldap_search
Zwraca identyfikator wyniku przeszukiwania lub False w przypadku bdu. Funkcja ldap_search() szuka
podanego filtra w katalogu, z zastosowaniem zasigu LDAP_SCOPE_SUBTREE. Jest to ekwiwalent przeszukania
zawartoci katalogu. Parametr $base_dn okrela bazowy DN w katalogu. Dostpny jest czwarty parametr
opcjonalny, ktry pozwala ograniczy ilo zwracanych atrybutw i wartoci. Uycie tego parametru powinno
PHP Kompendium wiedzy
291

by traktowane jako dobr praktyk programistyczn. Czwarty parametr jest zwyk tablic cigw zawierajcych
wymagane atrybuty, na przykad: array( "mail", "cn").
Uwaga
DN jest zawsze zwracany niezalenie od typw danych typw atrybutw. Naley pamita, e niektre serwery katalogw s tak
skonfigurowane, aby zwraca nie wicej, ni skonfigurowan ilo pozycji. Jeeli wystpi taka sytuacja, serwer wskazuje, e zwraca
jedynie czciowy wynik. Wystpuje to rwnie, gdy ustawiony zostanie szsty parametr $sizelimit ograniczajcy ilo
pobieranych pozycji.
int ldap_search (int link_identifier, string base_dn, string filter
[, array attributes [, int attrsonly [, int sizelimit
[, int timelimit [, int deref]]]]])
Pity parametr $attrsonly powinien by ustawiony na 1, jeeli potrzebujemy jedynie atrybutu. Jeeli
ustawiony jest na 0, pobierane s zarwno atrybuty jak i ich wartoci. Jest to ustawienie domylne. Za pomoc
szstego parametru, $sizelimit, mona ograniczy ilo pobieranych pozycji.
Uwaga
Parametr ten nie moe zwikszy limitu ustawionego na serwerze, ale moe go zmniejszy.
Sidmy parametr, $timelimit, ogranicza czas przeszukiwania katalogu do podanej liczby sekund.
Ustawienie tego parametru na 0 powoduje zniesienie limitu.
Uwaga
Parametr ten nie moe zwikszy limitu ustawionego na serwerze, ale moe go zmniejszy.
smy parametr, $deref, wskazuje na sposb obsugi aliasw w czasie szukania. Moe przyjmowa
nastpujce wartoci:
LDAP_DEREF_NEVER (domylny) aliasy nie s rozwijane
LDAP_DEREF_SEARCHING aliasy s rozwijane w czasie szukania, ale nie w czasie okrelania
podstawowych obiektw przeszukiwania
LDAP_DEREF_FINDING aliasy s rozwijane w czasie okrelania podstawowych obiektw przeszukiwania,
ale nie w czasie szukania
LDAP_DEREF_ALWAYS aliasy s zawsze rozwijane
Parametry opcjonalne $atrsonly, $sizelimit, $timelimit i $deref zostay dodane w PHP 4.0.2. Filtry
przeszukiwania mog by proste lub zaawansowane z wykorzystaniem operatorw logicznych w formacie
opisanym w dokumentacji LDAP (np.: Netscape Directory SDK pod adresem
http://developer.netscape.com/docs/manuals/directory/41/ag/find.htm). Poniszy przykad odczytuje jednostk
organizacyjn, nazwisko, imi i e-mail wszystkich osb w firmie Firma, ktrych nazwiska zawieraj cig
okrelony przez zmienn $person. Przykad ten wykorzystuje filtry logiczne nakazujce serwerowi poszukiwanie
danych we wikszej iloci atrybutw.
Przykad: Przeszukiwanie LDAP
// $ds jest identyfikatorem poczenia z katalogiem
// $person jest kompletn nazw lub jej czci np: "Jo"
$dn = "o=Firma, c=US";
$filter="(|(sn=$person*)(givenname=$person*))";
$justthese = array( "ou", "sn", "givenname", "mail");
$sr=ldap_search($ds, $dn, $filter, $justthese);
$info = ldap_get_entries($ds, $sr);
print $info["count"]." pozycji w wyniku<p>";
ldap_unbind
Zwraca True w przypadku powodzenia operacji lub False w przypadku bdu. Funkcja ldap_unbind()
odcza od katalogu LDAP.
int ldap_unbind (int link_identifier)

Dodatek A - Funkcje
292

leak
Powoduje wyciek okrelonej iloci pamici. Jest to przydatne przy testowaniu zarzdcy pamici, ktry
automatycznie odzyskuje pami utracon po wycieku, po zakoczeniu kadego dania.
void leak (int bytes)
levenshtein
Zwraca odlego Levenshtein pomidzy dwoma cigami przekazanymi jako argumenty lub -1 gdy jeden z
cigw jest duszy ni 255 znakw (255 powinno wystarczy do porwnywania nazwisk lub katalogw a nikt
rozsdny nie bdzie wykonywa analizy genetycznej za pomoc PHP). Odlego Levenshtein jest definiowana
jako minimalna ilo znakw jakie trzeba zamieni, wstawi lub usun, aby zamieni $str1 na $str2. Algorytm
ten ma zoono O(m*n), gdzie m i n s dugoci cigw $str1 i $str2 (cakiem niele w porwnaniu do
similar_text(), ktra ma zoono O(max(n,m)**3), ale i tak jest to kosztowny algorytm)
int levenshtein (string str1, string str2)
int levenshtein (string str1, string str2, int cost_ins, int cost_rep, int cost_del)
int levenshtein (string str1, string str2, function cost)
W swojej najprostszej postaci funkcja wymaga jedynie dwch cigw jako parametry i oblicza ilo
operacji wstawienia, zamiany lub usunicia potrzebnych do zamiany $str1 na $str2. Drugi wariant potrzebuje
trzech dodatkowych paramterw definiujcych koszt operacji wstawienia, zamiany i usunicia. Jest to bardziej
oglny i adaptowalny wariant funkcji, ale nie jest on tak wydajny. Trzeci wariant, ktry jeszcze nie zosta
zaimplementowany, bdzie najbardziej oglny, ale rwnie najwolniejszy. Bdzie wywoywa funkcj napisan
przez utkownika, ktra bdzie zwracaa koszt kadej operacji. Funkcja uytkownika posiada musi nastpujce
parametry:
operacja do wykonania: I, R lub D
biecy znak w cigu 1
biecy znak w cigu 2
pozycja w cigu 1
pozycja w cigu 2
pozostae znaki w cigu 1
pozostae znaki w cigu 2
Funkcja napisana przez uytkownika musi zwraca liczb dodatni oznaczajc koszt biecej operacji,
ale do tego celu moe uywa tylko niektrych z przekazanych argumentw. Uycie funkcji uytkownika
pozwala na moliwo wzicia pod uwag rnicy pomidzy znakami lub nawet kontekstu, w jakim wystpuj w
cigu. Jednak wywoywanie tej funkcji do obliczenia kosztu kadej operacji, powoduje utrat wszystkich
optymalizacji uycia rejestrw procesora i pamici podrcznej, ktre s zastosowane w poprzednich dwch
wariantach. Patrz rwnie: soundex(), similar_text() i metaphone().

link
Tworzy trwae cze. Patrz rwnie: symlink() do tworzenia cz symbolicznych oraz readlink() i
linkinfo().
Uwaga
Funkcja ta nie dziaa w systemie Windows
int link (string target, string link)
linkinfo
Zwraca pole st_dev ze struktury stat zwracanej przez funkcj systemow lstat w systemie UNIX.
Funkcja ta uywana jest do sprawdzania, czy cze (wskazywane przez $path) istnieje (wykorzystujc metod
PHP Kompendium wiedzy
293

zdefiniowan w makro S_ISLNK z pliku stat.h). Zwraca 0 lub False w przypadku bdu. Patrz rwnie: symlink(),
link() i readlink().
Uwaga
Funkcja ta nie dziaa w systemie Windows
int linkinfo (string path)
list
Podobnie jak array() nie jest prawdziw funkcj, ale konstrukcj jzyka. list() jest uywane do
przypisywania wartoci do listy zmiennych przy pomocy jednej operacji.
void list (...)
Przykad: list()
<table>
<tr>
<th>Nazwisko pracownika</th>
<th>Pensja</th>
</tr>
<?php
$result = mysql_query ($conn, "SELECT id, name, salary FROM employees");
while (list ($id, $name, $salary) = mysql_fetch_row ($result)) {
print (" <tr>\n".
" <td><a href=\"info.php3?id=$id\">$name</a></td>\n".
" <td>$salary</td>\n".
" </tr>\n");
}
?>
</table>
Patrz rwnie: each() i array().
listen
Po utworzeniu gniazda $socket za pomoc funkcji socket() i przyczeniu go za pomoc bind(), mona
za pomoc funkcji listen() nakaza nasuchiwanie przychodzcych pocze. Kolejkowane i przetwarzane
bdzie $backlog pocze. Funkcja listen() dziaa jedynie na gniazdach o typie SOCK_STREAM lub SOCK_SEQPACKET.
Zwraca 0 w przypadku powodzenia lub ujemny kod bdu w przypadku niepowodzenia. Kod ten moe by
przekazany do strerror() w celu otrzymania tekstu opisujcego bd. Patrz rwnie: socket_connect(), bind(),
connect(), socket(), socket_get_status() i strerror().
int listen (resource socket, int backlog)
localtime
Zwraca tablic identyczn ze struktur zwracan przez t sam funkcj w C. Pierwszym argumentem
localtime() jest znacznik czasu. Jeeli nie zostanie podany, uyty zostanie biecy czas. Drugi argument to
$is_associative. Jeeli jest ustawiony na 0 lub nie zostanie podany, zwracana tablica jest zwyk tablic z
indeksami numerycznymi. Jeeli argument ten zostanie ustawiony na 1, localtime() zwrci tablic asocjacyjn
zawierajc wszystkie elementy struktury zwracanej przez wywoanie funkcji localtime() w C.
array localtime ([int timestamp [, bool is_associative]])
Nazwy kluczy w tablicy asocjacyjnej s:
tm_sec sekundy
tm_min minuty
tm_hour godziny
tm_mday dzie miesica
tm_mon miesic w roku
tm_year rok, nie jest zgodny z rokiem 2000
tm_wday dzie tygodnia
tm_yday dzie kolejny w roku
Dodatek A - Funkcje
294
tm_isdst czy zastosowano czas zimowy

log
Zwraca logarytm naturalny z $arg.
float log (float arg)
log10
Zwraca logarytm o podstawie 10 z $arg.
float log10 (float arg)
long2ip
Generuje adres internetowy w postaci z kropkami (aaa.bbb.ccc.ddd) na podstawie waciwej reprezentacji
adresu.
string long2ip (int proper_address)
lstat
Zbiera statystyki pliku lub cza symbolicznego o podanej nazwie. Funkcja jest podobna do stat() poza
tym, e gdy parametr $filename jest czem symbolicznym, zwracany jest stan cza a nie status pliku, na ktry
wskazuje cze.
array lstat (string filename)
Zwraca tablic ze statystykami nastpujcych parametrw pliku:

urzdzenie i-node tryb zabezpieczenia i-
node
liczba dowiza identyfikator
waciciela
identyfikator grupy
typ urzdzenia, jeeli
jest to urzdzenie z i-node *
rozmiar w bajtach czas ostatniego
dostpu
czas ostatniej
modyfikacji
czas ostatniej zmiany rozmiar bloku dla
operacji wejcia-wyjcia
systemu plikw *
ilo przydzielonych
blokw

* dostpne tylko na systemach obsugujcych typ st_blksize inne systemy (na przykad Windows)
zwracaj -1. Wyniki tej funkcji s przechowywane w buforze. Szczegy zostay opisane przy funkcji
clearstatcache().
ltrim
Usuwa znaki odstpu z pocztku cigu i zwraca obcity cig. Obsugiwanymi znakami odstpu s: \n, \r,
\t, \v, \0 oraz spacja. Patrz rwnie: chop() i trim().
string ltrim (string str [, string charlist])
mail
Wysya wiadomo pocztow o treci przekazanej w $message do odbiorcy w $to. Mona poda wielu
odbiorcw umieszczajc rednik pomidzy adresami przekazanymi w parametrze $to.
bool mail (string to, string subject, string message [, string additional_headers
[, string additional_parameters]])
Przykad: wysyanie poczty
mail("rasmus@lerdorf.on.ca", "Temat", "Linia 1\nLinia 2\nLinia 3");
Jeeli zostanie przekazany czwarty argument cig ten jest wstawiany na kocu nagwka. Jest on zwykle
uywany do wstawiania do wiadomoci dodatkowych nagwkw. Kolejne wiersze nagwka musz by
rozdzielone znakiem nowego wiersza.
PHP Kompendium wiedzy
295

Przykad: Wysyanie wiadomoci z dodatkowymi nagwkami
mail("nobody@aol.com", "Temat", $message,
"From: webmaster@$SERVER_NAME\nReply-To: webmaster@$SERVER_NAME\nX-Mailer: PHP/"
. phpversion());
Mona rwnie stosowa proste techniki budowania cigw do tworzenia cakiem skomplikowanych
wiadomoci e-mail.
Przykad: Wysyanie skomplikowanych przesyek e-mail
/* odbiorcy */
$recipient .= "Mary <mary@u.college.edu>" . ", " ; //zwr uwag na przecinek
$recipient .= "Kelly <kelly@u.college.edu>" . ", ";
$recipient .= "ronabop@php.net";
/* temat */
$subject = "Przypomnienie o urodzinach w sierpniu";
/* wiadomo */
$message .= "Wiadomo zawiera tabel sformatowan za pomoc znakw ASCII\n";
$message .= "Dzie \t\tMiesic \t\tRok\n";
$message .= "3 \t\tSierpie \t\t1970\n";
$message .= "17\t\tSierpie \t\t1973\n";
/* mona doda sygnaturk */
$message .= "--\r\n"; //Separator sygnaturki
$message .= "Przypominacz urodzin oddany do publicznego uywania";
/* dodatkowe fragmenty nagwka, From cc, bcc, itp. */
$headers .= "From: Pzrypominacz urodzin <birthday@php.net>\n";
$headers .= "X-Sender: <birthday@php.net>\n";
$headers .= "X-Mailer: PHP\n"; // klient poczty
$headers .= "X-Priority: 1\n"; // wiadomo wana!
$headers .= "Return-Path: <birthday@php.net>\n"; // cieka zwrotna dla bedw
/* jeeli chcez wysa poczt HTML, usu komentarz z poniszej linii */
// $headers .= "Content-Type: text/html; charset=iso-8859-1\n"; // Typ mime
$headers .= "cc: birthdayarchive@php.net\n"; // CC
$headers .= "bcc: birthdaycheck@php.net, birthdaygifts@php.net"; // BCC
/* wylij wiadomo */
mail($recipient, $subject, $message, $headers);
max
Zwraca parametr o najwikszej wartoci numerycznej. Jeeli pierwszy parametr jest tablic, max() zwraca
najwiksz warto w tablicy. Jeeli pierwszy parametr jest liczb cakowit, cigiem lub liczb double, funkcja
wymaga co najmniej dwch parametrw i zwraca najwikszy z nich. Mona porwnywa nieograniczon ilo
wartoci. Jeeli jedna lub wicej wartoci jest liczb double, wszystkie wartoci s traktowane jako double i
zwracana jest liczba typu double. Jeeli adna z wartoci nie jest liczb double, wszystkie s traktowane jako
liczby cakowite i rwnie zwracana jest liczba cakowita.
mixed max (mixed arg1, mixed arg2, mixed argn)
mcal_append_event
Zapamituje globalne zdarzenie w kalendarzu MCAL, dla podanego strumienia. Zwraca identyfikator
wstawionego zdarzenia.
int mcal_append_event (int mcal_stream)
mcal_close
Zamyka podany strumie MCAL.
int mcal_close (int mcal_stream, int flags)
mcal_create_calendar
Tworzy nowy kalendarz o nazwie $calendar.
string mcal_create_calendar (int stream, string calendar)
mcal_date_compare
Porwnuje dwie podane daty. Zwraca <0, 0, >0 gdy a<b, a==b, a>b.
int mcal_date_compare (int a_year, int a_month, int a_day,
int b_year, int b_month, int b_day)
Dodatek A - Funkcje
296

mcal_date_valid
Zwraca True, jeeli podany rok, miesic i dzie jest prawidow dat lub False, gdy nie jest to data
prawidowa.
int mcal_date_valid (int year, int month, int day)
mcal_days_in_month
Zwraca ilo dni w podanym miesicu biorc pod uwag, czy rok jest przestpny czy nie.
int mcal_days_in_month (int month, int leap year)
mcal_day_of_week
Zwraca dzie tygodnia dla podanej daty.
int mcal_day_of_week (int year, int month, int day)
mcal_day_of_year
Zwraca dzie w roku dla podanej daty.
int mcal_ (int year, int month, int day)
mcal_delete_calendar
Usuwa kalendarz o nazwie $calendar.
string mcal_delete_calendar (int stream, string calendar)
mcal_delete_event
Usuwa zdarzenie kalendarza wskazywane przez $event_id. Zwraca True.
int mcal_delete_event (int mcal_stream [, int event_id])
mcal_event_add_attribute
Dodaje do globalnej struktury zdarze strumienia atrybut o wartoci przekazanej w parametrze $value.
void mcal_event_add_attribute (int stream, string attribute, string value)
mcal_event_init
Inicjuje globaln struktur strumienia. Powoduje to ustawienie wszystkich elementw struktury na 0 lub
na warto domyln. Zwraca True.
int mcal_event_init (int stream)
mcal_event_set_alarm
Ustawia alarm w globalnej strukturze strumienia na podan liczb minut przed zdarzeniem. Zwraca True.
int mcal_event_set_alarm (int stream, int alarm)
mcal_event_set_category
Ustawia kategori globalnej struktury zdarzenia na podany cig. Zwraca True.
int mcal_event_set_category (int stream, string category)
mcal_event_set_class
Ustawia klas globalnej struktury zdarzenia na podan warto. Klasa moe mie warto 1 publiczna
lub 0 prywatna. Zwraca True.
PHP Kompendium wiedzy
297

int mcal_event_set_class (int stream, int class)
mcal_event_set_description
Ustawia opis globalnej struktury zdarzenia na podan warto. Zwraca True.
int mcal_event_set_description (int stream, string description)
mcal_event_set_end
Ustawia dat i czas zakoczenia w globalnej strukturze zdarzenia na podan warto. Zwraca True.
int mcal_event_set_end (int stream, int year, int month [, int day
[, int hour [, int min [, int sec]]]])
mcal_event_set_recur_daily
Ustawia warto powtarzania w globalnej strukturze zdarzenia na podan codzienne powtarzanie koczce
si na podanej dacie.
int mcal_event_set_recur_daily (int stream, int year, int month, int day,
int interval)
mcal_event_set_recur_monthly_mday
Ustawia warto powtarzania w globalnej strukturze zdarzenia na podan comiesiczne powtarzanie
opierajc si na dniu miesica, koczce si na podanej dacie.
int mcal_event_set_recur_monthly_mday (int stream, int year, int month, int day,
int interval)
mcal_event_set_recur_monthly_wday
Ustawia warto powtarzania w globalnej strukturze zdarzenia na podan comiesiczne powtarzanie
opierajc si na tygodniu, koczce si na podanej dacie.
int mcal_event_set_recur_monthly_wday (int stream, int year, int month, int day,
int interval)
mcal_event_set_recur_none
Wycza powtarzanie w globalnej strukturze zdarzenia (event->recur_type jest ustawiane na
MCAL_RECUR_NONE).
int mcal_event_set_recur_none (int stream)
mcal_event_set_recur_weekly
Ustawia warto powtarzania w globalnej strukturze zdarzenia na podan cotygodniowe powtarzanie,
koczce si na podanej dacie.
int mcal_event_set_recur_weekly (int stream, int year, int month, int day,
int interval, int weekdays)
mcal_event_set_recur_yearly
Ustawia warto powtarzania w globalnej strukturze zdarzenia na podan coroczne powtarzanie, koczce
si na podanej dacie.
int mcal_event_set_recur_yearly (int stream, int year, int month, int day,
int interval)
mcal_event_set_start
Ustawia dat i czas rozpoczcia w globalnej strukturze zdarzenia na podan warto. Zwraca True.
int mcal_event_set_start (int stream, int year, int month [, int day [, int hour
Dodatek A - Funkcje
298

[, int min [, int sec]]]])
mcal_event_set_title
Ustawia tytu w globalnej strukturze zdarzenia na podany cig. Zwraca True.
int mcal_event_set_title (int stream, string title)
mcal_expunge
Usuwa wszystkie zdarzenia oznaczone jako usunite.
int mcal_expunge (int stream)
mcal_fetch_current_stream_event
object mcal_fetch_current_stream_event (int stream)
Zwraca biec struktur zdarzenia ze strumienia w postaci obiektu zawierajcy nastpujce atrybuty:
int id Identyfikator zdarzenia.
int public TRUE jeeli zdarzenie jest publiczne, FALSE jeeli jest prywatne.
string category Cig z kategori zdarzenia.
string title Cig z tytuem zdarzenia.
string description Cig z opisem zdarzenia.
int alarm Ilo minut przed zdarzeniem do wysania alarmu lub przypomnienia.
object start Obiekt zawierajcy pocztkow dat i czas.
object end Obiekt zawierajcy kocow dat i czas.
int recur_type Typ powtarzania.
int recur_interval Okres powtarzania.
datetime recur_enddate Data zakoczenia powtarzania.
int recur_data Dane powtarzania.
Wszystkie pozycje zawierajce dat i czas s obiektem zawierajcym:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
int alarm ilo minut przed zdarzeniem kiedy naley wysa przypomnienie
mcal_fetch_event
Pobiera zdarzenie ze strumienia kalendarza okrelonego przez $id.
object mcal_fetch_event (int mcal_stream, int event_id [, int options])
Zwraca obiekt zdarzenia zawierajcy nastpujce atrybuty:
int id Identyfikator zdarzenia.
int public TRUE jeeli zdarzenie jest publiczne, FALSE jeeli jest prywatne.
string category Cig z kategori zdarzenia.
string title Cig z tytuem zdarzenia.
string description Cig z opisem zdarzenia.
int alarm Ilo minut przed zdarzeniem do wysania alarmu lub przypomnienia.
object start Obiekt zawierajcy pocztkow dat i czas.
object end Obiekt zawierajcy kocow dat i czas.
int recur_type Typ powtarzania.
int recur_interval Okres powtarzania.
PHP Kompendium wiedzy
299

datetime recur_enddate Data zakoczenia powtarzania.
int recur_data Dane powtarzania.
Wszystkie pozycje zawierajce dat i czas s obiektem zawierajcym:
int year rok
int month miesic
int mday dzie miesica
int hour godzina
int min minuty
int sec sekundy
int alarm ilo minut przed zdarzeniem kiedy naley wysa przypomnienie
mcal_is_leap_year
Zwraca 1 gdy podany rok jest przestpny, 0 gdy nie jest.
int mcal_is_leap_year (int year)
mcal_list_alarms
Zwraca tablic identyfikatorw zdarze, ktre posiadaj ustawiony alarm pomidzy dat pocztkow i
kocow, lub jeeli podano tylko strumie, uywane s daty z globalnej struktury zdarze. Funkcja
mcal_list_alarms() posiada opcjonalne parametry: dat pocztkowa kocow dla strumienia kalendarza.
Zwracana jest tablica identyfikatorw zdarze, ktre maj alarm pomidzy podanymi datami lub datami z
wewntrznej struktury zdarze.
array mcal_list_alarms (int mcal_stream [, int begin_year [, int begin_month
[, int begin_day [, int end_year [, int end_month [, int end_day]]]]]])
mcal_list_events
Zwraca tablic identyfikatorw zdarze wystpujcych pomidzy dat pocztkow i kocow, lub jeeli
podano tylko strumie, uywane s daty z globalnej struktury zdarze. Funkcja mcal_list_events() posiada
opcjonalne parametry: dat pocztkowa kocow dla strumienia kalendarza. Zwracana jest tablica
identyfikatorw zdarze, ktre s pomidzy podanymi datami lub datami z wewntrznej struktury zdarze.
array mcal_list_events (int mcal_stream, objectbegin_date [, object end_date])
mcal_next_recurrence
Zwraca obiekt z kolejn dat wystpienia zdarzenia po podanej dacie. Zwraca puste pole daty, jeeli
zdarzenie nie wystpi lub wystpi bd. Uywa parametru $weekstart do okrelenia dnia rozpoczynajcego
tydzie.
int mcal_next_recurrence (int stream, int weekstart, array next)
mcal_open
Zwraca strumie MCAL lub False w przypadku bdu. Funkcja mcal_open() otwiera poczenie MCAL
do okrelonego kalendarza. Jeeli podany zostanie opcjonalny parametr $options, funkcja przekazuje rwnie ten
parametr do skrzynki. Po zestawieniu poczenia inicjowana jest rwnie wewntrzna struktura strumienia.
int mcal_open (string calendar, string username, string password [, int options])
mcal_popen
Zwraca strumie MCAL lub False w przypadku bdu. Funkcja mcal_open() otwiera poczenie MCAL
do okrelonego kalendarza. Jeeli podany zostanie opcjonalny parametr $options, funkcja przekazuje rwnie ten
parametr do skrzynki. Po zestawieniu poczenia inicjowana jest rwnie wewntrzna struktura strumienia.
int mcal_popen (string calendar, string username, string password [, int options])
Dodatek A - Funkcje
300

mcal_rename_calendar
Zmienia nazw kalendarza z $old_name na $new_name.
string mcal_rename_calendar (int stream, string old_name, string new_name)
mcal_reopen
Funkcja mcal_reopen() ponownie otwiera poczenie MCAL do okrelonego kalendarza. Jeeli podany
zostanie opcjonalny parametr $options, funkcja przekazuje rwnie ten parametr do skrzynki.
int mcal_reopen (string calendar [, int options])
mcal_snooze
Wycza alarm dla kalendarza o podanym identyfikatorze. Zwraca True.
int mcal_snooze (int id)
mcal_store_event
Zapamituje zmiany w biecym globalnym zdarzeniu dla podanego strumienia. Zwraca True w
przypadku powodzenia a False w przypadku bdu.
int mcal_store_event (int mcal_stream)
mcal_time_valid
Zwraca True, jeeli podana godzina, minuta i sekunda tworz prawidowy czas, False gdy jest to czas
nieprawidowy.
int mcal_time_valid (int hour, int minutes, int seconds)
mcrypt_cbc
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_cbc() szyfruje i deszyfruje (w zalenoci od trybu) dane $data za pomoc $cipher i $key w
trybie szyfrowania CBC i zwraca wynikowy cig. Patrz rwnie: mcrypt_cfb(), mcrypt_ecb() i mcrypt_ofb().
string mcrypt_cbc (int cipher, string key, string data, int mode [, string iv])
string mcrypt_cbc (string cipher, string key, string data, int mode [, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Musi by tajny.
$Data to dane do zaszyfrowania lub odszyfrowania.
$Mode to MCRYPT_ENCRYPT lub MCRYPT_DECRYPT.
$IV jest opcjonalnym wektorem inicjalizacji.
mcrypt_cfb
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_cfb() szyfruje i deszyfruje (w zalenoci od trybu) dane $data za pomoc $cipher i $key w
trybie szyfrowania CFB i zwraca wynikowy cig. Patrz rwnie: mcrypt_cbc(), mcrypt_ecb() i mcrypt_ofb().
string mcrypt_cfb (int cipher, string key, string data, int mode, string iv)
string mcrypt_cfb (string cipher, string key, string data, int mode [, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Musi by tajny.
$Data to dane do zaszyfrowania lub odszyfrowania.
$Mode to MCRYPT_ENCRYPT lub MCRYPT_DECRYPT.
$IV jest opcjonalnym wektorem inicjalizacji.
PHP Kompendium wiedzy
301

mcrypt_create_iv
Funkcja uywana do tworzenia wektora IV. Posiada dwa argumenty, $size okrela rozmiar IV, natomiast
$source okrela rdo IV. rdem moe by MCRYPT_RAND (systemowy generator liczb losowych),
MCRYPT_DEV_RANDOM (odczytanie danych z /dev/random) lub MCRYPT_DEV_URANDOM (odczytanie danych z
/dev/urandom). Jeeli uywasz MCRYPT_RAND, upewnij si, e wywoae srand() przed inicjalizacj generatora
liczb losowych.
string mcrypt_create_iv (int size, int source)
Przykad: mcrypt_create_iv()
<?php
$cipher = MCRYPT_TripleDES;
$block_size = mcrypt_get_block_size ($cipher);
$iv = mcrypt_create_iv ($block_size, MCRYPT_DEV_RANDOM);
?>
mcrypt_decrypt
Pobiera dane zaszyfrowane i zwraca je w postaci odszyfrowanej.
string mcrypt_decrypt (string cipher, string key, string data, string mode
[, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Jeeli jest mniejszy od wymaganej wielkoci klucza, jest
dopeniany znakami \0.
$Data to dane do odszyfrowania za pomoc podanego szyfru i trybu.
$Mode to jedna ze staych MCRYPT_MODE_modename ktra moe by: ecb, cbc, cfb, ofb, nofb lub stream.
$IV jest parametrem uywanym do inicjalizacji dla trybw: CBC, CFB, OFB oraz w niektrych algorytmach
dla trybu STREAM. Jeeli nie podasz IV, gdy jest on wymagany przez algorytm, funkcja wypisze ostrzeenie
i uyje IV z wszystkimi bajtami ustawionymi na \0.
mcrypt_ecb
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_ecb() szyfruje i deszyfruje (w zalenoci od trybu) dane $data za pomoc $cipher i $key w
trybie szyfrowania CFB i zwraca wynikowy cig. Patrz rwnie: mcrypt_cbc(), mcrypt_ecb() i mcrypt_ofb().
string mcrypt_ecb (int cipher, string key, string data, int mode)
string mcrypt_ecb (string cipher, string key, string data, int mode [, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Musi by tajny.
$Data to dane do zaszyfrowania lub odszyfrowania.
$Mode to MCRYPT_ENCRYPT lub MCRYPT_DECRYPT.
$IV jest opcjonalnym wektorem inicjalizacji.
Patrz rwnie mcrypt_cbc(), mcrypt_cfb() i mcrypt_ofb().
mcrypt_encrypt
Szyfruje dane i zwraca ich zaszyfrowan posta.
string mcrypt_encrypt (string cipher, string key, string data, string mode
[, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Jeeli jest mniejszy od wymaganej wielkoci klucza, jest
dopeniany znakami \0.
$Data to dane do zaszyfrowania za pomoc podanego szyfru i trybu. Jeeli rozmiar danych nie jest n *
blocksize, dane bd dopenione znakami \0. Zwracany zaszyfrowany cig moe by duszy od danych
przekazanych w parametrze $data.
$Mode to jedna ze staych MCRYPT_MODE_modename ktra moe by: ecb, cbc, cfb, ofb, nofb lub stream.
Dodatek A - Funkcje
302

$IV jest parametrem uywanym do inicjalizacji dla trybw: CBC, CFB, OFB oraz w niektrych algorytmach
dla trybu STREAM. Jeeli nie podasz IV, gdy jest on wymagany przez algorytm, funkcja wypisze ostrzeenie
i uyje IV z wszystkimi bajtami ustawionymi na \0.
Przykad: mcrypt_encrypt()
<?php
$iv = mcrypt_create_iv (
mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$key = "To jest sekretny klucz";
$text = "Spotkajmy si o 11:00 za pomnikiem.";
echo strlen ($text)."\n";
$crypttext = mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text,
MCRYPT_MODE_ECB, $iv);
echo strlen ($crypttext)."\n";
?>
Przykad ten powinien wypisa:
35
64
mcrypt_enc_get_algorithms_name
Zwraca nazw algorytmu.
string mcrypt_enc_get_algorithms_name (resource td)
mcrypt_enc_get_block_size
Zwraca wielko bloku dla algorytmu okrelonego przez deskryptor $td w bajtach.
int mcrypt_enc_get_block_size (resource td)
mcrypt_enc_get_iv_size
Zwraca wielko iv dla algorytmu okrelonego przez deskryptor szyfrowania w bajtach. Jeeli zwraca 0,
IV jest ignorowany przez algorytm. Parametru IV uywaj tryby cbc, cfb o ofb, oraz niektre algorytmy w trybie
stream.
int mcrypt_enc_get_iv_size (resource td)
mcrypt_enc_get_key_size
Zwraca maksymaln wielko klucza obsugiwan przez algorytm okrelony przez deskryptor $td, w
bajtach.
int mcrypt_enc_get_key_size (resource td)

mcrypt_enc_get_modes_name
Zwraca nazw trybu.
string mcrypt_enc_get_modes_name (resource td)
mcrypt_enc_get_supported_key_sizes
Zwraca tablic z wielkociami kluczy obsugiwanymi przez algorytm okrelony przez deskryptor
szyfrowania. Jeeli zwrci pust tablic to oznacza, e wszystkie wielkoci kluczy pomidzy 1 i
mcrypt_enc_get_key_size() s obsugiwane przez algorytm.
array mcrypt_enc_get_supported_key_sizes (resource td)
mcrypt_enc_is_block_algorithm
Zwraca 1, jeeli algorytm jest blokowy, 0 jeeli jest to algorytm strumieniowy.
int mcrypt_enc_is_block_algorithm (resource td)
PHP Kompendium wiedzy
303

mcrypt_enc_is_block_algorithm_mode
Zwraca 1, gdy tryb jest uywany przez algorytm blokowy, w przeciwnym przypadku zwraca 0 (na
przykad, 0 dla stream a 1 dla cbc, cfb, ofb).
int mcrypt_enc_is_block_algorithm_mode (resource td)
mcrypt_enc_is_block_mode
Zwraca 1, gdy tryb zwraca bloki bajtw lub 0, gdy zwraca bajty (na przykad 1 dla cbc i ecb a 0 dla cfb i
stream).
int mcrypt_enc_is_block_mode (resource td)
mcrypt_enc_self_test
Uruchamia samotestowanie algorytmu okrelonego przez deskryptor $td. Jeeli test si uda, zwraca 0. W
przypadku bdu zwraca 1.
int mcrypt_enc_self_test (resource td)
mcrypt_generic
Szyfruje dane. Dane s dopeniane znakami \0 do wielkoci n * blocksize. Funkcja zwraca zaszyfrowane
dane.
Uwaga
Wielko zwracanego cigu moe by wiksza od danych wejciowych z powodu dopeniania danych.
string mcrypt_generic (resource td, string data)
mcrypt_generic_end
Koczy szyfrowanie okrelone przez deskryptor szyfrowania ($td). Czyci wszystkie bufory i zamyka
uyte moduy. Zwraca False w przypadku wystpienia bdu a True w przypadku powodzenia operacji.
bool mcrypt_generic_end (resource td)
mcrypt_generic_init
Maksymalna dugo klucza powinna by pobrana poprzez wywoane funkcji mcrypt_enc_get_key_size()
i wszystkie wartoci mniejsze od uzyskanej s dopuszczalne. Parametr $iv powinien mie normalnie wielko
bloku uywanego przez algorytm, ale naley odczyta t wielko przy pomocy funkcji
mcrypt_enc_get_iv_size(). W trybie ECB IV jest ignorowany. IV jest wymagany w trybach CFB, CBC,
STREAM, nOFB i OFB. Musi by on losowy i niepowtarzalny, ale nie musi by tajny. Ten sam wektor IV musi
by uyty do kodowania i rozkodowywania. Jeeli nie chcesz go uywa, mona zainicjowa go zerami, ale nie
jest to zalecane. W przypadku wystpienia bdu funkcja zwraca -1. Funkcja ta musi zosta wywoana przed
kadym wywoaniem mcrypt_generic() lub mdecrypt_generic().
int mcrypt_generic_init (resource td, string key, string iv)
mcrypt_get_block_size
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_get_block_size() jest uywana do pobierania wielkoci bloku dla podanego szyfrowania,
$cipher. Funkcja wymaga dwch argumentw, $cipher oraz $module i zwraca wielko w bajtach. Patrz rwnie:
mcrypt_get_key_size().
int mcrypt_get_block_size (int cipher)
int mcrypt_get_block_size (string cipher, string module)
Dodatek A - Funkcje
304

mcrypt_get_cipher_name
Funkcja uywana do pobierania nazwy podanego szyfrowania. Wymaga podania szyfrowania w postaci
liczby (libmcrypt 2.2.x) lub pobiera nazw szyfrowania jako argument i zwraca nazw szyfrowania lub False,
jeeli nie istnieje ten sposb szyfrowania.
string mcrypt_get_cipher_name (int cipher)
string mcrypt_get_cipher_name (string cipher)
Przykad: mcrypt_get_cipher_name()
<?php
$cipher = MCRYPT_TripleDES;
print mcrypt_get_cipher_name ($cipher);
?>
Przykad ten zwrci nastpujcy napis:
TripleDES
mcrypt_get_iv_size
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_get_iv_size() zwraca wielko wektora inicjalizacji (IV) w bajtach. W przypadku bdu
zwraca FALSE. Jeeli w podanym trybie IV jest ignorowany, funkcja zwraca 0.
int mcrypt_get_iv_size (string cipher, string mode)
int mcrypt_get_iv_size (resource td)
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Mode to jedna ze staych MCRYPT_MODE_modename ktra moe by: ecb, cbc, cfb, ofb, nofb lub stream.
$Td jest podanym algorytmem.
mcrypt_get_key_size
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja uywana do pobierania wielkoci klucza dla podanego szyfrowania, $cipher. Funkcja
mcrypt_get_key_size() wymaga podania jednego lub dwch parametrw, $cipher oraz $module i zwraca wielko
w bajtach. Patrz rwnie: mcrypt_get_block_size().
int mcrypt_get_key_size (int cipher)
int mcrypt_get_key_size (string cipher, string module)
mcrypt_list_algorithms
Funkcja uywana do pobrania tablicy wszystkich obsugiwanych algorytmw w $lib_dir. Posiada
parametr opcjonalny, okrelajcy katalog w ktrym znajduj si wszystkie algorytmy. Jeeli nie zostanie on
podany, uyta zostanie warto mcrypt.algorithms_dir z pliku php.ini.
array mcrypt_list_algorithms ([string lib_dir])
Przykad: mcrypt_algorithms()
<?php
$algorithms = mcrypt_list_algorithms ("/usr/local/lib/libmcrypt");
foreach ($algorithms as $cipher) {
echo $cipher."/n";
}
?>
Przykad ten utworzy list wszystkich obsugiwanych algorytmw z katalogu /usr/local/lib/mcrypt.
mcrypt_list_modes
Funkcja uywana do pobrania tablicy z wszystkimi obsugiwanymi trybami w $lib_dir. Posiada parametr
opcjonalny, okrelajcy katalog w ktrym znajduj si wszystkie tryby. Jeeli nie zostanie on podany, uyta
zostanie warto mcrypt.modes_dir z pliku php.ini.
array mcrypt_list_modes ([string lib_dir])
Przykad: mcrypt_list_modes()
<?php
$modes = mcrypt_list_modes ();
foreach ($modes as $mode) {
PHP Kompendium wiedzy
305
echo "$mode </br>";

}
?>
Przykad ten tworzy list wszystkich obsugiwanych algorytmw w domylnym katalogu trybw. Jeeli
nie jest ustawiony w pliku php.ini jako dyrektywa mcrypt.modes_dir, uyty zostanie domylny katalog dla
biblioteki mcrypt (/usr/local/lib/libmcrypt)
mcrypt_module_get_algo_block_size
Zwraca wielko bloku w bajtach dla podanego algorytmu. W opcjonalnym parametrze $lib_dir mona
poda miejsce, gdzie s zapisane moduy trybw.
int mcrypt_module_get_algo_block_size (string algorithm [, string lib_dir])
mcrypt_module_get_algo_key_size
Zwraca najwiksz obsugiwan wielko klucza w bajtach. W opcjonalnym parametrze $lib_dir mona
poda miejsce, gdzie s zapisane moduy trybw.
int mcrypt_module_get_algo_key_size (string algorithm [, string lib_dir])
mcrypt_module_get_algo_supported_key_sizes
Zwraca tablic z wielkociami kluczy obsugiwanych przez podany algorytm. Jeeli funkcja zwrci pust
tablic, dopuszczalne s wszystkie rozmiary klucza pomidzy 1 i mcrypt_get_algo_key_size().W opcjonalnym
parametrze $lib_dir mona poda miejsce, gdzie s zapisane moduy trybw.
array mcrypt_module_get_algo_supported_key_sizes (string algorithm [, string lib_dir])
mcrypt_module_is_block_algorithm
Zwraca True, jeeli podany algorytm jest algorytmem blokowym i False, jeeli jest algorytmem
strumieniowym. W opcjonalnym parametrze $lib_dir mona poda miejsce, gdzie s zapisane moduy trybw.
bool mcrypt_module_is_block_algorithm (string mode [, string lib_dir])
mcrypt_module_is_block_algorithm_mode
Zwraca True, jeeli tryb uywany jest z algorytmem blokowym, w przeciwnym wypadku zwraca 0 (na
przykad 0 dla stream i 1 dla cbc, cfb, cfb). W opcjonalnym parametrze $lib_dir mona poda miejsce, gdzie s
zapisane moduy trybw.
bool mcrypt_module_is_block_algorithm_mode (string mode [, string lib_dir])
mcrypt_module_is_block_mode
Zwraca True, jeeli tryb powoduje wysyanie blokw bajtw lub False, gdy pojedynczych bajtw (na
przykad: 1 dla cbc i ecb a 0 dla cfb i stream). W opcjonalnym parametrze $lib_dir mona poda miejsce, gdzie
s zapisane moduy trybw.
bool mcrypt_module_is_block_mode (string mode [, string lib_dir])
mcrypt_module_open
Otwiera modu uywanego algorytmu i trybu. Nazwa algorytmu jest podana w parametrze $algorithm, na
przykad: twofish jest jedn ze staych MCRYPT_ciphername. Biblioteka jest zamykana przez
mcrypt_module_close() ale wywoanie tej funkcji jest niepotrzebne, jeeli zostaa wywoana funkcja
mcrypt_generic_end(). Normalnie zwraca deskryptor szyfrowania lub False w przypadku wystpienia bdu.
Parametry $algorithm_directory i $mode_directory uywane s do odnalezienia moduw szyfrowania.
Jeeli jeden z tych parametrw zostanie ustawiony na "", uyte zostan wartoci znajdujce si w dyrektywach
mcrypt.algorithms_dir lub mcrypt.modes_dir. Jeeli parametry nie zostan ustawione, uyte zostan wartoci
wkompilowane w bibliotek libmcrypt (zwykle /usr/local/lib/libmcrypt).
Dodatek A - Funkcje
306
resource mcrypt_module_open (string algorithm, string algorithm_directory,

string mode, string mode_directory)
Przykad: mcrypt_module_open()
<?php
$td = mcrypt_module_open (MCRYPT_DES, "", MCRYPT_MODE_ECB, "/usr/lib/mcrypt-modes");
?>
Przykad ten bdzie prbowa otworzy szyfrowanie DES z biecego katalogu i tryb ECB z katalogu
/usr/lib/mcrypt-modes.
mcrypt_module_self_test
Uruchamia samotestowanie szyfrowania podanego szyfrowania. W opcjonalnym parametrze $lib_dir
mona poda miejsce, gdzie s zapisane moduy trybw. Funkcja zwraca True, jeeli test si powiedzie i False,
jeeli si nie uda.
bool mcrypt_module_self_test (string algorithm [, string lib_dir])
mcrypt_ofb
Pierwszy prototyp jest dla przypadku, gdy doczona jest biblioteka libmcrypt 2.2.x, drugi gdy libmcrypt
2.4.x. Funkcja mcrypt_ofb() szyfruje i deszyfruje (w zalenoci od trybu) dane $data za pomoc $cipher i $key w
trybie szyfrowania OFB i zwraca wynikowy cig.
string mcrypt_ofb (int cipher, string key, string data, int mode, string iv)
string mcrypt_ofb (string cipher, string key, string data, int mode [, string iv])
$Cipher jest jedn ze staych MCRYPT_ciphername.
$Key jest kluczem przekazywanym do algorytmu. Musi by tajny.
$Data to dane do zaszyfrowania lub odszyfrownania.
$Mode to jedna ze staych MCRYPT_ENCRYPT lub MCRYPT_DECRYPT.
$IV jest wektorem inicjalizacji.
Patrz rwnie: mcrypt_cbc(), mcrypt_cfb() i mcrypt_ecb().
md5
Wykonuje mieszanie cigu $str metod MD5 uywan przez RSA Data Cecurity Inc. Patrz rwnie:
crc32().
string md5 (string str)
mdecrypt_generic
Odszyfrowuje dane.
Uwaga
Dugo zwracanego cigu moe by wiksza ni cig niezaszyfrowany z powodu wyrwnywania danych.
string mdecrypt_generic (resource td, string data)
Przykad: mdecrypt_generic()
<?php
$iv_size = mcrypt_enc_get_iv_size ($td));
$iv = @mcrypt_create_iv ($iv_size, MCRYPT_RAND);
if (@mcrypt_generic_init ($td, $key, $iv) != -1)
{
$c_t = mcrypt_generic ($td, $plain_text);
@mcrypt_generic_init ($td, $key, $iv);
$p_t = mdecrypt_generic ($td, $c_t);
}
if (strncmp ($p_t, $plain_text, strlen($plain_text)) == 0)
echo "ok";
else
echo "bd";
?>
Przykad pokazuje w jaki sposb sprawdzi, czy dane przed szyfrowaniem s takie same jak po
odszyfrowaniu.
PHP Kompendium wiedzy
307

metaphone
Oblicza klucz metaphone dla $str. Podobnie jak soundex(), funkcja ta zwraca ten sam klucz dla podobnie
brzmicych sw. Jest ona dokadniejsza od soundex(), poniewa stosuje podstawowe zasady wymowy
angielskiej. Klucze wygenerowane przez funkcj s zmiennej dugoci. Autorem algorytmu jest Lawrence Philips
<lphilips@verity.com>. Zosta on opisany w ksice Practical Algorithms for Programmers, Binstock & Rex,
Addison Wesley, 1995.
string metaphone (string str)
method_exists
Funkcja zwraca True jeeli dla obiektu $object zdefiniowana jest metoda $method_name. W przeciwnym
przypadku zwraca False.
bool method_exists (object object, string method_name)
mhash
Uruchamia funkcj mieszajc okrelon w $hash na danych $data i zwraca wynik mieszania.
string mhash (int hash, string data, string [ key ])
mhash_count
Zwraca najwikszy dostpny identyfikator funkcji mieszajcej. S one numerowane od 0.
int mhash_count (void)
Przykad: Przegldanie funkcji mieszajcych
<?php
$nr = mhash_count();
for ($i = 0; $i <= $nr; $i++) {
echo sprintf ("Wielko bloku dla %s wynosi %d\n",
mhash_get_hash_name ($i),
mhash_get_block_size ($i));
}
?>
mhash_get_block_size
Funkcja uywana do pobrania wielkoci bloku dla podanej funkcji mieszajcej. Wymaga podania jednego
parametru, identyfikatora funkcji mieszajcej i zwraca wielko bloku w bajtach lub False jeeli nie istnieje
podana funkcja.
int mhash_get_block_size (int hash)
mhash_get_hash_name
Funkcja uywana do pobrania nazwy podanej funkcji mieszajcej. Wymaga podania jednego parametru,
identyfikatora funkcji mieszajcej i zwraca jej nazw lub False jeeli podana funkcja nie istnieje.
string mhash_get_hash_name (int hash)
Przykad: mhash_get_hash_name()
<?php
$hash = MHASH_MD5;
print mhash_get_hash_name ($hash);
?>
Uruchomienie przykadu spowoduje wypisanie nastpujcego wyniku:
MD5
microtime
Zwraca cig mikrosekundy sekundy gdzie sekundy s biecym czasem wyraonym w sekundach od
pocztku epoki Uniksa (1 stycznia 1970, 0:00:00). Funkcja jest dostpna w systemach obsugujcych funkcj
systemow gettimeofday(). Parz rwnie: time().
string microtime (void)
Dodatek A - Funkcje
308

min
Zwraca warto najmniejszego numerycznie parametru. Jeeli pierwszy parametr jest tablic, min()
zwraca najmniejsz warto w tablicy. Jeeli pierwszy parametr jest liczb cakowit, cigiem lub liczb double,
funkcja wymaga co najmniej dwch parametrw i zwraca najmniejszy z nich. Mona porwnywa
nieograniczon ilo wartoci. Jeeli jedna lub wicej wartoci jest liczb double, wszystkie wartoci s
traktowane jako double i zwracana jest liczba typu double. Jeeli adna z wartoci nie jest liczb double,
wszystkie s traktowane jako liczby cakowite i rwnie zwracana jest liczba cakowita.
number min (number arg1, number arg2 [, ...])
mkdir
Tworzy katalog okrelony o podanej nazwie.
Uwaga
Prawdopodobnie bdziesz chcia poda typ jako liczb semkow, musisz wic doda na jej pocztku zero.
int mkdir (string pathname, int mode)
Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Patrz rwnie:
rmdir().
mkdir ("/sciezka/do/nowego/katalogu", 0700);
mktime
Ostrzeenie
Zwr uwag na dziwn kolejno argumentw, ktra rni si od kolejnoci stosowanej w wywoaniu funkcji Uniksa mktime() ktra
nie pomaga w opuszczaniu parametrw od prawej do lewej strony. Czstym bdem jest pomieszanie tych parametrw w skrypcie.
Zwraca znacznik czasu Uniksa odpowiadajcy podanym argumentom. Znacznik ten to liczba cakowita
zawierajca ilo sekund od pocztku ery Uniksa (1 stycznia 1970) do podanego czasu. Argumenty mog by
opuszczane od prawej do lewej strony a opuszczone wartoci bd zastpowane biecym czasem lokalnym.
int mktime (int hour, int minute, int second, int month, int day, int year
[, int is_dst])
Parametr $is_dst moe by ustawiony na 1 w przypadku, gdy obowizuje czas zimowy, na 0 gdy
obowizuje czas letni lub na -1 (domylnie) gdy nie wiadomo jaki czas obowizuje.
Uwaga
Parametr $is_dst zosta dodany w PHP 3.0.10.
Funkcja mktime() jest poyteczna do oblicze na datach oraz kontroli ich poprawnoci, poniewa
automatycznie oblicza waciwe wartoci dla parametrw spoza zakresu. Na przykad: kady z poniszych
wierszy powoduje wypisanie cigu Jan-01-1998.
Przykad: mktime()
echo date ("M-d-Y", mktime (0,0,0,12,32,1997));
echo date ("M-d-Y", mktime (0,0,0,13,1,1997));
echo date ("M-d-Y", mktime (0,0,0,1,1,1998));
echo date ("M-d-Y", mktime (0,0,0,1,1,98));
Parametr $year moe by liczb dwu bd czterocyfrow o wartociach 069 odpowiadajcych 2000
2069 oraz 7099 odpowiadajcych 19701999 (w systemach w ktrych time_t jest 32-bitow licz ze znakiem,
czyli wikszoci wspczesnych, prawidowym zakresem dla $year jest 19022037). Ostatni dzie dowolnego
miesica moe by podany jako dzie 0 miesica nastpnego. Poniszy przykad wypisze dwukrotnie Ostatnim
dniem lutego 2000 jest: 29.
Przykad: Ostatni dzie miesica:
$lastday = mktime (0,0,0,3,0,2000);
echo strftime ("Ostatnim dniam lutego 2000 jest: %d", $lastday);

$lastday = mktime (0,0,0,4,-31,2000);
PHP Kompendium wiedzy
309

echo strftime ("Ostatnim dniam lutego 2000 jest: %d", $lastday);
Jeeli jako rok, miesic i dzie podane zostan wartoci 0, data taka uznana zostanie za bdn. Jeeli by
tak nie byo, odpowiadao by to dacie 30.11.1999, co wydawa by si mogo dziwnym dziaaniem. Patrz rwnie:
date() i time().
move_uploaded_file
Funkcja dostpna w PHP 3 powyej wersji 3.0.16 i w PHP 4 powyej 4.0.2. Funkcja sprawdza, czy plik
okrelony przez $filename jest plikiem przesanym na serwer (za pomoc mechanizmu przesyania HTTP POST).
Jeeli plik jest prawidowy zostaje on przeniesiony na ciek okrelon przez $destination. Jeeli $filename nie
jest prawidowym plikiem zaadowanym na serwer, nie jest wykonywana adna operacja i funkcja
move_upload_file() zwraca False. Jeeli $filename jest prawidowym plikiem zaadowanym na serwer, ale z
jakichkolwiek przyczyn nie moe by on przeniesiony, nie jest wykonywana adna operacja a funkcja
move_upload_file() zwraca False. Dodatkowo wywietlane jest ostrzeenie. Sprawdzenie to jest szczeglnie
istotne w przypadkach, gdy istnieje jakakolwiek szansa, e zawarto przesyanego pliku moe by pokazana
uytkownikowi, lub innym uytkownikom na tym samym systemie. Patrz rwnie: is_uploaded_file() oraz
cz podrcznika sieciowego zatytuowan: Handling file uploads.
bool move_uploaded_file (string filename, string destination)
msql
Zwraca dodatni identyfikator wyniku zapytania mSQL, lub False w przypadku wystpienia bdu. Funkcja
mSQL wybiera baz danych i wykonuje na niej zapytanie. Jeeli nie zostanie podany opcjonalny identyfikator
poczenia, funkcja prbuje znale otwarte poczenie do serwera mSQL. Jeeli nie zostanie znalezione takie
poczenie, funkcja sprbuje nawiza je wywoujc funkcj msql_connect() bez parametrw. Patrz rwnie:
msql_connect().
int msql (string database, string query, int link_identifier)
msql_affected_rows
Zwraca ilo wierszy biorcych udzia w zapytaniu (to znaczy ilo wierszy zwrconych przez SELECT,
ilo wierszy zmienionych przez UPDATE lub ilo wierszy usunitych przez DELETE). Patrz rwnie: msql_query().
int msql_affected_rows (int query_identifier)
msql_close
Zwraca True w przypadku powodzenia operacji a False w przypadku bdu. Funkcja zamyka poczenie z
baz mSQL skojarzon z podanym identyfikatorem poczenia. Jeeli nie zostanie podany identyfikator
poczenia, zostanie uyty ostatnio otwarte poczenie.
Uwaga
Zwykle nie jest konieczne uywanie tej funkcji, poniewa poczenia nie otwarte jako trwae s zamykane automatycznie po
zakoczeniu skryptu.
Funkja msql_close() nie zamyka pocze trwaych wygenerowanych przez msql_pconnect(). Patrz
rwnie: msql_connect() i msql_pconnect().
int msql_close (int link_identifier)
msql_connect
Zwraca dodatni identyfikator poczenia do mSQL, lub False w przypadku bdu. Funkcja msql_connect()
nawizuje poczenie z serwerem mSQL. Nawa komputera jest opcjonalna i jeeli jest opuszczona, przyjmowana
jest nazwa localhost. Drugie wywoanie msql_connect() z takimi samymi argumentami nie spowoduje
zestawienia nastpnego poczenia. Zamiast tego zwrcony zostanie identyfikator istniejcego ju poczenia.
Dodatek A - Funkcje
310

Poczenie z serwerem zostanie zamknite po zakoczeniu wykonywania skryptu chyba, e wczeniej zostanie
zamknite za pomoc msql_close(). Patrz rwnie: msql_pconnect() i msql_close().
int msql_connect ([string hostname [, string hostname[:port] [, string username
[, string password]]]])
msql_createdb
Taka sama jak msql_create_db().
int msql_createdb (string database name [, int link_identifier])
msql_create_db
Tworzy baz danych na serwerze skojarzonym z podanym identyfikatorem poczenia. Patrz rwnie:
msql_drop_db().
int msql_create_db (string database name [, int link_identifier])
msql_data_seek
Zwraca True w przypadku powodzenia operacji a False w przypadku bdu. Przesuwa wewntrzny
znacznik wiersza w wyniku mSQL skojarzonym z podanym identyfikatorem wyniku zapytania do wiersza o
podanym numerze. Kolejne wywoanie funkcji msql_fetch_row() zwrci ten wiersz. Patrz rwnie:
msql_fetch_row().
int msql_data_seek (int query_identifier, int row_number)
msql_dbname
Zwraca nazw bazy danych zapisan na pozycji $i wskanika zwracanego przez funkcj msql_listdbs().
Funkcja moe by wykorzystana do sprawdzenia iloci dostpnych baz danych.
string msql_dbname (int query_identifier, int i)
msql_dropdb
Patrz msql_drop_db().
int msql_dropdb (void)
msql_drop_db
Zwraca True w przypadku powodzenia operacji a False w przypadku bdu. Funkcja msql_drop_db()
prbuje usun z serwera ca baz danych skojarzon z podanym identyfikatorem poczenia. Patrz rwnie:
msql_create_db().
int msql_drop_db (string database_name, int link_identifier)
msql_error
Bdy przychodzce z serwera mSQL nie s traktowane jako ostrzeenia PHP. Zamiast tego naley
uywa tej funkcji do pobierania cigu z opisem bdu.
string msql_error ()
msql_fetch_array
PHP Kompendium wiedzy
311
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja msql_fetch_array() jest rozszerzeniem funkcji msql_fetch_row(). Oprcz zapamitywania danych pod
indeksami numerycznymi, dodatkowo dane s zapisywane pod indeksami asocjacyjnymi, uywajc nazw pl jako
kluczy. Drugi argument, $result_type w funkcji msql_fetch_array() jest jedn z nastpujcych staych:
MSQL_ASSOC, MSQL_NUM i MSQL_BOTH. Naley by uwaym przy odczytywaniu wynikw zapytania, ktre moe
zwrci tylko jedno pole, ktre ma warto 0 (pusty cig albo NULL).

Uwaga
Funkcja msql_fetch_array() NIE jest wyranie wolniejsza od funkcji msql_fetch_row(), jedynie dostarcza wicej wynikw.
Bardziej szczegowo jest to opisane przy funkcji msql_fetch_row().
int msql_fetch_array (int query_identifier [, int result_type])
msql_fetch_field
Zwraca obiekt zawierajcy informacje o polu. Funkcja msql_fetch_field() moe by uyta do pobrania
danych na temat pl w wyniku. Jeeli nie zostanie podane przesunicie, odczytywane jest nastpne pole, ktre nie
byo jeszcze odczytane.
object msql_fetch_field (int query_identifier, int field_offset)
Waciwoci zwracanego obiektu s nastpujce:
name nazwa kolumny
table nazwa tabeli do ktrej naley kolumna
not_null 1 jeeli kolumna nie moe by pusta
primary_key 1 jeeli kolumna jest kluczem gwnym
unique 1 jeeli kolumna jest kluczem unikalnym
type typ kolumny
msql_fetch_object
Zwraca obiekt z waciwociami odpowiadajcymi polom pobieranego wiersza lub False, jeeli nie ma
wicej wierszy do pobrania. Funkcja msql_fetch_object() jest podobna do msql_fetch_array() z jedn rnic
zwracany jest obiekt a nie tablica. Oznacza to, e moesz odwoywa si do pl poprzez nazwy a nie poprzez
indeks( liczby nie s prawidowymi nazwami waciwoci). Drugi argument, $result_type w funkcji
msql_fetch_array() jest jedn z nastpujcych staych: MSQL_ASSOC, MSQL_NUM i MSQL_BOTH. Funkcja jest identyczna
wydajnociowo z msql_fetch_array() i prawie tak samo szybka jak msql_fetch_row() rnica jest nieznaczna.
Patrz rwnie: msql_fetch_array() i msql_fetch_row().
int msql_fetch_object (int query_identifier [, int result_type])
msql_fetch_row
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja msql_fetch_row() pobiera jeden wiersz z wyniku okrelonego przez identyfikator zapytania. Wiersz jest
zwracany w postaci tablicy. Kada kolumna jest zapisywana w osobnym indeksie tablicy, rozpoczynajc od 0.
Kolejne wywoanie msql_fetch_row() powoduje zwracanie kolejnych wierszy z wyniku lub False jeeli nie ma
ju wicej wierszy. Patrz rwnie: msql_fetch_array(), msql_fetch_object(), msql_data_seek() i msql_result().
array msql_fetch_row (int query_identifier)
msql_fieldflags
Zwraca atrybuty podanego pola. Atrybutami s not null, primary key, kombinacja obu oraz pusty cig.
string msql_fieldflags (int query_identifier, int i)
msql_fieldlen
Zwraca dugo podanego pola.
int msql_fieldlen (int query_identifier, int i)
Dodatek A - Funkcje
312

msql_fieldname
Zwraca nazw podanego pola. Parametr $query_identifier jest identyfikatorem zapytania, a $field jest
numerem kolejnym pola. Funkcja msql_fieldname($result, 2) zwrci nazw drugiego pola z wyniku
zwizanego z podanym identyfikatorem wyniku.
string msql_fieldname (int query_identifier, int field)
msql_fieldtable
Zwraca nazw tabel do ktrej naley pole $field.
int msql_fieldtable (int query_identifier, int field)
msql_fieldtype
Podobna do funkcji msql_fieldname(). Argumenty s takie same, ale zwracany jest typ pola. Moe by to
int, char lub real.
string msql_fieldtype (int query_identifier, int i)
msql_field_seek
Przesuwa wskanik do podanego numeru pola. Jeeli nastpne wywoanie msql_fetch_field() nie bdzie
zawierao numeru pola, zostanie zwrcone to wanie pole. Patrz rwnie: msql_fetch_field().
int msql_field_seek (int query_identifier, int field_offset)
msql_freeresult
Patrz msql_free_result().
msql_freeresult( void )
msql_free_result
Zwalnia pami przydzielon dla $query_identifier. Po zakoczeniu wykonywania dania pami jest
zwalniana automatycznie. Funkcja ta jest potrzebna tylko wtedy, gdy nie chcemy zuywa zbyt wiele pamici w
czasie dziaania skryptu.
int msql_free_result (int query_identifier)
msql_listdbs
Patrz msql_list_dbs().
msql_listdbs( void )
msql_listfields
Patrz msql_list_fields().
msql_listfields( void )
msql_listtables
Patrz msql_list_tables().
msql_listtables( void )
msql_list_dbs
Zwraca znacznik wyniku zawierajcego bazy danych dostpne dla demona msql. Naley uy funkcji
msql_dbname() do odczytania tego znacznika wyniku.
int msql_list_dbs (void)
PHP Kompendium wiedzy
313

msql_list_fields
Pobiera dane na temat podanej tabeli. Parametrami s nazwa bazy danych i nazwa tabeli. Zwracany jest
znacznik wyniku, ktry moe by uyty w funkcjach msql_fieldflags(), msql_fieldlen(), msql_fieldname() i
msql_fieldtype(). Identyfikator zapytania jest dodatni liczb cakowit. W przypadku bdu funkcja zwraca -1.
Cig opisujcy bd umieszczany jest w $phperrmsg i jeeli funkcja nie zostaa wywoana jako
@msql_list_fields(), cig ten jest wypisywany na wyjcie. Patrz rwnie: msql_error().
int msql_list_fields (string database, string tablename)
msql_list_tables
Pobiera jako argument nazw bazy danych i zwraca znacznik wyniku podobnie do funkcji msql(). Do
pobrania wyniku na podstawie znacznika powinna zosta uyta funkcja msql_table_name().
int msql_list_tables (string database)

msql_numfields
Identyczna z msql_num_fields().
int msql_numfields (int query_identifier)
msql_numrows
Identyczna z msql_num_rows().
int msql_numrows (void)
msql_num_fields
Zwraca ilo pl w wyniku. Patrz rwnie: msql(), msql_query(), msql_fetch_field() i msql_num_rows().
int msql_num_fields (int query_identifier)
msql_num_rows
Zwraca ilo wierszy w wyniku. Patrz rwnie: msql(), msql_query() i msql_fetch_row().
int msql_num_rows (int query_identifier)
msql_pconnect
Zwraca dodatni identyfikator cza trwaego lub False w przypadku wystpienia bdu. Funkcja
msql_pconnect() dziaa bardzo podobnie do msql_connect() z dwiema rnicami. Po pierwsze, w czasie
poczenia zamiast otwiera nowe poczenie funkcja prbuje znale istniejce cze (trwae). Jeeli zostanie ono
znalezione, zostaje zwrcone zamiast nowego poczenia. Po drugie, poczenie do serwera mSQL nie jest
zamykane po zakoczeniu pracy skryptu. cze takie pozostaje otwarte do wykorzystania w przyszoci
(msql_close() nie zamyka pocze utworzonych przez msql_pconnect()).
int msql_pconnect ([string hostname [, string hostname[:port] [, string username
[, string password]]]])
msql_query
Wysya zapytanie do aktywnej bazy danych skojarzonej z podanym identyfikatorem cza. Jeeli
identyfikator ten nie zostanie podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja
prbuje utworzy poczenie identycznie jak robi to funkcja msql_connect() a nastpnie uywa cza do
wykonania zapytania. Zwraca dodatni identyfikator zapytania mSQL lub False w przypadku wystpienia bdu.
Patrz rwnie: msql(), msql_select_db() i msql_connect().
int msql_query (string query, int link_identifier)
Dodatek A - Funkcje
314

msql_regcase
Patrz sql_regcase().
msql_regcase( void )
msql_result
Zwraca zawarto komrki w podanym wierszu, numerze i wyniku mSQL. Funkcja msql_result() zwraca
zawarto jednej komrki z wyniku mSQL. Argument $field moe by numerem pola, nazw pola lub nazw w
postaci tabela kropka pole (pole.tabela). Jeeli kolumna otrzymaa w zapytaniu alias (select foo as bar from
...), naley uy aliasu a nie oryginalnej nazwy kolumny. Pracujc na duych wynikach naley rozway uycie
jednej funkcji do wczytania caego wiersza. Poniewa funkcje te zwracaj zawarto wielu pl za pomoc
jednego wywoania, s one duo szybsze od msql_result(). Podawanie numerw pl zamiast ich nazw powoduje
szybsze dziaanie funkcji. Zalecanymi szybszymi funkcjami s: msql_fetch_row(), msql_fetch_array() i
msql_fetch_object().
int msql_result (int query_identifier, int i, mixed field)
msql_selectdb
Patrz msql_select_db().
msql_selectdb( void )
msql_select_db
Zwraca True w przypadku powodzenia a False w przypadku bdu. Funkcja msql_select_db() ustawia na
serwerze biec aktywn baz danych o podanym identyfikatorze cza. Jeeli identyfikator ten nie zostanie
podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja prbuje utworzy poczenie
identycznie jak robi to funkcja msql_connect() a nastpnie uywa cza do wybrania bazy danych. Kolejne
wywoania msql_query() wykonywane s na aktywnej bazie danych. Patrz rwnie: msql_connect(),
msql_pconnect() i msql_query().
int msql_select_db (string database_name, int link_identifier)
msql_tablename
Na podstawie identyfikatora wyniku zwracanego przez msql_list_tables() oraz numeru kolejnego
pobiera i zwraca nazw tabeli. Funkcja msql_numrows() moe by uyta do okrelenia iloci tabel w wyniku.
string msql_tablename (int query_identifier, int field)
Przykad: msql_tablename()
<?php
msql_connect ("localhost");
$result = msql_list_tables ("wisconsin");
$i = 0;
while ($i < msql_numrows ($result)) {
$tb_names[$i] = msql_tablename ($result, $i);
echo $tb_names[$i] . "<BR>";
$i++;
}
?>
mssql_close
Zwraca True w przypadku powodzenia a False w przypadku bdu. Zamyka poczenie z baz danych MS
SQL Server, ktra jest skojarzona z podanym identyfikatorem poczenia. Jeeli identyfikator poczenia nie
zostanie podany, uywane jest ostatnio otwarte poczenie.
Uwaga
Nie jest to zwykle konieczne, poniewa poczenia nietrwae s automatycznie zamykane po zakoczeniu wykonywania skryptu.
Funkcja mssql_close() nie zamyka pocze trwaych otwartych za pomoc mssql_pconnect().
PHP Kompendium wiedzy
315

Patrz rwnie: mssql_connect() i mssql_pconnect().
int mssql_close ([int link_identifier])
mssql_connect
Zwraca dodatni identyfikator poczenia do MS SQL, lub False w przypadku bdu. Funkcja
mssql_connect() nawizuje poczenie z serwerem MS SQL. Argument $servername musi by prawidow
nazw serwera zdefiniowan w pliku interfejsw. Drugie wywoanie mssql_connect() z takimi samymi
argumentami nie spowoduje zestawienia nastpnego poczenia. Zamiast tego zwrcony zostanie identyfikator
istniejcego ju poczenia. Poczenie z serwerem zostanie zamknite po zakoczeniu wykonywania skryptu
chyba, e wczeniej zostanie zamknite za pomoc mssql_close(). Patrz rwnie: mssql_pconnect() i
mssql_close().
int mssql_connect ([string servername [, string username [, string password]]])
mssql_data_seek
Zwraca True w przypadku powodzenia a False w przypadku bdu. Funkcja mssql_data_seek() przesuwa
wewntrzny wskanik wiersza w wyniku MS SQL, skojarzonym z podanym identyfikatorem wyniku, do wiersza
o podanym numerze. Nastpne wywoanie funkcji mssql_fetch_row() zwrci ten wiersz. Patrz rwnie:
mssql_data_seek().
int mssql_data_seek (int result_identifier, int row_number)
mssql_fetch_array
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja mssql_fetch_array() jest rozszerzeniem funkcji mssql_fetch_row(). Oprcz zapamitywania danych pod
indeksami numerycznymi, dodatkowo dane s zapisywane pod indeksami asocjacyjnymi, uywajc nazw pl jako
kluczy.
Uwaga
Funkcja mssql_fetch_array() NIE jest wyranie wolniejsza od funkcji mssql_fetch_row(), jedynie dostarcza wicej wynikw.
Bardziej szczegowo jest to opisane przy funkcji mssql_fetch_row().
int mssql_fetch_array (int result)

mssql_fetch_field
Zwraca obiekt zawierajcy informacje o polu. Funkcja mssql_fetch_field() moe by uyta do pobrania
danych na temat pl w wyniku. Jeeli nie zostanie podane przesunicie, odczytywane jest nastpne pole, ktre nie
byo jeszcze odczytane.
object mssql_fetch_field (int result [, int field_offset])
name Nazwa kolumny. Jeeli kolumna jest wynikiem dziaania funkcji, waciwo ta ma warto
computed#N, gdzie #N jest numerem seryjnym.
column_source Tabela z ktrej pochodzi kolumna.
max_length Maksymalna dugo kolumny.
numeric 1 gdy kolumna jest numeryczna.
mssql_fetch_object
Zwraca obiekt z waciwociami odpowiadajcymi polom pobieranego wiersza lub False, jeeli nie ma
wicej wierszy do pobrania. Funkcja mssql_fetch_object() jest podobna do mssql_fetch_array() z jedn rnic
zwracany jest obiekt a nie tablica. Oznacza to, e moesz odwoywa si do pl poprzez nazwy a nie poprzez
indeks( liczby nie s prawidowymi nazwami waciwoci). Funkcja jest identyczna wydajnociowo z
Dodatek A - Funkcje
316

mssql_fetch_array() i prawie tak samo szybka jak mssql_fetch_row() rnica jest nieznaczna. Patrz rwnie:
mssql_fetch_array() i mssql_fetch_row().
int mssql_fetch_object (int result)
mssql_fetch_row
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja mssql_fetch_row() pobiera jeden wiersz z wyniku okrelonego przez identyfikator zapytania. Wiersz jest
zwracany w postaci tablicy. Kada kolumna jest zapisywana w osobnym indeksie tablicy, rozpoczynajc od 0.
Kolejne wywoanie mssql_fetch_row() powoduje zwracanie kolejnych wierszy z wyniku lub False jeeli nie ma
ju wicej wierszy. Patrz rwnie: mssql_fetch_array(), mssql_fetch_object(), mssql_data_seek(),
mssql_fetch_lengths() i mssql_result().
array mssql_fetch_row (int result)
mssql_field_length
int mssql_field_length (int result [, int offset])
mssql_field_name
int mssql_field_name (int result [, int offset])
mssql_field_seek
Przesuwa wskanik do okrelonego numeru pola. Jeeli nastpne wywoanie mssql_fetch_field() nie
bdzie zawierao numeru pola, zostanie zwrcone to wanie pole. Patrz rwnie: mssql_fetch_field().
int mssql_field_seek (int result, int field_offset)
mssql_field_type
string mssql_field_type (int result [, int offset])
mssql_free_result
Zwalnia pami przydzielon dla $result. Po zakoczeniu wykonywania dania pami jest zwalniana
automatycznie. Funkcja ta jest potrzebna tylko wtedy, gdy nie chcemy zuywa zbyt wiele pamici w czasie
dziaania skryptu.
int mssql_free_result (int result)
mssql_get_last_message
string mssql_get_last_message (void)
mssql_min_error_severity
void mssql_min_error_severity (int severity)
mssql_min_message_severity
void mssql_min_message_severity (int severity)
mssql_num_fields
Zwraca ilo pl w wyniku. Patrz rwnie: mssql_db_query(), mssql_query(), mssql_fetch_field() i
mssql_num_rows().
int mssql_num_fields (int result)
PHP Kompendium wiedzy
317

mssql_num_rows
Zwraca ilo wierszy w wyniku. Patrz rwnie: mssql_db_query(), mssql_query() i mssql_fetch_row().
int mssql_num_rows (string result)
mssql_pconnect
Zwraca dodatni identyfikator cza trwaego lub False w przypadku wystpienia bdu. Funkcja
mssql_pconnect() dziaa bardzo podobnie do mssql_connect() z dwiema rnicami. Po pierwsze, w czasie
poczenia zamiast otwiera nowe poczenie funkcja prbuje znale istniejce cze (trwae). Jeeli zostanie ono
znalezione, zostaje zwrcone zamiast nowego poczenia. Po drugie, poczenie do serwera MS SQL nie jest
zamykane po zakoczeniu pracy skryptu. cze takie pozostaje otwarte do wykorzystania w przyszoci
(mssql_close() nie zamyka pocze utworzonych przez mssql_pconnect()).
int mssql_pconnect ([string servername [, string username [, string password]]])
mssql_query
Zwraca dodatni identyfikator zapytania MS SQL lub False w przypadku wystpienia bdu. Wysya do
aktywnej bazy danych zapytanie skojarzone z podanym identyfikatorem cza. Jeeli identyfikator ten nie
zostanie podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja prbuje utworzy
poczenie identycznie jak robi to funkcja mssql_connect() a nastpnie uywa cza do wykonania zapytania.
Patrz rwnie: mssql_db_query(), mssql_select_db() i mssql_connect().
int mssql_query (string query [, int link_identifier])
mssql_result
Funkcja mssql_result() zwraca zawarto jednej komrki z wyniku MS SQL. Argument $field moe by
numerem pola, nazw pola lub nazw w postaci tabela kropka pole (pole.tabela). Jeeli kolumna otrzymaa w
zapytaniu alias (select foo as bar from ...), naley uy aliasu a nie oryginalnej nazwy kolumny. Pracujc na
duych wynikach naley rozway uycie jednej funkcji do wczytania caego wiersza. Poniewa funkcje te
zwracaj zawarto wielu pl za pomoc jednego wywoania, s one duo szybsze od mssql_result(). Podawanie
numerw pl zamiast ich nazw powoduje szybsze dziaanie funkcji. Zalecanymi szybszymi funkcjami s:
mssql_fetch_row(), mssql_fetch_array() i mssql_fetch_object().
int mssql_result (int result, int i, mixed field)
mssql_select_db
Zwraca True w przypadku powodzenia a False w przypadku bdu. Funkcja mssql_select_db() ustawia na
serwerze biec aktywn baz danych o podanym identyfikatorze cza. Jeeli identyfikator ten nie zostanie
podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja prbuje utworzy poczenie
identycznie jak robi to funkcja mssql_connect() a nastpnie uywa cza do wybrania bazy danych. Kolejne
wywoania mssql_query() wykonywane s na aktywnej bazie danych. Patrz rwnie: mssql_connect(),
mssql_pconnect() i mssql_query().
int mssql_select_db (string database_name [, int link_identifier])
mt_getrandmax
Zwraca maksymaln warto, jaka moe by zwrcona przez funkcj mt_rand(). Patrz rwnie:
mt_rand(), mt_srand(), rand(), srand() i getrandmax().
int mt_getrandmax (void)
mt_rand
Wiele generatorw liczb losowych ze starszych bibliotek libc miao problematyczn lub nieznan
charakterystyk i byy powolne. Domylnie PHP korzysta z generatora liczb losowych z libc dostpnego za
Dodatek A - Funkcje
318

pomoc funkcji rand(). Funkcja mt_rand() jest jej zamiennikiem. Korzysta ona z generatora liczb losowych
Mersenne Twister o znanej charakterystyce, ktry generuje liczby losowe wystarczajce do inicjowania
niektrych rodzajw funkcji kryptograficznych (wicej informacji na stronie domowej) i jest rednio cztery razy
szybszy od generatora dostarczanego w libc. Strona domowa generatora Mersenne Twister znajduje si pod
adresem http://www.math.keio.ac.jp/~matumoto/emt.html, a zoptymalizowane rda MT znajduj si pod
adresem http://www.scp.syr.edu/~marc/hawk/twister.html.
int mt_rand (void)
int mt_rand (int min, int max)
Jeeli funkcja zostanie wywoana bez opcjonalnych parametrw $min i $max, mt_rand() zwraca liczb
pseudolosow z przedziau 0 do RAND_MAX. Jeeli chcesz otrzyma liczby pomidzy, na przykad, 5 a 15 (wcznie)
uyj mt_rand(5, 15). Naley pamita, e trzeba zainicjowa generator liczb losowych przed uyciem funkcji
mt_srand().
Uwaga
W wersjach wczeniejszych od 3.0.7, drugi parametr oznacza wielko przedziau. Aby otrzyma te same wyniki, co w naszym
krtkim przykadzie trzeba byo wywoa funkcj mt_rand(5, 11).
Patrz rwnie: mt_srand(), mt_getrandmax(), srand(), rand() i getrandmax().
mt_srand
Inicjuje generator liczb losowych wartoci $seed.
void mt_srand (int seed)
Przykad:
//inicjowanie mikrosekundami od ostatniej penej sekundy
mt_srand((double) microtime() * 1000000);
$randval = mt_rand();
Patrz rwnie: mt_rand(), mt_getrandmax(), srand(), rand() i getrandmax().

mysql_affected_rows
Zwraca ilo wierszy zmienionych przez ostatnie wyraenie INSERT, UPDATE lub DELETE na serwerze
skojarzonym z podanym identyfikatorem cza. Jeeli nie zostanie podany identyfikator cza, uywany jest
ostatnio otwarte poczenie. Jeeli ostatnim zapytaniem byo zapytanie DELETE bez klauzuli WHERE, usunite
zostan wszystkie wiersze z tabeli, ale funkcja zwrci zero. Funkcja nie dziaa dla wyrae typu SELECT, jedynie
dla wyrae zmieniajcych rekordy. Aby pobra ilo wierszy zwracanych przez zapytanie SELECT, naley uy
mysql_num_rows().
int mysql_affected_rows ([resource link_identifier])
mysql_change_user
Zmienia uytkownika na biecym poczeniu lub poczeniu podanym przez identyfikator poczenia
$link_identifier. Jeeli zostanie podana baza danych, bdzie ona ustawiona jako bieca baza danych. Jeeli nie
uda si autoryzacja nowego uytkownika, aktywne pozostanie poczenie wczeniej podczonego uytkownika.
Uwaga
Funkcja zostaa wprowadzona w PHP 3.0.13 i wymaga MySQL w wersji co najmniej 3.23.3.
int mysql_change_user (string user, string password [, string database
[, resource link_identifier]])
mysql_close
Zwraca True w przypadku powodzenia a False w przypadku bdu. Funkcja mysql_close() zamyka
poczenie do bazy danych MySQL, ktra jest skojarzona z podanym identyfikatorem poczenia. Jeeli
PHP Kompendium wiedzy
319

identyfikator poczenia nie zostanie podany, uywane jest ostatnio otwarte poczenie. Uycie tej funkcji nie jest
zwykle konieczne, poniewa poczenia nietrwae s automatycznie zamykane po zakoczeniu wykonywania
skryptu.
Uwaga
Funkcja mysql_close() nie zamyka pocze trwaych otwartych za pomoc mysql_pconnect().
bool mysql_close ([resource link_identifier])
Przykad: MySQL_close()
<?php
$link = mysql_connect ("kraemer", "marliesle", "secret")
or die ("Nie mona podczy");
print ("Podczenie udane");
mysql_close ($link);
?>
Patrz rwnie: mysql_connect() i mysql_pconnect().
mysql_connect
Zwraca dodatni identyfikator poczenia do MySQL, lub False w przypadku bdu. Funkcja
mysql_connect() nawizuje poczenie z serwerem MySQL. Jeeli nie zostan podane parametry domylne,
przyjmowane s nastpujce wartoci domylne: $host:port = 'localhost:3306', $username nazwa
uytkownika, ktry jest wacicielem procesu i $password pusty cig. Cig z nazw komputera moe zawiera
numer portu lub ciek do gniazda, np.: ":/sciezka/do/gniazda" dla komputera lokalnego.
Uwaga
Obsuga ":port" zostaa dodana w PHP 3.0B4. Obsuga ":/sciezka/do/gniazda" zostaa dodana w PHP 3.0.10. Mona
zapobiec generowaniu komunikatw bdu umieszczajc znak @ przed nazw funkcji.
Drugie wywoanie mysql_connect() z takimi samymi argumentami nie spowoduje zestawienia nastpnego
poczenia. Zamiast tego zwrcony zostanie identyfikator istniejcego ju poczenia. Poczenie z serwerem
zostanie zamknite po zakoczeniu wykonywania skryptu chyba, e wczeniej zostanie zamknite za pomoc
mysql_close().
resource mysql_connect ([string hostname [:port] [:/path/to/socket]
[, string username [, string password]]])
Przykad: MySQL_connect()
<?php
$link = mysql_connect ("kraemer", "marliesle", "secret")
or die ("Nie mona podczy");
print ("Podczenie udane");
mysql_close ($link);
?>
Patrz rwnie: mysql_pconnect() i mysql_close().
mysql_create_db
Tworzy now baz danych na serwerze wskazywanym przez podany identyfikator cza.
int mysql_create_db (string database name [, resource link_identifier])
Przykad: Tworzenie bazy danych MySQL
<?php
$link = mysql_pconnect ("kron", "jutta", "geheim")
or die ("Nie mona podczy");
if (mysql_create_db ("my_db")) {
print ("Udane utworzenie bazy danych\n");
} else {
printf ("Bd tworzenia bazy danych: %s\n", mysql_error ());
}
?>
Aby zachowa zgodno z poprzednimi wersjami mona rwnie uywa funkcji mysql_createdb(). Patrz
rwnie: mysql_drop_db().
Dodatek A - Funkcje
320

mysql_data_seek
Zwraca True w przypadku powodzenia a False w przypadku bdu. Przesuwa wewntrzny znacznik
wiersza w wyniku MySQL skojarzonym z podanym identyfikatorem wyniku zapytania do wiersza o podanym
numerze. Kolejne wywoanie funkcji mysql_fetch_row() zwrci ten wiersz. Parametr $row_number przyjmuje
wartoci rozpoczynajce si od 0.
bool mysql_data_seek (resource result_identifier, int row_number)
Przykad: Przesuwanie wskanika w wyniku
<?php
$link = mysql_pconnect ("kron", "jutta", "geheim")
mysql_select_db ("samp_db")
or die ("Nie mona wybra bazy danych");
$result = mysql_query ($query)
or die ("Zapytanie nieudane");
for ($i = mysql_num_rows ($result) - 1; $i >=0; $i--) {
if (!mysql_data_seek ($result, $i)) {
continue;
}
continue;
echo ("$row->last_name $row->first_name<BR>\n";
or die ("Nie mona podczy");
$query = "SELECT last_name, first_name FROM friends";
# Pobieranie wierszy w odwrotnej kolejnoci
echo "Nie mog przej do wersza $i\n";
if(!($row = mysql_fetch_object ($result)))
}
mysql_free_result ($result);
?>
mysql_db_name
Jako pierwszego parametru wymaga wskanika wyniku zwracanego przez funkcj mysql_list_dbs().
Parametr $row jest indeksem w wyniku. Jeeli wystpi bd, zwracana jest warto False. Aby okreli rodzaj
bdu naley uy funkcji mysql_errno() i mysql_error().
string mysql_db_name (resource result, int row [, mixed field])
Przykad: mysql_db_name()
<?php
error_reporting(E_ALL);
mysql_connect('dbhost', 'username', 'password');
$db_list = mysql_list_dbs();
$i = 0;
$cnt = mysql_num_rows($db_list);
while ($i < $cnt) {
echo mysql_db_name($db_list, $i) . "\n";
$i++;
}
?>
Dla zachowania zgodnoci z poprzednimi wersjami mona rwnie uywa nazwy mysql_dbname(). Nie
jest to jednak zalecane.
mysql_db_query
Zwraca dodatni identyfikator zapytania MySQL lub False w przypadku wystpienia bdu. Wybiera baz
danych i wykonuje na niej zapytanie. Jeeli opcjonalny identyfikator cza nie zostanie podany, uyte zostanie
ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja prbuje utworzy poczenie identycznie jak robi to
funkcja mysql_connect() wywoana bez argumentw. Patrz rwnie: mysql_connect(). Dla zachowania zgodnoci
mona rwnie uywa nazwy mysql().
resource mysql_db_query (string database, string query [, resource link_identifier])
mysql_drop_db
Zwraca True w przypadku powodzenia operacji a False w przypadku bdu. Funkcja mysql_drop_db()
prbuje usun z serwera ca baz danych skojarzon z podanym identyfikatorem poczenia. Patrz rwnie:
mysql_create_db(). Dla zachowania zgodnoci mona rwnie uywa funkcji mysql_dropdb().
bool mysql_drop_db (string database_name [, resource link_identifier])
PHP Kompendium wiedzy
321

mysql_errno
Zwraca numer bdu dla ostatnio wykonanej funkcji MySQL lub 0, jeeli nie wystpi aden bd. Bdy
wysyane przez serwer MySQL nie mog by traktowane jako ostrzeenia, zamiast tego naley pobiera numery
bdw za pomoc funkcji mysql_errno().
Uwaga
Funkcja zwraca kod bdu dla ostatnio wykonanej funkcji MySQL (opcz mysql_error() i mysql_errno()). Jeeli chcesz jej uy,
naley sprawdza kod bdu przed wywoaniem kolejnej funkcji MySQL.
int mysql_errno ([resource link_identifier])
Przykad: mysql_errno()
<?php
mysql_connect("marliesle");
echo mysql_errno().": ".mysql_error()."<BR>";
mysql_select_db("nonexistentdb");
echo mysql_errno().": ".mysql_error()."<BR>";
$conn = mysql_query("SELECT * FROM nonexistenttable");
echo mysql_errno().": ".mysql_error()."<BR>";
?>
Patrz rwnie: mysql_error().
mysql_error
Zwraca komunikat bdu dla ostatnio wykonanej funkcji MySQL lub 0, jeeli nie wystpi aden bd.
Bdy wysyane przez serwer MySQL nie mog by traktowane jako ostrzeenia, zamiast tego naley pobiera
komunikaty bdw za pomoc funkcji mysql_error().
Uwaga
Funkcja zwraca kod bdu dla ostatnio wykonanej funkcji MySQL (opcz mysql_error() i
mysql_errno()). Jeeli chcesz jej uy, naley sprawdza kod bdu przed wywoaniem kolejnej funkcji MySQL.
string mysql_error ([resource link_identifier])
Przykad: mysql_errno()
<?php
mysql_connect("marliesle");
echo mysql_errno().": ".mysql_error()."<BR>";
mysql_select_db("nonexistentdb");
echo mysql_errno().": ".mysql_error()."<BR>";
$conn = mysql_query("SELECT * FROM nonexistenttable");
echo mysql_errno().": ".mysql_error()."<BR>";
?>
Patrz rwnie: mysql_errno().
mysql_fetch_array
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja mysql_fetch_array() jest rozszerzeniem funkcji mysql_fetch_row(). Oprcz zapamitywania danych pod
indeksami numerycznymi, dodatkowo dane s zapisywane pod indeksami asocjacyjnymi, uywajc nazw pl jako
kluczy. Jeeli dwie lub wicej pl w wyniku ma takie same nazwy, zwrcona zostanie warto ostatniego z nich.
Aby odczyta wartoci kolumn o tych samych nazwach naley korzysta z indeksw numerycznych lub stworzy
aliasy dla kolumn.
array mysql_fetch_array (resource result [, int result_type])
Naley przypomnie, e funkcja mysql_fetch_array() NIE jest wyranie wolniejsza od funkcji
mysql_fetch_row(), jedynie dostarcza wicej wynikw. Opcjonalny drugi argument, $result_type moe by
jedn ze staych: MYSQL_ASSOC, MYSQL_NUM i MYSQL_BOTH (parametr osta dodany w PHP 3.0.7). Patrz rwnie:
mysql_fetch_row() i mysql_fetch_assoc().
Przykad: mysql_fetch_array()
<?php
mysql_connect ($host, $user, $password);
$result = mysql_db_query ("database","select user_id, fullname from table");
Dodatek A - Funkcje
322
while ($row = mysql_fetch_array ($result)) {

echo "ID uytkownika: ".$row["user_id"]."<br>\n";
echo "ID uytkownika: ".$row[0]."<br>\n";
echo "Pena nazwa : ".$row["fullname"]."<br>\n";
echo "Pena nazwa : ".$row[1]."<br>\n";
}
mysql_free_result ($result);
?>
mysql_fetch_assoc
Zwraca tablic asocjacyjn odpowiadajc biecemu wierszowi lub False, jeeli nie ma ju wicej
wierszy w wyniku. Funkcja mysql_fetch_assoc() jest odpowiednikiem wywoania funkcji mysql_fetch_array() z
parametrem MYSQL_ASSOC. Powoduje to zwrcenie tylko tablicy asocjacyjnej. Jest to sposb w jaki wczeniej
dziaaa funkcja mysql_fetch_array(). Jeeli dwie lub wicej pl w wyniku ma takie same nazwy, zwrcona
zostanie warto ostatniego z nich. Aby odczyta wartoci kolumn o tych samych nazwach naley uy funkcji
mysql_fetch_array() i skorzysta z indeksw numerycznych. Naley przypomnie, e funkcja
mysql_fetch_assoc() NIE jest wyranie wolniejsza od funkcji mysql_fetch_row(), jedynie dostarcza wicej
wynikw. Patrz rwnie: mysql_fetch_row() i mysql_fetch_array().
array mysql_fetch_assoc (resource result)
Przykad: mysql_fetch_assoc()
<?php
mysql_connect ($host, $user, $password);
$result = mysql_db_query ("database","select * from table");
while ($row = mysql_fetch_assoc ($result)) {
echo $row["user_id"];
echo $row["fullname"];
}
mysql_free_result ($result);
?>
mysql_fetch_field
Zwraca obiekt zawierajcy informacje o polu. Funkcja mysql_fetch_field() moe by uyta do pobrania
danych na temat pl w wyniku. Jeeli nie zostanie podane przesunicie, odczytywane jest nastpne pole, ktre nie
byo jeszcze odczytane.
object mysql_fetch_field (resource result [, int field_offset])
Waciwoci zwracanego obiektu s nastpujce:
name nazwa kolumny
table nazwa tabeli do ktrej naley kolumna
max_length maksymalna dugo pola
not_null 1 jeeli kolumna nie moe by pusta
primary_key 1 jeeli kolumna jest kluczem gwnym
unique_key 1 jeeli kolumna jest kluczem unikalnym
multiple_key 1 jeeli kolumna nie jest kluczem unikalnym
numeric 1 jeeli kolumna jest numeryczna
blob 1 jeeli kolumna jest typu BLOB
type typ kolumny
unsigned 1 jeeli kolumna jest bez znaku
zerofill 1 jeeli kolumna jest wypeniana zerami
Przykad: mysql_fetch_field()
<?php
mysql_connect ($host, $user, $password)
or die ("Nie mona podczy");
$result = mysql_db_query ("database", "select * from table")
or die ("Zapytanie nieudane");
# pobranie metadanych kolumny
$i = 0;
while ($i < mysql_num_fields ($result)) {
echo "Informacje na temat kolumny: $i:<BR>\n";
$meta = mysql_fetch_field ($result);
if (!$meta) {
echo "Brak dostpnych danych<BR>\n";
PHP Kompendium wiedzy
323
}

echo "<PRE>
blob: $meta->blob
max_length: $meta->max_length
multiple_key: $meta->multiple_key
name: $meta->name
not_null: $meta->not_null
numeric: $meta->numeric
primary_key: $meta->primary_key
table: $meta->table
type: $meta->type
unique_key: $meta->unique_key
unsigned: $meta->unsigned
zerofill: $meta->zerofill
</PRE>";
$i++;
}
mysql_free_result ($result);
?>
mysql_fetch_lengths
Zwraca tablic zawierajc dugoci pl z ostatniego wiersza odczytanego przez funkcj
mysql_fetch_row() lub False w przypadku bdu. Funkcja mysql_fetch_lengths() przechowuje dugoci kadej
kolumny wyniku w ostatnim wierszu zwracanym przez mysql_fetch_row(), mysql_fetch_array() i
mysql_fetch_object() w tablicy rozpoczynajcej si od indeksu 0. Patrz rwnie: mysql_fetch_row().
array mysql_fetch_lengths (resource result)
mysql_fetch_object
Zwraca obiekt z waciwociami odpowiadajcymi polom pobieranego wiersza lub False, jeeli nie ma
wicej wierszy do pobrania. Funkcja mysql_fetch_object() jest podobna do mysql_fetch_array() z jedn rnic
zwracany jest obiekt a nie tablica. Oznacza to, e moesz odwoywa si do pl poprzez nazwy a nie poprzez
indeks( liczby nie s prawidowymi nazwami waciwoci). Drugi argument, $result_type w funkcji
mysql_fetch_array() jest jedn z nastpujcych staych: MYSQL_ASSOC, MYSQL_NUM i MYSQL_BOTH. Funkcja jest
identyczna wydajnociowo z mysql_fetch_array() i prawie tak samo szybka jak mysql_fetch_row() rnica
jest nieznaczna.
object mysql_fetch_object (resource result [, int result_type])
Przykad: mysql_fetch_object()
<?php
mysql_connect ($host, $user, $password);
$result = mysql_db_query ("database", "select * from table");
while ($row = mysql_fetch_object ($result)) {
echo $row->user_id;
echo $row->fullname;
}
mysql_free_result ($result);
?>
Patrz rwnie: mysql_fetch_array() i mysql_fetch_row().
mysql_fetch_row
Zwraca tablic odpowiadajca pobranemu wierszowi, lub False jeeli nie ma ju wierszy do pobrania.
Funkcja mysql_fetch_row() pobiera jeden wiersz z wyniku okrelonego przez identyfikator zapytania. Wiersz jest
zwracany w postaci tablicy. Kada kolumna jest zapisywana w osobnym indeksie tablicy, rozpoczynajc od 0.
Kolejne wywoanie mysql_fetch_row() powoduje zwracanie kolejnych wierszy z wyniku lub False jeeli nie ma
ju wicej wierszy. Patrz rwnie: mysql_fetch_array(), mysql_fetch_object(), mysql_data_seek() i
mysql_result().
array mysql_fetch_row (resource result)
mysql_field_flags
Zwraca atrybuty podanego pola. Atrybuty s zwracane w jednym cigu rozdzielone spacjami, wic mona
je atwo rozdzieli za pomoc funkcji explode(). Zwracane s nastpujce atrybuty o ile twoja wersja MySQL je
Dodatek A - Funkcje
324

wszystkie obsuguje: not_null, primary_key, unique_key, multiple_key, blob, unsigned, zerofill, binary, enum,
auto_increment i timestamp. Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy
mysql_fieldflags().
string mysql_field_flags (resource result, int field_offset)
mysql_field_len
Zwraca dugo podanego pola. Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy
mysql_fieldlen().
int mysql_field_len (resource result, int field_offset)
mysql_field_name
Zwraca nazw podanego pola. Parametr $result jest identyfikatorem zapytania, a $field_index jest
numerem kolejnym pola.
Uwaga

Wartoci $field_index rozpoczynaj si od 0. Na przykad, indeks trzeciego pola bdzie 2, czwartego 3 itd.
string mysql_field_name (resource result, int field_index)
Przykad: mysql_field_name()
// Tabela users skada si z trzech pl:
// user_id
// username
// password.

$res = mysql_db_query("users", "select * from users", $link);
echo mysql_field_name($res, 0) . "\n";
echo mysql_field_name($res, 2);
Wykonanie tego przykadu spowoduje wypisanie nastpujcego wyniku:
user_id
password
Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_fieldname().
mysql_field_seek
Przesuwa wskanik do podanego numeru pola. Jeeli nastpne wywoanie mysql_fetch_field() nie bdzie
zawierao numeru pola, zostanie zwrcone to wanie pole. Patrz rwnie: mysql_fetch_field(). Patrz rwnie:
mysql_fetch_field().
int mysql_field_seek (resource result, int field_offset)
mysql_field_table
Zwraca nazw tabeli, z ktrej pochodzi podane pole. Dla zachowania zgodnoci wstecz mona uywa
rwnie nazwy mysql_fieldtable().
string mysql_field_table (resource result, int field_offset)
mysql_field_type
Funkcja podobna do mysql_field_name(). Argumenty s identyczne, ale zwracane s typy pl. Typami
tymi mog by int, real, string, blob i inne opisane w dokumentacji MySQL.
string mysql_field_type (iresource result, int field_offset)
Przykad: Typy pl MySQL
<?php
mysql_connect ("localhost:3306");
mysql_select_db ("wisconsin");
$result = mysql_query ("SELECT * FROM onek");
$fields = mysql_num_fields ($result);
$rows = mysql_num_rows ($result);
$i = 0;
PHP Kompendium wiedzy
325

$table = mysql_field_table ($result, $i);
echo "Tabela '".$table."' ma ".$fields." pl i ".$rows." rekordw <BR>";
echo "Tabela skada si z nastpujcych pl: <BR>";
while ($i < $fields) {
$type = mysql_field_type ($result, $i);
$name = mysql_field_name ($result, $i);
$len = mysql_field_len ($result, $i);
$flags = mysql_field_flags ($result, $i);
echo $type." ".$name." ".$len." ".$flags."<BR>";
$i++;
}
mysql_close();
?>
Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_fieldtype().
mysql_free_result
Zwalnia pami przydzielon dla $result. Po zakoczeniu wykonywania dania pami jest zwalniana
automatycznie. Funkcja ta jest potrzebna tylko wtedy, gdy nie chcemy zuywa zbyt wiele pamici w czasie
dziaania skryptu. Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_freeresult().
int mysql_free_result (resource result)
mysql_insert_id
Zwraca identyfikator generowany dla kolumn AUTO_INCREMENT przez ostatnie wyraenie INSERT wykonane
na podanym identyfikatorze cza. Jeeli nie zostanie podany identyfikator cza, przyjmowane jest ostatnio
otwarte cze. Funkcja mysql_insert_id() zwraca 0 jeeli poprzednie zapytanie nie generowao wartoci
AUTO_INCREMENT. Jeeli chcesz zachowa t warto do pniejszego uycia trzeba pamita, aby wywoa funkcj
natychmiast po zapytaniu generujcym warto.
Uwaga
Warto funkcji MySQL LAST_INSERT_ID() zawsze zawiera ostatnio wygenerowan warto AUTO_INCREMENT i nie jest ona
kasowana pomidzy zapytaniami.
Funkcja mysql_insert_id() konwertuje typ wartoci zwracanej przez funkcj MySQL API na typ long.
Jeeli kolumna AUTO_INCREMENT bdzie miaa typ BIGINT, wartoci zwracane przez mysql_insert_id() bd
nieprawidowe. Zamiast tego mona uywa wewntrznej funkcji MySQL LAST_INSERT_ID().
int mysql_insert_id ([resource link_identifier])
mysql_list_dbs
Zwraca znacznik wyniku zawierajcego bazy danych dostpne dla demona mysql. Naley uy funkcji
mysql_tablename() do odczytania tego znacznika wyniku.
Uwaga
Funkcja dziaa rwnie z funkcjami mysql_fetch_row() lub podobnymi.
Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_listdbs().
resource mysql_list_dbs ([resource link_identifier])
Przykad: mysql_list_dbs()
$link = mysql_connect('localhost', 'myname', 'secret');
$db_list = mysql_list_dbs($link);
while ($row = mysql_fetch_object($db_list)) {
echo $row->Database . "\n";
}
Przykad ten moe da nastpujce wyniki:
database1
database2
database3
...
Dodatek A - Funkcje
326

mysql_list_fields
Pobiera dane na temat podanej tabeli. Parametrami s nazwa bazy danych i nazwa tabeli. Zwracany jest
znacznik wyniku, ktry moe by uyty w funkcjach mysql_fieldflags(), mysql_fieldlen(), mysql_fieldname()
i mysql_fieldtype(). Identyfikator wyniku jest dodatni liczb cakowit. W przypadku bdu funkcja zwraca -1.
Cig opisujcy bd umieszczany jest w $phperrmsg i jeeli funkcja nie zostaa wywoana jako
@mysql_list_fields(), cig ten jest wypisywany na wyjcie. Dla zachowania zgodnoci wstecz mona uywa
rwnie nazwy mysql_listfields().
resource mysql_list_fields (string database_name, string table_name
[, resource link_identifier])
Przykad: mysql_list_fields()
$link = mysql_connect('localhost', 'myname', 'secret');
$fields = mysql_list_fields("database1", "table1", $link);
$columns = mysql_num_fields($fields);
for ($i = 0; $i < $columns; $i++) {
echo mysql_field_name($fields, $i) . "\n";;
}
Przykad ten moe da nastpujce wyniki:
field1
fiels2
field3
...
mysql_list_tables
Pobiera jako argument nazw bazy danych i zwraca znacznik wyniku podobnie do funkcji
mysql_db_query(). Do pobrania wyniku na podstawie znacznika powinna zosta uyta funkcja
mysql_tablename(). Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_listtables().
resource mysql_list_tables (string database [, resource link_identifier])
mysql_num_fields
Zwraca ilo pl w wyniku. Patrz rwnie: mysql_db_query(), mysql_query(), mysql_fetch_field() i
mysql_num_rows(). Dla zachowania zgodnoci wstecz mona uywa rwnie nazwy mysql_numfields().
int mysql_num_fields (resource result)
mysql_num_rows
Zwraca ilo wierszy w wyniku. Funkcja dziaa jedynie dla wyrae SELECT. Aby odczyta ilo wierszy
zwracanych z wyrae INSERT, UPDATE lub DELETE naley uywa funkcji mysql_affected_rows(). Patrz rwnie:
mysql_db_query(), mysql_query() i mysql_fetch_row().Dla zachowania zgodnoci wstecz mona uywa
rwnie nazwy mysql_numrows().
int mysql_num_rows (resource result)
mysql_pconnect
Zwraca dodatni identyfikator trwaego poczenia do MySQL, lub False w przypadku bdu. Funkcja
mysql_pconnect() nawizuje poczenie z serwerem MySQL. Jeeli nie zostan podane parametry domylne,
przyjmowane s nastpujce wartoci domylne: $host:port = 'localhost:3306', $username nazwa
uytkownika, ktry jest wacicielem procesu i $password pusty cig. Cig z nazw komputera moe zawiera
numer portu lub ciek do gniazda, np.: ":/sciezka/do/gniazda" dla komputera lokalnego.
Uwaga
Obsuga ":port" zostaa dodana w PHP 3.0B4. Obsuga ":/sciezka/do/gniazda" zostaa dodana w PHP 3.0.10. Mona
zapobiec generowaniu komunikatw bdu umieszczajc znak @ przed nazw funkcji.
resource mysql_pconnect ([string hostname [:port] [:/path/to/socket]
[, string username [, string password]]])
PHP Kompendium wiedzy
327

Funkcja mysql_pconnect() dziaa bardzo podobnie do mysql_connect() z dwiema rnicami. Po pierwsze,
w czasie poczenia zamiast otwiera nowe poczenie funkcja prbuje znale istniejce cze (trwae). Jeeli
zostanie ono znalezione, zostaje zwrcone zamiast nowego poczenia. Po drugie, poczenie do serwera MySQL
nie jest zamykane po zakoczeniu pracy skryptu. cze takie pozostaje otwarte do wykorzystania w przyszoci
(mysql_close() nie zamyka pocze utworzonych przez mysql_pconnect()). Dlatego ten typ poczenia
nazywany jest trwaym.
mysql_query
Wysya zapytanie do aktywnej bazy danych skojarzonej z podanym identyfikatorem cza. Jeeli
identyfikator ten nie zostanie podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja
prbuje utworzy poczenie identycznie jak robi to funkcja mysql_connect() wywoana bez parametrw a
nastpnie uywa cza do wykonania zapytania.
Uwaga
Cig z zapytaniem nie moe koczy si rednikiem.
Funkcja mysql_query() zwraca True (warto rn od zera) jeeli zapytanie udao si lub False gdy nie
udao si. Zwrcenie wartoci True wskazuje tylko, e zapytanie moe by wykonane przez serwer. Nie mwi to
nic na temat iloci zmienionych lub zwrconych wierszy. Jest moliwe wykonanie poprawnego zapytania, ktre
nie zwrci adnych wierszy.
resource mysql_query (string query [, resource link_identifier])
Ponisze zapytanie jest niepoprawne skadniowo, wic funkcja mysql_query() zwrci False.
Przykad: mysql_query()
<?php
$result = mysql_query ("SELECT * WHERE 1=1")
or die ("Nieprawidowe zapytanie");
?>
Kolejne zapytanie moe by niepoprawne, jeeli kolumna my_col nie bdzie istniaa w tabeli my_tbl i w
takim przypadku mysql_query() zwrci False.
Przykad: mysql_query()
<?php
$result = mysql_query ("SELECT my_col FROM my_tbl")
or die ("Nieprawidowe zapytanie");
?>
Funkcja mysql_query() moe si rwnie nie uda i zwrci False, jeeli nie masz wystarczajcych
uprawnie do tabel na ktrych operuje zapytanie. Zakadajc, e zapytanie si uda, mona wywoa funkcj
mysql_num_rows() aby sprawdzi ile wierszy zwrcio zapytanie SELECT lub mysql_affected_rows() aby sprawdzi
ile wierszy zostao zmienionych przez wyraenie DELETE, INSERT, REPLACE lub UPDATE. Dla wyrae SELECT funkcja
mysql_query() zwraca nowy identyfikator wyniku, ktry moe by przekazany do funkcji mysql_result(). Po
zakoczeniu pracy na wyniku mona zwolni zasoby z nim zwizane wywoujc mysql_free_result().
Przydzielona pami jest jednak automatycznie zwalniana po zakoczeniu skryptu. Patrz rwnie:
mysql_affected_rows(), mysql_db_query(), mysql_free_result(), mysql_result(), mysql_select_db() i
mysql_connect().
mysql_result
Zwraca zawarto komrki w podanym wierszu, numerze i wyniku MySQL. Argument $field moe by
numerem pola, nazw pola lub nazw w postaci tabela kropka pole (pole.tabela). Jeeli kolumna otrzymaa w
zapytaniu alias (select foo as bar from ...), naley uy aliasu a nie oryginalnej nazwy kolumny. Pracujc na
duych wynikach naley rozway uycie jednej funkcji do wczytania caego wiersza. Poniewa funkcje te
zwracaj zawarto wielu pl za pomoc jednego wywoania, s one duo szybsze od mysql_result(). Podawanie
numerw pl zamiast ich nazw powoduje szybsze dziaanie funkcji. Wywoania funkcji mysql_result() nie
powinny by mieszane z wywoaniami innych funkcji operujcych na wyniku. Zalecanymi szybszymi funkcjami
s: mysql_fetch_row(), mysql_fetch_array() i mysql_fetch_object().
mixed mysql_result (resource result, int row [, mixed field])
Dodatek A - Funkcje
328

mysql_select_db
Zwraca True w przypadku powodzenia a False w przypadku bdu. Funkcja mysql_select_db() ustawia na
serwerze biec aktywn baz danych o podanym identyfikatorze cza. Jeeli identyfikator ten nie zostanie
podany, uyte zostanie ostatnio otwarte cze. Jeeli nie ma otwartego cza, funkcja prbuje utworzy poczenie
identycznie jak robi to funkcja mysql_connect() a nastpnie uywa cza do wybrania bazy danych. Kolejne
wywoania mysql_query() wykonywane s na aktywnej bazie danych. Patrz rwnie: mysql_connect(),
mysql_pconnect() i mysql_query(). Dla zgodnoci z poprzednimi wersjami mona korzysta z nazwy
mysql_selectdb().
bool mysql_select_db (string database_name [, resource link_identifier])
mysql_tablename
Na podstawie identyfikatora wyniku zwracanego przez mysql_list_tables() oraz numeru kolejnego
pobiera i zwraca nazw tabeli. Funkcja mysql_numrows() moe by uyta do okrelenia iloci tabel w wyniku.
string mysql_tablename (resource result, int i)
Przykad: mysql_tablename()
<?php
mysql_connect ("localhost:3306");
$result = mysql_list_tables ("wisconsin");
$i = 0;
while ($i < mysql_num_rows ($result)) {
$tb_names[$i] = mysql_tablename ($result, $i);
echo $tb_names[$i] . "<BR>";
$i++;
}
?>
natcasesort
Stosuje algorytm sortowania cigw w sposb w jaki robi to ludzie. Jest on nazwany porzdkowaniem
naturalnym. Funkcja natcasesort() jest wersj funkcji natsort(), ktra nie rozrnia wielkoci liter. Rnica
pomidzy sortowaniem naturalnym a zwykym algorytmem sortowania pokazana jest w przykadzie zastosowania
funkcji natsort(). Wicej informacji na temat tego algorytmu mona znale na stronie
http://www.linuxcare.com.au/projects/natsort/. Patrz rwnie: sort(), natsort(), strnatcmp() i strnatcasecmp().
void natcasesort (array array)
natsort
Stosuje algorytm sortowania cigw w sposb w jaki robi to ludzie. Jest on nazwany porzdkowaniem
naturalnym. Rnica pomidzy sortowaniem naturalnym a zwykym algorytmem sortowania pokazana jest na
poniszym przykadzie.
void natsort (array array)
Przykad: natsort()
$array1 = $array2 = array ("img12.png", "img10.png", "img2.png", "img1.png");
sort($array1);
echo "Zwyke sortowanie\n";
print_r($array1);
natsort($array2);
echo "\nSortowanie w porzdku naturalnym\n";
print_r($array2);
Wykonanie tego kodu da nastpujcy wynik:
Zwyke sortowanie
Array
(
[0] => img1.png
[1] => img10.png
[2] => img12.png
[3] => img2.png
)
Sortowanie w porzdku naturalnym
Array
(
[3] => img1.png
[2] => img2.png
PHP Kompendium wiedzy
329

[1] => img10.png
[0] => img12.png
)
Wicej informacji mona znale na stronie powiconej temu algorytmowi,
http://www.linuxcare.com.au/projects/natsort/. Patrz rwnie: natcasesort(), strnatcmp() i strnatcasecmp().
next
Zwraca element tablicy znajdujcy si na nastpnym miejscu wskazywanym przez wewntrzny wskanik
tablicy lub False, jeeli nie ma ju wicej elementw. Funkcja next() zachowuje si podobnie do current(), z
jedn rnic. Next() przesuwa wewntrzny wskanik tablicy o jeden element dalej. Jeeli przesunicie
wskanika spowoduje wyjcie wskanika poza tablic, next() zwraca False. Jeeli tablica zawiera pusty element
lub element o wartoci klucza 0, funkcja wrci False po napotkaniu takiego elementu. Aby prawidowo
przeglda tablice, ktre mog zawiera puste elementy lub klucze o wartoci 0, naley uy funkcji each(). Patrz
rwnie: curent(), end(), prev() i reset().
mixed next (array array)
nl2br
Zwraca cig ze znacznikami <BR> wstawionymi przed wszystkimi znakami nowej linii. Patrz rwnie:
htmlspecialchars(), htmlentities() i word_wrap().
string nl2br (string string)
number_format
Zwraca liczb $number w sformatowanej postaci. Funkcja moe by wywoana z jednym, dwoma lub
czterema parametrami (nie z trzema). Jeeli podany zosta jeden parametr, liczba $number jest formatowana bez
czci uamkowej, ale z przecinkami pomidzy kolejnymi grupami tysicy. Jeeli podane s dwa parametry,
liczba jest formatowana z $decimals cyfr po przecinku, z kropk dziesitn i przecinkami pomidzy grupami
tysicy. Jeeli s podane wszystkie cztery parametry, liczba jest z $decimals cyfr po przecinku, ze znakiem
$dec_point zamiast kropki dziesitnej i znakiem $thousand_sep zamiast przecinka pomidzy grupami tysicy.
string number_format (float number [, int decimals [, string dec_point
[, string thousands_sep]]])
ob_end_clean
Usuwa zawarto bufora wyjciowego i wycza buforowanie wyjcia. Patrz rwnie: ob_start() i
ob_end_flush().
void ob_end_clean (void)
ob_end_flush
Wysya zawarto bufora wyjciowego (o ile istnieje) na wyjcie i wycza buforowanie wyjcia. Jeeli
chcesz przetworzy zawarto bufora musisz uy funkcji ob_get_contents() przed ob_end_flush(), poniewa
zawarto bufora jest usuwana po wywoaniu ob_get_contents(). Patrz rwnie: ob_start(), ob_get_contents() i
ob_end_clean().
void ob_end_flush (void)
ob_get_contents
Zwraca zawarto bufora wyjciowego lub False, jeeli buforowanie wyjcia nie jest aktywne. Patrz
rwnie: ob_start() i ob_get_length().
string ob_get_contents (void)
Dodatek A - Funkcje
330

ob_get_length
Zwraca ilo danych w buforze wyjciowym lub False, jeeli buforowanie wyjcia nie jest aktywne. Patrz
rwnie: ob_start() i ob_get_contents().
string ob_get_length (void)
ob_implicit_flush
Wcza lub wycza ukryte oprnianie bufora wyjciowego (jeeli nie podany zosta znacznik $flag,
domylnie wcza opcj). Ukryte oprnianie bufora powoduje oprnianie bufora po kadej operacji wyjcia,
wic nie s potrzebne jawne wywoania funkcji flush(). Wczenie ukrytego oprniania powoduje wyczenie
buforowania wyjcia i zawarto bufora wyjciowego jest wysyana tak samo, jak po wywoaniu funkcji
ob_end_flush(). Patrz rwnie: flush(), ob_start() i ob_end_flush().
void ob_implicit_flush ([int flag])
ob_start
Wcza buforowanie wyjcia. Gdy aktywne jest buforowanie wyjcia, ze skryptu nie s przesyane adne
dane wyjciowe. Zamiast tego s one zbierane w wewntrznym buforze. Zawarto tego bufora moe by
skopiowana do zmiennej za pomoc ob_get_contents(). Aby wysa na wyjcie dane zebrane w buforze, naley
wywoa funkcj ob_end_flush(). Mona rwnie usun ca zawarto bufora za pomoc funkcji
ob_end_clean(). Patrz rwnie: ob_get_contents(), ob_end_flush(), ob_end_clean() i ob_implict_flush().
void ob_start ([string output_callback])
OCIBindByName
czy zmienn PHP $variable z obszarem zablokowanym $ph_name. To, czy zostanie on uyty jako
wejcie czy jako wyjcie jest okrelane w czasie pracy i wtedy przydzielana jest niezbdna pami. Parametr
$length okrela maksymaln dugo dla poczenia. Jeeli ustawisz $length na -1, OCIBindByName() do
ustawienia dugoci uyje biecego rozmiaru $variable. Jeeli musisz doczy abstrakcyjny typ danych (LOB,
ROWID, BFILE), musisz je najpierw zarezerwowa za pomoc funkcji OCINewDescriptor(). Parametr $length nie
jest uywany dla abstrakcyjnych typw danych i powinien by ustawiony na -1. Parametr $type okrela typ
uywanego deskryptora. Moliwymi wartociami s: OCI_B_FILE (plik binarny), OCI_B_CFILE (plik znakowy),
OCI_B_CLOB (znakowy LOB), OCI_B_BLOB (binarny LOB) i OCI_B_ROWID (ROWID).
int OCIBindByName (int stmt, string ph_name, mixed &variable, int length [, int type])
Przykad: OCIDefineByName
<?php
/* przykad uzycia OCIBindByPos, thies@thieso.net (980221)
wstawia trzy rekordy do emp, i uywa ROWID do zmiany rekordw
zaraz p ich wstawieniu
*/
$conn = OCILogon("scott","tiger");
$stmt = OCIParse($conn,"insert into emp (empno, ename) ".
"values (:empno,:ename) ".
"returning ROWID into :rid");
$data = array(1111 => "Larry", 2222 => "Bill", 3333 => "Jim");
$rowid = OCINewDescriptor($conn,OCI_D_ROWID);
OCIBindByName($stmt,":empno",&$empno,32);
OCIBindByName($stmt,":ename",&$ename,32);
OCIBindByName($stmt,":rid",&$rowid,-1,OCI_B_ROWID);
$update = OCIParse($conn,"update emp set sal = :sal where ROWID = :rid");
OCIBindByName($update,":rid",&$rowid,-1,OCI_B_ROWID);
OCIBindByName($update,":sal",&$sal,32);
$sal = 10000;
while (list($empno,$ename) = each($data)) {
OCIExecute($stmt);
OCIExecute($update);
}
$rowid->free();
OCIFreeStatement($update);
OCIFreeStatement($stmt);
$stmt = OCIParse($conn,"select * from emp where empno in (1111,2222,3333)");
OCIExecute($stmt);
while (OCIFetchInto($stmt,&$arr,OCI_ASSOC)) {
PHP Kompendium wiedzy
331

var_dump($arr);
}
OCIFreeStatement($stmt);
/* usunicie naszych "mieci" t tabeli emp.... */
$stmt = OCIParse($conn,"delete from emp where empno in (1111,2222,3333)");
OCIExecute($stmt);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Jednoczesne uycie magic-quotes i OciBindByName() jest bardzo niedobrym pomysem, poniewa nie jest
potrzebne dodawanie apostrofw na zmiennych. Wszystkie apostrofu i cudzysowy dodane w sposb
automatyczny zostan zapisane w bazie, poniewa funkcja OciBindByName() nie potrafi odrni apostrofw
dodanych automatycznie od tych dodanych z rozmysem.
OCIColumnIsNULL
Zwraca True, jeeli kolumna $column znajdujca si w wyniku z wyraenia $stmt ma warto NULL. Mona
uy numerw kolumn (numerowane od 1) lub nazw. Patrz rwnie: OCINumCols(), OCIColumnType() i
OCIColumnSize().
int OCIColumnIsNULL (int stmt, mixed column)
OCIColumnName
Zwraca nazw kolumny odpowiadajc przekazanemu numerowi kolumny (numerowane od 1).
string OCIColumnName (int stmt, int col)
Przykad: OCIColumnName()
<?php
print "<HTML><PRE>\n";
$conn = OCILogon("scott", "tiger");
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt);
print "<TABLE BORDER=\"1\">";
print "<TR>";
print "<TH>Nazwa</TH>";
print "<TH>Typ</TH>";
print "<TH>Dugo</TH>";
print "</TR>";
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
$column_type = OCIColumnType($stmt,$i);
$column_size = OCIColumnSize($stmt,$i);
print "<TR>";
print "<TD>$column_name</TD>";
print "<TD>$column_type</TD>";
print "<TD>$column_size</TD>";
print "</TR>";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
print "</PRE>";
print "</HTML>\n";
?>
OCIColumnSize
Zwraca rozmiar kolumny Oracle. Do parametru $col mona uy numeru kolumny (numerowane od 1)
lub nazwy kolumny. Patrz rwnie: OCINumCols(), OCIColumnName() i OCIColumnSize().
int OCIColumnSize (int stmt, mixed column)
Przykad OCIColumnSize()
<?php
print "<HTML><PRE>\n";
$conn = OCILogon("scott", "tiger");
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt);
print "<TABLE BORDER=\"1\">";
print "<TR>";
print "<TH>Nazwa</TH>";
print "<TH>Typ</TH>";
Dodatek A - Funkcje
332
print "<TH>Dugo</TH>";

print "</TR>";
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
$column_type = OCIColumnType($stmt,$i);
$column_size = OCIColumnSize($stmt,$i);
print "<TR>";
print "<TD>$column_name</TD>";
print "<TD>$column_type</TD>";
print "<TD>$column_size</TD>";
print "</TR>";
}
print "</TABLE>";
OCIFreeStatement($stmt);
OCILogoff($conn);
print "</PRE>";
print "</HTML>\n";
?>
OCIColumnType
Zwraca typ danych kolumny o podanym numerze Patrz rwnie: OCINumCols(), OCIColumnName() i
OCIColumnSize().
mixed OCIColumnType (int stmt, int col)
Przykad: OCIColumnType()
<?php
print "<HTML><PRE>\n";
$conn = OCILogon("scott", "tiger");
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt);
print "<TABLE BORDER=\"1\">";
print "<TR>";
print "<TH>Nazwa</TH>";
print "<TH>Typ</TH>";
print "<TH>Dugo</TH>";
print "</TR>";
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
$column_type = OCIColumnType($stmt,$i);
$column_size = OCIColumnSize($stmt,$i);
print "<TR>";
print "<TD>$column_name</TD>";
print "<TD>$column_type</TD>";
print "<TD>$column_size</TD>";
print "</TR>";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
print "</PRE>";
print "</HTML>\n";
?>
OCICommit
Zatwierdza wszystkie zalege zapytania dla poczenia do Oracle $connection.
int OCICommit( int connection )
OCIDefineByName
Powoduje przesanie zawartoci kolumn SQL do zmiennych PHP. Naley pamita, e Oracle zapisuje
nazwy kolumn zawsze wielkimi literami a wyraenia SELECT najczciej piszemy maymi literami. Funkcja
OCIDefineByName() oczekuje, e $column-name bdzie zapisana wielkimi literami. Jeeli zdefiniujesz zmienna nie
istniejc w wyraeniu SELECT, nie zostanie wygenerowany aden bd. Jeeli musisz zdefiniowa abstrakcyjny
typ danych (LOB, ROWID, BFILE) musisz najpierw uy funkcji OCINewDescriptor(). Patrz rwnie:
OCIBindByName().
int OCIDefineByName (int stmt, string Column-Name, mixed variable [, int type])
Przykad: OCIDefineByName()
<?php
/* przykad uycia OCIDefineByPos, thies@thieso.net (980219) */
PHP Kompendium wiedzy
333

$conn = OCILogon("scott","tiger");
$stmt = OCIParse($conn,"select empno, ename from emp");
/* ta definicja MUSI znajdowa si przed ociexecute! */
OCIDefineByName($stmt,"EMPNO",$empno);
OCIDefineByName($stmt,"ENAME",$ename);
OCIExecute($stmt);
while (OCIFetch($stmt)) {
echo "empno:".$empno."\n";
echo "ename:".$ename."\n";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
OCIError
Zwraca ostatni napotkany bd. Jeeli nie podany zostanie parametr opcjonalny $stmt|conn|global,
zwracany jest ostatni bd, Jeeli nie napotkano bdu, OCIEror() zwraca False. Funkcja zwraca bd w tablicy
asocjacyjnej. W tablicy $code zawiera numer bdu Oracle, natomiast $message, komunikat bdu.
array OCIError ([int stmt|conn|global])
OCIExecute
Wykonuje zanalizowane wyraenie (OCIParse()). Opcjonalny parametr $mode pozwala okreli tryb
wykonania (domylnie jest to OCI_COMMIT_ON_SUCCESS). Jeeli nie chcesz aby wyraenia byy automatycznie
zatwierdzane, naley zastosowa tryb OCI_DEFAULT.
int OCIExecute (int statement [, int mode])
OCIFetch
Pobiera kolejny wiersz (dla wyrae SELECT) do wewntrznego bufora wyniku.
int OCIFetch (int statement)
OCIFetchInto
Pobiera kolejny wiersz (dla wyrae SELECT) do tabeli $result. Funkcja OCIFetchInto() nadpisuje
poprzedni zawarto tablicy $result. Domylnie $result zawiera tablic (numerowan od 1) wszystkich kolumn
majcych wartoci inne ni NULL. Parametr $mode pozwala zmieni domylny tryb pracy. Mona poda wicej ni
jeden znacznik dodajc wartoci, na przykad: OCI_ASSOC+OCIRETURN_NULLS.
int OCIFetchInto (int stmt, array &result [, int mode])
Moliwymi wartociami znacznika s:
OCI_ASSOC zwraca tablic asocjacyjn
OCI_NUM zwraca tablic o indeksach numerycznych rozpoczynajcych si od 1 (domylnie)
OCI_RETURN_NULLS zwraca puste kolumny
OCI_RETURN_LOBS zwraca wartoci LOB zamiast deskryptorw
OCIFetchStatement
Pobiera wszystkie wiersze wyniku do tablicy zdefiniowanej przez uytkownika. Funkcja
OCIFetchStatement() zwraca ilo pobranych wierszy.
int OCIFetchStatement (int stmt, array &variable)
Przykad: OCIFetchStatement()
<?php
/* przykad OCIFetchStatement, mbritton@verinet.com (990624) */
$conn = OCILogon("scott","tiger");
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt);
$nrows = OCIFetchStatement($stmt,$results);
if ( $nrows > 0 ) {
print "<TABLE BORDER=\"1\">\n";
print "<TR>\n";
while ( list( $key, $val ) = each( $results ) ) {
Dodatek A - Funkcje
334

print "<TH>$key</TH>\n";
}
print "</TR>\n";
for ( $i = 0; $i < $nrows; $i++ ) {
reset($results);
print "<TR>\n";
while ( $column = each($results) ) {
$data = $column['value'];
print "<TD>$data[$i]</TD>\n";
}
print "</TR>\n";
}
print "</TABLE>\n";
} else {
echo "Brak danych<BR>\n";
}
print "Wybano $nrows rekordw<BR>\n";

OCIFreeStatement($stmt);
OCILogoff($conn);
?>
OCIFreeCursor
Zwraca True, jeeli funkcja si udaa lub False, jeeli si nie udaa.
int OCIFreeCursor (int stmt)
OCIFreeDesc
Zwraca True, jeeli funkcja si udaa lub False, jeeli si nie udaa.
int OCIFreeDesc (object lob)
OCIFreeStatement
Zwraca True, jeeli funkcja si udaa lub False, jeeli si nie udaa.
int OCIFreeStatement (int stmt)
OCIInternalDebug
Wcza wyjcie wewntrznego debugera. Naley ustawi parametr $onoff na 0 aby wyczy wyjcie
debugera, 1 aby je wczy.
void OCIInternalDebug (int onoff)
OCILogOff
Zamyka poczenie do Oracle.
int OCILogOff (int connection)
OCILogon
Zwraca identyfikator poczenia niezbdny we wikszoci funkcji OCI. Opcjonalny trzeci parametr moe
zawiera nazw lokalnej instancji Oracle, do ktrej funkcja ma si przyczy lub nazw wpisu w pliku
tnsnames.ora. Jeeli nie zostanie podany trzeci parametr, PHP uywa zmiennej rodowiskowej ORACLE_SID
(instancja Oracle) lub TWO_TASK (tnsnames.ora) do okrelenia bazy danych do ktrej ma si przyczy. Uywajc
funkcji OCILogon() poczenia s wspdzielone na poziomie strony. Oznacza to, e operacje CONNECT i ROLLBACK
dziaaj dla wszystkich otwartych transakcji nawet, jeeli skrypt tworzy wiele pocze. Poniszy przykad
pokazuje sposb wspdzielenia pocze.
int OCILogon (string username, string password [, string db])
Przykad: OCILogon()
<?php
print "<HTML><PRE>";
$db = "";
$c1 = ocilogon("scott","tiger",$db);
PHP Kompendium wiedzy
335
$c2 = ocilogon("scott","tiger",$db);

function create_table($conn)
{ $stmt = ociparse($conn,"create table scott.hallo (test varchar2(64))");
ociexecute($stmt);
echo $conn." tabela utworzona\n\n";
}
function drop_table($conn)
{ $stmt = ociparse($conn,"drop table scott.hallo");
ociexecute($stmt);
echo $conn." tabela usunita\n\n";
}
function insert_data($conn)
{ $stmt = ociparse($conn,"insert into scott.hallo
values('$conn' || ' ' || to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." wstawione dane przykadowe\n\n";
}
function delete_data($conn)
{ $stmt = ociparse($conn,"delete from scott.hallo");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." usunite dane przykadowe\n\n";
}
function commit($conn)
{ ocicommit($conn);
echo $conn." zatwierdzone\n\n";
}
function rollback($conn)
{ ocirollback($conn);
echo $conn." wycofane\n\n";
}
function select_data($conn)
{ $stmt = ociparse($conn,"select * from scott.hallo");
ociexecute($stmt,OCI_DEFAULT);
echo $conn."----wybieranie\n\n";
while (ocifetch($stmt))
echo $conn." <".ociresult($stmt,"TEST").">\n\n";
echo $conn."----gotowe\n\n";
}
create_table($c1);
insert_data($c1); // Wstawienie wiersza za pomoc c1
insert_data($c2); // Wstawienie wiersza za pomoc c2
select_data($c1); // Zwracamy wynik obu wyrae INSERT
select_data($c2);
rollback($c1); // wycofanie przy uzyciu c1
select_data($c1); // Oba inserty ostay wycofane
select_data($c2);
insert_data($c2); // Wstawienie wiersza za pomoc c2
commit($c2); // zatwierdzanie za pmoc c2
select_data($c1); // zwrcony jest wynik inserta na c2
delete_data($c1); // usunicie wszystkich wierszy w tabeli za pomoc c1
select_data($c1); // brak wierszy
select_data($c2); // brak wierszy
commit($c1); // zatwierdzenie na c1
select_data($c1); // brak wierszy
select_data($c2); // brak wierszy
drop_table($c1);
print "</PRE></HTML>";
?>
Patrz rwnie: OCIPLogon() i OCINLogon().
OCINewCursor
Przydziela nowy uchwyt wyraenia do podanego poczenia.
int OCINewCursor (int conn)
Przykad: Uycie kursora REF z procedury przechowywanej
<?php
// zakadamy, e procedura przechowywana info.output zwraca kursor ref w :data
$conn = OCILogon("scott","tiger");
$curs = OCINewCursor($conn);
$stmt = OCIParse($conn,"begin info.output(:data); end;");
ocibindbyname($stmt,"data",&$curs,-1,OCI_B_CURSOR);
ociexecute($stmt);
ociexecute($curs);
while (OCIFetchInto($curs,&$data)) {
var_dump($data);
}
OCIFreeStatement($stmt);
OCIFreeCursor($curs);
OCILogoff($conn);
Dodatek A - Funkcje
336

?>
Przykad: Uycie kursora REF z wyraenia SELECT
<?php
print "<HTML><BODY>";
$conn = OCILogon("scott","tiger");
$count_cursor = "CURSOR(select count(empno) num_emps from emp " .
"where emp.deptno = dept.deptno) as EMPCNT from dept";
$stmt = OCIParse($conn,"select deptno,dname,$count_cursor");
ociexecute($stmt);
print "<TABLE BORDER=\"1\">";
print "<TR>";
print "<TH>NAZWA WYDZIAU</TH>";
print "<TH>NR #</TH>";
print "<TH># PRACOWNIKW</TH>";
print "</TR>";
while (OCIFetchInto($stmt,&$data,OCI_ASSOC)) {
print "<TR>";
$dname = $data["DNAME"];
$deptno = $data["DEPTNO"];
print "<TD>$dname</TD>";
print "<TD>$deptno</TD>";
ociexecute($data[ "EMPCNT" ]);
while (OCIFetchInto($data[ "EMPCNT" ],&$subdata,OCI_ASSOC)) {
$num_emps = $subdata["NUM_EMPS"];
print "<TD>$num_emps</TD>";
}
print "</TR>";
}
print "</TABLE>";
print "</BODY></HTML>";
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
OCINewDescriptor
Przydziela pami do przechowywania deskryptorw lub lokalizatorw LOB. Prawidowymi wartociami
$type s: OCI_D_FILE, OCI_D_LOB i OCI_D_ROWID. Dla deskryptorw LOB z deskryptorami zwizane s metody
load, save i savefile. Dla BFILE istnieje tylko metoda load. Przyjrzyj si uwagom z komentarzy w drugim
przykadzie.
string OCINewDescriptor (int connection [, int type])
Przykad: OCINewDescriptor()
<?php
/* Skrypt ten jest zaprojektowany do wywoywania z formularza HTML.
* Wymaga przekazania zmiennych$user, $password, $table, $where i
* $commitsize z formularza. Skrypt usuwa wybrae wiersze
* korzystajc z ROWID i zatwierdza operacje po
* $commitsize wierszy. (uywa rozwanie, brak moliwoci wycofania)
*/
$conn = OCILogon($user, $password);
$stmt = OCIParse($conn,"select rowid from $table $where");
$rowid = OCINewDescriptor($conn,OCI_D_ROWID);
OCIDefineByName($stmt,"ROWID",&$rowid);
OCIExecute($stmt);
while ( OCIFetch($stmt) ) {
$nrows = OCIRowCount($stmt);
$delete = OCIParse($conn,"delete from $table where ROWID = :rid");
OCIBindByName($delete,":rid",&$rowid,-1,OCI_B_ROWID);
OCIExecute($delete);
print "$nrows\n";
if ( ($nrows % $commitsize) == 0 ) {
OCICommit($conn);
}
}
$nrows = OCIRowCount($stmt);
print "usunito $nrows .\n";
OCIFreeStatement($stmt);
OCILogoff($conn);
?>


<?php
/* Skrypt pokazuje sposb adowania plikw do kolumn LOB
* Formularz uywany w tym przykadzie jes nastpujcy
* <form action="upload.php3" method="post" enctype="multipart/form-data">
* <input type="file" name="lob_upload">
PHP Kompendium wiedzy
337

* ...
*/
if(!isset($lob_upload) || $lob_upload == 'none'){
?>
<form action="upload.php3" method="post" enctype="multipart/form-data">
Przelij plik: <input type="file" name="lob_upload"><br>
<input type="submit" value="Wyij"> - <input type="reset">
</form>
<?php
} else {
// $lob_upload zawieera nazw pliku tymczasowego przesanego pliku
$conn = OCILogon($user, $password);
$lob = OCINewDescriptor($conn, OCI_D_LOB);
$stmt = OCIParse($conn,"insert into $table (id, the_blob)
values(my_seq.NEXTVAL, EMPTY_BLOB()) returning the_blob into :the_blob");
OCIBindByName($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt, OCI_DEFAULT);
if($lob->savefile($lob_upload)){
OCICommit($conn);
echo "Udane przesanie BLOB-a \n";
}else{
echo "Nieudane przesanie BLOB-a \n";
}
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
}
?>
OCINLogon
Zwraca identyfikator nowego poczenia do bazy Oracle 8 i loguje si do bazy. Opcjonalny trzeci parametr
moe zawiera nazw lokalnej instancji Oracle, do ktrej funkcja ma si przyczy lub nazw wpisu w pliku
tnsnames.ora. Jeeli nie zostanie podany trzeci parametr, PHP uywa zmiennej rodowiskowej ORACLE_SID
(instancja Oracle) lub TWO_TASK (tnsnames.ora) do okrelenia bazy danych do ktrej ma si przyczy. Funkcja
OCINLogon() wymusza powstanie nowego poczenia. Powinno by to uywane jedynie wtedy, gdy musisz
odizolowa transakcje. Domylnie poczenia s wspdzielone na poziomie strony, jeeli uywa si funkcji
OCILogon() lub na poziomie serwera WWW, jeeli uywa si funkcji OCIPLogon(). Jeeli posiadasz kilka pocze
otwartych za pomoc OCINLogon() wszystkie operacje CONNECT i ROLLBACK dziaaj tylko dla podanego poczenia.
Poniszy przykad pokazuje sposb separowania pocze. Patrz rwnie: OCILogon() i OCIPLogon().
int OCINLogon (string username, string password [, string db])
Przykad: OCINLogon()
<?php
print "<HTML><PRE>";
$db = "";

$c1 = ocilogon("scott","tiger",$db);
$c2 = ocinlogon("scott","tiger",$db);

function create_table($conn)
{ $stmt = ociparse($conn,"create table scott.hallo (test varchar2(64))");
ociexecute($stmt);
echo $conn." tabela utworzona\n\n";
}
function drop_table($conn)
{ $stmt = ociparse($conn,"drop table scott.hallo");
ociexecute($stmt);
echo $conn." tabela usunita\n\n";
}
function insert_data($conn)
{ $stmt = ociparse($conn,"insert into scott.hallo
values('$conn' || ' ' || to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." wstawione dane przykadowe\n\n";
}
function delete_data($conn)
{ $stmt = ociparse($conn,"delete from scott.hallo");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." usunite dane przykadowe\n\n";
}
function commit($conn)
{ ocicommit($conn);
echo $conn." zatwierdzone\n\n";
}
Dodatek A - Funkcje
338

function rollback($conn)
{ ocirollback($conn);
echo $conn." wycofane\n\n";
}
function select_data($conn)
{ $stmt = ociparse($conn,"select * from scott.hallo");
ociexecute($stmt,OCI_DEFAULT);
echo $conn."----wybieranie\n\n";
while (ocifetch($stmt))
echo $conn." <".ociresult($stmt,"TEST").">\n\n";
echo $conn."----gotowe\n\n";
}
create_table($c1);
insert_data($c1);
select_data($c1);
select_data($c2);
rollback($c1);
select_data($c1);
select_data($c2);
insert_data($c2);
commit($c2);
select_data($c1);
delete_data($c1);
select_data($c1);
select_data($c2);
commit($c1);
select_data($c1);
select_data($c2);
drop_table($c1);
print "</PRE></HTML>";
?>
OCINumCols
Zwraca ilo kolumn w wyraeniu.
int OCINumCols (int stmt)
Przykad: OCINumCols()
<?php
print "<HTML><PRE>\n";
$conn = OCILogon("scott", "tiger");
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt);
while ( OCIFetch($stmt) ) {
print "\n";
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
$column_value = OCIResult($stmt,$i);
print $column_name . ': ' . $column_value . "\n";
}
print "\n";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
print "</PRE>";
print "</HTML>\n";
?>
OCIParse
Analizuje zapytanie $query korzystajc z poczenia $conn. Zwraca identyfikator wyraenia, jeeli
zapytanie jest prawidowe lub False, jeeli nie jest. Parametr $query moe zawiera dowolne prawidowe
zapytanie SQL.
int OCIParse (int conn, string query)
OCIPLogon
Zwraca identyfikator trwaego poczenia do serwera Oracle 8 i loguje si do bazy. Opcjonalny trzeci
parametr moe zawiera nazw lokalnej instancji Oracle, do ktrej funkcja ma si przyczy lub nazw wpisu w
pliku tnsnames.ora. Jeeli nie zostanie podany trzeci parametr, PHP uywa zmiennej rodowiskowej ORACLE_SID
PHP Kompendium wiedzy
339

(instancja Oracle) lub TWO_TASK (tnsnames.ora) do okrelenia bazy danych do ktrej ma si przyczy. Patrz
rwnie: OCILogon() i OCINLogon().
int OCIPLogon (string username, string password [, string db])
OCIResult
Zwraca dane z kolumny $column w biecym wierszu (patrz OCIFetch()). Funkcja OCIesult() zwraca
wszystko poza typami abstrakcyjnymi (ROWID, LOB, FILE) w postaci cigw.
mixed OCIResult (int statement, mixed column)
OCIRollback
Wycofuje zmiany wykonane poprzez poczenie $connection.
int OCIRollback (int connection)
OCIRowCount
Zwraca ilo wierszy zmienionych przez wyraenie SQL. Funkcja nie zwraca iloci wierszy zwracanych
przez wyraenie SELECT.
int OCIRowCount (int statement)
Przykad: OCIRowCount()
<?php
print "<HTML><PRE>";
$conn = OCILogon("scott","tiger");
$stmt = OCIParse($conn,"create table emp2 as select * from emp");
OCIExecute($stmt);
print " wstawiono ".OCIRowCount($stmt) . " wierszy.<BR>";
OCIFreeStatement($stmt);
$stmt = OCIParse($conn,"delete from emp2");
OCIExecute($stmt);
print"usunito ". OCIRowCount($stmt) . " wierszy.<BR>";
OCICommit($conn);
OCIFreeStatement($stmt);
$stmt = OCIParse($conn,"drop table emp2");
OCIExecute($stmt);
OCIFreeStatement($stmt);
OCILogOff($conn);
print "</PRE></HTML>";
?>
OCIServerVersion
string OCIServerVersion (int conn)
Przykad: OCIServerVersion()
<?php
$conn = OCILogon("scott","tiger");
print "Wersja serwera: " . OCIServerVersion($conn);
OCILogOff($conn);
?>
OCIStatementType
string OCIStatementType (int stmt)
Funkcja OCIStatementType() zwraca jedn z nastpujcych wartoci:
SELECT UPDATE DELETE
INSERT CREATE DROP
ALTER BEGIN DECLARE
UNKNOWN
Przykad:
<?php
print "<HTML><PRE>";
$conn = OCILogon("scott","tiger");
$sql = "delete from emp where deptno = 10";
$stmt = OCIParse($conn,$sql);
if ( OCIStatementType($stmt) == "DELETE" ) {
die "Nie moesz usuwa z tej tabeli<BR>";
Dodatek A - Funkcje
340

}
OCILogoff($conn);
print "</PRE></HTML>";
?>
octdec
Zwraca dziesitny odpowiednik liczby semkowej reprezentowanej przez argument $octal_string.
Funkcja octdec() konwertuje cig semkowy na liczb dziesitna. Najwiksz liczb moliw do
skonwertowania jest 17777777777 lub dziesitnie 2147483647. Patrz rwnie: decoct().
int octdec( string octal_string )

odbc_autocommit
Funkcja wywoana bez parametru $onoff zwraca stan mechanizmu automatycznego zatwierdzania dla
poczenia $connection_id. Jeeli automatyczne zatwierdzanie jest wczone, zwraca True natomiast False, jeeli
jest wyczone lub wystpi bd. Jeeli parametr $onoff ma warto True, automatyczne zatwierdzanie jest
wczane, jeeli ma warto False wyczane. Zwraca True w przypadku sukcesu i False w przypadku bdu.
Domylnie automatyczne zatwierdzanie jest wczone dla poczenia. Wyczenie automatycznego zatwierdzania
jest ekwiwalentem rozpoczcia transakcji. Patrz rwnie: odbc_commit() i odbc_rollback().
int odbc_autocommit (int connection_id [, int OnOff])
odbc_binmode
int odbc_binmode (int result_id, int mode)
(Funkcja ma wpyw na typy SQL ODBC: BINARY, VARBINARY i LONGVARBINARY)
ODBC_BINMODE_PASSTHRU Dane BINARY s przekazywane dalej.
ODBC_BINMODE_RETURN Zwraca w takiej postaci jak otrzyma
ODBC_BINMODE_CONVERT Konwertuje znaki i koce linii.
Gdy dane binarne SQL s konwertowane do danych znakowych C, kady bajt (8 bitw) rda jest
reprezentowany jako dwa znaki ASCII. Znaki te s znakami ASCII reprezentujcymi liczb w postaci
szesnastkowej. Na przykad, liczba binarna 00000001 jest konwertowana na "01" natomiast 11111111 na "FF".
Obsuga typu LONGVARBINARY
Tryb binarny
longreadlen
Wynik
ODBC_BINMODE_PASSTHRU 0
przelotka
ODBC_BINMODE_RETURN 0
przelotka
ODBC_BINMODE_CONVERT 0
przelotka
ODBC_BINMODE_PASSTHRU 0
przelotka
ODBC_BINMODE_PASSTHRU >0
przelotka
ODBC_BINMODE_RETURN >0
zwraca w niezmienionej
postaci
ODBC_BINMODE_CONVERT >0
zwraca jako cig znakw
Jeeli zostanie uyta funkcja odbc_fetch_into(), przelotka oznacza, e dla tych kolumn zwracany jest
pusty cig. Jeeli $result_id jest rwny 0, ustawienia te s wartociami domylnymi dla nowych wynikw.
Uwaga
Wartoci domyln dla longreadlen jest 4096 a tryb binarny ODBC_BINMODE_RETURN. Obsuga kolumn binarnych jest rwnie
realizowana przez odbc_longreadlen().
odbc_close
Zamyka poczenie do serwera bazy danych skojarzonego z podanym identyfikatorem cza.
Uwaga
PHP Kompendium wiedzy
341

Funkcja ta si nie uda, jeeli na tym poczeniu s otwarte transakcje. W takim przypadku poczenie pozostanie otwarte.
void odbc_close (int connection_id)
odbc_close_all
Zamyka wszystkie poczenia do serwera bazy danych.
Uwaga
Funkcja ta si nie uda, jeeli na tym poczeniu s otwarte transakcje. W takim przypadku poczenie pozostanie otwarte.
void odbc_close_all (void)
odbc_columnprivileges
Zwraca list kolumn i uprawnie do nich dla podanej tablicy. Zwraca identyfikator wyniku ODBC lub
False w przypadku wystpienia bdu.
int odbc_columnprivileges (int connection_id [, string qualifier [, string owner
[, string table_name [, string column_name]]]])
Wynik zawiera nastpujce kolumny:
TABLE_QUALIFIER
TABLE_OWNER
TABLE_NAME
GRANTOR
GRANTEE
PRIVILEGE
IS_GRANTABLE
Wynik jest uporzdkowany wedug TABLE_QUALIFIER, TABLE_OWNER i TABLE_NAME. Argument $column_name
pozwala na stosowanie wzorcw przeszukiwania (% zastpuje zero lub wicej znakw i _ zastpuje jeden znak).
odbc_columns
Tworzy list kolumn w okrelonym zakresie. Zwraca identyfikator wyniku ODBC lub False w przypadku
wystpienia bdu.
int odbc_columns (int connection_id [, string qualifier [, string owner
[, string table_name [, string column_name]]]])
Wynik skada si z nastpujcych kolumn:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME
COLUMN_NAME DATA_TYPE TYPE_NAME
PRECISION LENGTH SCALE
RADIX NULLABLE REMARKS
Wynik jest uporzdkowany wedug TABLE_QUALIFIER, TABLE_OWNER i TABLE_NAME. Argument $column_name,
$table_name i $column_name pozwalaj na stosowanie wzorcw przeszukiwania (% zastpuje zero lub wicej
znakw i _ zastpuje jeden znak). Patrz rwnie: odbc_columnprivileges().
odbc_commit
Zwraca True w przypadku sukcesu lub False w przypadku bdu. Wszystkie transakcje rozpoczte poprzez
$connection_id s zatwierdzane.
int odbc_commit (int connection_id)
odbc_connect
Zwraca identyfikator poczenia ODBC lub 0 (False) w przypadku bdu. Identyfikator poczenia
zwracany przez t funkcj jest wymagany przez inne funkcje ODBC. Moesz mie jednoczenie wiele pocze.
Opcjonalny czwarty parametr okrela typ kursora, jaki jest uywany na tym poczeniu. Parametr ten nie jest
Dodatek A - Funkcje
342

zwykle wymagany, ale moe by uyteczny przy obchodzeniu problemw ze sterownikami ODBC. W przypadku
niektrych sterownikw ODBC, wykonywanie skomplikowanych procedur przechowywanych mog powodowa
bd Cannot open a cursor on a stored procedure that anything other than a single select statement in it. Uycie
SQL_CUR_USE_ODBC moe pomc unikn bdu. Niektre sterowniki nie obsuguj opcjonalnego parametru
$row_number w odbc_fetch_row(). Parametr SQL_CUR_USE_ODBC moe rwnie pomc w tym przypadku.
int odbc_connect (string dsn, string user, string password [, int cursor_type])
Dla parametru $cursor_type zdefiniowane s nastpujce stae:
SQL_CUR_USE_IF_NEEDED
SQL_CUR_USE_ODBC
SQL_CUR_USE_DRIVER
SQL_CUR_DEFAULT
Dla poczy trwaych patrz odbc_pconnect().
odbc_cursor
Zwraca nazw kursora dla podanego $result_id.
string odbc_cursor (int result_id)
odbc_do
Uruchamia zapytanie na podanym poczeniu.
int odbc_do (int conn_id, string query)
odbc_exec
Zwraca False w przypadku wystpienia bdu. Zwraca identyfikator wyniku ODBC, jeeli udao si
poprawnie wykona wyraenie SQL. Funkcja odbc_exec() wysya wyraenie SQL do serwera bazy danych
wskazywanego przez $connection_id. Parametr ten musi by prawidowym identyfikatorem zwracanym przez
odbc_connect() lub odbc_pconnect(). Patrz rwnie: odbc_prepare() i odbc_execute() dla wielokrotnego
wykonania wyraenia SQL.
int odbc_exec (int connection_id, string query_string)
odbc_execute
Wykonuje zapytanie przygotowanie za pomoc odbc_prepare(). Zwraca True w przypadku udanego
wykonania, False w przeciwnym przypadku. Tablica $parameters_array jest potrzebna, jeeli w wyraeniu SQL
wystpuj parametry.
int odbc_execute (int result_id [, array parameters_array])
odbc_fetch_into
Zwraca ilo kolumn w wyniku lub False w przypadku wystpienia bdu. Tablica $result_array musi
by przekazana przez referencj, ale moe by to dowolny typ, poniewa zostanie skonwertowany na typ
tablicowy. Tablica zawiera wartoci kolumn pod indeksami rozpoczynajcymi si od 0.
int odbc_fetch_into (int result_id [, int rownumber, array result_array])
odbc_fetch_row
Jeeli funkcja si powiedzie (by wiersz wyniku) zwracana jest warto True. Jeeli nie ma ju wierszy,
zwracana jest warto False. Funkcja pobiera wiersz danych zwrconych przez funkcj odbc_do() lub
odbc_exec(). Po wywoaniu odbc_fetch_row() pola z wyniku s dostpne dla funkcji odbc_result(). Jeeli nie
zostanie podany parametr $row_number, funkcja prbuje pobra kolejny wiersz wyniku. Wywoania funkcji
odbc_fetch_row() z parametrem $row_number i bez niego mog by mieszane. Aby wicej ni raz odczyta wyniki
zapytania, naley wywoa odbc_fetch_row() z $row_number rwnym 1 i kontynuowa pobieranie danych za
PHP Kompendium wiedzy
343

pomoc odbc_fetch_row() bez parametru $row_number. Jeeli sterownik nie obsuguje odczytywania wiersza o
podanym numerze, parametr ten jest ignorowany.
int odbc_fetch_row (int result_id [, int row_number])
odbc_field_len
Zwraca dugo pola wskazywanego przy pomocy numeru w wyniku ODBC o podanym identyfikatorze.
Numerowanie pl rozpoczyna si od 1. Patrz rwnie: odbc_field_scale().
int odbc_field_len (int result_id, int field_number)
odbc_field_name
Zwraca nazw pola wskazywanego przy pomocy numeru w wyniku ODBC o podanym identyfikatorze.
Numerowanie pl rozpoczyna si od 1. W przypadku wystpienia bdu zwraca False.
string odbc_field_name (int result_id, int field_number)
odbc_field_num
Zwraca numer kolumny o podanej nazwie w wyniku ODBC o podanym identyfikatorze. Numerowanie pl
rozpoczyna si od 1. W przypadku wystpienia bdu zwraca False.
int odbc_field_num (int result_id, string field_name)
odbc_field_precision
Zwraca dokadno kolumny o podanym numerze w wyniku ODBC o podanym identyfikatorze. Patrz
rwnie: odbc_field_scale().
string odbc_field_precision (int result_id, int field_number)
odbc_field_scale
Zwraca skal kolumny o podanym numerze w wyniku ODBC o podanym identyfikatorze.
string odbc_field_scale (int result_id, int field_number)
odbc_field_type
Zwraca typ SQL pola wskazywanego przy pomocy numeru w wyniku ODBC o podanym identyfikatorze.
Numerowanie pl rozpoczyna si od 1.
string odbc_field_type (int result_id, int field_number)
odbc_foreignkeys
Odczytuje dane na temat kluczy obcych. Zwraca identyfikator wyniku ODBC lub False w przypadku
bdu.
int odbc_foreignkeys (int connection_id, string pk_qualifier, string pk_owner,
string pk_table, string fk_qualifier, string fk_owner, string fk_table)
Wynik skada si z nastpujcych kolumn:
PKTABLE_QUALIFIER PKTABLE_OWNER PKTABLE_NAME
PKCOLUMN_NAME FKTABLE_QUALIFIER FKTABLE_OWNER
FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
UPDATE_RULE DELETE_RULE FK_NAME
PK_NAME
Jeeli parametr $pk_table zawiera nazw tabeli, odbc_foreignkeys() zwraca w wynik zawierajcy klucz
gwny i wszystkie klucze obce odwoujce si do tej tabeli. Jeeli $fk_table zawiera nazw tabeli,
odbc_foreignkeys() zwraca wynik zawierajcy wszystkie klucze obce w podanej tabeli oraz klucze gwne, do
ktrych si odwouj. Jeeli zarwno $pk_table jak i $fk_table zawieraj nazwy tabel, odbc_foreignkeys()
zwraca klucze obce z tabeli okrelonej przez $fk_table odwoujce si do klucza gwnego z tabeli $pk_table. W
wikszoci przypadkw bdzie to tylko jeden klucz.
Dodatek A - Funkcje
344

odbc_free_result
Zawsze zwraca True. Wywoanie tej funkcji jest wymagane jedynie wtedy, gdy skrypt zuywa zbyt duo
pamici podczas pracy. Caa pami przydzielona do wyniku jest automatycznie zwalniana po zakoczeniu
dziaania skryptu. Jeeli jeste pewien, e nie bdziesz ju uywa danych z wyniku, moesz wywoa funkcj
odbc_free_result(), aby zwolni pami przydzielon do $result_id.
Uwaga
Jeeli automatyczne zatwierdzanie jest zablokowane, (patrz odbc_autocommit()) i wywoasz odbc_free_result() przed
zatwierdzeniem, wszystkie otwarte transakcje zostan wycofane.
int odbc_free_result (int result_id)
odbc_gettypeinfo
Pobiera dane na temat typw danych obsugiwanych przez rdo danych. Zwraca identyfikator wyniku
ODBC lub False w przypadku wystpienia bdu. Mona uy opcjonalnego parametru $data_type do
ograniczenia danych do jednego typu.
int odbc_gettypeinfo (int connection_id [, int data_type])
Wynik skada si z nastpujcych kolumn:
TYPE_NAME DATA_TYPE PRECISION
LITERAL_PREFIX LITERAL_SUFFIX CREATE_PARAMS
NULLABLE CASE_SENSITIVE SEARCHABLE
UNSIGNED_ATTRIBUTE MONEY AUTO_INCREMENT
LOCAL_TYPE_NAME MINIMUM_SCALE MAXIMUM_SCALE
Wynik jest uporzdkowany wedug DATA_TYPE i TYPE_NAME.
odbc_longreadlen
(Funkcja ma wpyw na typ SQL ODBC LONG i LONGVARBINARY) Ilo bajtw zwracanych do PHP jest
okrelana przez warto parametru. Jeeli ma warto 0, dane z kolumn long s przepuszczane do klienta.
Uwaga
Obsuga kolumn LONGVARBINARY jest rwnie realizowana przez odbc_binmode().
int odbc_longreadlen (int result_id, int length)
odbc_num_fields
Zwraca ilo pl (kolumn) w wyniku ODBC. Funkcja zwraca -1 w przypadku wystpienia bdu.
Argumentem jest prawidowy identyfikator wyniku zwracany przez odbc_exec().
int odbc_num_fields (int result_id)
odbc_num_rows
Zwraca ilo wierszy w wyniku ODBC. W przypadku wystpienia bdu funkcja zwraca -1. Dla wyrae
INSERT, UPDATE i DELETE funkcja zwraca ilo zmienionych wierszy. Dla wyrae SELECT zwraca ilo zwracanych
wierszy.
Uwaga
Uycie funkcji odbc_num_rows() do sprawdzenia iloci wierszy dostpnych po wykonaniu wyraenia SELECT zwrci dla wielu
sterownikw -1.
int odbc_num_rows (int result_id)
PHP Kompendium wiedzy
345

odbc_pconnect
Zwraca identyfikator poczenia ODBC lub 0 (False) w przypadku wystpienia bdu. Funkcja jest
podobna do odbc_connect(), poza tym, e poczenie nie jest zamykane po zakoczeniu skryptu. Kolejne dania
poczenia z t sam kombinacj $dsn, $user i $password (poprzez odbc_connect() i odbc_pconnect()) powoduj
ponowne wykorzystanie poczenia trwaego.
Uwaga
Poczenia trwae nie dziaaj, jeeli PHP jest uyty jako program CGI. Opis opcjonalnego parametru $cursor_type znajduje si
przy opisie funkcji odbc_connect(). Wicej informacji na temat pocze trwaych znajduje si w PHP FAQ.
int odbc_pconnect (string dsn, string user, string password [, int cursor_type])
odbc_prepare
Zwraca False w przypadku bdu. Zwraca identyfikator wyniku ODBC dla poprawnie przygotowanego
wyraenia SQL. Wynikowy identyfikator moe by uyty do uruchomienia wyraenia za pomoc
odbc_execute().
int odbc_prepare (int connection_id, string query_string)
odbc_primarykeys
Zwraca nazwy kolumn skadajcych si na klucz gwny tabeli. Zwraca identyfikator wyniku ODBC lub
False w przypadku bdu.
int odbc_primarykeys (int connection_id, string qualifier, string owner, string table)
Wynik posiada nastpujce kolumny:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME
COLUMN_NAME KEY_SEQ PK_NAME
odbc_procedurecolumns
Zwraca list parametrw wejciowych i wyjciowych oraz kolumn bdcych wynikiem dziaania
procedury. zwraca identyfikator wyniku ODBC lub False w przypadku bdu.
int odbc_procedurecolumns (int connection_id [, string qualifier [, string owner
[, string proc [, string column]]]])
Wynik posiada nastpujce kolumny:
PROCEDURE_QUALIFIER PROCEDURE_OWNER PROCEDURE_NAME
COLUMN_NAME COLUMN_TYPE DATA_TYPE
TYPE_NAME PRECISION LENGTH
SCALE RADIX NULLABLE
REMARKS
Wynik jest posortowany wedug kolumn PROCEDURE_QUALIFIER, PROCEDURE_NAME i COLUMN_TYPE.
Argumenty $owner, $proc i $column mog zawiera wzorzec przeszukiwania (% zastpuje zero lub wicej
znakw i _ zastpuje jeden znak).
odbc_procedures
Tworzy list procedur w okrelonym zakresie. Zwraca identyfikator wyniku ODBC lub False w
przypadku bdu.
int odbc_procedures (int connection_id [, string qualifier [, string owner [, string name]]])
Wynik zawiera nastpujce kolumny:
PROCEDURE_QUALIFIER PROCEDURE_OWNER PROCEDURE_NAME
NUM_INPUT_PARAMS NUM_OUTPUT_PARAMS NUM_RESULT_SETS
REMARKS PROCEDURE_TYPE
Argumenty $owner, $proc i $column mog zawiera wzorzec przeszukiwania (% zastpuje zero lub
wicej znakw i _ zastpuje jeden znak).
Dodatek A - Funkcje
346

odbc_result
Zwraca zawarto pola. Parametr $field moe by liczb okrelajc numer pola lub cigiem
zawierajcym nazw pola.
string odbc_result (int result_id, mixed field)
Przykad:
$item_3 = odbc_result ($Query_ID, 3);
$item_val = odbc_result ($Query_ID, "val");

Pierwsze wywoanie odbc_result() zwraca warto trzeciego pola w biecym rekordzie Drugie
wywoanie funkcji odbc_result() zwraca warto pola o nazwie val w biecym rekordzie w wyniku. Bd
wystpi, jeeli numer kolumny dla jest mniejsza od jeden lub przekracza ilo kolumn w biecym rekordzie.
Podobnie bd wystpi, jeeli podana nazwa nie jest nazw pola znajdujcego si w wyniku. Numery pl
rozpoczynaj si od 1. W zalenoci od trybu obsugi kolumn long, zwracane s dane binarne lub long. Patrz
rwnie: odbc_binmode() i odbc_longreadlen().
odbc_result_all
Zwraca ilo wierszy w wyniku lub False w przypadku bdu. Funkcja odbc_result_all() powoduje
wydruk wszystkich wierszy z wyniku tworzonego za pomoc odbc_exec(). Wynikiem funkcji jest tabela HTML.
Dodatkowe formatowanie tabeli moe by realizowane za pomoc opcjonalnego cigu $format.
int odbc_result_all (int result_id [, string format])
odbc_rollback
Wycofuje transakcje otwarte poprzez poczenie $connection_id. Zwraca True w przypadku pomylnego
wykonania operacji lub False w przypadku bdu.
int odbc_rollback (int connection_id)
odbc_setoption
Funkcja pozwala operowa opcjami ODBC dla poczenia lub wyniku zapytania. Funkcja zostaa napisana
w celu umoliwienia znalezienia obejcia problemw ze sterownikami ODBC zawierajcymi bdy. Powiniene
uywa tej funkcji jedynie wtedy, gdy jeste programist ODBC i znasz konsekwencje ustawiania rnych opcji.
Powiniene rwnie posiada dobry podrcznik ODBC zawierajcy objanienie wszystkich opcji i ich wartoci.
Rne wersje sterownikw obsuguj rne opcje.
int odbc_setoption (int id, int function, int option, int param)
Poniewa efekty mog bardzo zalee od sterownika ODBC, uywanie tej funkcji w skryptach
udostpnianych publicznie nie jest zalecane. Niektre opcje ODBC nie s dostpne dla tej funkcji, poniewa
musz by ustawiane przed nawizaniem poczenia lub przygotowania zapytania. Jednak moe ona pomc w
konkretnym przypadku. Parametr $id jest identyfikatorem poczenia lub identyfikatorem wyniku, na ktrym
chcesz zmieni opcje. Dla SQLSetConnectOption() jest to identyfikator poczenia. Dla SQLSetStmtOption() jest to
identyfikator wyniku. Parametr $function jest uywan funkcj ODBC. Wartoci moe by: 1 dla
SQLSetConnectOption() i 2 dla SQLSetStmtOption(). Parametr $option jest wartoci ustawianej opcji. Parametr
$param jest wartoci dla podanej opcji.
Przykad: ODBC SetOption
// 1. Opcje 102 dla SQLSetConnectOption() wynosi SQL_AUTOCOMMIT.
// Warto 1 dla SQL_AUTOCOMMIT to SQL_AUTOCOMMIT_ON.
// Przykad ten jest analogiczny do wywoania
// odbc_autocommit($conn, true);

odbc_setoption ($conn, 1, 102, 1);

// 2. Opcja 0 dla SQLSetStmtOption() wynosi SQL_QUERY_TIMEOUT.
// Przykad ustawia czas wyganicia zapytania na 30 sekund.

$result = odbc_prepare ($conn, $sql);
odbc_setoption ($result, 2, 0, 30);
odbc_execute ($result);
PHP Kompendium wiedzy
347

odbc_specialcolumns
Gdy wartoci parametru $type wynosi SQL_BEST_ROWID, funkcja odbc_specialcolumns() zwraca kolumn
lub kolumny, ktre jednoznacznie identyfikuj kady wiersz tabeli. Jeeli $typ wynosi SQL_ROWVER, funkcja
odbc_specialcolumns() zwraca optymaln kolumn lub zestaw kolumn, ktra po odczytaniu wartoci kolumny
lub kolumn pozwala na jednoznaczn identyfikacj wierszy z tablicy. Funkcja zwraca identyfikator wyniku
ODBC lub False w przypadku bdu.
int odbc_specialcolumns (int connection_id, int type, string qualifier,
string owner, string table, int scope, int nullable)
Wynik zawiera nastpujce kolumny:
SCOPE COLUMN_NAME DATA_TYPE
TYPE_NAME PRECISION LENGTH
SCALE PSEUDO_COLUMN
Wynik jest uporzdkowany wedug kolumny SCOPE.
odbc_statistics
Odczytuje statystyki na temat tablicy i indeksw. Zwraca identyfikator wyniku ODBC lub False w
przypadku bdu.
int odbc_statistics (int connection_id, string qualifier, string owner,
string table_name, int unique, int accuracy)
Wynik zawiera nastpujce kolumny:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME
NON_UNIQUE INDEX_QUALIFIER INDEX_NAME
TYPE SEQ_IN_INDEX COLUMN_NAME
COLLATION CARDINALITY PAGES
FILTER_CONDITION
Wynik jest uporzdkowany wedug kolumn: NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME i
SEQ_IN_INDEX.
odbc_tableprivileges
Tworzy list tabel w danym zakresie oraz uprawnie zwizanych z kad tabel. Zwraca identyfikator
wyniku ODBC lub False w przypadku bdu.
int odbc_tableprivileges (int connection_id [, string qualifier [, string owner
[, string name]]])
Wynik zawiera nastpujce kolumny:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME
GRANTOR GRANTEE PRIVILEGE
IS_GRANTABLE
Wynik jest uporzdkowany wedug kolumn: TABLE_QUALIFIER, TABLE_OWNER i TABLE_NAME. Argumenty
$owner, $proc i $column mog zawiera wzorzec przeszukiwania (% zastpuje zero lub wicej znakw i _
zastpuje jeden znak).
odbc_tables
Tworzy list tabel w danym zakresie. Zwraca identyfikator wyniku ODBC lub False w przypadku
bdu.
int odbc_tables (int connection_id [, string qualifier [, string owner
[, string name [, string types]]]])
Wynik zawiera nastpujce kolumny:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME
TABLE_TYPE REMARKS
Wynik jest uporzdkowany wedug: TABLE_TYPE, TABLE_QUALIFIER, TABLE_OWNER i TABLE_NAME. Argumenty
$owner, $proc i $column mog zawiera wzorzec przeszukiwania (% zastpuje zero lub wicej znakw i _
zastpuje jeden znak). Aby obsuy wyliczanie kwalifikatorw, wacicieli i typw tabel dostpna jest specjalna
skadnia parametrw $qualifier, $owner, $name i $table_type.
Jeeli $qualifier zawiera jeden znak procentu (%) natomiast $owner i $name s pustymi cigami, wynik
zawiera list kwalifikatorw dla rda danych (wszystkie kolumny poza TABLE_QUALIFIER zawieraj wartoci
Dodatek A - Funkcje
348

NULL). Jeeli $owner zawiera znak procentu (%) a $qualifier i $name s pustymi cigami, wynik jest list
wacicieli dla podanego rda danych (wszystkie kolumny poza TABLE_OWNER zawieraj wartoci NULL). Jeeli
$table_type zawiera znak procentu (%) a $qualifier, $owner i $name s pustymi cigami, wynik jest list typw
tabel dla podanego rda danych (wszystkie kolumny poza TABLE_TYPE zawieraj wartoci NULL). Jeeli
$table_type nie jest pustym cigiem, musi zawiera list wartoci rozdzielonych przecinkami interesujcych
typw tabel Kada warto moe by otoczona apostrofami (') lub bez apostrofw, na przykad: 'TABLE','VIEW'
lub TABLE,VIEW. Jeeli rdo danych nie obsuguje jakiego typu tabel, odbc_tables() nie zwraca wynikw dla
tego typu. Sposb odczytywania uprawnie opisany jest przy funkcji odbc_tableprivileges().

opendir
Zwraca uchwyt katalogu, ktry jest pniej uywany w funkcjach closedir(), readdir() i rewinddir().
resource opendir (string path)
openlog
Otwiera dla programu poczenie do dziennika systemowego. Cig $ident jest dodawany do kadego
komunikatu. Wartoci $option i $facility s wymienione w tabeli poniej. Argument $option uywany jest do
wskazania, opcji uywanych przy generowaniu komunikatw. Pozwala to poda (w konfiguracji dziennika
systemowego) w jaki sposb s obsugiwane komunikaty przychodzce z rnych urzdze. Uycie funkcji
openlog() jest opcjonalne. Jest ona wywoywana w razie potrzeby przez funkcj syslog() i w takim przypadku
$ident ma warto False.
int openlog (string ident, int option, int facility)
Opcje openlog()
Staa Opis
LOG_CONS
Jeeli wystpi bd przy wysyaniu danych do dziennika
systemowego dane s wypisywane na konsol systemow.
LOG_NDELAY
Natychmiast otwiera poczenie z dziennikiem systemowym.
LOG_ODELAY
(domylny) Opnia otwarcie poczenia do zapisu pierwszego
komunikatu.
LOG_PERROR
Wysya komunikaty dziennika rwnie na standardowe wyjcie
bdw.
LOG_PID
Dodaje PID do kadego komunikatu.
Mona korzysta z wicej ni jednej z tych opcji. Uywajc kilku opcji do ich czenia naley uy
operatora OR. Na przykad, aby uzyska natychmiastowe otwarcie poczenia, pisanie na konsol i dodanie PID do
kadego komunikatu naley uy LOG_CONS | LOG_NDELAY | LOG_PID.
Urzdzenia dla openlog()
Staa Opis
LOG_AUTH
Komunikaty systemu bezpieczestwa (naley uy
LOG_AUTHPRIV w systemach gdzie jest zdefiniowana ta staa).
LOG_AUTHPRIV
Komunikaty systemu bezpieczestwa (prywatne).
LOG_CRON
Demony zegara (cron i at).
LOG_DAEMON
Inne demony systemowe.
LOG_KERN
Komunikaty jdra.
LOG_LOCAL0 ...
LOG_LOCAL7
Zarezerwowane.
LOG_LPR
Podsystem drukarki.
LOG_MAIL
Podsystem poczty.
LOG_NEWS
Podsystem USENET.
LOG_SYSLOG
Komunikaty generowane przez syslogd.
LOG_USER
Komunikaty generowane przez programy uytkownika.
LOG_UUCP
Podsystem UUCP.
PHP Kompendium wiedzy
349

Patrz rwnie: define_syslog_variables(), syslog() i closelog().
Ora_Bind
Zwraca True jeeli wizanie udao si lub False w przeciwnym przypadku. Szczegy na temat bdu
mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Funkcja ta wie nazw zmiennej PHP z
parametrem SQL. Parametr SQL musi mie posta :nazwa. Za pomoc opcjonalnego parametru $type mona
zdefiniowa, czy parametr ma by wyjciowy i wejciowy (0 domylnie), wejciowy (10) lub wyjciowy (2).
Od wersji PHP 3.0.1 mona korzysta ze staych ORA_BIND_INOUT, ORA_BIND_IN i ORA_BIND_OUT zamiast liczb.
Funkcja ora_bind() musi by wywoana po ora_parse() i przed ora_exec(). Wartoci wejciowe mog by
przekazywane poprzez przypisanie do zwizanych zmiennych PHP. Po wywoaniu ora_exec(), wartoci
wyjciowe, jeeli s dostpne, s dostpne w odpowiednich zwizanych zmiennych.
int ora_bind (int cursor, string PHP variable name, string SQL parameter name,
int length [, int type])
Przykad: ora_bind()
<?php
ora_parse($curs, "declare tmp INTEGER; begin tmp := :in; :out := tmp; :x := 7.77; end;");
ora_bind($curs, "result", ":x", $len, 2);
ora_bind($curs, "input", ":in", 5, 1);
ora_bind($curs, "output", ":out", 5, 2);
$input = 765;
ora_exec($curs);
echo "Wynik: $result<BR>Wyjcie: $output<BR>Wejcie: $input";
?>
Ora_Close
Zwraca True jeeli udao si zamknicie, False w przeciwnym wypadku. Szczegy na temat bdu mog
by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Funkcja zamyka kursor otwarty za pomoc
ora_open().
int ora_close (int cursor)
Ora_ColumnName
Zwraca nazw kolumny (pola) numer $column z kursora $cursor. Zwracana nazwa zapisana jest wielkimi
literami.
string Ora_ColumnName (int cursor, int column)
Ora_ColumnSize
Zwraca rozmiar kolumny (pola) numer $column z kursora $cursor.
int Ora_ColumnSize (int cursor, int column)
Ora_ColumnType
Zwraca typ Oracle kolumny (pola) numer $column z kursora $cursor.
string Ora_ColumnType (int cursor, int column)
Zwracany typ moe by jedn z poniszych wartoci:
VARCHAR2
VARCHAR
CHAR
NUMBER
LONG
LONG RAW
ROWID
DATE
CURSOR
Dodatek A - Funkcje
350

Ora_Commit
Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Szczegy na
temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Funkcja zatwierdza transakcj
Oracle. Transakcja jest definiowana jako wszystkie zmiany wykonane poprzez poczenie od czasu ostatniej
operacji COMMIT lub ROLLBACK, wyczenia automatycznego zatwierdzania lub nawizania poczenia.
int ora_commit (int conn)
Ora_CommitOff
Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Szczegy na
temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Funkcja wycza automatyczne
zatwierdzanie operacji po kadej funkcji ora_exec().
int ora_commitoff (int conn)
Ora_CommitOn
Funkcja wcza automatyczne zatwierdzanie operacji po kadej funkcji ora_exec() na podanym
poczeniu. Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Szczegy
na temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode().
int ora_commiton (int conn)
Ora_Do
Funkcja ta jest kombinacj funkcji ora_parse(), ora_exec() i ora_fetch(). Analizuje, wykonuje
wyraenie oraz pobiera pierwszy wiersz. Zwraca True w przypadku powodzenia operacji lub False w przypadku
wystpienia bdu. Szczegy na temat bdu mog by pobrane za pomoc funkcji ora_error() i
ora_errorcode(). Patrz rwnie: ora_parse(), ora_exec() i ora_fetch().
int ora_do (int conn, string query)
Ora_Error
Zwraca komunikat bdu w postaci XXX-NNNNN, gdzie XXX jest rdem bdu a NNNNN okrela
komunikat bdu.
Uwaga
Obsug identyfikatorw poczenia zostaa dodana w PHP 3.0.4.
string Ora_Error (int cursor_or_connection)
Na Oracle dla systemw Unix mona znale komunikaty bdw podobne do nastpujcych:
$ oerr ora 00001 00001, 00000, "unique constraint (%s.%s) violated" // *Cause: An update or insert statement
attempted to insert a duplicate key // For Trusted ORACLE configured in DBMS MAC mode, you may see // this
message if a duplicate entry exists at a different level. // *Action: Either remove the unique restriction
or do not insert the key
Ora_ErrorCode
Zwraca numeryczny kod bdu ostatniej wykonywanego wyraenia na okrelonym kursorze lub
poczeniu.
Uwaga
Obsug identyfikatorw poczenia zostaa dodana w PHP 3.0.4.
int Ora_ErrorCode (int cursor_or_connection)
PHP Kompendium wiedzy
351

Ora_Exec
Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Szczegy na
temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Patrz rwnie: ora_parse(),
ora_fetch() i ora_do().
int ora_exec (int cursor)
Ora_Fetch
Zwraca True (zosta odczytany wiersz) lub False (brak wierszy lub wystpi bd). Szczegy na temat
bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Jeeli nie wystpi bd,
ora_errorcode() zwraca 0. Pobiera wiersz danych z podanego kursora. Patrz rwnie: ora_parse(), ora_exec() i
ora_do().
int ora_fetch (int cursor)
Ora_Fetch_Into
Pobiera wiersz do tablicy.
Uwaga
Musisz przekazywa tablic przez referencj.
Patrz rwnie: ora_parse(), ora_exec(), ora_fetch() i ora_do().
int ora_fetch_into (int cursor, array result [, int flags])
Przykad: Pobranie wiersza wyniku Oracle do tablicy
<?php
array($results);
ora_fetch_into($cursor, &$results);
echo $results[0];
echo $results[1];
?>
Ora_GetColumn
Zwraca dane kolumny. Jeeli wystpi bd zwracana jest warto False, a ora_errorcode() zwraca
niezerow warto. Naley pamita, e sprawdzanie czy funkcja zwrcia warto False powoduje, e bd
wykrywane rwnie sytuacje gdy bd nie wystpi (warto NULL, pusty cig, liczba 0, cig "0"). Pobiera dane z
kolumny lub wynik funkcji.
mixed ora_getcolumn (int cursor, mixed column)
Ora_Logoff
Zwraca True w przypadku powodzenia operacji lub False w przypadku wystpienia bdu. Szczegy na
temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode(). Wylogowuje uytkownika i
odcza od serwera. Patrz rwnie: ora_logon().
int ora_logoff (int connection)
Ora_Logon
Zestawia poczenie pomidzy PHP a baz danych Oracle, korzystajc z podanej nazwy uytkownika i
hasa.
int ora_logon (string user, string password)
Podajc nazw TNS i uytkownika poczenie moe by zestawione za pomoc SQL*Net:
$conn = Ora_Logon("user@TNSNAME", "pass");
Jeeli dane znakowe zawieraj znaki spoza zakresu ASCII, powiniene ustawi w systemie zmienn
rodowiska NLS_LANG. W przypadku korzystania z moduu serwera, zmienna ta powinna by ustawiona w
rodowisku serwera przed uruchomieniem serwera. W przypadku powodzenia operacji zwraca identyfikator
Dodatek A - Funkcje
352

poczenia lub False w przypadku wystpienia bdu. Szczegy na temat bdu mog by pobrane za pomoc
funkcji ora_error() i ora_errorcode().
Ora_Numcols
Zwraca liczb kolumn w wyniku. Zwraca prawidowe wartoci jedyni po wykonaniu sekwencji parse
exec fetch. Patrz rwnie: ora_parse(), ora_exec(), ora_fetch() i ora_do().
int ora_numcols (int cursor_ind)
Ora_Numrows
Zwraca ilo wierszy w wyniku.
int ora_numrows (int cursor_ind)
Ora_Open
Otwiera kursor Oracle skojarzony z poczeniem. Zwraca identyfikator kursora lub False w przypadku
bdu. Szczegy na temat bdu mog by pobrane za pomoc funkcji ora_error() i ora_errorcode().
int ora_open (int connection)
Ora_Parse
Analizuje wyraenie SQL lub blok PL/SQL i czy je z podanym kursorem. Zwraca 0 w przypadku
powodzenia operacji lub -1 w przypadku bdu. Patrz rwnie: ora_exec(), ora_fetch() i ora_do().
int ora_parse (int cursor_ind, string sql_statement, int defer)
Ora_pLogon
Zestawia trwae poczenie pomidzy PHP a baz danych Oracle, korzystajc z podanej nazwy
uytkownika i hasa. Patrz rwnie: ora_logon().
int ora_plogon (string user, string password)
Ora_Rollback
Wycofuje transakcj Oracle (definicja transakcji znajduje si przy funkcji ora_commit()).Zwraca
identyfikator kursora lub False w przypadku bdu. Szczegy na temat bdu mog by pobrane za pomoc
funkcji ora_error() i ora_errorcode().
int ora_rollback (int connection)
OrbitEnum
Klasa ta reprezentuje wyliczenie identyfikowane przez parametr $id. Parametr ten moe by nazw
wyliczenia (na przykad: MyEnum) lub penym identyfikatorem repozytorium (na przykad: IDL:MyEnum:1:0)
new OrbitEnum (string id)
Przykad: przykadowy plik IDL
enum MyEnum {
a,b,c,d,e
};
Przykad: kod PHP korzystajcy z MyEnum
<?php
$enum = new OrbitEnum ("MyEnum");
echo $enum->a; /* wypisuje 0 */
echo $enum->c; /* wypisuje 2 */
echo $enum->e; /* wypisuje 4 */
?>
PHP Kompendium wiedzy
353

OrbitObject
Klasa pozwalajca na dostp do obiektu CORBA. Parametr $id powinien by cigiem zawierajcym
Interoperable Object Reference (IOR) identyfikujcy zdalny obiekt.
new OrbitObject (string ior)
Przykad: Przykadowy plik IDL
interface MyInterface {
void SetInfo (string info);
string GetInfo();

attribute int value;
}
Przykad: kod PHP korzystajcy z MyInterface
<?php
$obj = new OrbitObject ($ior);
$obj->SetInfo ("Obiekt");
echo $obj->GetInfo();
$obj->value = 42;
echo $obj->value;
?>
OrbitStruct
Klasa reprezentujca struktur o identyfikatorze $id. Parametr $id moe by nazw struktury (na przykad
MyStruct) lub penym identyfikatorem repozytorium (na przykad: IDL:MyStruct:1:0)
new OrbitStruct (string id)
Przykad: przykadowy plik IDL
struct MyStruct {
short shortvalue;
string stringvalue;
};
interface SomeInterface {
void SetValues (MyStruct values);
MyStruct GetValues();
}
Przykad: kod PHP korzystajcy z MyStruct
<?php
$obj = new OrbitObject ($ior);
$initial_values = new OrbitStruct ("IDL:MyStruct:1.0");
$initial_values->shortvalue = 42;
$initial_values->stringvalue = "HGTTG";
$obj->SetValues ($initial_values);
$values = $obj->GetValues();
echo $values->shortvalue;
echo $values->stringvalue;
?>
ord
Zwraca warto ASCII dla pierwszego znaku cigu $string. Funkcja jest odwrotnoci chr(). Patrz
rwnie: chr().
int ord (string string)
Przykad: ord()
if (ord($str) == 10) {
echo "Pierwszym znakiem \$str jest znak nowego wiersza.\n";
}
pack
Pakuje podane argumenty do postaci cigu binarnego zgodnie z formatem $format. Zwraca cig binarny
zawierajcy dane. Idea tej funkcji jest zapoyczona z jzyka Perl i wszystkie kody formatujce dziaaj
identycznie. Jednak brakuje kilku kodw, na przykad kod Perla u. Cig formatu skada si z kodw
formatowania po ktrych nastpuj opcjonalne argumenty powtarzania. Argument ten moe by liczb cakowita
lub * dla powtarzania do koca danych wejciowych. Dla kodw a, A, h i H ilo powtrze okrela ilo
pobieranych znakw jednego argumentu danych. Dla @, jest to bezwzgldna pozycja na ktrej naley umieci
Dodatek A - Funkcje
354

kolejne dane. Dla pozostaych kodw ilo powtrze okrela ile argumentw jest pobieranych i pakowanych do
wynikowego cigu binarnego.
string pack (string format [, mixed args ...])
Zaimplementowane s nastpujce kody:
a cig dopeniany zerami
A cig dopeniany spacjami
h cig szesnastkowy, pierwszy jest mniej znaczcy pbajt
H cig szesnastkowy, pierwszy jest bardziej znaczcy pbajt
c litera ze znakiem
C litera bez znaku
s krtka liczba ze znakiem (zawsze 16 bitw, kolejno bajtw zalena od komputera)
S krtka liczba bez znaku (zawsze 16 bitw, kolejno bajtw zalena od komputera)
n krtka liczba bez znaku (zawsze 16 bitw, z malejcym porzdkiem bitw)
v krtka liczba bez znaku (zawsze 16 bitw, z rosncym porzdkiem bitw)
i liczba cakowita ze znakiem (rozmiar i porzdek bitw zaleny od komputera)
I liczba cakowita bez znaku (rozmiar i porzdek bitw zaleny od komputera)
l liczba duga ze znakiem (zawsze 32 bity, kolejno bajtw zalena od komputera)
L liczba duga bez znaku (zawsze 32 bity, kolejno bajtw zalena od komputera)
N liczba duga bez znaku (zawsze 32 bity, z malejcym porzdkiem bitw)
V liczba duga bez znaku (zawsze 32 bity, z rosncym porzdkiem bitw)
f liczba zmiennoprzecinkowa (rozmiar i reprezentacja zalena od komputera)
d liczba double (rozmiar i reprezentacja zalena od komputera)
x bajt NUL
X cofnicie o jeden bajt
@ wypenienie znakami NUL do okrelonej pozycji
Przykad: cig formatu dla pack()
$binarydata = pack ("nvc*", 0x1234, 0x5678, 65, 66);
Wynikowy cig bdzie mia 6 bajtw i zawiera sekwencj bajtw: 0x12, 0x34, 0x78, 0x56, 0x41 i 0x42.
Uwaga
Rozrnienie pomidzy wartociami ze znakiem lub bez znaku jest wane jedynie dla funkcji unpack(), a funkcja pack() daje
identyczne wartoci dla kodw formatowania ze znakiem jak i bez.
Naley zauway, e PHP wewntrznie przechowuje wartoci cakowite jako wartoci ze znakiem o
wielkoci zalenej od komputera. Jeeli zostanie przekazana zbyt dua warto, zostanie ona skonwertowana do
double, co moe prowadzi do niespodziewanych wynikw.
parse_str
Analizuje cig $str tak, jakby by przekazany poprzez adres URL i ustawia zmienne w biecym zakresie
widocznoci. Jeeli podany jest drugi parametr $arr zmienne s umieszczane w przekazanej tablicy.
void parse_str (string str [, array arr])
Przykad: uycie parse_str()
<?php
$str = "first=value&second[]=this+works&second[]=another";
parse_str($str);
echo $first; /* wypisuje "value" */
echo $second[0]; /* wypisuje "this works" */
echo $second[1]; /* wypisuje "another" */
?>
parse_url
Zwraca tablic asocjacyjn zawierajc rne skadniki podanego adresu URL. S dostpne: scheme, host,
port, user, pass, path, query i fragment.
PHP Kompendium wiedzy
355
array parse_url (string url)

passthru
Podobna do funkcji exec(), uruchamia polecenie podane w $command. Jeeli podany jest parametr
$return_var, umieszczana jest w nim warto kodu powrotu wykonywanego polecenia. Funkcja ta powinna by
uywana zamiast exec() lub system() dla przypadkw, gdy wynikiem dziaania polecenia s dane binarne, ktre
musz by wysane do przegldarki. Czstym zastosowaniem jest uruchomienie programu podobnego do pbmplus,
ktry potrafi bezporednio pisa do strumienia wyjciowego. Ustawiajc content-type na image/gif i wywoujc
pbmplus z opcj tworzenia pliku gif, mona stworzy skrypt PHP bezporednio wywietlajcy rysunki.
Uwaga
Jeeli uruchamiasz program przy pomocy tej funkcji i chcesz pozostawi go aby dziaa w tle, musisz przekierowa jego wyjcie do
pliku lub innego strumienia wyjciowego, poniewa inaczej PHP zatrzyma si czekajc na zakoczenie tego programu.
Patrz rwnie: exec(), popen(), EscapeShellCmd() oraz operator `.
void passthru (string command [, int return_var])
pdf_add_outline
Dodaje zakadk z tekstem $text wskazujc na biec stron. Zakadka jest wstawiana w postaci
obiektu potomnego do $parent i jest domylnie otwierana chyba, e parametr $open jest rny od 0. Wynikiem
jest identyfikator zakadki i moe by on uyty jako obiekt nadrzdny dla innych zakadek. Dziki temu mona
tworzy hierarchi zakadek. Niestety pdflib nie tworzy kopii cigu, co powoduje wymuszenie przydzielania
pamici przez PHP. Ten fragment pamici nie jest zwalniany przez adn z funkcji PDF i jest to w gestii zarzdcy
pamici PHP.
int pdf_add_outline( int pdf_document, string text [, int parent] [, int open])
pdf_arc
Rysuje uk o rodku w punkcie ($x-coor, $y-coor) i promieniu $radius rozpoczynajc pod ktem $start a
koczc na $end. Patrz rwnie: pdf_circle() i pdf_stroke().
void pdf_arc (resource pdf_object, float x, float y, float r, float alpha, float beta)
pdf_begin_page
Rozpoczyna now stron o wysokoci $height i szerokoci $width. Aby stworzy prawidowy dokument
musisz co najmniej raz wywoa funkcj pdf_end_page(). Patrz rwnie: pdf_end_page().
void pdf_begin_page (int pdf_object, float width, float height)
pdf_circle
Rysuje okrg o rodku w punkcie ($x-coor, $y-coor) i promieniu $radius. Patrz rwnie: pdf_arc() i
pdf_stroke().
void pdf_circle (int pdf_object, float x, float y, float r)
pdf_clip
Przycina rysunek do biecej cieki.
void pdf_clip (int pdf_object)
pdf_close
Zamyka dokument pdf. Patrz rwnie: pdf_open() i fclose().
void pdf_close (int pdf_object)
Dodatek A - Funkcje
356

pdf_closepath
Zamyka biec ciek. Oznacza to, e rysuje lini od biecego punktu do punktu, w ktrym zostao
rozpoczte rysowanie cieki. Wiele funkcji, np. pdf_moveto(), pdf_circle() i pdf_rect() rozpoczyna now
ciek.
void pdf_closepath (int pdf_object)
pdf_closepath_fill_stroke
Zamyka biec ciek, wypenia jej obszar biecym kolorem wypenienia i rysuje ciek. Patrz
rwnie: pdf_closepath(), pdf_stroke(), pdf_fill(), pdf_setgray_fill(), pdf_setgray(),
pdf_setrbgcolor_fill() i pdf_setrgbcolor().
void pdf_closepath_fill_stroke (int pdf_object)
pdf_closepath_stroke
Poczenie pdf_closepath() i pdf_stroke(). Dodatkowo kasuje ciek. Patrz rwnie: pdf_closepath() i
pdf_stroke().
void pdf_closepath_stroke (int pdf_object)
pdf_close_image
Zamyka rysunek otwarty za pomoc funkcji pdf_open_xxx(). Patrz rwnie: pdf_open_jpeg(),
pdf_open_gif() i pdf_open_memory_image().
void pdf_close_image (int pdf_object, int image)
pdf_continue_text
Umieszcza tekst przekazany w parametrze $text w kolejnym wierszu. Odstp pomidzy wierszami moe
by regulowany za pomoc funkcji pdf_set_leading(). Patrz rwnie: pdf_show_xy(), pdf_set_leading() i
pdf_set_text_pos().
void pdf_continue_text (int pdf_object, string text)
pdf_curveto
Rysuje krzyw Beziera od punktu biecego do punktu ($x3, $y3) uywajc jako punktw kontrolnych
($x1, $y1) i ($x2, $y2). Patrz rwnie: pdf_moveto(), pdf_lineto() i pdf_stroke().
void pdf_curveto (int pdf_object, float x1, float y1, float x2, float y2,
float x3, float y3)
pdf_endpath
Koczy biec ciek, ale jej nie zamyka. Patrz rwnie: pdf_closepath().
void pdf_endpath( int pdf_document )
pdf_end_page
Koczy stron. Po zakoczeniu strony nie moe by ona ju modyfikowana. Patrz rwnie:
pdf_begin_page().
void pdf_end_page (int pdf_object)
pdf_execute_image
Wywietla rysunek umieszczony w pliku PDF za pomoc funkcji pdf_put_image() na biecej stronie na
podanych wsprzdnych. Rysunek moe by przeskalowany podczas wywietlania. Skala 1.0 powoduje
wywietlanie rysunku w oryginalnej wielkoci.
PHP Kompendium wiedzy
357

Uwaga
Funkcja stanie si przestarzaa w pdflib 2.01. Bdzie jedynie wywietlaa ostrzeenie.
Przykad: wielokrotne wywietlanie rysunku
<?php
$im = ImageCreate( 100, 100 );
$col1 = ImageColorAllocate( $im, 80, 45, 190 );
ImageFill( $im, 10, 10, $col1 );
$pim = pdf_open_memory_image( $pdf, $pim );
pdf_put_image( $pdf, $pim );
pdf_execute_image( $pdf, $pim, 100, 100, 1 );
pdf_execute_image( $pdf, $pim, 200, 200, 2 );
pdf_close_image( $pdf, $pim )
?>
pdf_fill
Wypenia wntrze biecej cieki za pomoc biecego koloru wypenienia. Patrz rwnie:
pdf_closepath(), pdf_stroke(), pdf_setgray_fill(), pdf_setgray(), pdf_setrgbcolor_fill() i
pdf_sergbcolor().
void pdf_fill_stroke (int pdf_object)
pdf_fill_stroke
Wypenia wntrze biecej cieki za pomoc biecego koloru wypenienia i rysuje biec ciek. Patrz
rwnie: pdf_closepath(), pdf_stroke(), pdf_fill(), pdf_setgray_fill(), pdf_setgray(),
pdf_setrgbcolor_fill() i pdf_sergbcolor().
void pdf_fill_stroke (int pdf_object)
pdf_get_image_height
Zwraca wysoko rysunku pdf w pikselch. Patrz rwnie: pdf_open_image_file(),
pdf_open_memory_image() i pdf_get_image_width().
string pdf_get_image_height (int pdf_object, int image)
pdf_get_image_width
Zwraca szeroko rysunku pdf w pikselch. Patrz rwnie: pdf_open_image_file(),
pdf_open_memory_image() i pdf_get_image_heigth().
string pdf_get_image_width (int pdf_object, int image)
pdf_get_parameter
Pobiera kilka z parametrw pdflib bdcych cigami. Parametr funkcji $modifier okrela parametr do
pobrania. Jeeli modyfikator nie jest potrzebny, musi mie warto 0 lub nie podany. Patrz rwnie:
pdf_get_value(), pdf_set_value() i pdf_set_parameter().
string pdf_get_parameter (int pdf_object, string key [, float modifier])
pdf_get_value
Pobiera kilka numerycznych parametrw pdflib. Parametr funkcji $modifier okrela parametr do pobrania.
Jeeli modyfikator nie jest potrzebny, musi mie warto 0 lub nie podany. Patrz rwnie: pdf_get_parametr(),
pdf_set_value() i pdf_set_parameter().
float pdf_get_value (int pdf_object, string key [, float modifier])
Dodatek A - Funkcje
358

pdf_lineto
Rysuje lini od punktu biecego do punktu o wsprzdnych ($x, $y). Patrz rwnie: pdf_moveto(),
pdf_curveto() i pdf_stroke().
void pdf_lineto (int pdf_object, float x, float y)
pdf_moveto
Ustawia punkt biecy na $x i $y.
void pdf_moveto (int pdf_object, float x, float y)
pdf_open
Otwiera dokument pdf. Odpowiedni plik musi by otwarty za pomoc fopen() i deskryptor pliku
przekazany jako parametr $file. Jeeli nie przekazane zostan adne parametry, dokument zostanie utworzony w
pamici a wynikowa strona wysana do stdout lub przegldarki WWW.
Uwaga
Zwracana warto jest potrzebna jako pierwszy parametr wszystkich pozostaych funkcji zapisujcych pliki pdf.
Patrz rwnie: fopen() i pdf_close().
int pdf_open( int file )
pdf_open_gif
Otwiera rysunek zapisany w pliku o nazwie $filename. Formatem pliku musi by gif. Funkcja zwraca
identyfikator rysunku pdf.
Uwaga
Funkcja nie powinna by ju uywana. Prosz uywa zamiast niej funkcji pdf_open_image_file().
Patrz rwnie: pdf_close_image(), pdf_open_jpeg(), pdf_open_memory_image(), pdf_execute_image(),
pdf_place_image() i pdf_put_image().
int pdf_open_gif ( int pdf_document, string filename )
Przykad: Doczanie rysunku GIF
<?php
$im = pdf_open_gif( $pdf, "test.gif" );
pdf_place_image( $pdf, $im, 100, 100, 1 );
pdf_close_image( $pdf, $im );
?>
pdf_open_image_file
Otwiera rysunek o formacie $format, zapisany w pliku o nazwie $filename. Moliwymi formatami pliku
s: png, tiff, jpeg i gif. Funkcja zwraca identyfikator rysunku pdf. Patrz rwnie: pdf_close_image(),
pdf_open_jpeg(), pdf_open_gif(), pdf_open_memory_image(), pdf_execute_image(), pdf_place_image() i
pdf_put_image().
int pdf_open_image_file (int PDF-document, string imagetype, string filename
[, string stringparam [, string intparam]])
Przykad: wstawianie rysunku
<?php
$im = pdf_image_file( $pdf, "png", "picture.png" );
pdf_place_image( $pdf, $im, 100, 100, 1 );
pdf_close_image( $pdf, $im );
?>
PHP Kompendium wiedzy
359

pdf_open_jpeg
Otwiera rysunek zapisany w pliku o nazwie $filename. Formatem pliku musi by jpeg. Funkcja zwraca
identyfikator rysunku pdf.
Uwaga
Funkcja nie powinna by ju uywana. Prosz uywa zamiast niej funkcji pdf_open_image_file().
Patrz rwnie: pdf_close_image(), pdf_open_gif(), pdf_open_png(), pdf_open_memory_image(),
pdf_execute_image(), pdf_place_image() i pdf_put_image().
int pdf_open_jpeg ( int pdf_document, string filename )
pdf_open_memory_image
Pobiera rysunek utworzony za pomoc funkcji PHP tworzcych rysunki i udostpnia go dla dokumentu
pdf. Funkcja zwraca identyfikator rysunku pdf. Patrz rwnie: pdf_close_image(),pdf_open_jpeg(),
pdf_open_gif(), pdf_open_png(), pdf_execute_image(), pdf_place_image() i pdf_put_image().
int pdf_open_memory_image (int pdf_object, int image)
Przykad: Doczanie rysunku z pamici
<?php
$im = ImageCreate( 100, 100 );
$col1 = ImageColorAllocate( $im, 80, 45, 190 );
ImageFill( $im, 10, 10, $col1 );
$pim = pdf_open_memory_image( $pdf, $pim );
ImageDestroy( $im );
pdf_place_image( $pdf, $pim, 100, 100, 1 );
pdf_close_image( $pdf, $pim )
?>
pdf_open_png
Otwiera rysunek zapisany w pliku o nazwie $filename. Formatem pliku musi by png. Funkcja zwraca
identyfikator rysunku pdf.
Uwaga
Funkcja nie powinna by ju uywana. Prosz uywa zamiast niej funkcji pdf_open_image_file().
Patrz rwnie: pdf_close_image(), pdf_open_gif(), pdf_open_jpeg(), pdf_open_memory_image(),
pdf_execute_image(), pdf_place_image() i pdf_put_image().
int pdf_open_png ( int pdf_document, string filename )
Przykad: doczanie rysunku PNG
<?php
$im = pdf_open_png( $pdf, "test.png" );
pdf_place_image( $pdf, $im, 100, 100, 1 );
pdf_close_image( $pdf, $im );
?>
pdf_open_tiff
Otwiera rysunek zapisany w pliku o nazwie $filename. Formatem pliku musi by tiff. Funkcja zwraca
identyfikator rysunku pdf.
Uwaga
Funkcja nie powinna by ju uywana. Prosz uywa zamiast niej funkcji pdf_open_image_file().
Patrz rwnie: pdf_close_image(), pdf_open_gif(), pdf_open_jpeg(), pdf_open_png(),
pdf_open_memory_image(), pdf_execute_image(), pdf_place_image() i pdf_put_image().
int pdf_open_tiff( int pdf_document, string filename )
Dodatek A - Funkcje
360

pdf_place_image
Umieszcza rysunek na stronie na wsprzdnych ($x, $y). Rysunek moe by w tym czasie przeskalowany.
Patrz rwnie: pdf_put_image().
void pdf_place_image (int pdf_object, int image, float x, float y, float scale)
pdf_put_image
Umieszcza rysunek w pliku PDF bez jego pokazywania. Zapisany rysunek moe by wywietlony za
pomoc pdf_execute_image() dowoln ilo razy. Jest to uyteczne, jeeli ten sam rysunek jest wielokrotnie
uywany w celu zmniejszenia pliku wynikowego. Uycie funkcji pdf_put_image() i pdf_execute_image() jest
zalecane dla wikszych rysunkw (kilka KB), jeeli s pokazane w dokumencie wicej ni raz.
Uwaga
Funkcja stanie si przestarzaa w pdflib 2.01. Bdzie jedynie wywietlaa ostrzeenie.
Patrz rwnie: pdf_put_image(), pdf_place_image() i pdf_execute_image().
pdf_rect
Rysuje prostokt o dolnym lewym naroniku w punkcie ($x, $y). Jego szeroko wynosi $width a
wysoko $height. Patrz rwnie: pdf_stroke().
void pdf_rect (int pdf_object, float x, float y, float width, float height)
pdf_restore
Przywraca rodowisko zapisane za pomoc pdf_save(). Dziaa podobnie do polecenia postscript restore.
Patrz rwnie: pdf_save().
void pdf_restore (int pdf_object)
Przykad: zapamitywanie i przywracanie rodowiska
<?php
pdf_save( $pdf );
// wykonanie obrotw i innych transformacji
pdf_restore( $pdf );
?>
pdf_rotate
Ustawia kt obrotu w stopniach na $angle.
void pdf_rotate (int pdf_object, float angle)
pdf_save
Zapisuje biece rodowisko. Dziaa podobnie do polecenia postscript save. Funkcja jest uyteczna, gdy
chcesz przesun lub obrci obiekt bez wpywania na inne obiekty. Funkcja pdf_save() powinna zawsze
posiada swoj pdf_restore() odtwarzajc stan rodowiska sprzed pdf_save(). Patrz rwnie: pdf_restore().
void pdf_save (int pdf_object)
pdf_scale
Ustala wspczynnik skalowania w obu kierunkach. Poniszy przykad powoduje przeskalowanie
wsprzdnych x i y o 72. Kolejna linia bdzie miaa dziki temu dugo jednego cala w obu kierunkach.
void pdf_scale (int pdf_object, float x-scale, float y-scale)
Przykad: skalowanie
<?php
pdf_scale($pdf, 72.0, 72.0 );
pdf_lineto( $pdf, 1, 1 );
pdf_stroke( $pdf );
PHP Kompendium wiedzy
361

?>
pdf_setdash
Ustawia wzr kreski na $white biaych punktw i $black czarnych. Jeeli obie wartoci s 0, narysowana
zostanie ciga linia.
void pdf_setdash (int pdf_object, float black, float white)
pdf_setflat
Ustawia parametr paskoci na warto od 0 do 100.
void pdf_setflat (int pdf_object, float flatness)
pdf_setgray
Ustawia biecy kolor rysowania i wypenienia na podan warto szarego koloru Patrz rwnie:
pdf_setrgbcolor_stroke() i pdf_setrgbcolor_fill().
void pdf_setgray (int pdf_object, float gray)
pdf_setgray_fill
Ustawia biecy kolor wypenienia na podan warto szaroci. Patrz rwnie: pdf_setrgbcolor_stroke().
void pdf_setgray_fill (int pdf_object, float gray)
pdf_setgray_stroke
Ustawia biecy kolor na podan warto szaroci. Patrz rwnie: pdf_setrgbcolor_stroke().
void pdf_setgray_stroke (int pdf_object, float gray)
pdf_setlinecap
Ustawia parametr linecap na warto od 0 do 2.
void pdf_setlinecap (int pdf_object, int linecap)
pdf_setlinejoin
Ustawia parametr linejoin na warto od 0 do 2.
void pdf_setlinejoin (int pdf_object, long linejoin)
pdf_setlinewidth
Ustawia szeroko linii na $width.
void pdf_setlinewidth (int pdf_object, float width)
pdf_setmiterlimit
Ustawia parametr miter limit na warto wiksz lub rwn 1.
void pdf_setmiterlimit (int pdf_object, float miter)
pdf_setrgbcolor
Ustawia biecy kolor wypenienia i rysowania na podan warto koloru RGB. Patrz rwnie:
pdf_setrgbcolor_stroke() i pdf_setrgbcolor_fill().
void pdf_setrgbcolor (int pdf_object, float red_value, float green_value,
float blue_value)
Dodatek A - Funkcje
362

pdf_setrgbcolor_fill
Ustawia warto koloru RGB dla wypenienia cieki. Patrz rwnie: pdf_setrgbcolor().
void pdf_setrgbcolor_fill (int pdf_object, float red_value, float green_value,
float blue_value)
pdf_setrgbcolor_stroke
Ustawia biec warto koloru RGB do rysowania.
void pdf_setrgbcolor_stroke (int pdf_object, float red_value, float green_value,
float blue_value)
pdf_set_border_color
Ustawia kolor prostokta otaczajcego cza i komentarze. Trzy skadniki koloru musz mie wartoci
pomidzy 0.0 a 1.0. Patrz rwnie: pdf_set_border_dash().
void pdf_set_border_color (int pdf_object, float red, float green, float blue)
pdf_set_border_dash
Ustawia dugoci czarnych i biaych obszarw linii przerywanej otaczajcej cza i komentarze. Patrz
rwnie: pdf_set_border_color().
void pdf_set_border_dash (int pdf_object, float black, float white)
pdf_set_border_style
Ustawia rodzaj i wielko prostokta otaczajcego cza i komentarze. Parametr $style moe mie
wartoci solid lub dashed. Patrz rwnie: pdf_set_border_color() i pdf_set_border_dash().
void pdf_set_border_style (int pdf_object, string style, float width)
pdf_set_char_spacing
Ustawia odstp pomidzy znakami. Patrz rwnie: pdf_set_word_spacing() i pdf_set_leading().
void pdf_set_char_spacing( int pdf_object, float space )
pdf_set_duration
Ustawia czas przerwy, w sekundach, pomidzy kolejnymi stronami. Patrz rwnie: pdf_set_transition().
void pdf_set_duration ( int pdf_object, float duration )
pdf_set_font
Ustawia biecy rodzaj czcionki, rozmiar czcionki i kodowanie. Jeeli uywasz pdflib 0.6, musisz
umieci w katalogu czcionek (domylnie ./fonts) plik Adobe Font Metrics (plik afm) dla uytej czcionki. Jeeli
uywasz PHP 3 lub pdflib w wersji pniejszej ni 2.20, parametr $encoding moe przyjmowa nastpujce
wartoci: 0 builtin, 1 pdfdoc, 2 macroman, 3 macexpert lub 4 winansi. Warto parametru
$encoding wiksza od 4 lub mniejsza od 0 powoduje przyjcie wartoci winansi. Warto ta jest zwykle dobrym
wyborem. Jeeli uywasz PHP4 i pdflib w wersji co najmniej 2.20, typ parametru $encoding zosta zmieniony na
cig. Naley uy winansi, builtin, itd. Jeeli ostatni parametr jest ustawiony na 1, czcionka jest wbudowywana
w dokument PDF, w przeciwnym wypadku nie jest. Wbudowywanie czcionek jest dobrym pomysem, jeeli jest
to rzadko wykorzystywana czcionka i nie ma pewnoci, e osoba ogldajca dokument bdzie miaa j
zainstalowan. Czcionka jest wbudowywana tylko raz, nawet, jeeli funkcja pdf_set_font() bdzie wywoana
kilka razy.
void pdf_set_font( int pdf_object, string font_name, float size, string encoding
[, int embed]))
PHP Kompendium wiedzy
363

pdf_set_horiz_scaling
Ustawia skalowanie w pionie na $scale procent.
void pdf_set_horiz_scaling( int pdf_object, float scale )
pdf_set_info
Ustawia pole informacyjne dokumentu PDF. Moliwymi nazwami pl s: Subject, Title, Creator, Author,
Keywords i jedna nazwa zdefiniowana przez uytkownika. Funkcja moe by wywoana przed rozpoczciem
strony.
Uwaga
Funkcja zastpuje funkcje: pdf_set_info_keywords(), pdf_set_info_title(), pdf_set_info_subject(),
pdf_set_info_creator() i pdf_set_info_sybject().
void pdf_set_info (int pdf_object, string key, string value)
Przykad: Ustawianie informacji o dokumencie
<?php
$fd = fopen( "test.pdf", "w" );
$pdfdoc = pdf_open($fd);
pdf_set_info( $pdfdoc, "Author", "Jan Kowalski");
pdf_set_info( $pdfdoc, "Creator", "Jan Kowalski");
pdf_set_info( $pdfdoc, "Title", "Testowanie pl informacyjnych");
pdf_set_info( $pdfdoc, "Subject", "Test");
pdf_set_info( $pdfdoc, "Keywords", "Test, Pola");
pdf_set_info( $pdfdoc, "CustomField", "Cokolwiek sensownego");
pdf_begin_page($pdfdoc, 595, 842);
pdf_end_page( $pdfdoc );
pdf_close( $pdfdoc );
?>
pdf_set_leading
Ustawia odstp pomidzy wierszami tekstu. Jest on uywany, gdy tekst jest wysyany za pomoc funkcji
pdf_continue_text(). Patrz rwnie: pdf_continue_text().
void pdf_set_leading( int pdf_object,float distance )
pdf_set_parameter
Ustawia parametry pdflib bdce cigami znakw. Patrz rwnie: pdf_get_value(), pdf_set_value() i
pdf_get_parameter().
void pdf_set_parameter (int pdf_object, string key, string value)
pdf_set_text_matrix
Ustawia tablic opisujc transformacje stosowane na biecej czcionce. Musi by przekazana tablica z
szecioma elementami.
Uwaga
Funkcja nie jest dostpna w pdflib od wersji 2.3.
void pdf_set_text_matrix( int pdf_object, array matrix)
pdf_set_text_pos
Ustawia pooenie tekstu dla nastpnego wywoania funkcji pdf_show(). Patrz rwnie: pdf_show() i
pdf_show_xy().
void pdf_set_text_pos (int pdf_object, float x, float y)
Dodatek A - Funkcje
364

pdf_set_text_rendering
Okrela sposb rysowania tekstu. Moliwymi wartociami dla parametru $mode s: 0 tekst wypeniony,
1 tekst przerywany, 2 tekst wypeniony i przerywany, 3 niewidoczny, 4 tekst wypeniony i dodany do
cieki obcinania, 5 tekst przerywany i dodany do cieki obcinania, 6 tekst przerywany i wypeniony oraz
dodany do cieki obcinania, 7 dodanie do cieki obcinania.
void pdf_set_text_rendering( int pdf_object, int mode)
pdf_set_text_rise
Ustawia powikszenie tekstu na $rise punktw.
void pdf_set_text_rise(int pdf_object, float rise )
pdf_set_transition
Ustawia przejcie pomidzy kolejnymi stronami. Patrz rwnie: pdf_set_duration().
void pdf_set_transition(int pdf_object, int transition)
Wartociami parametru $transition mog by:
0 brak
1 dwa wiersze pokazujce si na ekranie odkrywaj stron
2 kilka wierszy pokazujce si na ekranie odkrywaj stron
3 prostokt odkrywa stron
4 pojedynczy wiersz pokazujcy si na ekranie odkrywa stron
5 stara strona rozmywa si aby pokaza now stron
6 efekt rozmywania przesuwa si od jednej krawdzi strony do drugiej
7 nowa strona po prostu zastpuje star (domylnie)
pdf_set_value
Ustawia numeryczne parametry pdflib. Patrz rwnie: pdf_get_value(), pdf_get_parameter() i
pdf_set_parameter().
void pdf_set_value (int pdf_object, string key, float value)
pdf_set_word_spacing
Ustawia odstpy pomidzy sowami. Patrz rwnie: pdf_set_char_spacing() i pdf_set_leading().
void pdf_set_word_spacing( int pdf_object, float space )
pdf_show
Rysuje tekst $text od biecej pozycji kursora za pomoc biecej czcionki. Patrz rwnie:
pdf_show_xy(), pdf_show_boxed(), pdf_set_text_pos() i pdf_set_font().
void pdf_show (int pdf_object, string text)
pdf_show_boxed
Rysuje tekst $text w prostokcie o lewym grnym rogu we wsprzdnych ($left, $top). Rozmiar
prostokta okrelaj parametry $width i $height. Parametr $mode okrela w jaki sposb ustawiany jest typ tekstu.
Jeeli $width i $height maj wartoci 0, $mode moe by left, right lub center. Jeeli $width lub $height s rne
od zera $mode moe mie wartoci justify i fulljustify. Jeeli parametr $feature ustawiony jest na blind, tekst nie
pokazuje si. Zwraca ilo znakw, ktre nie mogy by przetworzone, poniewa nie mieciy si w prostokcie.
Patrz rwnie: pdf_show() i pdf_show_xy().
int pdf_show_boxed (int pdf_object, string text, float left, float top,
float width, float height, string mode [, string feature])
PHP Kompendium wiedzy
365

pdf_show_xy
Rysuje tekst $text na pozycji ($x, $y). Patrz rwnie: pdf_show() i pdf_show_boxed().
void pdf_show_xy (int pdf_object, string text, float x, float y)
pdf_skew
Pochyla system wsprzdnych o $alpha (x) i $beta (y) stopni. Parametry $alpha i $beta nie mog
wynosi 90 i 270 stopni.
void pdf_skew (int pdf_object, float alpha, float beta)
pdf_stringwidth
Zwraca szeroko tekstu $text zapisanego biec czcionk. Wymaga wczeniejszego ustawienia czcionki
za pomoc pdf_set_font(). Patrz rwnie: pdf_set_font().
float pdf_stringwidth (int pdf_object, string text [, int font [, float size]])
Dodatek A - Funkcje
366
Dodatek B. Predefiniowane zmienne i
stae PHP
Zmienne
Kompletn lista predefiniowanych zmiennych oraz inne uyteczne informacje mona znale w tabeli
bdcej wynikiem dziaania funkcji phpinfo(). Ponisza lista nie jest wyczerpujca i nigdy taka nie miaa by.
Mona j traktowa jako przykad spodziewanych rodzajw zmiennych, z jakich mona skorzysta w skryptach.
Zmienne Apache
Zmienne te s tworzone przez serwer Apache. Jeeli korzystasz z innego serwera, nie gwarantuj e
dostpne bd te same funkcje. Moe niektrych brakowa, a bd dostpne inne, nie opisane tutaj. Wiele z tych
zmiennych jest definiowanych przez now specyfikacj CGI 1.1, wic mona si spodziewa, e bd one
dostpne. Naley zauway, e niektre z wymienionych zmiennych s dostpne jedynie w przypadku
uruchomienia PHP z linii polece.
GATEWAY_INTERFACE
Wersja specyfikacji CGI, z ktrej korzysta serwer, na przykad CGI/1.1.
SERVER_NAME
Nazwa komputera z serwerem, na ktrym wykonywany jest skrypt. Jeeli skrypt dziaa na serwerze
wirtualnym, bdzie to nazwa zdefiniowana dla tego serwera wirtualnego.
SERVER_SOFTWARE
Cig identyfikujcy serwer przekazywany w nagwkach odpowiedzi na danie.
SERVER_PROTOCOL
Nazwa i wersja protokou za pomoc ktrego wysane zostao danie pobrania strony, na przykad
HTTP/1.0.
REQUEST_METHOD
Metoda dania uyta do pobrania strony, na przykad GET, HEAD, POST lub PUT.
QUERY_STRING
Cig zapytania (o ile istnieje) przesany wraz z biec stron.
DOCUMENT_ROOT
Zdefiniowany w konfiguracji serwera katalog gwny dokumentw, w ktrym jest wykonywany biecy
skrypt.

Dodatek B. Predefiniowane zmienne i stae PHP
368
HTTP_ACCEPT
Zawarto nagwka Accept: z biecego dania, o ile istnieje.
HTTP_ACCEPT_CHARSET
Zawarto nagwka Accept-Charset: z biecego dania, o ile istnieje. Przykad: iso-8859-1,*,utf-8.
HTTP_ENCODING
Zawarto nagwka Accept-Encoding: z biecego dania, o ile istnieje. Przykad: gzip.
HTTP_ACCEPT_LANGUAGE
Zawarto nagwka Accept-Language: z biecego dania, o ile istnieje. Przykad: en.
HTTP_CONNECTION
Zawarto nagwka Connection: z biecego dania, o ile istnieje. Przykad: Keep-Alive.
HTTP_HOST
Zawarto nagwka Host: z biecego dania, o ile istnieje.
HTTP_REFERER
Adres strony, z ktrej przegldarka przesza na biec stron. Jest to ustawiane przez przegldark
uytkownika, ale nie wszystkie przegldarki to robi.
HTTP_USER_AGENT
Zawarto nagwka User_Agent: z biecego dania, o ile istnieje. Jest to cig okrelajcy przegldark
uyt do ogldania biecego dokumentu, na przykad: Mozilla/4.5[en] (X11;U;Linux 2.2.9 i586). Mona uy tej
wartoci oraz funkcji get_browser() w celu przystosowania strony do moliwoci przegldarki uytej przez
uytkownika.
REMOTE_ADDR
Adres IP komputera uywanego do ogldania biecej strony.
REMOTE_PORT
Port na komputerze klienta uyty do komunikacji z serwerem WWW.
SCRIPT_FILENAME
Bezwzgldna cieka do wykonywanego skryptu.
SERVER_ADMIN
Zawarto dyrektywy konfiguracji Apache SERVER_ADMIN z pliku konfiguracyjnego. Jeeli skrypt jest
uruchomiony poprzez serwer wirtualny, jest to warto zdefiniowana dla tego serwera wirtualnego.
SERVER_PORT
Port na serwerze uywany do komunikacji przez serwer WWW. Domylnie jest to 80, jeeli wykorzystane
jest SSL jest to port zdefiniowany do uycia przez bezpieczny HTTP.
SERVER_SIGNATURE
Cig zawierajcy wersj serwera i nazw serwera wirtualnego, ktry jest dodawany do stron
wygenerowanych przez serwer, o ile opcja ta jest aktywna.

PATH_TRANSLATED
cieka w systemie plikw (a nie wzgldem gwnego katalogu dokumentw) do biecego skryptu, po
dokonaniu przeksztace ze cieek wirtualnych na rzeczywiste.
SCRIPT_NAME
Zawiera ciek do biecego skryptu. Jest to uyteczna zmienna dla skryptw wskazujcych na samych
siebie.
REQUEST_URI
Adres URI uyty do dostpu do biecej strony, na przykad, /index.html.
Zmienne rodowiska
Zmienne te s importowane do przestrzeni nazw globalnych ze rodowiska, w ktrym jest uruchamiany
analizator PHP. Wiele z nich zaley od rodzaju powoki, a poniewa PHP dziaa na wielu systemach i rnych
rodzajach powok, zdefiniowanie kompletnej listy jest niemoliwe. Naley odszuka tak list w dokumentacji
swojego systemu. Zmienne rodowiska zawieraj zmienne CGI, ktre zamieszczane s niezalenie od tego, czy
PHP dziaa jako modu serwera, czy jako program CGI.
Zmienne PHP
Zmienne te s tworzone przez PHP. Zmienne $HTTP_*_VARS s dostpne jedynie wtedy, gdy wczona jest
opcja konfiguracji track_vars. Od PHP 4.0.3 track_vars jest zawsze wczone, niezalenie od ustawienia w pliku
konfiguracyjnym.
Jeeli ustawiona jest dyrektywa register_globals, zmienne te bd dostpne w globalnej przestrzeni
zmiennych, oprcz wartoci w tablicach $HTTP_*_VARS. Funkcja ta powinna by uywana rozwanie i wyczana o
ile jest to moliwe. Tablice $HTTP_*_VARS s bezpieczne, a ich globalne odpowiedniki s czsto nadpisywane
przez wartoci wprowadzone przez uytkownika, co czsto powoduje trudne do znalezienia bdy. Jeeli nie
moesz wyczy opcji register_globals, musisz si upewni, e uywane dane s bezpieczne.
argv
Tablica argumentw przekazanych do skryptu. Gdy skrypt jest uruchomiony z linii komend, pozwala to na
dostp do argumentw tak samo jak w jzyku C. Jeeli skrypt jest uruchamiany za pomoc metody GET, zmienna
zawiera cig zapytania.
argc
Zawiera ilo parametrw przekazanych do skryptu (jeeli jest on uruchomiony z linii polece).
PHP_SELF
Nazwa pliku z wykonywanym skryptem, zapisana wzgldem gwnego katalogu dokumentw. Jeeli PHP
jest uruchomiony z linii polece, zmienna ta nie jest dostpna.
HTTP_COOKIE_VARS
Tablica asocjacyjna ze zmiennymi przekazanymi do biecego skryptu poprzez cookie HTTP.
HTTP_GET_VARS
Tablica asocjacyjna ze zmiennymi przekazanymi do biecego skryptu za pomoc metody GET.
HTTP_POST_VARS
Tablica asocjacyjna ze zmiennymi przekazanymi do biecego skryptu za pomoc metody POST.
PHP Kompendium wiedzy
369

Dodatek B. Predefiniowane zmienne i stae PHP
370
HTTP_POST_FILES
Tablica asocjacyjna z informacjami na temat plikw przesanych za pomoc metody POST. Zmienna
$HTTP_POST_FILES jest dostpna w PHP od wersji 4.0.0.
HTTP_ENV_VARS
Tablica asocjacyjna ze zmiennymi przekazanymi do biecego skryptu poprzez rodowisko.
HTTP_SERVER_VARS
Tablica asocjacyjna ze zmiennymi przekazanymi do biecego skryptu z serwera HTTP. Zmienne te s
analogiczne do opisanych wczeniej zmiennych Apache.
Stae
__FILE__
Nazwa analizowanego wanie skryptu. Jeeli zostaa w doczanym pliku, zwracana jest nazwa tego pliku
a nie pliku gwnego.
__LINE__
Numer wiersza w biecym skrypcie. Jeeli zostaa w doczanym pliku, zwracany jest numer wiersza w
tym pliku.
PHP_VERSION
Cig zawierajcy wersj uywanego analizatora PHP, na przykad, 3.0.8-dev.
PHP_OS
Nazwa systemu operacyjnego, na ktrym dziaa analizator PHP, na przykad Linux.
TRUE
Warto logiczna prawda.
FALSE
Warto logiczna fasz.
E_ERROR
Oznacza bd inny ni bd skadni, gdzie nie jest moliwe kontynuowanie wykonania.
E_WARNING
Oznacza sytuacj, gdy PHP wykrywa bd, ale mimo to kontynuuje wykonywanie skryptu. Moe by on
przechwycony przez skrypt. Przykadem moe by nieprawidowy wzorzec w funkcji ereg().
E_PARSE
Analizator napotka bd skadni. Praca jest przerywana.
E_NOTICE
Sytuacja nieprawidowa, ktra moe, ale nie musi by bdna. Skrypt jest dalej wykonywany. Przykadem
moe by uycie cigu bez apostrofw jako indeks w tablicy asocjacyjnej lub skorzystanie z niezainicjowanej
zmiennej.

E_ALL
Wszystkie stae E_*. Jeeli zostanie uyta w funkcji error_reporting(), powoduje raportowanie
wszystkich problemw napotkanych przez PHP.
PHP Kompendium wiedzy
371
Dodatek C. Opcje kompilacji PHP
Bazy danych
--with-adabas[=DIR]
Docz obsug Adabas D. DIR jest katalogiem gdzie zostaa zainstalowana baza Adabas, domylnie
/usr/local.
--enable-dba=shared
Buduj DBA jako obiekt wspdzielony.
--enable-dbase
Docz wbudowan bibliotek dbase. Nie potrzebne s zewntrzne biblioteki.
--with-db2[=DIR]
Docz obsug Berkeley DB2.
--with-db3[=DIR]
Docz obsug Berkeley DB3.
--with-dbm[=DIR]
Docz obsug DBM.
--with-dbmaker[=DIR]
Docz obsug DBMaker. DIR to katalog instalacji programu DBMaker domylnie tam, gdzie zostaa
zainstalowana najnowsza wersja DBMaker (np. /home/dbmaker/3.6).
--with-empress[=DIR]
Docz obsug Empress. DIR to katalog instalacji Empress, domylnie $EMPRESSPATH.
--enable-filepro
Docz wbudowan obsug filePro (tylko do odczytu). Nie potrzebne s zewntrzne biblioteki.
--with-gdbm[=DIR]
Docz obsug GDBM
--with-hyperwave
Docz obsug Hyperwave
--with-ibm-db2[=DIR]
Docz obsug IBM DB2. DIR to katalog instalacji DB2, domylnie /home/db2inst1/sqllib.

--with-informix[=DIR]
Docz obsug Informix. DIR to katalog gdzie zosta zainstalowany Informix. Brak wartoci domylnej.
--with-ingres[=DIR]
Docz obsug Ingres II. DIR to katalog instalacji programu Ingres, domylnie /II/ingres.
--with-interbase[=DIR]
Docz obsug InterBase. DIR to katalog instalacji programu InterBase, domylnie /usr/interbase.
--with-ldap[=DIR]
Docz obsug LDAP. DIR to katalog instalacji LDAP. Parametr ten docza obsug protokou LDAP
(Lightweight Directory Access Protocol). DIR to katalog instalacji LDAP, domylnie /usr/local/ldap.
--with-msql[=DIR]
Docz obsug mSQL. Parametrem tej opcji jest katalog instalacji mSQL, domylnie /usr/local/Hughes.
Jest to domylne miejsce instalacji dystrybucji mSQL 2.0. Skrypt configure automatycznie wykrywa ktra wersja
mSQL jest zainstalowana PHP obsuguje obie wersje, 1.0 i 2.0, ale jeli skompilujesz PHP z mSQL 1.0,
moesz korzysta tylko z baz danych mSQL 1.0 i odwrotnie. Patrz take: Dyrektywy konfiguracji mSQL w
dodatku D.
--with-mysql[=DIR]
Docz obsug MySQL. DIR to katalog instalacji MySQL. Jeli nie zostanie podany, uyte zostan
wbudowane biblioteki MySQL. Ta opcja jest domylnie wczona. Patrz take: Dyrektywy konfiguracji MySQL
w dodatku D.
--with-ndbm[=DIR]
Docz obsug NDBM.
--with-oci8[=DIR]
Docz obsug Oracle-oci8. Domylnie DIR to $ORACLE_HOME.
--with-oracle[=DIR]
Docz obsug bazy danych Oracle-oci7. Domylnie DIR to $ORACLE_HOME. Zostao ono przetestowane i
powinno dziaa przynajmniej z wersjami Oracle 7.0 do 7.3. Parametrem jest katalog ORACLE_HOME. Nie
musisz podawa tego parametru, jeli skonfigurowane zostao rodowisko Oracle.
--with-pgsql[=DIR]
Docz obsug PostgreSQL. DIR to katalog instalacji PostgreSQL, domylnie /usr/local/pgsql. Ustaw
DIR na shared aby zbudowa jako obiekt doczany dynamicznie (dl), lub shared,DIR aby zbudowa jako dl i
jednoczenie poda DIR.
--with-solid[=DIR]
Docz obsug Solid. DIR to katalog instalacji Solid, domylnie /usr/local/solid.
--with-sybase-ct[=DIR]
Docz obsug Sybase-CT. DIR to katalog domowy Sybase, domylnie /home/sybase.
--with-sybase[=DIR]
Docz obsug Sybase-DB. DIR to katalog domowy Sybase, domylnie /home/sybase.
PHP Kompendium wiedzy
373

Dodatek C. Opcje kompilacji PHP
374
Docz obsug Velocis. DIR to katalog instalacji Velocis, domylnie /usr/local/velocis.
--with-openlink[=DIR]
Docz obsug OpenLink ODBC. DIR to katalog instalacji OpenLink, domylnie /usr/local/openlink.
--with-iodbc[=DIR]
Docz obsug iODBC. DIR jest to katalog instalacji iODBC, domylnie /usr/local. Ta opcja zostaa
stworzona dla iODBC Driver Manager, darmowo rozpowszechnianego menedera sterownikw ODBC, ktry
dziaa na rnych odmianach Uniksa.
--with-custom-odbc[=DIR]
Docza obsug niestandardowej biblioteki ODBC. Parametrem jest gwny katalog biblioteki, domylnie
/usr/local. Ta opcja jest uywana tylko, gdy zdefiniowae CUSTOM_ODBC_LIBS przy uruchomieniu skryptu
configure. Niezbdne jest take wstawienie prawidowego pliku odbc.h na ciek include. Jeli nie posiadasz
takiego pliku, stwrz go i docz stamtd swj wasny nagwek. Nagwek taki moe wymaga pewnych
definicji zwaszcza, jeli jest to biblioteka wieloplatformowa. Zdefiniuj je w CFLAGS. Moesz na przykad uywa
Sybase SQL Anywhere na QNX w nastpujcy sposb:
CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc" ./configure --with-custom-
odbc=/usr/lib/sqlany50
--with-unixODBC[=DIR]
Docz obsug unixODBC. DIR to katalog instalacji unixODBC, domylnie /usr/local.
--with-velocis[=DIR]
Handel elektroniczny
--with-ccvs[=DIR]
Docza do PHP4 obsug CCVS. DIR to katalog instalacji CCVS.
--with-cybercash[=DIR]
Docza obsug CyberCash. DIR to katalog instalacji CyberCash MCK.
--with-pfpro[=DIR]
Docz obsug Verisign Payflow Pro.
Grafika
--enable-freetype-4bit-antialias-hack
Docz obsug FreeType2 (eksperymentalne).
--with-gd[=DIR]
Docz obsug GD (DIR to katalog instalacji GD). Ustaw DIR jako shared aby zbudowa rozszerzenie
jako modu wspdzielony, lub shared,DIR aby zbudowa rozszerzenie jako modu i jednoczenie poda DIR.
--without-gd
Wycz obsug GD.

--with-jpeg-dir[=DIR]
Katalog jpeg dla pdflib 3.x.
--with-png-dir[=DIR]
Katalog png dla pdflib 3.x.
--with-t1lib[=DIR]
Docz obsug T1lib.
--with-tiff-dir[=DIR]
Katalog tiff dla pdflib 3.x.
--with-ttf[=DIR]
Docz obsug FreeType.
--with-xpm-dir[=DIR]
Katalog xpm dla gd-1.8+.
Rne
--disable-libtool-lock
Unikaj blokowania (moe to przerwa rwnolege budowanie).
--disable-pear
Nie instaluj PEAR.
--disable-pic
Wycz PIC dla obiektw wspdzielonych.
--disable-posix
Wycz funkcje POSIX.
--disable-rpath
Wycz przekazywanie dodatkowych cieek poszukiwania bibliotek.
--disable-session
Wycz obsug sesji.
--enable-bcmath
Kompiluj z funkcjami matematycznymi o dowolnej dokadnoci. Przeczytaj plik README-BCMATH aby
uzyska informacje na temat sposobu instalacji tego moduu. Funkcje te pozwalaj operowa na liczbach
wykraczajcych poza zakresy dozwolone przez zwyke liczby stao i zmiennoprzecinkowe.
--enable-c9x-inline
Wcz semantyk C9x-inline.
PHP Kompendium wiedzy
375

Dodatek C. Opcje kompilacji PHP
376
--enable-calendar
Wcz obsug konwersji kalendarza.
--enable-debug
Kompiluj z symbolami dla debuggera.
--enable-discard-path
Jeli ta opcja zostanie wczona, pliki programu CGI PHP mog by bezpiecznie umieszczone poza
drzewem serwera WWW i uytkownicy nie bd mogli obchodzi zabezpiecze .htaccess.
--enable-dmalloc
Wcz dmalloc.
--enable-exif
Wcz obsug exif.
--enable-experimental-zts
Ta opcja najprawdopodobniej przerwie proces kompilacji.
--enable-fast-install[=PKGS]
Optymalizacja dla szybkiej instalacji (domylnie yes).
--enable-force-cgi-redirect
Wcz sprawdzanie bezpieczestwa dla wewntrznych przekierowa serwera. Powiniene uy tej opcji,
jeli uywasz wersji CGI z serwerem Apache.
--enable-inline-optimization
Jeli masz duo pamici i uywasz gcc moesz sprbowa wczy t opcj.
--enable-libgcc
Wcz jawne czenie z libgcc.
--enable-maintainer-mode
Wcz reguy i zalenoci programu make nie przydatne (i czasem niejasne) dla zwykego uytkownika.
--enable-memory-limit
Kompiluj z obsug limitowania pamici.
--enable-safe-mode
Wcz prac w trybie bezpiecznym.
--enable-satellite
Wcz obsug CORBA przez Satellite (wymaga ORBit).
--enable-shared[=PKGS]
Buduj biblioteki wspdzielone (domylnie yes).

--enable-sigchild
Wcz obsug SIGCHLD przez PHP.
--enable-static[=PKGS]
Buduj statyczne biblioteki (domylnie yes).
--enable-sysvsem
Wcz obsug semaforw dla System V.
--enable-sysvshm
Wcz obsug pamici wspdzielonej dla System V.
--enable-trans-sid
Wcz przezroczyste propagowanie identyfikatora sesji.
--with-cdb[=DIR]
Docz obsug CDB.
--with-config-file-path=PATH
Ustawia ciek gdzie powinien si znajdowa plik php.ini. Domylnie /usr/local/lib.
--with-cpdflib[=DIR]
Docz obsug cpdflib (wymaga cpdflib >= 2). DIR to katalog instalacji cpdflib, domylnie /usr.
--with-esoob[=DIR]
Docz obsug Easysoft OOB. DIR to katalog instalacji OOB, domylnie /usr/local/easysoft/oob/client.
--with-exec-dir[=DIR]
W trybie bezpiecznym pozwl na uruchamianie plikw wykonywalnych tylko w DIR, domylnie
/usr/local/php/bin.
--with-fdftk[=DIR]
Docz obsug fdftk. DIR to katalog instalacji fdftk, domylnie /usr/local.
--with-gnu-ld
Za, e kompilator C uywa GNU ld [domylnie no]
--with-icap[=DIR]
Docz obsug ICAP.
--with-imap[=DIR]
Docz obsug protokou IMAP. DIR jest to katalog gdzie znajduj si pliki nagwkowe IMAP i plik c-
client.
--with-java[=DIR]
Docz obsug jzyka Java. DIR to katalog gdzie zainstalowane jest JDK. To rozszerzenie moe by
zbudowane tylko jako obiekt dynamicznie doczany (dl).
PHP Kompendium wiedzy
377

Dodatek C. Opcje kompilacji PHP
378
--with-kerberos[=DIR]
Docz obsug Kerberos w protokole IMAP.
--with-mcal[=DIR]
Docz obsug MCAL.
--with-mcrypt[=DIR]
Docz obsug mcrypt. DIR to katalog instalacji mcrypt.
--with-mhash[=DIR]
Docz obsug mhash. DIR to katalog gdzie zainstalowano mhash.
--with-mm[=DIR]
Docz obsug mm do przechowywania sesji.
--with-mod_charset
Wcz transfer tablic dla mod_charset (Rosyjski Apache).
--with-pdflib[=DIR]
Docz obsug pdflib 3.x/4.x. DIR to katalog instalacji pdflib, domylnie /usr/local.
--with-readline[=DIR]
Docz obsug readline. DIR to katalog instalacji readline.
--with-regex=TYPE
Typ biblioteki regex: system, apache, php.
--with-servlet[=DIR]
Docz obsug serwletw. DIR to katalog instalacji JSDK. To SAPI wymaga, aby rozszerzenie Java byo
zbudowane jako obiekt doczany dynamicznie.
--with-swf[=DIR]
Docz obsug swf.
--with-tsrm-pth[=pth-config]
Uyj GNU Pth.
--with-tsrm-pthreads
Uyj wtkw POSIX (domylnie).
--with-zlib-dir[=DIR]
Katalog zlib dla pdflib 3.x lub docz obsug zlib.
--with-zlib[=DIR]
Docz obsug zlib (wymaga zlib >= 1.0.9). DIR to katalog instalacji zlib, domylnie /usr.

--without-pcre-regex
Nie doczaj obsugi Perl Compatible Regular Expressions. Jeli nie chcesz uywa wbudowanej
biblioteki uyj opcji --with-pcre-regex=DIR, aby poda lokalizacj plikw nagwkowych i bibliotek.
Sie
--with-curl[=DIR]
Docz obsug CURL.
--enable-ftp
Wcz obsug FTP.
--disable-url-fopen-wrapper
Wycz wrapper adresw URL dla polecenia fopen(), ktry pozwala na dostp do plikw przez protokoy
HTTP lub FTP.
--with-mod-dav=DIR
Docz obsug DAV poprzez modu Apache mod_dav. DIR to katalog instalacji mod_dav (tylko jako modu
Apache).
--with-openssl[=DIR]
Docz obsug OpenSSL w SNMP.
--with-snmp[=DIR]
Docz obsug SNMP. DIR to katalog instalacji SNMP, domylnie przeszukuje wiele czstych lokalizacji
instalacji snmp. Ustaw DIR na shared aby zbudowa jako obiekt dynamicznie doczany (dl), lub shared,DIR aby
zbudowa jako dl i jednoczenie poda DIR.
--enable-ucd-snmp-hack
Wcz poprawk UCD SNMP.
--enable-sockets
Wcz obsug gniazd.
--with-yaz[=DIR]
Docz obsug YAZ (ANSI/NISO Z39.50). DIR to katalog instalacji YAZ.
--enable-yp
Docz obsug YP.
Dziaanie PHP
--enable-magic-quotes
Wcz domylne magic quotes.
PHP Kompendium wiedzy
379

Dodatek C. Opcje kompilacji PHP
380
--disable-short-tags
Wycz moliwo uywania krtkiej formy znacznikw otwierajcych <?.
Serwer
--with-aolserver-src=DIR
Okrel ciek do rdowej dystrybucji AOLserver.
--with-aolserver=DIR
Okrel ciek do zainstalowanego AOLserver.
--with-apache[=DIR]
Zbuduj modu Apache. DIR to katalog bazowy Apache, domylnie /usr/local/etc/httpd.
--with-apxs[=FILE]
Zbuduj modu wspdzielony Apache. FILE to opcjonalna cieka do narzdzia apxs z pakietu Apache,
domylnie apxs.
--enable-versioning
Eksportuj tylko wymagane symbole. Przejrzyj plik INSTALL, aby uzyska wicej informacji.
--with-fhttpd[=DIR]
Buduj modu fhttpd. DIR to katalog ze rdami fhttpd, domylnie /usr/local/src/fhttpd.
--with-nsapi=DIR
Okrel ciek do zainstalowanego Netscape.
--with-pi3web=DIR
Buduj PHP jako modu dla Pi3Web.
--with-roxen=DIR
Buduj PHP jako modu Pike. DIR to katalog instalacji Roxen, zazwyczaj /usr/local/roxen/server.
--enable-roxen-zts
Buduj modu Roxen uywajc Zend Thread Safety ( bezpieczne wtki Zend).
--with-zeus=DIR
Buduj PHP jako modu ISAPI do uycia z Zeus.
Tekst i jzyk
--with-aspell[=DIR]
Docz obsug ASPELL.

--with-gettext[=DIR]
Docz obsug GNU gettext. DIR to katalog instalacji gettext, domylnie /usr/local.
--with-pspell[=DIR]
Docz obsug PSPELL.
--with-recode[=DIR]
Docz obsug redcode. DIR to katalog instalacji redcode.
XML
--with-dom[=DIR]
Docz obsug DOM (wymaga libxml >= 2.0). DIR to katalog instalacji libxml, domylnie /usr.
--enable-sablot-errors-descriptive
Wcz bdy opisowe.
--with-sablot[=DIR]
Docz obsug Sablotron.
--enable-wddx
Wcz obsug WDDX.
--disable-xml
Wycz obsug wbudowanej biblioteki XML expat.
PHP Kompendium wiedzy
381
Dodatek D. Opcje konfiguracji PHP
Oglne dyrektywy konfiguracji
allow_url_fopen boolean
Ta opcja wcza interfejsy do funkcji fopen rozpoznajce adresy URL, pozwalajce na dostp do obiektw
URL jak do plikw. Domylne interfejsy pozwalaj na dostp do zdalnych plikw korzystajc z protokow ftp
lub http. Niektre rozszerzenia, takie jak zlib, mog rejestrowa dodatkowe interfejsy. Dyrektywa ta zostaa
wprowadzona zaraz po wyjciu wersji 4.0.3. Dla wersji 4.0.3 i wyszych moesz wyczy t opcj w czasie
kompilacji uywajc przecznika --disable-url-fopen-wrapper.
asp_tags boolean
Wcza moliwo uycia znacznikw ASP (<% %>) razem z normalnymi znacznikami (<?php ?>).
Dotyczy to take skrtowego wywietlania wartoci zmiennych typu <%= $value %>. Obsuga znacznikw ASP
zostaa dodana w wersji 3.0.4.
auto_append_file string
Okrela nazw pliku, ktry jest automatycznie przetwarzany po gwnym pliku. Plik jest doczany tak,
jakby zosta doczony funkcj include(), a wic uywana jest opcja include_path. Specjalna warto none
wycza automatyczne doczanie. Jeli skrypt zostanie zakoczony przez exit(), nie dojdzie do doczenia.
auto_prepend_file string
Okrela nazw pliku, ktry bdzie automatycznie przetwarzany przed gwnym plikiem. Plik jest
doczany tak, jakby wywoana bya funkcja include(), a wic uywana jest opcja include_path. Specjalna
warto none wycza automatyczne poprzedzanie pliku.
cgi_ext string
display_errors boolean
Okrela, czy bdy powinny by wywietlane jako cz wynikowego kodu HTML czy nie.
doc_root string
Gwny katalog PHP na serwerze. Uywane tylko, jeli jest to cig niepusty. Jeli PHP jest
skonfigurowane do pracy w trybie bezpiecznym, pliki spoza tego katalogu nie bd udostpniane.
engine boolean
Ta dyrektywa jest przydatna tylko przy pracy z PHP w postaci moduu Apache. Jest ona uywana na
witrynach, w ktrych chce si wcza i wycza analizowanie plikw PHP na podstawie katalogu lub na
podstawie nazwy serwera wirtualnego. Umieszczajc engine off we waciwych miejscach pliku httpd.conf PHP
moe by aktywne lub nieaktywne.

error_log string
Nazwa pliku, gdzie maj by zapisywane bdy. Jeli uyta jest specjalna warto syslog, bdy wysyane
s do dziennika systemowego. W systemach Unix oznacza to syslog(3) a na Windows NT, dziennik zdarze.
Dziennik systemowy nie jest obsugiwany przez Windows 95.
error_reporting integer
Ustaw poziom raportowania. Wicej szczegw znajduje si przy opisie funkcji error_reporting().
open_basedir string
Ogranicz pliki, ktre mog by otwierane przez PHP do podanego drzewa katalogw. Jeli skrypt prbuje
otworzy plik, np. przez funkcje fopen() lub gzopen(), sprawdzane jest pooenie pliku. Jeeli plik znajduje si
poza podanym drzewem katalogw, PHP odmawia otwarcia takiego pliku. Wszystkie dowizania symboliczne s
rozwizywane, wic nie jest moliwe ominicie tego ograniczenia przez cza symboliczne. Warto specjalna
. wskazuje, e katalog w ktrym znajduje si skrypt bdzie uznawany jako katalog bazowy dla tej dyrektywy.
W systemie Windows, katalogi oddzielaj rednikami. Na wszystkich innych systemach, oddzielaj katalogi
dwukropkami. Jeeli PHP pracuje jako modu Apache, cieki open_basedir katalogw nadrzdnych s
automatycznie dziedziczone. Obsuga dla wielu katalogw zostaa dodana w 3.0.7. Domylnie PHP pozwala na
otwieranie wszystkich plikw.
gpc_order string
Ustaw kolejno analizowania zmiennych GET, POST i COOKIE. Domylne ustawienie do GPC. Ustawienie tej
dyrektywy np. na GP spowoduje, e PHP bdzie cakowicie ignorowa cookie i przebija wszystkie zmienne
otrzymane metod GET zmiennymi o tej samej nazwie otrzymanymi metod POST.
ignore_user_abort string
Domylnie wczona. Jeli zostanie zmieniona na Off, skrypty bd przerywane, jak tylko bd prboway
wysa co do klienta, ktry przerwa poczenie. Patrz rwnie: ignore_user_abort().
include_path string
Okrela list katalogw, gdzie funkcje require(), include() i fopen_with_path() bd szukay plikw.
Format jest podobny do zmiennej rodowiskowej PATH: lista katalogw oddzielona dwukropkiem na systemach
Unix lub rednikiem na systemach Windows. Domyln wartoci tej dyrektywy jest . (tylko biecy katalog).
isapi_ext string
log_errors boolean
Ustawia czy komunikaty o bdach skryptu maj by zapisywane do dziennika bdw serwera. W
zwizku z tym ta opcja jest specyficzna dla poszczeglnych serwerw.
magic_quotes_gpc boolean
Ustawia stan magic_quotes dla operacji GPC (GET, POST, COOKIE). Jeli magic_quotes s wczone,
wszystkie znaki ' (apostrof), " (cudzysw), \ (lewy ukonik) i znaki NULL s zamieniane na sekwencje sterujce
przez dodanie przed te znaki znaku \. Jeli wczona jest take dyrektywa magic_quotes_sybase, wszystkie
apostrofy s zamieniane na sekwencje sterujce przez dodanie apostrofu zamiast znaku \.
magic_quotes_runtime boolean
Jeli wczona jest dyrektywa magic_quotes_runtime, wikszo funkcji, ktre zwracaj dane z dowolnych
zewntrznych rde, wczajc w to bazy danych i pliki tekstowe, bdzie zwracaa dane z apostrofami i
cudzysowami zamienionymi na sekwencje sterujce przy pomocy znaku \. Jeli wczona jest take opcja
magic_quotes_sybase, apostrof bd zamieniany na sekwencj strujc przy pomocy apostrofu zamiast znaku \.
PHP Kompendium wiedzy
383

Dodatek D. Opcje konfiguracji PHP
384
magic_quotes_sybase boolean
Jeli wczona jest opcja magic_quotes_sybase, apostrof bdzie zamieniany na sekwencj sterujc
uywajc apostrofu zamiast znaku \, jeli wczona jest opcja magic_quotes_gpc i (lub) magic_quotes_runtime.
max_execution_time integer
Dyrektywa to okrela maksymalny czas w sekundach wykonywania skryptu, zanim zostanie przerwany
przez analizator. Pomaga to w zapobieganiu blokowania serwera przez le napisane skrypty. Domylne
ustawienie to 30.
memory_limit integer
Dyrektywa ta ustawia maksymaln wielko pamici w bajtach, ktr skrypt moe sobie przydzieli.
Pomaga to w zapobieganiu przydzieleniu caej dostpnej pamici serwera przez le napisane skrypty.
nsapi_ext string
register_globals boolean
Ustala, czy rejestrowa zmienne rodowiska, GET, POST, Cookie, i serwera jako zmienne globalne. Moesz
wyczy t opcj, jeli nie chcesz zamieci globalnej przestrzeni zmiennych swoich skryptw przez dane
uytkownika. Ma to najwikszy sens, jeli uywane jest w poczeniu z opcj track_vars w takim przypadku
do zmiennych EGCPS moliwy jest przez zmienne globalne $HTTP_ENV_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS,
$HTTP_COOKIE_VARS, i $HTTP_SERVER_VARS.
short_open_tag boolean
Ustala, czy dozwolona jest skrcona forma znacznika otwierajcego PHP (<? ?>). Jeli chcesz uywa
PHP w poczeniu z XML, powiniene wyczy t opcj. Jeli ta opcja jest wyczona, musisz uywa dugiej
postaci znacznika otwierajcego. (<?php ?>).
sql.safe_mode boolean
track_errors boolean
Jeli dyrektywa ta jest wczona, ostatni komunikat bdu bdzie dostpna jako zmienna globalna
$php_errormsg.
track_vars boolean
Jeli ta dyrektywa jest wczona, zmienne rodowiska, GET, POST, Cookie i serwera bd dostpne w
globalnych tablicach asocjacyjnych $HTTP_ENV_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS i
$HTTP_SERVER_VARS. Zauwa, e od PHP 4.0.3 dyrektywa track_vars jest zawsze wczona.
upload_tmp_dir string
Katalog tymczasowy uywany do przechowywania plikw podczas obsugiwania przesyania plikw.
Musi by to katalog z prawem zapisu dla uytkownika, jako ktry pracuje PHP.
user_dir string
Podstawowa nazwa katalogu uywanego jako katalog domowy uytkownika dla plikw PHP, na przykad
public_html.
warn_plus_overloading boolean
Jeli dyrektywa ta jest wczona, PHP bdzie wywietla ostrzeenie, jeli operator plus (+) zosta uyty na
cigach. Dziki temu atwiej jest znale skrypty, ktre wymagaj uycia operatora sklejania cigw (.).

Dyrektywy konfiguracji poczty
SMTP string
Nazwa DND lub adres IP serwera SMTP, ktrego powinien uy PHP dla Windows podczas wysyania
poczty za pomoc funkcji mail().
sendmail_from string
Pole From: (adres nadawcy) przesyek pocztowych wysyanych z PHP dla Windows.
sendmail_path string
Katalog w ktrym znajduje si sendmail, zwykle /usr/sbin/sendmail lub /usr/lib/sendmail. Skrypt
configure prbuje samodzielnie odszuka ten program i ustawi warto domyln, ale jeeli nie uda si to,
mona j samodzielnie ustawi. Systemy nie korzystajce z sendmail powinny ustawi t opcj dla jego
odpowiednika w zainstalowanym systemie poczty. Na przykad: uytkownicy Qmail zwykle ustawiaj j na
/var/qmail/bin/sendmail.
Dyrektywy konfiguracji trybu bezpiecznego
safe_mode boolean
Okrela, czy PHP ma pracowa w trybie bezpiecznym.
safe_mode_exec_dir string
Jeli PHP pracuje w trybie bezpiecznym, funkcje system() i inne wywoujce inne programy, odmwi
wykonania programw z katalogw innych ni podany.
Dyrektywy konfiguracji debuggera
debugger.host string
Nazwa lub adres IP komputera uywanego przez debugger.
debugger.port string
Numer portu uywany przez debugger.
debugger.enabled boolean
Okrela, czy debugger jest wczony.
Dyrektywy adowania rozszerze
enable_dl boolean
PHP Kompendium wiedzy
385
Ta dyrektywa jest jedynie przydatna przy pracy PHP jako modu Apache. Moesz wcza i wycza
moliwo dynamicznego adowania rozszerze PHP przez funkcj dl() zalenie od katalogu lub serwera
wirtualnego. Gwnym powodem wyczania dynamicznego adowania rozszerze jest kwestia bezpieczestwa.
Uywajc dynamicznych rozszerze moliwe jest ominicie praktycznie wszystkich ogranicze safe_mode i
open_basedir. Domylnie zezwalane jest dynamiczne adowanie, z wyjtkiem pracy w trybie bezpiecznym. W
trybie bezpiecznym korzystanie z funkcji dl() jest zawsze zabronione.

Dodatek D. Opcje konfiguracji PHP
386
extension_dir string
Katalog, w ktrym PHP szuka dynamicznie doczanych rozszerze.
extension string
Ktre dynamicznie adowane rozszerzenia adowa przy starcie PHP.
Dyrektywy konfiguracji MySQL
mysql.allow_persistent boolean
Czy pozwala na trwae poczenia MySQL (persistent connections).
mysql.default_host string
Domylny adres serwera, ktry bdzie uywany przy czeniu si z serwerem baz danych, jeli nie
zostanie podany aden inny adres.
mysql.default_user string
Domylna nazwa uytkownika, ktra bdzie uywana przy czeniu si z serwerem baz danych, jeli nie
zostanie podana adna inna nazwa.
mysql.default_password string
Domylne haso, ktre bdzie uyte przy czeniu si z serwerem baz danych, jeli nie zostanie podane
adne inne haso.
mysql.max_persistent integer
Maksymalna liczba staych pocze MySQL na kady proces.
mysql.max_links integer
Maksymalna liczba pocze MySQL na proces, wliczajc w to poczenia stae.
Dyrektywy konfiguracji mSQL
msql.allow_persistent boolean
Czy pozwala na trwae poczenia mSQL.
msql.max_persistent integer
Maksymalna liczba trwaych pocze mSQL na kady proces.
msql.max_links integer
Maksymalna liczba pocze mSQL na kady proces, wliczajc w to poczenia trwae.
Dyrektywy konfiguracji PostgreSQL
pgsql.allow_persistent boolean
Czy pozwala na trwae poczenia PostgreSQL.

pgsql.max_persistent integer
Maksymalna liczba trwaych pocze PostgreSQL na kady proces.
pgsql.max_links integer
Maksymalna liczba pocze PostgreSQL na kady proces, wliczajc w to poczenia trwae.
Dyrektywy konfiguracji Sybase
sybase.allow_persistent boolean
Czy pozwala na trwae poczenia Sybase.
sybase.max_persistent integer
Maksymalna liczba trwaych pocze Sybase na kady proces.
sybase.max_links integer
Maksymalna liczba pocze Sybase na kady proces, wliczajc w to poczenia trwae.
Dyrektywy konfiguracji Sybase-CT
sybct.allow_persistent boolean
Czy pozwala na trwae poczenia Sybase-CT. Domylnie wczone.
sybct.max_persistent integer
Maksymalna liczba trwaych pocze Sybase-CT na kady proces. Domyl wartoci jest -1, co oznacza
brak limitu.
sybct.max_links integer
Maksymalna liczba pocze Sybase-CT na proces, wczajc w to poczenia trwae. Domylna warto
to -1, co oznacza brak limitu.
sybct.min_server_severity integer
Wiadomoci serwera z wag wiksz lub rwn sybct.min_server_severity bd zgaszane jako
ostrzeenia. Warto ta moe by zmieniona take przez wywoanie sybase_min_server_severity(). Domylna
warto to 10, co powoduje raportowanie bdw o wadze informacja lub wikszej.
sybct.min_client_severity integer
Wiadomoci biblioteki klienta o wadze wiksz lub rwn sybct.min_client_severity bd zgaszane
jako bdy. Warto ta moe by zmieniona take przez wywoanie sybase_min_client_severity(). Domylna
warto to 10, co praktycznie wycza zgaszanie bdw.
sybct.login_timeout integer
Maksymalny czas oczekiwania na poczenie zanim zwrcony bdzie bd. Zauwa, e jeli dojdzie do
skoczenia czasu max_execution_time w trakcie oczekiwania na poczenie, twj skrypt zostanie zakoczony
zanim bdzie mg podj jakiekolwiek dziaania wywoywane w przypadku nieudanego poczenia. Domylna
warto to jedna minuta.
PHP Kompendium wiedzy
387

Dodatek D. Opcje konfiguracji PHP
388
sybct.timeout integer
Maksymalny czas (w sekundach) oczekiwania na wykonanie select_db lub zapytania, po ktrym
zwrcony zostanie bd. Zauwa, e jeli dojdzie do skoczenia czasu max_execution_time w trakcie oczekiwania
na poczenie, twj skrypt zostanie zakoczony zanim bdzie mg podj jakiekolwiek dziaania obsugujce
bdy wykonania. Domylnie nie ma adnych ogranicze.
sybct.hostname string
Nazwa komputera, ktry bdzie wywietlany w sp_who. Domyln wartoci jest pusty cig.
Dyrektywy konfiguracji Informix
ifx.allow_persistent boolean
Czy pozwala na trwae poczenia Informix.
ifx.max_persistent integer
Maksymalna liczba trwaych pocze Informix na kady proces.
ifx.max_links integer
Maksymalna liczba pocze Informix na kady proces, wczajc w to poczenia trwae.
ifx.default_host string
Domylny adres komputera uywany, jeli nie podano innego w ifx_connect() lub ifx_pconnect().
ifx.default_user string
Domylny identyfikator uytkownika uywany, jeli nie podano innego w ifx_connect() lub
ifx_pconnect().
ifx.default_password string
Domylne haso uywane jeli nie podano innego w ifx_connect() lub ifx_pconnect().
ifx.blobinfile boolean
Ustaw na TRUE jeli chcesz zwraca kolumny blob do pliku, lub FALSE jeli do pamici. Moesz zmieni
warto tej dyrektywy korzystajc z ifx_blobinfile_mode().
ifx.textasvarchar boolean
Ustaw na TRUE jeli chcesz w zapytaniach zwraca kolumny TEXT jako zwyke cigi, lub FALSE jeli
chcesz uywa identyfikatorw blob. Moesz zmieni warto tej dyrektywy korzystajc z ifx_textasvarchar().
ifx.byteasvarchar boolean
Ustaw na TRUE jeli chcesz w zapytaniach zwraca kolumny BYTE jak zwyke cigi, lub FALSE jeli chcesz
uywa identyfikatorw blob. Moesz zmieni warto tej dyrektywy korzystajc z ifx_textasvarchar().
ifx.charasvarchar boolean
Ustaw na TRUE jeli chcesz obcina pocztkowe spacje z kolumn CHAR przy ich pobieraniu.

ifx.nullformat boolean
Ustaw na TRUE jeli chcesz zwraca kolumny NULL jako cig "NULL", lub na FALSE jeli chcesz aby byy
zwracane jako pusty cig. Moesz zmieni warto tej dyrektywy korzystajc z ifx_nullformat().
Dyrektywy konfiguracji BC Math
bcmath.scale integer
Liczba dziesitnych cyfr dla wszystkich funkcji bcmath.
Dyrektywy konfiguracji moliwoci przegldarek
browscap string
Nazwa pliku opisujcego moliwoci przegldarek. Zobacz take get_browser().
Dyrektywy konfiguracji Zunifikowanego ODBC
uodbc.default_db string
rdo danych ODBC uywane jeli nie podane zostao inne w odbc_connect() lub odbc_pconnect().
uodbc.default_user string
Nazwa uytkownika uywana, jeli inna nie zostaa podana w odbc_connect() lub odbc_pconnect().
uodbc.default_pw string
Haso uywane, jeli inne nie zostao podane w odbc_connect() lub odbc_pconnect().
uodbc.allow_persistent boolean
Czy pozwala na trwaych poczenia ODBC.
uodbc.max_persistent integer
Maksymalna liczba trwaych pocze ODBC na kady proces.
uodbc.max_links integer
Maksymalna liczba pocze ODBC na kady proces, wczajc w to poczenia trwae.
PHP Kompendium wiedzy
389
Dodatek E. Zasoby Sieci
Podstawowym rdem wiedzy na temat PHP jest oficjalna witryna WWW dostpna pod adresem
http://www.php.net. Mona tam znale informacje na temat list wysykowych, innych interesujcych witryn oraz
kompletny podrcznik jzyka PHP. Ponisza tabela zawiera krtka list interesujcych witryn na temat PHP.
URL Opis
http://www.php4devguide.com/ Witryna powicona tek ksice. Zawiera
interesujce cza i poprawki do tej ksiki.
http://www.mysql.com/ Oficjalna witryna bazy danych MySQL.
http://phpbuilder.com/ wietna witryna zawierajca artykuy, przykadu
kodu inne informacje zwizane z programowaniem w PHP.
http://www.thewebmasters.net/ Witryna FastTemplate i innych bibliotek klas
uywanych w tej ksice.
http://phplib.netuse.de/ Witryna powicona PHPLib, biblioteki klas
uywanych w tej ksice w niektrych przykadach
dotyczcych baz danych, sesji i autoryzacji.

You might also like