Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PHP4. Podrcznik
programisty
Autor: Sterling Hughes
Tumaczenie: Daniel Kaczmarek
ISBN: 83-7197-795-6
Tytu oryginau: PHP Developer's Cookbook
Format: B5, stron: 422
Przykady na ftp: 77 kB
Od teorii do praktyki prowadzi duga droga. Nie inaczej jest w przypadku PHP4,
popularnego jzyka sucego do tworzenia aplikacji WWW. Oficjalna dokumentacja
stanowi jedynie wstp w praktyce programista czsto staje wobec problemw,
ktrych rozwiza nie zawiera sam opis jzyka.
Ksika ta stanowi kombinacj podrcznika i instrukcji. Przedstawia treci, ktre nie
znalazy si w dokumentacji, a w wielu przypadkach znacznie t dokumentacj
rozszerza. Pomimo tego, e nie jest to kompletna instrukcja, staniesz si po jej lekturze
duo lepszym programist bdziesz mia solidne podstawy do rozwizywania
problemw programistycznych.
Opisano w niej:
Spis treci
O Autorach ...................................................................................... 13
Przedmowa...................................................................................... 15
Wprowadzenie ................................................................................. 19
Cz I
Spis treci
Cz II
Bazy danych.................................................................245
Rozdzia 12. Tworzenie API niezalenego od baz danych w PHP .......................... 247
12.0. Wprowadzenie........................................................................................................247
12.1. cznik ...................................................................................................................249
12.2. Modu MySQL .......................................................................................................251
12.3. Modu mSQL..........................................................................................................254
12.4. Modu Oracle..........................................................................................................256
12.5. Modu MSSQL.......................................................................................................258
12.6. Modu ODBC .........................................................................................................260
12.7. Modu PostgreSQL.................................................................................................261
12.8. Modu InterBase.....................................................................................................263
12.9. Modu Sybase.........................................................................................................265
Spis treci
10
Cz V
Spis treci
11
Dodatki .......................................................................................403
Dodatek A Instalacja PHP............................................................................... 405
Dodatek B Identyfikowanie i usuwanie usterek w PHP ..................................... 411
Najczstsze bdy i co one oznaczaj..............................................................................411
Techniki unikania bdw i usterek ................................................................................413
Skorowidz...................................................................................... 423
Rozdzia 10.
Utrzymywanie sesji
w PHP
Prawdziw sztuk pamici jest sztuka skupiania uwagi.
Samuel Johnson
W rozdziale tym poruszone zostan zagadnienia zwizane z utrzymywaniem stanu
procesem polegajcym na zachowywaniu wartoci zmiennych midzy wywoaniami kolejnych skryptw. Najpierw omwione zostan nowe mechanizmy zarzdzania sesjami w PHP4, po czym przejdziemy do czci powiconej niewielkiemu systemowi koszykw na zakupy. Nastpnie przyjrzymy si funkcjom serializacji w PHP
(w tym WDDX), ktre stanowi wydajny sposb przechowywania zmiennych PHP.
10.0. Wprowadzenie
HTTP jest protokoem bezstanowym, co oznacza, e po opuszczeniu przez uytkownika strony WWW lub zakoczeniu dziaania aplikacji komputer utraci wszelkie dane
dotyczce przeprowadzonych transakcji (chyba e oprzesz si na dziennikach zdarze
systemowych serwera WWW). Poczwszy od Netscape 3.0, firma Netscape rozwizywaa ten problem za pomoc cookies. Cookies to pliki przechowywane na komputerze uytkownika, dostpne dla skryptu, ktry je wysa. Umoliwiaj one zapisywanie
i odczytywanie informacji o ewentualnych wczeniejszych wizytach, ktre uytkownik odby na stronie WWW.
czc cookies i bazy danych, moesz zapisywa na swoim komputerze kady bit informacji posiadanych na temat uytkownika oraz odczytywa je, stosujc unikalny identyfikator przypisany temu uytkownikowi, przechowywany w cookie na jego komputerze.
Podejcie takie wymagao jednak znacznego nakadu pracy programistw, a uruchomienie
zabierao duo czasu. Dlatego aby uatwi Ci ycie, grupa zajmujca si rozwojem
PHP udostpnia cile zintegrowany zbir narzdzi sucych do zarzdzania sesjami.
208
To, co w kadym przypadku wymagao dotychczas od dwudziestu do stu wierszy kodu, teraz zajmuje co najwyej kilka wierszy dobrze przemylanego kodu rdowego.
Jak to dziaa?
Sesje dziaaj w nastpujcy sposb. W wyniku wywoania funkcji
lub
PHP aduje ze schowka sesji zapisane dane dotyczce sesji.
Podczas wykonywania skryptu moesz za pomoc funkcji
rejestrowa dane, ktre maj zosta zapisane w schowku sesji. W momencie zakoczenia
wykonywania skryptu PHP zmienne sesji zostaj zapisane w schowku sesji, ktrego
cieka wskazywana jest przez pozycj
w pliku php.ini. Przypisany
sesji unikalny identyfikator jest wstawiany do pliku cookie i wysyany do uytkownika,
ale to dzieje si tylko przy pierwszym uruchomieniu sesji.
Czasami serializacja
Jednym ze sposobw utrzymywania stanu jest zastosowanie moduu sesji. Jednak
w niektrych przypadkach nie bdziesz zmuszony korzysta ze wszystkich moliwoci
tego moduu wystarczy zapisywanie i odczytywanie pewnych zmiennych. W takiej
sytuacji moesz zastosowa udostpniane przez PHP funkcje serializacji (
i
) lub skorzysta z doczonego rozszerzenia WDDX, ktre zapisuje
zmienne PHP w standardowym formacie, przez co mog one by pniej odczytywane
i wykorzystywane przez inne jzyki.
Technika
Aby zarejestrowa zmienn sesji, zastosuj funkcj
:
Uwagi
W PHP istniej obecnie trzy typy zmiennych o rnym zasigu i speniajce rne cele.
Pierwszym typem zmiennej, majcym najmniejszy zasig, jest zmienna lokalna. Zmienne
209
W powyszym przykadzie zmienna ma zasig lokalny, a wic jej warto nie
jest dostpna spoza zasigu funkcji
.
Nastpnym typem zmiennej jest zmienna globalna, czyli kada zmienna zadeklarowana poza klas lub funkcj (lub zadeklarowana instrukcj albo za porednictwem tablicy ). Zmienne globalne istniej przez cay czas trwania skryptu.
Ostatnim typem zmiennej wprowadzonym w PHP4 jest zmienna sesji. Zmienna sesji
moe (teoretycznie) trwa wiecznie, chyba e Ty lub uytkownik j usuniecie (dziki
odpowiedniemu ustawieniu opcji konfiguracyjnych zmienne takie mog rwnie by
automatycznie usuwane po upywie pewnego czasu).
Tak wic zmienne sesji to po prostu zwyke zmienne zadeklarowane przy uyciu funkcji
. Zmienne te mog by dowolnego typu obsugiwanego przez PHP:
tablic, acuchem znakw, liczb, a nawet obiektem. Zachowanie
zaley od wartoci parametru konfiguracyjnego . Jeli wartoci
jest ,
zapisze zmienn globaln
w schowku sesji. Jeeli natomiast ma on warto , wykorzystana zostanie tablica
!"#$%&'( i nastpi zapisanie !"#$%&'(.
Podczas lektury tego rozdziau pamitaj o poruszonych tu kwestiach. W dalszej kolejnoci bdziemy zajmowa si takimi kwestiami, jak:
Zapisywanie zmiennych sesji w bazie danych.
Utrzymywanie sesji przegldarki midzy odsonami kolejnych stron WWW.
Ustawianie i pobieranie nazw sesji.
Usuwanie zmiennych sesji.
Znajdowanie cieki, w ktrej zapisany jest identyfikator sesji.
210
Technika
Zastosuj funkcj )
, aby zarejestrowa funkcje operujce na
bazie danych:
Skrypt 10.1.
---"
--
--
(
!.
--
/
!.
--
/
!
!.
--"010
- !
234
--5"
67**
$!
.
"%
23
"08--!
9
-:;<=
:=::;>6:.
!
$23= %
$3?@ AB CB. D
E . D
F
&
&
$!
%
--<$! 1G "! H.
--!I0J"0?@+
?
&
$!
10
%
"
)
$" )
"
4)K
10)
"
4)
/
K)
211
212
0
Uwagi
Funkcja )
umoliwia wskazanie funkcji obsugi, ktre bd
wywoywane przez system sesji w celu wykonania operacji rozpoczcia, zakoczenia,
zaadowania i zapisania sesji.
Pierwszym argumentem )
jest funkcja, ktra bdzie wywoywana przez system sesji w momencie inicjacji sesji. Funkcja ta pobiera dwa argumenty: pierwszy to cieka, w ktrej przechowywana bya sesja (jest ona taka sama,
jak warto dyrektywy
), a drugi to nazwa ustawionego cookie sesji
(domylnie jest to !!"#*).
Nastpnym argumentem jest funkcja wywoywana w momencie zakoczenia sesji
(zazwyczaj na kocu wykonania skryptu) i powinna ona czyci wszystkie dane.
Funkcja ta nie pobiera adnych argumentw.
Trzecim argumentem funkcji )
jest funkcja wykonywana
w momencie, gdy konieczne jest odczytanie danych sesji ze schowka sesji. Argumentem pobieranym przez t funkcj jest identyfikator sesji (a wic otrzymuje ona
co w rodzaju +,,,-)+-.+.//012-)203///041.). Identyfikator sesji to losowa liczba
wygenerowana, eby utrudni hakerom odgadnicie identyfikatora sesji (i przez to uzyskanie dostpu do danych uytkownika).
Czwartym argumentem )
jest funkcja wykonywana w momencie, gdy zachodzi konieczno zapisania danych w schowku sesji. Funkcja wskazywana przez ten argument pobiera warto identyfikatora biecej sesji (patrz poprzedni
akapit) oraz dane sesji majce posta pojedynczego acucha znakw.
Pitym argumentem )
jest funkcja wykonywana w sytuacji,
gdy warto sesji ma ulec zniszczeniu. Funkcja ta pobiera argument, ktrego wartoci jest identyfikator biecej sesji.
Szstym i ostatnim argumentem )
jest funkcja odmiecania.
Jest ona co jaki czas wywoywana przez system sesji w celu usunicia tych sesji, ktre
ju wygasy. Funkcja wskazywana przez ten argument pobiera liczb sekund, po upyniciu ktrych dane sesji powinny zosta uznane za przestarzae i usunite.
Funkcja )
stanowi podstaw przystosowywania mechanizmu zarzdzania sesjami w PHP do wasnych potrzeb. Cho moe nie wydaje si to
atwe, pobaw si ni troch. Wyprbuj jakie trywialne skrypty wraz z
)
, a sam zobaczysz, jakie to proste.
213
Technika
Aby zmieni nazw cookie sesji, zastosuj funkcj
. Pamitaj, e naley
j wywoywa przed funkcjami
i
:
Skrypt 10.2.
"R
<1
---K0K? +"
QK
"
--+KQ1
! @ +KSG
- K
"
--+G
!G K@+" @G
)2
0+K +KG+"?
.)
) K +KG
K
)
Uwagi
Domyln wartoci nazwy cookie przechowywanego przez przegldark uytkownika
jest !!"#*, lecz nie jest to nazwa zbyt wiele mwica. Tak naprawd wikszo
spord uytkownikw, ktrzy maj wczone ostrzeganie o cookies i zostan poproszeni o zaakceptowanie cookie o nazwie !!"#*, najprawdopodobniej bdzie si waha. Funkcja
pozwala na zmian nazwy cookie w fazie wykonania, dziki
czemu nie musisz wprowadza zmian na caej witrynie, modyfikujc warto parametru
w pliku php.ini.
Istnieje kilka zasad dotyczcych wywoywania funkcji
. Po pierwsze,
nazwa sesji musi by alfanumeryczna nie moe zawiera znakw zapytania, tyld
(5) i tak dalej. Po drugie, aby wywoanie funkcji
przynioso odpowiednie efekty, musi ona by wywoywana przed funkcjami
i
.
Wywoana z parametrem
zmieni warto zmiennej nazwy sesji i zwrci
nazw dotychczasow. Jeli jednak
zostanie wywoana w kontekcie
), zwrci po prostu nazw biecej sesji w postaci acucha znakw.
214
Technika
Aby ustawi parametry, zastosuj funkcj 46
, ktra umoliwia ustawienie czasu ycia cookie, jego cieki oraz domeny:
1
"
"VP.-1
. "!
" 4"
Uwagi
Funkcja 46
ma nastpujc skadni:
1
"
+
+0A.
+1A.
" CC
215
$
"
"VP
-1
" 4
$
1
"$
".
. " %
1
"
1
"
$1
"A$
"C$
"XX
1
"A
C
XX
1
"A " C " %
)Y
!G.$! 1G
1
" K S
+ +??)
&
&
Technika
Aby usun zmienn z sesji, zamiast
zastosuj funkcj
:
"
$
"%
!
" 6"I K0G
KH"
&
Uwagi
Funkcja
usuwa wskazan zmienn z rejestru sesji, a wic w momencie zapisywania sesji nie bdzie ona ju zawiera wyrejestrowanej zmiennej. Funkcja
ta nie usuwa jednak zawartoci zmiennej.
Technika
Aby wymaza sesj, zastosuj funkcj ) 7
:
216
Skrypt 10.4.
)$)
)$)
)$ )
Uwagi
Funkcja ) 7
usunie wszystkie dane sesji ze schowka sesji. Zauwa jednak, e nie zostan usunite zawartoci zmiennych sesji. Aby to osign, bdziesz musia
zastosowa funkcj
i przej przez wszystkie zmienne sesji, usuwajc
je z tabeli symboli.
Technika
Pamitaj, e w kadym miejscu, w ktrym uywasz obiekt, musisz doczy definicj klasy.
obiekty/std_class.inc
---T1
4
--5K $ GS10 +S @
.
--01
"Q?0H+" @G4
-M
%
"
"
217
obiekty/main.php
---T1" 4
--<!S +"0+0KH +0
0KH1
- !
4
$
$[$%
$ KM
$D "):
N!)
$D")
94
)
$D "+
"
&
$) /
T4)\1 G
!
G-
obiekty/nextPage.php
---T1 /
T4
--R0JK
"S G!G@10 !
KG@+" 0
- !
4
$
$D "
Uwagi
W czasie, gdy powstawaa ta ksika, aby zapewni prawidowe funkcjonowanie moduu
sesji PHP z obiektami, konieczne byo doczenie definicji klasy przed rozpoczciem
sesji. Operacja taka musi zosta wykonana w przypadku kadego obiektu przechowywanego w sesji. W nastpnych wersjach PHP moe si to zmieni, jednak obecnie
czynno taka jest niezbdna. Jeli definicja klasy nie zostanie doczona, kadorazowa prba uzyskania dostpu do metody lub waciwoci obiektu spowoduje wywietlenie przez PHP ostrzeenia informujcego o koniecznoci wczeniejszego doczenia definicji klasy.
218
Technika
Zastosuj funkcje 4)
i )4)
:
kodowanie/write.php
)" 10)
" 100)K +H).)H)
" 10
$9$ )
" 104
/
).)K) )6"I
K+0H
" 104
/
)
9$K
$.
" 10
9$$ )6"I +"1 @H
" 04
/
)
)E+0 J+ )
kodowanie/read.php
$9$ )
" 104
/
).)) )6"I
K+0H
" 104
/
)
$ $.$+)
" 104
/
)
9$$ )6"I +"1 @H
" 104
/
)
$" 10
%
)
, , )
&
Opis
Funkcja 4)
pobiera wszystkie informacje biecej sesji i koduje je do postaci acucha znakw, ktry moe by parsowany przez funkcj )4)
.
Nastpnie )4)
parsuje ten acuch znakw i na podstawie zawartych
w nim informacji tworzy zmienne sesji.
219
zawierajcy wszystkie niezbdne funkcje (dodawanie produktw, usuwanie ich z koszyka i podgldanie). Zwr jednak uwag, e w skrypcie tym brakuje fragmentu realizujcego wysanie zamwienia to wykracza ju poza temat naszych rozwaa.
koszyk/site_lib.inc
---
4 DD
--5K$! 1GS* T !
4
---< +K+0
1" !1
"
--*
"
!
K0? ++$! 1GS* T !
4
"
!
0
--- * T !
--] !GK+0
1 !1
0.G1"@+ UHSK1+01!.
-- G
0"
!
4
-$!
* T !
%
"
!
$ " !
4
/
$9$ $ ".)) )6"I
K+0H$ ")
--6K+1K0 1 1? "01 SKQ?!I0
1K @
--"?0+ + . 00J"0QK I+0K
1!4
9$1$. )6"I ?I0H1 0KQ?!I0
1K G
$ ")
K $
$.^%
. ". ./ _.
" --
G
+ + 1
"
!
A C0) ") ".
) ) .
))
&
9$$ )6"I +"1 @H$ ")
&
koszyk/products.txt
1 (_LK_6G$G G+0K JK_(4V(
11_: 0T0
_=10
!G@ _(4
koszyk/cart.php
---
41?QK 0
-8!
4
--LG
!G"0 +@GS
--; G!G1+01.GJ +
?G+++ GK 0
220
221
222
-
"ACT*6
-
$)
"4 !
)
2 G
!1
1+01
-
-
-
&
-
- 0
-
"
koszyk/add_item.php
---
"4
--2 G !1
1+01 +1!0
-8!
4 --* T !
* T !
--] !G !1
0+"
!
--7
KQ+ @
S!
!
!
!
0
--T+G U++ !1
0+
+0"GS+0
0".
--1
Q0
!G
$"
!
!
%
$
"
" %
!
!
!
&
&
--5G
!GGS
$ %--`J+
?K0 0 !1
0
!
A !
C.0
" .8!
0
A !"
"C8!
0
&
"
$ %
2 !
!
A "C 1+01 +1!0
&%
2 G!
!
A "C 1+01 +1!0
&
-
-
koszyk/change_quant.php
---
8!
4
--5" JH !1
!K1+01! +1!04
-
--+G
!GGS
--L+!
K
0!
.0!K HS.
--I"0K?JK0"
--5+
0+K@JH !1
!K+ K0
--+0G@K0JK
H
!"
A !
CACAC
$8!
0%
A !
CACAC8!
0--+"ZJH
&%
!
A !
CAC-- !1
G +K+"
&
--71
! G+S !1
QK
A !"
"C
!"8!
0
A !"
"CD
!"D8!
0
A !"
"C8!
0D
!"
"
223
224
;JH+
?+"
-
-
0
;JH+" +
!" 8!
0-
$)
4)RQH-1!!G G4
- 0
-
"
10.10. Serializacja
Chcesz zapisa zawarto zmiennej w postaci acucha znakw.
Technika
Utwrz funkcje implementujce funkcje
i
, a nastpnie odczytuj i zapisuj dane do pliku:
serializacja/loadsave.inc
---T1 4
--3
1$! 1G+!G@0
-- +0
!G@0 +1!
----
"
--5!GK
JH+" G " 1!4
-$!
%
+--?Z!+
!G@0
$ ")
+
-)44)4
/
)
$9$ $ ".)K) )6"I
K+0H$ " +!)
$K
$.
9$$ )6"I +"1 @H$ ")
!
!
&
---
"
--] !GK
JH+" G "+1!4
-$!
%
--7"JH+ @+" @K+S! 0"
$ ")
+
-)44)4
/
)
$9$ $ ".)) )6"I
K+0H$ " +0
!)
$ $.$+$ "
225
serializacja/load.php
! 4
$
$
Uwagi
Funkcja
tworzy acuchow reprezentacj danych PHP, niezalenie od tego,
czy dane te maj posta tablicy, obiektu, zwykego acucha znakw czy liczby. Funkcja
odczyta ten acuch znakw i przywrci mu oryginaln form. Jest to
dosy podobne do dziaania programw kompresji i dekompresji, takich jak bzip czy
gzip. Zauwa, e w przypadku deserializacji obiektw musisz najpierw zaadowa definicj klasy obiektu, podobnie jak w przypadku sesji.
Technika
Zastosuj funkcje WDDX, ktre przeprowadzaj serializacj zgodn ze standardem
WDDX opisanym na stronie http://www.wddx.org/.
"0)FS
KD+1 K).)R K).)E+1 K).)\KK)
1
K /
1
)TNT)
K /
1
.)
")
1
K /
1
1
226
Uwagi
Format WDDX, czyli Web Distributed Data eXchange, to ... mechanizm wymiany
zoonych struktur danych midzy rodowiskami aplikacji (http://www.wddx.org/
DTD.htm). Mwic w skrcie, przeprowadzanie serializacji z zastosowaniem funkcji
WDDX polega na tym, e funkcje te tworz pakiety zawierajce informacje na temat
zmiennych.
Pakiety te mog by przechowywane oraz z powrotem wczytywane do programu, podobnie jak robilimy to za pomoc funkcji
i
w podrozdziale 10.10. Kolejnym popularnym zastosowaniem WDDX jest serializacja zmiennych w formacie WDDX w celu umoliwienia ich odczytywania i wykorzystywania
przez inne programy.
Technika
Zastosuj funkcj 8))9)
do odkodowania acucha WDDX i wczytania
go do zmiennej PHP:
Skrypt 10.5.
$
K0)F#O#:#N).): $ ).):" K)
/
K /
+
)$
K)
$
K
K /
+
/
$$
K
$
K%
$$
KK%
)K, , )
&
&
Uwagi
Funkcja 8))9)
pobiera pakiet WDDX i konwertuje go do postaci tablicy
z odpowiadajcymi zmiennymi PHP. Jednym z ciekawszych zastosowa 8))9) :
jest pobranie pakietw WDDX wygenerowanych przez inne jzyki i przetumaczenie ich na zmienne PHP.